Glassnode TokenizationGlassnode Tokenization

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

  1. Call GET /snapshot once. It streams the whole registry and includes a cursor.
  2. On a schedule, call GET /changes?since=<cursor>. Each event carries the entity’s current record.
  3. Apply events as upserts keyed by entity_type and entity_id; treat op: deleted as a removal.
  4. Store next_cursor, and keep paging while has_more is 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 as coinbase, aaplc or ul-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 be deprecated.
  • An event with op: deleted means a record was removed outright, which is rare and means a correction or a de-duplication. Its record holds the last known top-level fields when available and null otherwise; treat both as “remove this id”.
  • null means the registry has not established a value. In the issuer fields custodian, governing law and regulator, not disclosed means the issuer’s documents were read and name none, and None (…) 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

GET/api/v1/issuersIssuing entities

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.

limitoptionalPage size Default 100. Max 500.
cursoroptionalnext_cursor from the previous page (the last id returned)
jurisdictionoptionalISO 3166-1 alpha-2 country code
statusoptionalactive or inactive
custodianoptionalExact custodian value as recorded
GET/api/v1/issuers/{id}One issuer by id
idrequired
curl -sS -H "Authorization: Bearer $TOKENIZATION_API_KEY" https://tokenization.glassnode.com/api/v1/issuers/coinbase
GET/api/v1/assetsReal-world assets with at least one tokenized product

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.

limitoptionalPage size Default 100. Max 500.
cursoroptionalnext_cursor from the previous page (the last id returned)
asset_classoptionalstocks, 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
tickeroptionalExchange ticker
isinoptionalISIN
GET/api/v1/assets/{id}One asset by id
idrequired
GET/api/v1/productsTokenized products with their deployments

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.

limitoptionalPage size Default 100. Max 500.
cursoroptionalnext_cursor from the previous page (the last id returned)
issueroptionalIssuer id
assetoptionalAsset id
statusoptionalactive or inactive
symboloptionalProduct symbol
isinoptionalISIN
curl -sS -H "Authorization: Bearer $TOKENIZATION_API_KEY" \
  "https://tokenization.glassnode.com/api/v1/products?issuer=coinbase&status=active&limit=200"
GET/api/v1/products/{id}One product by id
idrequired
GET/api/v1/deploymentsContract deployments with their provenance

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.

limitoptionalPage size Default 100. Max 500.
cursoroptionalnext_cursor from the previous page (the last id returned)
productoptionalProduct id
chainoptionalChain id, e.g. ethereum, solana, base
statusoptionalactive, deprecated or inactive
verification_statusoptionalRegistry verification state; published rows are verified
addressoptionalContract 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"
GET/api/v1/deployments/{id}One deployment by id
idrequired
GET/api/v1/venuesTrading venues with issuer-level listings

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.

limitoptionalPage size Default 100. Max 500.
cursoroptionalnext_cursor from the previous page (the last id returned)
venue_typeoptionalcex, perp-dex or rwa-exchange; the list can grow
GET/api/v1/venues/{id}One venue by id
idrequired
GET/api/v1/derivativesPerpetuals and futures referencing registry assets

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.

limitoptionalPage size Default 100. Max 500.
cursoroptionalnext_cursor from the previous page (the last id returned)
assetoptionalAsset id
venueoptionalVenue id
statusoptionalprelisted, active or inactive
instrument_typeoptionalperpetual or dated-future
symboloptionalVenue symbol
GET/api/v1/derivatives/{id}One derivative by id
idrequired
GET/api/v1/snapshotThe whole registry as one document

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
GET/api/v1/changesEntities changed since a cursor

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.

sincerequiredCursor from /snapshot, /changes/head or a previous next_cursor
limitoptionalMaximum 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"
GET/api/v1/changes/headThe current end of the change log

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-After in 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" } }.

401unauthorizedNo key, a malformed key, a key sent in the URL, or an unknown key.
403forbiddenThe key has been revoked.
429rate_limitedMore than the per-minute allowance; wait for Retry-After seconds.
429quota_exceededThe daily quota is used up; resets at 00:00 UTC.
429snapshot_limitMore snapshots than the key allows in one UTC day.
503snapshot_busySnapshot capacity is busy; retry after Retry-After seconds.
400invalid_parameterA query parameter is missing or out of range.
400invalid_cursorThe since value was not issued by this API.
404not_foundNo entity with that id.
500internal_errorUnexpected 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.

