---
updatedAt: 2026-05-27T08:48:31.000Z
agentTools:
  projectIndex: https://docs.tatum.io/llms.txt
---

# Transfer multiple Multi Tokens

<p style="display: none">/v3/multitoken/transaction/batch</p>
<p><b>2 credits per API call</b></p>
<p>Transfer Multi Token Batch from account to various other accounts in one transaction. Transfer multiple Multi Tokens token from smart contract defined in contractAddress.</p>
<p>Multiple token with specified tokenIds and values can be transferred. This method invokes ERC1155 method safeTransfer() to transfer the token in case of ETH, Celo and BSC.</b>
<p>This API is supported for the following blockchains:</p>
<ul>
<li>BNB Smart Chain</li>
<li>Celo</li>
<li>Ethereum</li>
<li>Harmony</li>
<li>Klaytn</li>
<li>KuCoin Community Chain</li>
<li>Polygon</li>
<li>Flare</li>
<li>Cronos</li>
<li>Base</li>
<li>Avalanche</li>
<li>Fantom</li>
<li>Optimism</li>
</ul>
<p><b>Signing a transaction</b></p>
<p>When transferring multiple Multi 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.</p>
<p>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 <b>testnet</b> of a blockchain.</p>
<p>For signing transactions on the <b>mainnet</b>, we strongly recommend that you use the Tatum <a href="https://github.com/tatumio/tatum-kms" target="_blank">Key Management System (KMS)</a> and provide the signature ID instead of the private key in the API. Alternatively, you can use the <a href="https://github.com/tatumio/tatum-js/tree/v2" target="_blank">Tatum JavaScript client</a>.</p>


# OpenAPI definition

