> ## 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 a verification questionnaire

> Submit the customer's answers to one questionnaire, named by `type`. Today the only one a partner can submit is `occupation`; `type` is required so that a second questionnaire can be added without invalidating requests already being sent.

| `type` | Answers | Applies to |
|---|---|---|
| `occupation` | `jobTitle`, `industry` | Every customer |

Documents are uploaded through [`POST /ramp/customer/{customer_id}/verification/documents`](/api-reference/kyc/upload-verification-documents), including a region's tax document. The customer agreement is a questionnaire too and is deliberately absent: consent is collected interactively from the person giving it, in the hosted step.

**Submit the customer's personal data first**, or this answers `409`. As with document upload, the stage that asks these questions doesn't exist on the customer until then.

**Answers `202`, not `200`.** `industry` is resolved against the live category list in the background, so an unrecognized value doesn't fail the request: it leaves the occupation requirement outstanding.



## OpenAPI

````yaml /openapi.json post /ramp/customer/{customer_id}/verification/questionnaire
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: 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 a customer's verification data, documents and questionnaire
      answers, import a verification they already passed elsewhere, and check
      where their KYC stands.
  - name: Webhooks
    description: Event notification subscriptions.
  - name: Organizations
    description: Organization identity, child orgs, and partner fees.
  - name: Deprecated
    description: >-
      Endpoints kept working until their sunset date and then removed. See the
      deprecations page for replacements and dates.
paths:
  /ramp/customer/{customer_id}/verification/questionnaire:
    post:
      tags:
        - KYC
      summary: Submit a verification questionnaire
      description: >-
        Submit the customer's answers to one questionnaire, named by `type`.
        Today the only one a partner can submit is `occupation`; `type` is
        required so that a second questionnaire can be added without
        invalidating requests already being sent.


        | `type` | Answers | Applies to |

        |---|---|---|

        | `occupation` | `jobTitle`, `industry` | Every customer |


        Documents are uploaded through [`POST
        /ramp/customer/{customer_id}/verification/documents`](/api-reference/kyc/upload-verification-documents),
        including a region's tax document. The customer agreement is a
        questionnaire too and is deliberately absent: consent is collected
        interactively from the person giving it, in the hosted step.


        **Submit the customer's personal data first**, or this answers `409`. As
        with document upload, the stage that asks these questions doesn't exist
        on the customer until then.


        **Answers `202`, not `200`.** `industry` is resolved against the live
        category list in the background, so an unrecognized value doesn't fail
        the request: it leaves the occupation requirement outstanding.
      operationId: submit_verification_questionnaire
      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:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - type
                - jobTitle
                - industry
              properties:
                type:
                  type: string
                  description: >-
                    Which questionnaire these answers are for. New values may be
                    added; a request naming one that does not exist is rejected
                    listing the ones that do.
                  enum:
                    - occupation
                  example: occupation
                jobTitle:
                  type: string
                  description: The customer's occupation, free text.
                  example: Software Engineer
                industry:
                  type: string
                  description: >-
                    Occupation category: a `code` from [GET
                    /ramp/verification/occupations](/api-reference/kyc/list-occupation-categories).
                    The `label` is not accepted; it is display copy and can be
                    reworded.
                  example: '4430200'
      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: >-
            Validation failed: a missing or unrecognized `type`, or a blank
            `jobTitle` or `industry`. Also returned when the customer is a
            business account, and when the `customer_id` exists but is not a
            child of your organization.
          content:
            text/plain:
              schema:
                type: string
              example: >-
                tax_document: content type 'text/plain' is not supported
                (allowed: image/jpeg, image/jpg, image/png, application/pdf)
        '404':
          description: No organization exists with that `customer_id`.
        '409':
          description: >-
            Not now, rather than never: all three cases are retryable or
            resolvable. Either nothing has been submitted for this customer yet,
            so submit their personal data first; or their personal data landed
            but the customer has not been routed to their country's requirements
            yet, so the stage this would attach to does not exist; the
            `kyc_updated` webhook fires when routing completes, and a retry
            after it succeeds; or their verification is already approved or
            denied and cannot be modified.
components:
  schemas:
    VerificationStatusResponse:
      type: object
      description: >-
        Where the customer's verification stands after a partner write. `status`
        is the same value `GET /ramp/customer/{customer_id}/kyc` reports, so
        there is one vocabulary across both.
      required:
        - customerId
        - status
      properties:
        customerId:
          type: string
          format: uuid
        status:
          type: string
          description: >-
            The customer's overall verification status. A write never moves it
            on its own.
          enum:
            - not_started
            - in_progress
            - submitted
            - approved
            - denied
      example:
        customerId: a1b2c3d4-e5f6-7890-abcd-ef1234567890
        status: in_progress
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: API key sent in the Authorization header.

````