API
Take the numbers and build something
Launch inventory and observed swap counts are available at /v2. Provider-backed financial snapshots remain at /v1. No key or sign-up is required. The data is free to use with attribution.
Preview
The two API versions have different freshness and coverage. /v1 uses a scheduled collector and may be overdue. /v2 publishes continuously indexed observations, with a 60-second freshness target and a 120-second stale threshold. The current UTC day is partial.
Envio reaching its reported chain head does not prove complete historical coverage. Native swap counts are observed events, not unique trades or traders. Quote quantities remain exact strings separated by asset; USD values remain null until pricing is verified.
Browse /v2 Browse /v1 OpenAPI 3.1 Read the flags first Source
Indexed observations
Live inventory and activity
/v2/live combines independently dated launch and activity snapshots. /v2/health reports each feed's age and availability. Launch endpoints /v2/launches and /v2/tokens retain the factory census while native history is validated.
/v2/activity serves daily Envio observations. Each row retains date, bucket_start, kind, quote, internal_scope, exact-string swaps and quote_raw, and complete_utc_day. quote_units and volume_usd remain null. Missing groups are not evidence of zero activity.
curl "https://pons-metrics.simplethin.gs/v2/activity?from=2026-09-01&to=2026-09-10&kind=v4&internal_scope=unclassified"
from is inclusive and to exclusive, both UTC dates. Optional kind accepts v3, curve or v4. quote filters a contract address. internal_scope accepts unclassified or hook_internal. Filters apply only to daily; window describes the published observations. Unclassified execution is not proof of user trading. Hook execution is not proof of buybacks.
sync.caught_up compares the indexed block with the snapshot's reported head and is false when stale. It is separate from coverage.validation_complete and coverage.usd_pricing_complete. Read freshness on every request. A missing or invalid native publication returns HTTP 503 from /v2/activity; /v2/live retains launches and reports activity unavailable. A valid stale snapshot stays readable with stale: true.
These responses are direct objects, unlike the /v1 envelope below. revision identifies the indexed block, hash and publication. Replace a previous snapshot when revision changes, including after rollback; do not keep the maximum of old and new totals. /v2/native exposes the underlying native publication and sync status. This is a daily aggregate API, not a per-trade query service.
/v2/stream accepts a WebSocket upgrade for live observed launches, graduations, swap counts and exact raw PONS burn amounts. HTTP GET returns stream health. A private RPC WebSocket relay uses Envio's pool registry, then the Cloudflare Worker broadcasts one-second event batches. No wallet or transaction identities are sent. These transient counts are provisional; disconnect gaps are not replayed and are not a historical ledger. A hello seeds status and price; later pulse frames carry a session, sequence and millisecond receipt timestamp. head supplies the observed chain block, block timestamp in seconds and receipt time. recent_launches supplies up to ten token/quote/version/block/log-index/receipt-time records with nullable contract symbol and block timestamp per batch; wallets and transaction hashes are omitted. Publications check pending heads/events every 100 ms and may coalesce intermediate heads during network delays. Send ping for pong.
The stream's price.pons_weth is the canonical PONS/WETH V3 pool ratio observed on each swap. The dashboard converts it with /v2/market.weth_usd_reference, a dated DexScreener conversion refreshed every 30 seconds. This is not an independent oracle or a historically priced fee series. Stream fields, limits and source definitions.
/v2/market supplies the shared PONS spot quote. One server fetches DexScreener every 30 seconds and selects the PONS-base pair with the highest reported USD liquidity. observed_at is our fetch time; the provider's trade timestamp is unknown. Read freshness.stale before treating a retained quote as current. This quote does not value historical fees or volume.
/v2/boards publishes three GeckoTerminal pool boards. Each board refreshes every 60 seconds with independent observed_at, last_attempt_at, error and request-time freshness. Its data is the provider's top pools by 24h volume, not a complete pool inventory. A failed refresh retains the earlier observation and timestamp.
/v2/holders refreshes GeckoTerminal's PONS holder count every five minutes. data.provider_updated_at records the provider's own update time; observed_at records our fetch. Transfer totals are not provided. These snapshots accept no query parameters and remain independent of Envio accounting.
/v2/market also includes the PONS-base venues returned in the same 30-second DexScreener response and their total_liquidity_usd. Missing numeric fields stay null. Venue coverage is provider-reported. /v2/launches and /v2/live include quote_assets, an all-time V2 census count grouped by quote contract address. Date filters apply only to daily launch rows, not this all-time inventory.
/v2/burns supplies native daily PONS burns, separated by sender and destination, with exact-string amount_raw and events. The token has 18 decimals. Attribution follows the two wallets in DeFiLlama's September 10 burner list, including 0x5795…c324; other senders remain unattributed. A burn alone does not prove a market purchase. The legacy /v1 burn attribution still uses its original wallet. Native coverage remains unverified and the current day is provisional. These two snapshot endpoints accept no query parameters.
Start here
One request, no setup
curl https://pons-metrics.simplethin.gs/v1/summary
Every response is an envelope. meta tells you when the data was built and what you are allowed to do with it. data is the payload, an object or an array depending on the endpoint.
{
"meta": {
"endpoint": "summary",
"generated_at": "2026-09-04T11:43:37.828Z",
"docs": "https://pons-metrics.simplethin.gs/api",
"flags": "https://pons-metrics.simplethin.gs/v1/flags",
"license": "CC-BY-4.0",
"attribution": "pons ledger by Simple Things"
},
"data": { ... }
}
Endpoints
What you can ask for
Loading the live endpoint list…
Try it
Run a request from here
Pick an endpoint and press Send.
Parameters
Filtering and formats
| Parameter | Applies to | What it does |
|---|---|---|
from, to | dated collections | Inclusive UTC date bounds, YYYY-MM-DD. |
order | dated collections | asc by default, or desc for newest first. |
limit, offset | collections | Page through rows. Limit is capped at 5,000. |
fields | collections | Comma-separated allow-list, so you fetch only what you need. |
format | collections | json by default, or csv for a spreadsheet. |
pretty | everything | 1 to indent the JSON for reading in a browser. |
curl "https://pons-metrics.simplethin.gs/v1/fees?from=2026-08-01&to=2026-08-31&fields=date,fees_usd,revenue_usd" curl "https://pons-metrics.simplethin.gs/v1/history?order=desc&limit=7&format=csv" curl "https://pons-metrics.simplethin.gs/v1/pools?version=v2&limit=10"
The small print
What you can rely on
Stability
v1 is additive only. Fields may be added, never removed or retyped. Anything breaking ships as /v2, and v1 keeps working. The shape is stable even though the service is a preview; if it is ever withdrawn or materially changed, that is announced in the repository first.
How fresh, exactly
A collector runs every hour, so meta.age_minutes is usually under 60 and meta.stale turns true past three hours. Rows carry complete, which is false for today. The dashboard polls the separate /v2/live feed every 30 seconds while visible. Native observations have their own data cutoff and do not refresh these financial snapshots.
Freshness and caching
Rebuilt hourly. Responses carry ETag and X-Pons-Generated-At, and are cached at the edge for five minutes. Send If-None-Match and you will get a 304 rather than a payload.
Limits
There is no key and no published rate limit today. Please cache what you fetch and identify your client in the user agent. If it gets hammered, keys arrive and existing users get told before anything changes.
Licence and attribution
Data is CC BY 4.0, code is MIT. Use it commercially if you like. Credit "pons ledger by Simple Things" with a link, and do not present it as official pons data, because it is not.
Accuracy
Read /v1/flags before you quote a figure. It lists, machine readably, what the current build may get wrong and why, including partial days and pricing caveats.
Something missing?
The schema is deliberately small while we learn what people actually use. If you need a field, a filter, an endpoint, or the whole thing in real time, ping @justinavery on X or open an issue on GitHub. Telling me what you are building is the single most useful thing you can do.