Skip to content

Transfers

Documentation / API Reference / Transfers

Endpoint https://api.aradia.app

2 endpoints in this section: GET /v1/collections/{address}/transfers, GET /v1/nfts/{address}/{tokenId}/transfers.

List canonical-aware collection transfers

Authorization

Send a bearer credential with the scope read:transfers.

Parameters

addressstringpathrequired
Collection contract address, lowercase hex with the 0x prefix.
pattern: ^0x[0-9a-f]{40}$
limitintegerqueryoptional
How many items to return per page. Defaults to 20, maximum 100.
min: 1, max: 100, default: 20
before_timestampintegerqueryoptional
Page 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.
min: 1
before_idintegerqueryoptional
Page 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.
min: 1

Request Code Samples

GET/v1/collections/{address}/transfers
Terminal window
curl -sS -X GET \
-H "Authorization: Bearer $ARADIA_API_TOKEN" \
"https://api.aradia.app/v1/collections/0x0000000000000000000000000000000000000001/transfers"
Responses
200Transfer page
application/json

Transfer page

Body application/json
dataarray[object]required
collection_addressstringrequired
Lowercase EVM address.
token_idstringrequired
networkastarrequired
from_addressstringrequired
Lowercase EVM address.
to_addressstringrequired
Lowercase EVM address.
transaction_hashstringrequired
block_numberstringrequired
block_timestampstring (date-time)required
log_indexintegerrequired
event_typemint | transfer | burnrequired
confirmationsinteger (int64) | nullrequired
Blocks mined on top of this transfer, so you can apply your own finality threshold instead of inheriting ours. Aradia shows a transfer at 3 and treats it as final at 12. Null, and always present rather than omitted, when the depth is not knowable: the historical backfill populated timestamps without block numbers, so 98.7% of transfers carry block_number 0 and any count for them would be fiction.
paginationobjectrequired
Keyset pagination. When has_more is true, next_page_params holds the query parameters that return the following page: copy each key and value into the next request, keeping the other filters unchanged. The keys vary by endpoint, because each one pages on its own ordering.
limitintegerrequired
Example: 20
has_morebooleanrequired
Example: True
next_page_paramsobject | nulloptional
Absent when has_more is false. Time-ordered feeds return before_timestamp and before_id; token listings return after_token_id and after_id, plus after_collection on the owner holdings endpoint.
coverageobjectrequired
Whether the indexed window behind this response is complete. It is a property of the query, not of any single row, so it is reported once per response rather than repeated on every item.
statusunknown | partial | completerequired
Example: partial
start_blockstring | nulloptional
First block covered, when known. Decimal string.
Example: 7000000
Example
{
"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
application/json

Invalid parameter or cursor

Body application/json
errorobjectrequired
codeINVALID_ARGUMENT | UNAUTHORIZED | FORBIDDEN | NOT_FOUND | RATE_LIMITED | RATE_LIMITER_UNAVAILABLE | SERVICE_UNAVAILABLE | INTERNAL_ERRORrequired
Example: INVALID_ARGUMENT
messagestringrequired
Example: One or more request parameters are invalid.
request_idstringoptional
Example
{
"error": {
"code": "INVALID_ARGUMENT",
"message": "One or more request parameters are invalid."
}
}
401Missing or invalid bearer credential
application/json

Missing or invalid bearer credential

Body application/json
errorobjectrequired
codeINVALID_ARGUMENT | UNAUTHORIZED | FORBIDDEN | NOT_FOUND | RATE_LIMITED | RATE_LIMITER_UNAVAILABLE | SERVICE_UNAVAILABLE | INTERNAL_ERRORrequired
Example: UNAUTHORIZED
messagestringrequired
Example: Authentication is required.
request_idstringoptional
Example
{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication is required."
}
}
403Credential lacks the required read-only scope
application/json

Credential lacks the required read-only scope

