Skip to main content
POST
Save a recipient
Creates a saved recipient for one corridor (country_code + currency_code). Pass the returned beneficiary_id to sendPayoutRequest instead of repeating the full recipient details on every payout. See Beneficiaries for how the flow fits together.
The fields above are what you encrypt, not what goes on the wire. The body is always { "data": "<aes-256-gcm ciphertext>" } — see Authentication.
A JWT is required, same as every payout endpoint — beneficiaries are part of the payout product. Log in first via /api/v1/user/login.
Every corridor requires recipient_details.name. The remaining fields differ per destination and are validated at create time, not at payout time — which is the point of saving a beneficiary. See corridor requirements.

Idempotency

Reusing an idempotency_keyor posting identical details — returns the beneficiary that already exists rather than creating a duplicate. A retry after a network timeout is safe. The status code is how you tell the two apart: 201 means you just created it, 200 means you are getting the existing one back.

Example request

Errors

See Errors for the envelope shape shared by every endpoint.

Authorizations

x-api-key
string
header
required

Identifies your account. Issued from Developer Tools in the dashboard.

Authorization
string
header
required

Short-lived token from /api/v1/user/login, bound to your account and mode. Expires in 900 seconds.

Headers

x-timestamp
integer<int64>
required

Unix epoch in seconds — not milliseconds. Must be within ±5 minutes of our clock, which is what makes a captured request unusable later. Keep your client's clock NTP-synced.

Example:

1748023400

x-signature
string
required

HMAC-SHA256 over the signing string, hex encoded. The timestamp is part of what is signed, so a replayed body cannot be re-dated. See https://docs.pontisglobe.com/authentication for how it is built.

Example:

"2f8a9b4c1d7e0a3f6b8c2d5e9f1a4b7c0d3e6f9a2b5c8d1e4f7a0b3c6d9e2f5a"

Body

application/json
country_code
string
required
Required string length: 2
Example:

"NG"

currency_code
string
required
Required string length: 2 - 8
Example:

"NGN"

payment_method
string
required
Required string length: 1 - 32
Example:

"bank_local"

recipient_details
object
required

Per-corridor fields, plus name. Mobile-money corridors carry their network here as payment_network — unlike a payout, it is not a top-level field on this endpoint, and one sent at the top level is stripped rather than saved.

nickname
string
Maximum string length: 80
idempotency_key
string<uuid>

Response

Already existed — the same beneficiary, returned again.

ok
enum<boolean>
Available options:
true
data
object