Query the repos a relay missed during a relay-eval measurement window.
A missing repo is first a stream comparison fact: relay-eval saw repository activity for a DID on at least one observed synchronization stream during a run, but did not see that DID on the relay being inspected.
Resolver checks, PDS hosts, and repo status are supporting evidence. They help explain the gap, but they are not the denominator.
Use this when you want the most recent retained detail rows for one relay.
curl -fsS 'https://relay-eval.waow.tech/api/latest/diffs?relay=relay.fire.hose.cam&limit=5000' | jq
Complete missing-row counts for the selected run. Unchecked rows are aggregate counts, not all concrete DID rows.
Only checked rows where the repo looks active elsewhere and absent from this relay.
Inspect resolver-budget leftovers, resolver failures, malformed DIDs, and inactive evidence.
The summary endpoint gives complete counts, facets, lower-bound estimates, and the concrete run_id. Use that run_id for pagination so every detail page comes from the same measurement run.
curl -fsS 'https://relay-eval.waow.tech/api/latest/diffs/summary?relay=relay.fire.hose.cam' \
| jq '{run_id,total,checked,unchecked,estimate,classes:.facets.classifications}'
estimate.checked_limited is true, live_gap_display includes +. Treat that as "at least this many checked live gaps; unchecked rows remain."This emits tab-separated DID, classification, and optional PDS columns for concrete rows retained in the selected run. Use the summary endpoint for complete unchecked counts.
relay='relay.fire.hose.cam'
run_id="$(curl -fsS "https://relay-eval.waow.tech/api/latest/diffs/summary?relay=${relay}" | jq -r '.run_id')"
cursor=''
while true; do
url="https://relay-eval.waow.tech/api/runs/${run_id}/diffs?relay=${relay}&limit=5000"
[ -n "$cursor" ] && url="${url}&cursor=${cursor}"
page="$(curl -fsS "$url")"
echo "$page" | jq -r '.diffs[] | [.did, .classification, (.pds // "")] | @tsv'
cursor="$(echo "$page" | jq -r '.next_cursor // empty')"
[ -z "$cursor" ] && break
done
next_cursor is a resume token. It is not a page number; pass it back as cursor to continue after the last emitted row.
| parameter | meaning |
|---|---|
relay | Relay host to inspect, for example relay.fire.hose.cam. |
limit | Rows per response. Defaults to 1000 and is capped at 5000. |
cursor | Resume token from the previous response's next_cursor. |
lane | Semantic bucket: live, unchecked, review, inactive, or checked. |
classification | Exact stored classifier label such as active_missing. |
q | Substring search over the DID. |
pds_host | Filter by resolved PDS host, with or without https://. |
/api/latest/diffs?relay=relay.fire.hose.cam&lane=live&limit=5000/api/latest/diffs?relay=relay.fire.hose.cam&lane=unchecked/api/latest/diffs?relay=relay.fire.hose.cam&q=76eyp/api/latest/diffs?relay=relay.fire.hose.cam&pds_host=bracket.us-west.host.bsky.network| lane | labels | how to read it |
|---|---|---|
live | active_missing, legacy coverage_gap | Checked lower-bound stream gaps. This is the strongest signal for relay coverage debt. |
unchecked | classification_not_attempted | Resolver budget was not spent on this row. It belongs in the full gap set, but not in the live lower bound. |
review | malformed_did, unsupported_did_method, did_resolution_failed, invalid_did_document, unresolvable | Needs operator interpretation. Often resolver/network or DID-document ambiguity. |
inactive | no_pds_endpoint, deactivated | Current hosting evidence does not support treating this as live stream debt. |
checked | anything except classification_not_attempted | Rows where relay-eval spent classification effort. |
{
"run_id": 4208,
"relay": "relay.fire.hose.cam",
"limit": 5000,
"diffs": [
{
"cursor": 527654185,
"relay": "relay.fire.hose.cam",
"did": "did:plc:...",
"classification": "active_missing",
"classification_version": 2,
"pds": "https://bracket.us-west.host.bsky.network"
}
],
"next_cursor": 527659184
}
Use /api/latest/diffs for convenience. Use /api/runs/:run_id/diffs when paging, exporting, or comparing results.
Semantics are aligned with relay-eval's stream-comparison model and ATP sync concepts: atproto sync, repository, IETF sync draft, IETF repository draft.