---
title: "Save individual customer verification"
method: POST
path: "/v1/customers/{id}/verification/individual"
tags: ["Customers"]
---

# Save individual customer verification

`POST /v1/customers/{id}/verification/individual`

Save complete individual verification data for an INDIVIDUAL customer.

Key features:
- Submit comprehensive individual verification data
- Reference previously uploaded identity and supporting documents via document IDs (doc_xxx)
- Optionally submit the customer for review in the same request via `?submit=true`

Data model covers the individual verification payload:
- Personal info, address, employment, tax ID, government ID, supporting docs

Document workflow:
1. Upload documents using POST /documents (with customerId in body)
2. Confirm each document using POST /documents/:id/confirm
3. Save the complete verification data to this endpoint using document references (doc_xxx)

**Required for all files**:
1. Create a minimal customer record first using POST /customers/individuals with basic info (name, email, country code)
2. Upload documents using POST /documents (with customerId in body) and POST /documents/:id/confirm
3. Save the complete verification data to this endpoint using document references (doc_xxx)

## Path parameters

- `id` string, required

## Query parameters

- `submit` boolean

## Headers

- `X-API-Key` string

## Request body

- SubmitIndividualCustomerVerificationDto
  - `metadata` object — Additional metadata
  - `hasAgreedToTos` boolean — Set to true to indicate the customer has agreed to the Terms of Service and Privacy Policy. When true, a TOS acceptance record will be automatically created. This is a convenience for API-based integrations - alternatively, you can use the /v1/tos endpoints to create a TOS acceptance record and pass the ID in metadata.infiniteTosAcceptanceId.
  - `firstName` string — First name
  - `middleName` string — Middle name
  - `nickname` string — Nickname
  - `lastName` string — Last name
  - `transliteratedFirstName` string — Transliterated first name (required if firstName has non-Latin-1 chars)
  - `transliteratedMiddleName` string — Transliterated middle name (required if middleName has non-Latin-1 chars)
  - `transliteratedLastName` string — Transliterated last name (required if lastName has non-Latin-1 chars)
  - `email` string, email — Email address
  - `phone` string — Phone number in E.164 format
  - `dateOfBirth` string — Date of birth (YYYY-MM-DD)
  - `address` IndividualAddressInputDto
    - `addressLine1` string, required — Address line 1
    - `addressLine2` string — Address line 2 (apartment, suite, etc.)
    - `city` string, required — City
    - `state` string — State / Province
    - `postalCode` string, required — Postal code / ZIP code. May be empty for countries without a postal-code system, including the United Arab Emirates.
    - `country` string, required — Country code (ISO 3166-2)
    - `transliterated` TransliteratedAddressDto
      - `addressLine1` string — Transliterated address line 1 (Latin characters)
      - `addressLine2` string — Transliterated address line 2 (Latin characters)
      - `city` string — Transliterated city (Latin characters)
      - `state` string — Transliterated state/province (Latin characters)
  - `nationality` string — Nationality (ISO 3166-2)
  - `taxIdentificationNumber` string — Tax/identity number (e.g., SSN in US, NINO in UK). This is the number only - for physical ID documents (passport, driver's license, state ID), use the governmentId field. Validated against country-specific formats when nationality is provided. Accepts NOT_APPLICABLE when no tax ID is available, except for US nationals, who must provide a real SSN/ITIN. If the value does not match the expected format, prefix with OVERRIDE: (e.g. OVERRIDE:123-45-6789) to store it as-is. These should be used sparingly — missing or overridden tax IDs may trigger additional customer due diligence.
  - `occupation` string — Current occupation as an occupation code
  - `employmentStatus` 'EMPLOYED' | 'SELF_EMPLOYED' | 'UNEMPLOYED' | 'STUDENT' | 'RETIRED' | 'HOMEMAKER' — Employment status
  - `accountPurpose` 'PERSONAL_EXPENSES' | 'BUSINESS_OPERATIONS' | 'INVESTMENT' | 'SAVINGS' | 'OTHER' — Purpose of account
  - `requestedCapabilities` string[] — Capabilities requested by the customer
  - `accountPurposeExplanation` string — Account purpose explanation (required if purpose is other)
  - `sourceOfFunds` 'COMPANY_FUNDS' | 'ECOMMERCE_RESELLER' | 'GAMBLING_PROCEEDS' | 'GIFTS' | 'GOVERNMENT_BENEFITS' | 'INHERITANCE' | 'INVESTMENTS_LOANS' | 'PENSION_RETIREMENT' | 'SALARY' | 'SALE_OF_ASSETS_REAL_ESTATE' | 'SAVINGS' | 'SOMEONE_ELSES_FUNDS' — Source of funds
  - `sourceOfFundsDescription` string — Source of funds description
  - `expectedMonthlyPaymentsUsd` number — Expected monthly payment volume in USD
  - `actingAsIntermediary` boolean — Acting as intermediary for others
  - `governmentId` GovernmentIdDto
    - `type` 'PASSPORT' | 'DRIVERS_LICENSE' | 'NATIONAL_ID' | 'MILITARY_ID' | 'PERMANENT_RESIDENCY_ID' | 'STATE_OR_PROVINCIAL_ID', required — Type of government-issued ID
    - `countryCode` string, required — Country of issuance (ISO 3166-2)
    - `number` string, required — ID number
    - `issuanceDate` string, required — Issuance date (YYYY-MM-DD)
    - `expirationDate` string, nullable — Expiration date (YYYY-MM-DD), or null for non-expiring IDs
    - `frontImage` string, required — Front image document ID reference (`doc_xxx`). Upload the file with `POST /documents`, confirm it, then pass the resulting document ID here.
    - `backImage` string — Back image document ID reference (`doc_xxx`). Required for non-passport IDs.
    - `selfie` string — Selfie document ID reference (`doc_xxx`). Required for individual customer verification. Upload the file with `POST /documents`, confirm it, then pass the resulting document ID here.
  - `proofOfAddress` DocumentUploadDto
    - `requirementId` string — Stable identifier for the custom document requirement this upload satisfies
    - `type` 'IDENTITY' | 'PROOF_OF_ADDRESS' | 'INVOICE' | 'CONTRACT' | 'BANK_STATEMENT' | 'BUSINESS_LICENSE' | 'ARTICLES_OF_INCORPORATION' | 'ARTICLES_OF_ASSOCIATION' | 'CERTIFICATE_OF_FORMATION' | 'CERTIFICATE_OF_INCUMBENCY' | 'OPERATING_AGREEMENT' | 'PARTNERSHIP_AGREEMENT' | 'OWNERSHIP_STRUCTURE' | 'SHAREHOLDER_AGREEMENT' | 'STOCK_CERTIFICATE' | 'TAX_RETURN' | 'FINANCIAL_STATEMENT' | 'MARKETING_MATERIALS' | 'DOMAIN_OWNERSHIP_PROOF' | 'BUSINESS_PLAN' | 'BILL_OF_LADING' | 'AML_POLICY' | 'AML_COMFORT_LETTER' | 'FUNDS_FLOW_DIAGRAM' | 'GOOD_STANDING_CERTIFICATE' | 'TIN_VERIFICATION' | 'MSB_LICENSE' | 'DIRECTORS_REGISTRY' | 'OWNERSHIP_CHART' | 'PROOF_OF_SIGNATORY_AUTHORITY' | 'PROOF_OF_SOURCE_OF_FUNDS' | 'PROOF_OF_ENTITY_NAME_CHANGE' | 'REMOTE_ADDRESS_ATTESTATION' | 'E_SIGNATURE_CERTIFICATE' | 'COMPLIANCE_NOTES' | 'PROOF_OF_SOURCE_OF_WEALTH' | 'TAX_EXEMPT_ENTITY_CONFIRMATION' | 'OTHER' — General document category. Optional for context-specific uploads where the field already implies the document type.
    - `subtype` 'GOVERNMENT_ID_FRONT' | 'GOVERNMENT_ID_BACK' | 'SELFIE' | 'UTILITY_BILL' | 'LEASE_AGREEMENT' — Specific document type. Optional for generic uploads when the subtype is not material to processing.
    - `description` string — Description of the document
    - `remarks` string — Free-form remarks or notes about the document
    - `file` string, required — Document ID reference (`doc_xxx`) created via the document upload flow. Upload the file with `POST /documents`, confirm it, then pass the resulting document ID here.
  - `supportingDocuments` DocumentUploadDto[] — Supporting documents
    - `requirementId` string — Stable identifier for the custom document requirement this upload satisfies
    - `type` 'IDENTITY' | 'PROOF_OF_ADDRESS' | 'INVOICE' | 'CONTRACT' | 'BANK_STATEMENT' | 'BUSINESS_LICENSE' | 'ARTICLES_OF_INCORPORATION' | 'ARTICLES_OF_ASSOCIATION' | 'CERTIFICATE_OF_FORMATION' | 'CERTIFICATE_OF_INCUMBENCY' | 'OPERATING_AGREEMENT' | 'PARTNERSHIP_AGREEMENT' | 'OWNERSHIP_STRUCTURE' | 'SHAREHOLDER_AGREEMENT' | 'STOCK_CERTIFICATE' | 'TAX_RETURN' | 'FINANCIAL_STATEMENT' | 'MARKETING_MATERIALS' | 'DOMAIN_OWNERSHIP_PROOF' | 'BUSINESS_PLAN' | 'BILL_OF_LADING' | 'AML_POLICY' | 'AML_COMFORT_LETTER' | 'FUNDS_FLOW_DIAGRAM' | 'GOOD_STANDING_CERTIFICATE' | 'TIN_VERIFICATION' | 'MSB_LICENSE' | 'DIRECTORS_REGISTRY' | 'OWNERSHIP_CHART' | 'PROOF_OF_SIGNATORY_AUTHORITY' | 'PROOF_OF_SOURCE_OF_FUNDS' | 'PROOF_OF_ENTITY_NAME_CHANGE' | 'REMOTE_ADDRESS_ATTESTATION' | 'E_SIGNATURE_CERTIFICATE' | 'COMPLIANCE_NOTES' | 'PROOF_OF_SOURCE_OF_WEALTH' | 'TAX_EXEMPT_ENTITY_CONFIRMATION' | 'OTHER' — General document category. Optional for context-specific uploads where the field already implies the document type.
    - `subtype` 'GOVERNMENT_ID_FRONT' | 'GOVERNMENT_ID_BACK' | 'SELFIE' | 'UTILITY_BILL' | 'LEASE_AGREEMENT' — Specific document type. Optional for generic uploads when the subtype is not material to processing.
    - `description` string — Description of the document
    - `remarks` string — Free-form remarks or notes about the document
    - `file` string, required — Document ID reference (`doc_xxx`) created via the document upload flow. Upload the file with `POST /documents`, confirm it, then pass the resulting document ID here.
  - `proofOfSourceOfFunds` DocumentUploadDto[] — Proof of source of funds documents for individual EDD flows.
    - `requirementId` string — Stable identifier for the custom document requirement this upload satisfies
    - `type` 'IDENTITY' | 'PROOF_OF_ADDRESS' | 'INVOICE' | 'CONTRACT' | 'BANK_STATEMENT' | 'BUSINESS_LICENSE' | 'ARTICLES_OF_INCORPORATION' | 'ARTICLES_OF_ASSOCIATION' | 'CERTIFICATE_OF_FORMATION' | 'CERTIFICATE_OF_INCUMBENCY' | 'OPERATING_AGREEMENT' | 'PARTNERSHIP_AGREEMENT' | 'OWNERSHIP_STRUCTURE' | 'SHAREHOLDER_AGREEMENT' | 'STOCK_CERTIFICATE' | 'TAX_RETURN' | 'FINANCIAL_STATEMENT' | 'MARKETING_MATERIALS' | 'DOMAIN_OWNERSHIP_PROOF' | 'BUSINESS_PLAN' | 'BILL_OF_LADING' | 'AML_POLICY' | 'AML_COMFORT_LETTER' | 'FUNDS_FLOW_DIAGRAM' | 'GOOD_STANDING_CERTIFICATE' | 'TIN_VERIFICATION' | 'MSB_LICENSE' | 'DIRECTORS_REGISTRY' | 'OWNERSHIP_CHART' | 'PROOF_OF_SIGNATORY_AUTHORITY' | 'PROOF_OF_SOURCE_OF_FUNDS' | 'PROOF_OF_ENTITY_NAME_CHANGE' | 'REMOTE_ADDRESS_ATTESTATION' | 'E_SIGNATURE_CERTIFICATE' | 'COMPLIANCE_NOTES' | 'PROOF_OF_SOURCE_OF_WEALTH' | 'TAX_EXEMPT_ENTITY_CONFIRMATION' | 'OTHER' — General document category. Optional for context-specific uploads where the field already implies the document type.
    - `subtype` 'GOVERNMENT_ID_FRONT' | 'GOVERNMENT_ID_BACK' | 'SELFIE' | 'UTILITY_BILL' | 'LEASE_AGREEMENT' — Specific document type. Optional for generic uploads when the subtype is not material to processing.
    - `description` string — Description of the document
    - `remarks` string — Free-form remarks or notes about the document
    - `file` string, required — Document ID reference (`doc_xxx`) created via the document upload flow. Upload the file with `POST /documents`, confirm it, then pass the resulting document ID here.
  - `signedAgreementId` string — Signed terms of service agreement ID. Use POST /v1/tos/generate to create a TOS agreement and obtain the ID. See Terms of Service documentation for details.
  - `ipAddress` string — Client IP address for fraud detection
  - `providerSpecificData` object

## Response `201`

Verification submitted successfully

- SubmitCustomerVerificationResponseDto
  - `customerId` string, required — Customer ID
  - `status` string, required — Customer status after saving verification data
  - `submittedAt` string — Submission timestamp when the customer has actually been submitted for review.
  - `documentIds` string[], required — Document IDs uploaded
  - `missingRequirements` MissingComplianceRequirementDto[] — Merged list of missing fields and documents for full verification (data is saved but customer remains in DRAFT)
    - `requirementType` 'FIELD' | 'DOCUMENT', required — Requirement category
    - `key` string, required — Stable requirement key or field path
    - `displayName` string, required — Human-readable requirement label
    - `entityId` string — Associated entity ID when the missing requirement belongs to a beneficial owner or control person.
    - `entityDisplayName` string — Human-readable associated entity name when the missing requirement belongs to a beneficial owner or control person.
  - `reviewWarnings` string[] — Document validation warnings that did not block submission and should be manually reviewed.

## Other responses

- `400` — Invalid verification data or customer type mismatch
- `401` — Unauthorized - Invalid or missing authentication credentials

---

[API](https://skmtc.dev/infinite/apis/infinite-api.md) · [All operations](https://skmtc.dev/infinite/apis/infinite-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/infinite/infinite-api/revisions/bca54100a637/schema)
