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

# Create Withdrawal

> Creates a withdrawal: moves funds from one of the user's wallets (`originId`) to a registered destination, converting between assets when needed (for example USDC → COP to a bank account).

#### Request

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| Authorization | Header | Yes | `Bearer <access_token>` obtained from **POST /api/v1/client/token**. |
| user_id | Path | Yes | User who owns the funds. |

#### Request Body

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| amount | number | Yes | Amount to withdraw, in `symbolOrigin`. |
| originId | uuid | Yes | Wallet the funds come from (`walletId` from **GET /admin/wallets/&#123;user_id&#125;**). |
| destinationId | uuid | No | Registered, `APPROVED` bank account or wallet that receives the funds. |
| symbolOrigin | string | No | Asset debited (e.g. `USDC`, `COPM`). |
| symbolDestination | string | No | Asset delivered (e.g. `COP`, `USD`). |
| paymentMethod | string | No | Rail: `BANK_TRANSFER`, `BREB`, `ACH`, `WIRE`, `SWIFT` or `ACH_WIRE`. Defaults to `PSE`. |
| executionMode | string | No | `NORMAL` (default, `amount` is what you send) or `INVERSE` (`amount` is what the destination receives). |
| quoteId | uuid | No | Quote from **POST /admin/operations/custodian-quote** to lock its rate. |
| currency | string | No | Fiat currency of the destination. |
| developerFee | number | No | Additional fee you charge your user. |

#### Response

The response is an envelope with three keys:

| Field | Description |
| --- | --- |
| operation | The created operation: `id`, `userId`, `numberCode`, `originId`, `destinationId`, `symbolOrigin`, `symbolDestination`, `amountOrigin`, `amountDestination`, `rate`, `paymentMethod`, `status`, `direction`, `registerDate`, `depositInstructions`, `treasuryItems` (cost breakdown) and `events`. |
| tierEscalation | `null` when the operation fits the user's current compliance tier. Otherwise it describes the action the user must complete to raise their limits (`actionType`: `FORM_URL`, `QR_APP`, `VIDEO_KYC`, `DOC_UPLOAD`, `NOTIFY_ONLY` or `BLOCK`, plus `actionPayload`, `message` and `expiresAt`). |
| depositInfo | Present when the user has to send funds: `paymentMethod`, the applied `quote` and the `depositInstructions`. `null` otherwise. |

#### Errors

| Status | When |
| --- | --- |
| 400 | Insufficient funds in the origin. |
| 403 | The user does not exist or is not `APPROVED`. |
| 422 | Invalid body, amount ≤ 0, asset pair not enabled for your account, destination not registered/approved/owned by the user, or the operation exceeds the user's compliance tier limits. |



## OpenAPI

````yaml /stack/openapi.json post /api/v1/admin/operation/{user_id}/withdrawal
openapi: 3.1.0
info:
  title: Kravata Stack API
  version: '2.0'
  description: >-
    Kravata Stack API: users, accounts, custody wallets, liquidity ramps and
    fiat payments.
servers:
  - url: https://test-api-kore.kravata.co
    description: Test
  - url: https://partners-api.kravata.co
    description: Production (mTLS + IP allowlist)
security:
  - bearerAuth: []
tags:
  - name: Authentication
  - name: Users
  - name: Accounts
  - name: Earn
  - name: Custody
  - name: Liquidity Ramps
  - name: Payments
  - name: Webhooks
paths:
  /api/v1/admin/operation/{user_id}/withdrawal:
    post:
      tags:
        - Liquidity Ramps
      summary: Create Withdrawal
      description: >-
        Creates a withdrawal: moves funds from one of the user's wallets
        (`originId`) to a registered destination, converting between assets when
        needed (for example USDC → COP to a bank account).


        #### Request


        | Field | Type | Required | Description |

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

        | Authorization | Header | Yes | `Bearer <access_token>` obtained from
        **POST /api/v1/client/token**. |

        | user_id | Path | Yes | User who owns the funds. |


        #### Request Body


        | Field | Type | Required | Description |

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

        | amount | number | Yes | Amount to withdraw, in `symbolOrigin`. |

        | originId | uuid | Yes | Wallet the funds come from (`walletId` from
        **GET /admin/wallets/&#123;user_id&#125;**). |

        | destinationId | uuid | No | Registered, `APPROVED` bank account or
        wallet that receives the funds. |

        | symbolOrigin | string | No | Asset debited (e.g. `USDC`, `COPM`). |

        | symbolDestination | string | No | Asset delivered (e.g. `COP`, `USD`).
        |

        | paymentMethod | string | No | Rail: `BANK_TRANSFER`, `BREB`, `ACH`,
        `WIRE`, `SWIFT` or `ACH_WIRE`. Defaults to `PSE`. |

        | executionMode | string | No | `NORMAL` (default, `amount` is what you
        send) or `INVERSE` (`amount` is what the destination receives). |

        | quoteId | uuid | No | Quote from **POST
        /admin/operations/custodian-quote** to lock its rate. |

        | currency | string | No | Fiat currency of the destination. |

        | developerFee | number | No | Additional fee you charge your user. |


        #### Response


        The response is an envelope with three keys:


        | Field | Description |

        | --- | --- |

        | operation | The created operation: `id`, `userId`, `numberCode`,
        `originId`, `destinationId`, `symbolOrigin`, `symbolDestination`,
        `amountOrigin`, `amountDestination`, `rate`, `paymentMethod`, `status`,
        `direction`, `registerDate`, `depositInstructions`, `treasuryItems`
        (cost breakdown) and `events`. |

        | tierEscalation | `null` when the operation fits the user's current
        compliance tier. Otherwise it describes the action the user must
        complete to raise their limits (`actionType`: `FORM_URL`, `QR_APP`,
        `VIDEO_KYC`, `DOC_UPLOAD`, `NOTIFY_ONLY` or `BLOCK`, plus
        `actionPayload`, `message` and `expiresAt`). |

        | depositInfo | Present when the user has to send funds:
        `paymentMethod`, the applied `quote` and the `depositInstructions`.
        `null` otherwise. |


        #### Errors


        | Status | When |

        | --- | --- |

        | 400 | Insufficient funds in the origin. |

        | 403 | The user does not exist or is not `APPROVED`. |

        | 422 | Invalid body, amount ≤ 0, asset pair not enabled for your
        account, destination not registered/approved/owned by the user, or the
        operation exceeds the user's compliance tier limits. |
      operationId: create-withdrawal
      parameters:
        - name: user_id
          in: path
          required: true
          description: ''
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                amount:
                  type: integer
                symbolOrigin:
                  type: string
                symbolDestination:
                  type: string
                paymentMethod:
                  type: string
                originId:
                  type: string
                destinationId:
                  type: string
            example:
              amount: 30000
              symbolOrigin: COPM
              symbolDestination: COP
              paymentMethod: BANK_TRANSFER
              originId: '{{wallet_id}}'
              destinationId: '{{destination_account_id}}'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  operation:
                    type: object
                    properties:
                      id:
                        type: string
                      userId:
                        type: string
                      type:
                        type: string
                      custodyType:
                        type: string
                      prefix:
                        type: string
                      numberCode:
                        type: integer
                      originId:
                        type: string
                      destinationId:
                        type: string
                      symbolOrigin:
                        type: string
                      symbolDestination:
                        type: string
                      amountOrigin:
                        type: integer
                      amountDestination:
                        type: integer
                      rate:
                        type: integer
                      paymentMethod:
                        type: string
                      registerDate:
                        type: string
                      status:
                        type: string
                      direction:
                        type: string
                      depositInstructions: {}
                      metadataItems: {}
                      events: {}
                      treasuryItems:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                            operationId:
                              type: string
                            name:
                              type: string
                            amount:
                              type: integer
                            showClient:
                              type: boolean
                  tierEscalation: {}
              examples:
                operations-withdrawal:
                  summary: operations/withdrawal
                  value:
                    operation:
                      id: 567e0559-2301-42ab-a865-d8763dea3888
                      userId: c9a26b49-7b71-44e5-8fdf-03ec6a2a7267
                      type: CUSTODY
                      custodyType: SELF_CUSTODY
                      prefix: NPO
                      numberCode: 96545
                      originId: 5c3fa520-adbb-49aa-a95b-018c13db79e3
                      destinationId: dfa1bb42-74b7-4dab-b52b-0ec2e26253db
                      symbolOrigin: USDC
                      symbolDestination: USD
                      amountOrigin: 200
                      amountDestination: 175
                      rate: 1
                      paymentMethod: WIRE
                      registerDate: '2026-06-23T09:32:10.944107'
                      status: PENDING
                      direction: WITHDRAWAL
                      depositInstructions: null
                      metadataItems: null
                      events: null
                      treasuryItems:
                        - id: b733d7d8-5162-4dc9-a786-422265d0bfa5
                          operationId: 567e0559-2301-42ab-a865-d8763dea3888
                          name: realRate
                          amount: 1
                          showClient: false
                        - id: 9f9b6abc-09d9-4a78-b4a6-8991f2979be0
                          operationId: 567e0559-2301-42ab-a865-d8763dea3888
                          name: MinAmount
                          amount: 50
                          showClient: false
                        - id: fb0d7a71-739c-40a9-abbc-6089c4149d4c
                          operationId: 567e0559-2301-42ab-a865-d8763dea3888
                          name: CostInfra
                          amount: 25
                          showClient: true
                        - id: e6c08f41-78c2-4c6b-b7e9-f6bbd6fc4f21
                          operationId: 567e0559-2301-42ab-a865-d8763dea3888
                          name: spread
                          amount: 0
                          showClient: false
                        - id: 842f57f1-44aa-46ea-84ea-2b5c8524135a
                          operationId: 567e0559-2301-42ab-a865-d8763dea3888
                          name: calculateRate
                          amount: 1
                          showClient: true
                        - id: 85c17fc1-aaed-4351-be64-1046dedd867b
                          operationId: 567e0559-2301-42ab-a865-d8763dea3888
                          name: amountReceive
                          amount: 175
                          showClient: true
                    tierEscalation: null
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Access token from POST /api/v1/client/token.

````