Skip to main content
This section is the machine-readable half of the docs: every value a filter accepts, every parameter, every event code, and every metric formula. You can build against these pages directly. They are generated from the same objects the API imports when it handles your request, so a page here cannot list a value the API rejects or omit one it accepts. A closed vocabulary listed here is complete; a parameter absent from here is one the server ignores. If a reference page and the API ever disagree, that is a bug in us, not a stale doc.

What is where

Closed, observed, identifier — the distinction that matters most

Value reference labels every vocabulary as one of three kinds, and mixing them up is the difference between a filter that is exhaustive and one that quietly is not.
Closed — the complete, authoritative set. Anything else returns 400 with details.accepted_values, so a caller can self-correct without reading a page.
Observed — a dated measurement of what the corpus currently holds, never an allowlist. The API accepts values outside the list; you may just get no rows. We publish these because guessing is worse, and we date them because an undated measurement is indistinguishable from a promise.
Identifier — a key with a format and a resolver, not a list. Resolve one through the endpoint named on its entry.
Treating an observed list as closed is the most common way to build a filter that quietly misses data — the values it omits are real, and the API will accept them.

Pinning against a version

The whole value tier is available machine-readable at GET /api/v2/meta/enums, including a sha256 you can pin against and diff in CI. It is unmetered: checking a value before you spend a query unit on a request that would fail should not itself cost a query unit.