curl --request POST \
--url https://router-api.initia.xyz/nft \
--header 'Content-Type: application/json' \
--data '
{
"from_address": "init1abc...",
"from_chain_id": "echelon-1",
"to_address": "init1def...",
"to_chain_id": "yominet-1",
"token_ids": [
"1",
"2"
],
"collection_address": "0xabc...",
"class_id": "wasm.init1.../nft-transfer/channel-0/..."
}
'import requests
url = "https://router-api.initia.xyz/nft"
payload = {
"from_address": "init1abc...",
"from_chain_id": "echelon-1",
"to_address": "init1def...",
"to_chain_id": "yominet-1",
"token_ids": ["1", "2"],
"collection_address": "0xabc...",
"class_id": "wasm.init1.../nft-transfer/channel-0/..."
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
from_address: 'init1abc...',
from_chain_id: 'echelon-1',
to_address: 'init1def...',
to_chain_id: 'yominet-1',
token_ids: ['1', '2'],
collection_address: '0xabc...',
class_id: 'wasm.init1.../nft-transfer/channel-0/...'
})
};
fetch('https://router-api.initia.xyz/nft', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://router-api.initia.xyz/nft",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'from_address' => 'init1abc...',
'from_chain_id' => 'echelon-1',
'to_address' => 'init1def...',
'to_chain_id' => 'yominet-1',
'token_ids' => [
'1',
'2'
],
'collection_address' => '0xabc...',
'class_id' => 'wasm.init1.../nft-transfer/channel-0/...'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://router-api.initia.xyz/nft"
payload := strings.NewReader("{\n \"from_address\": \"init1abc...\",\n \"from_chain_id\": \"echelon-1\",\n \"to_address\": \"init1def...\",\n \"to_chain_id\": \"yominet-1\",\n \"token_ids\": [\n \"1\",\n \"2\"\n ],\n \"collection_address\": \"0xabc...\",\n \"class_id\": \"wasm.init1.../nft-transfer/channel-0/...\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://router-api.initia.xyz/nft")
.header("Content-Type", "application/json")
.body("{\n \"from_address\": \"init1abc...\",\n \"from_chain_id\": \"echelon-1\",\n \"to_address\": \"init1def...\",\n \"to_chain_id\": \"yominet-1\",\n \"token_ids\": [\n \"1\",\n \"2\"\n ],\n \"collection_address\": \"0xabc...\",\n \"class_id\": \"wasm.init1.../nft-transfer/channel-0/...\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://router-api.initia.xyz/nft")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"from_address\": \"init1abc...\",\n \"from_chain_id\": \"echelon-1\",\n \"to_address\": \"init1def...\",\n \"to_chain_id\": \"yominet-1\",\n \"token_ids\": [\n \"1\",\n \"2\"\n ],\n \"collection_address\": \"0xabc...\",\n \"class_id\": \"wasm.init1.../nft-transfer/channel-0/...\"\n}"
response = http.request(request)
puts response.read_body{
"msgs": [
{
"typeUrl": "/ibc.applications.nft_transfer.v1.MsgTransfer",
"value": {}
}
]
}NFT Transfer
Computes routes and generates transaction messages for cross-chain NFT transfers within the Initia ecosystem. Supports:
- Same-chain transfers (EVM, Move, and Wasm chains)
- Single-hop IBC (L2 to L1 or L1 to L2 via ICS-721)
- Multi-hop (L2 to L1 to L2, two IBC hops)
curl --request POST \
--url https://router-api.initia.xyz/nft \
--header 'Content-Type: application/json' \
--data '
{
"from_address": "init1abc...",
"from_chain_id": "echelon-1",
"to_address": "init1def...",
"to_chain_id": "yominet-1",
"token_ids": [
"1",
"2"
],
"collection_address": "0xabc...",
"class_id": "wasm.init1.../nft-transfer/channel-0/..."
}
'import requests
url = "https://router-api.initia.xyz/nft"
payload = {
"from_address": "init1abc...",
"from_chain_id": "echelon-1",
"to_address": "init1def...",
"to_chain_id": "yominet-1",
"token_ids": ["1", "2"],
"collection_address": "0xabc...",
"class_id": "wasm.init1.../nft-transfer/channel-0/..."
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
from_address: 'init1abc...',
from_chain_id: 'echelon-1',
to_address: 'init1def...',
to_chain_id: 'yominet-1',
token_ids: ['1', '2'],
collection_address: '0xabc...',
class_id: 'wasm.init1.../nft-transfer/channel-0/...'
})
};
fetch('https://router-api.initia.xyz/nft', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://router-api.initia.xyz/nft",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'from_address' => 'init1abc...',
'from_chain_id' => 'echelon-1',
'to_address' => 'init1def...',
'to_chain_id' => 'yominet-1',
'token_ids' => [
'1',
'2'
],
'collection_address' => '0xabc...',
'class_id' => 'wasm.init1.../nft-transfer/channel-0/...'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://router-api.initia.xyz/nft"
payload := strings.NewReader("{\n \"from_address\": \"init1abc...\",\n \"from_chain_id\": \"echelon-1\",\n \"to_address\": \"init1def...\",\n \"to_chain_id\": \"yominet-1\",\n \"token_ids\": [\n \"1\",\n \"2\"\n ],\n \"collection_address\": \"0xabc...\",\n \"class_id\": \"wasm.init1.../nft-transfer/channel-0/...\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://router-api.initia.xyz/nft")
.header("Content-Type", "application/json")
.body("{\n \"from_address\": \"init1abc...\",\n \"from_chain_id\": \"echelon-1\",\n \"to_address\": \"init1def...\",\n \"to_chain_id\": \"yominet-1\",\n \"token_ids\": [\n \"1\",\n \"2\"\n ],\n \"collection_address\": \"0xabc...\",\n \"class_id\": \"wasm.init1.../nft-transfer/channel-0/...\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://router-api.initia.xyz/nft")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"from_address\": \"init1abc...\",\n \"from_chain_id\": \"echelon-1\",\n \"to_address\": \"init1def...\",\n \"to_chain_id\": \"yominet-1\",\n \"token_ids\": [\n \"1\",\n \"2\"\n ],\n \"collection_address\": \"0xabc...\",\n \"class_id\": \"wasm.init1.../nft-transfer/channel-0/...\"\n}"
response = http.request(request)
puts response.read_body{
"msgs": [
{
"typeUrl": "/ibc.applications.nft_transfer.v1.MsgTransfer",
"value": {}
}
]
}Body
Sender address.
Source chain ID.
Recipient address.
Destination chain ID.
Token IDs to transfer (maximum 30).
30NFT collection contract address. Pass an empty string for Move chains.
IBC class ID. Required for cross-chain transfers.
IBC class trace for multi-hop transfers.
Show child attributes
Show child attributes
Move object addresses (maximum 30). Required for same-chain Move transfers.
30L1 recovery address for L2 to L1 to L2 transfers. Defaults to from_address.
Outgoing proxy contract address (Wasm chains).
IBC timeout in seconds.
Response
Successful response
Array of transaction messages appropriate for the source chain's VM type.
Show child attributes
Show child attributes
Was this page helpful?