Issuer
idstringLowercase slug assigned by the registry; immutable and never reusede.g. coinbase
namestringe.g. Coinbase (Tokenized Equities)
legal_namestring, nullableIssuing legal entity; null when not yet established from documents
jurisdictionstring, nullableISO 3166-1 alpha-2 country code of the issuing entitye.g. AE
websitestring (uri), nullable
statusstringactive or inactive; retired entities stay listed as inactive and are never deleted for retirementactive · inactive
catalog_statusstring, nullableCuration 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_idstring, nullableIssuer id of the brand or parent record, when the issuer is a subsidiary
leistring, nullableLegal Entity Identifier (GLEIF)
offering_regimestring, nullableFree text, e.g. 'Reg S' or 'EU prospectus (FMA Liechtenstein)'
custodianstring, nullableCustodian 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_lawstring, nullableLaw governing the token or security terms, e.g. 'Swiss law'; 'not disclosed' and null as for custodian
regulatorstring, nullableSupervising 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_atstring (date-time)When the record entered the registry, UTC
documentsarrayList of Document objects
venue_listingsarrayList of IssuerVenueListing objects
Asset
idstringLowercase slug assigned by the registry; immutable and never reusede.g. ul-aapl
namestringe.g. Apple
tickerstring, nullablePrimary exchange tickere.g. AAPL
asset_classstringOne 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
isinstring, nullable
figistring, nullable
currencystring, nullableISO 4217 code of the asset's quote currency
descriptionstring, nullable
exposurestring, nullablecrypto = a registered fund whose own holdings are crypto assets (spot or futures ETFs); real-world otherwise; null = not classifiedreal-world · crypto
created_atstring (date-time)
Product
idstringLowercase slug assigned by the registry; immutable and never reusede.g. aaplc
issuer_idstringe.g. coinbase
underlying_asset_idstringe.g. ul-aapl
namestringe.g. Apple (Coinbase Tokenized)
symbolstringToken symbol as the issuer presents ite.g. AAPLc
legal_structurestring, nullableFree text from the issuer's documents
backing_modelstring, nullableFree text from the issuer's documents
isinstring, nullable
statusstringactive or inactive; retired entities stay listed as inactive and are never deleted for retirementactive · inactive
parent_product_idstring, nullableFor wrappers, the product that is wrapped
backing_relationshipstring, nullabledirect = the token represents the asset itself; wrapper = it wraps another registry product; null = not classifieddirect · wrapper
created_atstring (date-time)
deploymentsarrayList of Deployment objects
documentsarrayList of Document objects
venue_listingsarrayList of ProductVenueListing objects
Deployment
idstringLowercase slug assigned by the registry; immutable and never reusede.g. aaplc-base-9f2a1c
product_idstringe.g. aaplc
chainstringRegistry 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_standardstring, nullableFree text, e.g. ERC-20, SPL, SPL Token-2022, Stellar asset
contract_addressstringContract or mint address in the chain's native format; EVM addresses are lowercase hex
decimalsinteger, nullable
verification_statusstringRegistry verification of the address against chain data and the issuer's source; published rows are 'verified'
statusstringactive = live; deprecated = still on chain but superseded by the issuer; inactive = retired or delisted. Rows are never deleted for retirementactive · deprecated · inactive
issuance_modelstring, nullableHow this chain's supply is issued; null = not classifiednative · bridged · omnichain
interop_providerstring, nullableBridge or interoperability provider when issuance_model is bridged or omnichain, e.g. LayerZero, CCTP, Wormhole
network_typestring, nullablepublic · permissioned
effective_fromstring (date), nullableFirst date the deployment is known to have been live
effective_tostring (date), nullableDate the deployment was retired, when known
created_atstring (date-time)
provenancearrayList of Provenance objects
Venue
idstringLowercase slug assigned by the registry; immutable and never reusede.g. kraken
namestringe.g. Kraken
venue_typestring, nullablecex, perp-dex or rwa-exchange; the list can grow
websitestring (uri), nullable
issuer_listingsarrayList of VenueIssuerListing objects
Derivative
idstringLowercase slug assigned by the registry; immutable and never reusede.g. binance-aaplusdt-perp
underlying_asset_idstringe.g. ul-aapl
instrument_typestringperpetual · dated-future
symbolstringSymbol as the venue lists ite.g. AAPLUSDT
venue_idstringe.g. binance
sub_venuestring, nullableMarket segment within the venue, when the venue separates them
chainstring, nullableChain for on-chain venues; null for centralized venues
market_identifierstring, nullableVenue-native market id when it differs from the symbol
settlement_assetstring, nullablee.g. USDT
expirystring (date), nullableDated futures only
strikenumber, nullable
operatorstring, nullableOperating entity when it differs from the venue
statusstringprelisted = announced by the venue but not yet trading; inactive = delisted; rows are never deleted for delistingprelisted · active · inactive