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

# Submit tier 2 verification

> Submit tier 2 KYC or business KYB verification for a customer

## Overview

Submits tier 2 verification for an existing customer. Use the individual KYC payload for people, or pass `customer_type: "business"` with business KYB fields for an entity customer.

Tier 2 verification is required before the customer can use Bridge-backed banking features.

<Info>
  Business KYB can also be submitted through the compatibility route `POST /v1/customers/{id}/business-verification`. New integrations should prefer this tier 2 endpoint with `customer_type: "business"`.
</Info>

<Note>
  **Tier 2 verification is required for:**

  * Creating USD virtual accounts
  * Creating `US_BANK_ACCOUNT` or `SWIFT_BANK_ACCOUNT` recipients
  * Sending USD transfers to ACH, wire, or SWIFT recipients
</Note>

<Info>
  **Idempotency behavior:**

  * If tier 2 status is already `PENDING`, resubmission is blocked.
  * If tier 2 status is already `VERIFIED`, resubmission is blocked.
</Info>

## Authentication

<ParamField header="X-Api-Key" type="string" required>
  Your merchant API key
</ParamField>

## Path Parameters

<ParamField path="id" type="string" required>
  Customer ID (UUID format)

  **Example:** `650e8400-e29b-41d4-a716-446655440000`
</ParamField>

## Request Body

<ParamField body="customer_type" type="string">
  Verification subject type. Omit this field or use `individual` for individual KYC. Use `business` for business/entity KYB.

  **Allowed values:** `individual` | `business`
</ParamField>

### Individual KYC fields

Use these fields when `customer_type` is omitted or set to `individual`.

<ParamField body="residential_address" type="object" required>
  Customer's residential address.

  <Expandable title="residential_address properties">
    <ParamField body="residential_address.street_line_1" type="string" required>
      Street address line 1

      **Example:** `123 Main St`
    </ParamField>

    <ParamField body="residential_address.city" type="string" required>
      City

      **Example:** `Lagos`
    </ParamField>

    <ParamField body="residential_address.subdivision" type="string" required>
      Short state or subdivision code. Must be 10 characters or fewer.

      **Example:** `LA`
    </ParamField>

    <ParamField body="residential_address.postal_code" type="string" required>
      Postal code

      **Example:** `100001`
    </ParamField>

    <ParamField body="residential_address.country" type="string" required>
      ISO 3166-1 alpha-3 country code

      **Example:** `NGA`
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="nationality" type="string" required>
  ISO 3166-1 alpha-3 country code for the customer's nationality.

  **Example:** `NGA`
</ParamField>

<ParamField body="birth_date" type="string" required>
  Date of birth in `YYYY-MM-DD` format.

  **Example:** `1990-05-15`
</ParamField>

<ParamField body="identifying_information" type="array" required>
  Array of identity documents and tax IDs. Non-US customers should include at least one government photo ID (`passport`, `drivers_license`, or `national_id`) with `image_front`. Add `tin` when Daya or the verification provider asks for a tax identification number.

  <Expandable title="identifying_information item properties">
    <ParamField body="identifying_information[].type" type="string" required>
      Identification type. Use `tin` when Daya or the verification provider asks for the customer's tax identification number.

      **Allowed values:** `passport` | `drivers_license` | `national_id` | `tin`
    </ParamField>

    <ParamField body="identifying_information[].issuing_country" type="string" required>
      ISO 3166-1 alpha-3 country code of the issuing country.

      **Example:** `NGA`
    </ParamField>

    <ParamField body="identifying_information[].number" type="string">
      Document or tax identification number. Required when `type` is `tin`.

      **Example:** `A12345678`
    </ParamField>

    <ParamField body="identifying_information[].expiration" type="string">
      Document expiration date in `YYYY-MM-DD` format.

      **Example:** `2030-01-01`
    </ParamField>

    <ParamField body="identifying_information[].image_front" type="string">
      Front image of the document. Required for government photo ID types: `passport`, `drivers_license`, and `national_id`. Not required for `tin` when you are only submitting the tax identification number. If Daya specifically asks for a tax document image, send it as a base64 data URL up to 1 MiB decoded. Compress large camera images before encoding.

      **Example:** `data:image/png;base64,iVBORw0KGgo...`
    </ParamField>

    <ParamField body="identifying_information[].image_back" type="string">
      Back image of the document. Must be a base64 data URL up to 1 MiB decoded when provided.

      **Example:** `data:image/png;base64,iVBORw0KGgo...`
    </ParamField>
  </Expandable>
</ParamField>

