---
title: "Create Withdrawal"
method: POST
path: "/withdrawals"
tags: ["off-ramping"]
---

# Create Withdrawal

`POST /withdrawals`

Create an off-ramp withdrawal, start backend deposit monitoring, and return wallet execution steps. Direct withdrawals return a Bridge liquidation deposit step. Swap-backed withdrawals prepare the backend swap and return the resulting execution steps.

## Headers

- `Authorization-Signature` string, required

## Request body

- CreateWithdrawalRequest
  - `data` WithdrawalData, required
    - `src` WithdrawalSource, required
      - `id` string, required
      - `name` string, required
      - `ticker` string, required
      - `decimals` integer, required
      - `chain_id` 1 | 10 | 56 | 137 | 8453 | 42161 | 20000000000001 | 30000000000001 | 30000000000002, required
      - `address` string, nullable
      - `image_uri` string, nullable
      - `currency_amount` TokenFiatAmount, required
        - `token` TokenAmount
          - `ui_amount` number, required
          - `raw_amount` string, required
        - `fiat` FiatAmount
          - `amount` number, required
          - `unit` 'USD' | 'EUR', required
    - `dst` WithdrawalDestination, required
      - `bank_account_details` BankAccountDetails, required
        - `id` string, required
        - `account_name` string, nullable
        - `bank_name` string, nullable
        - `account_type` 'us' | 'iban' | 'swift' | 'clabe' | 'pix' | 'gb', required — Bank account rail: us (ACH), iban, swift, clabe, pix, or gb (FPS)
        - `account_owner_type` 'individual' | 'business' — Whether the bank account owner is an individual or business
        - `account_details` AccountDetails, required
          - `bank_name` string, nullable
          - `routing_number` string, nullable
          - `sort_code` string, nullable
          - `account_number` string, required
          - `checking_or_savings` string, nullable
          - `bic` string, nullable
          - `pix_key` string, nullable
        - `currency` 'usd' | 'eur' | 'mxn' | 'brl' | 'gbp', required — Currency used by the external bank account
        - `active` boolean, required
        - `beneficiary_address_valid` boolean, nullable
        - `deactivation_reason` string, nullable
        - `deactivation_details` string, nullable
      - `currency_amount` WithdrawalDestinationCurrencyAmount, required
        - `unit` string, required
    - `payment_rail` 'ach' | 'wire' | 'ach_push' | 'ach_same_day' | 'sepa' | 'spei' | 'pix' | 'swift' | 'faster_payments' | 'fiat_deposit_return', required — Bridge fiat payment rail used for off-ramp withdrawal settlement
    - `liquidation_address_id` string
    - `swap` WithdrawalSwap
      - `required` boolean, required
      - `payorder_id` string
      - `status` 'PENDING' | 'EXPIRED' | 'FAILED' | 'AWAITING_PAYMENT' | 'OPTIMISTIC_CONFIRMED' | 'AWAITING_CONFIRMATION' | 'EXECUTING_ORDER' | 'COMPLETED' | 'REFUNDED' | 'PARTIAL_PAYMENT'
      - `receiving_address` string
      - `deposit_address` string
  - `requires_swap` boolean
  - `sender_address` string, nullable
  - `slippage_bps` integer, nullable

## Response `201`

Withdrawal created with execution steps

