---
title: "Send ALGO from a virtual account to the blockchain"
method: POST
path: "/v3/offchain/algorand/transfer"
tags: ["Blockchain operations"]
---

# Send ALGO from a virtual account to the blockchain

`POST /v3/offchain/algorand/transfer`

## Request

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

/v3/offchain/algorand/transfer

**4 credits per API call**

Send Algos or ERC-20-equivalent Algorand tokens from a virtual account (even from a virtual account without deposit addresses adssigned) to the Algorand blockchain.

The recipient has to agree in advance to receive assets because Algorand charges users for storing assets on their addresses, and an Algorand blockchain address by default does not receive assets unless explicitly agreed. Before sending any asset from a virtual account to the blockchain, make sure that the recipient [has agreed to receive the assets](https://apidoc.tatum.io/tag/Algorand#operation/AlgorandBlockchainReceiveAsset) to their address.

Sending Algorand assets creates an internal Tatum withdrawal request with an ID. If everything works as expected, the withdrawal request is marked as complete and a transaction ID is assigned to it.

*   If a server connection is unavailable, the withdrawal request is cancelled.
*   If the transfer to the blockchain is successful, but the Tatum infrastructure cannot be accesses, the ID of the blockchain transaction is returned and you have to [complete the withdrawal request manually](https://apidoc.tatum.io/tag/Withdrawal#operation/completeWithdrawal). Otherwise, all other withdrawals will be pending.

**Signing a transaction**  
When sending Algos or ERC-20-equivalent Algorand tokens, you are charged a fee for the transaction, and you must sign the transaction with the private key of the blockchain address from which the fee will be deducted.

Providing the private key in the API is not a secure way of signing transactions, because the private key can be stolen or exposed. Your private keys should never leave your security perimeter. You should use the private keys only for testing a solution you are building on the **testnet** of a blockchain.

For signing transactions on the **mainnet**, we strongly recommend that you use the Tatum [Key Management System (KMS)](https://github.com/tatumio/tatum-kms) and provide the signature ID instead of the private key in the API. Alternatively, you can use the [Tatum JavaScript client](https://github.com/tatumio/tatum-js/tree/v2).

## Request body

- union
  - TransferAlgo
    - `senderAccountId` string, required: The ID of the virtual account to send Algos from
    - `address` string, required: The blockchain address to send Algos to
    - `amount` string, required: The amount to send in Algos
    - `fee` string: The transaction fee in Algos
    - `privateKey` string, required: The secret of the Algorand wallet (account). Secret, or signature Id must be present.
    - `compliant` boolean: Compliance check; if the withdrawal is not compliant, it will not be processed
    - `paymentId` string: The identifier of the Algo transfer that is shown on the virtual account for the created transaction
    - `senderNote` string: The note for the recipient; must not contain spaces
  - TransferAlgoErc20
    - `senderAccountId` string, required: The ID of the virtual account to send the ERC-20-equivalent Algorand tokens from
    - `address` string, required: The blockchain address to send the ERC-20-equivalent Algorand tokens to
    - `amount` string, required: The amount of the ERC-20-equivalent Algorand tokens to send
    - `privateKey` string, required: The secret of the Algorand wallet (account). Secret, or signature Id must be present.
    - `compliant` boolean: Compliance check; if the withdrawal is not compliant, it will not be processed
    - `paymentId` string: The identifier of the token transfer that is shown on the virtual account for the created transaction
    - `senderNote` string: The note for the recipient; must not contain spaces
  - TransferAlgoKMS
    - `senderAccountId` string, required: The ID of the virtual account to send Algos from
    - `address` string, required: The blockchain address to send Algos to
    - `amount` string, required: The amount to send in Algos
    - `fee` string: The transaction fee in Algos
    - `signatureId` string, uuid, required: The identifier of the secret of the Algorand wallet (account) in the signing application. Secret, or signature Id must be present.
    - `index` number: If signatureId is mnemonic-based, this is the index to the specific address from that mnemonic.
    - `from` string, required: The blockchain address of the sender
    - `compliant` boolean: Compliance check; if the withdrawal is not compliant, it will not be processed
    - `paymentId` string: The identifier of the Algo transfer that is shown on the virtual account for the created transaction
    - `senderNote` string: The note for the recipient; must not contain spaces

## Response `200`

OK

- union
  - OffchainTransactionResult
    - `id` string, required: ID of withdrawal. If transaction is not valid in blockchain, use this id to cancel withdrawal.
    - `txId` string, required: TX hash of successful transaction.
    - `completed` boolean, required: If set to "true", the withdrawal has been completed in the virtual account; if set to "false", the withdrawal has not been completed and you have to <a href="https://apidoc.tatum.io/tag/Withdrawal#operation/completeWithdrawal" target="_blank">complete it manually</a>
  - OffchainTransactionSignatureResult
    - `signatureId` string, uuid, required: ID of prepared payment template to sign. This is should be stored on a client side to retrieve ID of the blockchain transaction, when signing application signs the transaction and broadcasts it to the blockchain.

## 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)
