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

# Submit personal KYC

> Full KYC payload for a Sender registered as `individual`. Calling this against an `enterprise` Sender returns `400`.



## OpenAPI

````yaml openapi-payouts-v2-0-0.json post /api/v2/payouts/senders/{id}/kyc/personal
openapi: 3.0.3
info:
  title: Mansa Payout API — v2
  description: >
    API for registering Senders and Beneficiaries and for creating, funding, and
    tracking cross-border payout batches.


    ## Rate Limiting

    - 100 requests per minute per API key

    - Specific endpoints may have additional limits


    ## Security

    - All endpoints require authentication

    - Sender and Beneficiary profiles must clear KYC/KYB review (`status:
    "ready"`) before they can be used on an order


    ## Error Handling

    This API returns Nest's default error shape rather than a custom envelope.


    - **2xx** — The request succeeded.

    - **4xx** — The request failed due to a problem with the information
    provided.

    - **5xx** — A problem occurred on our servers or with an upstream
    dependency.


    Most errors have the shape:


    ```json

    {
      "statusCode": 400,
      "message": "..."
    }

    ```


    A `422` from a validation failure returns an array of per-field messages
    instead of one string:


    ```json

    {
      "statusCode": 422,
      "message": ["legal_name should not be empty", "country_code must be a valid ISO 3166-1 alpha-2 code"]
    }

    ```
  version: v2
  contact:
    name: Mansa API Support
    email: api-support@mansa.io
    url: https://docs.mansa.io
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT
servers:
  - url: https://api.mansa.xyz
    description: Production server
  - url: https://sandbox-api.mansa.xyz
    description: Sandbox server
security:
  - ApiKeyAuth: []
    BearerAuth: []
tags:
  - name: Organizations
    description: Product entitlement checks
  - name: Senders
    description: Registering and verifying the org's own paying entities
  - name: Beneficiaries
    description: Registering and verifying who gets paid
  - name: Funding
    description: The org's USDT funding address and balance
  - name: Payouts
    description: Creating, funding, and tracking payout batches and orders
paths:
  /api/v2/payouts/senders/{id}/kyc/personal:
    post:
      tags:
        - Senders
      summary: Submit personal KYC
      description: >-
        Full KYC payload for a Sender registered as `individual`. Calling this
        against an `enterprise` Sender returns `400`.
      operationId: submitPersonalKyc
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: ID of the Sender
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitPersonalKycRequest'
      responses:
        '200':
          description: KYC submitted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Sender'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/ServerError'