- WithdrawalResponse
  - `id` string, required
  - `organization_id` string, required
  - `type` 'OFF_RAMP' | 'ON_RAMP', required
  - `status` 'PENDING' | 'FUNDS_RECEIVED' | 'KYC_PENDING' | 'COMPLETED' | 'FAILED', required
  - `source_transaction_hash` string, nullable
  - `data` WithdrawalData, required
    - `src` WithdrawalSource, required
      - `id` string, required
      - `name` string, required
      - `ticker` string, required
      - `decimals` integer, required
      - `chain_id` 1 | 10 | 56 | 137 | 8453 | 42161 | 20000000000001 | 30000000000001 | 30000000000002, required
      - `address` string, nullable
      - `image_uri` string, nullable
      - `currency_amount` TokenFiatAmount, required
        - `token` TokenAmount
          - `ui_amount` number, required
          - `raw_amount` string, required
        - `fiat` FiatAmount
          - `amount` number, required
          - `unit` 'USD' | 'EUR', required
    - `dst` WithdrawalDestination, required
      - `bank_account_details` BankAccountDetails, required
        - `id` string, required
        - `account_name` string, nullable
        - `bank_name` string, nullable
        - `account_type` 'us' | 'iban' | 'swift' | 'clabe' | 'pix' | 'gb', required — Bank account rail: us (ACH), iban, swift, clabe, pix, or gb (FPS)
        - `account_owner_type` 'individual' | 'business' — Whether the bank account owner is an individual or business
        - `account_details` AccountDetails, required
          - `bank_name` string, nullable
          - `routing_number` string, nullable
          - `sort_code` string, nullable
          - `account_number` string, required
          - `checking_or_savings` string, nullable
          - `bic` string, nullable
          - `pix_key` string, nullable
        - `currency` 'usd' | 'eur' | 'mxn' | 'brl' | 'gbp', required — Currency used by the external bank account
        - `active` boolean, required
        - `beneficiary_address_valid` boolean, nullable
        - `deactivation_reason` string, nullable
        - `deactivation_details` string, nullable
      - `currency_amount` WithdrawalDestinationCurrencyAmount, required
        - `unit` string, required
    - `payment_rail` 'ach' | 'wire' | 'ach_push' | 'ach_same_day' | 'sepa' | 'spei' | 'pix' | 'swift' | 'faster_payments' | 'fiat_deposit_return', required — Bridge fiat payment rail used for off-ramp withdrawal settlement
    - `liquidation_address_id` string
    - `swap` WithdrawalSwap
      - `required` boolean, required
      - `payorder_id` string
      - `status` 'PENDING' | 'EXPIRED' | 'FAILED' | 'AWAITING_PAYMENT' | 'OPTIMISTIC_CONFIRMED' | 'AWAITING_CONFIRMATION' | 'EXECUTING_ORDER' | 'COMPLETED' | 'REFUNDED' | 'PARTIAL_PAYMENT'
      - `receiving_address` string
      - `deposit_address` string
  - `execution` PaymentDataBase
    - `payment_rail` 'CRYPTO' | 'FIAT'
    - `src` QuoteWithCurrency, required
      - `id` string, required
      - `address` string, nullable
      - `chain_id` 1 | 10 | 56 | 137 | 8453 | 42161 | 20000000000001 | 30000000000001 | 30000000000002, required
      - `decimals` integer, required
      - `name` string, required
      - `ticker` string, required
      - `image_uri` string, nullable
      - `price_usd` number, nullable
      - `currency_amount` CurrencyAmount, required
        - `ui_amount` number, required — Approximate numeric amount. Do not use for payment construction; use raw_amount for exact amounts and ui_amount_display for display.
        - `ui_amount_display` string, required
        - `raw_amount` string, required — A big integer represented as a string to preserve precision
        - `value_usd` number, required
      - `amount_out_minimum` CurrencyAmount
        - `ui_amount` number, required — Approximate numeric amount. Do not use for payment construction; use raw_amount for exact amounts and ui_amount_display for display.
        - `ui_amount_display` string, required
        - `raw_amount` string, required — A big integer represented as a string to preserve precision
        - `value_usd` number, required
      - `total` CurrencyAmount, required
        - `ui_amount` number, required — Approximate numeric amount. Do not use for payment construction; use raw_amount for exact amounts and ui_amount_display for display.
        - `ui_amount_display` string, required
        - `raw_amount` string, required — A big integer represented as a string to preserve precision
        - `value_usd` number, required
      - `base` CurrencyAmount, required
        - `ui_amount` number, required — Approximate numeric amount. Do not use for payment construction; use raw_amount for exact amounts and ui_amount_display for display.
        - `ui_amount_display` string, required
        - `raw_amount` string, required — A big integer represented as a string to preserve precision
        - `value_usd` number, required
      - `fees` FeeBreakdown
        - `total_fee` CurrencyAmount, required
          - `ui_amount` number, required — Approximate numeric amount. Do not use for payment construction; use raw_amount for exact amounts and ui_amount_display for display.
          - `ui_amount_display` string, required
          - `raw_amount` string, required — A big integer represented as a string to preserve precision
          - `value_usd` number, required
        - `protocol_fee` CurrencyAmount
          - `ui_amount` number, required — Approximate numeric amount. Do not use for payment construction; use raw_amount for exact amounts and ui_amount_display for display.
          - `ui_amount_display` string, required
          - `raw_amount` string, required — A big integer represented as a string to preserve precision
          - `value_usd` number, required
        - `custom_fee` CurrencyAmount
          - `ui_amount` number, required — Approximate numeric amount. Do not use for payment construction; use raw_amount for exact amounts and ui_amount_display for display.
          - `ui_amount_display` string, required
          - `raw_amount` string, required — A big integer represented as a string to preserve precision
          - `value_usd` number, required
        - `relayer_fee` CurrencyAmount
          - `ui_amount` number, required — Approximate numeric amount. Do not use for payment construction; use raw_amount for exact amounts and ui_amount_display for display.
          - `ui_amount_display` string, required
          - `raw_amount` string, required — A big integer represented as a string to preserve precision
          - `value_usd` number, required
      - `gas` CurrencyAmount
        - `ui_amount` number, required — Approximate numeric amount. Do not use for payment construction; use raw_amount for exact amounts and ui_amount_display for display.
        - `ui_amount_display` string, required
        - `raw_amount` string, required — A big integer represented as a string to preserve precision
        - `value_usd` number, required
    - `dst` CurrencyWithAmount, required
      - `id` string, required
      - `address` string, nullable
      - `chain_id` 1 | 10 | 56 | 137 | 8453 | 42161 | 20000000000001 | 30000000000001 | 30000000000002, required
      - `decimals` integer, required
      - `name` string, required
      - `ticker` string, required
      - `image_uri` string, nullable
      - `price_usd` number, nullable
      - `currency_amount` CurrencyAmount, required
        - `ui_amount` number, required — Approximate numeric amount. Do not use for payment construction; use raw_amount for exact amounts and ui_amount_display for display.
        - `ui_amount_display` string, required
        - `raw_amount` string, required — A big integer represented as a string to preserve precision
        - `value_usd` number, required
      - `amount_out_minimum` CurrencyAmount
        - `ui_amount` number, required — Approximate numeric amount. Do not use for payment construction; use raw_amount for exact amounts and ui_amount_display for display.
        - `ui_amount_display` string, required
        - `raw_amount` string, required — A big integer represented as a string to preserve precision
        - `value_usd` number, required
    - `estimated_duration_seconds` number, nullable
    - `receiving_address` string, required
    - `refund_address` string, nullable
    - `source_tx_hash` string, nullable
    - `destination_tx_hash` string, nullable
    - `refund_tx_hash` string, nullable
    - `refunded_reason` string, nullable
    - `fee_tx_hash` string, nullable
    - `deposit_address` string, required — Use steps
    - `steps` PaymentStep[], required
      - `rail` 'CRYPTO' | 'FIAT', required
      - `kind` 'deposit' | 'transaction' | 'stripe_onramp', required
      - `deposit_address` string — Use data.deposit_address instead
      - `data` union, required
        - DepositStepData
          - `deposit_address` string, required
          - `currency` CurrencyBase, required
            - `address` string, nullable
            - `chain_id` 1 | 10 | 56 | 137 | 8453 | 42161 | 20000000000001 | 30000000000001 | 30000000000002, required
          - `amount` string, required — A big integer represented as a string to preserve precision
        - ChainPaymentData
          - `evm` EVMPaymentData
            - `from` string, required
            - `to` string, required
            - `data` string, required
            - `value` string, required
            - `chainId` integer, required
            - `maxFeePerGas` string
            - `maxPriorityFeePerGas` string
          - `bitcoin` BitcoinPaymentData
            - `psbt` string, required
          - `solana` SolanaPaymentData
            - `transaction` union, required — Serialized Solana transaction object returned by the solana-go SDK.
              - …
          - `sui` SuiPaymentData
            - `transaction` union, required — Serialized Sui transaction object returned by the sui-go-sdk.
              - …
        - StripeOnrampPaymentData
          - `session_id` string, required
          - `stripe_publishable_key` string, required
          - `client_secret` string, required
          - `status` string, required
          - `hosted_url` string, nullable
          - `source_currency` string, nullable
          - `destination_currency` 'btc' | 'eth' | 'pol' | 'sol' | 'usdc', required
          - `destination_network` 'base' | 'ethereum' | 'optimism' | 'polygon' | 'solana', required
          - `destination_amount` string, required
          - `wallet_address` string, required
          - `quote` StripeOnrampQuote
            - `source_currency` string, nullable
            - `source_amount` string, nullable
            - `source_total_amount` string, nullable
            - `destination_currency` 'btc' | 'eth' | 'pol' | 'sol' | 'usdc', required
            - `destination_network` 'base' | 'ethereum' | 'optimism' | 'polygon' | 'solana', required
            - `destination_amount` string, required
            - `exchange_rate` string, nullable
            - `network_fee_amount` string, nullable
            - `transaction_fee_amount` string, nullable
    - `expires_at` string, date-time, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `processed_at` string, nullable

## Other responses

- `401` — Unauthorized
- `404` — Not Found - Organization verification not found
- `422` — Unprocessable Entity - Invalid request body, unsupported rail, or provider error

---

[API](https://skmtc.net/coinvoyage/apis/coinvoyage-api.md) · [All operations](https://skmtc.net/coinvoyage/apis/coinvoyage-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/coinvoyage/coinvoyage-api/versions/29e628200554/schema)
