Skip to content

NFTs

Documentation / API Reference / NFTs

Endpoint https://api.aradia.app

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

List NFTs in a collection

Authorization

Send a bearer credential with the scope read:nfts.

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
after_token_idstringqueryoptional
Page boundary for token listings: return tokens after this id. Copy the value from next_page_params. Must be sent together with after_id.
pattern: ^[0-9]{1,78}$
after_idintegerqueryoptional
Page boundary tie-break for token listings: the row id from next_page_params. Must be sent together with after_token_id.
min: 1
include_burnedbooleanqueryoptional
default: False

Request Code Samples

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

NFT page

Body application/json
dataarray[object]required
collection_addressstringrequired
Lowercase EVM address.
token_idstringrequired
networkastarrequired
current_ownerstringrequired
Lowercase EVM address.
metadata_uristring | nulloptional
namestring | nulloptional
descriptionstring | nulloptional
image_urlstring (uri) | nulloptional
Original metadata image source. Use as the fallback when media_url is absent.
media_urlstring (uri) | nulloptional
Aradia-hosted original bytes. Present only when the source has already been stored locally, so clients may use it without probing for a cache miss. Omitted when the cache has no stored copy; then use image_url.
attributesobject | nulloptional
media_typestring | nulloptional
collection_namestring | nulloptional
Name of the collection this token belongs to. Null when the collection has not been indexed yet.
collection_symbolstring | nulloptional
Symbol of the collection this token belongs to.
is_burnedbooleanrequired
transfer_countintegerrequired
minted_atstring (date-time) | nulloptional
last_transfer_atstring (date-time) | nulloptional
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: unknown
start_blockstring | nulloptional
First block covered, when known. Decimal string.
Example
{
"data": [
{
"collection_address": "0x0000000000000000000000000000000000000001",
"token_id": "1",
"network": "astar",
"current_owner": "0x0000000000000000000000000000000000000002",
"is_burned": false,
"transfer_count": 3,
"metadata_uri": "ipfs://bafkreiexampleexampleexampleexample/1.json",
"image_url": "ipfs://bafkreiexampleexampleexampleexample/1.png",
"media_url": "https://api.aradia.app/v1/media?url=ipfs%3A%2F%2Fbafkreiexampleexampleexampleexample%2F1.png",
"collection_name": "Example Collection",
"collection_symbol": "EXCOL"
}
],
"pagination": {
"limit": 20,
"has_more": true,
"next_page_params": {
"after_token_id": "1",
"after_id": 91422
}
},
"coverage": {
"status": "unknown"
}
}
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}/nfts
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.
  • after_token_id stringoptionalpattern: ^[0-9]{1,78}$
    Page boundary for token listings: return tokens after this id. Copy the value from next_page_params. Must be sent together with after_id.
  • after_id integeroptionalmin: 1
    Page boundary tie-break for token listings: the row id from next_page_params. Must be sent together with after_token_id.
  • include_burned booleanoptionaldefault: False
Response
Response appears here.

Get one NFT

Authorization

Send a bearer credential with the scope read:nfts.

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}$

Request Code Samples

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

NFT

Body application/json
dataobjectrequired
collection_addressstringrequired
Lowercase EVM address.
Example: 0x0000000000000000000000000000000000000001
token_idstringrequired
Example: 1
networkastarrequired
Example: astar
current_ownerstringrequired
Lowercase EVM address.
Example: 0x0000000000000000000000000000000000000002
metadata_uristring | nulloptional
namestring | nulloptional
descriptionstring | nulloptional
image_urlstring (uri) | nulloptional
Original metadata image source. Use as the fallback when media_url is absent.
media_urlstring (uri) | nulloptional
Aradia-hosted original bytes. Present only when the source has already been stored locally, so clients may use it without probing for a cache miss. Omitted when the cache has no stored copy; then use image_url.
attributesobject | nulloptional
media_typestring | nulloptional
collection_namestring | nulloptional
Name of the collection this token belongs to. Null when the collection has not been indexed yet.
Example: Example Collection
collection_symbolstring | nulloptional
Symbol of the collection this token belongs to.
Example: EXCOL
is_burnedbooleanrequired
Example: False
transfer_countintegerrequired
Example: 1
minted_atstring (date-time) | nulloptional
last_transfer_atstring (date-time) | nulloptional
Example
{
"data": {
"collection_address": "0x0000000000000000000000000000000000000001",
"token_id": "1",
"network": "astar",
"current_owner": "0x0000000000000000000000000000000000000002",
"is_burned": false,
"transfer_count": 1,
"collection_name": "Example Collection",
"collection_symbol": "EXCOL"
}
}
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."
}
}
404Resource not found
application/json

