Skip to main content
Onboard a merchant under your partner account through the API. You create the organisation, the merchant is verified (KYC for an individual, KYB for a company), you handle the verification result, and ZBX provisions the merchant’s crypto and EUR accounts.

End-to-end flow

Authentication

Signed requests use these headers:
Calculate the signature using 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:
This request is authenticated with the organisation API key. Do not sign it: the signing secret is not available yet.

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

ZBX returns a Sumsub verification link for the merchant to complete.
Response (201 Created):
Send the URL after the 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.
2. Create the org with the share token and questionnaire answers.
Response (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 400 listing every problem, each naming its field.
Industry option IDs
Source of funds option IDs
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, but user_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.
Response (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 the kyc_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.
Share token (option B). Nothing to do. You already sent the share token and questionnaire answers when you created the org.

3. Handle the verification result

When the verification result arrives, ZBX updates kyc_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:
The Org.Updated webhook carries kyc_status, kyc_next_action, and reason. For example, when a tax identification number is needed:
When the merchant has to verify again:
Only an approval sets 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

Returns 200 with the resulting kyc_status.
If the merchant has no tax number, send the reason instead:

Provide enhanced due diligence information

Returns 202. The submission is reviewed manually and the outcome arrives as an Org.Updated webhook.
Send at least one field. All values are free text.

4. Account provisioning

Once kyc_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.
To confirm the merchant’s accounts are open, read the org:
The response has the same shape as the create response, plus a settlement_accounts array. An entry in that array does not by itself mean the account is ready:
Once the IBAN is issued, the same EUR entry has 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