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

# Upload KYC docs

> Upload identity documents (government ID, selfie) for a customer.

**Document requirements:**
- Formats: JPEG, PNG
- Max size: 10 MB total per request (the whole body, across all images), not per image
- Required documents: `id_front`, `id_back` (if applicable), `selfie`
- Encoding: Base64

Use the `documentType` field: `document` for government ID images (front and back),
`selfie` for the selfie verification photo.

Submitted documents are reviewed by Etherfuse admins before approval; you'll receive a
`kyc_updated` webhook when the status changes.

**Sandbox auto-approval:** in sandbox, a `personal` customer auto-approves once all
agreements have been signed, with no manual review. Uploading documents is a required step in
the programmatic flow, but does not by itself approve the customer; approval lands after
agreement signing, at which point a `kyc_updated` webhook fires. This is sandbox-only; production
still requires manual review.

**Authentication:** use your partner API key. This is a server-side call and cannot be made from a browser.

**documentType** is `document` or `selfie` only. There is no `proof_of_address` type: the customer's address comes from the identity submitted to `POST /ramp/customer/{customer_id}/kyc`, not from a document. Send `document` and `selfie` as separate requests; multiple images of the same type can share one request. Re-submitting a documentType appends new images and does not overwrite a prior upload.

**Image handling:** Etherfuse forwards your image bytes to the identity-verification provider as-is. Stripping EXIF or re-encoding is accepted on our side, but the provider's OCR, face-match, and liveness checks run on those exact bytes, so lossy re-encoding or dropping EXIF orientation can degrade results. Forward originals when you can; if you must scrub metadata, do it losslessly and preserve orientation.



## OpenAPI

````yaml /openapi.json post /ramp/customer/{customer_id}/kyc/documents
openapi: 3.1.0
info:
  title: Etherfuse FX API
  description: Partner-facing ramp API for onramps, offramps, swaps, and KYC.
  license:
    name: Proprietary
  version: 1.0.0
servers:
  - url: https://api.sand.etherfuse.com
    description: Sandbox
security:
  - ApiKeyAuth: []
tags:
  - name: Authentication
    description: >-
      Partner JWT authentication — exchange a JWT for an access token, or launch
      a user into the app.
  - name: Lookup
    description: >-
      Public reference data: exchange rates, stablebonds, bond costs, country
      codes.
  - name: Assets
    description: Rampable stablecoins and stablebonds available per blockchain.
  - name: Onboarding
    description: Hosted and programmatic customer onboarding.
  - name: Agreements
    description: Legal agreement acceptance during onboarding.
  - name: Bank Accounts
    description: Register and retrieve customer bank accounts.
  - name: Quotes
    description: Price quotes for onramps, offramps, and swaps.
  - name: Orders
    description: Create, track, and manage ramp orders.
  - name: Swaps
    description: Crypto-to-crypto swaps.
  - name: Sponsored
    description: Token approvals for sponsored (gasless) offramps.
  - name: Customers
    description: Customer (child-organization) records.
  - name: Wallets
    description: Register and manage customer wallets.
  - name: KYC
    description: Submit and check customer KYC status.
  - name: Webhooks
    description: Event notification subscriptions.
  - name: Organizations
    description: Organization identity, child orgs, and partner fees.
paths:
  /ramp/customer/{customer_id}/kyc/documents:
    post:
      tags:
        - KYC
      summary: Upload KYC docs
      description: >-
        Upload identity documents (government ID, selfie) for a customer.


        **Document requirements:**

        - Formats: JPEG, PNG

        - Max size: 10 MB total per request (the whole body, across all images),
        not per image

        - Required documents: `id_front`, `id_back` (if applicable), `selfie`

        - Encoding: Base64


        Use the `documentType` field: `document` for government ID images (front
        and back),

        `selfie` for the selfie verification photo.


        Submitted documents are reviewed by Etherfuse admins before approval;
        you'll receive a

        `kyc_updated` webhook when the status changes.


        **Sandbox auto-approval:** in sandbox, a `personal` customer
        auto-approves once all

        agreements have been signed, with no manual review. Uploading documents
        is a required step in

        the programmatic flow, but does not by itself approve the customer;
        approval lands after

        agreement signing, at which point a `kyc_updated` webhook fires. This is
        sandbox-only; production

        still requires manual review.


        **Authentication:** use your partner API key. This is a server-side call
        and cannot be made from a browser.


        **documentType** is `document` or `selfie` only. There is no
        `proof_of_address` type: the customer's address comes from the identity
        submitted to `POST /ramp/customer/{customer_id}/kyc`, not from a
        document. Send `document` and `selfie` as separate requests; multiple
        images of the same type can share one request. Re-submitting a
        documentType appends new images and does not overwrite a prior upload.


        **Image handling:** Etherfuse forwards your image bytes to the
        identity-verification provider as-is. Stripping EXIF or re-encoding is
        accepted on our side, but the provider's OCR, face-match, and liveness
        checks run on those exact bytes, so lossy re-encoding or dropping EXIF
        orientation can degrade results. Forward originals when you can; if you
        must scrub metadata, do it losslessly and preserve orientation.
      operationId: upload_kyc_documents
      parameters:
        - name: customer_id
          in: path
          description: >-
            The customer (child org) ID. Must belong to the caller's
            organization or a direct child.
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UploadKycDocumentsRequest'
        required: true
      responses:
        '200':
          description: KYC documents uploaded
          content:
            application/json:
              schema: {}
              example:
                message: Documents uploaded for review
                status: proposed
        '404':
          description: Customer not found
components:
  schemas:
    UploadKycDocumentsRequest:
      type: object
      description: >-
        Request body for uploading KYC document images. This endpoint is for
        document images only — identity fields (name, address, ID numbers, etc.)
        are submitted separately via Submit KYC.
      required:
        - documentType
        - images
      properties:
        documentType:
          type: string
          enum:
            - document
            - selfie
          description: >-
            The kind of image being uploaded: "document" for a government-issued
            ID, or "selfie" for a selfie/liveness photo.
        images:
          type: array
          description: >-
            The image(s) for this document. For a two-sided ID, upload the front
            and back as separate entries.
          items:
            $ref: '#/components/schemas/ImageUploadBody'
      example:
        documentType: document
        images:
          - image: data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...
            label: id_front
          - image: data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...
            label: id_back
    ImageUploadBody:
      type: object
      required:
        - image
        - label
      properties:
        image:
          type: string
          description: >-
            The image encoded as a base64 data URI (JPEG or PNG, max 10MB), e.g.
            "data:image/jpeg;base64,...".
        label:
          type: string
          enum:
            - id_front
            - id_back
            - selfie
          description: >-
            Identifies the image. Use "id_front" (required) and "id_back" (if
            two-sided) when documentType is "document"; use "selfie" when
            documentType is "selfie".
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: API key sent in the Authorization header.

````