Discover feature requirements for a customer
Same response shape as GET /v2/onboarding/requirements, resolved as a delta against what the customer already has on file. country echoes the customer’s registered country. Returns 422 ONBOARDING_NOT_READY if the customer has no business record yet.
curl --request GET \
--url https://api.sandbox.conduit.financial/v2/customers/{customerId}/features/requirements \
--header 'x-api-key: <api-key>'import requests
url = "https://api.sandbox.conduit.financial/v2/customers/{customerId}/features/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/customers/{customerId}/features/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/customers/{customerId}/features/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/customers/{customerId}/features/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/customers/{customerId}/features/requirements")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.conduit.financial/v2/customers/{customerId}/features/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",
"format": "safeString",
"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>"
],
"scope": "root"
}
],
"allowedValues": [
"LLC",
"CORPORATION",
"PARTNERSHIP"
],
"options": [
{
"value": "Sociedad Anónima",
"label": "Sociedad Anónima",
"abbr": "S.A.",
"description": "<string>",
"category": "Corp"
}
]
}
],
"documents": [
{
"canonicalType": "BUSINESS_REGISTRATION",
"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>",
"addressTarget": "registered"
}
],
"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",
"format": "safeString",
"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>"
],
"scope": "root"
}
],
"allowedValues": [
"LLC",
"CORPORATION",
"PARTNERSHIP"
],
"options": [
{
"value": "Sociedad Anónima",
"label": "Sociedad Anónima",
"abbr": "S.A.",
"description": "<string>",
"category": "Corp"
}
]
}
],
"documents": [
{
"canonicalType": "BUSINESS_REGISTRATION",
"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": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"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": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "CUSTOMER_NOT_FOUND",
"title": "Customer Not Found",
"status": 404,
"detail": "No customer exists with the specified ID, or the customer belongs to a different organization.",
"resolution": "Verify the customer ID is correct. Use the list customers endpoint to find valid customer IDs for your organization.",
"docs": "https://conduit-v2.mintlify.app/errors#customer-not-found",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "ONBOARDING_NOT_READY",
"title": "Onboarding Not Ready",
"status": 422,
"detail": "The onboarding submission cannot be completed because one or more required fields or documents are still missing, or a submitted value is not one of the accepted options for a closed-set field (e.g. a country-specific field like `companyClassification.legalStructure`). Each blocker is reported per field in `errors[]` with a `category` and, for closed-set fields, the accepted `allowedValues`.",
"resolution": "Use the onboarding requirements endpoint to check which fields and documents are required and which values each field accepts, then submit valid values before retrying.",
"docs": "https://conduit-v2.mintlify.app/errors#onboarding-not-ready",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z",
"errors": [
{
"pointer": "/businessInfo/taxId",
"detail": "Tax ID is required",
"category": "field"
},
{
"pointer": "/documentIds",
"detail": "At least one document is required",
"category": "document"
}
]
}{
"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": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"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": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}Authorizations
Path Parameters
"cus_1A2b3C4d5E6f7G8h9I0jKl"
Query Parameters
Feature whose requirements you want to discover.
virtual_account, crypto_wallet Target currency for the feature. Narrows the requirements to the providers that can hold it. Ignored by feature types that take no asset. Omit it to resolve over every eligible provider.
AED, ARS, AUD, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, GHS, HKD, HUF, IDR, ILS, INR, JPY, KES, KRW, MXN, MYR, NGN, NOK, NZD, PEN, PHP, PLN, SAR, SEK, SGD, THB, TRY, TWD, USD, VND, ZAR 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/customers/{customerId}/features/requirements \
--header 'x-api-key: <api-key>'import requests
url = "https://api.sandbox.conduit.financial/v2/customers/{customerId}/features/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/customers/{customerId}/features/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/customers/{customerId}/features/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/customers/{customerId}/features/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/customers/{customerId}/features/requirements")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.conduit.financial/v2/customers/{customerId}/features/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",
"format": "safeString",
"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>"
],
"scope": "root"
}
],
"allowedValues": [
"LLC",
"CORPORATION",
"PARTNERSHIP"
],
"options": [
{
"value": "Sociedad Anónima",
"label": "Sociedad Anónima",
"abbr": "S.A.",
"description": "<string>",
"category": "Corp"
}
]
}
],
"documents": [
{
"canonicalType": "BUSINESS_REGISTRATION",
"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>",
"addressTarget": "registered"
}
],
"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",
"format": "safeString",
"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>"
],
"scope": "root"
}
],
"allowedValues": [
"LLC",
"CORPORATION",
"PARTNERSHIP"
],
"options": [
{
"value": "Sociedad Anónima",
"label": "Sociedad Anónima",
"abbr": "S.A.",
"description": "<string>",
"category": "Corp"
}
]
}
],
"documents": [
{
"canonicalType": "BUSINESS_REGISTRATION",
"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": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"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": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "CUSTOMER_NOT_FOUND",
"title": "Customer Not Found",
"status": 404,
"detail": "No customer exists with the specified ID, or the customer belongs to a different organization.",
"resolution": "Verify the customer ID is correct. Use the list customers endpoint to find valid customer IDs for your organization.",
"docs": "https://conduit-v2.mintlify.app/errors#customer-not-found",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "ONBOARDING_NOT_READY",
"title": "Onboarding Not Ready",
"status": 422,
"detail": "The onboarding submission cannot be completed because one or more required fields or documents are still missing, or a submitted value is not one of the accepted options for a closed-set field (e.g. a country-specific field like `companyClassification.legalStructure`). Each blocker is reported per field in `errors[]` with a `category` and, for closed-set fields, the accepted `allowedValues`.",
"resolution": "Use the onboarding requirements endpoint to check which fields and documents are required and which values each field accepts, then submit valid values before retrying.",
"docs": "https://conduit-v2.mintlify.app/errors#onboarding-not-ready",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z",
"errors": [
{
"pointer": "/businessInfo/taxId",
"detail": "Tax ID is required",
"category": "field"
},
{
"pointer": "/documentIds",
"detail": "At least one document is required",
"category": "document"
}
]
}{
"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": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"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": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}