---
title: "Store withdrawal"
method: POST
path: "/v3/offchain/withdrawal"
tags: ["Withdrawal"]
---

# Store withdrawal

`POST /v3/offchain/withdrawal`

## Request

- Base URL: `https://api.tatum.io`
- URL: `https://api.tatum.io/v3/offchain/withdrawal`
- Auth: API key in header `x-api-key`

/v3/offchain/withdrawal

#### 2 credits per API call

Create a withdrawal from Tatum Ledger account to the blockchain.

#### BTC, LTC, DOGE, BCH

When withdrawal from Tatum is executed, all deposits, which are not processed yet are used as an input and change is moved to pool address 0 of wallet for defined account's xpub. If there are no unspent deposits, only last pool address 0 UTXO is used. If balance of wallet is not sufficient, it is impossible to perform withdrawal from this account -> funds were transferred to another linked wallet within system or outside of Tatum visibility.  
For the first time of withdrawal from wallet, there must be some deposit made and funds are obtained from that. Since there is no withdrawal, there was no transfer to pool address 0 and thus it is not present in vIn. Pool transfer is identified by missing data.address property in response. When last not cancelled withdrawal is not completed and thus there is no tx id of output transaction given, we cannot perform next withdrawal.

#### ETH

Withdrawal from Tatum can be processed only from 1 account. In Ethereum Blockchain, each address is recognized as an account and only funds from that account can be sent in 1 transaction. Example: Account A has 0.5 ETH, Account B has 0.3 ETH. Account A is linked to Tatum Account 1, Account B is linked to Tatum Account 2. Tatum Account 1 has balance 0.7 Ethereum and Tatum Account 2 has 0.1 ETH. Withdrawal from Tatum Account 1 can be at most 0.5 ETH, even though balance in Tatum Private Ledger is 0.7 ETH. Because of this Ethereum Blockchain limitation, withdrawal request should always contain sourceAddress, from which withdrawal will be made. To get available balances for Ethereum wallet accounts, use hint endpoint.

#### XRP

XRP withdrawal can contain DestinationTag except of address, which is placed in attr parameter of withdrawal request. SourceTag of the blockchain transaction should be withdrawal ID for autocomplete purposes of withdrawals.

#### XLM

XLM withdrawal can contain memo except of address, which is placed in attr parameter of withdrawal request. XLM blockchain does not have possibility to enter source account information. It is possible to create memo in format 'destination|source', which is supported way of memo in Tatum and also there is information about the sender account in the blockchain.

When withdrawal is created, all other withdrawals with the same currency are pending, unless the current one is marked as complete or cancelled.

Tatum ledger transaction is created for every withdrawal request with operation type WITHDRAWAL. The value of the transaction is the withdrawal amount + blockchain fee, which should be paid. In the situation, when there is withdrawal for ERC20, XLM, or XRP based custom assets, the fee is not included in the transaction because it is paid in different assets than the withdrawal itself.

## Request body

- Withdrawal
  - `senderAccountId` string, required: Sender account ID
  - `address` string, required: Blockchain address to send assets to. For BTC, LTC, DOGE and BCH, it is possible to enter list of multiple recipient blockchain addresses as a comma separated string.
  - `amount` string, required: Amount to be withdrawn to blockchain.
  - `attr` string: <p>Used to parametrize withdrawal. Used for XRP withdrawal to define destination tag of recipient, or XLM memo of the recipient, if needed.<br/> For Bitcoin, Litecoin, Bitcoin Cash, used as a change address for left coins from transaction.</p>
  - `compliant` boolean: Compliance check, if withdrawal is not compliant, it will not be processed.
  - `fee` string, required: Fee to be submitted as a transaction fee to blockchain.
  - `multipleAmounts` string[]: For BTC, LTC, DOGE and BCH, it is possible to enter list of multiple recipient blockchain amounts. List of recipient addresses must be present in the address field and total sum of amounts must be equal to the amount field.
  - `paymentId` string: Identifier of the payment, shown for created Transaction within Tatum sender account.
  - `senderNote` string: Note visible to owner of withdrawing account

## Response `200`

OK

- WithdrawalResponse
  - `reference` string: Transaction reference of the transaction connected to this withdrawal.
  - `data` ResponseData[]
    - `address` Address
      - `address` string, required: Blockchain address.
      - `currency` string, required: Currency of generated address. BTC, LTC, DOGE, BCH, ETH, XRP, XLM, TRX, ERC20, TRC20.
      - `derivationKey` integer: Derivation key index for given address.
      - `xpub` string: Extended public key to derive address from. In case of XRP, this is account address, since address is defined as DestinationTag, which is address field. In case of XLM, this is account address, since address is defined as message, which is address field.
      - `destinationTag` number: In case of XRP, destinationTag is the distinguisher of the account.
      - `memo` string: In case of BNB, message is the distinguisher of the account.
      - `message` string: In case of XLM, message is the distinguisher of the account.
    - `amount` number: Amount of unprocessed transaction outputs, that can be used for withdrawal. Bitcoin, Litecoin, Bitcoin Cash only.
    - `vIn` string: Last used unprocessed transaction output, that can be used. Bitcoin, Litecoin, Bitcoin Cash only. If -1, it indicates prepared vOut with amount to be transferred to pool address.
    - `vInIndex` integer: Index of last used unprocessed transaction output in raw transaction, that can be used. Bitcoin, Litecoin, Bitcoin Cash only.
    - `scriptPubKey` string: Script of last unprocessed UTXO. Bitcoin SV only.
  - `id` string: ID of withdrawal

## Other responses

- `400`: Bad Request
- `401`: Unauthorized. Not valid or inactive subscription key present in the HTTP Header.
- `403`: Forbidden. The request is authenticated, but it is not possible to required perform operation due to logical error or invalid permissions.
- `500`: Internal server error. There was an error on the server during the processing of the request.

---

[API](https://skmtc.dev/tatum/apis/virtual-accounts.md) - [All operations](https://skmtc.dev/tatum/apis/virtual-accounts/llms.txt) - [OpenAPI document](https://skmtc.dev/tatum/apis/virtual-accounts/revisions/ba220553084b?raw)
