> ## 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 Off-Ramp

> Creates an off-ramp: the user sends stablecoin from a registered external wallet and receives fiat in a registered bank account. The operation starts in `AWAITING_DEPOSIT` until the funds arrive; the deposit instructions are returned in the response.

#### Request

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

#### Request Body

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| amount | number | Yes | Amount of the operation, in `symbolOrigin`. |
| originExternalWalletId | uuid | Yes | Registered external wallet the funds will come from. |
| destinationAccountId | uuid | Yes | Registered, `APPROVED` bank account that receives the fiat. |
| symbolOrigin | string | No | Stablecoin sent (e.g. `USDC`). |
| symbolDestination | string | No | Fiat delivered (e.g. `COP`). |
| paymentMethod | string | No | Rail used to pay out the fiat (e.g. `BANK_TRANSFER`, `BREB`). |
| currency | string | No | Fiat currency of the destination. |
| executionMode | string | No | `NORMAL` (default) or `INVERSE`. |
| 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}/offramp
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}/offramp:
    post:
      tags:
        - Liquidity Ramps
      summary: Create Off-Ramp
      description: >-
        Creates an off-ramp: the user sends stablecoin from a registered
        external wallet and receives fiat in a registered bank account. The
        operation starts in `AWAITING_DEPOSIT` until the funds arrive; the
        deposit instructions are returned in the response.


        #### Request


        | Field | Type | Required | Description |

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

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

        | user_id | Path | Yes | User who sends and receives the funds. |


        #### Request Body


        | Field | Type | Required | Description |

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

        | amount | number | Yes | Amount of the operation, in `symbolOrigin`. |

        | originExternalWalletId | uuid | Yes | Registered external wallet the
        funds will come from. |

        | destinationAccountId | uuid | Yes | Registered, `APPROVED` bank
        account that receives the fiat. |

        | symbolOrigin | string | No | Stablecoin sent (e.g. `USDC`). |

        | symbolDestination | string | No | Fiat delivered (e.g. `COP`). |

        | paymentMethod | string | No | Rail used to pay out the fiat (e.g.
        `BANK_TRANSFER`, `BREB`). |

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

        | executionMode | string | No | `NORMAL` (default) or `INVERSE`. |

        | 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-off-ramp
      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
                originExternalWalletId:
                  type: string
                destinationAccountId:
                  type: string
            example:
              amount: 12
              symbolOrigin: USDC
              symbolDestination: COP
              paymentMethod: BANK_TRANSFER
              originExternalWalletId: '{{external_wallet_id}}'
              destinationAccountId: '{{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.

````