Collections
Endpoint https://api.aradia.app
3 endpoints in this section: GET /v1/collections, HEAD /v1/collections, GET /v1/collections/{address}.
GET /v1/collections
Section titled “GET /v1/collections”List Astar NFT collections
Newest first, ordered by indexing time. Collections whose metadata is recorded as empty are omitted, so this list is narrower than the full set of contracts the indexer has seen. Fetch a single collection by address with GET /v1/collections/{address}, which applies no such filter.
Authorization
Send a bearer credential with the scope read:collections.
Parameters
limitintegerqueryoptionalbefore_timestampintegerqueryoptionalbefore_idintegerqueryoptionalnetworkastarqueryoptionalsearchstringqueryoptionalRequest Code Samples
/v1/collectionscurl -sS -X GET \ -H "Authorization: Bearer $ARADIA_API_TOKEN" \ "https://api.aradia.app/v1/collections"const token = process.env.ARADIA_API_TOKEN;
const response = await fetch("https://api.aradia.app/v1/collections", { 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", 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", 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', 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")) .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')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") .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");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' ` -Headers $headers
$response | ConvertTo-Json -Depth 6200Collection page
Collection page
Body application/json
20TrueunknownExample
{ "data": [ { "contract_address": "0x0000000000000000000000000000000000000001", "network": "astar", "name": "Example Collection", "symbol": "EXCOL", "image_url": "https://wsrv.nl/?url=https%3A%2F%2Fipfs.io%2Fipfs%2FQmExample%2F1.png", "contract_type": "ERC721", "total_supply": "10000", "unique_holders": "2799", "total_transfers": "11163", "creator_address": "0x00000000000000000000000000000000000000c7", "deploy_tx_hash": "0x0000000000000000000000000000000000000000000000000000000000000abc", "created_at": "2026-08-01T00:00:00Z" } ], "pagination": { "limit": 20, "has_more": true, "next_page_params": { "before_timestamp": 1780245600123456, "before_id": 26228 } }, "coverage": { "status": "unknown" }}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
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.networkastaroptionaldefault: astarChain to query. Only Astar mainnet is indexed today.searchstringoptionalmaxLength: 200Case-insensitive substring match on collection name and symbol. A full contract address is treated as an exact lookup on that collection.
Response appears here.
HEAD /v1/collections
Section titled “HEAD /v1/collections”Inspect collection-list availability without a response body
Authorization
Send a bearer credential with the scope read:collections.
Parameters
limitintegerqueryoptionalbefore_timestampintegerqueryoptionalbefore_idintegerqueryoptionalnetworkastarqueryoptionalsearchstringqueryoptionalRequest Code Samples
/v1/collectionscurl -sS -X HEAD \ -H "Authorization: Bearer $ARADIA_API_TOKEN" \ "https://api.aradia.app/v1/collections"const token = process.env.ARADIA_API_TOKEN;
const response = await fetch("https://api.aradia.app/v1/collections", { method: "HEAD", 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( "HEAD", "https://api.aradia.app/v1/collections", 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("HEAD", "https://api.aradia.app/v1/collections", 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' => 'HEAD', 'header' => "Authorization: Bearer $token\r\n", ],]);
$body = file_get_contents('https://api.aradia.app/v1/collections', 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")) .header("Authorization", "Bearer " + System.getenv("ARADIA_API_TOKEN")) .method("HEAD", 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')request = Net::HTTP::Head.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 .head("https://api.aradia.app/v1/collections") .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("HEAD"), "https://api.aradia.app/v1/collections");var response = await client.SendAsync(request);Console.WriteLine(await response.Content.ReadAsStringAsync());$headers = @{ Authorization = "Bearer $env:ARADIA_API_TOKEN" }
$response = Invoke-RestMethod -Method HEAD ` -Uri 'https://api.aradia.app/v1/collections' ` -Headers $headers
$response | ConvertTo-Json -Depth 6200Collection endpoint is available
Collection endpoint is available
Body application/json
No response body.
Example
This status returns no body.
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
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.networkastaroptionaldefault: astarChain to query. Only Astar mainnet is indexed today.searchstringoptionalmaxLength: 200Case-insensitive substring match on collection name and symbol. A full contract address is treated as an exact lookup on that collection.
Response appears here.
GET /v1/collections/{address}
Section titled “GET /v1/collections/{address}”Get one collection
Authorization
Send a bearer credential with the scope read:collections.
Parameters
addressstringpathrequirednetworkastarqueryoptionalRequest Code Samples
/v1/collections/{address}curl -sS -X GET \ -H "Authorization: Bearer $ARADIA_API_TOKEN" \ "https://api.aradia.app/v1/collections/0x0000000000000000000000000000000000000001"const token = process.env.ARADIA_API_TOKEN;
const response = await fetch("https://api.aradia.app/v1/collections/0x0000000000000000000000000000000000000001", { 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", 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", 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', 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")) .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')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") .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");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' ` -Headers $headers
$response | ConvertTo-Json -Depth 6200Collection
Collection
Body application/json
0x0000000000000000000000000000000000000001astarExample CollectionERC721100002799111630x00000000000000000000000000000000000000c70x0000000000000000000000000000000000000000000000000000000000000abc2026-08-01T00:00:00ZExample
{ "data": { "contract_address": "0x0000000000000000000000000000000000000001", "network": "astar", "name": "Example Collection", "image_url": "https://wsrv.nl/?url=https%3A%2F%2Fipfs.io%2Fipfs%2FQmExample%2F1.png", "contract_type": "ERC721", "total_supply": "10000", "unique_holders": "2799", "total_transfers": "11163", "creator_address": "0x00000000000000000000000000000000000000c7", "deploy_tx_hash": "0x0000000000000000000000000000000000000000000000000000000000000abc", "created_at": "2026-08-01T00:00:00Z" }}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." }}404Resource not found
Resource not found
Body application/json
NOT_FOUNDThe requested resource was not found.Example
{ "error": { "code": "NOT_FOUND", "message": "The requested resource was not found." }}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.networkastaroptionaldefault: astarChain to query. Only Astar mainnet is indexed today.
Response appears here.
