> ## 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.

# Verification

Infinite provides built-in identity verification (KYC/KYB) and compliance services integrated directly into the customer onboarding flow.

## Overview

The verification system handles:

* **Individual KYC** -- Identity verification for personal customers
* **Business KYB** -- Business verification and beneficial ownership disclosure
* **Document Collection** -- Secure upload and processing of identity documents
* **Risk Assessment** -- Automated risk scoring and compliance checks
* **Ongoing Monitoring** -- Continuous compliance monitoring and alerts

## Verification Types

### Individual KYC

For personal customers, individual KYC verification includes:

* **Identity Verification** -- Government-issued ID validation
* **Address Verification** -- Proof of address documents
* **Sanctions Screening** -- Real-time sanctions list checking
* **PEP Screening** -- Politically Exposed Person identification
* **Enhanced Due Diligence** -- Additional checks for high-risk customers

### Business KYB

For business customers, KYB verification covers:

* **Company Registration** -- Business registration document verification
* **Beneficial Ownership** -- Ultimate beneficial owner (UBO) identification
* **Director Verification** -- Company director identity checks
* **Corporate Structure** -- Ownership structure analysis
* **Regulatory Compliance** -- Industry-specific compliance requirements

#### Ownership structure

Business verification requires at least one qualifying individual before submission:

* **Beneficial owner** -- an individual whose *effective* ownership of the business is 25% or more. Effective ownership is computed through intermediate businesses: a person holding 50% of a company that owns 60% of your customer has 30% effective ownership.
* **Control person** -- an individual with `hasControl: true` (CEO, managing member, or equivalent). A control person satisfies the requirement even when no individual reaches 25% effective ownership.

If neither is present, submission is rejected with `At least one beneficial owner or control person must be identified.`

For indirect ownership, create the intermediate business with `POST /customers/:id/associated_businesses`, then create each person with `parentEntityId` set to that business ID. Include `ownershipPercentage` as the person's share of the *parent*, not of your customer. If the share is unknown, omit `ownershipPercentage` and set `hasOwnership: true` to designate them as an owner.

Nonprofits, trusts, and cooperatives are exempt from beneficial-owner and control-person submission requirements.

## Verification Workflow

There are two ways to verify customers:

### Option 1: Hosted Verification Link

Generate a verification link and send it to your customer. They complete verification through Infinite's hosted UI.

<CodeGroup>
  ```python Python theme={null}
  import requests

  response = requests.post(
      'https://api.infinite.dev/v1/verification/initiate',
      headers={
          'Authorization': 'Bearer sk_live_...',
          'Content-Type': 'application/json',
      },
      json={
          'name': 'Jane Smith',
          'email': 'jane@example.com',
          'type': 'INDIVIDUAL',
          'countryCode': 'US',
          'customerId': 'cus_abc123',
      },
  )
  ```

  ```typescript TypeScript theme={null}
  const response = await fetch(
    'https://api.infinite.dev/v1/verification/initiate',
    {
      method: 'POST',
      headers: {
        Authorization: 'Bearer sk_live_...',
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        name: 'Jane Smith',
        email: 'jane@example.com',
        type: 'INDIVIDUAL',
        countryCode: 'US',
        customerId: 'cus_abc123',
      }),
    },
  );
  ```

  ```bash CLI theme={null}
  export INFINITE_API_KEY=sk_live_...
  infinite api POST /v1/verification/initiate --body '{
    "name": "Jane Smith",
    "email": "jane@example.com",
    "type": "INDIVIDUAL",
    "countryCode": "US",
    "customerId": "cus_abc123"
  }'
  ```

  ```text MCP theme={null}
  Start identity verification for cus_abc123 — Jane Smith, jane@example.com, an individual in the US.

  # Infinite MCP is read-only today — run the CLI tab to execute.
  ```

  ```bash cURL theme={null}
  curl -X POST "https://api.infinite.dev/v1/verification/initiate" \
    -H "Authorization: Bearer sk_live_..." \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Jane Smith",
      "email": "jane@example.com",
      "type": "INDIVIDUAL",
      "countryCode": "US",
      "customerId": "cus_abc123"
    }'
  ```
</CodeGroup>

This returns a verification session with a link the customer can use to complete their KYC/KYB.

### Option 2: API-Driven Verification

Collect customer details via your own UI and submit them through the [customer API](/concepts/customers):

1. Create a customer via `POST /customers/individuals` or `POST /customers/businesses`
2. Save the verification payload via `POST /customers/:id/verification/individual` or `POST /customers/:id/verification/business`
3. Submit with `POST /customers/:id/submit`, or pass `?submit=true` on the verification call

## Verification Status

