{"openapi":"3.0.3","info":{"title":"Sherwood | PONS Explorer","version":"1.0.0"},"components":{"schemas":{}},"paths":{"/v1/public/event-types":{"get":{"summary":"List canonical event types","tags":["Catalog"],"description":"Every name in canonical schema v1, including types not yet emitted by the current indexer. The endpoint describes the schema vocabulary, not ingestion coverage. No key is required.","responses":{"200":{"description":"Every canonical schema v1 name. Some names have no producer in the current indexer; this is not an ingestion-coverage list.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Every canonical schema v1 name. Some names have no producer in the current indexer; this is not an ingestion-coverage list.","properties":{"data":{"type":"array","items":{"type":"string","enum":["token.launched","curve.buy","curve.sell","curve.buy_refunded","curve.completed","graduation.swept","graduation.failed","graduation.completed","pool.registered","pool.swap","fees.swept","fees.credited","fees.claimed","buyback.locked","buyback.skipped","conversion.skipped","vesting.released","creator.change_proposed","creator.changed"]}}},"required":["data"]}}}}}}},"/v1/public/stats":{"get":{"summary":"Public indexer and protocol counters","tags":["Analytics"],"description":"Cached counters for the dashboard header: indexed events, launches and scanner position. No key is required.","responses":{"200":{"description":"Public indexer counters. The payload is cached for 60 seconds.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Public indexer counters. The payload is cached for 60 seconds.","properties":{"data":{"type":"object","additionalProperties":true,"description":"Public counters plus the indexer cursor. `totalEvents` and `totalRawLogs` are planner estimates; `totalWallets` is exact but cached for 30 minutes.","properties":{"totalEvents":{"type":"number"},"totalRawLogs":{"type":"number"},"totalTokens":{"type":"number"},"indexedTokens":{"type":"number"},"totalWallets":{"type":"number","nullable":true},"lastBlockNumber":{"type":"number","nullable":true},"status":{"type":"string","enum":["live","backfilling","stalled","degraded"]},"lagBlocks":{"type":"number","nullable":true},"cursorBlock":{"type":"number","nullable":true},"targetBlock":{"type":"number","nullable":true}}}},"required":["data"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/stats/classification":{"get":{"summary":"JEV classification coverage and status counters","tags":["Analytics"],"description":"Cached JEV coverage, completed classifications over 15 minutes/1 hour/24 hours, tasks recently marked rate limited, average confirmed launches per day over the previous seven complete UTC days, and a backfill ETA. The ETA is null unless completion throughput exceeds new launches. Completed classifications are accepted, uncertain and insufficient_data. No key is required.","responses":{"200":{"description":"JEV coverage and status counters. Cached for five minutes.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"JEV coverage and status counters. Cached for five minutes.","properties":{"data":{"type":"object","additionalProperties":true,"description":"Cached JEV classification coverage. `completed` is accepted + uncertain + insufficient_data; other non-pending states are exposed in `byStatus` but are not counted as completed.","properties":{"totalTokens":{"type":"integer"},"completed":{"type":"integer"},"withDecision":{"type":"integer","description":"Legacy coverage counter: totalTokens minus pending and metadataWaiting; it can include failed or metadata_unavailable tokens."},"pending":{"type":"integer"},"metadataWaiting":{"type":"integer"},"byStatus":{"type":"object","additionalProperties":{"type":"integer"}},"byTheme":{"type":"object","additionalProperties":{"type":"integer"}},"bySector":{"type":"object","additionalProperties":{"type":"integer"}},"bySubcategory":{"type":"object","additionalProperties":{"type":"integer"}},"completedLast15m":{"type":"integer"},"completedLastHour":{"type":"integer"},"completedLast24h":{"type":"integer"},"rateLimitedTasksLast15m":{"type":"integer","description":"Distinct current tasks whose latest recorded error is a provider 429 and whose last update falls in the window; this is not a count of every HTTP 429 response."},"rateLimitedTasksLastHour":{"type":"integer","description":"Distinct current tasks whose latest recorded error is a provider 429 and whose last update falls in the window; this is not a count of every HTTP 429 response."},"incomingTokensPerDay":{"type":"number"},"estimatedBackfillDays":{"type":"number","nullable":true},"computedAt":{"type":"string","format":"date-time"}},"required":["totalTokens","completed","withDecision","pending","metadataWaiting","byStatus","byTheme","bySector","bySubcategory","completedLast15m","completedLastHour","completedLast24h","rateLimitedTasksLast15m","rateLimitedTasksLastHour","incomingTokensPerDay","estimatedBackfillDays","computedAt"]}},"required":["data"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/fear-greed":{"get":{"summary":"Pons Fear & Greed Index","tags":["Analytics"],"description":"Hourly index based on saved Pons activity snapshots. V1 pool and post-graduation trades are not yet included in the formula.","responses":{"200":{"description":"Hourly Pons activity sentiment. Persisted snapshots; no request-time event scans.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Hourly Pons activity sentiment. Persisted snapshots; no request-time event scans.","properties":{"data":{"type":"object","additionalProperties":true,"properties":{"score":{"type":"integer","minimum":0,"maximum":100,"nullable":true},"label":{"type":"string","nullable":true},"asOf":{"type":"string","format":"date-time","nullable":true},"computedAt":{"type":"string","format":"date-time","nullable":true},"lastReliable":{"type":"object","additionalProperties":true,"description":"Most recent snapshot with a numerical reading.","nullable":true},"formulaVersion":{"type":"integer"},"status":{"type":"string","enum":["ready","partial","insufficient_data","stale"]},"coverage":{"type":"object","additionalProperties":true,"description":"Observed trading coverage and missing inputs."},"components":{"type":"object","additionalProperties":true,"description":"Versioned factor scores."},"metrics":{"type":"object","additionalProperties":true,"description":"Raw local activity measurements.","nullable":true},"external":{"type":"object","additionalProperties":true,"description":"Alternative.me reading with attribution.","nullable":true},"compute":{"type":"object","additionalProperties":true,"description":"Newest background calculation attempt when the reading is stale or no snapshot is stored: outcome, short note, timestamp and a truncated error detail when the calculation failed.","nullable":true},"history":{"type":"object","additionalProperties":true,"description":"Previous values and the last seven days. `hasHistoricalReplay` and each point's `historicalReplay` distinguish reconstructed values from live published readings."}},"required":["score","status","formulaVersion","coverage","components","history"]}},"required":["data"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/analytics":{"get":{"summary":"Protocol analytics for a period","tags":["Analytics"],"description":"Time series plus all-time totals for the selected period. Values are cached; `coverage.partialWhileBackfilling` says whether the indexer is still catching up. No key is required.","parameters":[{"schema":{"type":"string","enum":["day","week","month","all"],"default":"day"},"in":"query","name":"period","required":false,"description":"Aggregation period. Defaults to `day`."}],"responses":{"200":{"description":"Protocol analytics. Cached per period for 60 seconds (all-time: 5 minutes).","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Protocol analytics. Cached per period for 60 seconds (all-time: 5 minutes).","properties":{"data":{"type":"object","additionalProperties":true,"description":"Protocol analytics for the requested period plus all-time totals, lifetime fees and coverage. Money amounts are decimal strings.","properties":{"period":{"type":"string","enum":["day","week","month","all"]},"range":{"type":"object","additionalProperties":true,"description":"UTC range covered by the period series."},"buckets":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"One time bucket."}},"periodTotals":{"type":"object","additionalProperties":true,"description":"Totals for the selected period."},"allTimeTotals":{"type":"object","additionalProperties":true,"description":"All-time totals."},"lifetime":{"type":"object","additionalProperties":true,"description":"Lifetime fee and volume figures."},"feesPerToken":{"type":"object","additionalProperties":true,"description":"Average native ETH curve fees per V2 token.","properties":{"allTokens":{"type":"object","additionalProperties":true,"description":"Average across all V2 ETH-paired tokens."},"nonGraduated":{"type":"object","additionalProperties":true,"description":"Average across non-graduated tokens."},"tradedTokenCount":{"type":"integer"}}},"coverage":{"type":"object","additionalProperties":true,"description":"Which periods are complete while backfilling."},"computedAt":{"type":"string","format":"date-time"}},"required":["period","range","computedAt"]}},"required":["data"]}}}},"400":{"description":"Unknown period. Only `day`, `week`, `month` and `all` are accepted.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Unknown period. Only `day`, `week`, `month` and `all` are accepted.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/analytics/daily-token-highlight":{"get":{"summary":"X-linked daily token highlight","tags":["Analytics"],"description":"Fastest same-day migration with an X profile; falls back to the first X-linked migration of the day, including tokens launched earlier. Completed UTC days only, up to 30 days back.","parameters":[{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"in":"query","name":"day","required":true}],"responses":{"200":{"description":"One X-linked token from the completed UTC day: fastest same-day migration, otherwise first X-linked migration. Null when none qualifies.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"One X-linked token from the completed UTC day: fastest same-day migration, otherwise first X-linked migration. Null when none qualifies.","properties":{"data":{"type":"object","additionalProperties":false,"properties":{"day":{"type":"string"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"xHandle":{"type":"string"},"kind":{"type":"string","enum":["fastest_migration","first_x_migration"]},"launchedAt":{"type":"string","format":"date-time","nullable":true},"graduatedAt":{"type":"string","format":"date-time"},"migrationSeconds":{"type":"number","nullable":true}},"required":["day","token","name","symbol","xHandle","kind","launchedAt","graduatedAt","migrationSeconds"],"nullable":true}},"required":["data"]}}}},"400":{"description":"Invalid or incomplete UTC day.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Invalid or incomplete UTC day.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/analytics/launch-success":{"get":{"summary":"Launch-success correlations","tags":["Analytics"],"description":"All-time correlations between launch conditions and outcomes. Cached for 15 minutes; `partialWhileBackfilling` marks data that is still filling in. No key is required.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"data":{"type":"object","additionalProperties":true,"description":"Launch-success correlations: deployer experience buckets, launch-hour and weekday distributions, wallet and graduated-deployer statistics, and coverage."},"computedAt":{"type":"string","format":"date-time"},"partialWhileBackfilling":{"type":"boolean"}},"required":["data","computedAt"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/token":{"get":{"summary":"Configured token snapshot","tags":["Tokens"],"description":"Configured token and its spot price from the active Pons venue: bonding curve before graduation, Uniswap V4 after pool creation. Served from a stale-while-revalidate cache; no key is required.","responses":{"200":{"description":"Configured token snapshot.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Configured token snapshot.","properties":{"data":{"type":"object","additionalProperties":true,"description":"Configured token and spot price in its on-chain quote asset. Pons V2 reads the factory phase, using curve reserves before graduation and Uniswap V4 StateView after pool creation. marketCap is spot price times totalSupply in the quote asset. priceUsd and marketCapUsd use a cached ETH/USD reference rate from Coinbase Exchange, Kraken, or DefiLlama for native ETH or the known wrapped ETH contract; they are null when USD conversion is unavailable."}},"required":["data"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/categories/{version}/{category}/tokens":{"get":{"summary":"List tokens in a classification category","tags":["Tokens"],"description":"Returns 20 newest tokens tagged with at least 10% probability for this category, plus manually assigned tokens. A v2 sector includes its sector probability; page numbers are one-based.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":10000,"default":1},"in":"query","name":"page","required":false},{"schema":{"type":"string","enum":["jev-taxonomy-v1","jev-taxonomy-v2"]},"in":"path","name":"version","required":true},{"schema":{"type":"string"},"in":"path","name":"category","required":true,"description":"Canonical category slug or v2 sector.subcategory path."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"category":{"type":"object","additionalProperties":true,"properties":{"version":{"type":"string","enum":["jev-taxonomy-v1","jev-taxonomy-v2"]},"path":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"parent":{"type":"object","nullable":true,"additionalProperties":true,"properties":{"path":{"type":"string"},"title":{"type":"string"},"href":{"type":"string"}}}},"required":["version","path","title","description","parent"]},"total":{"type":"integer","minimum":0},"page":{"type":"integer","minimum":1},"pageSize":{"type":"integer","enum":[20]},"totalPages":{"type":"integer","minimum":0},"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"Token projection. On-chain integers and balances are decimal strings; `curve` is the nullable V2 bonding curve address.","properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"chainId":{"type":"integer"},"protocolStackId":{"type":"string"},"marketKind":{"type":"string"},"marketAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"curve":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"deployer":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"pairToken":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"launchConfigId":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer."},"graduationThreshold":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"creatorTaxBps":{"type":"integer","description":"Launch-time creator fee in basis points (`uint16`), or null when not reconciled yet.","nullable":true},"launchBlock":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer."},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"launchMetadata":{"type":"object","additionalProperties":true,"description":"Launch-time market metadata.","nullable":true},"metadata":{"type":"object","additionalProperties":true,"description":"Contract metadata snapshot. `status` is pending until the enrichment worker runs; every field may be null.","properties":{"status":{"type":"string"},"snapshotKind":{"type":"string","nullable":true},"readBlock":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"decimals":{"type":"integer","nullable":true},"totalSupply":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"logo":{"type":"string","nullable":true},"logoProxyUrl":{"type":"string","description":"Signed same-API image URL for an `ipfs://` logo, present only while the image proxy is enabled."},"logoThumbProxyUrl":{"type":"string","description":"Same-API URL of the 192 px card thumbnail for the same logo. With `IMAGE_PUBLIC_THUMB_SECRET` set it is the permanent `/v1/public/image-thumbnails/v1/:cid` address; otherwise it is the signed `variant=thumb` URL."},"description":{"type":"string","nullable":true},"liquidityPool":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"socials":{"type":"object","additionalProperties":true,"description":"Social links keyed by platform.","nullable":true},"fetchedAt":{"type":"string","format":"date-time","nullable":true}}},"classification":{"type":"object","additionalProperties":true,"description":"JEV classification read model. Hierarchical v2 returns sector, subcategory, and path; flat v1 keeps its historical theme value.","properties":{"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"source":{"type":"string","enum":["override","classification","none"]},"status":{"type":"string"},"theme":{"type":"string","nullable":true},"sector":{"type":"string","nullable":true},"subcategory":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"taxonomyVersion":{"type":"string","nullable":true},"promptVersion":{"type":"string","nullable":true},"thresholdVersion":{"type":"string","nullable":true},"probabilities":{"type":"object","additionalProperties":true,"description":"JEV probability distribution.","nullable":true},"confidence":{"type":"number","nullable":true},"classifiedAt":{"type":"string","format":"date-time","nullable":true}},"nullable":true},"phase":{"type":"integer","nullable":true},"lastEventId":{"type":"string","nullable":true},"lastBlockNumber":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"reconciledAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"logoProxyUrl":{"type":"string","description":"Signed same-API image URL, present only for `ipfs://` logos while the image proxy is enabled."},"logoThumbProxyUrl":{"type":"string","description":"Same-API URL of the 192 px card thumbnail for the same logo. When `IMAGE_PUBLIC_THUMB_SECRET` is set it is the permanent `/v1/public/image-thumbnails/v1/:cid` address; otherwise it is the signed `variant=thumb` signed URL."}},"required":["address","chainId","marketKind","launchBlock"]}}},"required":["category","total","page","pageSize","totalPages","data"]}}}},"400":{"description":"Invalid page number.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Invalid page number.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Unknown taxonomy or category.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Unknown taxonomy or category.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/tokens/all":{"get":{"summary":"List all tokens by page","tags":["Tokens"],"description":"Returns every indexed token newest first, with one-based page pagination. No key is required.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":10000,"default":1},"in":"query","name":"page","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"total":{"type":"integer","minimum":0},"page":{"type":"integer","minimum":1},"pageSize":{"type":"integer","enum":[20]},"totalPages":{"type":"integer","minimum":0},"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"Token projection. On-chain integers and balances are decimal strings; `curve` is the nullable V2 bonding curve address.","properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"chainId":{"type":"integer"},"protocolStackId":{"type":"string"},"marketKind":{"type":"string"},"marketAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"curve":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"deployer":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"pairToken":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"launchConfigId":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer."},"graduationThreshold":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"creatorTaxBps":{"type":"integer","description":"Launch-time creator fee in basis points (`uint16`), or null when not reconciled yet.","nullable":true},"launchBlock":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer."},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"launchMetadata":{"type":"object","additionalProperties":true,"description":"Launch-time market metadata.","nullable":true},"metadata":{"type":"object","additionalProperties":true,"description":"Contract metadata snapshot. `status` is pending until the enrichment worker runs; every field may be null.","properties":{"status":{"type":"string"},"snapshotKind":{"type":"string","nullable":true},"readBlock":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"decimals":{"type":"integer","nullable":true},"totalSupply":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"logo":{"type":"string","nullable":true},"logoProxyUrl":{"type":"string","description":"Signed same-API image URL for an `ipfs://` logo, present only while the image proxy is enabled."},"logoThumbProxyUrl":{"type":"string","description":"Same-API URL of the 192 px card thumbnail for the same logo. With `IMAGE_PUBLIC_THUMB_SECRET` set it is the permanent `/v1/public/image-thumbnails/v1/:cid` address; otherwise it is the signed `variant=thumb` URL."},"description":{"type":"string","nullable":true},"liquidityPool":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"socials":{"type":"object","additionalProperties":true,"description":"Social links keyed by platform.","nullable":true},"fetchedAt":{"type":"string","format":"date-time","nullable":true}}},"classification":{"type":"object","additionalProperties":true,"description":"JEV classification read model. Hierarchical v2 returns sector, subcategory, and path; flat v1 keeps its historical theme value.","properties":{"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"source":{"type":"string","enum":["override","classification","none"]},"status":{"type":"string"},"theme":{"type":"string","nullable":true},"sector":{"type":"string","nullable":true},"subcategory":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"taxonomyVersion":{"type":"string","nullable":true},"promptVersion":{"type":"string","nullable":true},"thresholdVersion":{"type":"string","nullable":true},"probabilities":{"type":"object","additionalProperties":true,"description":"JEV probability distribution.","nullable":true},"confidence":{"type":"number","nullable":true},"classifiedAt":{"type":"string","format":"date-time","nullable":true}},"nullable":true},"phase":{"type":"integer","nullable":true},"lastEventId":{"type":"string","nullable":true},"lastBlockNumber":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"reconciledAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"logoProxyUrl":{"type":"string","description":"Signed same-API image URL, present only for `ipfs://` logos while the image proxy is enabled."},"logoThumbProxyUrl":{"type":"string","description":"Same-API URL of the 192 px card thumbnail for the same logo. When `IMAGE_PUBLIC_THUMB_SECRET` is set it is the permanent `/v1/public/image-thumbnails/v1/:cid` address; otherwise it is the signed `variant=thumb` signed URL."}},"required":["address","chainId","marketKind","launchBlock"]}}},"required":["total","page","pageSize","totalPages","data"]}}}},"400":{"description":"Invalid page number.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Invalid page number.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/tokens":{"get":{"summary":"List token projections","tags":["Tokens"],"description":"Newest launches first, keyset-paginated by `(launchBlock, address)` so a growing list is never skipped or repeated. Pass the returned `nextCursor` back as `cursor`. No key is required.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"in":"query","name":"limit","required":false,"description":"Page size. Defaults to 100 and is capped at 500."},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false,"description":"`nextCursor` from the previous page. Malformed values are rejected with 400 `invalid_cursor`."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"Token projection. On-chain integers and balances are decimal strings; `curve` is the nullable V2 bonding curve address.","properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"chainId":{"type":"integer"},"protocolStackId":{"type":"string"},"marketKind":{"type":"string"},"marketAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"curve":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"deployer":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"pairToken":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"launchConfigId":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer."},"graduationThreshold":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"creatorTaxBps":{"type":"integer","description":"Launch-time creator fee in basis points (`uint16`), or null when not reconciled yet.","nullable":true},"launchBlock":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer."},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"launchMetadata":{"type":"object","additionalProperties":true,"description":"Launch-time market metadata.","nullable":true},"metadata":{"type":"object","additionalProperties":true,"description":"Contract metadata snapshot. `status` is pending until the enrichment worker runs; every field may be null.","properties":{"status":{"type":"string"},"snapshotKind":{"type":"string","nullable":true},"readBlock":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"decimals":{"type":"integer","nullable":true},"totalSupply":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"logo":{"type":"string","nullable":true},"logoProxyUrl":{"type":"string","description":"Signed same-API image URL for an `ipfs://` logo, present only while the image proxy is enabled."},"logoThumbProxyUrl":{"type":"string","description":"Same-API URL of the 192 px card thumbnail for the same logo. With `IMAGE_PUBLIC_THUMB_SECRET` set it is the permanent `/v1/public/image-thumbnails/v1/:cid` address; otherwise it is the signed `variant=thumb` URL."},"description":{"type":"string","nullable":true},"liquidityPool":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"socials":{"type":"object","additionalProperties":true,"description":"Social links keyed by platform.","nullable":true},"fetchedAt":{"type":"string","format":"date-time","nullable":true}}},"classification":{"type":"object","additionalProperties":true,"description":"JEV classification read model. Hierarchical v2 returns sector, subcategory, and path; flat v1 keeps its historical theme value.","properties":{"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"source":{"type":"string","enum":["override","classification","none"]},"status":{"type":"string"},"theme":{"type":"string","nullable":true},"sector":{"type":"string","nullable":true},"subcategory":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"taxonomyVersion":{"type":"string","nullable":true},"promptVersion":{"type":"string","nullable":true},"thresholdVersion":{"type":"string","nullable":true},"probabilities":{"type":"object","additionalProperties":true,"description":"JEV probability distribution.","nullable":true},"confidence":{"type":"number","nullable":true},"classifiedAt":{"type":"string","format":"date-time","nullable":true}},"nullable":true},"phase":{"type":"integer","nullable":true},"lastEventId":{"type":"string","nullable":true},"lastBlockNumber":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"reconciledAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"logoProxyUrl":{"type":"string","description":"Signed same-API image URL, present only for `ipfs://` logos while the image proxy is enabled."},"logoThumbProxyUrl":{"type":"string","description":"Same-API URL of the 192 px card thumbnail for the same logo. When `IMAGE_PUBLIC_THUMB_SECRET` is set it is the permanent `/v1/public/image-thumbnails/v1/:cid` address; otherwise it is the signed `variant=thumb` signed URL."}},"required":["address","chainId","marketKind","launchBlock"]}},"nextCursor":{"type":"string","description":"Token-page cursor, or null on the last page. Pass it back as `cursor`.","nullable":true}},"required":["data","nextCursor"]}}}},"400":{"description":"Invalid `cursor` or `limit`.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Invalid `cursor` or `limit`.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/tokens/search":{"get":{"summary":"Search tokens by name, symbol or address","tags":["Tokens"],"description":"Ranked search over contract metadata and addresses. `q` must be 2-64 characters; `0x`-prefixed input matches address prefixes. No key is required.","parameters":[{"schema":{"type":"string","minLength":2,"maxLength":64},"in":"query","name":"q","required":true,"description":"Query text, 2-64 characters."},{"schema":{"type":"integer","minimum":1,"maximum":20,"default":10},"in":"query","name":"limit","required":false,"description":"Maximum matches. Defaults to 10, capped at 20."}],"responses":{"200":{"description":"Ranked token search matches.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Ranked token search matches.","properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"logo":{"type":"string","nullable":true},"logoProxyUrl":{"type":"string","format":"uri","nullable":true},"logoThumbProxyUrl":{"type":"string","format":"uri","nullable":true}},"required":["address"]}}},"required":["data"]}}}},"400":{"description":"Missing or out-of-range `q`.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Missing or out-of-range `q`.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/launches":{"get":{"summary":"Recent confirmed launches","tags":["Events"],"description":"A newest-first snapshot of recent `token.launched` events with their token projections. This endpoint is not paginated: `streamCursor` is meant for resuming `GET /v1/public/stream`, not for fetching older launches. No key is required.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":50,"default":8},"in":"query","name":"limit","required":false,"description":"Number of launches. Defaults to 8 and is capped at 50."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"event":{"type":"object","additionalProperties":true,"description":"Canonical event v1. See docs/event-catalog.md for per-type fields.","properties":{"id":{"type":"string"},"schemaVersion":{"type":"integer","enum":[1]},"type":{"type":"string","enum":["token.launched","curve.buy","curve.sell","curve.buy_refunded","curve.completed","graduation.swept","graduation.failed","graduation.completed","pool.registered","pool.swap","fees.swept","fees.credited","fees.claimed","buyback.locked","buyback.skipped","conversion.skipped","vesting.released","creator.change_proposed","creator.changed"]},"chainId":{"type":"integer"},"protocol":{"type":"string","enum":["pons-v1","pons-v2"]},"protocolStackId":{"type":"string"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"sourceContract":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"actor":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"quoteAsset":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"amounts":{"type":"object","additionalProperties":{"type":"string"},"description":"Named amounts as lossless decimal strings."},"fees":{"type":"object","additionalProperties":{"type":"string"},"description":"Named fees as lossless decimal strings."},"metadata":{"type":"object","additionalProperties":true,"description":"Type-specific metadata; may be absent."},"blockNumber":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer."},"blockHash":{"type":"string"},"transactionHash":{"type":"string"},"logIndex":{"type":"integer"},"blockTimestamp":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["provisional","confirmed","orphaned"]}},"required":["id","type","blockNumber","logIndex","status"]},"token":{"type":"object","additionalProperties":true,"description":"Token projection. On-chain integers and balances are decimal strings; `curve` is the nullable V2 bonding curve address.","properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"chainId":{"type":"integer"},"protocolStackId":{"type":"string"},"marketKind":{"type":"string"},"marketAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"curve":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"deployer":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"pairToken":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"launchConfigId":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer."},"graduationThreshold":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"creatorTaxBps":{"type":"integer","description":"Launch-time creator fee in basis points (`uint16`), or null when not reconciled yet.","nullable":true},"launchBlock":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer."},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"launchMetadata":{"type":"object","additionalProperties":true,"description":"Launch-time market metadata.","nullable":true},"metadata":{"type":"object","additionalProperties":true,"description":"Contract metadata snapshot. `status` is pending until the enrichment worker runs; every field may be null.","properties":{"status":{"type":"string"},"snapshotKind":{"type":"string","nullable":true},"readBlock":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"decimals":{"type":"integer","nullable":true},"totalSupply":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"logo":{"type":"string","nullable":true},"logoProxyUrl":{"type":"string","description":"Signed same-API image URL for an `ipfs://` logo, present only while the image proxy is enabled."},"logoThumbProxyUrl":{"type":"string","description":"Same-API URL of the 192 px card thumbnail for the same logo. With `IMAGE_PUBLIC_THUMB_SECRET` set it is the permanent `/v1/public/image-thumbnails/v1/:cid` address; otherwise it is the signed `variant=thumb` URL."},"description":{"type":"string","nullable":true},"liquidityPool":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"socials":{"type":"object","additionalProperties":true,"description":"Social links keyed by platform.","nullable":true},"fetchedAt":{"type":"string","format":"date-time","nullable":true}}},"classification":{"type":"object","additionalProperties":true,"description":"JEV classification read model. Hierarchical v2 returns sector, subcategory, and path; flat v1 keeps its historical theme value.","properties":{"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"source":{"type":"string","enum":["override","classification","none"]},"status":{"type":"string"},"theme":{"type":"string","nullable":true},"sector":{"type":"string","nullable":true},"subcategory":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"taxonomyVersion":{"type":"string","nullable":true},"promptVersion":{"type":"string","nullable":true},"thresholdVersion":{"type":"string","nullable":true},"probabilities":{"type":"object","additionalProperties":true,"description":"JEV probability distribution.","nullable":true},"confidence":{"type":"number","nullable":true},"classifiedAt":{"type":"string","format":"date-time","nullable":true}},"nullable":true},"phase":{"type":"integer","nullable":true},"lastEventId":{"type":"string","nullable":true},"lastBlockNumber":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"reconciledAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"logoProxyUrl":{"type":"string","description":"Signed same-API image URL, present only for `ipfs://` logos while the image proxy is enabled."},"logoThumbProxyUrl":{"type":"string","description":"Same-API URL of the 192 px card thumbnail for the same logo. When `IMAGE_PUBLIC_THUMB_SECRET` is set it is the permanent `/v1/public/image-thumbnails/v1/:cid` address; otherwise it is the signed `variant=thumb` signed URL."}},"required":["address","chainId","marketKind","launchBlock"],"nullable":true}},"required":["event"]}},"streamCursor":{"type":"string","description":"Cursor of the newest launch. Pass it to `GET /v1/public/stream` as `after` so the stream continues from here.","nullable":true},"nextCursor":{"type":"string","description":"Deprecated alias of `streamCursor`. This endpoint is a recent-launch snapshot and is not paginated.","deprecated":true,"nullable":true}},"required":["data","streamCursor"]}}}},"400":{"description":"Invalid `limit`.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Invalid `limit`.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/tokens/{token}":{"get":{"summary":"Read one token projection","tags":["Tokens"],"description":"Token projection by contract address, or `data: null` when the address is unknown. On-chain integers are decimal strings. No key is required.","parameters":[{"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"in":"path","name":"token","required":true,"description":"Token contract address."}],"responses":{"200":{"description":"The token projection, or `data: null` when the address is unknown.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The token projection, or `data: null` when the address is unknown.","properties":{"data":{"type":"object","additionalProperties":true,"description":"Token projection. On-chain integers and balances are decimal strings; `curve` is the nullable V2 bonding curve address.","properties":{"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"chainId":{"type":"integer"},"protocolStackId":{"type":"string"},"marketKind":{"type":"string"},"marketAddress":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"curve":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"deployer":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"pairToken":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"launchConfigId":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer."},"graduationThreshold":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"creatorTaxBps":{"type":"integer","description":"Launch-time creator fee in basis points (`uint16`), or null when not reconciled yet.","nullable":true},"launchBlock":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer."},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"launchMetadata":{"type":"object","additionalProperties":true,"description":"Launch-time market metadata.","nullable":true},"metadata":{"type":"object","additionalProperties":true,"description":"Contract metadata snapshot. `status` is pending until the enrichment worker runs; every field may be null.","properties":{"status":{"type":"string"},"snapshotKind":{"type":"string","nullable":true},"readBlock":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"name":{"type":"string","nullable":true},"symbol":{"type":"string","nullable":true},"decimals":{"type":"integer","nullable":true},"totalSupply":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"logo":{"type":"string","nullable":true},"logoProxyUrl":{"type":"string","description":"Signed same-API image URL for an `ipfs://` logo, present only while the image proxy is enabled."},"logoThumbProxyUrl":{"type":"string","description":"Same-API URL of the 192 px card thumbnail for the same logo. With `IMAGE_PUBLIC_THUMB_SECRET` set it is the permanent `/v1/public/image-thumbnails/v1/:cid` address; otherwise it is the signed `variant=thumb` URL."},"description":{"type":"string","nullable":true},"liquidityPool":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"socials":{"type":"object","additionalProperties":true,"description":"Social links keyed by platform.","nullable":true},"fetchedAt":{"type":"string","format":"date-time","nullable":true}}},"classification":{"type":"object","additionalProperties":true,"description":"JEV classification read model. Hierarchical v2 returns sector, subcategory, and path; flat v1 keeps its historical theme value.","properties":{"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"source":{"type":"string","enum":["override","classification","none"]},"status":{"type":"string"},"theme":{"type":"string","nullable":true},"sector":{"type":"string","nullable":true},"subcategory":{"type":"string","nullable":true},"path":{"type":"string","nullable":true},"taxonomyVersion":{"type":"string","nullable":true},"promptVersion":{"type":"string","nullable":true},"thresholdVersion":{"type":"string","nullable":true},"probabilities":{"type":"object","additionalProperties":true,"description":"JEV probability distribution.","nullable":true},"confidence":{"type":"number","nullable":true},"classifiedAt":{"type":"string","format":"date-time","nullable":true}},"nullable":true},"phase":{"type":"integer","nullable":true},"lastEventId":{"type":"string","nullable":true},"lastBlockNumber":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer.","nullable":true},"reconciledAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"logoProxyUrl":{"type":"string","description":"Signed same-API image URL, present only for `ipfs://` logos while the image proxy is enabled."},"logoThumbProxyUrl":{"type":"string","description":"Same-API URL of the 192 px card thumbnail for the same logo. When `IMAGE_PUBLIC_THUMB_SECRET` is set it is the permanent `/v1/public/image-thumbnails/v1/:cid` address; otherwise it is the signed `variant=thumb` signed URL."}},"required":["address","chainId","marketKind","launchBlock"],"nullable":true}},"required":["data"]}}}},"400":{"description":"Malformed contract address.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Malformed contract address.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/images/{cid}":{"get":{"summary":"Signed token-logo image","tags":["Images"],"description":"Streams a token logo that the API fetched from IPFS. The URL is only valid with the `exp`/`sig` pair that the API signs into `logoProxyUrl`; `path` selects the file inside the CID and `variant=thumb` returns the signed 192 px card thumbnail. Returns 404 when the image proxy is disabled.","parameters":[{"schema":{"type":"string"},"in":"query","name":"exp","required":false,"description":"Signed expiry, in the signature payload."},{"schema":{"type":"string"},"in":"query","name":"sig","required":false,"description":"HMAC over cid, path, variant and exp."},{"schema":{"type":"string"},"in":"query","name":"path","required":false,"description":"File path inside the CID."},{"schema":{"type":"string","enum":["thumb"]},"in":"query","name":"variant","required":false,"description":"Fixed rendition of the image. Part of the signature, so it cannot be swapped after signing."},{"schema":{"type":"string"},"in":"path","name":"cid","required":true,"description":"IPFS content identifier."}],"responses":{"200":{"description":"Raw image bytes with an ETag.","content":{"application/json":{"schema":{"type":"string","format":"binary","description":"Raw image bytes with an ETag."}}}},"304":{"description":"Client ETag still matches."},"400":{"description":"Malformed `path` or unknown `variant`.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Malformed `path` or unknown `variant`.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Missing or invalid `exp`/`sig` signature.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Missing or invalid `exp`/`sig` signature.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Image proxy disabled, or the image is not available at the gateway.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Image proxy disabled, or the image is not available at the gateway.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"502":{"description":"Every configured IPFS gateway failed.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Every configured IPFS gateway failed.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/image-thumbnails/{version}/{cid}":{"get":{"summary":"Permanent public token-thumbnail image","tags":["Images"],"description":"Stable public 192 px WebP thumbnail of an `ipfs://` token logo. The address is the rendition version, CID and normalized path, signed without an expiry, so one logo keeps one URL across responses, restarts and browser sessions. Returns 404 when the permanent mode is off (`IMAGE_PUBLIC_THUMB_SECRET` unset), the version is unknown or the source is missing; 400 for a non-canonical request; 403 for a missing or invalid `sig`; and 502 when the source cannot be fetched or rendered as WebP.","parameters":[{"schema":{"type":"string"},"in":"query","name":"path","required":false,"description":"Normalized file path inside the CID."},{"schema":{"type":"string"},"in":"query","name":"sig","required":false,"description":"HMAC over the rendition version, CID and normalized path."},{"schema":{"type":"string"},"in":"path","name":"version","required":true,"description":"Rendition version of the thumbnail (currently `v1`)."},{"schema":{"type":"string"},"in":"path","name":"cid","required":true,"description":"IPFS content identifier."}],"responses":{"200":{"description":"Raw image bytes with an ETag.","content":{"application/json":{"schema":{"type":"string","format":"binary","description":"Raw image bytes with an ETag."}}}},"304":{"description":"Client ETag still matches."},"400":{"description":"Non-canonical or malformed `path`.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Non-canonical or malformed `path`.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"403":{"description":"Missing or invalid `sig` signature.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Missing or invalid `sig` signature.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"Permanent thumbnails disabled, unknown version, or the image is not available at the gateway.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Permanent thumbnails disabled, unknown version, or the image is not available at the gateway.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"502":{"description":"The source or its WebP rendition is unavailable.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"The source or its WebP rendition is unavailable.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/events/page":{"get":{"summary":"Read a page of token event history","tags":["Events"],"description":"Returns 20 newest confirmed events for one token, with one-based page pagination. No key is required.","parameters":[{"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"in":"query","name":"token","required":true,"description":"Token contract address."},{"schema":{"type":"integer","minimum":1,"maximum":10000,"default":1},"in":"query","name":"page","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"total":{"type":"integer","minimum":0},"page":{"type":"integer","minimum":1},"pageSize":{"type":"integer","enum":[20]},"totalPages":{"type":"integer","minimum":0},"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"Canonical event v1. See docs/event-catalog.md for per-type fields.","properties":{"id":{"type":"string"},"schemaVersion":{"type":"integer","enum":[1]},"type":{"type":"string","enum":["token.launched","curve.buy","curve.sell","curve.buy_refunded","curve.completed","graduation.swept","graduation.failed","graduation.completed","pool.registered","pool.swap","fees.swept","fees.credited","fees.claimed","buyback.locked","buyback.skipped","conversion.skipped","vesting.released","creator.change_proposed","creator.changed"]},"chainId":{"type":"integer"},"protocol":{"type":"string","enum":["pons-v1","pons-v2"]},"protocolStackId":{"type":"string"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"sourceContract":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"actor":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"quoteAsset":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"amounts":{"type":"object","additionalProperties":{"type":"string"},"description":"Named amounts as lossless decimal strings."},"fees":{"type":"object","additionalProperties":{"type":"string"},"description":"Named fees as lossless decimal strings."},"metadata":{"type":"object","additionalProperties":true,"description":"Type-specific metadata; may be absent."},"blockNumber":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer."},"blockHash":{"type":"string"},"transactionHash":{"type":"string"},"logIndex":{"type":"integer"},"blockTimestamp":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["provisional","confirmed","orphaned"]}},"required":["id","type","blockNumber","logIndex","status"]}}},"required":["total","page","pageSize","totalPages","data"]}}}},"400":{"description":"Invalid token address or page number.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Invalid token address or page number.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/events":{"get":{"summary":"Read canonical event history","tags":["Events"],"description":"Oldest-first page of canonical events. Filter by contract address and event type; `confirmed` is the default status. Cursors come from a previous page's `nextCursor`. No key is required.","parameters":[{"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"in":"query","name":"token","required":false,"description":"Single contract address filter."},{"schema":{"type":"string"},"in":"query","name":"tokens","required":false,"description":"Comma-separated contract addresses."},{"schema":{"type":"string","enum":["token.launched","curve.buy","curve.sell","curve.buy_refunded","curve.completed","graduation.swept","graduation.failed","graduation.completed","pool.registered","pool.swap","fees.swept","fees.credited","fees.claimed","buyback.locked","buyback.skipped","conversion.skipped","vesting.released","creator.change_proposed","creator.changed"]},"in":"query","name":"type","required":false,"description":"Single canonical event type."},{"schema":{"type":"string"},"in":"query","name":"types","required":false,"description":"Comma-separated canonical event types. Allowed values: token.launched, curve.buy, curve.sell, curve.buy_refunded, curve.completed, graduation.swept, graduation.failed, graduation.completed, pool.registered, pool.swap, fees.swept, fees.credited, fees.claimed, buyback.locked, buyback.skipped, conversion.skipped, vesting.released, creator.change_proposed, creator.changed."},{"schema":{"type":"string","enum":["provisional","confirmed","orphaned"],"default":"confirmed"},"in":"query","name":"status","required":false,"description":"Canonical event status. Defaults to `confirmed`."},{"schema":{"type":"string"},"in":"query","name":"after","required":false,"description":"Cursor returned as `nextCursor` by the previous page. Malformed values are rejected with 400 `invalid_cursor`."},{"schema":{"type":"integer","minimum":1,"maximum":500,"default":100},"in":"query","name":"limit","required":false,"description":"Page size. Defaults to 100 and is capped at 500."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"data":{"type":"array","items":{"type":"object","additionalProperties":true,"description":"Canonical event v1. See docs/event-catalog.md for per-type fields.","properties":{"id":{"type":"string"},"schemaVersion":{"type":"integer","enum":[1]},"type":{"type":"string","enum":["token.launched","curve.buy","curve.sell","curve.buy_refunded","curve.completed","graduation.swept","graduation.failed","graduation.completed","pool.registered","pool.swap","fees.swept","fees.credited","fees.claimed","buyback.locked","buyback.skipped","conversion.skipped","vesting.released","creator.change_proposed","creator.changed"]},"chainId":{"type":"integer"},"protocol":{"type":"string","enum":["pons-v1","pons-v2"]},"protocolStackId":{"type":"string"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"sourceContract":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"actor":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"quoteAsset":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","nullable":true},"amounts":{"type":"object","additionalProperties":{"type":"string"},"description":"Named amounts as lossless decimal strings."},"fees":{"type":"object","additionalProperties":{"type":"string"},"description":"Named fees as lossless decimal strings."},"metadata":{"type":"object","additionalProperties":true,"description":"Type-specific metadata; may be absent."},"blockNumber":{"type":"string","pattern":"^\\d+$","description":"Lossless decimal string for an on-chain integer."},"blockHash":{"type":"string"},"transactionHash":{"type":"string"},"logIndex":{"type":"integer"},"blockTimestamp":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["provisional","confirmed","orphaned"]}},"required":["id","type","blockNumber","logIndex","status"]}},"nextCursor":{"type":"string","description":"Cursor of the newest row in this page, or null when the page is empty. Pass it back as `after`.","nullable":true}},"required":["data","nextCursor"]}}}},"400":{"description":"Invalid `after` (`invalid_cursor`), address (`invalid_token`), event type (`invalid_type`), status (`invalid_status`) or `limit`.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Invalid `after` (`invalid_cursor`), address (`invalid_token`), event type (`invalid_type`), status (`invalid_status`) or `limit`.","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit exceeded. Retry after `Retry-After`; the window and remaining budget are in the `X-RateLimit-*` headers.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v1/public/stream":{"get":{"summary":"Live confirmed-event stream","tags":["Events"],"description":"Server-sent event stream of confirmed canonical events.\n\nEach event message uses `event: <canonical type>`, `data: <canonical event JSON>` and `id: <cursor>`.\nReconnect with `Last-Event-ID` (preferred) or `after`; the server resumes after that cursor.\nA `:` heartbeat comment is sent every 20 seconds so idle proxies keep the connection open.\nService messages `indexer.status`, `stats.updated`, `token.updated` and `quota.exceeded` are informational and are not canonical events.\nThe stream always sends confirmed events only; `status` and `limit` are not accepted on this route.\nEach client IP may hold at most `MAX_SSE_CONNECTIONS_PER_IP` concurrent streams; above that the request is rejected with 429 and `Retry-After`.","parameters":[{"schema":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"in":"query","name":"token","required":false,"description":"Single contract address filter."},{"schema":{"type":"string"},"in":"query","name":"tokens","required":false,"description":"Comma-separated contract addresses."},{"schema":{"type":"string","enum":["token.launched","curve.buy","curve.sell","curve.buy_refunded","curve.completed","graduation.swept","graduation.failed","graduation.completed","pool.registered","pool.swap","fees.swept","fees.credited","fees.claimed","buyback.locked","buyback.skipped","conversion.skipped","vesting.released","creator.change_proposed","creator.changed"]},"in":"query","name":"type","required":false,"description":"Single canonical event type."},{"schema":{"type":"string"},"in":"query","name":"types","required":false,"description":"Comma-separated canonical event types. Allowed values: token.launched, curve.buy, curve.sell, curve.buy_refunded, curve.completed, graduation.swept, graduation.failed, graduation.completed, pool.registered, pool.swap, fees.swept, fees.credited, fees.claimed, buyback.locked, buyback.skipped, conversion.skipped, vesting.released, creator.change_proposed, creator.changed."},{"schema":{"type":"string"},"in":"query","name":"after","required":false,"description":"Cursor to resume from. `Last-Event-ID` takes precedence when both are sent. Malformed values are rejected with 400 `invalid_cursor` before the stream opens."}],"responses":{"200":{"description":"Server-sent event stream of confirmed canonical events.\n\nEach event message uses `event: <canonical type>`, `data: <canonical event JSON>` and `id: <cursor>`.\nReconnect with `Last-Event-ID` (preferred) or `after`; the server resumes after that cursor.\nA `:` heartbeat comment is sent every 20 seconds so idle proxies keep the connection open.\nService messages `indexer.status`, `stats.updated`, `token.updated` and `quota.exceeded` are informational and are not canonical events.\nThe stream always sends confirmed events only; `status` and `limit` are not accepted on this route.\nEach client IP may hold at most `MAX_SSE_CONNECTIONS_PER_IP` concurrent streams; above that the request is rejected with 429 and `Retry-After`.","content":{"text/event-stream":{"schema":{"type":"string"}}}},"400":{"description":"Invalid `after` (`invalid_cursor`) or an unsupported parameter such as `status`/`limit` (`invalid_query`).","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Invalid `after` (`invalid_cursor`) or an unsupported parameter such as `status`/`limit` (`invalid_query`).","properties":{"error":{"type":"string"}},"required":["error"]}}}},"429":{"description":"Rate limit or SSE connection cap reached. Honours `Retry-After`.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Rate limit or SSE connection cap reached. Honours `Retry-After`.","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}}}}