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

# Create outbound transaction (Venezuela)

> Create a USDT payout. `amount` is a positive decimal string, not a JSON number. More than 8 fractional digits are rounded down to 8 and are not rejected.

Required: `accountId`, `amount`, `firstName`, `lastName`, `email`, `documentoIdentidad`, `tipoDocumento`,
`prefijoTelefono`, `numeroTelefono`, `direccion`, `ciudad`, `pais` (`VE`), `banco`, `tipoCuenta`, `numeroCuenta`,
`nombreTitular`, `apellidoTitular`.

Optional: `celular`, `webhookUrl`. `celular` is required when `tipoCuenta` is Pago Móvil (`13`, `Pago Móvil`, or `pago_movil`).

Send `banco`, `tipoCuenta`, and `tipoDocumento` as the catalogue `value` from `GET /ve/banks`. String labels are accepted.
`BANK_VALUE` and `ACCOUNT_TYPE_VALUE` in the example are placeholders for those catalogue values.

`documentoIdentidad` is digits only. The letter belongs in `tipoDocumento` (`V`, `J`, `P`, or `E`). A matching prefix is stripped.

Insufficient balance returns `409` with `{ error, code }` and `code: INSUFFICIENT_NET_BALANCE`.

If the recipient still needs identity verification, the response is `201` with `status: pending_kyc`, `kyc_url` when a URL was stored,
and `kyc_expires_at` (24 hours from create). That amount and its outbound fee stay reserved. The account balance is not debited.
No payout order is created until verification is approved.

Approved verification with a usable bank account returns `201` with `status: processing`.

Declined verification, verification that finished without approval, an email whose document does not match, a rejected document,
or a rejected bank account does not create a transaction and returns `400` with `code`
`VE_KYC_DECLINED`, `VE_KYC_NOT_APPROVED`, `VE_IDENTITY_UNCONFIRMED`, `VE_INVALID_DOCUMENT`,
`VE_INVALID_BANK`, `missing_cuenta_id`, or `missing_terms`.
`missing_cuenta_id` means the payout account could not be saved. Check `numeroCuenta` and retry.
`missing_terms` means the recipient could not be prepared. Retry shortly.
The `error` string says what to fix for a bank-account or document failure.

A missing account returns `404`. No access returns `403`. `Bloqueada` or `Cerrada` returns `403` with `code: ACCOUNT_NOT_OPERATIVE`.
`Restringida` returns `403` with `code: RESTRICTED`.
An unsupported account or a non-USDT currency returns `400`.




## OpenAPI

````yaml /api-reference/openapi.yaml post /ve/transactions/outbound
openapi: 3.1.0
info:
  title: HG.Cash API
  description: >
    # 🚀 HG.Cash Transaction API


    Modern REST API for users to create outbound transactions from their
    accounts.


    ## 🧾 How it works


    - We assign accounts to your user in HG.Cash

    - When these accounts have transactions (inbound or outbound), HG.Cash will
    notify your backend using the webhook URL you configure in the HG.Cash
    dashboard

    - **Webhook signature (HMAC)**: In account settings you can generate a
    signing secret. When configured, each webhook POST includes the header
    `X-HG-Webhook-Signature: sha256=<hex>` where the value is HMAC-SHA256 of the
    raw JSON body using your secret. Verify this in your endpoint to ensure the
    request is authentic.

    - To create cash-outs (money leaving your accounts), you must call the
    **Cash Out** endpoint: **Create Transaction Request (Cash Out)** (`POST
    /transactions`)


    ## 📊 Getting Started


    1. **Generate your API token** in the account settings page

    2. **Test endpoints** using the interactive documentation below

    3. **Implement** in your backend services (never expose tokens in frontend)

    4. **Monitor** your integration and handle errors appropriately


    ## 🔐 Authentication


    This API uses **Bearer Token** authentication. Include your user API token
    in the Authorization header, for example `Authorization: Bearer
    cash_your_token_here`.


    ## ⚠️ Important Security Notes


    - Never share or expose your user API authentication token

    - Store tokens securely on your backend servers only

    - All API calls must be made from secure backend services

    - Contact administrators immediately if your token is compromised
  version: 1.0.0
  contact:
    name: HG.Cash API Support
    email: api-support@hg.cash
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT
servers:
  - url: https://hg.cash/api/v1
    description: Production server
  - url: http://dev.hg.cash/api/v1
    description: Development server
