# Requires: npm i -g @infinite_dev/cli && export INFINITE_API_KEY=sk_sandbox_...
# Escape hatch for any endpoint: infinite api <METHOD> <path>
infinite api POST /v1/verification/initiate \
--body '<request-json>'Initiate a new verification.
# Use MCP tool start_verification — send the hosted verificationUrl to a human when available.import requests
url = "https://sandbox.api.infinite.dev/v1/verification/initiate"
payload = {
"type": "INDIVIDUAL",
"countryCode": "US",
"email": "customer@example.com",
"name": "John Doe",
"customerId": "cus_abc123",
"fillOnBehalf": False,
"redirectUrl": "https://app.example.com/kyc-complete"
}
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({
type: 'INDIVIDUAL',
countryCode: 'US',
email: 'customer@example.com',
name: 'John Doe',
customerId: 'cus_abc123',
fillOnBehalf: false,
redirectUrl: 'https://app.example.com/kyc-complete'
})
};
fetch('https://sandbox.api.infinite.dev/v1/verification/initiate', 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.api.infinite.dev/v1/verification/initiate",
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([
'type' => 'INDIVIDUAL',
'countryCode' => 'US',
'email' => 'customer@example.com',
'name' => 'John Doe',
'customerId' => 'cus_abc123',
'fillOnBehalf' => false,
'redirectUrl' => 'https://app.example.com/kyc-complete'
]),
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.api.infinite.dev/v1/verification/initiate"
payload := strings.NewReader("{\n \"type\": \"INDIVIDUAL\",\n \"countryCode\": \"US\",\n \"email\": \"customer@example.com\",\n \"name\": \"John Doe\",\n \"customerId\": \"cus_abc123\",\n \"fillOnBehalf\": false,\n \"redirectUrl\": \"https://app.example.com/kyc-complete\"\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.api.infinite.dev/v1/verification/initiate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"INDIVIDUAL\",\n \"countryCode\": \"US\",\n \"email\": \"customer@example.com\",\n \"name\": \"John Doe\",\n \"customerId\": \"cus_abc123\",\n \"fillOnBehalf\": false,\n \"redirectUrl\": \"https://app.example.com/kyc-complete\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.infinite.dev/v1/verification/initiate")
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 \"type\": \"INDIVIDUAL\",\n \"countryCode\": \"US\",\n \"email\": \"customer@example.com\",\n \"name\": \"John Doe\",\n \"customerId\": \"cus_abc123\",\n \"fillOnBehalf\": false,\n \"redirectUrl\": \"https://app.example.com/kyc-complete\"\n}"
response = http.request(request)
puts response.read_body{
"verification": {
"sessionId": "vsess_abc123",
"verificationUrl": "https://verify.infinite.dev/?sessionId=vsess_abc123",
"expiresAt": "2026-10-15T10:30:00Z"
}
}Initiate a new verification
Creates a new verification session.
Authentication:
- JWT token: Organization inferred from user’s authenticated organization
- API Key: Organization inferred from API key’s associated organization
Customer handling:
- If customerId is provided: Creates verification for existing customer
- If customerId is omitted: Checks for existing customer by email. If found, uses existing customer. If not found, creates new customer with provided email/name details.
Idempotency:
- Customer email must be unique within the organization
- If an active verification session exists for the customer, returns the existing session
- If a pending verification session exists for the customer, returns an error
# Requires: npm i -g @infinite_dev/cli && export INFINITE_API_KEY=sk_sandbox_...
# Escape hatch for any endpoint: infinite api <METHOD> <path>
infinite api POST /v1/verification/initiate \
--body '<request-json>'Initiate a new verification.
# Use MCP tool start_verification — send the hosted verificationUrl to a human when available.import requests
url = "https://sandbox.api.infinite.dev/v1/verification/initiate"
payload = {
"type": "INDIVIDUAL",
"countryCode": "US",
"email": "customer@example.com",
"name": "John Doe",
"customerId": "cus_abc123",
"fillOnBehalf": False,
"redirectUrl": "https://app.example.com/kyc-complete"
}
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({
type: 'INDIVIDUAL',
countryCode: 'US',
email: 'customer@example.com',
name: 'John Doe',
customerId: 'cus_abc123',
fillOnBehalf: false,
redirectUrl: 'https://app.example.com/kyc-complete'
})
};
fetch('https://sandbox.api.infinite.dev/v1/verification/initiate', 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.api.infinite.dev/v1/verification/initiate",
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([
'type' => 'INDIVIDUAL',
'countryCode' => 'US',
'email' => 'customer@example.com',
'name' => 'John Doe',
'customerId' => 'cus_abc123',
'fillOnBehalf' => false,
'redirectUrl' => 'https://app.example.com/kyc-complete'
]),
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.api.infinite.dev/v1/verification/initiate"
payload := strings.NewReader("{\n \"type\": \"INDIVIDUAL\",\n \"countryCode\": \"US\",\n \"email\": \"customer@example.com\",\n \"name\": \"John Doe\",\n \"customerId\": \"cus_abc123\",\n \"fillOnBehalf\": false,\n \"redirectUrl\": \"https://app.example.com/kyc-complete\"\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.api.infinite.dev/v1/verification/initiate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"INDIVIDUAL\",\n \"countryCode\": \"US\",\n \"email\": \"customer@example.com\",\n \"name\": \"John Doe\",\n \"customerId\": \"cus_abc123\",\n \"fillOnBehalf\": false,\n \"redirectUrl\": \"https://app.example.com/kyc-complete\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.infinite.dev/v1/verification/initiate")
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 \"type\": \"INDIVIDUAL\",\n \"countryCode\": \"US\",\n \"email\": \"customer@example.com\",\n \"name\": \"John Doe\",\n \"customerId\": \"cus_abc123\",\n \"fillOnBehalf\": false,\n \"redirectUrl\": \"https://app.example.com/kyc-complete\"\n}"
response = http.request(request)
puts response.read_body{
"verification": {
"sessionId": "vsess_abc123",
"verificationUrl": "https://verify.infinite.dev/?sessionId=vsess_abc123",
"expiresAt": "2026-10-15T10:30:00Z"
}
}Authorizations
API Key in Bearer format (e.g., Bearer sk_test_...)
Headers
API key
Body
Customer type
INDIVIDUAL, BUSINESS "INDIVIDUAL"
Country code (ISO 3166-1 alpha-2)
"US"
Customer email address. Must be unique within the organization. If a customer with this email already exists, the existing customer will be used.
"customer@example.com"
Customer name
"John Doe"
Existing customer ID (optional)
"cus_abc123"
When true, indicates the organization will fill out the verification on behalf of the customer. No reminder emails will be sent.
URL to redirect the user to after verification is completed. When provided, the user will be automatically redirected to this URL after successfully completing the verification flow.
"https://app.example.com/kyc-complete"
Response
Show child attributes
Show child attributes
Was this page helpful?