End-to-end flow
Authentication
Signed requests use these headers:SIGNING_SECRET. See Authentication.
Use the partner credentials for /partners/orgs. After onboarding, use the new merchant organisation’s credentials for account, deposit, swap, and withdrawal requests.
ZBX will provide test credentials separately. Credentials must not be committed to source control or shared through an unsecured channel.
Retrieve the signing secret when credentials are first configured or after the secret is rotated:
Choose a verification path
All three paths return
kyc_status: "pending". Whether kyc_next_action is present tells you if the merchant still has something to do.
1. Create the organisation
Create the organisation in one call. You can submit the merchant’s KYC in the same request.Request fields
Option A: KYC with a verification link
ZBX returns a Sumsub verification link for the merchant to complete.201 Created):
kyc_required: prefix to the merchant (step 2).
Option B: KYC with a Sumsub share token
If you already verified the merchant in your own Sumsub account, share that KYC with ZBX. The merchant does not upload documents again and no verification link is returned. The token and the answers are submitted together: either both are accepted, or the call fails and no org is created. 1. Create the share token in Sumsub. This request goes to Sumsub, not to ZBX. Authenticate it the way Sumsub’s API requires.levelName: the verification level in your Sumsub account.forClientId: the ZBX Sumsub client ID. ZBX gives you separate sandbox and production values.ttlInSecs: how long the token stays valid. Create the org before it expires.
201 Created). There is no kyc_next_action, because the merchant has nothing left to do:
Questionnaire reference
The answers to the merchant’s due-diligence questions. Every value is a string holding a fixed option ID, not free text.- Country codes are ISO 3166-1 alpha-2. A list may not repeat a code or a value.
- A request with invalid answers returns
400listing every problem, each naming its field.
Industry option IDs
Show all industry values (20–53)
Show all industry values (20–53)
Source of funds option IDs
Show all source of funds values (54–73)
Show all source of funds values (54–73)
71 (third-party funding) is not accepted with a share token. Onboard that merchant without share_token to get a verification link instead.Option C: KYB for a company
Same flow as option A, butuser_type must be "CORP" and legal_name is required. The response carries a KYB link instead of a KYC link.
share_token and kyc_questionnaire are not accepted for a company and are rejected with 400.
201 Created):
Errors when creating the org
Error bodies follow the standard envelope. See Response patterns.
2. The merchant completes verification
Verification link (options A and C). The merchant opens the URL after thekyc_required: or kyb_required: prefix and uploads their documents on a Sumsub-hosted page. No login is required.
- The merchant usually opens the link, but if you already hold their documents, you can use it to submit on their behalf.
- The merchant can also submit documents from the ZBX merchant dashboard, which embeds the same Sumsub flow.
3. Handle the verification result
When the verification result arrives, ZBX updateskyc_status and sends an Org.Updated webhook to the webhook_url you registered. Verify the webhook signature before you act on it.
You can also read the current state at any time:
Org.Updated webhook carries kyc_status, kyc_next_action, and reason. For example, when a tax identification number is needed:
kyc_status to "accepted" and starts provisioning. Any other result leaves the org linked, in "pending" or "rejected":
tin_required and edd_required can appear at any point in the merchant’s lifetime, not only during onboarding. Submit the information through the endpoints below whenever kyc_next_action asks for it.
Provide a tax identification number
200 with the resulting kyc_status.
Provide enhanced due diligence information
202. The submission is reviewed manually and the outcome arrives as an Org.Updated webhook.
4. Account provisioning
Oncekyc_status becomes "accepted", ZBX provisions the merchant’s accounts automatically. You do not call anything.
- Crypto deposit addresses are created right away and are typically ready within moments.
- EUR account is requested at the same time. The IBAN is issued separately, typically a few seconds to minutes later.
settlement_accounts array. An entry in that array does not by itself mean the account is ready:
account_number and bank filled in:
Check each entry’s own field, not whether the array is non-empty. A crypto entry is ready when
address is set, which happens almost immediately. The EUR entry is ready when account_number (the IBAN) is set, typically a few seconds to minutes later.What is ready when
The EUR account is not a way to receive EUR. It is where EUR lands after a crypto-to-EUR exchange, on the way to a bank payout.kyc_status: "accepted" alone is enough for the merchant to start trading. settlement_accounts only tells you when the merchant can receive crypto deposits.
Next steps
- Cookbook: Deposit, convert, and withdraw fiat: use the provisioned accounts for deposits, swaps, and EUR withdrawals.
- Verify webhook signatures: check
Org.Updateddeliveries before you act on them. - Authentication: partner API keys and request signing.