---
title: "What we hold, per jurisdiction and type"
method: GET
path: "/coverage"
tags: ["metadata"]
---

# What we hold, per jurisdiction and type

`GET /coverage`

Answers "is it worth asking?" before a query comes back empty.

An empty result from `/events` or `/features` has always meant one of
two opposite things — we have never carried that data, or we carry it
and there is nothing right now — and nothing in the response separated
them. This endpoint does.

Public metadata — no API key required.

Reads a summary the worker rebuilds hourly, so the answer is up to
`COVERAGE_REFRESH_INTERVAL` stale: a type that started producing
minutes ago can still read as empty.

**What it does not tell you:** why something is empty. A seasonal feed
that is quiet by design and one that broke an hour ago look identical;
`latest_data_at` narrows that and does not settle it. Nor does listing a
jurisdiction here mean your plan may query it — coverage is about the
data we hold, not entitlement.

## Query parameters

- `jurisdiction` string

## Response `200`

Coverage for the requested jurisdiction

- object
  - `covered` boolean — False means we have never held anything for this jurisdiction — not that it is currently empty.
  - `events` CoverageEntry[]
    - `last_nonzero_at` string, date-time — Last rebuild at which this pair held anything.
    - `latest_data_at` string, date-time — Newest `last_updated` among the counted rows. A high count with an old timestamp is a stopped feed, which the count alone reports as healthy.
    - `row_count` integer
    - `type` string
  - `features` CoverageEntry[]
    - `last_nonzero_at` string, date-time — Last rebuild at which this pair held anything.
    - `latest_data_at` string, date-time — Newest `last_updated` among the counted rows. A high count with an old timestamp is a stopped feed, which the count alone reports as healthy.
    - `row_count` integer
    - `type` string
  - `jurisdiction` string
  - `refreshed_at` string, date-time — When the in-memory summary was last rebuilt.
  - `summary_rows` integer — Number of (jurisdiction, type) pairs in the summary.
  - `warnings` APIWarning[]
    - `code` 'unknown_jurisdiction' | 'unknown_type' | 'unknown_severity' | 'unknown_status' | 'not_covered' | 'covered_but_empty' — Machine-readable warning kind.
    - `did_you_mean` string[] — The codes the input most likely meant, best first. The catalogue is keyed on ISO 3166-1 alpha-3 while many callers send alpha-2, so an alpha-2 value resolves to the codes of that country. Absent when nothing plausible resolves.
    - `message` string
    - `value` string — The offending input, uppercased and trimmed.

## Other responses

- `503` — The coverage summary has not loaded yet. Returned rather than an empty body, which would read as "we cover nothing".

## Changes

- **2026-08-27** `8275f05c282c` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/road511/apis/road511-traffic-api/changes/coverage/get.md)

---

[API](https://skmtc.dev/road511/apis/road511-traffic-api.md) · [All operations](https://skmtc.dev/road511/apis/road511-traffic-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/road511/road511-traffic-api/revisions/8275f05c282c/schema)
