Truvo docs
How to read an Asset Passport, how fresh the data is, and how to use the API.
Getting started
Quickstart
No sign-up is needed for read access. The API is at https://api.truvo.site and returns JSON.
1. Look up a contract
Identify assets by chain ID and contract address, never by ticker. Robinhood Chain mainnet is chain 4663.
curl
curl https://api.truvo.site/v1/assets/4663/0x322f0929c4625ed5bad873c95208d54e1c003b2d
The response is an envelope; the passport is in data:
response (abridged)
{
"schema_version": "1.0.0",
"observed_at": "2026-10-23T09:00:00.000Z",
"freshness": { "status": "partial", "oldest_observed_at": "…", "stale_fields": [] },
"references": ["https://api.robinhood.com/rhj/assets", "https://docs.robinhood.com/chain/stock-tokens/"],
"data": {
"symbol": "TSLA",
"status": "verified",
"claims": [
{ "claim_type": "underlying_isin", "claim_value": "US88160R1014", "status": "verified", "source_ids": ["src_rh_rhj_assets"] },
{ "claim_type": "price_feed", "claim_value": null, "status": "unknown" }
]
}
}2. Decide what to show
Check the asset-level status before showing anything as the real asset:
verified: the address matches the official registry and no field is stale or in conflict.stale/conflicting: identity is confirmed, but some fields are old or disputed; show them with their status.unverified: the address is not confirmed by an official source. Do not present it as the asset its name suggests.- A 404 means Truvo has no record for the address. That is not a verdict either way.
TypeScript
const res = await fetch(`https://api.truvo.site/v1/assets/4663/${address}`);
if (res.status === 404) return { known: false };
const { data, observed_at } = await res.json();
const isin = data.claims.find((c) => c.claim_type === "underlying_isin");
return {
known: true,
trustworthyIdentity: data.status !== "unverified",
isin: isin?.claim_value ?? null, // null means unknown, never ""
asOf: observed_at,
};null as “unknown”. Truvo never fills a missing value with zero, an empty string or a default.3. Search and list
curl
# every contract whose symbol or name matches, with status curl "https://api.truvo.site/v1/assets?q=TSLA" # only ETF tokens, 100 per page curl "https://api.truvo.site/v1/assets?asset_type=etf_token&limit=100&offset=0"
A ticker search returns every contract using that ticker. Pick by address and status, never by the first result.
4. Limits and keys
Rate limits
Anonymous requests: 60 per minute per IP. With an API key in the x-api-key header: 600 per minute. Responses carry x-ratelimit-* headers; a 429 comes with retry-after.
Errors
Errors have one shape: { "error": { "code", "message", "request_id" } }. Quote therequest_id when you report a problem.
Full details: REST API reference.