Register recipients
A recipient is the person or company you pay, plus the bank details that reach them in their local currency. SDK methods keep the older name, beneficiary.
- Read the corridor’s fields with
GET /recipients/{orgId}/corridors. - Register the recipient with
POST /recipients/{orgId}. - Store
method.destinationAccountIdand pay it with Send a payout.
-
Read the corridor’s fields
Section titled “Read the corridor’s fields”Read the fields before you render a bank-details form:
GET /recipients/{orgId}/corridorsx-api-key: avvio_live_…{"capabilities": { "exactOutput": true, "indicativePricing": true },"corridors": [{"currency": "MXN","fields": [{ "id": "clabeNumber", "title": "CLABE (18 digits)", "type": "string","required": true, "pattern": "^[0-9]{18}$", "checksum": "clabe" }],"limits": { "min": "1.00", "max": "5000.00" }}]}Property What it holds currencyAlways present. Key on this fieldsThe bank details to collect. Always id,title,type,required;pattern,checksum,description,optionswhen definedlimitsFloor and ceiling, when the routing publishes them. They change per routing, so don’t hardcode them countryOnly when the routing publishes one (the sandbox doesn’t). Don’t key on it settlementAlways null; windows, cutoffs and name-matching rules are not published. A payout carriesexpectedSettlementAtwhen its network reports onechecksumnames a check the server applies on top ofpattern. A value that fails it is refused with400 VALIDATION_ERROR, anderrors[]names the check. Run the same check in your form.checksumWhat it checks clabeDigit 18 of a Mexican CLABE checks digits 1-17: weights 3, 7, 1 repeating, each product mod 10 before summing, then (10 - sum mod 10) mod 10(Banxico’s algorithm; implementations often drop the inner mod)The sandbox, never production, accepts the sample
012345678901234567despite its wrong check digit; test your form with a valid CLABE such as012180000080004471. Other fields have no rule beyondpatternon our side. A network rejection is also aVALIDATION_ERROR, with the network’s reason inerrors[]when it gives one. -
Register the recipient
Section titled “Register the recipient”POST /recipients/{orgId}x-api-key: avvio_live_…Idempotency-Key: 7b2e3f81-91a3-481d-91b4-2b13c7a00f2eContent-Type: application/json{"type": "individual","name": "María González","country": "MX","externalId": "emp_42_beneficiary_1","endUserId": "customer_42","method": {"kind": "fiat","currency": "MXN","recipientDetails": {"clabeNumber": "012180000080004471"}}}{"id": "cmf3k2xa10004q8b7r5t8u1vw","name": "María González","externalId": "emp_42_beneficiary_1","method": {"kind": "fiat","currency": "MXN","last4": "4471","status": "active","destinationAccountId": "sbx_acct_MXN_4471_ae66cbc5"}}Field Required Notes typeYes individualorbusinessnameYes Non-empty methodYes Fiat: kind: "fiat", an ISO 4217currency, andrecipientDetailskeyed by the corridor’s field ids.method.raildefaults to the corridor’s railemailNo A contact address for your records, returned on reads, never used for routing. Stored as nullwhen omitted; must be valid when sentcountryNo ISO 3166 alpha-2 externalIdNo 1–128 characters, your id for this recipient and account. Not a substitute for Idempotency-KeyendUserIdNo 1–128 characters, the party sending through your platform (the employer in payroll), never the person paid. Omit it when you are the sender Re-sending an
externalIdwith the same account returns the existing recipient, also with201, so compareids to detect a repeat. With a different account it is409 BENEFICIARY_EXTERNAL_ID_CONFLICT.A crypto recipient takes
kind: "crypto"and anaddress. Create accepts EVM, Solana and Bitcoin addresses, but only an EVM (0x…) address can be paid today: a payout to any other address fails with400 VALIDATION_ERROR. It is paid in USDC on Base from your organization’s wallet, with no fee andsourceAmountequal todestinationAmount. Creating the recipient needs no special scope; paying it needs thecrypto_payoutsscope on the key, or the payout fails with400 CRYPTO_PAYOUTS_DISABLED. -
Store the account id
Section titled “Store the account id”You pay
method.destinationAccountId, not the recipientid. On a repeat,methodis the account the call matched.
Listing recipients
Section titled “Listing recipients”Pass endUserId for one end user’s address book, or omit it for the whole
organization. limit is 1 to 100 (default 50); pass nextCursor back as
cursor.
GET /recipients/{orgId}?endUserId=customer_42&limit=50x-api-key: avvio_live_…The response is { scope, recipients, hasMore, nextCursor }, the one list with
rows under recipients instead of data. scope echoes the filter. Each row’s
id is the recipientId, and paymentMethods[] holds each account’s
destinationAccountId.
Adding payment methods
Section titled “Adding payment methods”POST /recipients/{orgId}/{recipientId}/methodsx-api-key: avvio_live_…Idempotency-Key: <uuid>Content-Type: application/json
{ "kind": "fiat", "currency": "EUR", "recipientDetails": { "iban": "DE89370400440532013000" }}The response is the whole recipient, with method set to the added account.
Accounts match on currency and the corridor’s account fields (for MXN,
clabeNumber), not the holder’s name, so sending one again adds nothing. The
same account under another recipient is refused with
409 BANK_ACCOUNT_ALREADY_LINKED, carrying existingRecipientId and
existingMethodId.
Reading one back
Section titled “Reading one back”GET /recipients/{orgId}/{recipientId} # our idGET /recipients/{orgId}/external/{externalId} # your id for themLists carry only last4. To show the full account, fetch one method’s details:
GET /recipients/{orgId}/{recipientId}/methods/{methodId}/detailsCorrecting and removing
Section titled “Correcting and removing”PATCH /recipients/{orgId}/{recipientId}PATCH changes contact details only: name, email, phone, country and type.
A validated bank account can’t be edited; add the correct one as a new method
and delete the old one:
DELETE /recipients/{orgId}/{recipientId}/methods/{methodId} # one way of paying themDELETE /recipients/{orgId}/{recipientId} # the recipient and every method on itDeleting cancels nothing in flight. The recipient leaves every list, GET
answers 404, and a payout to its accounts is refused with
404 DESTINATION_ACCOUNT_NOT_FOUND. Its externalId is released. Deleting a
recipient keeps its row (a soft delete); deleting a single method erases that
method’s row. Re-adding the same
account later works; the new recipient takes over the network’s account id.
Was this page helpful?