```json
{
  "openapi": "3.0.0",
  "servers": [
    {
      "url": "https://api.tatum.io"
    }
  ],
  "info": {
    "version": "1.0.1",
    "title": "SMART CONTRACTS"
  },
  "tags": [
    {
      "description": "<p>A Multi Token combines characteristics of fungible and non-fungible tokens. A single Multi Token smart contract allows you to mint fungible, non-fungible, and semi-fungible tokens and process different types of the tokens in a single transaction. Multi Tokens are described by the ERC-1155 standard on the Ethereum blockchain or by the equivalent standard on the other blockchains.<p/>\n<p>Multi Tokens can be used for nearly any digital asset or good to ensure authenticity and scarcity, for example:<p>\n<ul>\n<li><b>In-game assets:</b> Multi Tokens can be used to create unique collectibles in the form of characters, weapons, skins, or other equipment. Players can resell or trade assets directly as they choose, and their authenticity is easily verifiable.</li>\n<li><b>Music and other digital media:</b> Multi Tokens can be used to create rare and unique collectible digital releases. Similarly, Multi Tokens can be used to sell videos, art, or any other type of digital media. Collectors can own digital originals of their favorite songs, movies, and so on.</li>\n<li><b>Digital sports merchandise:</b> Trading cards, memorabilia, classic moments in sports history, and one-of-a-kind experiences can be sold as Multi Tokens.</li>\n</ul>\n<p>Each Multi Token-related API supports its own set of the blockchains. The list of the supported blockchains is provided in the API description further in this section.</p>\n",
      "name": "Multi Tokens (ERC-1155 or compatible)"
    }
  ],
  "paths": {
    "/v3/multitoken/transaction/batch": {
      "post": {
        "description": "<p style=\"display: none\">/v3/multitoken/transaction/batch</p>\n<p><b>2 credits per API call</b></p>\n<p>Transfer Multi Token Batch from account to various other accounts in one transaction. Transfer multiple Multi Tokens token from smart contract defined in contractAddress.</p>\n<p>Multiple token with specified tokenIds and values can be transferred. This method invokes ERC1155 method safeTransfer() to transfer the token in case of ETH, Celo and BSC.</b>\n<p>This API is supported for the following blockchains:</p>\n<ul>\n<li>BNB Smart Chain</li>\n<li>Celo</li>\n<li>Ethereum</li>\n<li>Harmony</li>\n<li>Klaytn</li>\n<li>KuCoin Community Chain</li>\n<li>Polygon</li>\n<li>Flare</li>\n<li>Cronos</li>\n<li>Base</li>\n<li>Avalanche</li>\n<li>Fantom</li>\n<li>Optimism</li>\n</ul>\n<p><b>Signing a transaction</b></p>\n<p>When transferring multiple Multi 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.</p>\n<p>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 <b>testnet</b> of a blockchain.</p>\n<p>For signing transactions on the <b>mainnet</b>, we strongly recommend that you use the Tatum <a href=\"https://github.com/tatumio/tatum-kms\" target=\"_blank\">Key Management System (KMS)</a> and provide the signature ID instead of the private key in the API. Alternatively, you can use the <a href=\"https://github.com/tatumio/tatum-js/tree/v2\" target=\"_blank\">Tatum JavaScript client</a>.</p>\n",
        "operationId": "TransferMultiTokenBatch",
        "parameters": [
          {
            "$ref": "#/components/parameters/TestnetTypeQuery"
          },
          {
            "$ref": "#/components/parameters/TestnetTypeHeader"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/TransferMultiTokenBatch"
                  },
                  {
                    "$ref": "#/components/schemas/TransferMultiTokenBatchKMS"
                  },
                  {
                    "$ref": "#/components/schemas/TransferMultiTokenBatchCelo"
                  },
                  {
                    "$ref": "#/components/schemas/TransferMultiTokenBatchKMSCelo"
                  }
                ]
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/TransactionHash"
                    },
                    {
                      "$ref": "#/components/schemas/SignatureId"
                    }
                  ]
                }
              }
            },
            "description": "OK"
          },
          "400": {
            "$ref": "#/components/responses/Error400"
          },
          "401": {
            "$ref": "#/components/responses/Error401"
          },
          "403": {
            "description": "Forbidden. The request is authenticated, but it is not possible to required perform operation due to logical error or invalid permissions.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/Error403Celo"
                    }
                  ]
                }
              }
            }
          },
          "500": {
            "$ref": "#/components/responses/Error500"
          }
        },
        "security": [
          {
            "X-API-Key": []
          }
        ],
        "x-codeSamples": [],
        "summary": "Transfer multiple Multi Tokens",
        "tags": [
          "Multi Tokens (ERC-1155 or compatible)"
        ]
      }
    }
  },
  "components": {
    "securitySchemes": {
      "X-API-Key": {
        "type": "apiKey",
        "name": "x-api-key",
        "in": "header",
        "description": "Your **API key** is used to identify your account & your plan, including the number of API calls per second and total monthly calls you have.\n\nEach key is for individual use only.\n\nIf you don't have a key already you can [Sign up for a Free Tatum account](https://co.tatum.io/signup) to get two keys (testnet and mainnet), allowing up to 5 API calls per second and 1,000,000 Credits.\n\nFor testing purposes, you can use the following key which only works inside docs and has limited functionality (e.g. you cannot create virtual accounts or notification subscriptions with it):\n* t-66a730ccccfd17001c479705-2f597d14ad7543f289a03418\n\nFor more details on limits and plans, [click here](https://docs.tatum.io/docs/plans-limits).\n"
      }
    },
    "parameters": {
      "TestnetTypeQuery": {
        "in": "query",
        "name": "testnetType",
        "description": "Type of testnet in query. The default type is based on the currency: ethereum-sepolia for ETH, and flare-coston for FLR. This parameter is valid only for ETH or FLR invocations with a testnet API Key. For mainnet API Key, this value is ignored. The currency/chain must be specified to determine the applicable set of testnet types.",
        "required": false,
        "schema": {
          "type": "string",
          "description": "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.",
          "enum": [
            "ethereum-sepolia",
            "flare-coston",
            "flare-coston2",
            "flare-songbird"
          ]
        }
      },
      "TestnetTypeHeader": {
        "in": "header",
        "name": "x-testnet-type",
        "description": "Type of testnet in header. The default type is based on the currency: ethereum-sepolia for ETH, and flare-coston for FLR. This parameter is valid only for ETH or FLR invocations with a testnet API Key. For mainnet API Key, this value is ignored. The currency/chain must be specified to determine the applicable set of testnet types.",
        "required": false,
        "schema": {
          "$ref": "#/components/parameters/TestnetTypeQuery/schema"
        }
      }
    },
    "responses": {
      "Error400": {
        "description": "Bad Request",
        "content": {
          "application/json": {
            "schema": {
              "properties": {
                "errorCode": {
                  "example": "validation.failed",
                  "description": "validation.failed",
                  "type": "string"
                },
                "message": {
                  "example": "Request validation failed. Please see data for additional information.",
                  "description": "Request validation failed. Please see data for additional information.",
                  "type": "string"
                },
                "statusCode": {
                  "example": 400,
                  "description": "400",
                  "type": "number"
                },
                "data": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "target"
                    ],
                    "properties": {
                      "target": {
                        "type": "object",
                        "additionalProperties": true,
                        "description": "Request object present in the body of the HTTP request",
                        "example": {
                          "property": 12345
                        }
                      },
                      "value": {
                        "type": "number",
                        "description": "Value of the target object which validation is wrong. Can be of any data type, example here is using type number.",
                        "example": 12345
                      },
                      "property": {
                        "type": "string",
                        "description": "Property name of the target object which validation is wrong",
                        "example": "property1"
                      },
                      "constraints": {
                        "type": "object",
                        "additionalProperties": true,
                        "description": "Object of failed constraints for the target object. Key is the constraint, value is detailed description of the failed constraint.",
                        "example": {
                          "min": "property1 must not be less than 50000"
                        }
                      }
                    }
                  }
                }
              },
              "required": [
                "errorCode",
                "message",
                "statusCode",
                "data"
              ],
              "type": "object"
            }
          }
        }
      },
      "Error401": {
        "description": "Unauthorized. Not valid or inactive subscription key present in the HTTP Header.",
        "content": {
          "application/json": {
            "schema": {
              "oneOf": [
                {
                  "properties": {
                    "errorCode": {
                      "example": "subscription.not.active",
                      "description": "subscription.not.active",
                      "type": "string"
                    },
                    "message": {
                      "example": "Subscription not active anymore.",
                      "description": "Subscription not active anymore.",
                      "type": "string"
                    },
                    "statusCode": {
                      "example": 401,
                      "description": "401",
                      "type": "number"
                    }
                  },
                  "required": [
                    "errorCode",
                    "message",
                    "statusCode"
                  ],
                  "type": "object"
                },
                {
                  "properties": {
                    "errorCode": {
                      "example": "subscription.invalid",
                      "description": "subscription.invalid",
                      "type": "string"
                    },
                    "message": {
                      "example": "Unable to find valid subscription for '${apiKey}'",
                      "description": "Unable to find valid subscription for '${apiKey}'",
                      "type": "string"
                    },
                    "statusCode": {
                      "example": 401,
                      "description": "401",
                      "type": "number"
                    }
                  },
                  "required": [
                    "errorCode",
                    "message",
                    "statusCode"
                  ],
                  "type": "object"
                }
              ]
            }
          }
        }
      },
      "Error500": {
        "description": "Internal server error. There was an error on the server during the processing of the request.",
        "content": {
          "application/json": {
            "schema": {
              "properties": {
                "message": {
                  "example": "Internal server error",
                  "description": "Internal server error",
                  "type": "string"
                },
                "statusCode": {
                  "example": 500,
                  "description": "500",
                  "type": "number"
                }
              },
              "required": [
                "statusCode",
                "message"
              ],
              "type": "object"
            }
          }
        }
      }
    },
    "schemas": {
      "CustomFee": {
        "description": "The custom defined fee; if not present, will be calculated automatically",
        "type": "object",
        "required": [
          "gasLimit",
          "gasPrice"
        ],
        "properties": {
          "gasPrice": {
            "type": "string",
            "description": "The price for one gas unit (in Gwei)",
            "pattern": "^[+]?\\d+$",
            "example": "20"
          },
          "gasLimit": {
            "type": "string",
            "description": "The maximum number of gas units that you are willing to spend on processing the transaction at the provided gas price",
            "pattern": "^[+]?\\d+$",
            "example": "40000"
          }
        }
      },
      "TransactionHash": {
        "type": "object",
        "properties": {
          "txId": {
            "description": "The hash (ID) of the transaction",
            "example": "c83f8818db43d9ba4accfe454aa44fc33123d47a4f89d47b314d6748eb0e9bc9",
            "type": "string"
          }
        },
        "required": [
          "txId"
        ]
      },
      "SignatureId": {
        "type": "object",
        "properties": {
          "signatureId": {
            "format": "uuid",
            "description": "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.",
            "example": "1f7f7c0c-3906-4aa1-9dfe-4b67c43918f6",
            "type": "string"
          }
        },
        "required": [
          "signatureId"
        ]
      },
      "Error403Celo": {
        "properties": {
          "errorCode": {
            "description": "celo.error",
            "example": "celo.error",
            "type": "string"
          },
          "message": {
            "description": "Unexpected error occurred. Reason: ${reason}",
            "example": "Unexpected error occurred. Reason: ${reason}",
            "type": "string"
          },
          "statusCode": {
            "description": "403",
            "example": 403,
            "type": "number"
          }
        },
        "required": [
          "errorCode",
          "message",
          "statusCode"
        ],
        "type": "object"
      },
      "TransferMultiTokenBatchCelo": {
        "type": "object",
        "properties": {
          "chain": {
            "type": "string",
            "example": "CELO",
            "description": "Chain to work with.",
            "enum": [
              "CELO"
            ]
          },
          "to": {
            "maxLength": 42,
            "minLength": 42,
            "description": "Blockchain address to send Multi Token token to",
            "example": "0x687422eEA2cB73B5d3e242bA5456b782919AFc85",
            "type": "string"
          },
          "tokenId": {
            "description": "ID of token.",
            "example": [
              "100000"
            ],
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 32
            }
          },
          "amounts": {
            "description": "Amount of token to be transferred",
            "example": [
              "100000"
            ],
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 32
            }
          },
          "data": {
            "description": "Data in bytes",
            "example": "0x1234",
            "type": "string"
          },
          "contractAddress": {
            "maxLength": 42,
            "minLength": 42,
            "description": "Address of Multi Token token",
            "example": "0x687422eEA2cB73B5d3e242bA5456b782919AFc85",
            "type": "string"
          },
          "fromPrivateKey": {
            "type": "string",
            "maxLength": 66,
            "example": "0x05e150c73f1920ec14caa1e0b6aa09940899678051a78542840c2668ce5080c2",
            "minLength": 66,
            "description": "Private key of sender address. Private key, or signature Id must be present."
          },
          "nonce": {
            "type": "number",
            "example": 1,
            "description": "Nonce to be set to Celo transaction. If not present, last known nonce will be used."
          },
          "feeCurrency": {
            "type": "string",
            "description": "Currency to pay for transaction gas",
            "enum": [
              "CELO",
              "CUSD",
              "CEUR"
            ]
          },
          "fee": {
            "$ref": "#/components/schemas/CustomFee"
          }
        },
        "required": [
          "chain",
          "to",
          "contractAddress",
          "tokenId",
          "amounts",
          "fromPrivateKey",
          "feeCurrency"
        ]
      },
      "TransferMultiTokenBatchKMSCelo": {
        "type": "object",
        "properties": {
          "chain": {
            "type": "string",
            "example": "CELO",
            "description": "Chain to work with.",
            "enum": [
              "CELO"
            ]
          },
          "to": {
            "maxLength": 42,
            "minLength": 42,
            "description": "Blockchain address to send Multi Token token to",
            "example": "0x687422eEA2cB73B5d3e242bA5456b782919AFc85",
            "type": "string"
          },
          "tokenId": {
            "description": "ID of token.",
            "example": [
              "100000"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "amounts": {
            "description": "amounts of token.",
            "example": [
              "100000"
            ],
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "data": {
            "description": "Data in bytes",
            "example": "0x1234",
            "type": "string"
          },
          "contractAddress": {
            "maxLength": 42,
            "minLength": 42,
            "description": "Address of Multi Token token",
            "example": "0x687422eEA2cB73B5d3e242bA5456b782919AFc85",
            "type": "string"
          },
          "index": {
            "type": "number",
            "minimum": 0,
            "description": "If signatureId is mnemonic-based, this is the index to the specific address from that mnemonic."
          },
          "signatureId": {
            "type": "string",
            "format": "uuid",
            "example": "26d3883e-4e17-48b3-a0ee-09a3e484ac83",
            "description": "Identifier of the private key associated in signing application. Private key, or signature Id must be present."
          },
          "nonce": {
            "type": "number",
            "example": 1,
            "description": "Nonce to be set to Celo transaction. If not present, last known nonce will be used."
          },
          "feeCurrency": {
            "type": "string",
            "description": "Currency to pay for transaction gas",
            "enum": [
              "CELO",
              "CUSD",
              "CEUR"
            ]
          },
          "fee": {
            "$ref": "#/components/schemas/CustomFee"
          }
        },
        "required": [
          "chain",
          "to",
          "contractAddress",
          "feeCurrency",
          "signatureId",
          "tokenId",
          "amounts"
        ]
      },
      "TransferMultiTokenBatch": {
        "type": "object",
        "properties": {
          "chain": {
            "type": "string",
            "example": "ETH",
            "description": "Chain to work with.",
            "enum": [
              "ETH",
              "ONE",
              "MATIC",
              "KCS",
              "KLAY",
              "BSC",
              "FLR",
              "CRO",
              "BASE",
              "AVAX",
              "OPTIMISM",
              "FTM"
            ]
          },
          "to": {
            "maxLength": 42,
            "minLength": 42,
            "description": "Blockchain address to send Multi Token token to",
            "example": "0x687422eEA2cB73B5d3e242bA5456b782919AFc85",
            "type": "string"
          },
          "tokenId": {
            "description": "ID of token.",
            "example": [
              "100000"
            ],
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 256
            }
          },
          "amounts": {
            "description": "amounts of token.",
            "example": [
              "100000"
            ],
            "type": "array",
            "maxLength": 256,
            "items": {
              "type": "string",
              "maxLength": 32
            }
          },
          "data": {
            "description": "Data in bytes",
            "example": "0x1234",
            "type": "string"
          },
          "contractAddress": {
            "maxLength": 42,
            "minLength": 42,
            "description": "Address of Multi Token token",
            "example": "0x687422eEA2cB73B5d3e242bA5456b782919AFc85",
            "type": "string"
          },
          "fromPrivateKey": {
            "type": "string",
            "maxLength": 66,
            "example": "0x05e150c73f1920ec14caa1e0b6aa09940899678051a78542840c2668ce5080c2",
            "minLength": 66,
            "description": "Private key of sender address. Private key, or signature Id must be present."
          },
          "nonce": {
            "type": "number",
            "example": 1,
            "description": "Nonce to be set to transaction. If not present, last known nonce will be used."
          },
          "fee": {
            "description": "Custom defined fee. If not present, it will be calculated automatically.",
            "type": "object",
            "required": [
              "gasLimit",
              "gasPrice"
            ],
            "properties": {
              "gasLimit": {
                "type": "string",
                "description": "Gas limit for transaction in gas price.",
                "pattern": "^[+]?\\d+$",
                "example": "40000"
              },
              "gasPrice": {
                "type": "string",
                "description": "Gas price in Gwei.",
                "pattern": "^[+]?\\d+$",
                "example": "20"
              }
            }
          }
        },
        "required": [
          "to",
          "chain",
          "contractAddress",
          "tokenId",
          "amounts",
          "fromPrivateKey"
        ]
      },
      "TransferMultiTokenBatchKMS": {
        "type": "object",
        "properties": {
          "chain": {
            "type": "string",
            "example": "ETH",
            "description": "Chain to work with.",
            "enum": [
              "ETH",
              "ONE",
              "MATIC",
              "KCS",
              "KLAY",
              "BSC"
            ]
          },
          "to": {
            "maxLength": 42,
            "minLength": 42,
            "description": "Blockchain address to send Multi Token token to",
            "example": "0x687422eEA2cB73B5d3e242bA5456b782919AFc85",
            "type": "string"
          },
          "tokenId": {
            "description": "ID of token.",
            "example": [
              "100000"
            ],
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 256
            }
          },
          "amounts": {
            "description": "amounts of token.",
            "example": [
              "100000"
            ],
            "type": "array",
            "maxLength": 256,
            "items": {
              "type": "string",
              "maxLength": 32
            }
          },
          "data": {
            "description": "Data in bytes",
            "example": "0x1234",
            "type": "string"
          },
          "contractAddress": {
            "maxLength": 42,
            "minLength": 42,
            "description": "Address of Multi Token token",
            "example": "0x687422eEA2cB73B5d3e242bA5456b782919AFc85",
            "type": "string"
          },
          "index": {
            "type": "number",
            "minimum": 0,
            "description": "If signatureId is mnemonic-based, this is the index to the specific address from that mnemonic."
          },
          "signatureId": {
            "type": "string",
            "format": "uuid",
            "example": "26d3883e-4e17-48b3-a0ee-09a3e484ac83",
            "description": "Identifier of the private key associated in signing application. Private key, or signature Id must be present."
          },
          "nonce": {
            "type": "number",
            "example": 1,
            "description": "Nonce to be set to transaction. If not present, last known nonce will be used."
          },
          "fee": {
            "description": "Custom defined fee. If not present, it will be calculated automatically.",
            "type": "object",
            "required": [
              "gasLimit",
              "gasPrice"
            ],
            "properties": {
              "gasLimit": {
                "type": "string",
                "description": "Gas limit for transaction in gas price.",
                "pattern": "^[+]?\\d+$",
                "example": "40000"
              },
              "gasPrice": {
                "type": "string",
                "description": "Gas price in Gwei.",
                "pattern": "^[+]?\\d+$",
                "example": "20"
              }
            }
          }
        },
        "required": [
          "to",
          "chain",
          "contractAddress",
          "signatureId",
          "tokenId",
          "amounts"
        ]
      }
    }
  }
}
```