truvo

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,
};
Treat null as “unknown”. Truvo never fills a missing value with zero, an empty string or a default.

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.