<Note>
  Tax ID is not required for every customer. Some higher-risk customers or provider follow-up reviews may require it. For non-US customers, `tin` is additional information and should be sent alongside a government photo ID. Send `type: "tin"` in Daya's API; Daya maps it to the provider's country-specific tax identifier type before submission.
</Note>

<ParamField body="source_of_funds" type="string" required>
  Source of the customer's funds.

  **Allowed values:** `company_funds` | `ecommerce_reseller` | `gambling_proceeds` | `gifts` | `government_benefits` | `inheritance` | `investments_loans` | `pension_retirement` | `salary` | `sale_of_assets_real_estate` | `savings` | `someone_elses_funds`
</ParamField>

<ParamField body="account_purpose" type="string" required>
  Purpose of the account.

  **Allowed values:** `charitable_donations` | `ecommerce_retail_payments` | `investment_purposes` | `operating_a_company` | `other` | `payments_to_friends_or_family_abroad` | `personal_or_living_expenses` | `protect_wealth` | `purchase_goods_and_services` | `receive_payment_for_freelancing` | `receive_salary`
</ParamField>

<ParamField body="expected_monthly_payments_usd" type="string" required>
  Expected monthly payment volume bracket.

  **Allowed values:** `0_4999` | `5000_9999` | `10000_49999` | `50000_plus`
</ParamField>

<ParamField body="acting_as_intermediary" type="boolean" required>
  Whether the customer is acting as an intermediary for a third party.

  **Example:** `false`
</ParamField>

<ParamField body="employment_status" type="string" required>
  Customer's current employment status.

  **Allowed values:** `employed` | `homemaker` | `retired` | `self_employed` | `student` | `unemployed`
</ParamField>

<ParamField body="most_recent_occupation" type="string" required>
  Customer's most recent occupation category.

  **Allowed values:** `BUSINESS_ADMIN` | `STEM` | `HEALTHCARE_SOCIAL` | `EDUCATION_ARTS_MEDIA` | `SERVICE_PUBLIC_SAFETY` | `TRADES_LABOR`
</ParamField>

<ParamField body="documents" type="array">
  Supporting documents. Optional at the schema level, but **conditionally required** when `expected_monthly_payments_usd` is above the `0_4999` bucket. For `5000_9999`, `10000_49999`, and `50000_plus` buckets, supporting documents should be provided.

  <Expandable title="documents item properties">
    <ParamField body="documents[].file" type="string" required>
      Document file. Must be a base64 data URL up to 5 MiB decoded.

      **Example:** `data:image/png;base64,iVBORw0KGgo...`
    </ParamField>

    <ParamField body="documents[].purposes" type="array" required>
      Document purposes (at least one required).

      **Allowed values:** `proof_of_address` | `proof_of_source_of_funds`
    </ParamField>
  </Expandable>
</ParamField>

### Business KYB fields

Use these fields when `customer_type` is `business`. Daya will submit the customer to the business verification provider flow and update the same customer object.

<ParamField body="business_legal_name" type="string" required>
  Legal name of the business or entity. Daya also uses this as the trade name when submitting to the verification provider.

  **Example:** `Ada Labs Ltd`
</ParamField>

<ParamField body="business_description" type="string" required>
  Short description of what the business does.
</ParamField>

<ParamField body="business_type" type="string" required>
  Provider-supported business type, such as `corporation`, `llc`, or another type approved for your use case.
</ParamField>

<ParamField body="registered_address" type="object" required>
  Registered business address using the same address shape as `residential_address`.
</ParamField>

<ParamField body="physical_address" type="object">
  Physical operating address using the same address shape as `residential_address`. If omitted, Daya uses `registered_address` as the physical address.
</ParamField>

<ParamField body="is_dao" type="boolean" required>
  Whether the entity is a DAO.
</ParamField>

