curl --request POST \
--url https://sandbox-b2b.ripio.com/api/v1/end-users/{end_user_id}/kyc/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "[email protected]",
"kyc_submission": {
"country": "AR",
"first_name": "Juan",
"last_name": "Perez",
"gender": "M",
"birthday": "1990-01-01",
"nationality": "AR",
"id_number": "12345678",
"id_number_type": "DNI",
"cuit": "20123456786",
"registered_tax_payer": false,
"address": "Av. Corrientes",
"address_number": "1234",
"address_flat": "1A",
"postal_code": "1043",
"city": "CABA",
"state": "AR.DF",
"phone": "+5491112345678",
"personal_activity": "AR.6"
}
}
'import requests
url = "https://sandbox-b2b.ripio.com/api/v1/end-users/{end_user_id}/kyc/"
payload = {
"email": "[email protected]",
"kyc_submission": {
"country": "AR",
"first_name": "Juan",
"last_name": "Perez",
"gender": "M",
"birthday": "1990-01-01",
"nationality": "AR",
"id_number": "12345678",
"id_number_type": "DNI",
"cuit": "20123456786",
"registered_tax_payer": False,
"address": "Av. Corrientes",
"address_number": "1234",
"address_flat": "1A",
"postal_code": "1043",
"city": "CABA",
"state": "AR.DF",
"phone": "+5491112345678",
"personal_activity": "AR.6"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: '[email protected]',
kyc_submission: {
country: 'AR',
first_name: 'Juan',
last_name: 'Perez',
gender: 'M',
birthday: '1990-01-01',
nationality: 'AR',
id_number: '12345678',
id_number_type: 'DNI',
cuit: '20123456786',
registered_tax_payer: false,
address: 'Av. Corrientes',
address_number: '1234',
address_flat: '1A',
postal_code: '1043',
city: 'CABA',
state: 'AR.DF',
phone: '+5491112345678',
personal_activity: 'AR.6'
}
})
};
fetch('https://sandbox-b2b.ripio.com/api/v1/end-users/{end_user_id}/kyc/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox-b2b.ripio.com/api/v1/end-users/{end_user_id}/kyc/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => '[email protected]',
'kyc_submission' => [
'country' => 'AR',
'first_name' => 'Juan',
'last_name' => 'Perez',
'gender' => 'M',
'birthday' => '1990-01-01',
'nationality' => 'AR',
'id_number' => '12345678',
'id_number_type' => 'DNI',
'cuit' => '20123456786',
'registered_tax_payer' => false,
'address' => 'Av. Corrientes',
'address_number' => '1234',
'address_flat' => '1A',
'postal_code' => '1043',
'city' => 'CABA',
'state' => 'AR.DF',
'phone' => '+5491112345678',
'personal_activity' => 'AR.6'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox-b2b.ripio.com/api/v1/end-users/{end_user_id}/kyc/"
payload := strings.NewReader("{\n \"email\": \"[email protected]\",\n \"kyc_submission\": {\n \"country\": \"AR\",\n \"first_name\": \"Juan\",\n \"last_name\": \"Perez\",\n \"gender\": \"M\",\n \"birthday\": \"1990-01-01\",\n \"nationality\": \"AR\",\n \"id_number\": \"12345678\",\n \"id_number_type\": \"DNI\",\n \"cuit\": \"20123456786\",\n \"registered_tax_payer\": false,\n \"address\": \"Av. Corrientes\",\n \"address_number\": \"1234\",\n \"address_flat\": \"1A\",\n \"postal_code\": \"1043\",\n \"city\": \"CABA\",\n \"state\": \"AR.DF\",\n \"phone\": \"+5491112345678\",\n \"personal_activity\": \"AR.6\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox-b2b.ripio.com/api/v1/end-users/{end_user_id}/kyc/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"[email protected]\",\n \"kyc_submission\": {\n \"country\": \"AR\",\n \"first_name\": \"Juan\",\n \"last_name\": \"Perez\",\n \"gender\": \"M\",\n \"birthday\": \"1990-01-01\",\n \"nationality\": \"AR\",\n \"id_number\": \"12345678\",\n \"id_number_type\": \"DNI\",\n \"cuit\": \"20123456786\",\n \"registered_tax_payer\": false,\n \"address\": \"Av. Corrientes\",\n \"address_number\": \"1234\",\n \"address_flat\": \"1A\",\n \"postal_code\": \"1043\",\n \"city\": \"CABA\",\n \"state\": \"AR.DF\",\n \"phone\": \"+5491112345678\",\n \"personal_activity\": \"AR.6\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-b2b.ripio.com/api/v1/end-users/{end_user_id}/kyc/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"[email protected]\",\n \"kyc_submission\": {\n \"country\": \"AR\",\n \"first_name\": \"Juan\",\n \"last_name\": \"Perez\",\n \"gender\": \"M\",\n \"birthday\": \"1990-01-01\",\n \"nationality\": \"AR\",\n \"id_number\": \"12345678\",\n \"id_number_type\": \"DNI\",\n \"cuit\": \"20123456786\",\n \"registered_tax_payer\": false,\n \"address\": \"Av. Corrientes\",\n \"address_number\": \"1234\",\n \"address_flat\": \"1A\",\n \"postal_code\": \"1043\",\n \"city\": \"CABA\",\n \"state\": \"AR.DF\",\n \"phone\": \"+5491112345678\",\n \"personal_activity\": \"AR.6\"\n }\n}"
response = http.request(request)
puts response.read_body{
"submission_id": "6295fdf3-fae8-4a3f-a16b-6b43b258a6c0",
"status": "IN_REVIEW",
"provider_url": "https://kyc.ripio.com/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...&id=20809&schema=B2B_AR",
"created_at": "2026-10-20T16:45:56.778460Z"
}Create KYC Submission
This endpoint allows you to submit user’s kyc information.
This endpoint behaves asynchronously, don’t expect the KYC Submission to be approved after the request execution. To check for its completion, use the Retrieve KYC Submission endpoint. When the verification submission is completed, a webhook will be sent. See BaaS Webhooks in the documentation.
curl --request POST \
--url https://sandbox-b2b.ripio.com/api/v1/end-users/{end_user_id}/kyc/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "[email protected]",
"kyc_submission": {
"country": "AR",
"first_name": "Juan",
"last_name": "Perez",
"gender": "M",
"birthday": "1990-01-01",
"nationality": "AR",
"id_number": "12345678",
"id_number_type": "DNI",
"cuit": "20123456786",
"registered_tax_payer": false,
"address": "Av. Corrientes",
"address_number": "1234",
"address_flat": "1A",
"postal_code": "1043",
"city": "CABA",
"state": "AR.DF",
"phone": "+5491112345678",
"personal_activity": "AR.6"
}
}
'import requests
url = "https://sandbox-b2b.ripio.com/api/v1/end-users/{end_user_id}/kyc/"
payload = {
"email": "[email protected]",
"kyc_submission": {
"country": "AR",
"first_name": "Juan",
"last_name": "Perez",
"gender": "M",
"birthday": "1990-01-01",
"nationality": "AR",
"id_number": "12345678",
"id_number_type": "DNI",
"cuit": "20123456786",
"registered_tax_payer": False,
"address": "Av. Corrientes",
"address_number": "1234",
"address_flat": "1A",
"postal_code": "1043",
"city": "CABA",
"state": "AR.DF",
"phone": "+5491112345678",
"personal_activity": "AR.6"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: '[email protected]',
kyc_submission: {
country: 'AR',
first_name: 'Juan',
last_name: 'Perez',
gender: 'M',
birthday: '1990-01-01',
nationality: 'AR',
id_number: '12345678',
id_number_type: 'DNI',
cuit: '20123456786',
registered_tax_payer: false,
address: 'Av. Corrientes',
address_number: '1234',
address_flat: '1A',
postal_code: '1043',
city: 'CABA',
state: 'AR.DF',
phone: '+5491112345678',
personal_activity: 'AR.6'
}
})
};
fetch('https://sandbox-b2b.ripio.com/api/v1/end-users/{end_user_id}/kyc/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox-b2b.ripio.com/api/v1/end-users/{end_user_id}/kyc/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => '[email protected]',
'kyc_submission' => [
'country' => 'AR',
'first_name' => 'Juan',
'last_name' => 'Perez',
'gender' => 'M',
'birthday' => '1990-01-01',
'nationality' => 'AR',
'id_number' => '12345678',
'id_number_type' => 'DNI',
'cuit' => '20123456786',
'registered_tax_payer' => false,
'address' => 'Av. Corrientes',
'address_number' => '1234',
'address_flat' => '1A',
'postal_code' => '1043',
'city' => 'CABA',
'state' => 'AR.DF',
'phone' => '+5491112345678',
'personal_activity' => 'AR.6'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox-b2b.ripio.com/api/v1/end-users/{end_user_id}/kyc/"
payload := strings.NewReader("{\n \"email\": \"[email protected]\",\n \"kyc_submission\": {\n \"country\": \"AR\",\n \"first_name\": \"Juan\",\n \"last_name\": \"Perez\",\n \"gender\": \"M\",\n \"birthday\": \"1990-01-01\",\n \"nationality\": \"AR\",\n \"id_number\": \"12345678\",\n \"id_number_type\": \"DNI\",\n \"cuit\": \"20123456786\",\n \"registered_tax_payer\": false,\n \"address\": \"Av. Corrientes\",\n \"address_number\": \"1234\",\n \"address_flat\": \"1A\",\n \"postal_code\": \"1043\",\n \"city\": \"CABA\",\n \"state\": \"AR.DF\",\n \"phone\": \"+5491112345678\",\n \"personal_activity\": \"AR.6\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox-b2b.ripio.com/api/v1/end-users/{end_user_id}/kyc/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"[email protected]\",\n \"kyc_submission\": {\n \"country\": \"AR\",\n \"first_name\": \"Juan\",\n \"last_name\": \"Perez\",\n \"gender\": \"M\",\n \"birthday\": \"1990-01-01\",\n \"nationality\": \"AR\",\n \"id_number\": \"12345678\",\n \"id_number_type\": \"DNI\",\n \"cuit\": \"20123456786\",\n \"registered_tax_payer\": false,\n \"address\": \"Av. Corrientes\",\n \"address_number\": \"1234\",\n \"address_flat\": \"1A\",\n \"postal_code\": \"1043\",\n \"city\": \"CABA\",\n \"state\": \"AR.DF\",\n \"phone\": \"+5491112345678\",\n \"personal_activity\": \"AR.6\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-b2b.ripio.com/api/v1/end-users/{end_user_id}/kyc/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"[email protected]\",\n \"kyc_submission\": {\n \"country\": \"AR\",\n \"first_name\": \"Juan\",\n \"last_name\": \"Perez\",\n \"gender\": \"M\",\n \"birthday\": \"1990-01-01\",\n \"nationality\": \"AR\",\n \"id_number\": \"12345678\",\n \"id_number_type\": \"DNI\",\n \"cuit\": \"20123456786\",\n \"registered_tax_payer\": false,\n \"address\": \"Av. Corrientes\",\n \"address_number\": \"1234\",\n \"address_flat\": \"1A\",\n \"postal_code\": \"1043\",\n \"city\": \"CABA\",\n \"state\": \"AR.DF\",\n \"phone\": \"+5491112345678\",\n \"personal_activity\": \"AR.6\"\n }\n}"
response = http.request(request)
puts response.read_body{
"submission_id": "6295fdf3-fae8-4a3f-a16b-6b43b258a6c0",
"status": "IN_REVIEW",
"provider_url": "https://kyc.ripio.com/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...&id=20809&schema=B2B_AR",
"created_at": "2026-10-20T16:45:56.778460Z"
}How it works
You collect the user’s KYC data in your own UI and submit it with this endpoint. What happens next depends on how Ripio configured the KYC flow of your account, and the response tells you which case you are in throughprovider_url:
provider_urlhas a URL → the user still has to complete the identity verification. Redirect them to that URL: it is Ripio’s KYC platform, where the user uploads their ID document and completes the liveness check with the identity provider. Submitting the data through the API describes who collects the personal data beforehand; it does not replace the document and liveness steps.provider_urlisnull→ no further action is required from the user.
The flow
Get the KYC requirements
Create the KYC Submission
email and the kyc_submission data. The response comes back with status: IN_REVIEW and, when your account’s flow requires it, a provider_url.{
"submission_id": "6295fdf3-fae8-4a3f-a16b-6b43b258a6c0",
"status": "IN_REVIEW",
"provider_url": "https://kyc.ripio.com/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...&id=20809&schema=B2B_AR",
"created_at": "2026-10-20T16:45:56.778460Z"
}
Redirect the user to provider_url
provider_url in the user’s browser or in a webview. Once they finish the verification, they are sent back to the redirect_url you sent in the request — for example, a screen or deep link of your app for that user. If you don’t send one, the redirect URL configured for your account is used.Get the result
IN_REVIEW until the identity provider reports back. You get the outcome in two ways:- Webhook:
KYC.COMPLETEDorKYC.FAILED. See BaaS Webhooks. - Polling: Retrieve KYC Submission with the
submission_id.
provider_url carries a token bound to this user’s verification process. Treat it as a secret:
do not log it, share it or reuse it for another user.provider_url.If the submission ends FAILED, you can create a new one for the same user. If the user already
has an approved KYC, a new submission is rejected.Authorizations
B2B’s White Label API uses OAuth2. Currently there is only one supported authentication flow:
- clientCredentials allows you to access your own B2B account (First-Party Integration) and performs transactions against the public API. This oauth2 flow is well suited for this API, as it allows machine-to-machine communication.
Every call to the API has to be authenticated with an OAuth2 Token. In order to request this token, you will need to have sandbox or production API Keys (client id and client secret) that will be needed to generate a credential in order to negotiate an ephemeral access token.
Every request must be accompianed by an Authorization header with a value that follows the following schema: Bearer ACCESS_TOKEN
Path Parameters
Body
End User's unique email.
Json formatted data with the information detailed on KYC Requirements
Where the user is sent back after completing the verification on provider_url. Allowed schemes: https, worldapp, worldappstg.
Optional: when omitted, the redirect URL configured for your account is used. If your account's flow needs one and neither is set, the request answers 400 with code 20092.
1000Response
OK
KYC Submission unique identifier
KYC Submission status.
COMPLETED, IN_REVIEW, FAILED, UPDATE_REQUIRED URL of Ripio's KYC platform, where the user completes the identity verification: ID document upload and liveness check with the identity provider. Redirect the user to it right after creating the KYC Submission. The URL carries a token for this verification process only: treat it as a secret and do not reuse it for another user. May be null if your account's KYC flow requires no further action from the user.
ISO format creation datetime
Was this page helpful?