Appearance
measurements
51 endpoints at a glance
| Method | Path | Summary |
|---|---|---|
GET | /admin/measurements/daily/ | Admin List Daily |
GET | /admin/measurements/daily/{date}/ | Admin Get Daily |
POST | /admin/measurements/daily/{date}/recompute-stats | Admin Recompute Day Stats |
POST | /admin/measurements/daily/{date}/reprocess | Admin Reprocess Day |
POST | /admin/measurements/daily/{date}/verify | Admin Verify Day |
POST | /admin/measurements/daily/backfill-stale-stats | Admin Measurements Backfill Stale Stats |
POST | /admin/measurements/daily/fill | Admin Fill Days |
POST | /admin/measurements/daily/recompute-stats-range | Admin Recompute Day Stats Range |
POST | /admin/measurements/daily/recover-stale | Admin Recover Stale |
GET | /admin/measurements/daily/stats-coverage | Admin Measurements Stats Coverage |
POST | /admin/measurements/daily/verify-range | Admin Verify Range |
GET | /admin/measurements/imports/ | Admin List Imports |
POST | /admin/measurements/imports/ | Admin Queue Import |
GET | /admin/measurements/imports/{job_id} | Admin Get Import |
POST | /admin/measurements/imports/{job_id}/stop | Admin Stop Import |
POST | /admin/measurements/latest/redecode | Admin Redecode Latest |
GET | /admin/measurements/stats/ | Admin Stats |
POST | /admin/measurements/stats/refresh | Admin Refresh Stats |
GET | /admin/measurements/well-known/stats | Well Known Stats |
POST | /admin/measurements/well-known/verify | Well Known Verify |
GET | /anchor-measurements/ | List Anchor Measurements |
GET | /anchor-measurements/{am_id}/ | Get Anchor Measurement |
POST | /anchor-measurements/admin/clear/ | Clear Collection |
POST | /anchor-measurements/admin/refresh/run | Run Refresh |
GET | /anchor-measurements/admin/runs/ | List Admin Runs |
GET | /anchor-measurements/admin/stats/ | Get Admin Stats |
GET | /anchor-measurements/by-anchor/{anchor_id}/ | List For Anchor |
POST | /atlas/anchor-measurements/refresh/ | Refresh Anchor Measurements |
POST | /atlas/measurements-probes/refresh/ | Refresh Measurements Probes |
POST | /atlas/measurements/import-new/ | Import New Measurements |
POST | /atlas/measurements/refresh-oneoffs/ | Refresh Oneoff Measurements |
POST | /atlas/measurements/refresh-periodics/ | Refresh Periodic Measurements |
GET | /measurements-latest/by-probe/{prb_id}/ | Measurements Latest For Probe |
GET | /measurements-probes/ | List Measurements Probes |
GET | /measurements-probes/{measurement_id}/{probe_id}/ | Get Pair |
POST | /measurements-probes/admin/clear/ | Clear Collection |
POST | /measurements-probes/admin/refresh/run | Run Refresh |
GET | /measurements-probes/admin/runs/ | List Admin Runs |
GET | /measurements-probes/admin/stats/ | Get Admin Stats |
GET | /measurements-probes/by-measurement/{measurement_id}/ | List For Measurement |
GET | /measurements-probes/by-probe/{probe_id}/ | List For Probe |
GET | /measurements/v2/ | List Measurements |
GET | /measurements/v2/{msm_id}/ | Get Measurement |
GET | /measurements/v2/{msm_id}/latest/ | Get Measurement Latest |
POST | /measurements/v2/{msm_id}/participation/analyse | Participation Analyse |
GET | /measurements/v2/{msm_id}/participation/missing | Participation Missing |
GET | /measurements/v2/{msm_id}/participation/status | Participation Status |
POST | /measurements/v2/{msm_id}/participation/stop | Participation Stop |
GET | /measurements/v2/daily/series/ | Measurements Daily Series |
GET | /measurements/v2/types/ | List Types |
GET | /trends/hbase/ | Get Latest Speed |
Get Measurement
GET
/measurements/v2/{msm_id}/
Cache-first measurement lookup. On hit returns the local row;
on miss / stale / ?refresh=true falls through to RIPE,
upserts, and returns the freshly-cached row.
Response wrapper keeps the legacy envelope shape the frontend
already consumes::
{"data": <RIPE envelope>, "meta": {...}}
For non-cacheable upstream statuses (private → 403,
not_found → 404, transient error → 502) the cache marker is
still written and the route maps to the appropriate HTTP code
so the frontend can render a proper empty state.
Parameters
Path Parameters
msm_id*
Type
Requiredinteger
Query Parameters
refresh
Type
boolean
Default
falseResponses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Get Measurement Latest
GET
/measurements/v2/{msm_id}/latest/
Per-probe /latest results, cache-first for terminal
measurements, live-through for ongoing ones.
Decision tree:
- Look up the measurement's metadata (cache-first via the
same read-through as/measurements/v2/{id}/).
1b. Well-known (tagsystem-well-known-target) + cached →
return the hourly-refreshed cached snapshot (these are ongoing
all-probes runs we deliberately cache rather than live-fetch). - If the measurement is in a terminal status:
a. If we have cached result rows → return them.
b. Otherwise fetch RIPE, decode (DNS only), bulk-upsert,
return. - If the measurement is ongoing → fetch RIPE and return
without caching. We don't persist results that are still
streaming.
Returned shape matches RIPE's /measurements/{id}/latest/
response (a list of result rows). DNS rows additionally carry
a decoded field with the parsed abuf.
Parameters
Path Parameters
msm_id*
Type
Requiredinteger
Responses
Successful Response
application/json
JSON { "additionalProperties": "string" }
[
]
List Measurements
GET
/measurements/v2/
Local-only paginated list. Returns the same envelope shape as
the upstream RIPE /measurements/ so the existing frontend's
pagination plumbing keeps working unchanged.
Filters mirror the RIPE list endpoint's surface (search /
type / target / af / status / is_oneoff /
sort) plus builtin (probes_requested == -1 and
is_oneoff == false — a recurring measurement that runs on
every connected probe) and tag (match a measurement tag slug —
e.g. system-well-known-target for the well-known list).
type and status are aliased on the wire to avoid shadowing
Python builtins inside the function.
Parameters
Query Parameters
page
Type
integer
Default
1page_size
Type
integer
Default
100sort
Type
string
Default
"-id"search
target
af
type
status
is_oneoff
builtin
tag
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
List Types
Participation Analyse
POST
/measurements/v2/{msm_id}/participation/analyse
Queue a participation_latest job: fetch + store the full
/latest/ for an all-probes measurement. Returns immediately
with the job id; the frontend polls /participation/status and
then reads /participation/missing.
404 when the measurement is private / not found upstream; 400
when it isn't an all-probes (probes_requested == -1)
measurement; 503 when the import worker isn't running.
Parameters
Header Parameters
authorization
x-api-key
Path Parameters
msm_id*
Type
Requiredinteger
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Participation Status
GET
/measurements/v2/{msm_id}/participation/status
Most-recent participation job for this measurement + the
stored-latest snapshot freshness. Frontend polls this while a
job is queued / running; once success it reads
/participation/missing.
Parameters
Header Parameters
authorization
x-api-key
Path Parameters
msm_id*
Type
Requiredinteger
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Participation Missing
GET
/measurements/v2/{msm_id}/participation/missing
Connected-by-AF probes with no result for this all-probes
measurement. Fast local set-diff; never persisted. 400 when the
measurement isn't cached or isn't an all-probes measurement.
Parameters
Header Parameters
authorization
x-api-key
Path Parameters
msm_id*
Type
Requiredinteger
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Participation Stop
POST
/measurements/v2/{msm_id}/participation/stop
Stop this measurement's most-recent participation job
(cooperative). Logged-in — the operator who started Analyse can
abort it without an admin (the generic stop route is admin-only).
Scoped to participation_latest jobs for this msm_id so a
logged-in user can't cancel arbitrary imports. A queued job is
cancelled immediately; a running one is flagged and finishes
as stopped (partial latest preserved) within ~one
progress-flush window. Note: the cooperative checkpoint is between
store chunks, so a stop lands fast during the store phase; the
single RIPE fetch can't be interrupted mid-flight but is bounded
by the RIPE HTTP timeout. 404 when there's no participation job
for this measurement; 409 when it already finished.
Parameters
Header Parameters
authorization
x-api-key
Path Parameters
msm_id*
Type
Requiredinteger
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Measurements Latest For Probe
GET
/measurements-latest/by-probe/{prb_id}/
Cached latest results for one probe — backs the probe Stats
tab's "latest result values" panel. Newest-first; optional
?type= (ping/traceroute/dns/…). Each row carries a compact
type-aware metric (not the raw RIPE result blob). Logged-in,
matching the probe history / archive tabs. {count, results, limit, offset}.
Parameters
Header Parameters
authorization
x-api-key
Path Parameters
prb_id*
Type
Requiredinteger
Query Parameters
type
limit
Type
integer
Default
200offset
Type
integer
Default
0Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Stats
GET
/admin/measurements/stats/
Headline tiles for the admin panel: counts by status, freshness
window, type breakdown, TTL.
Hot path — cheap (estimated count + tiny marker counts + indexed
find_one + the rollup snapshot). The expensive whole-collection
figures (by_type + fresh/stale) come from the snapshot
refreshed by the daily-verify cron / the refresh endpoint below.
Parameters
Header Parameters
authorization
x-api-key
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Refresh Stats
POST
/admin/measurements/stats/refresh
Recompute the cache-overview snapshot now (DB-only, no RIPE).
Runs the two whole-collection aggregations that don't scale to a
live request and persists the singleton rollup doc. Heavy at
150M+ rows, so it's off the hot path and wrapped in
:func:run_and_record (lands in db.task_history). Returns the
freshly-written snapshot.
Parameters
Header Parameters
authorization
x-api-key
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Well Known Stats
GET
/admin/measurements/well-known/stats
Breakdown of the cached well-known measurements (tag
system-well-known-target): total + distinct targets + per-type /
per-AF / per-status / top-target splits. Index-served over the
well-known partition, so cheap on the hot path.
Parameters
Header Parameters
authorization
x-api-key
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Well Known Verify
POST
/admin/measurements/well-known/verify
Verify the cached well-known set against RIPE Atlas: fetch every
measurement tagged system-well-known-target from RIPE, compare to
the cache, and add anything missing. Returns
{found, added, existing, ids} (added = how many were missing
and have now been inserted). The RIPE call runs off the event loop.
Latest results are refreshed separately by the hourly cron.
Parameters
Header Parameters
authorization
x-api-key
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin List Imports
GET
/admin/measurements/imports/
Recent import-job rows (newest first) + worker-runtime state
(queue depth + currently-running job id) so the admin panel can
distinguish "queued but waiting" from "actively running".
Parameters
Header Parameters
authorization
x-api-key
Query Parameters
limit
Type
integer
Default
50Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Queue Import
POST
/admin/measurements/imports/
Queue a bulk-import job for an inclusive id range. The
background worker (single, sequential) picks it up from the
next queued poll; this endpoint returns immediately with
the job id so the admin panel can start polling for progress.
Parameters
Header Parameters
authorization
x-api-key
Request Body
application/json
JSON "start_id": 0, "end_id": 0, "force_refresh": false
{
}
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Get Import
GET
/admin/measurements/imports/{job_id}
Single import-job by id. Used by the admin panel's live-poll
while a job is running so the progress numbers update without
refetching the whole jobs list.
Parameters
Header Parameters
authorization
x-api-key
Path Parameters
job_id*
Type
Requiredstring
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Stop Import
POST
/admin/measurements/imports/{job_id}/stop
Stop a queued or running import job (cooperative).
A queued job is cancelled immediately (flipped straight to
stopped; the worker's claim filters on status: queued so
it never starts). A running job gets a stop_requested
flag the worker honours at its next progress-flush checkpoint
(within ~one flush window), finishing as stopped with
partial progress preserved. Already-terminal jobs are a 409.
Returns the request outcome
({ok, outcome, status?}) plus the worker snapshot so the
admin panel can refresh its busy state without a second call.
Parameters
Header Parameters
authorization
x-api-key
Path Parameters
job_id*
Type
Requiredstring
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Redecode Latest
POST
/admin/measurements/latest/redecode
Re-decode cached DNS rows from their verbatim result.
No RIPE call; pure decoder-rerun over what we already have.
Use after :mod:api.atlas.dns_decode evolves (new RR types,
bug fix) to update the decoded view across the cache.
Returns the per-call summary
({processed, succeeded, failed}) immediately. Synchronous —
for very large unscoped redecodes consider running with a
limit and chaining calls.
Parameters
Header Parameters
authorization
x-api-key
Request Body
application/json
JSON "msm_id": 0, "limit": 0
{
}
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin List Daily
GET
/admin/measurements/daily/
Newest-first day-coverage rows + worker snapshot.
since / until are inclusive YYYY-MM-DD bounds on the
row _id. The worker fields let the calendar surface the
queue-depth badge + worker-alive tripwire without a second call.
Parameters
Header Parameters
authorization
x-api-key
Query Parameters
since
until
limit
Type
integer
Default
400Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Verify Range
POST
/admin/measurements/daily/verify-range
Queue a background verify_range job over a date window.
Each day costs one paced RIPE count call; a year is ~365 of
them, so this is a worker job (not synchronous) — the calendar
updates as days settle. Range size is capped server-side.
Parameters
Header Parameters
authorization
x-api-key
Request Body
application/json
JSON "since": "string", "until": "string"
{
}
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Fill Days
POST
/admin/measurements/daily/fill
Queue a date_day job per date (gap-fill — no reprocess
seal). The calendar's per-month / per-year Fill emits a date
list; we queue one job apiece. Idempotent: cache upserts dedup,
so re-filling an already-covered day is cheap.
Parameters
Header Parameters
authorization
x-api-key
Request Body
application/json
JSON "dates": [ "string" ]
{
}
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Recover Stale
POST
/admin/measurements/daily/recover-stale
Requeue jobs stuck in running from a dead worker.
The job queue is DB-durable (a restart re-claims queued
rows), but a worker that crashed mid-job leaves a running
row nothing re-claims. Same recovery runs automatically at
worker startup; this covers the worker-died-mid-life case.
Parameters
Header Parameters
authorization
x-api-key
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Get Daily
GET
/admin/measurements/daily/{date}/
Single day-coverage row. 404 when the day was never verified
(the calendar renders that as unverified).
Parameters
Header Parameters
authorization
x-api-key
Path Parameters
date*
Type
Requiredstring
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Verify Day
POST
/admin/measurements/daily/{date}/verify
Recompute coverage for one UTC day synchronously.
One RIPE count call + one Mongo count — fast. 400 on a malformed
date; 502 when RIPE is unreachable (we deliberately don't persist
a bogus row, so the last-known-good coverage stays); 500 with a
descriptive detail on any other failure (Mongo timeout, stats
compute bug, etc.) so the operator sees the real reason in the
admin banner instead of a bare "status 500".
Parameters
Header Parameters
authorization
x-api-key
Path Parameters
date*
Type
Requiredstring
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Reprocess Day
POST
/admin/measurements/daily/{date}/reprocess
Force a full re-fetch of one UTC day from RIPE.
Distinct from verify (recompute-only): flips the day to
queued + reprocess_pending, then enqueues a date_day
job that walks the day's measurement list and upserts each. On
completion the post-run verify seals the day with
reprocessed_at once it reaches 100%. Use when measurements
landed at RIPE after our cron window and were never cached.
Parameters
Header Parameters
authorization
x-api-key
Path Parameters
date*
Type
Requiredstring
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Recompute Day Stats
POST
/admin/measurements/daily/{date}/recompute-stats
Re-derive the day's stats block from cached measurements.
DB-only (no RIPE) — recomputes distributions for the
start-cohort and rewrites stats / stats_recomputed_at on
the daily-coverage row in place. Wrapped in
:func:run_and_record so it also lands in db.task_history.
400 when the day has no coverage row yet (verify it first) or on
a bad date.
Parameters
Header Parameters
authorization
x-api-key
Path Parameters
date*
Type
Requiredstring
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Recompute Day Stats Range
POST
/admin/measurements/daily/recompute-stats-range
Bulk-rebuild the stats block across a date window.
Loops :meth:MeasurementsMeta.recompute_day_stats; days with no
coverage row are reported as skipped rather than aborting.
DB-only, capped, wrapped in :func:run_and_record.
Parameters
Header Parameters
authorization
x-api-key
Request Body
application/json
JSON "since": "string", "until": "string"
{
}
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Measurements Stats Coverage
GET
/admin/measurements/daily/stats-coverage
Per-class daily-stats coverage over the retained window.
Pure read — one indexed _id-range scan, no recompute. Returns
the :meth:MeasurementsMeta.stats_coverage blob
(schema_version + counts of
missing/stale_schema/stale_data/current +
stale_dates). 400 on a bad / inverted range.
Parameters
Header Parameters
authorization
x-api-key
Query Parameters
since
inclusive start, YYYY-MM-DD
until
inclusive end, YYYY-MM-DD
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Admin Measurements Backfill Stale Stats
POST
/admin/measurements/daily/backfill-stale-stats
Force an immediate newest-first recompute of stale daily-stats.
The on-demand burst counterpart to the drain cron — use right
after a deliberate STATS_SCHEMA_VERSION bump to converge now
rather than waiting for the cron to grind through. DB-only,
idempotent, bounded (max_days server-clamped). Wrapped in
:func:run_and_record so it lands in db.task_history.
Parameters
Header Parameters
authorization
x-api-key
Request Body
application/json
JSON "max_days": 1000
{
}
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Measurements Daily Series
GET
/measurements/v2/daily/series/
Daily-coverage rows (incl. stats) in an inclusive window,
oldest-first — the public trends-view fetch (mirrors
/probes-archive/series/; aggregate counts over public RIPE
metadata, no auth gate). 400 on a bad / inverted / over-cap
range.
Parameters
Query Parameters
since*
Type
Requiredstring
until*
Type
Requiredstring
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
List Anchor Measurements
GET
/anchor-measurements/
Paginated catalog list. All filters AND-compose. Hides
tombstoned rows by default (admin can see them via the admin
listing if needed).
Parameters
Query Parameters
anchor_id
measurement_id
type
is_mesh
search
limit
Type
integer
Default
100offset
Type
integer
Default
0Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
List For Anchor
GET
/anchor-measurements/by-anchor/{anchor_id}/
All measurements pinned to a specific anchor — typically 5–10
rows. Drives the AnchorDetailView "Measurements" tab. Each row
carries measurement_status_id / measurement_status_name /
measurement_last_result_time from a $lookup against
db.measurements_meta so the rendered list shows live status
without a second round-trip.
Parameters
Path Parameters
anchor_id*
Type
Requiredinteger
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Get Admin Stats
GET
/anchor-measurements/admin/stats/
Combined run-stats + collection-stats blob for the admin panel.
Both sub-queries run in parallel worker threads via
:func:asyncio.to_thread so the FastAPI event loop stays
responsive — without it the sequential synchronous PyMongo
round-trips could overrun the 15 s client timeout on a slow
Mongo. See the matching anchors-mesh-health/admin/stats/
endpoint for the full rationale.
Parameters
Header Parameters
authorization
x-api-key
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
List Admin Runs
Run Refresh
POST
/anchor-measurements/admin/refresh/run
Cookie-auth manual refresh trigger. Same operation as the
api-key-gated POST /atlas/anchor-measurements/refresh/ in
api/main.py — duplicated here so the admin panel's
"Run refresh now" button can fire it via the operator's
session cookie without needing an API key. Wrapped in
:func:run_and_record so the run lands in db.task_history
alongside the scheduled ones.
Parameters
Header Parameters
authorization
x-api-key
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Clear Collection
POST
/anchor-measurements/admin/clear/
Wipe db.anchor_measurements.
Destructive — the next refresh tick repopulates from RIPE.
db.task_history is not touched. Requires confirm: true
in the body.
Parameters
Header Parameters
authorization
x-api-key
Request Body
application/json
JSON "confirm": false
{
}
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Get Anchor Measurement
List Measurements Probes
GET
/measurements-probes/
Paginated participation catalog. Either or both of
measurement_id / probe_id narrow the result set. Hides
tombstoned pairs by default.
Parameters
Query Parameters
measurement_id
probe_id
limit
Type
integer
Default
100offset
Type
integer
Default
0Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
List For Measurement
GET
/measurements-probes/by-measurement/{measurement_id}/
Every probe currently participating in one measurement.
Default limit is generous (1000) — mesh measurements run
~700 anchors and the typical caller wants the full list in one
response. Bump offset for pagination if the call ever exceeds
the cap.
Parameters
Path Parameters
measurement_id*
Type
Requiredinteger
Query Parameters
limit
Type
integer
Default
1000offset
Type
integer
Default
0Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
List For Probe
GET
/measurements-probes/by-probe/{probe_id}/
Every measurement one probe currently participates in. Reverse
of the per-measurement lookup — useful for probe-detail drill-downs.
Parameters
Path Parameters
probe_id*
Type
Requiredinteger
Query Parameters
limit
Type
integer
Default
1000offset
Type
integer
Default
0Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Get Admin Stats
GET
/measurements-probes/admin/stats/
Combined run-stats + collection-stats blob for the admin panel.
Both sub-queries run in parallel worker threads via
:func:asyncio.to_thread so the FastAPI event loop stays
responsive — see the matching anchors-mesh-health admin/stats
endpoint for the round-trip-consolidation rationale.
Parameters
Header Parameters
authorization
x-api-key
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
List Admin Runs
Run Refresh
POST
/measurements-probes/admin/refresh/run
Cookie-auth manual refresh trigger.
Fire-and-forget — mirrors the shape of the api-key-gated
POST /atlas/measurements-probes/refresh/ so reverse-proxy
timeouts can't cut the refresh mid-walk. The work runs in a
background thread under :func:run_and_record and the eventual
summary lands in db.task_history; the admin panel polls
GET /admin/runs/ for completion.
Returns one of two shapes:
{"status": "started", ...}— the run was spawned.{"status": "already_running", ...}— another refresh is in
flight in this process; nothing was spawned.
Parameters
Header Parameters
authorization
x-api-key
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Clear Collection
POST
/measurements-probes/admin/clear/
Wipe db.measurements_probes. Destructive — the next refresh
tick rebuilds from RIPE. Requires confirm: true.
Parameters
Header Parameters
authorization
x-api-key
Request Body
application/json
JSON "confirm": false
{
}
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Get Pair
Get Latest Speed
Refresh Anchor Measurements
POST
/atlas/anchor-measurements/refresh/
Pull RIPE's anchor-measurement catalog and reconcile
db.anchor_measurements now.
Synchronous from the caller's perspective (~10 s for ~10k rows).
Used as a bootstrap on a fresh deploy + as the manual recovery
handle when the 6-hourly job fails. Returns the summary dict
from :meth:AnchorMeasurements.refresh_all.
Routed through :func:run_and_record so this manual run lands
in db.task_history alongside the scheduled ones,
distinguishable by the trigger="manual" field.
Authorizations
APIKeyQuery
Type
API Key (query: api-key)
or
APIKeyHeader
Type
API Key (header: x-api-key)
Responses
Successful Response
application/json
JSON
[
]
Refresh Measurements Probes
POST
/atlas/measurements-probes/refresh/
Kick a fresh db.measurements_probes refresh and return
immediately.
Fire-and-forget by design — the refresh walks every live anchor
measurement with one RIPE round-trip each (5–10 min even with the
8-way concurrency inside :meth:MeasurementsProbes.refresh_all),
which is well past any reverse-proxy timeout. The work runs in
a background thread under :func:run_and_record, so the eventual
success / failure / counters land in db.task_history and can
be polled via GET /measurements-probes/admin/runs/.
Returns one of two shapes:
{"status": "started", ...}— the run was spawned.{"status": "already_running", ...}— another refresh is in
flight in this process; nothing was spawned. Operator should
wait for the in-flight run to finish and poll the runs endpoint.
Authorizations
APIKeyQuery
Type
API Key (query: api-key)
or
APIKeyHeader
Type
API Key (header: x-api-key)
Responses
Successful Response
application/json
JSON
[
]
Import New Measurements
POST
/atlas/measurements/import-new/
Pull newly-created RIPE measurements (id > local watermark) now.
Manual companion to the 15-minute import_new_measurements
cron — bootstrap on a fresh deploy (the next cron tick can be
up to 15 min away), or trigger immediately after restoring
from a backup. Per-tick cap from
:attr:MeasurementsMetaSettings.SCHEDULED_TICK_MAX still
applies; re-run for further catch-up after a long gap.
Authorizations
APIKeyQuery
Type
API Key (query: api-key)
or
APIKeyHeader
Type
API Key (header: x-api-key)
Responses
Successful Response
application/json
JSON
[
]
Refresh Oneoff Measurements
POST
/atlas/measurements/refresh-oneoffs/
Sweep cached one-off measurements still in Scheduled (1) or
Ongoing (2) and force-refresh them from RIPE now.
Manual companion to the 15-minute refresh_oneoff_measurements
cron. Bounded by limit (default
:attr:MeasurementsMetaSettings.ONEOFF_REFRESH_TICK_MAX); re-run
for further catch-up when a backlog is bigger than one tick can
drain. Routed through :func:run_and_record so the run lands
in db.task_history alongside the scheduled ones.
Authorizations
APIKeyQuery
Type
API Key (query: api-key)
or
APIKeyHeader
Type
API Key (header: x-api-key)
Parameters
Query Parameters
limit
Responses
Successful Response
application/json
JSON
[
]
Refresh Periodic Measurements
POST
/atlas/measurements/refresh-periodics/
Sweep cached recurring measurements still in Scheduled (1)
and force-refresh them from RIPE now.
Manual companion to the 15-minute
refresh_periodic_measurements cron. Bounded by limit
(default :attr:MeasurementsMetaSettings.ONEOFF_REFRESH_TICK_MAX,
reused across both sweeps — same operational characteristics);
re-run for further catch-up when a backlog is bigger than one
tick can drain. Routed through :func:run_and_record so the
run lands in db.task_history alongside the scheduled ones.
Authorizations
APIKeyQuery
Type
API Key (query: api-key)
or
APIKeyHeader
Type
API Key (header: x-api-key)
Parameters
Query Parameters
limit
Responses
Successful Response
application/json
JSON
[
]