components:
  schemas:
    SubmitPersonalKycRequest:
      type: object
      description: Full KYC payload for a Sender registered as `individual`.
      properties:
        member_name:
          type: string
          description: Full name (English)
        name_on_cert:
          type: string
          description: As on the identity document
        first_name:
          type: string
        last_name:
          type: string
        gender:
          type: string
          enum:
            - '1'
            - '2'
          description: 1 male, 2 female
        birthday:
          type: string
          description: yyyy-MM-dd
        cert_type:
          type: string
          enum:
            - '11'
            - '13'
            - '14'
          description: ID card · Passport · Driver's license
        cert_num:
          type: string
        effective_date:
          type: string
          description: yyyy-MM-dd
        expiration_date:
          type: string
          description: Required unless `is_long_term` is "1".
        is_long_term:
          type: string
          enum:
            - '0'
            - '1'
          default: '0'
        cert_area:
          type: string
          description: ISO 3166-1 alpha-2, document's issuing country
        residence_area:
          type: string
          description: ISO 3166-1 alpha-2, country of residence
        province:
          type: string
        city:
          type: string
        address:
          type: string
          description: Including house/unit number
        postcode:
          type: string
        phone_area_code:
          type: string
          description: No '+', e.g. "86"
        phone_num:
          type: string
        email:
          type: string
        payment_regions:
          type: string
          description: ISO 3166-1 alpha-2, comma-separated
        export_regions:
          type: string
          description: ISO 3166-1 alpha-2, comma-separated
        funds_source:
          type: string
          enum:
            - '1'
            - '2'
            - '3'
            - '4'
          description: 1 Salary · 2 Savings · 3 Investment return · 4 Other
        emt_amt:
          type: string
          enum:
            - '1'
            - '2'
            - '3'
          description: 'Monthly volume (USD): 1 0–49,999 · 2 50k–299,999 · 3 >300k'
        occupation_type:
          type: string
          description: Partner's fixed code, e.g. "T1040001"
        occupation_type_other:
          type: string
          description: Required when `occupation_type` is "T1040099".
        account_opening_purpose:
          type: string
          enum:
            - '1'
            - '2'
          description: 1 Remittance, 2 Currency exchange
        employer_info:
          type: string
        annual_salary_range:
          type: string
          enum:
            - '1'
            - '2'
            - '3'
          description: 1 $10k–$100k · 2 $100k–$200k · 3 $200k+
        kyc_files:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/KycFileRef'
      required:
        - member_name
        - name_on_cert
        - first_name
        - last_name
        - gender
        - birthday
        - cert_type
        - cert_num
        - effective_date
        - cert_area
        - residence_area
        - province
        - city
        - address
        - postcode
        - phone_area_code
        - phone_num
        - email
        - payment_regions
        - export_regions
        - funds_source
        - emt_amt
        - occupation_type
        - account_opening_purpose
        - employer_info
        - annual_salary_range
        - kyc_files
    Sender:
      type: object
      properties:
        id:
          type: string
          format: uuid
        profile_type:
          type: string
          enum:
            - enterprise
            - individual
        legal_name:
          type: string
        country_code:
          type: string
        registration_number:
          type: string
          nullable: true
        address:
          type: string
          nullable: true
        contact_email:
          type: string
          nullable: true
        contact_phone:
          type: string
          nullable: true
        status:
          $ref: '#/components/schemas/ProfileStatus'
        status_reason:
          type: string
          nullable: true
          description: Present only when `status` is `rejected`.
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
      required:
        - id
        - profile_type
        - legal_name
        - country_code
        - status
        - created_at
        - updated_at
    KycFileRef:
      type: object
      description: A reference to a file already uploaded for this Sender.
      properties:
        file_type:
          type: string
          description: >-
            Opaque partner file-type code (e.g. a passport photo page vs. a
            business registration certificate).
        file_id:
          type: string
          description: >-
            Returned by [Upload a Sender
            file](/api-reference/v2/payouts/upload-sender-file).
      required:
        - file_type
        - file_id
    ProfileStatus:
      type: string
      enum:
        - pending
        - ready
        - rejected
      description: >-
        Starts `pending`. No client action moves it — resolves automatically
        once asynchronous partner KYC/KYB review completes.
    NestErrorResponse:
      type: object
      description: Nest's default error envelope
      properties:
        statusCode:
          type: integer
          example: 400
        message:
          type: string
          example: sender not found
      required:
        - statusCode
        - message
      example:
        statusCode: 400
        message: sender not found
    NestValidationErrorResponse:
      type: object
      description: Nest's default validation-error envelope — one message per failing field
      properties:
        statusCode:
          type: integer
          example: 422
        message:
          type: array
          items:
            type: string
          example:
            - legal_name should not be empty
            - country_code must be a valid ISO 3166-1 alpha-2 code
      required:
        - statusCode
        - message
  responses:
    BadRequest:
      description: >-
        Invalid request — e.g. a referenced Sender/Beneficiary isn't `ready`, or
        the funding wallet balance is short.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/NestErrorResponse'
          examples:
            default:
              value:
                statusCode: 400
                message: sender is not ready
    Unauthorized:
      description: Authentication required or invalid credentials
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/NestErrorResponse'
          examples:
            default:
              value:
                statusCode: 401
                message: Unauthorized
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/NestErrorResponse'
          examples:
            default:
              value:
                statusCode: 404
                message: Sender not found
    UnprocessableEntity:
      description: Validation failed — one message per invalid field.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/NestValidationErrorResponse'
          examples:
            default:
              value:
                statusCode: 422
                message:
                  - legal_name should not be empty
                  - country_code must be a valid ISO 3166-1 alpha-2 code
    RateLimited:
      description: Rate limit exceeded
      headers:
        X-RateLimit-Limit:
          description: Request limit per window
          schema:
            type: integer
        X-RateLimit-Remaining:
          description: Remaining requests in window
          schema:
            type: integer
        X-RateLimit-Reset:
          description: UNIX epoch seconds when the rate limit resets
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/NestErrorResponse'
          examples:
            default:
              value:
                statusCode: 429
                message: Too many requests
    ServerError:
      description: Internal server or upstream error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/NestErrorResponse'
          examples:
            default:
              value:
                statusCode: 500
                message: Internal server error
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: API key for authentication
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        ES256 JWT signed by the private key registered to the API key above.
        Claims: sub (=API key), uri, nbf, iat, exp, and bodyHash (HMAC-SHA512 of
        uri + rawBody + nbf using a shared secret, base64).

````