curl --request POST \
--url https://api.privy.io/v1/users/{user_id}/kyc/links \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--header 'privy-app-id: <privy-app-id>' \
--data '
{
"provider": "bridge",
"email": "[email protected]",
"endorsements": [
"sepa"
],
"redirect_uri": "<string>",
"client_agreement_id": "<string>"
}
'HttpResponse<String> response = Unirest.post("https://api.privy.io/v1/users/{user_id}/kyc/links")
.header("privy-app-id", "<privy-app-id>")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"provider\": \"bridge\",\n \"email\": \"[email protected]\",\n \"endorsements\": [\n \"sepa\"\n ],\n \"redirect_uri\": \"<string>\",\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',
email: '[email protected]',
endorsements: ['sepa'],
redirect_uri: '<string>',
client_agreement_id: '<string>'
})
};
fetch('https://api.privy.io/v1/users/{user_id}/kyc/links', 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/links",
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',
'email' => '[email protected]',
'endorsements' => [
'sepa'
],
'redirect_uri' => '<string>',
'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/links"
payload := strings.NewReader("{\n \"provider\": \"bridge\",\n \"email\": \"[email protected]\",\n \"endorsements\": [\n \"sepa\"\n ],\n \"redirect_uri\": \"<string>\",\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>"
]
}
}Initiate KYC verification
Generates a hosted KYC link for the user and returns the current KYC status snapshot.
curl --request POST \
--url https://api.privy.io/v1/users/{user_id}/kyc/links \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/json' \
--header 'privy-app-id: <privy-app-id>' \
--data '
{
"provider": "bridge",
"email": "[email protected]",
"endorsements": [
"sepa"
],
"redirect_uri": "<string>",
"client_agreement_id": "<string>"
}
'HttpResponse<String> response = Unirest.post("https://api.privy.io/v1/users/{user_id}/kyc/links")
.header("privy-app-id", "<privy-app-id>")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"provider\": \"bridge\",\n \"email\": \"[email protected]\",\n \"endorsements\": [\n \"sepa\"\n ],\n \"redirect_uri\": \"<string>\",\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',
email: '[email protected]',
endorsements: ['sepa'],
redirect_uri: '<string>',
client_agreement_id: '<string>'
})
};
fetch('https://api.privy.io/v1/users/{user_id}/kyc/links', 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/links",
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',
'email' => '[email protected]',
'endorsements' => [
'sepa'
],
'redirect_uri' => '<string>',
'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/links"
payload := strings.NewReader("{\n \"provider\": \"bridge\",\n \"email\": \"[email protected]\",\n \"endorsements\": [\n \"sepa\"\n ],\n \"redirect_uri\": \"<string>\",\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 initiating a hosted KYC flow.
KYC/KYB provider identifier.
bridge Provider environment (production or sandbox).
production, sandbox Email address for the KYC session.
Endorsements to request during KYC.
Endorsement identifier.
256URI to redirect the user after completing KYC.
Client-side agreement ID for ToS acceptance.
Response
KYC status snapshot including the hosted verification link.
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?

