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

# Submit verification data

> First call in the [KYC API](/v2/guides/kyc-api) flow. Nothing else is accepted before it: `country` is what routes the customer to their country's requirements.

**Answers `202`, not `200`.** We validate the request before we answer and record it with the verification provider after. A `202` means accepted, not satisfied. Read the result from the `kycUpdated` webhook or [`GET /organization/{organizationId}/kyc?requirements=true`](/v2/api-reference/kyc/get-kyc-status).

Submitting again overwrites what was sent before, and never moves the customer's review status on its own. Personal organizations only.



## OpenAPI

````yaml openapi-v2.json POST /organization/{organizationId}/verification
openapi: 3.1.0
info:
  title: Etherfuse FX API
  description: >-
    Partner-facing ramp API, version 2: payment accounts, quotes, orders and
    webhooks.
  license:
    name: Proprietary
  version: 2.0.0
servers:
  - url: https://api.sand.etherfuse.com
    description: Sandbox
security:
  - ApiKeyAuth: []
tags:
  - name: Payment Accounts
    description: >-
      Register the bank accounts and wallets that money moves from and to, and
      read their readiness per rail.
  - name: Quotes
    description: Price a transfer between two registered payment accounts.
  - name: Orders
    description: Create orders from quotes and track them.
  - name: Webhook Subscriptions
    description: Subscribe to webhook events.
  - name: Webhook Events
    description: Payloads Etherfuse sends to your webhook subscriptions.
  - name: Sandbox
    description: Endpoints that work only in sandbox, for testing.
  - name: Assets
    description: The markets and tokens a quote can use, and the balances of a wallet.
  - name: Authentication
    description: >-
      Partner JWT authentication: exchange a JWT for an access token, or launch
      a user into the app.
  - name: KYC
    description: >-
      Submit a customer's verification data, documents and questionnaire
      answers, import a verification they already passed elsewhere, and check
      where their KYC stands.
  - name: KYB
    description: Check where a business organization's KYB stands.
  - name: Lookup
    description: >-
      Public reference data: exchange rates, stablebonds, bond costs, country
      codes.
  - name: Organizations
    description: >-
      Your organization, your default partner fee, and the customer
      organizations you create.
  - name: Members
    description: >-
      The people who belong to a customer business organization and complete its
      KYB.
  - name: Statements
    description: >-
      Monthly revenue share statements for closed months, as a list or as a CSV
      or PDF download.
