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

# Create Remitter

> Creates a remitter, the sending party. You need one before you request a remittance payout quotation.

<Prompt description="Create Remitter" actions={["cursor"]}>
  Add the Zapyd "Create Remitter" call (`POST /cms/api/v1/kyc/remitter/create`) to my backend. Creates a remitter, the sending party. You need one before you request a remittance payout quotation.

  * Sandbox: `POST https://sandbox.zapyd.com/cms/api/v1/kyc/remitter/create`
  * Production: `POST https://api.zapyd.com/cms/api/v1/kyc/remitter/create`

  JSON body:

  * `client_reference_id` (string, optional): Optional client-supplied reference for tracking. Max 255 characters. Example: `remitter-ref-001`.
  * `first_name` (string, required): Letters, spaces, apostrophes, and hyphens only. 1-100 characters. Example: `Siva`.
  * `last_name` (string, required): Letters, spaces, apostrophes, and hyphens only. 1-100 characters. Example: `Raj`.
  * `nationality` (string, required): ISO 3166-1 alpha-3 country code (validated, uppercased). Example: `IND`.
  * `city` (string, required): Letters, spaces, apostrophes, and hyphens only. 2-50 characters. Example: `Sydney`.
  * `source_of_funds` (string, required): Source of funds. One of the listed codes; others are rejected. One of: `business_income`, `final_settlement`, `funds_from_dividend_payouts`, `funds_from_schemes_and_raffles`, `gambling_proceeds`, `gift_from_family_and_friends`, `gifts`, `inheritance`, `investment_proceeds`, `loan_from_bank`, `other_sources`, `pension_retirement`, `salary`, `sale_of_assets_real_estate`, `savings`.
  * `id_type` (string, required): Identity document type. Use PASSPORT or DRIVING\_LICENCE; the other values are accepted but stored as a generic government ID. One of: `PASSPORT`, `DRIVING_LICENCE`, `BENEFICIARY_ID`, `PAN_CARD`, `AADHAAR_CARD`, `AIRLINE_STAFF_CARD`, `BUSINESS_REGISTRATION_NO_BR`, `CENTRAL_BANK_LICENCE`, `ACRA`.
  * `id_number` (string, required): 6–20 characters: letters, digits and hyphens. Example: `P1234567`.
  * `dob` (string, date, required): Date of birth (YYYY-MM-DD). Must be in the past. Example: `1990-01-15`.
  * `phone` (string, required): Phone in E.164 format with the leading +. The dial code must be a known country. Example: `+61412345678`.
  * `address_line` (string, required): Residential address, max 500 characters. Example: `1 George Street`.
  * `residence_country` (string, required): Country of residence, ISO 3166-1 alpha-3. Must not be IND: a remitter must live outside India. Example: `ARE`.
  * `email` (string, email, optional): Email address. Optional. Example: `siva.raj@example.com`.

  Success: HTTP 200, `{status: true, message, data}`. `data`: `id` (Remitter ID. Pass as remitter\_id on remittance payout requests), `client_reference_id`, `first_name`, `last_name`, `full_name`, `email`, `phone`, `dob`, `nationality`, `residence_country`, `city`, `address_line`, `source_of_funds`, `document_type`, `status` (Remitter status. VERIFIED on create; the remitter's identity is checked when the payout is fulfilled), `created_at`.
  Errors (`{status: false, message, err_code, errors}`):

  * 400 `Bad Request`: A required field is missing; `source_of_funds` is not one of the accepted values; `id_type` is not one of the accepted values; `first_name`, `last_name`, or `city` contains unsupported characters; `nationality` or `residence_country` is not a valid alpha-3 code
  * 400 `A remitter must reside outside India`: `residence_country` is `IND`
  * 400 `dob must be in the past`: `dob` is today or in the future
  * 400 `Unsupported country dial code`: `phone` dial code is not recognised
  * 500 `Internal Server Error`
    Every endpoint can also return 401 `AUTH_*` (signature, timestamp or key: fix, don't retry), and 429 or 5xx (retry with backoff).

  Rules:

  * India remittance (RDA) flow: the remitter is the sender, living outside India. It's recorded as the sender of each payout, so it needs full identity.
  * Idempotent on `id_type` + `id_number`: a repeat returns the stored remitter unchanged, even if other fields differ.
  * Save `data.id` as `remitter_id` and reuse it for every transfer. It isn't a customer ID: never send it as `customer_id`.
  * Validate before sending: `dob` YYYY-MM-DD in the past, `phone` E.164 with `+`, `residence_country` alpha-3 and not `IND`, `id_number` 6 to 20 letters, digits or `-`.

  Signing (every request):

  * Headers: `X-API-KEY`, `X-TIMESTAMP` (Unix seconds, within 300 s of server time; generate per request) and `X-SIGNATURE`.
  * `X-SIGNATURE` = Base64(HMAC-SHA256(key = API secret, message = apiKey + "|" + timestamp + "|" + canonicalBody)). Base64 of the raw digest, not hex.
  * canonicalBody: the JSON body with keys sorted at every nesting level, no whitespace (separators `,` and `:`), and every non-ASCII character escaped as lowercase `\uXXXX` (Python `json.dumps(body, sort_keys=True, separators=(",", ":"))`). Requests with no body (GET, DELETE) sign `{}`. Query parameters are not signed.
  * Send the exact canonicalBody string you signed as the request body, with `Content-Type: application/json`.
  * Test vector: key `3f1b2c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d`, secret `test-secret-do-not-use`, timestamp `1735689600`. Signing `{}` gives `6sCtVSRQjU9+2/af8gdwUAvY1l6Ii6ENcbRfanPkhY0=`. Body `{"customer_id":"78c99d71-f28f-47a9-8302-93b286efbe0e","amount":100.5,"currency":"INR","meta":{"note":"Café","b":2,"a":1}}` gives `l+DvQrzlKbsOSxSYOdWoWHEehcFRZfDJPKlLDkm2cSI=`.

  Deliver:

  1. A typed `createRemitter` function in this codebase's language and HTTP client. Reuse an existing Zapyd client and signer, or write one small shared client.
  2. Config from `ZAPYD_API_KEY`, `ZAPYD_API_SECRET` and `ZAPYD_BASE_URL`. The secret stays on the server, never in a browser or app.
  3. Return `data`. When `status` is false, throw an error with the HTTP status, `err_code`, `message` and `errors`. Don't show raw errors to end users.
  4. Retry only 429 and 5xx: exponential backoff from 1 s, capped at 30 s, at most 5 attempts.
  5. Amounts as strings. Types for every field above.
  6. Tests: the signer against the test vector, and this call against sandbox.

  Reference: `https://docs.zapyd.com/api-reference-exchange/endpoint/kyc/remitter/create.md`
</Prompt>

<Note>
  Creating a remitter is idempotent: submitting the same `id_type` + `id_number` for your organization again returns the stored remitter unchanged, even if other fields (name, date of birth, phone, email, address) differ.
</Note>

<Note>
  `customer_id` is **not** part of this request. A remitter is a standalone record, not a Customer: customer endpoints reject a remitter ID.
</Note>

## Field notes

* `source_of_funds`: one of `salary`, `savings`, `gifts`, `gift_from_family_and_friends`, `business_income`, `investment_proceeds`, `funds_from_dividend_payouts`, `pension_retirement`, `inheritance`, `sale_of_assets_real_estate`, `loan_from_bank`, `final_settlement`, `funds_from_schemes_and_raffles`, `gambling_proceeds`, `other_sources`. Other codes (for example `esops`, `credit_card`, `crypto_currencies`) are rejected.
* The response includes `status`, which is `VERIFIED` on create: the remitter's identity is checked when the payout is fulfilled.
* `id_type`: use `PASSPORT` or `DRIVING_LICENCE`. `BENEFICIARY_ID`, `PAN_CARD`, `AADHAAR_CARD`, `AIRLINE_STAFF_CARD`, `BUSINESS_REGISTRATION_NO_BR`, `CENTRAL_BANK_LICENCE` and `ACRA` are accepted but stored as a generic government ID. Other values are rejected.
* `id_number`: 6–20 characters, letters, digits and `-`.
* `nationality` and `residence_country` must be valid ISO 3166-1 alpha-3 codes. `residence_country` cannot be `IND`: a remitter must live outside India.
* `dob` must be in the past. `phone` must be E.164 (`+` and country code) with a known dial code.
* The remitter is recorded as the sender of each payout, which is why full identity is required.

## Error Codes and Messages

| API Status Code | Response | Reason |
| - | - | - |
| 400 | Bad Request | A required field is missing |
| 400 | Bad Request | `source_of_funds` is not one of the accepted values |
| 400 | Bad Request | `id_type` is not one of the accepted values |
| 400 | Bad Request | `first_name`, `last_name`, or `city` contains unsupported characters |
| 400 | Bad Request | `nationality` or `residence_country` is not a valid alpha-3 code |
| 400 | A remitter must reside outside India. | `residence_country` is `IND` |
| 400 | dob must be in the past. | `dob` is today or in the future |
| 400 | Unsupported country dial code. | `phone` dial code is not recognised |
| 500 | Internal Server Error | Internal Server Error |


## OpenAPI

````yaml POST /kyc/remitter/create
openapi: 3.1.0
info:
  title: Zapyd API
  description: API for Zapyd - Customer, Payout, and Webhook services
  license:
    name: MIT
  version: 1.0.0
servers:
  - url: https://sandbox.zapyd.com/pos/api/v1
    description: Payout API Base URL
    variables:
      base_url:
        default: https://sandbox.zapyd.com
  - url: https://sandbox.zapyd.com/cms/api/v1
    description: Customer API Base URL
    variables:
      base_url:
        default: https://sandbox.zapyd.com
security:
  - ApiKeyAuth: []
    TimestampAuth: []
    SignatureAuth: []
tags:
  - name: Customer
    description: Customer related operations
    x-displayName: Customer
    x-traitTag: true
  - name: Payout
    description: Payout related operations
  - name: Webhooks
    description: Webhook related operations
  - name: Widget
    description: Hosted buy/sell widget session initialization
paths:
  /kyc/remitter/create:
    post:
      tags:
        - KYC
      description: >-
        Create the sender (remitter) of a remittance payout. Idempotent on
        organization + id_type + id_number: a repeat returns the stored remitter
        unchanged, even if other fields differ. A remitter is not a customer;
        pass its id as remitter_id on remittance quotation and initiate, never
        as customer_id.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - first_name
                - last_name
                - nationality
                - city
                - source_of_funds
                - id_type
                - id_number
                - dob
                - phone
                - address_line
                - residence_country
              properties:
                client_reference_id:
                  type: string
                  description: >-
                    Optional client-supplied reference for tracking. Max 255
                    characters.
                  example: remitter-ref-001
                first_name:
                  type: string
                  description: >-
                    Letters, spaces, apostrophes, and hyphens only. 1-100
                    characters.
                  example: Siva
                last_name:
                  type: string
                  description: >-
                    Letters, spaces, apostrophes, and hyphens only. 1-100
                    characters.
                  example: Raj
                nationality:
                  type: string
                  description: ISO 3166-1 alpha-3 country code (validated, uppercased).
                  example: IND
                city:
                  type: string
                  description: >-
                    Letters, spaces, apostrophes, and hyphens only. 2-50
                    characters.
                  example: Sydney
                source_of_funds:
                  type: string
                  description: >-
                    Source of funds. One of the listed codes; others are
                    rejected.
                  enum:
                    - business_income
                    - final_settlement
                    - funds_from_dividend_payouts
                    - funds_from_schemes_and_raffles
                    - gambling_proceeds
                    - gift_from_family_and_friends
                    - gifts
                    - inheritance
                    - investment_proceeds
                    - loan_from_bank
                    - other_sources
                    - pension_retirement
                    - salary
                    - sale_of_assets_real_estate
                    - savings
                  example: gifts
                id_type:
                  type: string
                  description: >-
                    Identity document type. Use PASSPORT or DRIVING_LICENCE; the
                    other values are accepted but stored as a generic government
                    ID.
                  enum:
                    - PASSPORT
                    - DRIVING_LICENCE
                    - BENEFICIARY_ID
                    - PAN_CARD
                    - AADHAAR_CARD
                    - AIRLINE_STAFF_CARD
                    - BUSINESS_REGISTRATION_NO_BR
                    - CENTRAL_BANK_LICENCE
                    - ACRA
                  example: PASSPORT
                id_number:
                  type: string
                  description: '6–20 characters: letters, digits and hyphens.'
                  example: P1234567
                dob:
                  type: string
                  description: Date of birth (YYYY-MM-DD). Must be in the past.
                  example: '1990-01-15'
                  format: date
                phone:
                  type: string
                  description: >-
                    Phone in E.164 format with the leading +. The dial code must
                    be a known country.
                  example: '+61412345678'
                address_line:
                  type: string
                  description: Residential address, max 500 characters
                  example: 1 George Street
                residence_country:
                  type: string
                  description: >-
                    Country of residence, ISO 3166-1 alpha-3. Must not be IND: a
                    remitter must live outside India.
                  example: ARE
                email:
                  type: string
                  description: Email address. Optional.
                  example: siva.raj@example.com
                  format: email
      responses:
        '200':
          description: Remitter created (or existing matching remitter returned)
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: Remitter created
                  data:
                    type: object
                    properties:
                      id:
                        type: string
                        description: >-
                          Remitter ID. Pass as remitter_id on remittance payout
                          requests.
                        example: e14fa86f-2a5e-437a-a031-949c68ade933
                        format: uuid
                      client_reference_id:
                        type:
                          - string
                          - 'null'
                        example: remitter-ref-001
                      first_name:
                        type: string
                        example: Siva
                      last_name:
                        type: string
                        example: Raj
                      full_name:
                        type: string
                        example: Siva Raj
                      email:
                        type:
                          - string
                          - 'null'
                        example: null
                      phone:
                        type: string
                        example: '+61412345678'
                      dob:
                        type: string
                        example: '1990-01-15'
                        format: date
                      nationality:
                        type: string
                        example: IND
                      residence_country:
                        type: string
                        example: ARE
                      city:
                        type: string
                        example: Sydney
                      address_line:
                        type: string
                        example: 1 George Street
                      source_of_funds:
                        type: string
                        example: salary
                      document_type:
                        type: string
                        description: Stored document type
                        example: PASSPORT
                      status:
                        type: string
                        description: >-
                          Remitter status. VERIFIED on create; the remitter's
                          identity is checked when the payout is fulfilled.
                        example: VERIFIED
                        enum:
                          - UNVERIFIED
                          - PROCESSING
                          - VERIFIED
                          - FAILED
                          - MANUAL_REVIEW
                      created_at:
                        type: string
                        example: '2026-09-30T10:00:00+00:00'
                        format: date-time
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: Bad Request
                  err_code:
                    type: string
                    example: REQ_FIELD_MISSING
                  errors:
                    type: object
                    additionalProperties:
                      type: array
                      items:
                        type: string
                    example:
                      id_number:
                        - This field is required.
                  data:
                    type: 'null'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: boolean
                    example: false
                  message:
                    type: string
                    example: Internal Server Error
                  data:
                    type: 'null'
                  err_code:
                    type: string
                    example: SYS_INTERNAL_ERROR
                  errors:
                    type: string
                    example: Unexpected error occurred. Please try again later.
      servers:
        - url: https://sandbox.zapyd.com/cms/api/v1
          description: KYC API Base URL
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-KEY
      description: API Key for authentication
    TimestampAuth:
      type: apiKey
      in: header
      name: X-TIMESTAMP
      description: Current timestamp in seconds since epoch
    SignatureAuth:
      type: apiKey
      in: header
      name: X-SIGNATURE
      description: HMAC SHA256 signature of the request encoded in Base64

````

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