Verification status is reflected on the [customer status](/concepts/customers#customer-status):

| Customer Status | Description |
| - | - |
| `DRAFT` | Data collection in progress |
| `IN_REVIEW` | Submitted, under compliance review |
| `NEED_ACTIONS` | Additional information required (RFI) |
| `ACTIVE` | Verification passed, compliance approved |
| `REJECTED` | Verification failed |

## Required at submit

Saving verification data does not require every field. `POST /customers/{id}/verification/business` and `POST /customers/{id}/verification/individual` accept partial payloads. Passing `submit=true`, or calling `POST /customers/{id}/submit`, requires the base package below. The [compliance endpoint](/api-reference/customers/get-customer-compliance-requirements) is the checklist for a specific customer.

### Business

* Legal name, business type, description, and 6-digit NAICS industry code
* Business email, phone, and website
* Tax identification number and registration date
* Registered address and physical address
* Account purpose, source of funds, estimated annual revenue, expected monthly payment volume, expected counterparty countries, expected monthly crypto volume, and primary target market
* At least one beneficial owner or control person

### Individual

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.

## Required Documents

The documents below reflect the base verification requirements. Additional documents may be requested during review via an RFI (Request for Information). The full, up-to-date list for a given customer is always available from the [compliance endpoint](/api-reference/customers/get-customer-compliance-requirements).

### Individual Customers

<AccordionGroup>
  <Accordion title="Identity Documents">
    **Government ID (Front)** (required):

    * Government-issued photo ID (passport, driver's license, national ID, military ID, permanent residency ID, or state/provincial ID)

    **Government ID (Back)** (optional):

    * Not required for passports

    **Selfie** (required):

    * Good lighting, eyes open, no obstructions covering the face
  </Accordion>

  <Accordion title="Proof of Address">
    **Proof of Address** (required for customers residing outside the US):

    * Bank statement, utility bill, government letter, or lease agreement
    * Must be issued within the last 90 days
    * Optional for customers residing in the US
  </Accordion>

  <Accordion title="Supporting Documents">
    **Supporting Documents** (optional):

    * Any additional documents that support the verification
  </Accordion>
</AccordionGroup>

### Business Customers

<AccordionGroup>
  <Accordion title="Formation & Registration">
    **Business Formation Documents** (required):

    * Articles of Incorporation, Certificate of Formation, Operating Agreement, or similar

    **Certificate of Incorporation / Registration** (required):

    * Registration document matching the business type -- trusts provide a trust deed or trust agreement; sole proprietorships provide a business license plus a trade name / DBA filing

    **TIN Verification** (required for sole proprietorships, otherwise optional):

    * Sole proprietorships: tax return, tax authority confirmation letter, or equivalent tax identification document
    * Other businesses: IRS EIN confirmation letter (CP 575 or 147C)
  </Accordion>

  <Accordion title="Ownership & Directors">
    **Ownership Information** (required, except sole proprietorships and trusts):

    * Cap table, shareholder registry, trust deed, or ownership structure document

    **Directors Registry** (required for non-US businesses, except sole proprietorships):

    * Registry extract, register of directors, certificate of incumbency, or equivalent official record showing the company directors
  </Accordion>

  <Accordion title="Proof of Address">
    **Business Address Proof** (required):

    * Utility bill or bank statement for the business address, issued within the last 90 days (PDF preferred)

    **Related Party Proof of Address** (required per UBO or control person):

    * Utility bill, bank statement, or government correspondence dated within 90 days for each beneficial owner or control person
  </Accordion>

  <Accordion title="Authorization">
    **Proof of Signatory Authority** (optional):

    * Board resolution, letter of authorization, certificate of incumbency, or similar document showing who is authorized to act on behalf of the company
  </Accordion>
</AccordionGroup>

## Webhooks

Subscribe to verification events for real-time updates:

* `customer.verified` -- Customer verification completed
* `customer.status_changed` -- Customer status updated
* `verification.session.completed` -- Verification session finished
* `verification.session.submitted` -- Customer submitted their verification

See the [Webhooks guide](/guides/webhooks) for setup instructions.

## Next Steps

After successful verification, customers can proceed to creating [accounts](/concepts/accounts) and [transfers](/concepts/transfers).

<CardGroup cols={2}>
  <Card title="Accounts" icon="building-columns" href="/concepts/accounts">
    Set up bank accounts and wallets for your customers
  </Card>

  <Card title="Transfers" icon="arrow-right-arrow-left" href="/concepts/transfers">
    Move funds for verified customers
  </Card>
</CardGroup>


## Related topics

- [Welcome](/welcome.md)
- [Agents](/concepts/agents.md)
- [Customers](/concepts/customers.md)
- [Identity Verification](/coverage/identity.md)
- [Initiate a new verification](/api-reference/verification/initiate-a-new-verification.md)
