> ## Documentation Index
> Fetch the complete documentation index at: https://docs.infinite.dev/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> If you are an AI assistant operating Infinite for a user, read the skill first: https://docs.infinite.dev/agent-skill.md (setup per host, tool reference, rules for moving money, journeys).
> When operating Infinite for a user, use the MCP server. Sign in at https://bot.api.infinite.dev/mcp (production, acts as the user) or send `Authorization: Bearer <key>` to https://bot.api.infinite.dev/mcp/sse. Prefer its tools over raw HTTP; use REST only for steps no tool covers, and check `get_endpoint_schema` before guessing a request shape.
> Net-new Infinite Connect (org_connect) is operator-assisted: do not grant end users shared org_connect Auth Kit membership or the shared platform org API key — those credentials are org-wide on /v1. BYO org keys onboard under that customer's org id. Operator sessions should show org_connect in get_organization_info.
> The key decides the tools. Every organization key (`sk_sandbox_…` / `sk_live_…`) gets docs, onboarding, `get_account_balance`, and request logs for your own organization. BYO organizations add payees an agent will pay with `create_payee` (payable once ACTIVE). Platform Connect sessions instead get bound-customer payment lookups (`get_quote`, `get_transfer`, `list_transfers`, `list_account_balances`), payee drafts (`create_payee_draft` / `get_payee_draft`; screening only, never payable), and transfer drafts that wait for Infinite approval (`create_transfer_draft` / `get_transfer_draft`; never POST /v1/transfers). Where offered, platform `create_transfer` files a real transfer that Infinite holds in review before funding; it cannot be submitted from DRAFT.
> An agent key (`sk_sandbox_agent_…` / `sk_live_agent_…`) moves money within that agent's limits: `create_transfer` → `submit_transfer` → `wait_for_transfer`.
> On sandbox organization-key sessions, `sandbox_approve_customer` (makes the capabilities you pass READY, and related ones may turn READY too; `request_capabilities` is not needed), `sandbox_fund_account`, and `sandbox_complete_transfer` stand in for verification, funding, and settlement, so a whole flow runs from MCP. BYO keys can pass `customerId` on each call without binding; platform sessions must bind a customer first (`create_business_customer` auto-binds, or send `X-Infinite-On-Behalf-Of`).
> When searching documentation without a key, use the docs MCP at https://docs.infinite.dev/mcp.
> Start in sandbox (https://sandbox.api.infinite.dev). Do not use production unless the user explicitly asks.
> Confirm amount, currency, and payee with the user before any payment is submitted. Pass the invoice number as `reference` on `create_transfer`; the summary says what the payee will see.
> REST amounts are integer minor units (`"4000"` = 40.00 USD). MCP payment tools take exact decimal strings (`"40.00"`). Never mix them.
> Agent denials return `403 { denial: { code, message, window, limit, used, remaining, attemptedAmount, currency }, hint }` with decimal amounts; per-transfer denials omit `used` and `remaining`. Report them to the user; do not work around them.

# Save individual customer verification

> 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)


## Required at submit

Every field on this endpoint is optional so you can save progress. Passing `submit=true`, or calling `POST /customers/{id}/submit`, requires the base individual package: first and last name, email, phone, date of birth, tax identification number, residential address, government ID, and a selfie. Proof of address is required when the customer does not reside in the US. Terms acceptance is also required.

The authoritative checklist for a customer is [GET /customers/{id}/compliance](/api-reference/customers/get-customer-compliance-requirements). Enhanced diligence is not part of that base gate. When it applies, it is collected after submit.


## OpenAPI

````yaml post /v1/customers/{id}/verification/individual
openapi: 3.0.0
info:
  title: Infinite API
  description: API for Infinite
  version: '1.0'
  contact: {}
servers:
  - url: https://sandbox.api.infinite.dev
    description: Sandbox
  - url: https://api.infinite.dev
    description: Production
security: []
tags:
  - name: Accounts
    description: Virtual and external account management
  - name: Customers
    description: Customer identity management
  - name: Documents
    description: Document upload and management
  - name: Fixed Routes
    description: Fixed route management
  - name: External Bank Accounts
    description: External bank account management
  - name: External Wallets
    description: External wallet management
  - name: Infinite Wallets
    description: Infinite Wallet management
  - name: Organizations
    description: Organization management
  - name: Quotes
    description: Quote creation and management
  - name: Transfers
    description: Money movement and transaction tracking
  - name: Verification
    description: Identity verification workflows
  - name: Terms of Service
    description: Terms of Service acceptance
  - name: Health
    description: System health and monitoring
  - name: Sandbox
    description: Sandbox utilities
