POST /api/customers/{id}/identifications/v2 validates data-carrying submissions (Business, Person, and Token) synchronously. Under X-API-Version: 2026-08-01 or later, a failed submission returns 400 with an array of structured error objects instead of the plain string returned by earlier versions:
string
required
Machine-readable identifier. One of the fixed set of values documented below. Safe to match on in code; it does not change across submissions the way
message does.string
required
Human-readable description of this specific occurrence of the error, for example naming the exact field or beneficiary involved. Useful for logs and support tickets, but don’t pattern-match on it: it can be reworded without notice. Match on
code instead.string
required
Link back to this page, anchored to the specific
code (https://docs.iron.xyz/errors#<code>).integer
Zero-based index into
company_data.beneficiaries identifying which beneficiary the error originated from. Present only on Business submissions, and only when the error is scoped to a specific beneficiary rather than the submission as a whole.Callers on an earlier or unversioned
X-API-Version keep receiving today’s plain error string on 400, unchanged. The structured array is opt-in via the version header. See API Versions.invalid_request
A catch-all for straightforward, client-preventable problems: a required field was left empty, a value doesn’t match the expected format (email, phone, country code, date), a file exceeds its size limit, or too many documents or beneficiaries were submitted. Checkmessage for the specific field and reason. Add client-side validation for the same rule so your integration catches it before it reaches the API.
selfie_required
The submission is missing a selfie where one is required. EveryDirector beneficiary on a Business submission needs one, and every Person submission needs one, in any country. Capture and submit a selfie along with selfie_collected_at.
selfie_expired
A selfie was provided, but it’s too old to accept: forPerson submissions, older than 6 months. Capture a fresh selfie and resubmit.
tin_required
A tax identification number is missing where one is required. On aBusiness submission, this applies to any beneficiary with the Director or UltimateBeneficialOwner role, in any country. On a Person submission, it applies when the identity document’s issuing country (identity.identity_country_code) is US, regardless of the person’s residential address. Provide tax_identification_number, and tax_residence_country if the identity document’s country isn’t already US.
identity_document_rejected
The identity document type provided isn’t accepted for this submission.ResidencePermit is never accepted. Beneficiaries of US companies (except sole proprietorships) must use Passport or a US-issued DriverLicense, no other type. Resubmit with an accepted document type.
identity_document_images_identical
The front and back images submitted for an identity document are byte-identical, which almost always means the same image was uploaded twice by mistake. Capture and submit distinct front and back images.structure_invalid
The beneficiary or ownership structure on aBusiness submission violates a structural rule, for example: a sole proprietorship submitted with more than one beneficiary, or one that doesn’t own 100%; a nested business beneficiary with no Director; or combined ownership percentages exceeding 100%. Check message for the specific rule and adjust the company_data.beneficiaries array.
attestation_invalid
The beneficial-ownership attestation is missing or invalid on a USBusiness submission. US companies, other than sole proprietorships, need exactly one root-level beneficiary with the Director role marked attesting_party: true and a past attested_at timestamp, certifying the submitted ownership information. Check message for the specific problem: a missing attesting party, more than one, or one without the Director role or not at the root.
cdd_certification_invalid
Iron generates a beneficial-ownership certification document for USBusiness submissions automatically, and the submitted data can’t produce it. Common causes: no beneficiary owns 25% or more, a beneficiary is missing a required identity or tax number, or the submitted text can’t be rendered into the document. Check message for the specific gap and provide the missing data.
business_description_insufficient
The company is classified under a “Miscellaneous”industry_type, which requires a more detailed business_model_description than other industries: at least two sentences. Expand the description and resubmit.
funds_flow_disclosure_required
The questionnaire indicates the company sends funds on behalf of customers (sends_funds_on_customer_behalf: true), which requires supporting disclosure that wasn’t fully provided. Include a description, a flow-of-funds diagram, and a source-of-funds document together.
license_details_required
The questionnaire indicates the company holds licenses or registrations (has_licenses_or_registrations: true), which requires details that weren’t provided. Provide license_details.
document_requirement_not_met
A required company document group is missing on a USBusiness submission. Unlike non-US businesses, which can be accepted with documents still missing and given a resume URL to complete later, a US submission is rejected outright when a required group is absent. Check message for which document category is missing, then resubmit with the complete document set. See Company Documents.
proof_of_address_required_for_edd
APerson submission included edd_questionnaire without a proof-of-address document. Enhanced Due Diligence requires one. Include a ProofOfAddress document alongside the EDD questionnaire.
outsourcing_agreement_not_signed
Your outsourcing agreement with Iron isn’t signed yet, so data-carrying identifications can’t be processed via the API for this customer type. This is an account configuration issue, not a data problem: contact your Iron partnership representative to get it signed.duplicate_upload_blocked
The verification provider temporarily blocked a duplicate upload of file content that’s byte-identical to a very recent upload. This is transient: retry the same submission and it succeeds shortly after.provider_rejected_document
The verification provider rejected a submitted document, for example because it was corrupted, too blurry to read, or the wrong type for the requested document category. Checkmessage for the provider’s specific rejection reason and resubmit with a corrected file.
reuse_rejected
AToken submission tried to reuse an existing verified identity via a share token, and the referenced identity isn’t eligible for reuse: it isn’t approved, its email doesn’t match, or it fails an age restriction. Check message for the specific reason. The customer will most likely need to complete a fresh identification instead of reusing this one.