Skip to content

measurements ​

51 endpoints at a glance
MethodPathSummary
GET/admin/measurements/daily/Admin List Daily
GET/admin/measurements/daily/{date}/Admin Get Daily
POST/admin/measurements/daily/{date}/recompute-statsAdmin Recompute Day Stats
POST/admin/measurements/daily/{date}/reprocessAdmin Reprocess Day
POST/admin/measurements/daily/{date}/verifyAdmin Verify Day
POST/admin/measurements/daily/backfill-stale-statsAdmin Measurements Backfill Stale Stats
POST/admin/measurements/daily/fillAdmin Fill Days
POST/admin/measurements/daily/recompute-stats-rangeAdmin Recompute Day Stats Range
POST/admin/measurements/daily/recover-staleAdmin Recover Stale
GET/admin/measurements/daily/stats-coverageAdmin Measurements Stats Coverage
POST/admin/measurements/daily/verify-rangeAdmin 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}/stopAdmin Stop Import
POST/admin/measurements/latest/redecodeAdmin Redecode Latest
GET/admin/measurements/stats/Admin Stats
POST/admin/measurements/stats/refreshAdmin Refresh Stats
GET/admin/measurements/well-known/statsWell Known Stats
POST/admin/measurements/well-known/verifyWell 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/runRun 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/runRun 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/analyseParticipation Analyse
GET/measurements/v2/{msm_id}/participation/missingParticipation Missing
GET/measurements/v2/{msm_id}/participation/statusParticipation Status
POST/measurements/v2/{msm_id}/participation/stopParticipation Stop
GET/measurements/v2/daily/series/Measurements Daily Series
GET/measurements/v2/types/List Types
GET/trends/hbase/Get Latest Speed

measurements​

Retrieve information about RIPE Atlas measurements


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
integer
Required

Query Parameters

refresh
Type
boolean
Default
false

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Variables
Key
Value

Samples​


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:

  1. Look up the measurement's metadata (cache-first via the
    same read-through as /measurements/v2/{id}/).
    1b. Well-known (tag system-well-known-target) + cached →
    return the hourly-refreshed cached snapshot (these are ongoing
    all-probes runs we deliberately cache rather than live-fetch).
  2. 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.
  3. 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
integer
Required

Responses​

Successful Response

application/json
JSON
[
  
{
  
  
"additionalProperties": "string"
  
}
]

Playground​

Variables
Key
Value

Samples​


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
1
page_size
Type
integer
Default
100
sort
Type
string
Default
"-id"
search
target
af
type
status
is_oneoff
builtin
tag

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Variables
Key
Value

Samples​


List Types​

GET
/measurements/v2/types/

Distinct data.type values across cached rows. Powers the
type-filter dropdown in the list view.

Responses​

Successful Response

application/json
JSON
[
  
"string"
]

Playground​

Samples​


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
integer
Required

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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
integer
Required

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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
integer
Required

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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
integer
Required

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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
integer
Required

Query Parameters

type
limit
Type
integer
Default
200
offset
Type
integer
Default
0

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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"
}

Playground​

Headers

Samples​


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"
}

Playground​

Headers

Samples​


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"
}

Playground​

Headers

Samples​


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"
}

Playground​

Headers

Samples​


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
50

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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"
}

Playground​

Headers
Body

Samples​


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
string
Required

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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
string
Required

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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"
}

Playground​

Headers
Body

Samples​


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
400

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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"
}

Playground​

Headers
Body

Samples​


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"
}

Playground​

Headers
Body

Samples​


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"
}

Playground​

Headers

Samples​


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
string
Required

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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
string
Required

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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
string
Required

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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
string
Required

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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"
}

Playground​

Headers
Body

Samples​


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"
}

Playground​

Headers
Variables
Key
Value

Samples​


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"
}

Playground​

Headers
Body

Samples​


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
string
Required
until*
Type
string
Required

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Variables
Key
Value

Samples​


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
100
offset
Type
integer
Default
0

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Variables
Key
Value

Samples​


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
integer
Required

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Variables
Key
Value

Samples​


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"
}

Playground​

Headers

Samples​


List Admin Runs​

GET
/anchor-measurements/admin/runs/

Last N task_history rows for the refresh task.

Parameters​

Header Parameters

authorization
x-api-key

Query Parameters

limit
Type
integer
Default
50

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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"
}

Playground​

Headers

Samples​


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"
}

Playground​

Headers
Body

Samples​


Get Anchor Measurement​

GET
/anchor-measurements/{am_id}/

Parameters​

Path Parameters

am_id*
Type
integer
Required

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Variables
Key
Value

Samples​


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
100
offset
Type
integer
Default
0

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Variables
Key
Value

Samples​


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
integer
Required

Query Parameters

limit
Type
integer
Default
1000
offset
Type
integer
Default
0

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Variables
Key
Value

Samples​


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
integer
Required

Query Parameters

limit
Type
integer
Default
1000
offset
Type
integer
Default
0

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Variables
Key
Value

Samples​


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"
}

Playground​

Headers

Samples​


List Admin Runs​

GET
/measurements-probes/admin/runs/

Last N task_history rows for the refresh task.

Parameters​

Header Parameters

authorization
x-api-key

Query Parameters

limit
Type
integer
Default
50

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Headers
Variables
Key
Value

Samples​


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"
}

Playground​

Headers

Samples​


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"
}

Playground​

Headers
Body

Samples​


Get Pair​

GET
/measurements-probes/{measurement_id}/{probe_id}/

Parameters​

Path Parameters

measurement_id*
Type
integer
Required
probe_id*
Type
integer
Required

Responses​

Successful Response

application/json
JSON
{
  
"additionalProperties": "string"
}

Playground​

Variables
Key
Value

Samples​


Get Latest Speed​

GET
/trends/hbase/

Successful Response

application/json
JSON
[
]

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
[
]

Playground​

Authorization

Samples​


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
[
]

Playground​

Authorization

Samples​


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
[
]

Playground​

Authorization

Samples​


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
[
]

Playground​

Authorization
Variables
Key
Value

Samples​


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
[
]

Playground​

Authorization
Variables
Key
Value

Samples​


Atlas — built on RIPE Atlas data.