curl --request POST \
--url https://nexus.gerowallet.io/api/assets/metadata \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data nullimport requests
url = "https://nexus.gerowallet.io/api/assets/metadata"
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'}
};
fetch('https://nexus.gerowallet.io/api/assets/metadata', 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://nexus.gerowallet.io/api/assets/metadata",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "null",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$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://nexus.gerowallet.io/api/assets/metadata"
payload := strings.NewReader("null")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
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://nexus.gerowallet.io/api/assets/metadata")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("null")
.asString();require 'uri'
require 'net/http'
url = URI("https://nexus.gerowallet.io/api/assets/metadata")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "null"
response = http.request(request)
puts response.read_body""{
"error": "At most 100 units per call"
}{
"error": "Operation Not Supported"
}{
"error": "Service Unavailable"
}Get the metadata of many native assets in one call
Resolve the metadata of up to 100 assets in one call. Every requested unit is a key of the response’s data object, in request order and in your own spelling; a unit that is unknown or has none of the three kinds of metadata maps to null rather than being dropped, so the response can be read against the request without re-deriving it. onchainMetadata is only the asset’s own CIP-25 entry from label 721 of its minting transaction, not the whole label-721 body, and it is an object. This differs from detailedInfo’s onchainMetadata, which is the whole minting-transaction metadata as JSON text. cip68Metadata is the CIP-68 reference datum’s metadata map decoded to JSON: byte strings become UTF-8 text where they are valid UTF-8, otherwise they stay hex, and chunked lists stay arrays. cip68Version is the datum’s version field. metadata is the token-registry entry, the same object detailedInfo returns as metadata. Served by one Koios asset_info call, because yaci-store indexes no asset metadata. Works on mainnet, preprod and preview.
curl --request POST \
--url https://nexus.gerowallet.io/api/assets/metadata \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data nullimport requests
url = "https://nexus.gerowallet.io/api/assets/metadata"
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'}
};
fetch('https://nexus.gerowallet.io/api/assets/metadata', 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://nexus.gerowallet.io/api/assets/metadata",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "null",
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$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://nexus.gerowallet.io/api/assets/metadata"
payload := strings.NewReader("null")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
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://nexus.gerowallet.io/api/assets/metadata")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("null")
.asString();require 'uri'
require 'net/http'
url = URI("https://nexus.gerowallet.io/api/assets/metadata")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "null"
response = http.request(request)
puts response.read_body""{
"error": "At most 100 units per call"
}{
"error": "Operation Not Supported"
}{
"error": "Service Unavailable"
}Authorizations
API key (programmatic access — recommended)
Send your API key in the X-Api-Key header. Keys start with nxs_ and are
created in the dashboard (or via POST /api/keys with a session JWT).
Each key is scoped to one chain and one network (for example
CARDANO_MAINNET), fixed at creation time. It cannot query a different network
on the same chain, and it cannot query a different chain at all. A mismatched
network parameter returns 400 Network Mismatch. Create one key per chain
and network under the same account.
This is the credential most integrations should use.
Query Parameters
Accepts either the value listed here (CARDANO_MAINNET) or its kebab-case alias (cardano-mainnet); matching is case-insensitive. Omit it and the network is taken from the API key. A value that disagrees with the key's own network returns 400 Network Mismatch.
CARDANO_MAINNET, CARDANO_PREPROD, CARDANO_PREVIEW, APEX_PRIME_MAINNET, APEX_VECTOR_MAINNET, APEX_VECTOR_TESTNET, MIDNIGHT_MAINNET, MIDNIGHT_PREPROD, MIDNIGHT_STAGENET, BITCOIN_MAINNET, BITCOIN_TESTNET4 Body
Bulk asset metadata request
Asset units (56-hex policy id followed by the asset-name hex), max 100 per call
100^[a-fA-F0-9]{56}(?:[a-fA-F0-9]{2}){0,32}$[
"9a2ec5c92daccbb269611a9eae7a40f9788d3f9c0229661b6234286f000de1406f766f3532"
]
Response
Metadata resolved
Asset metadata keyed by unit
Unit to its metadata. Every requested unit is present, in request order and in the caller's spelling; a unit that is unknown or has none of the three kinds of metadata maps to null.
Show child attributes
Show child attributes
{
"9a2ec5c92daccbb269611a9eae7a40f9788d3f9c0229661b6234286f000de1406f766f3532": {
"onchainMetadata": null,
"cip68Metadata": {
"name": "OVO 52",
"image": "ipfs://QmerWgPdvgPqS2KUo7jMKd2UUNt5D68iEmTJcTM4Ffv5XQ",
"mediaType": "image/gif"
},
"cip68Version": 1,
"metadata": null
}
}