Discover onboarding requirements for a country
Returns fields[], documents[], and individualRequirements[] for the given country (alpha-2 or alpha-3, normalized server-side; response always echoes alpha-3). documents[] is a checklist of what to collect; the integrator uploads each via POST /v2/documents (file only) and references the returned ids at submit time.
curl --request GET \
--url https://api.sandbox.conduit.financial/v2/onboarding/requirements \
--header 'x-api-key: <api-key>'import requests
url = "https://api.sandbox.conduit.financial/v2/onboarding/requirements"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.sandbox.conduit.financial/v2/onboarding/requirements', 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.sandbox.conduit.financial/v2/onboarding/requirements",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.sandbox.conduit.financial/v2/onboarding/requirements"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.sandbox.conduit.financial/v2/onboarding/requirements")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.conduit.financial/v2/onboarding/requirements")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"schemaVersion": "3",
"context": "onboarding",
"country": "USA",
"fields": [
{
"pointer": "/businessInfo/taxId",
"label": "Tax Identification Number",
"type": "string",
"required": true,
"helpText": "Issued by HMRC. 10-digit number; auto-assigned on CT registration; appears on HMRC correspondence. VAT Registration Number (GB + 9 digits; XI prefix for NI–EU trade) is supplementary — collect separately if VAT-registered.",
"group": "<string>",
"mustEqual": true,
"constraints": {
"pattern": "^\\d{2}\\.\\d{3}\\.\\d{3}/\\d{4}-\\d{2}$",
"example": "12.345.678/0001-95",
"minLength": 0,
"maxLength": 0,
"min": 123,
"max": 123,
"minDate": "1800-01-01",
"maxDate": "today",
"minAgeYears": 0
},
"conditions": [
{
"pointer": "/companyClassification/legalStructure",
"operator": "eq",
"value": "<string>",
"values": [
"<string>"
]
}
],
"allowedValues": [
"LLC",
"CORPORATION",
"PARTNERSHIP"
],
"options": [
{
"value": "Sociedad Anónima",
"label": "Sociedad Anónima",
"abbr": "S.A.",
"description": "<string>"
}
]
}
],
"documents": [
{
"title": "Articles of Incorporation",
"from": "<string>",
"alternatives": [
{
"title": "Certificate of Incorporation",
"from": "<string>"
}
],
"requiredArtifacts": [
{
"title": "Certificate of Incorporation",
"from": "<string>"
}
],
"optionalArtifacts": [
{
"title": "Certificate of Incorporation",
"from": "<string>"
}
],
"optional": true,
"minCount": 4503599627370496,
"groupId": "group:any-of:AUDITED_FINANCIAL_STATEMENT+BANK_STATEMENT",
"policyFallback": true,
"guidance": "<string>"
}
],
"minDocuments": 1,
"individualRequirements": [
{
"role": "BENEFICIAL_OWNER",
"minCount": 4503599627370495,
"fields": [
{
"pointer": "/businessInfo/taxId",
"label": "Tax Identification Number",
"type": "string",
"required": true,
"helpText": "Issued by HMRC. 10-digit number; auto-assigned on CT registration; appears on HMRC correspondence. VAT Registration Number (GB + 9 digits; XI prefix for NI–EU trade) is supplementary — collect separately if VAT-registered.",
"group": "<string>",
"mustEqual": true,
"constraints": {
"pattern": "^\\d{2}\\.\\d{3}\\.\\d{3}/\\d{4}-\\d{2}$",
"example": "12.345.678/0001-95",
"minLength": 0,
"maxLength": 0,
"min": 123,
"max": 123,
"minDate": "1800-01-01",
"maxDate": "today",
"minAgeYears": 0
},
"conditions": [
{
"pointer": "/companyClassification/legalStructure",
"operator": "eq",
"value": "<string>",
"values": [
"<string>"
]
}
],
"allowedValues": [
"LLC",
"CORPORATION",
"PARTNERSHIP"
],
"options": [
{
"value": "Sociedad Anónima",
"label": "Sociedad Anónima",
"abbr": "S.A.",
"description": "<string>"
}
]
}
],
"documents": [
{
"title": "Government-issued photo ID",
"optional": true
}
],
"maxCount": 0,
"ownershipThreshold": 25
}
]
}{
"type": "INVALID_OID_FORMAT",
"title": "Invalid Object ID Format",
"status": 400,
"detail": "A path or query parameter expected a valid object identifier but received a value that does not match the expected format.",
"resolution": "Verify that all IDs in the request URL and query parameters are correctly formatted. IDs are typically prefixed strings like 'cus_...', 'app_...', or 'doc_...'.",
"docs": "https://conduit-v2.mintlify.app/errors#invalid-oid-format",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "API_KEY_MISSING",
"title": "API Key Missing",
"status": 401,
"detail": "The request did not include an API key. All API requests must be authenticated.",
"resolution": "Include your API key in the 'x-api-key' header with every request.",
"docs": "https://conduit-v2.mintlify.app/errors#api-key-missing",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "NOT_FOUND",
"title": "Not Found",
"status": 404,
"detail": "The requested resource does not exist or you do not have access to it.",
"resolution": "Check that the resource ID in the URL is correct. The resource may have been deleted or may belong to a different account.",
"docs": "https://conduit-v2.mintlify.app/errors#not-found",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "RATE_LIMITED",
"title": "Rate Limited",
"status": 429,
"detail": "Too many requests. This error is returned by three independent checks: the per-organization bucket applied to every authenticated API request; the per-IP bucket applied to unauthenticated traffic before an API key is validated; and the per-IP bucket applied when repeated invalid API keys are submitted from the same address. Honor the Retry-After header (also exposed as retryAfterSeconds in the body) before retrying. Current limits and remaining budget are visible in X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset on rate-limited route responses.",
"resolution": "Sleep until Retry-After seconds have elapsed, then retry. For sustained workloads exceeding the per-organization defaults, request a rate-limit increase through your support contact.",
"docs": "https://conduit-v2.mintlify.app/errors#rate-limited",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z",
"retryAfterSeconds": 3
}{
"type": "INTERNAL_ERROR",
"title": "Internal Error",
"status": 500,
"detail": "An unexpected error occurred while processing your request.",
"resolution": "Retry the request after a brief delay. If the error persists, contact support and include the correlationId from the error response for investigation.",
"docs": "https://conduit-v2.mintlify.app/errors#internal-error",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}Authorizations
Query Parameters
ISO 3166-1 alpha-2 or alpha-3 country code for the customer's primary jurisdiction.
Response
Discovery response schema version. Bumps on any breaking discovery-response change (field renamed, removed, type changed, conditional semantics changed). Distinct from the webhook envelope's apiVersion which tracks the API major. Clients pin the literal and fail loudly on mismatch; servers do not negotiate.
3 The discovery context that produced this requirements set.
onboarding, feature, order "onboarding"
ISO 3166-1 alpha-3 country code the requirements were resolved for. Always three uppercase letters.
^[A-Z]{3}$"USA"
Scalar fields the integrator must collect, with format hints and allowedValues for enum fields.
Show child attributes
Show child attributes
Customer-level documents to collect. Rows are usually keyed by canonicalType — EXCEPT address-targeted proof-of-address, which can appear as two rows sharing canonicalType PROOF_OF_ADDRESS disambiguated by addressTarget (registered / operating); collect both, and key those rows on addressTarget, not canonicalType alone. Upload every requiredArtifacts[] entry and any one alternatives[] entry when present, otherwise upload the row itself via POST /v2/documents.
Show child attributes
Show child attributes
Document floor: the minimum number of customer-level documents POST /v2/onboarding accepts — currently 0 or 1. 1 means at least one customer-level document must be uploaded before submit (submitting documentIds: [] is rejected with 422 ONBOARDING_NOT_READY); 0 means documents are optional at submit. This is the authoritative floor — individual documents[] rows are a checklist of acceptable types and do not each carry a required flag; per-document completeness is assessed after submission.
0 <= x <= 90071992547409911
Per-role count and person-level field + document requirements for ownership.persons[].
- Option 1
- Option 2
Show child attributes
Show child attributes
curl --request GET \
--url https://api.sandbox.conduit.financial/v2/onboarding/requirements \
--header 'x-api-key: <api-key>'import requests
url = "https://api.sandbox.conduit.financial/v2/onboarding/requirements"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.sandbox.conduit.financial/v2/onboarding/requirements', 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.sandbox.conduit.financial/v2/onboarding/requirements",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.sandbox.conduit.financial/v2/onboarding/requirements"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.sandbox.conduit.financial/v2/onboarding/requirements")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.conduit.financial/v2/onboarding/requirements")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"schemaVersion": "3",
"context": "onboarding",
"country": "USA",
"fields": [
{
"pointer": "/businessInfo/taxId",
"label": "Tax Identification Number",
"type": "string",
"required": true,
"helpText": "Issued by HMRC. 10-digit number; auto-assigned on CT registration; appears on HMRC correspondence. VAT Registration Number (GB + 9 digits; XI prefix for NI–EU trade) is supplementary — collect separately if VAT-registered.",
"group": "<string>",
"mustEqual": true,
"constraints": {
"pattern": "^\\d{2}\\.\\d{3}\\.\\d{3}/\\d{4}-\\d{2}$",
"example": "12.345.678/0001-95",
"minLength": 0,
"maxLength": 0,
"min": 123,
"max": 123,
"minDate": "1800-01-01",
"maxDate": "today",
"minAgeYears": 0
},
"conditions": [
{
"pointer": "/companyClassification/legalStructure",
"operator": "eq",
"value": "<string>",
"values": [
"<string>"
]
}
],
"allowedValues": [
"LLC",
"CORPORATION",
"PARTNERSHIP"
],
"options": [
{
"value": "Sociedad Anónima",
"label": "Sociedad Anónima",
"abbr": "S.A.",
"description": "<string>"
}
]
}
],
"documents": [
{
"title": "Articles of Incorporation",
"from": "<string>",
"alternatives": [
{
"title": "Certificate of Incorporation",
"from": "<string>"
}
],
"requiredArtifacts": [
{
"title": "Certificate of Incorporation",
"from": "<string>"
}
],
"optionalArtifacts": [
{
"title": "Certificate of Incorporation",
"from": "<string>"
}
],
"optional": true,
"minCount": 4503599627370496,
"groupId": "group:any-of:AUDITED_FINANCIAL_STATEMENT+BANK_STATEMENT",
"policyFallback": true,
"guidance": "<string>"
}
],
"minDocuments": 1,
"individualRequirements": [
{
"role": "BENEFICIAL_OWNER",
"minCount": 4503599627370495,
"fields": [
{
"pointer": "/businessInfo/taxId",
"label": "Tax Identification Number",
"type": "string",
"required": true,
"helpText": "Issued by HMRC. 10-digit number; auto-assigned on CT registration; appears on HMRC correspondence. VAT Registration Number (GB + 9 digits; XI prefix for NI–EU trade) is supplementary — collect separately if VAT-registered.",
"group": "<string>",
"mustEqual": true,
"constraints": {
"pattern": "^\\d{2}\\.\\d{3}\\.\\d{3}/\\d{4}-\\d{2}$",
"example": "12.345.678/0001-95",
"minLength": 0,
"maxLength": 0,
"min": 123,
"max": 123,
"minDate": "1800-01-01",
"maxDate": "today",
"minAgeYears": 0
},
"conditions": [
{
"pointer": "/companyClassification/legalStructure",
"operator": "eq",
"value": "<string>",
"values": [
"<string>"
]
}
],
"allowedValues": [
"LLC",
"CORPORATION",
"PARTNERSHIP"
],
"options": [
{
"value": "Sociedad Anónima",
"label": "Sociedad Anónima",
"abbr": "S.A.",
"description": "<string>"
}
]
}
],
"documents": [
{
"title": "Government-issued photo ID",
"optional": true
}
],
"maxCount": 0,
"ownershipThreshold": 25
}
]
}{
"type": "INVALID_OID_FORMAT",
"title": "Invalid Object ID Format",
"status": 400,
"detail": "A path or query parameter expected a valid object identifier but received a value that does not match the expected format.",
"resolution": "Verify that all IDs in the request URL and query parameters are correctly formatted. IDs are typically prefixed strings like 'cus_...', 'app_...', or 'doc_...'.",
"docs": "https://conduit-v2.mintlify.app/errors#invalid-oid-format",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "API_KEY_MISSING",
"title": "API Key Missing",
"status": 401,
"detail": "The request did not include an API key. All API requests must be authenticated.",
"resolution": "Include your API key in the 'x-api-key' header with every request.",
"docs": "https://conduit-v2.mintlify.app/errors#api-key-missing",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "NOT_FOUND",
"title": "Not Found",
"status": 404,
"detail": "The requested resource does not exist or you do not have access to it.",
"resolution": "Check that the resource ID in the URL is correct. The resource may have been deleted or may belong to a different account.",
"docs": "https://conduit-v2.mintlify.app/errors#not-found",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "RATE_LIMITED",
"title": "Rate Limited",
"status": 429,
"detail": "Too many requests. This error is returned by three independent checks: the per-organization bucket applied to every authenticated API request; the per-IP bucket applied to unauthenticated traffic before an API key is validated; and the per-IP bucket applied when repeated invalid API keys are submitted from the same address. Honor the Retry-After header (also exposed as retryAfterSeconds in the body) before retrying. Current limits and remaining budget are visible in X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset on rate-limited route responses.",
"resolution": "Sleep until Retry-After seconds have elapsed, then retry. For sustained workloads exceeding the per-organization defaults, request a rate-limit increase through your support contact.",
"docs": "https://conduit-v2.mintlify.app/errors#rate-limited",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z",
"retryAfterSeconds": 3
}{
"type": "INTERNAL_ERROR",
"title": "Internal Error",
"status": 500,
"detail": "An unexpected error occurred while processing your request.",
"resolution": "Retry the request after a brief delay. If the error persists, contact support and include the correlationId from the error response for investigation.",
"docs": "https://conduit-v2.mintlify.app/errors#internal-error",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}