security:
  - bearerAuth: []
tags:
  - name: Transactions
    description: >-
      Transaction Management - Create and manage transactions in the HG.Cash
      system. All transaction endpoints require authentication.
  - name: Accounts
    description: >-
      Accounts - Retrieve account information and balances for the authenticated
      user. All account endpoints require authentication.
  - name: Reference Data
    description: >-
      Reference Data - Get reference data like transaction statuses and types.
      These endpoints require authentication.
  - name: Webhooks
    description: Webhooks - Event notifications sent to your HTTP endpoint.
  - name: Brazil
    description: >-
      Transaction management - Create and manage transactions in Pix system for
      Brazil operations
  - name: Chile
    description: Hosted checkout and bank payouts for Chile (CLP)
  - name: Bolivia
    description: QR cash-in and ACH payouts for Bolivia (BOB)
  - name: Colombia
    description: >-
      Hosted checkout cash-in and bank, Bre-B key, or Bre-B QR payouts for
      Colombia (COP)
  - name: Venezuela
    description: USDT cash-in and payouts for Venezuela
  - name: Checkouts
    description: Hosted checkout sessions for AR, BR, CL, BO, and CO
  - name: Claims
    description: Dispute claims with transfer receipt evidence
paths:
  /ve/transactions/outbound:
    post:
      tags:
        - Venezuela
      summary: Create outbound transaction (Venezuela)
      description: >
        Create a USDT payout. `amount` is a positive decimal string, not a JSON
        number. More than 8 fractional digits are rounded down to 8 and are not
        rejected.


        Required: `accountId`, `amount`, `firstName`, `lastName`, `email`,
        `documentoIdentidad`, `tipoDocumento`,

        `prefijoTelefono`, `numeroTelefono`, `direccion`, `ciudad`, `pais`
        (`VE`), `banco`, `tipoCuenta`, `numeroCuenta`,

        `nombreTitular`, `apellidoTitular`.


        Optional: `celular`, `webhookUrl`. `celular` is required when
        `tipoCuenta` is Pago Móvil (`13`, `Pago Móvil`, or `pago_movil`).


        Send `banco`, `tipoCuenta`, and `tipoDocumento` as the catalogue `value`
        from `GET /ve/banks`. String labels are accepted.

        `BANK_VALUE` and `ACCOUNT_TYPE_VALUE` in the example are placeholders
        for those catalogue values.


        `documentoIdentidad` is digits only. The letter belongs in
        `tipoDocumento` (`V`, `J`, `P`, or `E`). A matching prefix is stripped.


        Insufficient balance returns `409` with `{ error, code }` and `code:
        INSUFFICIENT_NET_BALANCE`.


        If the recipient still needs identity verification, the response is
        `201` with `status: pending_kyc`, `kyc_url` when a URL was stored,

        and `kyc_expires_at` (24 hours from create). That amount and its
        outbound fee stay reserved. The account balance is not debited.

        No payout order is created until verification is approved.


        Approved verification with a usable bank account returns `201` with
        `status: processing`.


        Declined verification, verification that finished without approval, an
        email whose document does not match, a rejected document,

        or a rejected bank account does not create a transaction and returns
        `400` with `code`

        `VE_KYC_DECLINED`, `VE_KYC_NOT_APPROVED`, `VE_IDENTITY_UNCONFIRMED`,
        `VE_INVALID_DOCUMENT`,

        `VE_INVALID_BANK`, `missing_cuenta_id`, or `missing_terms`.

        `missing_cuenta_id` means the payout account could not be saved. Check
        `numeroCuenta` and retry.

        `missing_terms` means the recipient could not be prepared. Retry
        shortly.

        The `error` string says what to fix for a bank-account or document
        failure.


        A missing account returns `404`. No access returns `403`. `Bloqueada` or
        `Cerrada` returns `403` with `code: ACCOUNT_NOT_OPERATIVE`.

        `Restringida` returns `403` with `code: RESTRICTED`.

        An unsupported account or a non-USDT currency returns `400`.
      operationId: createVeOutboundTransaction
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - accountId
                - amount
                - firstName
                - lastName
                - email
                - documentoIdentidad
                - tipoDocumento
                - prefijoTelefono
                - numeroTelefono
                - direccion
                - ciudad
                - pais
                - banco
                - tipoCuenta
                - numeroCuenta
                - nombreTitular
                - apellidoTitular
              properties:
                accountId:
                  type: string
                  format: uuid
                  example: YOUR_ACCOUNT_UUID
                amount:
                  $ref: '#/components/schemas/VenezuelaUsdtAmount'
                firstName:
                  type: string
                  example: Ada
                lastName:
                  type: string
                  example: Example
                email:
                  type: string
                  format: email
                  example: payer@example.com
                documentoIdentidad:
                  type: string
                  example: '00000000'
                tipoDocumento:
                  type: string
                  description: Catalogue `value` from `country.documentTypes`.
                  example: V
                prefijoTelefono:
                  type: string
                  example: '+58'
                numeroTelefono:
                  type: string
                  example: '0000000000'
                direccion:
                  type: string
                  example: Example street
                ciudad:
                  type: string
                  example: Example city
                pais:
                  type: string
                  enum:
                    - VE
                banco:
                  description: >-
                    Catalogue `value` from `country.banks`. Placeholder
                    `BANK_VALUE`.
                  oneOf:
                    - type: string
                    - type: integer
                      minimum: 1
                  example: BANK_VALUE
                tipoCuenta:
                  description: >-
                    Catalogue `value` from `country.accountTypes`. Placeholder
                    `ACCOUNT_TYPE_VALUE`. `celular` is required for Pago Móvil
                    (`13`, `Pago Móvil`, or `pago_movil`).
                  oneOf:
                    - type: string
                    - type: integer
                      minimum: 1
                  example: ACCOUNT_TYPE_VALUE
                numeroCuenta:
                  type: string
                  example: '00000000000000000000'
                nombreTitular:
                  type: string
                  example: Ada
                apellidoTitular:
                  type: string
                  example: Example
                celular:
                  type: string
                  description: Required for Pago Móvil. Placeholder `+580000000000`.
                  example: '+580000000000'
                webhookUrl:
                  type: string
                  format: uri
            example:
              accountId: YOUR_ACCOUNT_UUID
              amount: '25.5'
              firstName: Ada
              lastName: Example
              email: payer@example.com
              documentoIdentidad: '00000000'
              tipoDocumento: V
              prefijoTelefono: '+58'
              numeroTelefono: '0000000000'
              direccion: Example street
              ciudad: Example city
              pais: VE
              banco: BANK_VALUE
              tipoCuenta: ACCOUNT_TYPE_VALUE
              numeroCuenta: '00000000000000000000'
              nombreTitular: Ada
              apellidoTitular: Example
      responses:
        '201':
          description: >-
            `processing` when verification is approved and a bank account is
            usable. `pending_kyc` when verification is still required. The
            amount and outbound fee stay reserved. The balance is not debited
            and no payout order is created until verification is approved.
            `kyc_expires_at` is 24 hours from create.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VenezuelaOutboundCreated'
              examples:
                processing:
                  summary: Payout accepted
                  value:
                    id: 550e8400-e29b-41d4-a716-446655440000
                    status: processing
                pending_kyc:
                  summary: Held for identity verification
                  value:
                    id: 550e8400-e29b-41d4-a716-446655440000
                    status: pending_kyc
                    kyc_url: https://example.com/verify
                    kyc_expires_at: '2026-01-02T00:00:00.000Z'
        '400':
          description: >-
            Validation failed, the account is not a Venezuela USDT account, or
            the recipient was rejected before a transaction was created.
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/VenezuelaValidationError'
                  - $ref: '#/components/schemas/VenezuelaPreflightError'
                  - type: object
                    required:
                      - error
                    properties:
                      error:
                        type: string
              examples:
                kyc_declined:
                  value:
                    error: >-
                      The recipient identity verification was declined. This
                      payout was not created.
                    code: VE_KYC_DECLINED
                kyc_not_approved:
                  value:
                    error: >-
                      The recipient completed identity verification but it was
                      not approved. This payout was not created.
                    code: VE_KYC_NOT_APPROVED
                identity:
                  value:
                    error: The document does not match the email.
                    code: VE_IDENTITY_UNCONFIRMED
                invalid_document:
                  value:
                    error: >-
                      Send digits only. The letter belongs in tipoDocumento (V,
                      J, P, or E). A matching prefix such as V- is removed.
                    code: VE_INVALID_DOCUMENT
                invalid_bank:
                  value:
                    error: >-
                      The payout account was rejected. Check banco, tipoCuenta,
                      numeroCuenta, and the account holder name and identity
                      document, then retry.
                    code: VE_INVALID_BANK
                missing_cuenta_id:
                  value:
                    error: >-
                      The payout account could not be saved. Check numeroCuenta
                      and retry.
                    code: missing_cuenta_id
                missing_terms:
                  value:
                    error: The recipient could not be prepared. Retry shortly.
                    code: missing_terms
        '401':
          description: Unauthorized
        '403':
          description: >-
            No access, the account is `Bloqueada` or `Cerrada`, or the account
            is `Restringida`
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    required:
                      - error
                    properties:
                      error:
                        type: string
                  - type: object
                    required:
                      - error
                      - code
                    properties:
                      error:
                        type: string
                      code:
                        type: string
                        enum:
                          - ACCOUNT_NOT_OPERATIVE
                          - RESTRICTED
              examples:
                no_access:
                  value:
                    error: You do not have access to this account
                not_operative:
                  value:
                    error: Account is not operative
                    code: ACCOUNT_NOT_OPERATIVE
                restricted:
                  summary: Account is restricted
                  value:
                    error: Account is restricted
                    code: RESTRICTED
        '404':
          description: Account not found
        '409':
          description: Insufficient net balance for the amount and the outbound fee
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VenezuelaInsufficientNetBalance'
        '500':
          description: >-
            Internal server error. A payout that was stored as `processing` can
            return `Failed to enqueue outbound processing` when dispatch could
            not be queued.
