---
title: "Transfer fungible tokens"
method: POST
path: "/v3/blockchain/token/transaction"
tags: ["Fungible Tokens (ERC-20 or compatible)"]
---

# Transfer fungible tokens

`POST /v3/blockchain/token/transaction`

## Request

- Base URL: `https://api.tatum.io`
- URL: `https://api.tatum.io/v3/blockchain/token/transaction`
- Auth: API key in header `x-api-key`

/v3/blockchain/token/transaction

**2 credits per API call**

Transfer a supply of fungible tokens existing in the smart contract (the `contractAddress` parameter in the request body) to the specified blockchain address (the `to` parameter in the request body).  
Transferring fungible tokens invokes the `transfer()` method.

This API is supported for the following blockchains:

*   Algorand
*   BNB Smart Chain
*   Celo
*   Ethereum
*   Harmony
*   Klaytn
*   KuCoin Community Chain
*   Polygon
*   Solana
*   XinFin
*   Flare
*   Cronos
*   Base
*   Avalanche
*   Fantom
*   Optimism

**Transferring fungible tokens on Algorand**  
On Algorand, the recipient has to agree in advance to receive your fungible tokens because Algorand charges users for storing the tokens on their addresses, and an Algorand blockchain address by default does not receive the tokens unless explicitly agreed. Before transferring the fungible tokens, make sure that the recipient [has agreed to receive the NFT](https://apidoc.tatum.io/tag/Algorand#operation/AlgorandBlockchainReceiveAsset) to their address.

**Blockchain-specific APIs to transfer fungible tokens**  
You can also use blockchain-specific APIs for transferring fungible tokens on the following blockchains:

*   [BNB Smart Chain](https://apidoc.tatum.io/tag/BNB-Smart-Chain#operation/BscBlockchainTransfer)
*   [Celo](https://apidoc.tatum.io/tag/Celo#operation/CeloBlockchainTransfer)
*   [Ethereum](https://apidoc.tatum.io/tag/Ethereum#operation/EthBlockchainTransfer)
*   [Harmony](https://apidoc.tatum.io/tag/Harmony#operation/OneBlockchainTransfer)
*   [KuCoin Community Chain](https://apidoc.tatum.io/tag/KuCoin#operation/KcsBlockchainTransfer)
*   [Polygon](https://apidoc.tatum.io/tag/Polygon#operation/PolygonBlockchainTransfer)
*   [XinFin](https://apidoc.tatum.io/tag/XinFin#operation/XdcBlockchainTransfer)

**Signing a transaction**  
When transferring fungible 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).

When transferring a token on Solana blockchain, this call waits for maximum 45 seconds to check whether the transaction was confirmed on chain. If the transaction was successfully added it returns a success response. Otherwise error is returned with a message: "Transaction {##tx\_hash##} has not been confirmed yet. The transaction could still be accepted by the Solana network. We advise to manually check if the transaction has been dropped or accepted before you try to send the transaction again".

## Query parameters

- `testnetType` 'ethereum-sepolia' | 'flare-coston' | 'flare-coston2' | 'flare-songbird': Specifies the testnet type. The default is ethereum-sepolia for Ethereum (ETH) currency and flare-coston for Flare (FLR) currency. Valid testnet types depend on the specified currency.

## Headers

- `x-testnet-type` Schema (unresolved $ref)

## Request body

- union
  - ChainTransferEthErc20
    - `chain` 'ETH' | 'BSC' | 'MATIC' | 'KLAY' | 'XDC' | 'ONE' | 'FLR' | 'CRO' | 'BASE' | 'AVAX' | 'OPTIMISM' | 'FTM', required: The blockchain to work with
    - `to` string, required: The blockchain address to send the fungible tokens to
    - `contractAddress` string, required: The blockchain address of the fungible token smart contract
    - `amount` string, required: The amount of the fungible tokens to be sent
    - `digits` number, required: The number of decimal places that the fungible tokens have; to find out how many decimal places are used in the fungible tokens, check out the <a href="https://apidoc.tatum.io/tag/Blockchain-utils#operation/SCGetContractAddress" target="_blank">smart contract</a>
    - `fromPrivateKey` string, required: The private key of the blockchain address from which the fee will be deducted
    - `nonce` number: The nonce to be set to the transaction; if not present, the last known nonce will be used
    - `fee` CustomFee: The custom defined fee; if not present, will be calculated automatically
      - `gasPrice` string, required: The price for one gas unit (in Gwei)
      - `gasLimit` string, required: The maximum number of gas units that you are willing to spend on processing the transaction at the provided gas price
  - ChainTransferSolanaSpl
    - `chain` 'SOL', required: The blockchain to work with
    - `from` string, required: The blockchain address to send the fungible tokens from
    - `to` string, required: The blockchain address to send the fungible tokens to
    - `contractAddress` string, required: The blockchain address of the fungible tokens
    - `amount` string, required: The amount of the fungible tokens to be sent
    - `digits` number, required: The number of decimal places that the fungible tokens have
    - `fromPrivateKey` string, required: The private key of the blockchain address that you are sending the fungible tokens from (the address that you specified in the <code>from</code> parameter); the transaction fee will be deducted from this address. Key must be in the Base58 format!
    - `feePayer` string: The blockchain address from which the fee will be deducted; if not set, defaults to the address that you specified in the <code>from</code> parameter
    - `feePayerPrivateKey` string: The private key of the blockchain address that you specified in the <code>feePayer</code> parameter; if not set, defaults to the private key that you specified in the <code>fromPrivateKey</code> parameter. Key must be in the Base58 format!
  - ChainTransferBscBep20
    - `chain` 'BSC', required: The blockchain to work with
    - `to` string, required: The blockchain address to send the fungible tokens to
    - `contractAddress` string, required: The blockchain address of the fungible tokens
    - `amount` string, required: The amount of the fungible tokens to be sent
    - `digits` number, required: The number of decimal places that the fungible tokens have; to find out how many decimal places are used in the fungible tokens, check out the <a href="https://apidoc.tatum.io/tag/Blockchain-utils#operation/SCGetContractAddress" target="_blank">smart contract</a>
    - `fromPrivateKey` string, required: The private key of the blockchain address from which the fee will be deducted
    - `nonce` number: The nonce to be set to the transaction; if not present, the last known nonce will be used
    - `fee` CustomFee: The custom defined fee; if not present, will be calculated automatically
      - `gasPrice` string, required: The price for one gas unit (in Gwei)
      - `gasLimit` string, required: The maximum number of gas units that you are willing to spend on processing the transaction at the provided gas price
  - ChainTransferCeloErc20Token
    - `chain` 'CELO', required: The blockchain to work with
    - `to` string, required: The blockchain address to send the fungible tokens to
    - `contractAddress` string, required: The blockchain address of the fungible token smart contract
    - `amount` string, required: The amount of the fungible tokens to be sent
    - `digits` number, required: The number of decimal places that the fungible tokens have; to find out how many decimal places are used in the fungible tokens, check out the <a href="https://apidoc.tatum.io/tag/Blockchain-utils#operation/SCGetContractAddress" target="_blank">smart contract</a>
    - `fromPrivateKey` string, required: The private key of the blockchain address from which the fee will be deducted
    - `nonce` number: The nonce to be set to the transaction; if not present, the last known nonce will be used
    - `feeCurrency` 'CELO' | 'CUSD' | 'CEUR', required: The currency in which the transaction fee will be paid
    - `fee` CustomFee: The custom defined fee; if not present, will be calculated automatically
      - `gasPrice` string, required: The price for one gas unit (in Gwei)
      - `gasLimit` string, required: The maximum number of gas units that you are willing to spend on processing the transaction at the provided gas price
  - ChainTransferAlgoErc20
    - `chain` 'ALGO', required: The blockchain to work with
    - `to` string, required: The blockchain address to send the fungible tokens to
    - `contractAddress` string, required: The asset ID (the ID of the fungible tokens)
    - `amount` string, required: The amount of the fungible tokens to be sent
    - `digits` number, required: The number of decimal places that the fungible tokens have
    - `fromPrivateKey` string, required: The private key of the blockchain address from which the fee will be deducted
    - `fee` string: The transaction fee in Algos
  - ChainTransferKcsEthErc20
    - `chain` 'KCS', required: The blockchain to work with
    - `to` string, required: The blockchain address to send the fungible tokens to
    - `contractAddress` string, required: The blockchain address of the fungible token smart contract
    - `amount` string, required: The amount of the fungible tokens to be sent
    - `digits` number, required: The number of decimal places that the fungible tokens have
    - `fromPrivateKey` string, required: The private key of the blockchain address from which the fee will be deducted
    - `nonce` number: The nonce to be set to the transaction; if not present, the last known nonce will be used
    - `fee` CustomFee: The custom defined fee; if not present, will be calculated automatically
      - `gasPrice` string, required: The price for one gas unit (in Gwei)
      - `gasLimit` string, required: The maximum number of gas units that you are willing to spend on processing the transaction at the provided gas price
  - ChainTransferEthErc20KMS
    - `chain` 'ETH' | 'BSC' | 'MATIC' | 'KLAY' | 'XDC' | 'ONE', required: The blockchain to work with
    - `to` string, required: The blockchain address to send the fungible tokens to
    - `contractAddress` string, required: The blockchain address of the fungible token smart contract
    - `amount` string, required: The amount of the fungible tokens to be sent
    - `digits` number, required: The number of decimal places that the fungible tokens have; to find out how many decimal places are used in the fungible tokens, check out the <a href="https://apidoc.tatum.io/tag/Blockchain-utils#operation/SCGetContractAddress" target="_blank">smart contract</a>
    - `signatureId` string, uuid, required: The KMS identifier of the private key of the blockchain address from which the fee will be deducted
    - `index` number: (Only if the signature ID is mnemonic-based) The index of the address from which the fee will be deducted that was generated from the mnemonic
    - `nonce` number: The nonce to be set to the transaction; if not present, the last known nonce will be used
    - `fee` CustomFee: The custom defined fee; if not present, will be calculated automatically
      - `gasPrice` string, required: The price for one gas unit (in Gwei)
      - `gasLimit` string, required: The maximum number of gas units that you are willing to spend on processing the transaction at the provided gas price
  - ChainTransferSolanaSplKMS
    - `chain` 'SOL', required: The blockchain to work with
    - `from` string, required: The blockchain address to send the fungible tokens from
    - `to` string, required: The blockchain address to send the fungible tokens to
    - `contractAddress` string, required: The blockchain address of the fungible tokens
    - `amount` string, required: The amount of the fungible tokens to be sent
    - `digits` number, required: The number of decimal places that the fungible tokens have
    - `signatureId` string, uuid, required: The KMS identifier of the private key of the blockchain address that you are sending the fungible tokens from (the address that you specified in the <code>from</code> parameter); the transaction fee will be deducted from this address
    - `feePayer` string: The blockchain address from which the fee will be deducted; if not set, defaults to the address that you specified in the <code>from</code> parameter
    - `feePayerSignatureId` string, uuid: The KMS identifier of the private key of the blockchain address that you specified in the <code>feePayer</code> parameter; if not set, defaults to the signature ID that you specified in the <code>signatureId</code> parameter
  - ChainTransferBscBep20KMS
    - `chain` 'BSC', required: The blockchain to work with
    - `to` string, required: The blockchain address to send the fungible tokens to
    - `contractAddress` string, required: The blockchain address of the fungible tokens
    - `amount` string, required: The amount of the fungible tokens to be sent
    - `digits` number, required: The number of decimal places that the fungible tokens have; to find out how many decimal places are used in the fungible tokens, check out the <a href="https://apidoc.tatum.io/tag/Blockchain-utils#operation/SCGetContractAddress" target="_blank">smart contract</a>
    - `signatureId` string, uuid, required: The KMS identifier of the private key of the blockchain address from which the fee will be deducted
    - `nonce` number: The nonce to be set to the transaction; if not present, the last known nonce will be used
    - `fee` CustomFee: The custom defined fee; if not present, will be calculated automatically
      - `gasPrice` string, required: The price for one gas unit (in Gwei)
      - `gasLimit` string, required: The maximum number of gas units that you are willing to spend on processing the transaction at the provided gas price
  - ChainTransferCeloErc20TokenKMS
    - `chain` 'CELO', required: The blockchain to work with
    - `to` string, required: The blockchain address to send the fungible tokens to
    - `contractAddress` string, required: The blockchain address of the fungible token smart contract
    - `amount` string, required: The amount of the fungible tokens to be sent
    - `digits` number, required: The number of decimal places that the fungible tokens have; to find out how many decimal places are used in the fungible tokens, check out the <a href="https://apidoc.tatum.io/tag/Blockchain-utils#operation/SCGetContractAddress" target="_blank">smart contract</a>
    - `signatureId` string, uuid, required: The KMS identifier of the private key of the blockchain address from which the fee will be deducted
    - `nonce` number: The nonce to be set to the transaction; if not present, the last known nonce will be used
    - `feeCurrency` 'CELO' | 'CUSD' | 'CEUR', required: The currency in which the transaction fee will be paid
    - `fee` CustomFee: The custom defined fee; if not present, will be calculated automatically
      - `gasPrice` string, required: The price for one gas unit (in Gwei)
      - `gasLimit` string, required: The maximum number of gas units that you are willing to spend on processing the transaction at the provided gas price
  - ChainTransferAlgoErc20KMS
    - `chain` 'ALGO', required: The blockchain to work with
    - `to` string, required: The blockchain address to send the fungible tokens to
    - `from` string, required: The blockchain address to send the fungible tokens from
    - `contractAddress` string, required: The asset ID (the ID of the fungible tokens)
    - `amount` string, required: The amount of the fungible tokens to be sent
    - `digits` number: The number of decimal places that the fungible tokens have
    - `signatureId` string, uuid, required: Identifier of the private key associated in signing application. Private key, or signature Id must be present.
    - `index` number: If signatureId is mnemonic-based, this is the index to the specific address from that mnemonic.
    - `fee` string: The transaction fee in Algos
  - ChainTransferKcsEthErc20KMS
    - `chain` 'KCS', required: The blockchain to work with
    - `to` string, required: The blockchain address to send the fungible tokens to
    - `contractAddress` string, required: The blockchain address of the fungible token smart contract
    - `amount` string, required: The amount of the fungible tokens to be sent
    - `digits` number, required: The number of decimal places that the fungible tokens have
    - `signatureId` string, uuid, required: The KMS identifier of the private key of the blockchain address from which the fee will be deducted
    - `nonce` number: The nonce to be set to the transaction; if not present, the last known nonce will be used
    - `fee` CustomFee: The custom defined fee; if not present, will be calculated automatically
      - `gasPrice` string, required: The price for one gas unit (in Gwei)
      - `gasLimit` string, required: The maximum number of gas units that you are willing to spend on processing the transaction at the provided gas price

## Response `200`

OK

- union
  - TransactionHash
    - `txId` string, required: The hash (ID) of the transaction
  - SignatureId
    - `signatureId` string, uuid, required: The internal Tatum ID of the prepared transaction for Key Management Sysytem (KMS) to sign<br/>This is different from the <code>signatureId</code> parameter that you provided in the request body. The <code>signatureId</code> parameter in the request body specifies the signature ID associated with the private key in KMS.

## 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 perform the 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/smart-contracts.md) - [All operations](https://skmtc.dev/tatum/apis/smart-contracts/llms.txt) - [OpenAPI document](https://skmtc.dev/tatum/apis/smart-contracts/revisions/c0146043bb37?raw)