Body application/json
errorobjectrequired
codeINVALID_ARGUMENT | UNAUTHORIZED | FORBIDDEN | NOT_FOUND | RATE_LIMITED | RATE_LIMITER_UNAVAILABLE | SERVICE_UNAVAILABLE | INTERNAL_ERRORrequired
Example: FORBIDDEN
messagestringrequired
Example: The API key does not have the required scope.
request_idstringoptional
Example
{
"error": {
"code": "FORBIDDEN",
"message": "The API key does not have the required scope."
}
}
429Request rate limit exceeded
application/json

Request rate limit exceeded

Headers: RateLimit-Reset, Retry-After

Body application/json
errorobjectrequired
codeINVALID_ARGUMENT | UNAUTHORIZED | FORBIDDEN | NOT_FOUND | RATE_LIMITED | RATE_LIMITER_UNAVAILABLE | SERVICE_UNAVAILABLE | INTERNAL_ERRORrequired
Example: RATE_LIMITED
messagestringrequired
Example: Request rate limit exceeded.
request_idstringoptional
Example
{
"error": {
"code": "RATE_LIMITED",
"message": "Request rate limit exceeded."
}
}
503Temporary dependency failure
application/json

Temporary dependency failure

Body application/json
errorobjectrequired
codeINVALID_ARGUMENT | UNAUTHORIZED | FORBIDDEN | NOT_FOUND | RATE_LIMITED | RATE_LIMITER_UNAVAILABLE | SERVICE_UNAVAILABLE | INTERNAL_ERRORrequired
Example: SERVICE_UNAVAILABLE
messagestringrequired
Example: The data service is temporarily unavailable.
request_idstringoptional
Example
{
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "The data service is temporarily unavailable."
}
}
Try itDemo token included
GET/v1/collections/{address}/transfers
RequestJSON
What each field does
  • address stringrequiredpattern: ^0x[0-9a-f]{40}$
    Collection contract address, lowercase hex with the 0x prefix.
  • limit integeroptionalmin: 1, max: 100, default: 20
    How many items to return per page. Defaults to 20, maximum 100.
  • before_timestamp integeroptionalmin: 1
    Page 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_id integeroptionalmin: 1
    Page 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
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

addressstringpathrequired
Collection contract address, lowercase hex with the 0x prefix.
pattern: ^0x[0-9a-f]{40}$
tokenIdstringpathrequired
Token id as a decimal string, so very large ids keep full precision.
pattern: ^[0-9]{1,78}$
limitintegerqueryoptional
How many items to return per page. Defaults to 20, maximum 100.
min: 1, max: 100, default: 20
before_timestampintegerqueryoptional
Page 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.
min: 1
before_idintegerqueryoptional
Page 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.
min: 1

Request Code Samples

GET/v1/nfts/{address}/{tokenId}/transfers
Terminal window
curl -sS -X GET \
-H "Authorization: Bearer $ARADIA_API_TOKEN" \
"https://api.aradia.app/v1/nfts/0x0000000000000000000000000000000000000001/1/transfers"
Responses
200Transfer page
application/json

Transfer page

