POST /auth call that opens the widget, and Ripio registers the user and verifies them on its own.
- Once, while integrating: ask which fields your country needs, with
GET /partner/kyc-requirements. - Every time the widget opens: send the user’s data in
kyc_submission(and theiremail) onPOST /auth. - If Ripio rejects the data: fix the field it names and call
POST /authagain.
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
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>
- 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. countryis your account’s country as an ISO 3166-1 alpha-2 code, such asAR.CHOICEfields. Send the option’svalue(for example"AR.BA"), never itslabel. Thelabelis there for you to show in your own form. Any value outsidechoicesis rejected with20013.- 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:
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-handoffwithreason: "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.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
detailand callPOST /authagain with the sameexternal_ref. Ripio has already registered the user, so it sends the corrected data for verification. detailnames fields and rules, never values. You can log it without logging the user’s data.20013isn’t20000.20000means the request itself is malformed — for example,kyc_submissionis missing or isn’t an object — and Ripio never looked at the data.20013means the request was well formed and Ripio found the data incomplete.
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.