Skip to main content
Onboarding takes a user from sign-up to an active account, ready for cards and money movement. You run it in five steps:
  1. Create a KYC profile
  2. Collect terms acceptance
  3. Complete identity verification
  4. Collect source of funds
  5. Create an account
The Partner API doesn’t return one combined onboarding state. Your backend owns the workflow: it decides which step comes next and stores the IDs returned at each step.

Steps

1

Create a KYC profile

Call POST /kyc/profiles with your stable reference for the user and their email address.If you already know the address that will own the user’s Safe, include it as safe_owner_address. Use the same address later when you create the account.
cURL
Store the returned profile_id against your user record. You use it as {kyc_profile_id} in every later onboarding call.
Profile creation is idempotent for the same reference and email, so a retry returns the existing profile. Reusing a reference with a different email returns a conflict.
If your user has already completed KYC on your Sumsub account, you can reuse that verification instead of asking them to verify again. Gnosis Pay creates an applicant on its own Sumsub account and copies the user’s verified data into it. If Gnosis Pay needs checks your verification didn’t cover, only those missing steps are triggered in step 3.1. Generate a share token. On your Sumsub account, call Sumsub’s generate share token endpoint for the user’s applicant, with forClientId set to Gnosis Pay’s Sumsub client ID. Contact Gnosis Pay to get this client ID.2. Add it to the profile request. Include a reuse_kyc object when you create the profile:
cURL
A share token is single-use and expires after its TTL (Sumsub’s default is 1,200 seconds). Generate a new token right before each attempt.
Then continue with the remaining steps as usual.
2

Collect terms acceptance

  1. Call GET /kyc/terms-of-service to get the current terms and their versions.
  2. Show those terms to the user.
  3. Call POST /kyc/profiles/{kyc_profile_id}/terms with every type and version the user accepted.
To recover or display the current acceptance state, call GET /kyc/profiles/{kyc_profile_id}/terms.
Always submit the versions the API returns. Don’t hard-code a terms version in your application, because terms can change.
3

Complete identity verification

  1. Call GET /kyc/profiles/{kyc_profile_id}/checks and select the current basic check.
  2. Call GET /kyc/profiles/{kyc_profile_id}/checks/{check_id} and request the credential your client needs, such as include_credentials=web_sdk_url.
  3. Open the returned hosted verification session in your application.
  4. Listen for KYC webhook events, then confirm the latest state with GET /kyc/profiles/{kyc_profile_id}.
If you reused KYC in step 1, check the profile first. The user may already be approved, or may only need to complete the missing checks.Handle each profile status like this:See KYC Statuses for full definitions.
4

Collect source of funds

  1. Call `GET /kyc/source-of-funds-questions to get the current questionnaire.
  2. Show the questions and allowed answers exactly as returned. Don’t change their text or identifiers.
  3. Submit the complete set of answers to POST /kyc/profiles/{kyc_profile_id}/source-of-funds.
To recover the submitted state, call GET /kyc/profiles/{kyc_profile_id}/source-of-funds.
5

Create an account

Once the profile is approved and the previous steps are complete, call POST /accounts with the approved kyc_profile_id, your external reference for the account, and a funding configuration. Don’t create the account before then.
cURL
If you set safe_owner_address when creating the KYC profile, use the same address here. Store the returned account_id against your user record, next to their profile_id.Account provisioning is asynchronous. Wait for an account status webhook event, or check the account with GET /accounts/{account_id}. The account is ready when both are true:
  • status is active
  • funding.config.safe_address is present
Don’t issue cards or move money until then.
The account response groups funding-specific fields under funding, with a type field that says which kind of funding the account uses (today, safe_wallet). Read funding.type before reading anything inside funding.config, so your integration keeps working when new funding types are added.
See Account Overview and Account Status for how accounts work.

When onboarding is complete

Onboarding is complete when the profile is approved, terms are accepted, identity is verified, source of funds is submitted, and the account is active with a safe_address.
Store each user’s onboarding progress in your own database, such as the profile_id, account_id, the last known statuses, and which steps are done. That way you can resume onboarding after a dropped session or a missed webhook without repeating steps.

Next step

Create a cardholder and card

Register the user as a cardholder and issue their first card.