components:
  schemas:
    VenezuelaUsdtAmount:
      type: string
      description: >-
        Positive USDT decimal string. Not a JSON number. More than 8 fractional
        digits are rounded down to 8 and are not rejected. VES amounts are not
        this field.
      pattern: ^\d+(\.\d+)?$
      example: '100.5'
    VenezuelaOutboundCreated:
      type: object
      required:
        - id
        - status
      properties:
        id:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - processing
            - pending_kyc
        kyc_url:
          type: string
          format: uri
          description: Included on `pending_kyc` only when a URL was stored.
        kyc_expires_at:
          type: string
          format: date-time
          description: Present on `pending_kyc`. 24 hours from create.
    VenezuelaValidationError:
      type: object
      required:
        - error
        - details
      properties:
        error:
          type: string
          example: Validation failed
        details:
          type: array
          items:
            type: object
            properties:
              field:
                type: string
              message:
                type: string
    VenezuelaPreflightError:
      type: object
      required:
        - error
        - code
      description: >-
        Returned when a payout or recipient check is rejected before a
        transaction exists. The `error` string says what to fix for a
        bank-account or document failure.
      properties:
        error:
          type: string
        code:
          type: string
          enum:
            - VE_RECIPIENT_DETAILS_REQUIRED
            - VE_IDENTITY_UNCONFIRMED
            - VE_KYC_DECLINED
            - VE_KYC_NOT_APPROVED
            - VE_INVALID_DOCUMENT
            - VE_INVALID_BANK
            - missing_cuenta_id
            - missing_terms
    VenezuelaInsufficientNetBalance:
      type: object
      required:
        - error
        - code
      properties:
        error:
          type: string
          example: Insufficient balance to cover transfer and fee
        code:
          type: string
          enum:
            - INSUFFICIENT_NET_BALANCE
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >
        User API authentication token with format `cash_<64-char-hex>`. Sample
        value
        `cash_16cdc3b6f83c72d9d2680adca4f430962981f6bf32613a129dded0aa060387d2`.

````

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