<ParamField body="associated_persons" type="array" required>
  Directors, signers, controllers, and beneficial owners associated with the business. At least one associated person is required. At least one associated person must have `has_control: true`, and at least one must have `is_signer: true`.

  <Expandable title="associated_persons item properties">
    <ParamField body="associated_persons[].first_name" type="string" required>
      First name.
    </ParamField>

    <ParamField body="associated_persons[].last_name" type="string" required>
      Last name.
    </ParamField>

    <ParamField body="associated_persons[].email" type="string" required>
      Email address.
    </ParamField>

    <ParamField body="associated_persons[].residential_address" type="object" required>
      Residential address using the same address shape as `residential_address`.
    </ParamField>

    <ParamField body="associated_persons[].birth_date" type="string" required>
      Date of birth in `YYYY-MM-DD` format.
    </ParamField>

    <ParamField body="associated_persons[].has_ownership" type="boolean" required>
      Whether the person is a beneficial owner.
    </ParamField>

    <ParamField body="associated_persons[].has_control" type="boolean" required>
      Whether the person has control over the entity. At least one associated person must be a control person.
    </ParamField>

    <ParamField body="associated_persons[].is_signer" type="boolean" required>
      Whether the person is authorized to sign for the entity. At least one associated person must be a signer.
    </ParamField>

    <ParamField body="associated_persons[].title" type="string">
      The person's title at the entity. Required when `has_control` is `true`.
    </ParamField>

    <ParamField body="associated_persons[].nationality" type="string" required>
      ISO 3166-1 alpha-3 nationality code.
    </ParamField>

    <ParamField body="associated_persons[].identifying_information" type="array" required>
      Government ID and tax identification details for the associated person.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="estimated_annual_revenue_usd" type="string" required>
  Estimated annual revenue bracket.

  **Example:** `1000000_4999999`
</ParamField>

<ParamField body="expected_monthly_payments_usd" type="string" required>
  Expected monthly payment volume bracket.

  **Allowed values:** `0_4999` | `5000_9999` | `10000_49999` | `50000_plus`
</ParamField>

<ParamField body="operates_in_prohibited_countries" type="boolean" required>
  Whether the business operates in prohibited countries.
</ParamField>

<ParamField body="account_purpose" type="string" required>
  Purpose of the account.

  **Example:** `operating_a_company`
</ParamField>

<ParamField body="source_of_funds" type="string" required>
  Source of business funds.

  **Example:** `company_funds`
</ParamField>

<ParamField body="conducts_money_services" type="boolean" required>
  Whether the business conducts money services.
</ParamField>

<ParamField body="identifying_information" type="array" required>
  Business identifying information. Include the business tax ID as an item with `type: "tin"` and `number`.
</ParamField>

<ParamField body="documents" type="array" required>
  Business supporting documents. Include at least one `proof_of_address` document and one `proof_of_source_of_funds` document.
</ParamField>

<Note>
  For business KYB, associated persons carry the required government ID documents. A non-US business tax ID does not require the business itself to submit a passport.
</Note>

## Request Example

### Individual KYC example

<CodeGroup>
  ```bash cURL theme={null}
  curl --request POST \
    --url https://api.daya.co/v1/customers/650e8400-e29b-41d4-a716-446655440000/tier2-verification \
    --header 'X-Api-Key: YOUR_API_KEY' \
    --header 'Content-Type: application/json' \
    --data '{
      "residential_address": {
        "street_line_1": "123 Main St",
        "city": "Lagos",
        "subdivision": "LA",
        "postal_code": "100001",
        "country": "NGA"
      },
      "nationality": "NGA",
      "birth_date": "1990-05-15",
      "identifying_information": [
        {
          "type": "passport",
          "issuing_country": "NGA",
          "number": "A12345678",
          "expiration": "2030-01-01",
          "image_front": "data:image/png;base64,iVBORw0KGgo..."
        }
      ],
      "source_of_funds": "salary",
      "account_purpose": "personal_or_living_expenses",
      "expected_monthly_payments_usd": "0_4999",
      "acting_as_intermediary": false,
      "employment_status": "employed",
      "most_recent_occupation": "BUSINESS_ADMIN"
    }'
  ```
</CodeGroup>

### Business KYB example

