API
| Route | Answer |
|---|---|
| GET /api/counts | One record per measurement and transport (tcp,
quic, and any for the two folded together), counted both
per queried name and per second-level domain. |
| GET /api/public-names | The same measurement broken down by ECH public name. date and
transport select; no date means the most recent measurement. |
| GET /api/domains | Every name that completed an ECH handshake on a specified day, filtered by transport,
in_dns, public_name and q, paged with
limit and offset. |
| GET /api/timeline?domain= | One domain, reduced to what the timeline draws: a status per probe per measurement,
the configurations seen in DNS, and the measured names below the domain.
from, to and limit bound the range. |
| GET /api/lookup?domain= | The same lookup, unreduced: every column of every row. |
Technical Details
This service is served entirely from static files in S3-compatible storage. There is no running database daemon. We are experimenting with this setup to keep maintenance overhead minimal. If you encounter very slow queries, please let us know.
We partition the data into static files by registrable domain, as defined by the Mozilla Public Suffix List. A lookup fetches only the chunks that match the domain's hash. A server component then narrows the answer down to exactly the domain name and sends it back to the client.
Because the partition key is the registrable domain, a lookup of example.com reads the same file as one of www.example.com. The rows returned are still exact, since a subdomain is a different measurement from the domain.