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

# Initiate KYC (Generate KYC URL)

> Initiate KYC flow for the user. For some countries (e.g. USA), this generates a KYC partner redirect URL dynamically via this API call.

Scope: USD onramp flows only.

For India, use the KYC Widget instead: `https://app.saber.money/kyc?client_id=...&user_id=...&timestamp=...&secret=...`, with `secret` = HMAC-SHA256 of `client_id + timestamp + "sdk" + user_id`. See the [KYC Widget guide](/guides/kyc-and-bank-accounts/user-kyc/01-kyc-widget/), or [KYC Sharing](/api-reference/kyc-and-edd-operations/kyc-sharing/send-user-kyc-data) as the non-widget option.


For `country: "USA"`, the response includes a `status` (`ACTIVE` or `PENDING`) and a redirect `url` for the KYC flow.




## OpenAPI

````yaml openapi-v2.json POST /api/v2/user/kyc/initiate
openapi: 3.1.0
info:
  title: Saber Money API (v2)
  version: v2
  description: >-
    ## Authentication


    There is no standalone API-key auth — every request must be **signed**. An
    API key by itself authenticates nothing. Each call requires four headers
    together: `X-Api-Key` (your key), `X-Signature` (HMAC-SHA256 of `apiKey +
    timestamp` — or `apiKey + timestamp + userId` when `X-User-Id` is required —
    keyed with your API secret), `X-Timestamp` (unix seconds), and
    `X-Request-Id` (any unique string per request). The signature must be
    computed by a client script; there is no way to derive it by hand. Use the
    HMAC Generator flow to compute valid values for manual testing.


    ## Common Authentication Errors


    - **Invalid Client ID**: {"error_code":6092,"message":"X-Client-Id
    invalid","success":false}

    - **Invalid Secret**: {"error_code":6090,"message":"invalid
    secret","success":false}

    - **Timestamp (Older than 10 secs)**:
    {"errors":{"error_code":6093,"text":"timestamp expired"},"success":false}
servers:
  - url: https://api.saber.money
security: []
paths:
  /api/v2/user/kyc/initiate:
    post:
      tags:
        - KYC and EDD Operations
      summary: Initiate KYC (Generate KYC URL)
      description: >
        Initiate KYC flow for the user. For some countries (e.g. USA), this
        generates a KYC partner redirect URL dynamically via this API call.


        Scope: USD onramp flows only.


        For India, use the KYC Widget instead:
        `https://app.saber.money/kyc?client_id=...&user_id=...&timestamp=...&secret=...`,
        with `secret` = HMAC-SHA256 of `client_id + timestamp + "sdk" +
        user_id`. See the [KYC Widget
        guide](/guides/kyc-and-bank-accounts/user-kyc/01-kyc-widget/), or [KYC
        Sharing](/api-reference/kyc-and-edd-operations/kyc-sharing/send-user-kyc-data)
        as the non-widget option.



        For `country: "USA"`, the response includes a `status` (`ACTIVE` or
        `PENDING`) and a redirect `url` for the KYC flow.
      operationId: initiate-kyc-generate-kyc-url-v2
      parameters:
        - name: X-Api-Key
          in: header
          required: true
          description: Your API key (configured in credentials)
          schema:
            type: string
        - name: X-Signature
          in: header
          required: true
          description: >-
            HMAC-SHA256 signature (auto-generated) To test manually: HMAC-SHA256
            of `apiKey + timestamp` (or `apiKey + timestamp + userId` when
            X-User-Id is required), keyed with your API secret. The HMAC
            Generator flow computes this for you.
          schema:
            type: string
        - name: X-Timestamp
          in: header
          required: true
          description: >-
            Unix timestamp in seconds (auto-generated) Unix seconds, e.g.
            `Math.floor(Date.now() / 1000)`. Must match the timestamp used in
            the X-Signature computation.
          schema:
            type: string
        - name: X-Request-Id
          in: header
          required: true
          description: >-
            Unique request identifier (auto-generated) Any unique string per
            request, e.g. a UUID.
          schema:
            type: string
        - name: X-Platform
          in: header
          required: false
          description: Platform identifier (e.g. `android`, `ios`, `web`).
          schema:
            type: string
        - name: X-Real-Ip
          in: header
          required: false
          description: Device IP address.
          schema:
            type: string
        - name: X-Latitude
          in: header
          required: false
          description: Device latitude.
          schema:
            type: string
        - name: X-Longitude
          in: header
          required: false
          description: Device longitude.
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                country:
                  type: string
                  description: >-
                    ISO alpha-3 country code (e.g. `IND`, `USA`). Primary
                    required field.
                first_name:
                  type: string
                  description: User's first name.
                last_name:
                  type: string
                  description: User's last name.
                date_of_birth:
                  type: string
                  description: >-
                    Date of birth in `YYYY-MM-DD` format. User must be of legal
                    KYC age.
                address:
                  type: object
                  description: >
                    User's address. If any sub-field is provided, then
                    `address_line1`, `locality`, `city`, `state`, and
                    `postal_code` are all required.
                  properties:
                    address_line1:
                      type: string
                      description: Primary address line.
                    address_line2:
                      type: string
                      description: Secondary address line (optional).
                    locality:
                      type: string
                      description: Locality or neighbourhood.
                    city:
                      type: string
                      description: City name.
                    state:
                      type: string
                      description: State or province code (e.g. `MH`).
                    postal_code:
                      type: string
                      description: Postal / ZIP code.
                    country_iso2:
                      type: string
                      description: ISO alpha-2 country code (e.g. `IN`).
                user_nationality_iso2:
                  type: string
                  description: User's nationality as ISO alpha-2 country code (e.g. `IN`).
              required:
                - country
            example:
              country: USA
              first_name: John
              last_name: Doe
              date_of_birth: '1990-01-15'
              address:
                address_line1: 123 Main St
                address_line2: ''
                locality: Downtown
                city: New York
                state: NY
                postal_code: '10001'
                country_iso2: US
              user_nationality_iso2: US
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  data:
                    type: object
                    properties:
                      status:
                        type: string
                      url:
                        type: string
              example:
                success: true
                data:
                  status: PENDING
                  url: https://partner.kyc-provider.example/session/abc123
        '400':
          description: >-
            `102002`: invalid parameter format; `203005`: invalid date of birth;
            `203006`: underage for KYC; `304001`: invalid country code
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - false
                  errors:
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type:
                            - integer
                            - string
                        text:
                          type: string
              example:
                success: false
                errors:
                  - code: 304001
                    text: invalid country code
        '403':
          description: >-
            `203001`: KYC already initiated; `203002`: KYC already approved;
            `203003`: KYC rejected; `203004`: KYC under review
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - false
                  errors:
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type:
                            - integer
                            - string
                        text:
                          type: string
              example:
                success: false
                errors:
                  - code: 304001
                    text: invalid country code
        '500':
          description: '`109999`: Something went wrong!'
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - false
                  errors:
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type:
                            - integer
                            - string
                        text:
                          type: string
              example:
                success: false
                errors:
                  - code: 304001
                    text: invalid country code

````

## Related topics

- [KYC Partner URL](/user/kyc/partner-url.md)
- [Overview](/user/kyc/overview.md)
- [KYC Widget](/user/kyc/widget.md)
- [Through Saber Widget](/user/bank-account/widget.md)
- [Triggering Limit Upgrade and EDD](/users/limits-edd/widget.md)