Resource not found

Body application/json
errorobjectrequired
codeINVALID_ARGUMENT | UNAUTHORIZED | FORBIDDEN | NOT_FOUND | RATE_LIMITED | RATE_LIMITER_UNAVAILABLE | SERVICE_UNAVAILABLE | INTERNAL_ERRORrequired
Example: NOT_FOUND
messagestringrequired
Example: The requested resource was not found.
request_idstringoptional
Example
{
"error": {
"code": "NOT_FOUND",
"message": "The requested resource was not found."
}
}
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}
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.
Response
Response appears here.

List NFTs currently owned by an address

Authorization

Send a bearer credential with the scope read:owners.

Parameters

addressstringpathrequired
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
after_collectionstringqueryoptional
Page boundary for owner holdings, which are ordered across collections. Required alongside after_token_id and after_id on that endpoint only.
pattern: ^0x[0-9a-f]{40}$
after_token_idstringqueryoptional
Page boundary for token listings: return tokens after this id. Copy the value from next_page_params. Must be sent together with after_id.
pattern: ^[0-9]{1,78}$
after_idintegerqueryoptional
Page boundary tie-break for token listings: the row id from next_page_params. Must be sent together with after_token_id.
min: 1

Request Code Samples

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

NFT page

Body application/json
dataarray[object]required
collection_addressstringrequired
Lowercase EVM address.
token_idstringrequired
networkastarrequired
current_ownerstringrequired
Lowercase EVM address.
metadata_uristring | nulloptional
namestring | nulloptional
descriptionstring | nulloptional
image_urlstring (uri) | nulloptional
Original metadata image source. Use as the fallback when media_url is absent.
media_urlstring (uri) | nulloptional
Aradia-hosted original bytes. Present only when the source has already been stored locally, so clients may use it without probing for a cache miss. Omitted when the cache has no stored copy; then use image_url.
attributesobject | nulloptional
media_typestring | nulloptional
collection_namestring | nulloptional
Name of the collection this token belongs to. Null when the collection has not been indexed yet.
collection_symbolstring | nulloptional
Symbol of the collection this token belongs to.
is_burnedbooleanrequired
transfer_countintegerrequired
minted_atstring (date-time) | nulloptional
last_transfer_atstring (date-time) | nulloptional
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: unknown
start_blockstring | nulloptional
First block covered, when known. Decimal string.
Example
{
"data": [
{
"collection_address": "0x0000000000000000000000000000000000000001",
"token_id": "1",
"network": "astar",
"current_owner": "0x0000000000000000000000000000000000000002",
"is_burned": false,
"transfer_count": 3,
"metadata_uri": "ipfs://bafkreiexampleexampleexampleexample/1.json",
"image_url": "ipfs://bafkreiexampleexampleexampleexample/1.png",
"media_url": "https://api.aradia.app/v1/media?url=ipfs%3A%2F%2Fbafkreiexampleexampleexampleexample%2F1.png",
"collection_name": "Example Collection",
"collection_symbol": "EXCOL"
}
],
"pagination": {
"limit": 20,
"has_more": true,
"next_page_params": {
"after_token_id": "1",
"after_id": 91422
}
},
"coverage": {
"status": "unknown"
}
}
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/owners/{address}/nfts
RequestJSON
What each field does
  • address stringrequiredpattern: ^0x[0-9a-f]{40}$
  • limit integeroptionalmin: 1, max: 100, default: 20
    How many items to return per page. Defaults to 20, maximum 100.
  • after_collection stringoptionalpattern: ^0x[0-9a-f]{40}$
    Page boundary for owner holdings, which are ordered across collections. Required alongside after_token_id and after_id on that endpoint only.
  • after_token_id stringoptionalpattern: ^[0-9]{1,78}$
    Page boundary for token listings: return tokens after this id. Copy the value from next_page_params. Must be sent together with after_id.
  • after_id integeroptionalmin: 1
    Page boundary tie-break for token listings: the row id from next_page_params. Must be sent together with after_token_id.
Response
Response appears here.