{
  "openapi": "3.0.3",
  "info": {"title": "Orbit Launch discovery", "version": "1.0.0", "description": "Read-only discovery of indexed Robinhood Chain launches and saved verified pool snapshots. Indexing can lag. No authentication, wallet, execution or guaranteed profitable quotes. Website release 5.14."},
  "servers": [{"url": "https://orbitlaunch.io"}],
  "externalDocs": {"description": "Pagination, freshness and integration guide", "url": "https://orbitlaunch.io/discovery-guide.md"},
  "paths": {
    "/api/discovery": {"get": {
      "operationId": "getDiscoveryCatalog",
      "summary": "Read a page of indexed tokens and verified pool keys",
      "description": "Current registered factory by default. Keep factory fixed while paging. Cache each page for at least 15 seconds; back off on 503. A pool ID is a bytes32 identifier, not a separate pair contract. Reference prices are not executable quotes.",
      "parameters": [
        {"name": "factory", "in": "query", "description": "Optional registered current or archived factory address.", "schema": {"$ref": "#/components/schemas/Address"}},
        {"name": "limit", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 200, "default": 50}},
        {"name": "cursor", "in": "query", "description": "Opaque nextCursor from the previous page. Omit on the first request.", "schema": {"type": "string", "maxLength": 256}}
      ],
      "responses": {
        "200": {"description": "Indexed launch records and last verified snapshots; public CORS enabled.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Catalog"}}}},
        "400": {"$ref": "#/components/responses/Invalid"}, "404": {"$ref": "#/components/responses/Missing"}, "503": {"$ref": "#/components/responses/Unavailable"}
      }
    }},
    "/.well-known/orbit.json": {"get": {
      "operationId": "getProtocolManifest", "summary": "Read public registered integration details",
      "responses": {"200": {"description": "Catalog metadata, protocol contract addresses and endpoint links, without tokens or nextCursor.", "content": {"application/json": {"schema": {"type": "object", "properties": {"schemaVersion": {"type": "integer", "enum": [1]}, "website": {"type": "string", "format": "uri"}, "protocol": {"$ref": "#/components/schemas/Protocol"}, "discoveryURL": {"type": "string", "format": "uri"}}}}}}, "404": {"$ref": "#/components/responses/Missing"}, "503": {"$ref": "#/components/responses/Unavailable"}}
    }},
    "/api/token-list.json": {"get": {
      "operationId": "getTokenList", "summary": "Export current indexed token addresses and artwork",
      "description": "Up to 5000 tokens from the current factory; larger catalogs return 503. Use /api/discovery for complete pagination. Version tracks the website release; refresh content rather than relying on that version as a list-change counter.",
      "responses": {"200": {"description": "Token-list JSON; factory tokens use 18 decimals.", "content": {"application/json": {"schema": {"type": "object", "required": ["name", "timestamp", "version", "tokens"], "properties": {"name": {"type": "string"}, "timestamp": {"type": "string", "format": "date-time"}, "version": {"type": "object", "properties": {"major": {"type": "integer"}, "minor": {"type": "integer"}, "patch": {"type": "integer"}}}, "tokens": {"type": "array", "items": {"type": "object", "required": ["chainId", "address", "name", "symbol", "decimals"], "properties": {"chainId": {"type": "integer", "enum": [4663]}, "address": {"$ref": "#/components/schemas/Address"}, "name": {"type": "string"}, "symbol": {"type": "string"}, "decimals": {"type": "integer", "enum": [18]}, "logoURI": {"type": "string", "format": "uri"}, "extensions": {"type": "object"}}}}}}}}}, "404": {"$ref": "#/components/responses/Missing"}, "503": {"$ref": "#/components/responses/Unavailable"}}
    }}
  },
  "components": {
    "responses": {
      "Invalid": {"description": "Invalid address, cursor or page limit; no-store.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}},
      "Missing": {"description": "No active or matching registered protocol; no-store.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}},
      "Unavailable": {"description": "Storage or export temporarily unavailable; no-store. Back off before retrying.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}
    },
    "schemas": {
      "Address": {"type": "string", "pattern": "^0x[0-9a-fA-F]{40}$"},
      "Error": {"type": "object", "required": ["error"], "properties": {"error": {"type": "string"}}},
      "Protocol": {"type": "object", "properties": {"chainId": {"type": "integer", "enum": [4663]}, "chainName": {"type": "string"}, "protocolVersion": {"type": "integer"}, "artifactRevision": {"type": "integer"}, "startBlock": {"type": "integer"}, "contracts": {"type": "object", "additionalProperties": {"$ref": "#/components/schemas/Address"}}, "abiURL": {"type": "string", "format": "uri"}, "launchEvents": {"type": "array", "items": {"type": "string"}}, "poolEvents": {"type": "array", "items": {"type": "string"}}}},
      "Catalog": {"type": "object", "required": ["schemaVersion", "protocol", "tokens", "total", "nextCursor"], "properties": {"schemaVersion": {"type": "integer", "enum": [1]}, "website": {"type": "string", "format": "uri"}, "protocol": {"$ref": "#/components/schemas/Protocol"}, "dataSource": {"type": "string"}, "checkedBlock": {"type": "integer", "nullable": true}, "checkedAt": {"type": "integer", "nullable": true, "description": "Saved head verification time, Unix milliseconds."}, "total": {"type": "integer", "minimum": 0}, "nextCursor": {"type": "string", "nullable": true}, "tokens": {"type": "array", "items": {"$ref": "#/components/schemas/Token"}}, "links": {"type": "object", "additionalProperties": {"type": "string", "format": "uri"}}, "quoting": {"type": "string"}}},
      "Token": {"type": "object", "required": ["address", "name", "symbol", "decimals", "markets", "pools"], "properties": {"address": {"$ref": "#/components/schemas/Address"}, "creator": {"$ref": "#/components/schemas/Address"}, "name": {"type": "string"}, "symbol": {"type": "string"}, "description": {"type": "string"}, "decimals": {"type": "integer", "enum": [18]}, "logoURI": {"type": "string", "format": "uri"}, "url": {"type": "string", "format": "uri"}, "markets": {"type": "array", "items": {"$ref": "#/components/schemas/Address"}}, "createdAt": {"type": "integer", "description": "Launch timestamp, Unix seconds."}, "block": {"type": "integer"}, "txHash": {"type": "string"}, "supply": {"type": "string", "nullable": true, "description": "Raw 18-decimal token units as an integer string."}, "supplyCheckedAt": {"type": "integer", "nullable": true}, "price": {"type": "object", "nullable": true, "description": "Reference estimate only; usdPerToken is an 18-decimal fixed-point integer string.", "properties": {"decimals": {"type": "integer"}, "usdPerToken": {"type": "string"}, "checkedAt": {"type": "integer", "nullable": true}}}, "lastTradeTimestamp": {"type": "integer", "nullable": true, "description": "Recorded swap timestamp, Unix seconds."}, "lastTradeBlock": {"type": "integer", "nullable": true}, "pools": {"type": "array", "items": {"$ref": "#/components/schemas/Pool"}}}},
      "Pool": {"type": "object", "properties": {"poolId": {"type": "string", "pattern": "^0x[0-9a-fA-F]{64}$"}, "poolManager": {"$ref": "#/components/schemas/Address"}, "pairToken": {"$ref": "#/components/schemas/Address"}, "key": {"type": "object", "properties": {"currency0": {"$ref": "#/components/schemas/Address"}, "currency1": {"$ref": "#/components/schemas/Address"}, "fee": {"type": "integer"}, "tickSpacing": {"type": "integer"}, "hooks": {"$ref": "#/components/schemas/Address"}}}, "feePips": {"type": "integer", "description": "Millionths; 10000 = 1.00%."}, "recentSwaps": {"type": "integer", "nullable": true}, "lastTradeBlock": {"type": "integer", "nullable": true}, "lastTradeTimestamp": {"type": "integer", "nullable": true}, "activityWindow": {"type": "object", "nullable": true, "properties": {"fromBlock": {"type": "integer"}, "toBlock": {"type": "integer"}, "checkedAt": {"type": "integer", "nullable": true}}}}}
    }
  }
}