paths:
  /organization/{organizationId}/verification:
    post:
      tags:
        - KYC
      summary: Submit verification data
      description: >-
        First call in the [KYC API](/v2/guides/kyc-api) flow. Nothing else is
        accepted before it: `country` is what routes the customer to their
        country's requirements.


        **Answers `202`, not `200`.** We validate the request before we answer
        and record it with the verification provider after. A `202` means
        accepted, not satisfied. Read the result from the `kycUpdated` webhook
        or [`GET
        /organization/{organizationId}/kyc?requirements=true`](/v2/api-reference/kyc/get-kyc-status).


        Submitting again overwrites what was sent before, and never moves the
        customer's review status on its own. Personal organizations only.
      operationId: v2SubmitVerification
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitVerificationRequest'
      responses:
        '202':
          description: >-
            Accepted and being applied. The customer's current verification
            status is returned.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VerificationStatusResponse'
        '400':
          description: >-
            `invalid-request`: validation failed. `detail` lists every missing
            or invalid field at once, including a `country` that is not ISO
            3166-1 alpha-3. Also returned for a business organization, which
            verifies through [KYB](/v2/guides/kyb).
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
              example:
                type: https://docs.etherfuse.com/ramp/v2/errors/invalid-request
                title: Invalid request
                status: 400
                detail: >-
                  dateOfBirth must be a date in YYYY-MM-DD format; country 'MX'
                  is not a recognized ISO 3166-1 alpha-3 country code (e.g.
                  MEX); address.city is required
                instance: >-
                  tag:etherfuse.com,2026-08-28:R2-70010/9b2f4c1e-5a6b-4c7d-8e9f-0a1b2c3d4e5f
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/OrganizationNotFound'
        '409':
          description: >-
            `conflict`: this customer's verification is already approved or
            denied and cannot be modified. A denied customer resubmits in the
            hosted step, not over the API.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  parameters:
    OrganizationId:
      name: organizationId
      in: path
      required: true
      description: >-
        The organization this call acts for: your API key's organization or one
        of its customer organizations. Any other id returns `404` `not-found`.
      schema:
        type: string
        format: uuid
  schemas:
    SubmitVerificationRequest:
      type: object
      description: Personal data a partner submits on the customer's behalf.
      required:
        - firstName
        - lastName
        - dateOfBirth
        - taxId
        - country
        - address
      properties:
        firstName:
          type: string
        lastName:
          type: string
        dateOfBirth:
          type: string
          description: '`YYYY-MM-DD`. Any other format is a 400.'
          example: '1990-01-01'
        taxId:
          type: string
          description: >-
            The customer's tax identification number. The RFC for a Mexican
            customer.
          example: XAXX010101000
        country:
          type: string
          description: >-
            The customer's country, as an ISO 3166-1 alpha-3 code. Alpha-2 codes
            and country names are rejected. This is the one country field for
            the customer (there is no separate nationality), and its value
            routes them to their country's requirements.
          example: MEX
        address:
          $ref: '#/components/schemas/VerificationAddress'
      example:
        firstName: Ana
        lastName: Ejemplo
        dateOfBirth: '1990-01-01'
        taxId: XAXX010101000
        country: MEX
        address:
          street: Av. Reforma 100
          city: Ciudad de Mexico
          region: CDMX
          postalCode: '06600'
          country: MEX
    VerificationStatusResponse:
      type: object
      description: >-
        Where the customer's verification stands after a write. `status` is the
        same value `GET /organization/{organizationId}/kyc` reports.
      required:
        - organizationId
        - status
      properties:
        organizationId:
          type: string
          format: uuid
        status:
          $ref: '#/components/schemas/VerificationStatus'
      example:
        organizationId: a1b2c3d4-e5f6-7890-abcd-ef1234567890
        status: inProgress
    Problem:
      type: object
      description: >-
        RFC 9457 problem details. Every v2 error uses this body with content
        type `application/problem+json`. `errors` is present only on
        `validation-error`. `required` and `missing` are present only on
        `registration-info-required`.
      required:
        - type
        - title
        - status
        - detail
        - instance
      properties:
        type:
          type: string
          format: uri
          description: >-
            `https://docs.etherfuse.com/ramp/v2/errors/` followed by the problem
            slug, for example
            `https://docs.etherfuse.com/ramp/v2/errors/quote-expired`. Switch on
            this value.
          example: https://docs.etherfuse.com/ramp/v2/errors/quote-expired
        title:
          type: string
          description: Short summary of the problem type.
          example: Quote expired
        status:
          type: integer
          description: The HTTP status code.
          example: 400
        detail:
          type: string
          description: Human-readable explanation of this occurrence. Do not parse it.
          example: >-
            quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not
            exist
        instance:
          type: string
          description: Unique identifier for this occurrence. Quote it to support.
          example: >-
            tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d
        errors:
          type: array
          description: Present on `validation-error`. One entry per invalid field.
          items:
            $ref: '#/components/schemas/FieldViolation'
        required:
          type: array
          description: >-
            Present on `registration-info-required`. Every registration field
            the route requires, as JSON Pointers into the request, for example
            `#/registrationInfo/taxId`.
          items:
            type: string
        missing:
          type: array
          description: >-
            Present on `registration-info-required`. The required fields you
            must still send, as JSON Pointers into the request.
          items:
            type: string
    VerificationAddress:
      type: object
      description: >-
        The customer's residential address. Required, and it must match the
        identity document you upload; the provider cross-checks the two.
      required:
        - street
        - city
        - country
      properties:
        street:
          type: string
          example: Av. Reforma 100
        city:
          type: string
          example: Ciudad de Mexico
        region:
          type:
            - string
            - 'null'
          description: State or province.
          example: CDMX
        postalCode:
          type:
            - string
            - 'null'
          description: >-
            Optional, because some countries issue none. Send it when the
            country has one.
          example: '06600'
        country:
          type: string
          description: ISO 3166-1 alpha-3.
          example: MEX
        buildingNumber:
          type:
            - string
            - 'null'
        flatNumber:
          type:
            - string
            - 'null'
    VerificationStatus:
      type: string
      enum:
        - notStarted
        - inProgress
        - submitted
        - approved
        - denied
      description: |-
        - `notStarted`: verification has not started.
        - `inProgress`: the customer started but has not submitted everything.
        - `submitted`: submitted and waiting for review.
        - `approved`: cleared.
        - `denied`: rejected, or a previous approval was revoked.
    FieldViolation:
      type: object
      required:
        - pointer
        - detail
      properties:
        pointer:
          type: string
          description: >-
            JSON Pointer to the field in the request, for example
            `#/accountDetails/clabe`.
          example: '#/accountDetails/clabe'
        detail:
          type: string
          description: What is wrong with the field.
          example: This field is required.
  responses:
    Unauthorized:
      description: >-
        `unauthorized`: the `Authorization` header is missing, not ASCII, or
        does not hold a valid API key.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    OrganizationNotFound:
      description: '`not-found`: your API key cannot act for this organization.'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    InternalError:
      description: >-
        `internal-error`: an unexpected error on our side. Retry with backoff,
        and quote `instance` to support if it persists.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: API key sent in the Authorization header, with no `Bearer` prefix.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.