Body application/json
dataarray[object]required
collection_addressstringrequired
Lowercase EVM address.
token_idstringrequired
networkastarrequired
from_addressstringrequired
Lowercase EVM address.
to_addressstringrequired
Lowercase EVM address.
transaction_hashstringrequired
block_numberstringrequired
block_timestampstring (date-time)required
log_indexintegerrequired
event_typemint | transfer | burnrequired
confirmationsinteger (int64) | nullrequired
Blocks mined on top of this transfer, so you can apply your own finality threshold instead of inheriting ours. Aradia shows a transfer at 3 and treats it as final at 12. Null, and always present rather than omitted, when the depth is not knowable: the historical backfill populated timestamps without block numbers, so 98.7% of transfers carry block_number 0 and any count for them would be fiction.
paginationobjectrequired
Keyset pagination. When has_more is true, next_page_params holds the query parameters that return the following page: copy each key and value into the next request, keeping the other filters unchanged. The keys vary by endpoint, because each one pages on its own ordering.
limitintegerrequired
Example: 20
has_morebooleanrequired
Example: True
next_page_paramsobject | nulloptional
Absent when has_more is false. Time-ordered feeds return before_timestamp and before_id; token listings return after_token_id and after_id, plus after_collection on the owner holdings endpoint.
coverageobjectrequired
Whether the indexed window behind this response is complete. It is a property of the query, not of any single row, so it is reported once per response rather than repeated on every item.
statusunknown | partial | completerequired
Example: partial
start_blockstring | nulloptional
First block covered, when known. Decimal string.
Example: 7000000
Example
{
"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
application/json

Invalid parameter or cursor

Body application/json
errorobjectrequired
codeINVALID_ARGUMENT | UNAUTHORIZED | FORBIDDEN | NOT_FOUND | RATE_LIMITED | RATE_LIMITER_UNAVAILABLE | SERVICE_UNAVAILABLE | INTERNAL_ERRORrequired
Example: INVALID_ARGUMENT
messagestringrequired
Example: One or more request parameters are invalid.
request_idstringoptional
Example
{
"error": {
"code": "INVALID_ARGUMENT",
"message": "One or more request parameters are invalid."
}
}
401Missing or invalid bearer credential
application/json

Missing or invalid bearer credential

Body application/json
errorobjectrequired
codeINVALID_ARGUMENT | UNAUTHORIZED | FORBIDDEN | NOT_FOUND | RATE_LIMITED | RATE_LIMITER_UNAVAILABLE | SERVICE_UNAVAILABLE | INTERNAL_ERRORrequired
Example: UNAUTHORIZED
messagestringrequired
Example: Authentication is required.
request_idstringoptional
Example
{
"error": {
"code": "UNAUTHORIZED",
"message": "Authentication is required."
}
}
403Credential lacks the required read-only scope
application/json

Credential lacks the required read-only scope

Body application/json
errorobjectrequired
codeINVALID_ARGUMENT | UNAUTHORIZED | FORBIDDEN | NOT_FOUND | RATE_LIMITED | RATE_LIMITER_UNAVAILABLE | SERVICE_UNAVAILABLE | INTERNAL_ERRORrequired
Example: FORBIDDEN
messagestringrequired
Example: The API key does not have the required scope.
request_idstringoptional
Example
{
"error": {
"code": "FORBIDDEN",
"message": "The API key does not have the required scope."
}
}
429Request rate limit exceeded
application/json

Request rate limit exceeded

Headers: RateLimit-Reset, Retry-After

Body application/json
errorobjectrequired
codeINVALID_ARGUMENT | UNAUTHORIZED | FORBIDDEN | NOT_FOUND | RATE_LIMITED | RATE_LIMITER_UNAVAILABLE | SERVICE_UNAVAILABLE | INTERNAL_ERRORrequired
Example: RATE_LIMITED
messagestringrequired
Example: Request rate limit exceeded.
request_idstringoptional
Example
{
"error": {
"code": "RATE_LIMITED",
"message": "Request rate limit exceeded."
}
}
503Temporary dependency failure
application/json

Temporary dependency failure

Body application/json
errorobjectrequired
codeINVALID_ARGUMENT | UNAUTHORIZED | FORBIDDEN | NOT_FOUND | RATE_LIMITED | RATE_LIMITER_UNAVAILABLE | SERVICE_UNAVAILABLE | INTERNAL_ERRORrequired
Example: SERVICE_UNAVAILABLE
messagestringrequired
Example: The data service is temporarily unavailable.
request_idstringoptional
Example
{
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "The data service is temporarily unavailable."
}
}
Try itDemo token included
GET/v1/nfts/{address}/{tokenId}/transfers
RequestJSON
What each field does
  • address stringrequiredpattern: ^0x[0-9a-f]{40}$
    Collection contract address, lowercase hex with the 0x prefix.
  • tokenId stringrequiredpattern: ^[0-9]{1,78}$
    Token id as a decimal string, so very large ids keep full precision.
  • limit integeroptionalmin: 1, max: 100, default: 20
    How many items to return per page. Defaults to 20, maximum 100.
  • before_timestamp integeroptionalmin: 1
    Page 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_id integeroptionalmin: 1
    Page 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
Response appears here.