<CodeGroup>
  ```bash cURL theme={null}
  curl --request POST \
    --url https://api.daya.co/v1/customers/650e8400-e29b-41d4-a716-446655440000/tier2-verification \
    --header 'X-Api-Key: YOUR_API_KEY' \
    --header 'Content-Type: application/json' \
    --data '{
      "customer_type": "business",
      "business_legal_name": "Ada Labs Ltd",
      "business_description": "Cross-border collection and treasury operations",
      "business_type": "corporation",
      "registered_address": {
        "street_line_1": "10 Market Street",
        "city": "London",
        "subdivision": "LDN",
        "postal_code": "EC1A 1AA",
        "country": "GBR"
      },
      "is_dao": false,
      "associated_persons": [
        {
          "first_name": "Jane",
          "last_name": "Doe",
          "email": "jane@example.com",
          "residential_address": {
            "street_line_1": "10 Market Street",
            "city": "London",
            "subdivision": "LDN",
            "postal_code": "EC1A 1AA",
            "country": "GBR"
          },
          "birth_date": "1990-05-15",
          "has_ownership": true,
          "has_control": true,
          "is_signer": true,
          "is_director": true,
          "ownership_percentage": 50,
          "relationship_established_at": "2020-01-01",
          "nationality": "GBR",
          "identifying_information": [
            {
              "type": "passport",
              "issuing_country": "GBR",
              "number": "123456789",
              "expiration": "2030-01-01",
              "image_front": "data:image/png;base64,iVBORw0KGgo..."
            }
          ]
        }
      ],
      "estimated_annual_revenue_usd": "1000000_4999999",
      "expected_monthly_payments_usd": "50000_plus",
      "operates_in_prohibited_countries": false,
      "account_purpose": "operating_a_company",
      "source_of_funds": "company_funds",
      "conducts_money_services": false,
      "identifying_information": [
        {
          "type": "tin",
          "issuing_country": "GBR",
          "number": "GB123456789"
        }
      ],
      "documents": [
        {
          "purposes": ["proof_of_address"],
          "file": "data:image/png;base64,iVBORw0KGgo..."
        },
        {
          "purposes": ["proof_of_source_of_funds"],
          "file": "data:image/png;base64,iVBORw0KGgo..."
        }
      ]
    }'
  ```
</CodeGroup>

### Add a tax ID when requested

If Daya or the verification provider asks for the customer's tax identification number, add a `tin` item to `identifying_information` and resubmit Tier 2 verification:

```json theme={null}
{
  "identifying_information": [
    {
      "type": "passport",
      "issuing_country": "NGA",
      "number": "A12345678",
      "expiration": "2030-01-01",
      "image_front": "data:image/png;base64,iVBORw0KGgo..."
    },
    {
      "type": "tin",
      "issuing_country": "NGA",
      "number": "1234567890"
    }
  ]
}
```

## Response

Returns the updated customer object with verification status.

<ResponseField name="id" type="string" required>
  Customer ID (UUID)
</ResponseField>

<ResponseField name="email" type="string" required>
  Customer email address
</ResponseField>

<ResponseField name="first_name" type="string">
  Customer first name
</ResponseField>

<ResponseField name="last_name" type="string">
  Customer last name
</ResponseField>

<ResponseField name="is_verified" type="boolean" required>
  Whether the customer has passed verification
</ResponseField>

<ResponseField name="tier_1_kyc_complete" type="boolean" required>
  Whether tier 1 KYC has been completed.
</ResponseField>

<ResponseField name="tier_2_kyc_complete" type="boolean" required>
  Whether tier 2 KYC has been completed. `true` once Bridge approves the submitted data.
</ResponseField>

<ResponseField name="capabilities" type="array" required>
  Customer capabilities and their current status.

  <Expandable title="capability properties">
    <ResponseField name="capabilities[].name" type="string">
      Capability name. Current values: `base`, `usd_banking`.
    </ResponseField>

    <ResponseField name="capabilities[].status" type="string">
      Capability status: `approved`, `pending`, `rejected`, or `missing`.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="rejection_reasons" type="array" required>
  Current blocking verification/capability issues. Empty array when the customer is approved for the relevant capability.
</ResponseField>

<ResponseField name="created_at" type="string" required>
  When the customer was created (ISO 8601)
</ResponseField>

<ResponseField name="updated_at" type="string" required>
  When the customer was last updated (ISO 8601)
</ResponseField>

<ResponseExample>
  ```json 200 OK theme={null}
  {
    "id": "650e8400-e29b-41d4-a716-446655440000",
    "email": "customer@example.com",
    "first_name": "John",
    "last_name": "Doe",
    "is_verified": false,
    "tier_1_kyc_complete": true,
    "tier_2_kyc_complete": false,
    "capabilities": [
      { "name": "base", "status": "approved" },
      { "name": "usd_banking", "status": "pending" }
    ],
    "rejection_reasons": [],
    "created_at": "2026-01-05T15:04:05Z",
    "updated_at": "2026-01-05T16:00:00Z"
  }
  ```

  ```json 400 Bad Request - Already pending theme={null}
  {
    "error": {
      "code": "TIER2_ALREADY_PENDING",
      "message": "Tier 2 verification is already pending",
      "request_id": "550e8400-e29b-41d4-a716-446655440000"
    }
  }
  ```

  ```json 400 Bad Request - Already verified theme={null}
  {
    "error": {
      "code": "TIER2_ALREADY_VERIFIED",
      "message": "Customer has already completed tier 2 verification",
      "request_id": "550e8400-e29b-41d4-a716-446655440000"
    }
  }
  ```
</ResponseExample>
