API documentation
Version 1.1.0. Read-only REST access to the registry for systems and agents. Base URL https://tokenization.glassnode.com/api/v1.
Authentication
Every request needs an API key issued by Glassnode, sent as a Bearer token. Keys look like tk_live_… and are shown once when created. A key in a query string is rejected. Request a key on the API access page.
curl -sS -H "Authorization: Bearer $TOKENIZATION_API_KEY" https://tokenization.glassnode.com/api/v1/changes/head
Responses carry X-Request-Id, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset and the daily X-Quota-Daily-* headers. Quote the request id when reporting a problem.
Staying in sync
- Call
GET /snapshotonce. It streams the whole registry and includes acursor. - On a schedule, call
GET /changes?since=<cursor>. Each event carries the entity’s current record. - Apply events as upserts keyed by
entity_typeandentity_id; treatop: deletedas a removal. - Store
next_cursor, and keep paging whilehas_moreis true. A page can carry zero events while has_more is true, because limit counts underlying audit rows, so loop on has_more, never on the event count.
Delivery is at-least-once: an entity touched across a page boundary can appear twice, always with its current state, so upserts are safe to repeat. Changes to embedded data surface on the parent as well: a deployment or provenance change produces a deployment event and an updated event for its product; a document or listing change updates the issuer or product; an issuer listing change also updates the venue. Events appear once every older database transaction has finished, so a long ingestion run can delay the feed by minutes. Cursors never expire, except that a cursor from an earlier feed epoch (after a database restore) is rejected with invalid_cursor, which means take a new snapshot.
Identifiers and lifecycle
- Every record has an
id: a lowercase slug assigned by the registry, such ascoinbase,aaplcorul-aapl. Ids never change and are never reused. Key your storage on entity type plus id. - Retirement is a status, not a deletion. A product, deployment or derivative that an issuer winds down stays in the data with
status: inactive; deployments can also bedeprecated. - An event with
op: deletedmeans a record was removed outright, which is rare and means a correction or a de-duplication. Itsrecordholds the last known top-level fields when available and null otherwise; treat both as “remove this id”. nullmeans the registry has not established a value. In the issuer fields custodian, governing law and regulator,not disclosedmeans the issuer’s documents were read and name none, andNone (…)means the structure has none, with the reason. Several custodians are joined with “ / ”.- Fields may be added within v1; none are removed, renamed or retyped. Ignore unknown fields.
- The snapshot holds about 5,800 products and 21,600 deployments as of October 2026, roughly 15 MB of JSON and a few MB gzipped.
Endpoints
Lists issuers ordered by id with cursor pagination: pass the previous page's next_cursor as cursor until next_cursor is null. Filters match exactly and combine with AND; each may be given once. Responses carry an ETag; send If-None-Match to receive 304 when nothing changed.
| limit | optional | Page size Default 100. Max 500. |
| cursor | optional | next_cursor from the previous page (the last id returned) |
| jurisdiction | optional | ISO 3166-1 alpha-2 country code |
| status | optional | active or inactive |
| custodian | optional | Exact custodian value as recorded |
| id | required |
curl -sS -H "Authorization: Bearer $TOKENIZATION_API_KEY" https://tokenization.glassnode.com/api/v1/issuers/coinbase
Lists assets ordered by id with cursor pagination: pass the previous page's next_cursor as cursor until next_cursor is null. Filters match exactly and combine with AND; each may be given once. ticker, isin match case-insensitively. Responses carry an ETag; send If-None-Match to receive 304 when nothing changed.
| limit | optional | Page size Default 100. Max 500. |
| cursor | optional | next_cursor from the previous page (the last id returned) |
| asset_class | optional | stocks, funds-etfs, us-treasury-funds, non-us-govt-debt, corporate-bonds, credit, commodities, stablecoins, indices, pe-vc, real-estate or insurance-linked; the list can grow |
| ticker | optional | Exchange ticker |
| isin | optional | ISIN |
| id | required |
Lists products ordered by id with cursor pagination: pass the previous page's next_cursor as cursor until next_cursor is null. Filters match exactly and combine with AND; each may be given once. symbol, isin match case-insensitively. Responses carry an ETag; send If-None-Match to receive 304 when nothing changed.
| limit | optional | Page size Default 100. Max 500. |
| cursor | optional | next_cursor from the previous page (the last id returned) |
| issuer | optional | Issuer id |
| asset | optional | Asset id |
| status | optional | active or inactive |
| symbol | optional | Product symbol |
| isin | optional | ISIN |
curl -sS -H "Authorization: Bearer $TOKENIZATION_API_KEY" \ "https://tokenization.glassnode.com/api/v1/products?issuer=coinbase&status=active&limit=200"
| id | required |
Lists deployments ordered by id with cursor pagination: pass the previous page's next_cursor as cursor until next_cursor is null. Filters match exactly and combine with AND; each may be given once. address matches plain hex (0x) addresses case-insensitively and everything else exactly. Responses carry an ETag; send If-None-Match to receive 304 when nothing changed.
| limit | optional | Page size Default 100. Max 500. |
| cursor | optional | next_cursor from the previous page (the last id returned) |
| product | optional | Product id |
| chain | optional | Chain id, e.g. ethereum, solana, base |
| status | optional | active, deprecated or inactive |
| verification_status | optional | Registry verification state; published rows are verified |
| address | optional | Contract or mint address; plain hex (0x) addresses match case-insensitively, everything else exactly |
curl -sS -H "Authorization: Bearer $TOKENIZATION_API_KEY" \ "https://tokenization.glassnode.com/api/v1/deployments?chain=solana&address=NVDAVuiB7hwd3m5Wa1JuHNovPaPG6BH1QNztbKFxNjv"
| id | required |
Lists venues ordered by id with cursor pagination: pass the previous page's next_cursor as cursor until next_cursor is null. Filters match exactly and combine with AND; each may be given once. Responses carry an ETag; send If-None-Match to receive 304 when nothing changed.
| limit | optional | Page size Default 100. Max 500. |
| cursor | optional | next_cursor from the previous page (the last id returned) |
| venue_type | optional | cex, perp-dex or rwa-exchange; the list can grow |
| id | required |
Lists derivatives ordered by id with cursor pagination: pass the previous page's next_cursor as cursor until next_cursor is null. Filters match exactly and combine with AND; each may be given once. symbol match case-insensitively. Responses carry an ETag; send If-None-Match to receive 304 when nothing changed.
| limit | optional | Page size Default 100. Max 500. |
| cursor | optional | next_cursor from the previous page (the last id returned) |
| asset | optional | Asset id |
| venue | optional | Venue id |
| status | optional | prelisted, active or inactive |
| instrument_type | optional | perpetual or dated-future |
| symbol | optional | Venue symbol |
| id | required |
Streams every issuer, asset, product (with deployments and provenance), venue and derivative as a single JSON document, gzip-compressed when the client accepts gzip, read in one consistent transaction together with the change cursor to continue from. About 15 MB uncompressed as of October 2026. Counts as 50 requests against the daily quota, limited to 10 snapshots per key per day, at most two generated concurrently.
curl -sS --compressed -H "Authorization: Bearer $TOKENIZATION_API_KEY" \ https://tokenization.glassnode.com/api/v1/snapshot -o snapshot.json
Returns one event per changed entity, ordered by cursor, each carrying the entity's current record. See the Staying in sync section above for the full contract. Costs ceil(limit / 100) requests.
| since | required | Cursor from /snapshot, /changes/head or a previous next_cursor |
| limit | optional | Maximum number of underlying audit rows read per page; the number of events returned can be lower, including zero while has_more is true Default 100. Max 500. |
curl -sS -H "Authorization: Bearer $TOKENIZATION_API_KEY" \ "https://tokenization.glassnode.com/api/v1/changes?since=$CURSOR&limit=200"
Returns the newest committed cursor. Use it to start following changes without taking a snapshot, or to measure how far behind a client is.
curl -sS -H "Authorization: Bearer $TOKENIZATION_API_KEY" https://tokenization.glassnode.com/api/v1/changes/head
Limits
- 300 requests per minute and 50,000 per day per key by default, counted on the server clock in UTC.
- A snapshot counts as 50 requests and is limited to 10 per key per day. At most two snapshots are generated at once.
- Limited responses return 429 with
Retry-Afterin seconds and do not count toward the quota. - Only GET is supported. Responses are JSON (the snapshot is gzip-compressed when the client accepts gzip) and are sent with Cache-Control private, no-store; list and detail responses still carry an ETag for If-None-Match, and a 304 counts as a request.
Errors
Errors return { "error": { "code", "message", "request_id" } }.
| 401 | unauthorized | No key, a malformed key, a key sent in the URL, or an unknown key. |
| 403 | forbidden | The key has been revoked. |
| 429 | rate_limited | More than the per-minute allowance; wait for Retry-After seconds. |
| 429 | quota_exceeded | The daily quota is used up; resets at 00:00 UTC. |
| 429 | snapshot_limit | More snapshots than the key allows in one UTC day. |
| 503 | snapshot_busy | Snapshot capacity is busy; retry after Retry-After seconds. |
| 400 | invalid_parameter | A query parameter is missing or out of range. |
| 400 | invalid_cursor | The since value was not issued by this API. |
| 404 | not_found | No entity with that id. |
| 500 | internal_error | Unexpected failure; quote the request_id when reporting it. |
Records
Field names match the site’s vocabulary. Timestamps are ISO 8601 in UTC. Retired products and deployments stay in the data with status: inactive. The full JSON Schema for every record is in the OpenAPI definition.
| id | string | Lowercase slug assigned by the registry; immutable and never reusede.g. coinbase |
| name | string | e.g. Coinbase (Tokenized Equities) |
| legal_name | string, nullable | Issuing legal entity; null when not yet established from documents |
| jurisdiction | string, nullable | ISO 3166-1 alpha-2 country code of the issuing entitye.g. AE |
| website | string (uri), nullable | |
| status | string | active or inactive; retired entities stay listed as inactive and are never deleted for retirementactive · inactive |
| catalog_status | string, nullable | Curation state: brand = umbrella record that issues nothing (its products sit under subsidiaries); incomplete = the issuer publishes no address list, so the catalog is known to be partial; null = normal |
| parent_issuer_id | string, nullable | Issuer id of the brand or parent record, when the issuer is a subsidiary |
| lei | string, nullable | Legal Entity Identifier (GLEIF) |
| offering_regime | string, nullable | Free text, e.g. 'Reg S' or 'EU prospectus (FMA Liechtenstein)' |
| custodian | string, nullable | Custodian of the underlying per the issuer's documents. 'not disclosed' = the documents were read and name no custodian; several custodians are joined with ' / '; 'None (...)' = the structure has none, with the reason; null = not yet researchede.g. Alpaca Securities LLC |
| governing_law | string, nullable | Law governing the token or security terms, e.g. 'Swiss law'; 'not disclosed' and null as for custodian |
| regulator | string, nullable | Supervising authority, or an approval-only authority with a qualifier such as 'FMA Liechtenstein (prospectus approval)'; 'not disclosed' and null as for custodiane.g. FSRA, ADGM (prospectus approval) |
| created_at | string (date-time) | When the record entered the registry, UTC |
| documents | array | List of Document objects |
| venue_listings | array | List of IssuerVenueListing objects |
| id | string | Lowercase slug assigned by the registry; immutable and never reusede.g. ul-aapl |
| name | string | e.g. Apple |
| ticker | string, nullable | Primary exchange tickere.g. AAPL |
| asset_class | string | One of: stocks, funds-etfs, us-treasury-funds, non-us-govt-debt, corporate-bonds, credit, commodities, stablecoins, indices, pe-vc, real-estate, insurance-linked. The list can growe.g. stocks |
| isin | string, nullable | |
| figi | string, nullable | |
| currency | string, nullable | ISO 4217 code of the asset's quote currency |
| description | string, nullable | |
| exposure | string, nullable | crypto = a registered fund whose own holdings are crypto assets (spot or futures ETFs); real-world otherwise; null = not classifiedreal-world · crypto |
| created_at | string (date-time) |
| id | string | Lowercase slug assigned by the registry; immutable and never reusede.g. aaplc |
| issuer_id | string | e.g. coinbase |
| underlying_asset_id | string | e.g. ul-aapl |
| name | string | e.g. Apple (Coinbase Tokenized) |
| symbol | string | Token symbol as the issuer presents ite.g. AAPLc |
| legal_structure | string, nullable | Free text from the issuer's documents |
| backing_model | string, nullable | Free text from the issuer's documents |
| isin | string, nullable | |
| status | string | active or inactive; retired entities stay listed as inactive and are never deleted for retirementactive · inactive |
| parent_product_id | string, nullable | For wrappers, the product that is wrapped |
| backing_relationship | string, nullable | direct = the token represents the asset itself; wrapper = it wraps another registry product; null = not classifieddirect · wrapper |
| created_at | string (date-time) | |
| deployments | array | List of Deployment objects |
| documents | array | List of Document objects |
| venue_listings | array | List of ProductVenueListing objects |
| id | string | Lowercase slug assigned by the registry; immutable and never reusede.g. aaplc-base-9f2a1c |
| product_id | string | e.g. aaplc |
| chain | string | Registry chain id, lowercase; an open list (ethereum, base, solana, arbitrum, polygon, avalanche, bnb, sui, aptos, stellar, xrpl, tron, ton, canton, provenance, ...)e.g. base |
| token_standard | string, nullable | Free text, e.g. ERC-20, SPL, SPL Token-2022, Stellar asset |
| contract_address | string | Contract or mint address in the chain's native format; EVM addresses are lowercase hex |
| decimals | integer, nullable | |
| verification_status | string | Registry verification of the address against chain data and the issuer's source; published rows are 'verified' |
| status | string | active = live; deprecated = still on chain but superseded by the issuer; inactive = retired or delisted. Rows are never deleted for retirementactive · deprecated · inactive |
| issuance_model | string, nullable | How this chain's supply is issued; null = not classifiednative · bridged · omnichain |
| interop_provider | string, nullable | Bridge or interoperability provider when issuance_model is bridged or omnichain, e.g. LayerZero, CCTP, Wormhole |
| network_type | string, nullable | public · permissioned |
| effective_from | string (date), nullable | First date the deployment is known to have been live |
| effective_to | string (date), nullable | Date the deployment was retired, when known |
| created_at | string (date-time) | |
| provenance | array | List of Provenance objects |
| id | string | Lowercase slug assigned by the registry; immutable and never reusede.g. kraken |
| name | string | e.g. Kraken |
| venue_type | string, nullable | cex, perp-dex or rwa-exchange; the list can grow |
| website | string (uri), nullable | |
| issuer_listings | array | List of VenueIssuerListing objects |
| id | string | Lowercase slug assigned by the registry; immutable and never reusede.g. binance-aaplusdt-perp |
| underlying_asset_id | string | e.g. ul-aapl |
| instrument_type | string | perpetual · dated-future |
| symbol | string | Symbol as the venue lists ite.g. AAPLUSDT |
| venue_id | string | e.g. binance |
| sub_venue | string, nullable | Market segment within the venue, when the venue separates them |
| chain | string, nullable | Chain for on-chain venues; null for centralized venues |
| market_identifier | string, nullable | Venue-native market id when it differs from the symbol |
| settlement_asset | string, nullable | e.g. USDT |
| expiry | string (date), nullable | Dated futures only |
| strike | number, nullable | |
| operator | string, nullable | Operating entity when it differs from the venue |
| status | string | prelisted = announced by the venue but not yet trading; inactive = delisted; rows are never deleted for delistingprelisted · active · inactive |