curl --request POST \
--url https://api.privy.io/v1/users/{user_id}/kyc/submit \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--header 'privy-app-id: <privy-app-id>' \
--data '
{
"provider": "bridge",
"data": {
"first_name": "<string>",
"middle_name": "<string>",
"last_name": "<string>",
"transliterated_first_name": "<string>",
"transliterated_middle_name": "<string>",
"transliterated_last_name": "<string>",
"email": "[email protected]",
"phone": "<string>",
"date_of_birth": "<string>",
"nationalities": [
"<string>"
],
"identifying_information": [
{
"type": "<string>",
"issuing_country": "<string>",
"number": "<string>",
"description": "<string>",
"expiration": "<string>",
"image_front": "<string>",
"image_back": "<string>"
}
],
"nonresident_alien_attestation": true
},
"endorsements": [
"sepa"
],
"client_agreement_id": "<string>"
}
'HttpResponse<String> response = Unirest.post("https://api.privy.io/v1/users/{user_id}/kyc/submit")
.header("privy-app-id", "<privy-app-id>")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"provider\": \"bridge\",\n \"data\": {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"transliterated_first_name\": \"<string>\",\n \"transliterated_middle_name\": \"<string>\",\n \"transliterated_last_name\": \"<string>\",\n \"email\": \"[email protected]\",\n \"phone\": \"<string>\",\n \"date_of_birth\": \"<string>\",\n \"nationalities\": [\n \"<string>\"\n ],\n \"identifying_information\": [\n {\n \"type\": \"<string>\",\n \"issuing_country\": \"<string>\",\n \"number\": \"<string>\",\n \"description\": \"<string>\",\n \"expiration\": \"<string>\",\n \"image_front\": \"<string>\",\n \"image_back\": \"<string>\"\n }\n ],\n \"nonresident_alien_attestation\": true\n },\n \"endorsements\": [\n \"sepa\"\n ],\n \"client_agreement_id\": \"<string>\"\n}")
.asString();const options = {
method: 'POST',
headers: {
'privy-app-id': '<privy-app-id>',
Authorization: 'Basic <encoded-value>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
provider: 'bridge',
data: {
first_name: '<string>',
middle_name: '<string>',
last_name: '<string>',
transliterated_first_name: '<string>',
transliterated_middle_name: '<string>',
transliterated_last_name: '<string>',
email: '[email protected]',
phone: '<string>',
date_of_birth: '<string>',
nationalities: ['<string>'],
identifying_information: [
{
type: '<string>',
issuing_country: '<string>',
number: '<string>',
description: '<string>',
expiration: '<string>',
image_front: '<string>',
image_back: '<string>'
}
],
nonresident_alien_attestation: true
},
endorsements: ['sepa'],
client_agreement_id: '<string>'
})
};
fetch('https://api.privy.io/v1/users/{user_id}/kyc/submit', 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://api.privy.io/v1/users/{user_id}/kyc/submit",
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([
'provider' => 'bridge',
'data' => [
'first_name' => '<string>',
'middle_name' => '<string>',
'last_name' => '<string>',
'transliterated_first_name' => '<string>',
'transliterated_middle_name' => '<string>',
'transliterated_last_name' => '<string>',
'email' => '[email protected]',
'phone' => '<string>',
'date_of_birth' => '<string>',
'nationalities' => [
'<string>'
],
'identifying_information' => [
[
'type' => '<string>',
'issuing_country' => '<string>',
'number' => '<string>',
'description' => '<string>',
'expiration' => '<string>',
'image_front' => '<string>',
'image_back' => '<string>'
]
],
'nonresident_alien_attestation' => true
],
'endorsements' => [
'sepa'
],
'client_agreement_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"Content-Type: application/json",
"privy-app-id: <privy-app-id>"
],
]);
$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://api.privy.io/v1/users/{user_id}/kyc/submit"
payload := strings.NewReader("{\n \"provider\": \"bridge\",\n \"data\": {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"transliterated_first_name\": \"<string>\",\n \"transliterated_middle_name\": \"<string>\",\n \"transliterated_last_name\": \"<string>\",\n \"email\": \"[email protected]\",\n \"phone\": \"<string>\",\n \"date_of_birth\": \"<string>\",\n \"nationalities\": [\n \"<string>\"\n ],\n \"identifying_information\": [\n {\n \"type\": \"<string>\",\n \"issuing_country\": \"<string>\",\n \"number\": \"<string>\",\n \"description\": \"<string>\",\n \"expiration\": \"<string>\",\n \"image_front\": \"<string>\",\n \"image_back\": \"<string>\"\n }\n ],\n \"nonresident_alien_attestation\": true\n },\n \"endorsements\": [\n \"sepa\"\n ],\n \"client_agreement_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("privy-app-id", "<privy-app-id>")
req.Header.Add("Authorization", "Basic <encoded-value>")
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))
}{
"provider": "bridge",
"environment": "production",
"status": "approved",
"tos": {
"status": "approved",
"link": "<string>"
},
"endorsements": [
{
"name": "sepa",
"status": "approved",
"missing": [
"<string>"
]
}
],
"capabilities": {
"payin_crypto": "active",
"payout_crypto": "active",
"payin_fiat": "active",
"payout_fiat": "active"
},
"requirements_due": [
"<string>"
],
"future_requirements_due": [
"<string>"
],
"kyc": {
"status": "approved",
"link": "<string>",
"rejection_reasons": [
"<string>"
]
}
}Submit KYC data
Submits KYC verification data for the user. Safe to call more than once: the first call creates the provider customer and later calls update it, so a partial submission can be completed incrementally. The first submission must carry enough to begin verification — name, date of birth, residential address and at least one identifying document; later calls may send only the fields that change.
curl --request POST \
--url https://api.privy.io/v1/users/{user_id}/kyc/submit \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--header 'privy-app-id: <privy-app-id>' \
--data '
{
"provider": "bridge",
"data": {
"first_name": "<string>",
"middle_name": "<string>",
"last_name": "<string>",
"transliterated_first_name": "<string>",
"transliterated_middle_name": "<string>",
"transliterated_last_name": "<string>",
"email": "[email protected]",
"phone": "<string>",
"date_of_birth": "<string>",
"nationalities": [
"<string>"
],
"identifying_information": [
{
"type": "<string>",
"issuing_country": "<string>",
"number": "<string>",
"description": "<string>",
"expiration": "<string>",
"image_front": "<string>",
"image_back": "<string>"
}
],
"nonresident_alien_attestation": true
},
"endorsements": [
"sepa"
],
"client_agreement_id": "<string>"
}
'HttpResponse<String> response = Unirest.post("https://api.privy.io/v1/users/{user_id}/kyc/submit")
.header("privy-app-id", "<privy-app-id>")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"provider\": \"bridge\",\n \"data\": {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"transliterated_first_name\": \"<string>\",\n \"transliterated_middle_name\": \"<string>\",\n \"transliterated_last_name\": \"<string>\",\n \"email\": \"[email protected]\",\n \"phone\": \"<string>\",\n \"date_of_birth\": \"<string>\",\n \"nationalities\": [\n \"<string>\"\n ],\n \"identifying_information\": [\n {\n \"type\": \"<string>\",\n \"issuing_country\": \"<string>\",\n \"number\": \"<string>\",\n \"description\": \"<string>\",\n \"expiration\": \"<string>\",\n \"image_front\": \"<string>\",\n \"image_back\": \"<string>\"\n }\n ],\n \"nonresident_alien_attestation\": true\n },\n \"endorsements\": [\n \"sepa\"\n ],\n \"client_agreement_id\": \"<string>\"\n}")
.asString();const options = {
method: 'POST',
headers: {
'privy-app-id': '<privy-app-id>',
Authorization: 'Basic <encoded-value>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
provider: 'bridge',
data: {
first_name: '<string>',
middle_name: '<string>',
last_name: '<string>',
transliterated_first_name: '<string>',
transliterated_middle_name: '<string>',
transliterated_last_name: '<string>',
email: '[email protected]',
phone: '<string>',
date_of_birth: '<string>',
nationalities: ['<string>'],
identifying_information: [
{
type: '<string>',
issuing_country: '<string>',
number: '<string>',
description: '<string>',
expiration: '<string>',
image_front: '<string>',
image_back: '<string>'
}
],
nonresident_alien_attestation: true
},
endorsements: ['sepa'],
client_agreement_id: '<string>'
})
};
fetch('https://api.privy.io/v1/users/{user_id}/kyc/submit', 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://api.privy.io/v1/users/{user_id}/kyc/submit",
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([
'provider' => 'bridge',
'data' => [
'first_name' => '<string>',
'middle_name' => '<string>',
'last_name' => '<string>',
'transliterated_first_name' => '<string>',
'transliterated_middle_name' => '<string>',
'transliterated_last_name' => '<string>',
'email' => '[email protected]',
'phone' => '<string>',
'date_of_birth' => '<string>',
'nationalities' => [
'<string>'
],
'identifying_information' => [
[
'type' => '<string>',
'issuing_country' => '<string>',
'number' => '<string>',
'description' => '<string>',
'expiration' => '<string>',
'image_front' => '<string>',
'image_back' => '<string>'
]
],
'nonresident_alien_attestation' => true
],
'endorsements' => [
'sepa'
],
'client_agreement_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"Content-Type: application/json",
"privy-app-id: <privy-app-id>"
],
]);
$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://api.privy.io/v1/users/{user_id}/kyc/submit"
payload := strings.NewReader("{\n \"provider\": \"bridge\",\n \"data\": {\n \"first_name\": \"<string>\",\n \"middle_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"transliterated_first_name\": \"<string>\",\n \"transliterated_middle_name\": \"<string>\",\n \"transliterated_last_name\": \"<string>\",\n \"email\": \"[email protected]\",\n \"phone\": \"<string>\",\n \"date_of_birth\": \"<string>\",\n \"nationalities\": [\n \"<string>\"\n ],\n \"identifying_information\": [\n {\n \"type\": \"<string>\",\n \"issuing_country\": \"<string>\",\n \"number\": \"<string>\",\n \"description\": \"<string>\",\n \"expiration\": \"<string>\",\n \"image_front\": \"<string>\",\n \"image_back\": \"<string>\"\n }\n ],\n \"nonresident_alien_attestation\": true\n },\n \"endorsements\": [\n \"sepa\"\n ],\n \"client_agreement_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("privy-app-id", "<privy-app-id>")
req.Header.Add("Authorization", "Basic <encoded-value>")
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))
}{
"provider": "bridge",
"environment": "production",
"status": "approved",
"tos": {
"status": "approved",
"link": "<string>"
},
"endorsements": [
{
"name": "sepa",
"status": "approved",
"missing": [
"<string>"
]
}
],
"capabilities": {
"payin_crypto": "active",
"payout_crypto": "active",
"payin_fiat": "active",
"payout_fiat": "active"
},
"requirements_due": [
"<string>"
],
"future_requirements_due": [
"<string>"
],
"kyc": {
"status": "approved",
"link": "<string>",
"rejection_reasons": [
"<string>"
]
}
}Authorizations
Basic Auth header with your app ID as the username and your app secret as the password.
Headers
ID of your Privy app.
Path Parameters
The ID of the user.
Body
Request body for headless KYC data submission.
KYC/KYB provider identifier.
bridge KYC verification data for headless submission.
Show child attributes
Show child attributes
Provider environment (production or sandbox).
production, sandbox Endorsements to request during KYC.
1000Endorsement identifier.
256Client-side agreement ID for ToS acceptance.
1 - 1024Response
KYC status snapshot reflecting the submitted data.
Full KYC status for a user with a given provider.
KYC/KYB provider identifier.
bridge Provider environment (production or sandbox).
production, sandbox KYC/KYB status for the user.
"approved"
Terms of Service acceptance status for a KYC or KYB flow.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Capability statuses for the customer.
Show child attributes
Show child attributes
Top-level items still needed (e.g. link a bank account).
Items that will be required in the future.
Verification status detail for a KYC or KYB check.
Show child attributes
Show child attributes
Was this page helpful?

