{
  "openapi": "3.1.0",
  "info": {
    "title": "Glassnode Tokenization API",
    "version": "1.1.0",
    "description": "Read access to the Glassnode Tokenization registry: issuers, real-world assets, tokenized products, contract deployments with their issuer-published sources, trading venues and derivatives.\n\n## Authentication\nSend an API key issued by Glassnode as `Authorization: Bearer tk_live_...`. Keys in query strings are rejected. Every response carries `X-Request-Id` and rate-limit headers.\n\n## Identifiers\nEvery record has an `id`: a lowercase slug assigned by the registry (for example `coinbase`, `aaplc`, `ul-aapl`). Ids never change and are never reused. Key your own storage on `entity_type` plus `id`.\n\n## Retirement versus deletion\nA product, deployment or derivative that an issuer winds down stays in the data with `status: inactive` (deployments can also be `deprecated`). Only an outright removal, which is rare and means a correction or a de-duplication, produces a change event with `op: deleted`. For a deleted entity the event's `record` holds the last known top-level fields when the registry still has them, and `null` otherwise; treat both as \"remove this id\". When a product is removed, its deployments are removed with it and each produces its own `deleted` event, so a client that stores deployments separately sees every removal. A corrected contract address is a new deployment with a new id; the previous deployment is retired or removed, never edited in place.\n\n## Staying in sync\n1. `GET /snapshot` once: the whole registry (about 5,800 products and 21,600 deployments as of October 2026, roughly 15 MB of JSON, a few MB gzipped) with a `cursor`.\n2. `GET /changes?since=<cursor>` on a schedule (hourly is plenty; the registry ingests on weekday mornings UTC). Apply each event as an upsert of the full record keyed by `entity_type` and `entity_id`; apply `op: deleted` as a removal. Store `next_cursor` and keep calling while `has_more` is true. A page can carry zero events while `has_more` is true, because `limit` counts underlying audit rows; always loop on `has_more`, never on the event count.\n3. Delivery is at-least-once: an entity touched across a page boundary can appear twice, always with its current state, so repeated upserts are safe; its `op` may read `created` on the first page and `updated` on the next, so derive \"new to me\" from your own store, not from `op`. Events in a page are ordered by cursor, and two events can share a cursor (an event's cursor is the position of the last change-log row that touched the entity, and one row can touch both a deployment and its product), so never use an event's cursor as a unique key; resume only from `next_cursor`.\n4. Embedded data is kept consistent for you: a change to a deployment or its provenance produces a deployment event and an updated event for its product; a document or venue listing change produces an updated event for its issuer or product; an issuer listing change also updates the venue. If you store products with their embedded deployments you can ignore deployment events.\n5. Events become visible once every database transaction older than them has finished, normally within seconds; the weekday ingestion run can delay them by a few minutes.\n6. Never compare or compute cursors yourself; only pass back what the API returned. `/changes/head` is computed with the same visibility rule as `/changes`, so it never points beyond events that `/changes` can deliver. Cursors are opaque strings and never expire, with one exception: after a database restore the registry starts a new feed epoch and old cursors return `invalid_cursor`. Take a new snapshot and continue from its cursor. A cursor beyond the current head also returns `invalid_cursor`.\n\n## Values\n`null` means the registry has not established a value. In the issuer fields `custodian`, `governing_law` and `regulator` the string `not disclosed` means the issuer's documents were read and name none, and `None (...)` means the structure has none, with the reason. Fields with closed value sets carry an `enum` in their schema; fields described as \"the list can grow\" are open. A new enum value may still be added within v1 in rare cases, so treat an unknown value as opaque rather than failing.\n\n## Compatibility\nFields may be added to records within v1; none are removed, renamed or retyped. Clients should ignore unknown fields. Breaking changes would ship under a new path version. The change log is never pruned, so there is no retention limit on cursors.\n\n## Caching\nResponses are `Cache-Control: private, no-store`, so no intermediary caches them. List and detail responses still carry an `ETag`; send `If-None-Match` to receive `304 Not Modified`, which still counts as a request.",
    "contact": {
      "url": "https://tokenization.glassnode.com/api-access"
    },
    "license": {
      "name": "Proprietary; access under the terms agreed when the key was issued"
    }
  },
  "externalDocs": {
    "url": "https://tokenization.glassnode.com/docs/api",
    "description": "Human-readable documentation"
  },
  "servers": [
    {
      "url": "https://tokenization.glassnode.com/api/v1"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "paths": {
    "/issuers": {
      "get": {
        "operationId": "listIssuers",
        "summary": "Issuing entities",
        "description": "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.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            },
            "description": "Page size"
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "next_cursor from the previous page (the last id returned)",
            "example": "aaplc"
          },
          {
            "name": "jurisdiction",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "ISO 3166-1 alpha-2 country code"
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "active",
                "inactive"
              ]
            },
            "description": "active or inactive"
          },
          {
            "name": "custodian",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Exact custodian value as recorded"
          }
        ],
        "responses": {
          "200": {
            "description": "Page of issuers",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "ETag": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "next_cursor",
                    "has_more",
                    "as_of"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Issuer"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Pass as cursor on the next call; null on the last page"
                    },
                    "has_more": {
                      "type": "boolean"
                    },
                    "as_of": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (If-None-Match matched); counts as a request"
          },
          "400": {
            "description": "Unknown or repeated parameter, unsupported value, or bad cursor (invalid_parameter, invalid_cursor)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/issuers/{id}": {
      "get": {
        "operationId": "getIssuer",
        "summary": "One issuer by id",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "coinbase"
          }
        ],
        "responses": {
          "200": {
            "description": "Issuer",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "ETag": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "as_of"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Issuer"
                    },
                    "as_of": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (If-None-Match matched); counts as a request"
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No entity with that id (not_found)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/assets": {
      "get": {
        "operationId": "listAssets",
        "summary": "Real-world assets with at least one tokenized product",
        "description": "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.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            },
            "description": "Page size"
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "next_cursor from the previous page (the last id returned)",
            "example": "aaplc"
          },
          {
            "name": "asset_class",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "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"
          },
          {
            "name": "ticker",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Exchange ticker"
          },
          {
            "name": "isin",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "ISIN"
          }
        ],
        "responses": {
          "200": {
            "description": "Page of assets",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "ETag": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "next_cursor",
                    "has_more",
                    "as_of"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Asset"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Pass as cursor on the next call; null on the last page"
                    },
                    "has_more": {
                      "type": "boolean"
                    },
                    "as_of": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (If-None-Match matched); counts as a request"
          },
          "400": {
            "description": "Unknown or repeated parameter, unsupported value, or bad cursor (invalid_parameter, invalid_cursor)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/assets/{id}": {
      "get": {
        "operationId": "getAsset",
        "summary": "One asset by id",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "ul-aapl"
          }
        ],
        "responses": {
          "200": {
            "description": "Asset",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "ETag": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "as_of"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Asset"
                    },
                    "as_of": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (If-None-Match matched); counts as a request"
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No entity with that id (not_found)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/products": {
      "get": {
        "operationId": "listProducts",
        "summary": "Tokenized products with their deployments",
        "description": "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.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            },
            "description": "Page size"
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "next_cursor from the previous page (the last id returned)",
            "example": "aaplc"
          },
          {
            "name": "issuer",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Issuer id"
          },
          {
            "name": "asset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Asset id"
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "active",
                "inactive"
              ]
            },
            "description": "active or inactive"
          },
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Product symbol"
          },
          {
            "name": "isin",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "ISIN"
          }
        ],
        "responses": {
          "200": {
            "description": "Page of products",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "ETag": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "next_cursor",
                    "has_more",
                    "as_of"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Product"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Pass as cursor on the next call; null on the last page"
                    },
                    "has_more": {
                      "type": "boolean"
                    },
                    "as_of": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (If-None-Match matched); counts as a request"
          },
          "400": {
            "description": "Unknown or repeated parameter, unsupported value, or bad cursor (invalid_parameter, invalid_cursor)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/products/{id}": {
      "get": {
        "operationId": "getProduct",
        "summary": "One product by id",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "aaplc"
          }
        ],
        "responses": {
          "200": {
            "description": "Product",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "ETag": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "as_of"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Product"
                    },
                    "as_of": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (If-None-Match matched); counts as a request"
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No entity with that id (not_found)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/deployments": {
      "get": {
        "operationId": "listDeployments",
        "summary": "Contract deployments with their provenance",
        "description": "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.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            },
            "description": "Page size"
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "next_cursor from the previous page (the last id returned)",
            "example": "aaplc"
          },
          {
            "name": "product",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Product id"
          },
          {
            "name": "chain",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Chain id, e.g. ethereum, solana, base"
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "active",
                "deprecated",
                "inactive"
              ]
            },
            "description": "active, deprecated or inactive"
          },
          {
            "name": "verification_status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Registry verification state; published rows are verified"
          },
          {
            "name": "address",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Contract or mint address; plain hex (0x) addresses match case-insensitively, everything else exactly"
          }
        ],
        "responses": {
          "200": {
            "description": "Page of deployments",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "ETag": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "next_cursor",
                    "has_more",
                    "as_of"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Deployment"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Pass as cursor on the next call; null on the last page"
                    },
                    "has_more": {
                      "type": "boolean"
                    },
                    "as_of": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (If-None-Match matched); counts as a request"
          },
          "400": {
            "description": "Unknown or repeated parameter, unsupported value, or bad cursor (invalid_parameter, invalid_cursor)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/deployments/{id}": {
      "get": {
        "operationId": "getDeployment",
        "summary": "One deployment by id",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "aaplc-base-9f2a1c"
          }
        ],
        "responses": {
          "200": {
            "description": "Deployment",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "ETag": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "as_of"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Deployment"
                    },
                    "as_of": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (If-None-Match matched); counts as a request"
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No entity with that id (not_found)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/venues": {
      "get": {
        "operationId": "listVenues",
        "summary": "Trading venues with issuer-level listings",
        "description": "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.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            },
            "description": "Page size"
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "next_cursor from the previous page (the last id returned)",
            "example": "aaplc"
          },
          {
            "name": "venue_type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "cex, perp-dex or rwa-exchange; the list can grow"
          }
        ],
        "responses": {
          "200": {
            "description": "Page of venues",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "ETag": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "next_cursor",
                    "has_more",
                    "as_of"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Venue"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Pass as cursor on the next call; null on the last page"
                    },
                    "has_more": {
                      "type": "boolean"
                    },
                    "as_of": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (If-None-Match matched); counts as a request"
          },
          "400": {
            "description": "Unknown or repeated parameter, unsupported value, or bad cursor (invalid_parameter, invalid_cursor)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/venues/{id}": {
      "get": {
        "operationId": "getVenue",
        "summary": "One venue by id",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "kraken"
          }
        ],
        "responses": {
          "200": {
            "description": "Venue",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "ETag": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "as_of"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Venue"
                    },
                    "as_of": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (If-None-Match matched); counts as a request"
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No entity with that id (not_found)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/derivatives": {
      "get": {
        "operationId": "listDerivatives",
        "summary": "Perpetuals and futures referencing registry assets",
        "description": "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.",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            },
            "description": "Page size"
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "next_cursor from the previous page (the last id returned)",
            "example": "aaplc"
          },
          {
            "name": "asset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Asset id"
          },
          {
            "name": "venue",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Venue id"
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "prelisted",
                "active",
                "inactive"
              ]
            },
            "description": "prelisted, active or inactive"
          },
          {
            "name": "instrument_type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "perpetual",
                "dated-future"
              ]
            },
            "description": "perpetual or dated-future"
          },
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Venue symbol"
          }
        ],
        "responses": {
          "200": {
            "description": "Page of derivatives",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "ETag": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "next_cursor",
                    "has_more",
                    "as_of"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/Derivative"
                      }
                    },
                    "next_cursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Pass as cursor on the next call; null on the last page"
                    },
                    "has_more": {
                      "type": "boolean"
                    },
                    "as_of": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (If-None-Match matched); counts as a request"
          },
          "400": {
            "description": "Unknown or repeated parameter, unsupported value, or bad cursor (invalid_parameter, invalid_cursor)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/derivatives/{id}": {
      "get": {
        "operationId": "getDerivative",
        "summary": "One derivative by id",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "binance-aaplusdt-perp"
          }
        ],
        "responses": {
          "200": {
            "description": "Derivative",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "ETag": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "as_of"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Derivative"
                    },
                    "as_of": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                }
              }
            }
          },
          "304": {
            "description": "Not modified (If-None-Match matched); counts as a request"
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "No entity with that id (not_found)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/snapshot": {
      "get": {
        "operationId": "getSnapshot",
        "summary": "The whole registry as one document",
        "description": "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.",
        "responses": {
          "200": {
            "description": "Snapshot",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Snapshot"
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Snapshot capacity is busy (snapshot_busy); retry after Retry-After seconds. The attempt is not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/changes": {
      "get": {
        "operationId": "listChanges",
        "summary": "Entities changed since a cursor",
        "description": "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.",
        "parameters": [
          {
            "name": "since",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Cursor from /snapshot, /changes/head or a previous next_cursor",
            "example": "1-15046-1594"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            },
            "description": "Maximum number of underlying audit rows read per page; the number of events returned can be lower, including zero while has_more is true"
          }
        ],
        "responses": {
          "200": {
            "description": "Change events",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "next_cursor",
                    "has_more",
                    "as_of"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ChangeEvent"
                      }
                    },
                    "next_cursor": {
                      "type": "string",
                      "description": "Pass as since= on the next call; equals since when data is empty and has_more is false"
                    },
                    "has_more": {
                      "type": "boolean",
                      "description": "True when more audit rows exist after next_cursor; keep paging on this flag, not on the event count"
                    },
                    "as_of": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "cursor": "1-15046-1594",
                      "changed_at": "2026-10-17T13:30:21.405Z",
                      "entity_type": "issuer",
                      "entity_id": "coinbase",
                      "op": "updated",
                      "record": {
                        "id": "coinbase",
                        "name": "Coinbase (Tokenized Equities)",
                        "legal_name": "Coinbase Onchain SPV Ltd",
                        "jurisdiction": "AE",
                        "website": "https://www.coinbase.com",
                        "status": "active",
                        "catalog_status": null,
                        "parent_issuer_id": null,
                        "lei": null,
                        "offering_regime": "ADGM prospectus (FSRA)",
                        "custodian": "Alpaca Securities LLC",
                        "governing_law": "ADGM law",
                        "regulator": "FSRA, ADGM (prospectus approval)",
                        "created_at": "2026-09-02T09:14:02.118Z",
                        "documents": [
                          {
                            "title": "ADGM prospectus (Coinbase Onchain SPV Ltd, SpaceX CB Certificates, 3 Sept 2026)",
                            "url": "https://www.adgm.com/globalassets/market-disclosure/content/prospectus/coinbase-onchain-spv-ltd---prospectus-spcxc---3sept2026.pdf",
                            "type": "prospectus",
                            "verified_at": "2026-10-16"
                          }
                        ],
                        "venue_listings": []
                      }
                    }
                  ],
                  "next_cursor": "1-15046-1594",
                  "has_more": false,
                  "as_of": "2026-10-17T16:20:03.412Z"
                }
              }
            }
          },
          "400": {
            "description": "Missing since or bad limit (invalid_parameter); a cursor from another epoch, beyond head or malformed (invalid_cursor)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/changes/head": {
      "get": {
        "operationId": "getChangesHead",
        "summary": "The current end of the change log",
        "description": "Returns the newest committed cursor. Use it to start following changes without taking a snapshot, or to measure how far behind a client is.",
        "responses": {
          "200": {
            "description": "Head cursor",
            "headers": {
              "X-Request-Id": {
                "schema": {
                  "type": "string",
                  "format": "uuid"
                },
                "description": "Unique id for this response; quote it when reporting a problem"
              },
              "X-RateLimit-Limit": {
                "schema": {
                  "type": "integer"
                },
                "description": "Requests allowed per minute for this key"
              },
              "X-RateLimit-Remaining": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "schema": {
                  "type": "integer"
                },
                "description": "Unix time when the minute window resets"
              },
              "X-Quota-Daily-Limit": {
                "schema": {
                  "type": "integer"
                }
              },
              "X-Quota-Daily-Remaining": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "as_of"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "cursor"
                      ],
                      "properties": {
                        "cursor": {
                          "type": "string",
                          "example": "1-15046-1594"
                        }
                      }
                    },
                    "as_of": {
                      "type": "string",
                      "format": "date-time"
                    }
                  }
                },
                "example": {
                  "data": {
                    "cursor": "1-15046-1594"
                  },
                  "as_of": "2026-10-17T16:20:03.412Z"
                }
              }
            }
          },
          "401": {
            "description": "Missing, malformed or unknown API key, or a key sent in the URL (code unauthorized)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "The key has been revoked (code forbidden)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute limit (rate_limited), daily quota (quota_exceeded) or snapshot limit (snapshot_limit) reached; wait Retry-After seconds. Limited requests are not counted",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected failure (code internal_error); quote request_id when reporting it",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "API key issued by Glassnode, sent as Authorization: Bearer tk_live_...; keys in query strings are rejected"
      }
    },
    "schemas": {
      "Document": {
        "type": "object",
        "description": "A governing or source document published by the issuer",
        "required": [
          "title",
          "url",
          "type",
          "verified_at"
        ],
        "properties": {
          "title": {
            "type": "string",
            "example": "Base Prospectus (Backed Assets, valid to 7 May 2027)"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "description": "prospectus, terms, filing, whitepaper, attestation, docs or index; the list can grow"
          },
          "verified_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Last date the registry confirmed the document at that URL"
          }
        }
      },
      "Provenance": {
        "type": "object",
        "description": "An issuer-published source that names this deployment's address, with the date the registry last confirmed it",
        "required": [
          "source_url",
          "verified_at"
        ],
        "properties": {
          "source_url": {
            "type": "string",
            "format": "uri"
          },
          "verified_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          }
        }
      },
      "IssuerVenueListing": {
        "type": "object",
        "description": "A venue that lists this issuer's catalog, per the venue's own publication",
        "required": [
          "venue_id",
          "source_url",
          "verified_at"
        ],
        "properties": {
          "venue_id": {
            "type": "string",
            "example": "kraken"
          },
          "source_url": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "verified_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          }
        }
      },
      "ProductVenueListing": {
        "type": "object",
        "description": "A confirmed spot listing of this product on a venue",
        "required": [
          "venue_id",
          "venue_symbol",
          "source_url",
          "verified_at"
        ],
        "properties": {
          "venue_id": {
            "type": "string",
            "example": "kraken"
          },
          "venue_symbol": {
            "type": [
              "string",
              "null"
            ],
            "example": "AAPLx"
          },
          "source_url": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "verified_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          }
        }
      },
      "VenueIssuerListing": {
        "type": "object",
        "description": "An issuer whose catalog this venue lists",
        "required": [
          "issuer_id",
          "source_url",
          "verified_at"
        ],
        "properties": {
          "issuer_id": {
            "type": "string",
            "example": "backed-xstocks"
          },
          "source_url": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "verified_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message",
              "request_id"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "unauthorized",
                  "forbidden",
                  "rate_limited",
                  "quota_exceeded",
                  "snapshot_limit",
                  "snapshot_busy",
                  "invalid_parameter",
                  "invalid_cursor",
                  "not_found",
                  "internal_error"
                ]
              },
              "message": {
                "type": "string"
              },
              "request_id": {
                "type": "string",
                "format": "uuid"
              }
            }
          }
        },
        "example": {
          "error": {
            "code": "unauthorized",
            "message": "An API key is required.",
            "request_id": "68f5d2b8-f712-4ba4-817c-67de48bd9cf6"
          }
        }
      },
      "Issuer": {
        "type": "object",
        "description": "Issuer record. Fields may be added within v1; none are removed or renamed. Clients should ignore unknown fields.",
        "required": [
          "id",
          "name",
          "legal_name",
          "jurisdiction",
          "website",
          "status",
          "catalog_status",
          "parent_issuer_id",
          "lei",
          "offering_regime",
          "custodian",
          "governing_law",
          "regulator",
          "created_at",
          "documents",
          "venue_listings"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Lowercase slug assigned by the registry; immutable and never reused",
            "example": "coinbase"
          },
          "name": {
            "type": "string",
            "example": "Coinbase (Tokenized Equities)"
          },
          "legal_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Issuing legal entity; null when not yet established from documents"
          },
          "jurisdiction": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 3166-1 alpha-2 country code of the issuing entity",
            "example": "AE"
          },
          "website": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "status": {
            "type": "string",
            "description": "active or inactive; retired entities stay listed as inactive and are never deleted for retirement",
            "enum": [
              "active",
              "inactive"
            ]
          },
          "catalog_status": {
            "type": [
              "string",
              "null"
            ],
            "description": "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": {
            "type": [
              "string",
              "null"
            ],
            "description": "Issuer id of the brand or parent record, when the issuer is a subsidiary"
          },
          "lei": {
            "type": [
              "string",
              "null"
            ],
            "description": "Legal Entity Identifier (GLEIF)"
          },
          "offering_regime": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free text, e.g. 'Reg S' or 'EU prospectus (FMA Liechtenstein)'"
          },
          "custodian": {
            "type": [
              "string",
              "null"
            ],
            "description": "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 researched",
            "example": "Alpaca Securities LLC"
          },
          "governing_law": {
            "type": [
              "string",
              "null"
            ],
            "description": "Law governing the token or security terms, e.g. 'Swiss law'; 'not disclosed' and null as for custodian"
          },
          "regulator": {
            "type": [
              "string",
              "null"
            ],
            "description": "Supervising authority, or an approval-only authority with a qualifier such as 'FMA Liechtenstein (prospectus approval)'; 'not disclosed' and null as for custodian",
            "example": "FSRA, ADGM (prospectus approval)"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "description": "When the record entered the registry, UTC"
          },
          "documents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Document"
            }
          },
          "venue_listings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/IssuerVenueListing"
            }
          }
        }
      },
      "Asset": {
        "type": "object",
        "description": "Asset record. Fields may be added within v1; none are removed or renamed. Clients should ignore unknown fields.",
        "required": [
          "id",
          "name",
          "ticker",
          "asset_class",
          "isin",
          "figi",
          "currency",
          "description",
          "exposure",
          "created_at"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Lowercase slug assigned by the registry; immutable and never reused",
            "example": "ul-aapl"
          },
          "name": {
            "type": "string",
            "example": "Apple"
          },
          "ticker": {
            "type": [
              "string",
              "null"
            ],
            "description": "Primary exchange ticker",
            "example": "AAPL"
          },
          "asset_class": {
            "type": "string",
            "description": "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 grow",
            "example": "stocks"
          },
          "isin": {
            "type": [
              "string",
              "null"
            ]
          },
          "figi": {
            "type": [
              "string",
              "null"
            ]
          },
          "currency": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 4217 code of the asset's quote currency"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "exposure": {
            "type": [
              "string",
              "null"
            ],
            "description": "crypto = a registered fund whose own holdings are crypto assets (spot or futures ETFs); real-world otherwise; null = not classified",
            "enum": [
              "real-world",
              "crypto",
              null
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "Product": {
        "type": "object",
        "description": "Product record. Fields may be added within v1; none are removed or renamed. Clients should ignore unknown fields.",
        "required": [
          "id",
          "issuer_id",
          "underlying_asset_id",
          "name",
          "symbol",
          "legal_structure",
          "backing_model",
          "isin",
          "status",
          "parent_product_id",
          "backing_relationship",
          "created_at",
          "deployments",
          "documents",
          "venue_listings"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Lowercase slug assigned by the registry; immutable and never reused",
            "example": "aaplc"
          },
          "issuer_id": {
            "type": "string",
            "example": "coinbase"
          },
          "underlying_asset_id": {
            "type": "string",
            "example": "ul-aapl"
          },
          "name": {
            "type": "string",
            "example": "Apple (Coinbase Tokenized)"
          },
          "symbol": {
            "type": "string",
            "description": "Token symbol as the issuer presents it",
            "example": "AAPLc"
          },
          "legal_structure": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free text from the issuer's documents"
          },
          "backing_model": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free text from the issuer's documents"
          },
          "isin": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string",
            "description": "active or inactive; retired entities stay listed as inactive and are never deleted for retirement",
            "enum": [
              "active",
              "inactive"
            ]
          },
          "parent_product_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "For wrappers, the product that is wrapped"
          },
          "backing_relationship": {
            "type": [
              "string",
              "null"
            ],
            "description": "direct = the token represents the asset itself; wrapper = it wraps another registry product; null = not classified",
            "enum": [
              "direct",
              "wrapper",
              null
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "deployments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Deployment"
            }
          },
          "documents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Document"
            }
          },
          "venue_listings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductVenueListing"
            }
          }
        }
      },
      "Deployment": {
        "type": "object",
        "description": "Deployment record. Fields may be added within v1; none are removed or renamed. Clients should ignore unknown fields.",
        "required": [
          "id",
          "product_id",
          "chain",
          "token_standard",
          "contract_address",
          "decimals",
          "verification_status",
          "status",
          "issuance_model",
          "interop_provider",
          "network_type",
          "effective_from",
          "effective_to",
          "created_at",
          "provenance"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Lowercase slug assigned by the registry; immutable and never reused",
            "example": "aaplc-base-9f2a1c"
          },
          "product_id": {
            "type": "string",
            "example": "aaplc"
          },
          "chain": {
            "type": "string",
            "description": "Registry chain id, lowercase; an open list (ethereum, base, solana, arbitrum, polygon, avalanche, bnb, sui, aptos, stellar, xrpl, tron, ton, canton, provenance, ...)",
            "example": "base"
          },
          "token_standard": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free text, e.g. ERC-20, SPL, SPL Token-2022, Stellar asset"
          },
          "contract_address": {
            "type": "string",
            "description": "Contract or mint address in the chain's native format; EVM addresses are lowercase hex"
          },
          "decimals": {
            "type": [
              "integer",
              "null"
            ]
          },
          "verification_status": {
            "type": "string",
            "description": "Registry verification of the address against chain data and the issuer's source; published rows are 'verified'"
          },
          "status": {
            "type": "string",
            "description": "active = live; deprecated = still on chain but superseded by the issuer; inactive = retired or delisted. Rows are never deleted for retirement",
            "enum": [
              "active",
              "deprecated",
              "inactive"
            ]
          },
          "issuance_model": {
            "type": [
              "string",
              "null"
            ],
            "description": "How this chain's supply is issued; null = not classified",
            "enum": [
              "native",
              "bridged",
              "omnichain",
              null
            ]
          },
          "interop_provider": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bridge or interoperability provider when issuance_model is bridged or omnichain, e.g. LayerZero, CCTP, Wormhole"
          },
          "network_type": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "public",
              "permissioned",
              null
            ]
          },
          "effective_from": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "First date the deployment is known to have been live"
          },
          "effective_to": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the deployment was retired, when known"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "provenance": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Provenance"
            }
          }
        }
      },
      "Venue": {
        "type": "object",
        "description": "Venue record. Fields may be added within v1; none are removed or renamed. Clients should ignore unknown fields.",
        "required": [
          "id",
          "name",
          "venue_type",
          "website",
          "issuer_listings"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Lowercase slug assigned by the registry; immutable and never reused",
            "example": "kraken"
          },
          "name": {
            "type": "string",
            "example": "Kraken"
          },
          "venue_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "cex, perp-dex or rwa-exchange; the list can grow"
          },
          "website": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "issuer_listings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VenueIssuerListing"
            }
          }
        }
      },
      "Derivative": {
        "type": "object",
        "description": "Derivative record. Fields may be added within v1; none are removed or renamed. Clients should ignore unknown fields.",
        "required": [
          "id",
          "underlying_asset_id",
          "instrument_type",
          "symbol",
          "venue_id",
          "sub_venue",
          "chain",
          "market_identifier",
          "settlement_asset",
          "expiry",
          "strike",
          "operator",
          "status"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Lowercase slug assigned by the registry; immutable and never reused",
            "example": "binance-aaplusdt-perp"
          },
          "underlying_asset_id": {
            "type": "string",
            "example": "ul-aapl"
          },
          "instrument_type": {
            "type": "string",
            "enum": [
              "perpetual",
              "dated-future"
            ]
          },
          "symbol": {
            "type": "string",
            "description": "Symbol as the venue lists it",
            "example": "AAPLUSDT"
          },
          "venue_id": {
            "type": "string",
            "example": "binance"
          },
          "sub_venue": {
            "type": [
              "string",
              "null"
            ],
            "description": "Market segment within the venue, when the venue separates them"
          },
          "chain": {
            "type": [
              "string",
              "null"
            ],
            "description": "Chain for on-chain venues; null for centralized venues"
          },
          "market_identifier": {
            "type": [
              "string",
              "null"
            ],
            "description": "Venue-native market id when it differs from the symbol"
          },
          "settlement_asset": {
            "type": [
              "string",
              "null"
            ],
            "example": "USDT"
          },
          "expiry": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Dated futures only"
          },
          "strike": {
            "type": [
              "number",
              "null"
            ]
          },
          "operator": {
            "type": [
              "string",
              "null"
            ],
            "description": "Operating entity when it differs from the venue"
          },
          "status": {
            "type": "string",
            "description": "prelisted = announced by the venue but not yet trading; inactive = delisted; rows are never deleted for delisting",
            "enum": [
              "prelisted",
              "active",
              "inactive"
            ]
          }
        }
      },
      "ChangeEvent": {
        "type": "object",
        "required": [
          "cursor",
          "changed_at",
          "entity_type",
          "entity_id",
          "op",
          "record"
        ],
        "properties": {
          "cursor": {
            "type": "string",
            "description": "Opaque position in the change log of the last row that touched this entity; it embeds the feed epoch. Not unique per event: resume from next_cursor, key storage on entity_type plus entity_id",
            "example": "1-15046-1594"
          },
          "changed_at": {
            "type": "string",
            "format": "date-time",
            "description": "UTC time of the last underlying change in this event"
          },
          "entity_type": {
            "type": "string",
            "enum": [
              "issuer",
              "asset",
              "product",
              "deployment",
              "venue",
              "derivative"
            ],
            "description": "Selects the record schema: issuer → Issuer, asset → Asset, product → Product, deployment → Deployment, venue → Venue, derivative → Derivative"
          },
          "entity_id": {
            "type": "string",
            "example": "coinbase"
          },
          "op": {
            "type": "string",
            "enum": [
              "created",
              "updated",
              "deleted"
            ],
            "description": "created and updated carry the entity's current full record; deleted means remove the id"
          },
          "record": {
            "description": "The entity's current record at the time of the response, with the schema named by entity_type; for deleted entities the last known top-level fields, or null when unavailable",
            "oneOf": [
              {
                "$ref": "#/components/schemas/Issuer"
              },
              {
                "$ref": "#/components/schemas/Asset"
              },
              {
                "$ref": "#/components/schemas/Product"
              },
              {
                "$ref": "#/components/schemas/Deployment"
              },
              {
                "$ref": "#/components/schemas/Venue"
              },
              {
                "$ref": "#/components/schemas/Derivative"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "example": {
          "cursor": "1-15046-1594",
          "changed_at": "2026-10-17T13:30:21.405Z",
          "entity_type": "issuer",
          "entity_id": "coinbase",
          "op": "updated",
          "record": {
            "id": "coinbase",
            "name": "Coinbase (Tokenized Equities)",
            "legal_name": "Coinbase Onchain SPV Ltd",
            "jurisdiction": "AE",
            "website": "https://www.coinbase.com",
            "status": "active",
            "catalog_status": null,
            "parent_issuer_id": null,
            "lei": null,
            "offering_regime": "ADGM prospectus (FSRA)",
            "custodian": "Alpaca Securities LLC",
            "governing_law": "ADGM law",
            "regulator": "FSRA, ADGM (prospectus approval)",
            "created_at": "2026-09-02T09:14:02.118Z",
            "documents": [
              {
                "title": "ADGM prospectus (Coinbase Onchain SPV Ltd, SpaceX CB Certificates, 3 Sept 2026)",
                "url": "https://www.adgm.com/globalassets/market-disclosure/content/prospectus/coinbase-onchain-spv-ltd---prospectus-spcxc---3sept2026.pdf",
                "type": "prospectus",
                "verified_at": "2026-10-16"
              }
            ],
            "venue_listings": []
          }
        }
      },
      "Snapshot": {
        "type": "object",
        "required": [
          "as_of",
          "cursor",
          "issuers",
          "assets",
          "products",
          "venues",
          "derivatives"
        ],
        "properties": {
          "as_of": {
            "type": "string",
            "format": "date-time"
          },
          "cursor": {
            "type": "string",
            "description": "Pass as since= to /changes to receive everything after this snapshot",
            "example": "1-15046-1594"
          },
          "issuers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Issuer"
            }
          },
          "assets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Asset"
            }
          },
          "products": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Product"
            },
            "description": "Each product embeds its deployments, and each deployment its provenance; there is no separate deployments section"
          },
          "venues": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Venue"
            }
          },
          "derivatives": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Derivative"
            }
          }
        }
      }
    }
  }
}