Transfers
Endpoint https://api.aradia.app
2 endpoints in this section: GET /v1/collections/{address}/transfers, GET /v1/nfts/{address}/{tokenId}/transfers.
GET /v1/collections/{address}/transfers
Section titled “GET /v1/collections/{address}/transfers”List canonical-aware collection transfers
Authorization
Send a bearer credential with the scope read:transfers.
Parameters
addressstringpathrequiredlimitintegerqueryoptionalbefore_timestampintegerqueryoptionalbefore_idintegerqueryoptionalRequest Code Samples
/v1/collections/{address}/transferscurl -sS -X GET \ -H "Authorization: Bearer $ARADIA_API_TOKEN" \ "https://api.aradia.app/v1/collections/0x0000000000000000000000000000000000000001/transfers"const token = process.env.ARADIA_API_TOKEN;
const response = await fetch("https://api.aradia.app/v1/collections/0x0000000000000000000000000000000000000001/transfers", { method: "GET", headers: { Authorization: `Bearer ${token}` },});
if (!response.ok) { throw new Error(`Aradia API error ${response.status}`);}const data = await response.json();console.log(data);import osimport requests
token = os.environ["ARADIA_API_TOKEN"]
response = requests.request( "GET", "https://api.aradia.app/v1/collections/0x0000000000000000000000000000000000000001/transfers", headers={"Authorization": f"Bearer {token}"}, timeout=30,)response.raise_for_status()print(response.json())package main
import ( "fmt" "io" "net/http" "os")
func main() { request, err := http.NewRequest("GET", "https://api.aradia.app/v1/collections/0x0000000000000000000000000000000000000001/transfers", nil) if err != nil { panic(err) } request.Header.Set("Authorization", "Bearer "+os.Getenv("ARADIA_API_TOKEN"))
response, err := http.DefaultClient.Do(request) if err != nil { panic(err) } defer response.Body.Close()
body, err := io.ReadAll(response.Body) if err != nil { panic(err) } fmt.Println(string(body))}<?php$token = getenv('ARADIA_API_TOKEN');
$context = stream_context_create([ 'http' => [ 'method' => 'GET', 'header' => "Authorization: Bearer $token\r\n", ],]);
$body = file_get_contents('https://api.aradia.app/v1/collections/0x0000000000000000000000000000000000000001/transfers', false, $context);echo $body;import java.net.URI;import java.net.http.*;
var client = HttpClient.newHttpClient();var request = HttpRequest.newBuilder() .uri(URI.create("https://api.aradia.app/v1/collections/0x0000000000000000000000000000000000000001/transfers")) .header("Authorization", "Bearer " + System.getenv("ARADIA_API_TOKEN")) .method("GET", HttpRequest.BodyPublishers.noBody()) .build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.body());require 'net/http'require 'uri'
uri = URI('https://api.aradia.app/v1/collections/0x0000000000000000000000000000000000000001/transfers')request = Net::HTTP::Get.new(uri)request['Authorization'] = "Bearer #{ENV.fetch('ARADIA_API_TOKEN')}"
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| http.request(request)endputs response.body// cargo add reqwest --features blockingfn main() -> Result<(), Box<dyn std::error::Error>> { let token = std::env::var("ARADIA_API_TOKEN")?; let client = reqwest::blocking::Client::new(); let response = client .get("https://api.aradia.app/v1/collections/0x0000000000000000000000000000000000000001/transfers") .bearer_auth(token) .send()?;
println!("{}", response.text()?); Ok(())}using System.Net.Http;using System.Net.Http.Headers;
using var client = new HttpClient();client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("ARADIA_API_TOKEN"));
using var request = new HttpRequestMessage(new HttpMethod("GET"), "https://api.aradia.app/v1/collections/0x0000000000000000000000000000000000000001/transfers");var response = await client.SendAsync(request);Console.WriteLine(await response.Content.ReadAsStringAsync());$headers = @{ Authorization = "Bearer $env:ARADIA_API_TOKEN" }
$response = Invoke-RestMethod -Method GET ` -Uri 'https://api.aradia.app/v1/collections/0x0000000000000000000000000000000000000001/transfers' ` -Headers $headers
$response | ConvertTo-Json -Depth 6200Transfer page
Transfer page
Body application/json
20Truepartial7000000Example
{ "data": [ { "collection_address": "0x0000000000000000000000000000000000000001", "token_id": "1", "network": "astar", "from_address": "0x0000000000000000000000000000000000000000", "to_address": "0x0000000000000000000000000000000000000002", "event_type": "mint", "block_number": "7654321", "log_index": 4, "transaction_hash": "0x1111111111111111111111111111111111111111111111111111111111111111", "block_timestamp": "2026-08-01T12:00:00Z", "confirmations": 1284 }, { "collection_address": "0x0000000000000000000000000000000000000001", "token_id": "2", "network": "astar", "from_address": "0x0000000000000000000000000000000000000002", "to_address": "0x0000000000000000000000000000000000000003", "event_type": "transfer", "block_number": "0", "log_index": 0, "transaction_hash": "0x2222222222222222222222222222222222222222222222222222222222222222", "block_timestamp": "2026-03-30T09:15:00Z", "confirmations": null } ], "pagination": { "limit": 20, "has_more": true, "next_page_params": { "before_timestamp": 1780245600123456, "before_id": 2017853 } }, "coverage": { "status": "partial", "start_block": "7000000" }}400Invalid parameter or cursor
Invalid parameter or cursor
Body application/json
INVALID_ARGUMENTOne or more request parameters are invalid.Example
{ "error": { "code": "INVALID_ARGUMENT", "message": "One or more request parameters are invalid." }}401Missing or invalid bearer credential
Missing or invalid bearer credential
Body application/json
UNAUTHORIZEDAuthentication is required.Example
{ "error": { "code": "UNAUTHORIZED", "message": "Authentication is required." }}403Credential lacks the required read-only scope
Credential lacks the required read-only scope
Body application/json
FORBIDDENThe API key does not have the required scope.Example
{ "error": { "code": "FORBIDDEN", "message": "The API key does not have the required scope." }}429Request rate limit exceeded
Request rate limit exceeded
Headers: RateLimit-Reset, Retry-After
Body application/json
RATE_LIMITEDRequest rate limit exceeded.Example
{ "error": { "code": "RATE_LIMITED", "message": "Request rate limit exceeded." }}503Temporary dependency failure
Temporary dependency failure
Body application/json
SERVICE_UNAVAILABLEThe data service is temporarily unavailable.Example
{ "error": { "code": "SERVICE_UNAVAILABLE", "message": "The data service is temporarily unavailable." }}Try itDemo token included
What each field does
addressstringrequiredpattern: ^0x[0-9a-f]{40}$Collection contract address, lowercase hex with the 0x prefix.limitintegeroptionalmin: 1, max: 100, default: 20How many items to return per page. Defaults to 20, maximum 100.before_timestampintegeroptionalmin: 1Page boundary: return rows older than this instant, expressed as a Unix timestamp in microseconds. Copy the value from next_page_params. Must be sent together with before_id.before_idintegeroptionalmin: 1Page boundary tie-break: the row id from next_page_params. Timestamps repeat heavily, so the id is required to place the boundary exactly. Must be sent together with before_timestamp.
Response appears here.
GET /v1/nfts/{address}/{tokenId}/transfers
Section titled “GET /v1/nfts/{address}/{tokenId}/transfers”List canonical-aware transfers for one NFT
Authorization
Send a bearer credential with the scope read:transfers.
Parameters
addressstringpathrequiredtokenIdstringpathrequiredlimitintegerqueryoptionalbefore_timestampintegerqueryoptionalbefore_idintegerqueryoptionalRequest Code Samples
/v1/nfts/{address}/{tokenId}/transferscurl -sS -X GET \ -H "Authorization: Bearer $ARADIA_API_TOKEN" \ "https://api.aradia.app/v1/nfts/0x0000000000000000000000000000000000000001/1/transfers"const token = process.env.ARADIA_API_TOKEN;
const response = await fetch("https://api.aradia.app/v1/nfts/0x0000000000000000000000000000000000000001/1/transfers", { method: "GET", headers: { Authorization: `Bearer ${token}` },});
if (!response.ok) { throw new Error(`Aradia API error ${response.status}`);}const data = await response.json();console.log(data);import osimport requests
token = os.environ["ARADIA_API_TOKEN"]
response = requests.request( "GET", "https://api.aradia.app/v1/nfts/0x0000000000000000000000000000000000000001/1/transfers", headers={"Authorization": f"Bearer {token}"}, timeout=30,)response.raise_for_status()print(response.json())package main
import ( "fmt" "io" "net/http" "os")
func main() { request, err := http.NewRequest("GET", "https://api.aradia.app/v1/nfts/0x0000000000000000000000000000000000000001/1/transfers", nil) if err != nil { panic(err) } request.Header.Set("Authorization", "Bearer "+os.Getenv("ARADIA_API_TOKEN"))
response, err := http.DefaultClient.Do(request) if err != nil { panic(err) } defer response.Body.Close()
body, err := io.ReadAll(response.Body) if err != nil { panic(err) } fmt.Println(string(body))}<?php$token = getenv('ARADIA_API_TOKEN');
$context = stream_context_create([ 'http' => [ 'method' => 'GET', 'header' => "Authorization: Bearer $token\r\n", ],]);
$body = file_get_contents('https://api.aradia.app/v1/nfts/0x0000000000000000000000000000000000000001/1/transfers', false, $context);echo $body;import java.net.URI;import java.net.http.*;
var client = HttpClient.newHttpClient();var request = HttpRequest.newBuilder() .uri(URI.create("https://api.aradia.app/v1/nfts/0x0000000000000000000000000000000000000001/1/transfers")) .header("Authorization", "Bearer " + System.getenv("ARADIA_API_TOKEN")) .method("GET", HttpRequest.BodyPublishers.noBody()) .build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.body());require 'net/http'require 'uri'
uri = URI('https://api.aradia.app/v1/nfts/0x0000000000000000000000000000000000000001/1/transfers')request = Net::HTTP::Get.new(uri)request['Authorization'] = "Bearer #{ENV.fetch('ARADIA_API_TOKEN')}"
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http| http.request(request)endputs response.body// cargo add reqwest --features blockingfn main() -> Result<(), Box<dyn std::error::Error>> { let token = std::env::var("ARADIA_API_TOKEN")?; let client = reqwest::blocking::Client::new(); let response = client .get("https://api.aradia.app/v1/nfts/0x0000000000000000000000000000000000000001/1/transfers") .bearer_auth(token) .send()?;
println!("{}", response.text()?); Ok(())}using System.Net.Http;using System.Net.Http.Headers;
using var client = new HttpClient();client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("ARADIA_API_TOKEN"));
using var request = new HttpRequestMessage(new HttpMethod("GET"), "https://api.aradia.app/v1/nfts/0x0000000000000000000000000000000000000001/1/transfers");var response = await client.SendAsync(request);Console.WriteLine(await response.Content.ReadAsStringAsync());$headers = @{ Authorization = "Bearer $env:ARADIA_API_TOKEN" }
$response = Invoke-RestMethod -Method GET ` -Uri 'https://api.aradia.app/v1/nfts/0x0000000000000000000000000000000000000001/1/transfers' ` -Headers $headers
$response | ConvertTo-Json -Depth 6200Transfer page
Transfer page
Body application/json
20Truepartial7000000Example
{ "data": [ { "collection_address": "0x0000000000000000000000000000000000000001", "token_id": "1", "network": "astar", "from_address": "0x0000000000000000000000000000000000000000", "to_address": "0x0000000000000000000000000000000000000002", "event_type": "mint", "block_number": "7654321", "log_index": 4, "transaction_hash": "0x1111111111111111111111111111111111111111111111111111111111111111", "block_timestamp": "2026-08-01T12:00:00Z", "confirmations": 1284 }, { "collection_address": "0x0000000000000000000000000000000000000001", "token_id": "2", "network": "astar", "from_address": "0x0000000000000000000000000000000000000002", "to_address": "0x0000000000000000000000000000000000000003", "event_type": "transfer", "block_number": "0", "log_index": 0, "transaction_hash": "0x2222222222222222222222222222222222222222222222222222222222222222", "block_timestamp": "2026-03-30T09:15:00Z", "confirmations": null } ], "pagination": { "limit": 20, "has_more": true, "next_page_params": { "before_timestamp": 1780245600123456, "before_id": 2017853 } }, "coverage": { "status": "partial", "start_block": "7000000" }}400Invalid parameter or cursor
Invalid parameter or cursor
Body application/json
INVALID_ARGUMENTOne or more request parameters are invalid.Example
{ "error": { "code": "INVALID_ARGUMENT", "message": "One or more request parameters are invalid." }}401Missing or invalid bearer credential
Missing or invalid bearer credential
Body application/json
UNAUTHORIZEDAuthentication is required.Example
{ "error": { "code": "UNAUTHORIZED", "message": "Authentication is required." }}403Credential lacks the required read-only scope
Credential lacks the required read-only scope
Body application/json
FORBIDDENThe API key does not have the required scope.Example
{ "error": { "code": "FORBIDDEN", "message": "The API key does not have the required scope." }}429Request rate limit exceeded
Request rate limit exceeded
Headers: RateLimit-Reset, Retry-After
Body application/json
RATE_LIMITEDRequest rate limit exceeded.Example
{ "error": { "code": "RATE_LIMITED", "message": "Request rate limit exceeded." }}503Temporary dependency failure
Temporary dependency failure
Body application/json
SERVICE_UNAVAILABLEThe data service is temporarily unavailable.Example
{ "error": { "code": "SERVICE_UNAVAILABLE", "message": "The data service is temporarily unavailable." }}Try itDemo token included
What each field does
addressstringrequiredpattern: ^0x[0-9a-f]{40}$Collection contract address, lowercase hex with the 0x prefix.tokenIdstringrequiredpattern: ^[0-9]{1,78}$Token id as a decimal string, so very large ids keep full precision.limitintegeroptionalmin: 1, max: 100, default: 20How many items to return per page. Defaults to 20, maximum 100.before_timestampintegeroptionalmin: 1Page boundary: return rows older than this instant, expressed as a Unix timestamp in microseconds. Copy the value from next_page_params. Must be sent together with before_id.before_idintegeroptionalmin: 1Page boundary tie-break: the row id from next_page_params. Timestamps repeat heavily, so the id is required to place the boundary exactly. Must be sent together with before_timestamp.
Response appears here.