paths:
  /v1/customers/{id}/verification/individual:
    post:
      tags:
        - Customers
      summary: Save individual customer verification
      description: >
        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)
      operationId: CustomersController_submitIndividualVerification_v1
      parameters:
        - name: X-API-Key
          in: header
          description: API key
          required: false
          schema:
            type: string
        - name: id
          required: true
          in: path
          description: Customer ID
          schema:
            type: string
            example: cus_abc123
        - name: submit
          required: false
          in: query
          description: >-
            If true, submit the customer for review after saving verification
            data.
          schema:
            type: boolean
            example: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitIndividualCustomerVerificationDto'
      responses:
        '201':
          description: Verification submitted successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubmitCustomerVerificationResponseDto'
        '400':
          description: Invalid verification data or customer type mismatch
        '401':
          description: Unauthorized - Invalid or missing authentication credentials
      security:
        - bearer: []
      x-codeSamples:
        - lang: bash
          label: CLI
          source: >-
            # 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/customers/cus_abc123/verification/individual \
              --body '<request-json>'
        - lang: text
          label: MCP
          source: >-
            Save individual customer verification (cus_abc123).


            # Infinite MCP is read-only for this endpoint — use a dedicated MCP
            tool when one exists, otherwise run the CLI tab.
components:
  schemas:
    SubmitIndividualCustomerVerificationDto:
      type: object
      properties:
        metadata:
          type: object
          description: Additional metadata
          example:
            source: mobile_app
            referrer: partner_xyz
          additionalProperties: true
        hasAgreedToTos:
          type: boolean
          description: >-
            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.
          example: true
        firstName:
          type: string
          description: First name
          example: John
        middleName:
          type: string
          description: Middle name
          example: Michael
        nickname:
          type: string
          description: Nickname
          example: Johnny
        lastName:
          type: string
          description: Last name
          example: Doe
        transliteratedFirstName:
          type: string
          description: >-
            Transliterated first name (required if firstName has non-Latin-1
            chars)
          example: Zhang
        transliteratedMiddleName:
          type: string
          description: >-
            Transliterated middle name (required if middleName has non-Latin-1
            chars)
        transliteratedLastName:
          type: string
          description: >-
            Transliterated last name (required if lastName has non-Latin-1
            chars)
          example: San
        email:
          type: string
          description: Email address
          example: john.doe@example.com
        phone:
          type: string
          description: Phone number in E.164 format
          example: '+14155551234'
        dateOfBirth:
          type: string
          description: Date of birth (YYYY-MM-DD)
          example: '1990-01-15'
        address:
          description: >-
            Current residential address. Use the nested transliterated field for
            Latin character versions of non-Latin addresses.
          allOf:
            - $ref: '#/components/schemas/IndividualAddressInputDto'
        nationality:
          type: string
          description: Nationality (ISO 3166-2)
          example: US
        taxResidenceCountry:
          type: string
          description: >-
            Optional. Country of tax residence (ISO 3166-1 alpha-2). Provide
            only when it differs from nationality; tax ID format validation
            falls back to nationality when omitted.
          example: GB
        taxIdentificationNumber:
          type: string
          description: >-
            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.
          example: 123-45-6789
        occupation:
          type: string
          description: Current occupation as an occupation code
          example: '151252'
        employmentStatus:
          type: string
          description: Employment status
          enum:
            - EMPLOYED
            - SELF_EMPLOYED
            - UNEMPLOYED
            - STUDENT
            - RETIRED
            - HOMEMAKER
        accountPurpose:
          type: string
          description: Purpose of account
          enum:
            - PERSONAL_EXPENSES
            - BUSINESS_OPERATIONS
            - INVESTMENT
            - SAVINGS
            - OTHER
        requestedCapabilities:
          type: array
          description: Capabilities requested by the customer
          items:
            type: string
            enum:
              - USD_ACH_PAYIN
              - USD_ACH_PAYOUT
              - USD_WIRE_PAYIN
              - USD_WIRE_PAYOUT
              - USD_BALANCE
              - USD_YIELD
              - SWIFT_PAYIN
              - SWIFT_PAYOUT
              - STABLECOIN_PAYIN
              - STABLECOIN_PAYOUT
              - STABLECOIN_SWAPS
              - AED_FX_PAYOUT
              - AUD_FX_PAYOUT
              - BHD_FX_PAYOUT
              - BOB_FX_PAYOUT
              - BRL_FX_PAYOUT
              - CLP_FX_PAYOUT
              - CNY_FX_PAYOUT
              - COP_FX_PAYOUT
              - DOP_FX_PAYOUT
              - EGP_FX_PAYOUT
              - EUR_FX_PAYOUT
              - GBP_FX_PAYOUT
              - HKD_FX_PAYOUT
              - IDR_FX_PAYOUT
              - INR_FX_PAYOUT
              - JPY_FX_PAYOUT
              - KRW_FX_PAYOUT
              - KWD_FX_PAYOUT
              - MXN_FX_PAYOUT
              - MYR_FX_PAYOUT
              - PEN_FX_PAYOUT
              - PHP_FX_PAYOUT
              - PYG_FX_PAYOUT
              - QAR_FX_PAYOUT
              - SAR_FX_PAYOUT
              - SGD_FX_PAYOUT
              - THB_FX_PAYOUT
              - TRY_FX_PAYOUT
              - TWD_FX_PAYOUT
              - USD_FX_PAYOUT
              - VND_FX_PAYOUT
        accountPurposeExplanation:
          type: string
          description: Account purpose explanation (required if purpose is other)
        sourceOfFunds:
          type: string
          description: Source of funds
          enum:
            - COMPANY_FUNDS
            - ECOMMERCE_RESELLER
            - GAMBLING_PROCEEDS
            - GIFTS
            - GOVERNMENT_BENEFITS
            - INHERITANCE
            - INVESTMENTS_LOANS
            - PENSION_RETIREMENT
            - SALARY
            - SALE_OF_ASSETS_REAL_ESTATE
            - SAVINGS
            - SOMEONE_ELSES_FUNDS
        sourceOfFundsDescription:
          type: string
          description: Source of funds description
        expectedMonthlyPaymentsUsd:
          type: number
          description: Expected monthly payment volume in USD
          example: 5000
        actingAsIntermediary:
          type: boolean
          description: Acting as intermediary for others
          example: false
        governmentId:
          description: >-
            Physical government-issued ID document (e.g., passport, driver's
            license, state ID). Includes document type, ID number, and
            front/back images. For tax/identity numbers like SSN, use
            taxIdentificationNumber instead.
          allOf:
            - $ref: '#/components/schemas/GovernmentIdDto'
        proofOfAddress:
          description: >-
            Proof of address document. Required for individual customers
            residing outside the US. Acceptable documents: utility bill, bank
            statement, lease agreement, or government letter dated within the
            last 90 days.
          allOf:
            - $ref: '#/components/schemas/DocumentUploadDto'
        supportingDocuments:
          description: Supporting documents
          type: array
          items:
            $ref: '#/components/schemas/DocumentUploadDto'
        proofOfSourceOfFunds:
          description: Proof of source of funds documents for individual EDD flows.
          type: array
          items:
            $ref: '#/components/schemas/DocumentUploadDto'
        signedAgreementId:
          type: string
          description: >-
            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.
          example: tos_abc123
        ipAddress:
          type: string
          description: Client IP address for fraud detection
          example: 192.168.1.1
    SubmitCustomerVerificationResponseDto:
      type: object
      properties:
        customerId:
          type: string
          description: Customer ID
          example: cus_abc123
        status:
          type: string
          description: Customer status after saving verification data
          example: DRAFT
        submittedAt:
          type: string
          description: >-
            Submission timestamp when the customer has actually been submitted
            for review.
          example: '2026-09-15T10:30:00Z'
        documentIds:
          description: Document IDs uploaded
          example:
            - doc_abc123
            - doc_xyz789
          type: array
          items:
            type: string
        missingRequirements:
          description: >-
            Merged list of missing fields and documents for full verification
            (data is saved but customer remains in DRAFT)
          example:
            - requirementType: FIELD
              key: metadata.infiniteTosAcceptanceId
              displayName: Infinite Terms of Service & Privacy Policy
            - requirementType: DOCUMENT
              key: identity.government_id_front
              displayName: Government ID
          type: array
          items:
            $ref: '#/components/schemas/MissingComplianceRequirementDto'
        reviewWarnings:
          description: >-
            Document validation warnings that did not block submission and
            should be manually reviewed.
          example:
            - >-
              businessData.businessAddressProof[0] failed AI proof-of-address
              validation (confidence 0.62): The address appears similar but the
              issue date is unclear.
          type: array
          items:
            type: string
      required:
        - customerId
        - status
        - documentIds
    IndividualAddressInputDto:
      type: object
      properties:
        addressLine1:
          type: string
          description: Address line 1
          example: 123 Main Street
          maxLength: 1024
        addressLine2:
          type: string
          description: Address line 2 (apartment, suite, etc.)
          example: Apt 4B
          maxLength: 1024
        city:
          type: string
          description: City
          example: San Francisco
          maxLength: 256
        state:
          type: string
          description: State / Province
          example: CA
          maxLength: 256
        postalCode:
          type: string
          description: >-
            Postal code / ZIP code. May be empty for countries without a
            postal-code system, including the United Arab Emirates.
          example: '94102'
          maxLength: 50
        country:
          type: string
          description: Country code (ISO 3166-2)
          example: US
          minLength: 2
          maxLength: 2
        transliterated:
          description: >-
            Transliterated address fields (Latin characters) for non-Latin
            addresses. Required when address contains non-Latin characters
            (Chinese, Arabic, Cyrillic, etc.).
          allOf:
            - $ref: '#/components/schemas/TransliteratedAddressDto'
      required:
        - addressLine1
        - city
        - postalCode
        - country
    GovernmentIdDto:
      type: object
      properties:
        type:
          type: string
          description: Type of government-issued ID
          enum:
            - PASSPORT
            - DRIVERS_LICENSE
            - NATIONAL_ID
            - MILITARY_ID
            - PERMANENT_RESIDENCY_ID
            - STATE_OR_PROVINCIAL_ID
          example: PASSPORT
        countryCode:
          type: string
          description: Country of issuance (ISO 3166-2)
          example: US
        number:
          type: string
          description: ID number
          example: A12345678
        issuanceDate:
          type: string
          description: Issuance date (YYYY-MM-DD)
          example: '2020-01-15'
        expirationDate:
          type: string
          description: Expiration date (YYYY-MM-DD), or null for non-expiring IDs
          example: '2030-01-15'
          nullable: true
        frontImage:
          type: string
          description: >-
            Front image document ID reference (`doc_xxx`). Upload the file with
            `POST /documents`, confirm it, then pass the resulting document ID
            here.
          example: doc_abc123
        backImage:
          type: string
          description: >-
            Back image document ID reference (`doc_xxx`). Required for
            non-passport IDs.
        selfie:
          type: string
          description: >-
            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.
      required:
        - type
        - countryCode
        - number
        - issuanceDate
        - frontImage
    DocumentUploadDto:
      type: object
      properties:
        requirementId:
          type: string
          description: >-
            Stable identifier for the custom document requirement this upload
            satisfies
        type:
          type: string
          description: >-
            General document category. Optional for context-specific uploads
            where the field already implies the document type.
          enum:
            - IDENTITY
            - LIVENESS_CHECK
            - 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
          example: PROOF_OF_ADDRESS
        subtype:
          type: string
          description: >-
            Specific document type. Optional for generic uploads when the
            subtype is not material to processing.
          enum:
            - GOVERNMENT_ID_FRONT
            - GOVERNMENT_ID_BACK
            - SELFIE
            - UTILITY_BILL
            - LEASE_AGREEMENT
          example: UTILITY_BILL
        description:
          type: string
          description: Description of the document
          example: Passport issued in 2020
        remarks:
          type: string
          description: Free-form remarks or notes about the document
          example: Uploaded to support proof of business address
          maxLength: 1000
        file:
          type: string
          description: >-
            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.
          example: doc_abc123
      required:
        - file
    MissingComplianceRequirementDto:
      type: object
      properties:
        requirementType:
          type: string
          description: Requirement category
          enum:
            - FIELD
            - DOCUMENT
          example: FIELD
        key:
          type: string
          description: Stable requirement key or field path
          example: businessData.legalName
        displayName:
          type: string
          description: Human-readable requirement label
          example: Legal Name
        entityId:
          type: string
          description: >-
            Associated entity ID when the missing requirement belongs to a
            beneficial owner or control person.
          example: asp_abc123
        entityDisplayName:
          type: string
          description: >-
            Human-readable associated entity name when the missing requirement
            belongs to a beneficial owner or control person.
          example: Jane Owner
      required:
        - requirementType
        - key
        - displayName
    TransliteratedAddressDto:
      type: object
      properties:
        addressLine1:
          type: string
          description: Transliterated address line 1 (Latin characters)
          example: 123 Main Street
          maxLength: 1024
        addressLine2:
          type: string
          description: Transliterated address line 2 (Latin characters)
          example: Apt 4B
          maxLength: 1024
        city:
          type: string
          description: Transliterated city (Latin characters)
          example: Beijing
          maxLength: 256
        state:
          type: string
          description: Transliterated state/province (Latin characters)
          example: Hebei
          maxLength: 256
  securitySchemes:
    bearer:
      scheme: bearer
      bearerFormat: API Key
      type: http
      description: API Key in Bearer format (e.g., Bearer sk_test_...)

````

## Related topics

- [Save business customer verification](/api-reference/customers/save-business-customer-verification.md)
- [Verification](/concepts/verification.md)
- [Customers](/concepts/customers.md)
- [Update an associated individual](/api-reference/customers/update-an-associated-individual.md)
- [Generate verification link for associated entity](/api-reference/customers/generate-verification-link-for-associated-entity.md)
