Skip to main content
Before a user can buy, sell or hold crypto, Ripio needs their identity data (KYC). There’s no separate flow to build for it: you send the data in the same POST /auth call that opens the widget, and Ripio registers the user and verifies them on its own.
  1. Once, while integrating: ask which fields your country needs, with GET /partner/kyc-requirements.
  2. Every time the widget opens: send the user’s data in kyc_submission (and their email) on POST /auth.
  3. If Ripio rejects the data: fix the field it names and call POST /auth again.

Which fields to send

The fields depend on your account’s country. Your server reads them from the widget API with a partner token, server to server. 1. Request a partner token with your credentials. Reading the requirements needs no scope. Endpoint: https://b2b-crypto-widget-api.sandbox.ripio.com/api/v1/partner/token Method: POST · Content-Type: application/json
The token lasts 15 minutes. Like client_secret, it must never reach the browser. 2. Get the requirements. Endpoint: https://b2b-crypto-widget-api.sandbox.ripio.com/api/v1/partner/kyc-requirements Method: GET · Header: Authorization: Bearer <partner-token>
Response for an account in Argentina, shortened — the real one lists every field and every option:
  • The same for every user. The answer depends only on your account’s country, so there’s no need to call it before each POST /auth. Read it while you build your integration, or cache it on your side.
  • country is your account’s country as an ISO 3166-1 alpha-2 code, such as AR.
  • CHOICE fields. Send the option’s value (for example "AR.BA"), never its label. The label is there for you to show in your own form. Any value outside choices is rejected with 20013.
  • Not something the widget shows. The widget never asks the user for these fields: you collect them in your own app, or take them from the data you already have about the user.

Send the data on POST /auth

Add two fields to the POST /auth body:
The response is the usual session_code. The KYC data never comes back in any response.

What Ripio does with the data

Ripio decides from the user’s status, so you can send the same body every time: Once the data is in, whether the user can operate right away depends on how your account verifies identities, which Ripio sets up with you:
  • Automatic approval. The user can operate in the same session.
  • Verification by Ripio. Verification is asynchronous. The session starts, but the user can’t operate until it is approved. The widget shows a screen telling them their account isn’t enabled yet and fires ripio-handoff with reason: "not_operable", so you can take them to the right place in your app. See Session lifecycle.
A session keeps the status the user had when it started. When their verification is approved, they can operate from the next session, the next time you call POST /auth and open the widget. An open session doesn’t pick up the change.
While a user can’t operate, every POST /auth sends their data for verification again. Send the same complete data each time, and don’t call POST /auth in a loop to find out whether the verification was approved.
A user that Ripio has blocked also gets a session in which they can’t operate. Sending their data again doesn’t change that.

When Ripio rejects the data

If a required field is missing or a value is invalid, POST /auth answers 400 with code 20013, and detail names each field to fix:
  • No session is started. Fix the fields in detail and call POST /auth again with the same external_ref. Ripio has already registered the user, so it sends the corrected data for verification.
  • detail names fields and rules, never values. You can log it without logging the user’s data.
  • 20013 isn’t 20000. 20000 means the request itself is malformed — for example, kyc_submission is missing or isn’t an object — and Ripio never looked at the data. 20013 means the request was well formed and Ripio found the data incomplete.
If Ripio can’t process the data for a reason of its own, POST /auth answers 502 or 503 with a code of 50000 or above and starts no session. Retry the request.

Errors on GET /partner/kyc-requirements

See Troubleshooting for the full error contract.