curl --request POST \
--url https://sandbox.apocor.ai/v1/applicants/{id}/kyc-direct \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "Jane",
"lastName": "Doe",
"dateOfBirth": "1990-04-12",
"gender": "F",
"nationality": "US",
"nationalId": "A12345678",
"idType": "PASSPORT",
"issueDate": "2020-01-15",
"expiryDate": "2030-01-14",
"phoneCountryCode": "1",
"phoneNumber": "4155550100",
"ssn": "123456789",
"address": {
"addressLine1": "123 Main St",
"city": "New York",
"state": "NY",
"country": "US",
"postalCode": "10001"
}
}
'import requests
url = "https://sandbox.apocor.ai/v1/applicants/{id}/kyc-direct"
payload = {
"firstName": "Jane",
"lastName": "Doe",
"dateOfBirth": "1990-04-12",
"gender": "F",
"nationality": "US",
"nationalId": "A12345678",
"idType": "PASSPORT",
"issueDate": "2020-01-15",
"expiryDate": "2030-01-14",
"phoneCountryCode": "1",
"phoneNumber": "4155550100",
"ssn": "123456789",
"address": {
"addressLine1": "123 Main St",
"city": "New York",
"state": "NY",
"country": "US",
"postalCode": "10001"
}
}
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({
firstName: 'Jane',
lastName: 'Doe',
dateOfBirth: '1990-04-12',
gender: 'F',
nationality: 'US',
nationalId: 'A12345678',
idType: 'PASSPORT',
issueDate: '2020-01-15',
expiryDate: '2030-01-14',
phoneCountryCode: '1',
phoneNumber: '4155550100',
ssn: '123456789',
address: {
addressLine1: '123 Main St',
city: 'New York',
state: 'NY',
country: 'US',
postalCode: '10001'
}
})
};
fetch('https://sandbox.apocor.ai/v1/applicants/{id}/kyc-direct', 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.apocor.ai/v1/applicants/{id}/kyc-direct",
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([
'firstName' => 'Jane',
'lastName' => 'Doe',
'dateOfBirth' => '1990-04-12',
'gender' => 'F',
'nationality' => 'US',
'nationalId' => 'A12345678',
'idType' => 'PASSPORT',
'issueDate' => '2020-01-15',
'expiryDate' => '2030-01-14',
'phoneCountryCode' => '1',
'phoneNumber' => '4155550100',
'ssn' => '123456789',
'address' => [
'addressLine1' => '123 Main St',
'city' => 'New York',
'state' => 'NY',
'country' => 'US',
'postalCode' => '10001'
]
]),
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.apocor.ai/v1/applicants/{id}/kyc-direct"
payload := strings.NewReader("{\n \"firstName\": \"Jane\",\n \"lastName\": \"Doe\",\n \"dateOfBirth\": \"1990-04-12\",\n \"gender\": \"F\",\n \"nationality\": \"US\",\n \"nationalId\": \"A12345678\",\n \"idType\": \"PASSPORT\",\n \"issueDate\": \"2020-01-15\",\n \"expiryDate\": \"2030-01-14\",\n \"phoneCountryCode\": \"1\",\n \"phoneNumber\": \"4155550100\",\n \"ssn\": \"123456789\",\n \"address\": {\n \"addressLine1\": \"123 Main St\",\n \"city\": \"New York\",\n \"state\": \"NY\",\n \"country\": \"US\",\n \"postalCode\": \"10001\"\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.apocor.ai/v1/applicants/{id}/kyc-direct")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"Jane\",\n \"lastName\": \"Doe\",\n \"dateOfBirth\": \"1990-04-12\",\n \"gender\": \"F\",\n \"nationality\": \"US\",\n \"nationalId\": \"A12345678\",\n \"idType\": \"PASSPORT\",\n \"issueDate\": \"2020-01-15\",\n \"expiryDate\": \"2030-01-14\",\n \"phoneCountryCode\": \"1\",\n \"phoneNumber\": \"4155550100\",\n \"ssn\": \"123456789\",\n \"address\": {\n \"addressLine1\": \"123 Main St\",\n \"city\": \"New York\",\n \"state\": \"NY\",\n \"country\": \"US\",\n \"postalCode\": \"10001\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.apocor.ai/v1/applicants/{id}/kyc-direct")
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 \"firstName\": \"Jane\",\n \"lastName\": \"Doe\",\n \"dateOfBirth\": \"1990-04-12\",\n \"gender\": \"F\",\n \"nationality\": \"US\",\n \"nationalId\": \"A12345678\",\n \"idType\": \"PASSPORT\",\n \"issueDate\": \"2020-01-15\",\n \"expiryDate\": \"2030-01-14\",\n \"phoneCountryCode\": \"1\",\n \"phoneNumber\": \"4155550100\",\n \"ssn\": \"123456789\",\n \"address\": {\n \"addressLine1\": \"123 Main St\",\n \"city\": \"New York\",\n \"state\": \"NY\",\n \"country\": \"US\",\n \"postalCode\": \"10001\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "app_abc123",
"status": "PENDING",
"issuerKycStatus": "SUBMITTED",
"issuerKycReady": false
}
}{
"error": {
"code": "INVALID_REQUEST",
"message": "Applicant must be approved"
}
}Submit direct document KYC
Step 3 of direct document KYC (Option C). Submit identity fields after uploading id_front and selfie (and id_back unless idType is PASSPORT). Apocor forwards the profile and documents to the card program — no identity-provider widget or share token. Poll GET /v1/applicants//kyc-status until issuerKycReady is true. US addresses require a 9-digit ssn. Applicant email is required.
curl --request POST \
--url https://sandbox.apocor.ai/v1/applicants/{id}/kyc-direct \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "Jane",
"lastName": "Doe",
"dateOfBirth": "1990-04-12",
"gender": "F",
"nationality": "US",
"nationalId": "A12345678",
"idType": "PASSPORT",
"issueDate": "2020-01-15",
"expiryDate": "2030-01-14",
"phoneCountryCode": "1",
"phoneNumber": "4155550100",
"ssn": "123456789",
"address": {
"addressLine1": "123 Main St",
"city": "New York",
"state": "NY",
"country": "US",
"postalCode": "10001"
}
}
'import requests
url = "https://sandbox.apocor.ai/v1/applicants/{id}/kyc-direct"
payload = {
"firstName": "Jane",
"lastName": "Doe",
"dateOfBirth": "1990-04-12",
"gender": "F",
"nationality": "US",
"nationalId": "A12345678",
"idType": "PASSPORT",
"issueDate": "2020-01-15",
"expiryDate": "2030-01-14",
"phoneCountryCode": "1",
"phoneNumber": "4155550100",
"ssn": "123456789",
"address": {
"addressLine1": "123 Main St",
"city": "New York",
"state": "NY",
"country": "US",
"postalCode": "10001"
}
}
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({
firstName: 'Jane',
lastName: 'Doe',
dateOfBirth: '1990-04-12',
gender: 'F',
nationality: 'US',
nationalId: 'A12345678',
idType: 'PASSPORT',
issueDate: '2020-01-15',
expiryDate: '2030-01-14',
phoneCountryCode: '1',
phoneNumber: '4155550100',
ssn: '123456789',
address: {
addressLine1: '123 Main St',
city: 'New York',
state: 'NY',
country: 'US',
postalCode: '10001'
}
})
};
fetch('https://sandbox.apocor.ai/v1/applicants/{id}/kyc-direct', 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.apocor.ai/v1/applicants/{id}/kyc-direct",
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([
'firstName' => 'Jane',
'lastName' => 'Doe',
'dateOfBirth' => '1990-04-12',
'gender' => 'F',
'nationality' => 'US',
'nationalId' => 'A12345678',
'idType' => 'PASSPORT',
'issueDate' => '2020-01-15',
'expiryDate' => '2030-01-14',
'phoneCountryCode' => '1',
'phoneNumber' => '4155550100',
'ssn' => '123456789',
'address' => [
'addressLine1' => '123 Main St',
'city' => 'New York',
'state' => 'NY',
'country' => 'US',
'postalCode' => '10001'
]
]),
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.apocor.ai/v1/applicants/{id}/kyc-direct"
payload := strings.NewReader("{\n \"firstName\": \"Jane\",\n \"lastName\": \"Doe\",\n \"dateOfBirth\": \"1990-04-12\",\n \"gender\": \"F\",\n \"nationality\": \"US\",\n \"nationalId\": \"A12345678\",\n \"idType\": \"PASSPORT\",\n \"issueDate\": \"2020-01-15\",\n \"expiryDate\": \"2030-01-14\",\n \"phoneCountryCode\": \"1\",\n \"phoneNumber\": \"4155550100\",\n \"ssn\": \"123456789\",\n \"address\": {\n \"addressLine1\": \"123 Main St\",\n \"city\": \"New York\",\n \"state\": \"NY\",\n \"country\": \"US\",\n \"postalCode\": \"10001\"\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.apocor.ai/v1/applicants/{id}/kyc-direct")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"Jane\",\n \"lastName\": \"Doe\",\n \"dateOfBirth\": \"1990-04-12\",\n \"gender\": \"F\",\n \"nationality\": \"US\",\n \"nationalId\": \"A12345678\",\n \"idType\": \"PASSPORT\",\n \"issueDate\": \"2020-01-15\",\n \"expiryDate\": \"2030-01-14\",\n \"phoneCountryCode\": \"1\",\n \"phoneNumber\": \"4155550100\",\n \"ssn\": \"123456789\",\n \"address\": {\n \"addressLine1\": \"123 Main St\",\n \"city\": \"New York\",\n \"state\": \"NY\",\n \"country\": \"US\",\n \"postalCode\": \"10001\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.apocor.ai/v1/applicants/{id}/kyc-direct")
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 \"firstName\": \"Jane\",\n \"lastName\": \"Doe\",\n \"dateOfBirth\": \"1990-04-12\",\n \"gender\": \"F\",\n \"nationality\": \"US\",\n \"nationalId\": \"A12345678\",\n \"idType\": \"PASSPORT\",\n \"issueDate\": \"2020-01-15\",\n \"expiryDate\": \"2030-01-14\",\n \"phoneCountryCode\": \"1\",\n \"phoneNumber\": \"4155550100\",\n \"ssn\": \"123456789\",\n \"address\": {\n \"addressLine1\": \"123 Main St\",\n \"city\": \"New York\",\n \"state\": \"NY\",\n \"country\": \"US\",\n \"postalCode\": \"10001\"\n }\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "app_abc123",
"status": "PENDING",
"issuerKycStatus": "SUBMITTED",
"issuerKycReady": false
}
}{
"error": {
"code": "INVALID_REQUEST",
"message": "Applicant must be approved"
}
}Authorizations
Bearer access token obtained from POST /v1/oauth/token using your Apocor API key.
Path Parameters
Resource identifier.
Body
YYYY-MM-DD
"1990-04-12"
M, F ISO 3166-1 alpha-2
ID / passport number matching idType.
CN-RIC, PASSPORT, HK-HKID, DLN, Government-Issued ID Card, EU Residency Permit, UAE Residency Permit YYYY-MM-DD
YYYY-MM-DD
Numeric country code without +. Example: 1
Show child attributes
Show child attributes
9-digit US SSN. Required when address.country is US.
Response
Applicant with issuer KYC status. Poll kyc-status until issuerKycReady is true.
An end-user or business. Provider-internal identity references are white-labeled away.
Show child attributes
Show child attributes