Skip to content

events ​

43 endpoints at a glance
MethodPathSummary
POST/atlas/events/connections/refresh/Refresh Events Connections
GET/events/Get Events
GET/events/buckets/Get Event Buckets
POST/events/connections/backfillSubmit Backfill
POST/events/connections/backfill/recover-staleRecover Stale Backfill
GET/events/connections/backfill/statusGet Backfill Status
GET/events/connections/by-probe/{prb_id}/Connectivity For Probe
GET/events/connections/by-probe/{prb_id}/recent/Recent Connections For Probe
GET/events/connections/daily/List Daily
GET/events/connections/daily/{date}/Get Daily
POST/events/connections/daily/{date}/recompute-statsRecompute Daily Stats
POST/events/connections/daily/{date}/reprocessReprocess Daily
POST/events/connections/daily/{date}/verifyVerify Daily
POST/events/connections/daily/backfill-stale-statsBackfill Stale Daily Stats
POST/events/connections/daily/recompute-stats-rangeRecompute Daily Stats Range
GET/events/connections/daily/stats-coverageDaily Stats Coverage
POST/events/connections/daily/verify-rangeVerify Daily Range
GET/events/connections/imports/List Imports
GET/events/connections/imports/{import_id}/Get Import
POST/events/connections/imports/{import_id}/stopStop Import
GET/events/connections/missed-disconnectsGet Missed Disconnects
GET/events/connections/series/Get Connections Series
GET/events/connections/stats/Get Stats
POST/events/uptimes/backfillSubmit Backfill
POST/events/uptimes/backfill/recover-staleRecover Stale Backfill
GET/events/uptimes/backfill/statusGet Backfill Status
POST/events/uptimes/backfill/stop-allStop All Backfills
GET/events/uptimes/daily/List Daily
GET/events/uptimes/daily/{date}/Get Daily
POST/events/uptimes/daily/{date}/recompute-statsRecompute Daily Stats
POST/events/uptimes/daily/{date}/reprocessReprocess Daily
POST/events/uptimes/daily/{date}/verifyVerify Daily
POST/events/uptimes/daily/backfill-stale-statsBackfill Stale Daily Stats
POST/events/uptimes/daily/recompute-stats-rangeRecompute Daily Stats Range
GET/events/uptimes/daily/stats-coverageDaily Stats Coverage
POST/events/uptimes/daily/verify-rangeVerify Daily Range
GET/events/uptimes/imports/List Imports
GET/events/uptimes/imports/{import_id}/Get Import
POST/events/uptimes/imports/{import_id}/stopStop Import
POST/events/uptimes/purge-resyncsPurge Bogus Resyncs
GET/events/uptimes/purge-resyncs/statusPurge Resyncs Status
GET/events/uptimes/series/Get Uptimes Series
GET/events/uptimes/stats/Get Stats

events​


Get Events​

GET
/events/

Filtered list of connection events — Mongo-backed.

Replaces the legacy CouchDB-backed implementation; same wire
surface (filter set + envelope shape) but per-row shape is now
flat (no data wrapper) — that's how events are stored in
db.events_connections.

See :meth:EventsConnections.list_filtered for the mode-by-mode
behaviour (delta / count_only / explain).

Parameters​

Query Parameters

minutes
Type
integer
Default
60
start
stop
type
controller
probe_id
delta
count_only
explain

Responses​

Successful Response

application/json
JSON
[
]

Playground​

Variables
Key
Value

Samples​


Get Event Buckets​

GET
/events/buckets/

Per-bucket connect/disconnect counts for charting.

Server-side aggregation — bypasses the 25 000-row cap on the
raw-events surface, which truncated wide time windows to just
their most-recent tail. The aggregation runs $group over
the indexed timestamp field; result size is bounded by the
bucket count (typically ~24, low hundreds at worst), not by
the event count.

Wrapped in :func:asyncio.to_thread because the PyMongo
aggregation is a blocking call — without the thread shim the
FastAPI event loop would stall for the duration of every wide-
window query and queue all other requests behind it. The
aggregation itself has a 120 s maxTimeMS ceiling
(see :meth:EventsConnections.list_buckets).

Returns {count, time, query, bucket_seconds, results} where
each results entry is {start, connect, disconnect},
oldest-first. Empty buckets aren't emitted — the frontend pads
them client-side if a flat axis is wanted.

Parameters​

Query Parameters

bucket_seconds
Type
integer
Default
300
minutes
Type
integer
Default
60
start
stop
type
controller
probe_id

Responses​

Successful Response

application/json
JSON
[
]

Playground​

Variables
Key
Value

Samples​


Get Connections Series​

GET
/events/connections/series/

Public daily-stats series for the connection-events trends view.

Daily-coverage rows (incl. the per-day stats block) in an
inclusive YYYY-MM-DD window, oldest-first. No auth gate — same
posture as /events/buckets/ and the measurements-meta /
probe-archive series: aggregate counts over public RIPE info.

Lives on the public events router (prefix /events) rather than
the admin /events/connections router; the path does not
collide with that router's /daily/{date}/ (different segment
after the shared prefix). 400 on a bad / inverted / over-cap
range.

Wrapped in :func:asyncio.to_thread because the underlying
PyMongo range scan is a blocking call.

Parameters​

Query Parameters

since*
Type
string
Required
until*
Type
string
Required

Responses​

Successful Response

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

Playground​

Variables
Key
Value

Samples​


Get Missed Disconnects​

GET
/events/connections/missed-disconnects

Missed-disconnect detection + breakdown for an inclusive
YYYY-MM-DD window.

A missed disconnect is a session whose closing disconnect RIPE
never delivered (two connect events in a row for one probe).
Returns totals + per-controller / country / ASN / probe-type /
controller-handoff rankings (each with a rate) + a sample of
occurrences — see
:meth:EventsConnections.missed_disconnects_report.

Staff-gated (a multi-day scan can be heavy) and wrapped in
asyncio.to_thread. 400 on a bad / inverted / over-cap range.

Parameters​

Header Parameters

authorization
x-api-key

Query Parameters

since*
Type
string
Required
until*
Type
string
Required
top_n
Type
integer
Default
25

Responses​

Successful Response

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

Playground​

Headers
Variables
Key
Value

Samples​


Get Uptimes Series​

GET
/events/uptimes/series/

Public daily-stats series for the probe-uptime trends view.

Daily-coverage rows (incl. the per-day stats block) of
db.events_uptimes_daily in an inclusive YYYY-MM-DD window,
oldest-first. No auth gate — same posture as the connection-events
series (aggregate counts over public RIPE info).

Lives on the public events router (prefix /events) rather than
the admin /events/uptimes router; the path doesn't collide with
that router's /daily/{date}/ (different segment after the shared
prefix). 400 on a bad / inverted / over-cap range.

Wrapped in :func:asyncio.to_thread because the underlying PyMongo
range scan is a blocking call.

Parameters​

Query Parameters

since*
Type
string
Required
until*
Type
string
Required

Responses​

Successful Response

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

Playground​

Variables
Key
Value

Samples​


Connectivity For Probe​

GET
/events/connections/by-probe/{prb_id}/

Per-probe connect/disconnect rollup for the probe Stats tab —
uptime %, flap count, longest continuous uptime, MTBF, current
state, plus a capped newest-first event list for the timeline.

Logged-in (matches the probe history / archive tabs; the rest of
this router is admin-only). since / until are unix-seconds
bounds on event timestamp; since defaults to 90 days back so a
no-arg call can't unbounded-scan a chatty probe.

Parameters​

Header Parameters

authorization
x-api-key

Path Parameters

prb_id*
Type
integer
Required

Query Parameters

since
until

Responses​

Successful Response

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

Playground​

Headers
Variables
Key
Value

Samples​


Recent Connections For Probe​

GET
/events/connections/by-probe/{prb_id}/recent/

Latest limit (default 25) connect/disconnect events for one
probe plus a per-family IPv4/IPv6 connection prefix+ASN change
rollup — feeds the probe-detail "Connections" tab. Logged-in (same
gate as the by-probe Stats rollup above).

Parameters​

Header Parameters

authorization
x-api-key

Path Parameters

prb_id*
Type
integer
Required

Query Parameters

limit
Type
integer
Maximum
100
Minimum
1
Default
25

Responses​

Successful Response

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

Playground​

Headers
Variables
Key
Value

Samples​


Get Stats​

GET
/events/connections/stats/

Header tiles for the admin panel — total events, last 24h
count, latest event/stored timestamps, last successful import
row, plus the worker queue snapshot + liveness.

Parameters​

Header Parameters

authorization
x-api-key

Responses​

Successful Response

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

Playground​

Headers

Samples​


List Imports​

GET
/events/connections/imports/

Newest-first list of import-run rows. since / until are
inclusive YYYY-MM-DD bounds on started_at; trigger
narrows to a single class of run (scheduled / manual / backfill).

Parameters​

Header Parameters

authorization
x-api-key

Query Parameters

since
until
trigger
limit
Type
integer
Default
100

Responses​

Successful Response

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

Playground​

Headers
Variables
Key
Value

Samples​


Get Import​

GET
/events/connections/imports/{import_id}/

Single import-run row including counts + error if any.
import_id is the <trigger>_<started_ts> we generated at
submission time.

Parameters​

Header Parameters

authorization
x-api-key

Path Parameters

import_id*
Type
string
Required

Responses​

Successful Response

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

Playground​

Headers
Variables
Key
Value

Samples​


Stop Import​

POST
/events/connections/imports/{import_id}/stop

Stop a running import (cooperative).

Events-connections writes no queued DB row, so only
running imports are stoppable: the flag is honoured at
import_window's next per-chunk checkpoint, finishing the row
as stopped with partial counts preserved. Already-terminal /
missing → 409 / 404.

Parameters​

Header Parameters

authorization
x-api-key

Path Parameters

import_id*
Type
string
Required

Responses​

Successful Response

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

Playground​

Headers
Variables
Key
Value

Samples​


List Daily​

GET
/events/connections/daily/

Newest-first list of daily-coverage rows.

Optional since / until are inclusive YYYY-MM-DD bounds
on the row's _id. limit is clamped to 1000 by the storage
layer.

lite=true projects away the heavy scan_gaps list — useful
for the whole-year calendar fetch where only status + counts
are rendered per cell. The full gap detail loads on demand when
the operator drills into a specific day via GET /daily/{date}/.

Parameters​

Header Parameters

authorization
x-api-key

Query Parameters

since
until
limit
Type
integer
Default
100
lite
Type
boolean
Default
false

Responses​

Successful Response

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

Playground​

Headers
Variables
Key
Value

Samples​


Get Daily​

GET
/events/connections/daily/{date}/

Single daily-coverage row including the full scan_gaps list.

Returns 404 when no row exists for the date — the calendar should
treat that as unverified and offer a POST /verify button.

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​


Verify Daily​

POST
/events/connections/daily/{date}/verify

Recompute coverage for one UTC day and upsert the daily row.

No RIPE call — reads only db.events_connections_imports and
db.events_connections. Returns the freshly-written row.

Wrapped in asyncio.to_thread because the verify aggregation
is synchronous Mongo; without the shim the FastAPI event loop
would stall briefly.

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​


Reprocess Daily​

POST
/events/connections/daily/{date}/reprocess

Force a full re-fetch of one UTC day from RIPE.

Distinct from /verify (which only recomputes coverage from
data already on file): this queues a backfill spanning the
entire [day_start, day_start + 86_400) window regardless of
current coverage. The intended use is "events for this day
arrived late at RIPE" — a verify alone can't fix that because
the data was never imported; only a re-fetch can.

Flow:

  1. Mark the daily row queued + reprocess_pending so the
    calendar reflects the request immediately.
  2. Enqueue the full-day window on the events backfill worker.
  3. When the worker's import completes, the end-of-run
    re-verify hook recomputes coverage and — because
    reprocess_pending is set — seals the day with
    reprocessed_at once it hits 100%. After that the day is
    done; no further reprocess is needed.

Returns the queued daily row plus the worker snapshot.

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​


Verify Daily Range​

POST
/events/connections/daily/verify-range

Re-verify every date in a window.

No RIPE call. Loops :meth:EventsConnections.verify_day across
the range; dates that error are recorded individually rather
than aborting the bulk run. Returns
{verified, errors, count, since, until}.

Synchronous on purpose — per-date verify is ~tens of ms, and the
:attr:EventsConnections.VERIFY_RANGE_MAX_DAYS cap keeps the
worst-case request inside the standard HTTP timeout. Operators
wanting a wider rebuild chunk the submission.

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​


Recompute Daily Stats​

POST
/events/connections/daily/{date}/recompute-stats

Re-derive the day's stats block from cached events.

DB-only (no RIPE) — recomputes the distributions for the UTC-day
event cohort and rewrites stats / stats_recomputed_at on
the daily-coverage row in place. 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​


Recompute Daily Stats Range​

POST
/events/connections/daily/recompute-stats-range

Bulk-rebuild the stats block across a date window.

Loops :meth:EventsConnections.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​


Daily Stats Coverage​

GET
/events/connections/daily/stats-coverage

Per-class daily-stats coverage over the retained window.

Pure read — one indexed _id-range scan, no recompute. Returns
the :meth:EventsConnections.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​


Backfill Stale Daily Stats​

POST
/events/connections/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​


Submit Backfill​

POST
/events/connections/backfill

Queue a backfill job. Returns immediately; the worker walks
the queue serially. Range validation is done up front so a typo
gets a 400 instead of disappearing into the worker.

Composite-key dedup (_id = "<prb_id>:<timestamp>:<event[0]>")
means re-running over a range you already covered is safe — the
upserts hit existing docs and become no-op writes.

Parameters​

Header Parameters

authorization
x-api-key

Request Body​

application/json
JSON
{
  
"start_ts": 0,
  
"stop_ts": 0
}

Responses​

Successful Response

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

Playground​

Headers
Body

Samples​


Get Backfill Status​

GET
/events/connections/backfill/status

Worker queue snapshot + liveness. All three fields are best-
effort; the dashboard polls this at 5s while a backfill is
running.

Parameters​

Header Parameters

authorization
x-api-key

Responses​

Successful Response

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

Playground​

Headers

Samples​


Recover Stale Backfill​

POST
/events/connections/backfill/recover-stale

Re-enqueue any imports stuck in running state.

These rows are orphaned by a previous process: the worker that
wrote them died (typically a backend restart) before flipping
them to success / failed. Recovery marks each orphan
failed (with a "worker died mid-import; re-enqueued" note,
so the import-history table reflects the death honestly) and
re-enqueues the same (scan_start_ts, scan_stop_ts) window
for the live worker.

The same recovery runs automatically at worker startup; this
endpoint covers the rarer follow-up case where the worker task
died mid-life but the backend kept running, leaving the queue
stranded.

Safe to call any time. :meth:EventsConnections.import_window
is idempotent (composite-_id upserts), so re-running over a
range the orphan already partly imported just lands the
remainder.

Parameters​

Header Parameters

authorization
x-api-key

Responses​

Successful Response

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

Playground​

Headers

Samples​


Get Stats​

GET
/events/uptimes/stats/

Header tiles for the admin panel — total events, last 24h
count, latest event/stored timestamps, last successful import
row, plus the worker queue snapshot + liveness.

Parameters​

Header Parameters

authorization
x-api-key

Responses​

Successful Response

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

Playground​

Headers

Samples​


List Imports​

GET
/events/uptimes/imports/

Newest-first list of import-run rows. since / until are
inclusive YYYY-MM-DD bounds on started_at; trigger
narrows to a single class of run (scheduled / manual / backfill).

Parameters​

Header Parameters

authorization
x-api-key

Query Parameters

since
until
trigger
limit
Type
integer
Default
100

Responses​

Successful Response

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

Playground​

Headers
Variables
Key
Value

Samples​


Get Import​

GET
/events/uptimes/imports/{import_id}/

Single import-run row including counts + error if any.
import_id is the <trigger>_<started_ts> we generated at
submission time.

Parameters​

Header Parameters

authorization
x-api-key

Path Parameters

import_id*
Type
string
Required

Responses​

Successful Response

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

Playground​

Headers
Variables
Key
Value

Samples​


Stop Import​

POST
/events/uptimes/imports/{import_id}/stop

Stop a running import (cooperative).

Events-connections writes no queued DB row, so only
running imports are stoppable: the flag is honoured at
import_window's next per-chunk checkpoint, finishing the row
as stopped with partial counts preserved. Already-terminal /
missing → 409 / 404.

Parameters​

Header Parameters

authorization
x-api-key

Path Parameters

import_id*
Type
string
Required

Responses​

Successful Response

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

Playground​

Headers
Variables
Key
Value

Samples​


List Daily​

GET
/events/uptimes/daily/

Newest-first list of daily-coverage rows.

Optional since / until are inclusive YYYY-MM-DD bounds
on the row's _id. limit is clamped to 1000 by the storage
layer.

lite=true projects away the heavy scan_gaps list — useful
for the whole-year calendar fetch where only status + counts
are rendered per cell. The full gap detail loads on demand when
the operator drills into a specific day via GET /daily/{date}/.

Parameters​

Header Parameters

authorization
x-api-key

Query Parameters

since
until
limit
Type
integer
Default
100
lite
Type
boolean
Default
false

Responses​

Successful Response

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

Playground​

Headers
Variables
Key
Value

Samples​


Get Daily​

GET
/events/uptimes/daily/{date}/

Single daily-coverage row including the full scan_gaps list.

Returns 404 when no row exists for the date — the calendar should
treat that as unverified and offer a POST /verify button.

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​


Verify Daily​

POST
/events/uptimes/daily/{date}/verify

Recompute coverage for one UTC day and upsert the daily row.

No RIPE call — reads only db.events_uptimes_imports and
db.events_uptimes. Returns the freshly-written row.

Wrapped in asyncio.to_thread because the verify aggregation
is synchronous Mongo; without the shim the FastAPI event loop
would stall briefly.

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​


Reprocess Daily​

POST
/events/uptimes/daily/{date}/reprocess

Force a full re-fetch of one UTC day from RIPE.

Distinct from /verify (which only recomputes coverage from
data already on file): this queues a backfill spanning the
entire [day_start, day_start + 86_400) window regardless of
current coverage. The intended use is "events for this day
arrived late at RIPE" — a verify alone can't fix that because
the data was never imported; only a re-fetch can.

Flow:

  1. Mark the daily row queued + reprocess_pending so the
    calendar reflects the request immediately.
  2. Enqueue the full-day window on the events backfill worker.
  3. When the worker's import completes, the end-of-run
    re-verify hook recomputes coverage and — because
    reprocess_pending is set — seals the day with
    reprocessed_at once it hits 100%. After that the day is
    done; no further reprocess is needed.

Returns the queued daily row plus the worker snapshot.

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​


Verify Daily Range​

POST
/events/uptimes/daily/verify-range

Re-verify every date in a window.

No RIPE call. Loops :meth:EventsUptimes.verify_day across
the range; dates that error are recorded individually rather
than aborting the bulk run. Returns
{verified, errors, count, since, until}.

Synchronous on purpose — per-date verify is ~tens of ms, and the
:attr:EventsUptimes.VERIFY_RANGE_MAX_DAYS cap keeps the
worst-case request inside the standard HTTP timeout. Operators
wanting a wider rebuild chunk the submission.

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​


Recompute Daily Stats​

POST
/events/uptimes/daily/{date}/recompute-stats

Re-derive the day's stats block from cached events.

DB-only (no RIPE) — recomputes the distributions for the UTC-day
event cohort and rewrites stats / stats_recomputed_at on
the daily-coverage row in place. 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​


Recompute Daily Stats Range​

POST
/events/uptimes/daily/recompute-stats-range

Bulk-rebuild the stats block across a date window.

Loops :meth:EventsUptimes.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​


Daily Stats Coverage​

GET
/events/uptimes/daily/stats-coverage

Per-class daily-stats coverage over the retained window.

Pure read — one indexed _id-range scan, no recompute. Returns
the :meth:EventsUptimes.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​


Backfill Stale Daily Stats​

POST
/events/uptimes/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​


Submit Backfill​

POST
/events/uptimes/backfill

Queue a backfill job. Returns immediately; the worker walks
the queue serially. Range validation is done up front so a typo
gets a 400 instead of disappearing into the worker.

Composite-key dedup (_id = "<prb_id>:<timestamp>:<event[0]>")
means re-running over a range you already covered is safe — the
upserts hit existing docs and become no-op writes.

Parameters​

Header Parameters

authorization
x-api-key

Request Body​

application/json
JSON
{
  
"start_ts": 0,
  
"stop_ts": 0
}

Responses​

Successful Response

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

Playground​

Headers
Body

Samples​


Get Backfill Status​

GET
/events/uptimes/backfill/status

Worker queue snapshot + liveness. All three fields are best-
effort; the dashboard polls this at 5s while a backfill is
running.

Parameters​

Header Parameters

authorization
x-api-key

Responses​

Successful Response

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

Playground​

Headers

Samples​


Stop All Backfills​

POST
/events/uptimes/backfill/stop-all

Hard-stop every uptime backfill.

Two moves: discard all queued-but-not-started jobs from this
process's in-memory queue, then flip stop_requested on every
running import row (this process or any replica). Each in-flight
import_window finishes as stopped at its next per-chunk
checkpoint — partial counts preserved, no data loss (the ingest is
idempotent). Returns the drop / signal tally + the worker snapshot.

Parameters​

Header Parameters

authorization
x-api-key

Responses​

Successful Response

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

Playground​

Headers

Samples​


Purge Bogus Resyncs​

POST
/events/uptimes/purge-resyncs

Start a background sweep of the bogus resync-only change-points
left by the old over-sensitive detector (any lts decrease →
resync).

Deletes only docs whose sole reason is resync and whose lts
drop is within the sync-jitter slack — records the corrected
detector would never have written. Legitimate change-points (and
genuine large resyncs) are untouched.

Runs detached — the collection can hold millions of rows, far
more than a single request's timeout allows — and returns the
initial status immediately. Poll GET /purge-resyncs/status for
live progress. 409 if a purge is already in flight.

Parameters​

Header Parameters

authorization
x-api-key

Request Body​

application/json
JSON
{
  
"dry_run": true
}

Responses​

Successful Response

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

Playground​

Headers
Body

Samples​


Purge Resyncs Status​

GET
/events/uptimes/purge-resyncs/status

Live snapshot of the background resync purge — counters while
running, final tally (or error) once done.

Parameters​

Header Parameters

authorization
x-api-key

Responses​

Successful Response

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

Playground​

Headers

Samples​


Recover Stale Backfill​

POST
/events/uptimes/backfill/recover-stale

Re-enqueue any imports stuck in running state.

These rows are orphaned by a previous process: the worker that
wrote them died (typically a backend restart) before flipping
them to success / failed. Recovery marks each orphan
failed (with a "worker died mid-import; re-enqueued" note,
so the import-history table reflects the death honestly) and
re-enqueues the same (scan_start_ts, scan_stop_ts) window
for the live worker.

The same recovery runs automatically at worker startup; this
endpoint covers the rarer follow-up case where the worker task
died mid-life but the backend kept running, leaving the queue
stranded.

Safe to call any time. :meth:EventsUptimes.import_window
is idempotent (composite-_id upserts), so re-running over a
range the orphan already partly imported just lands the
remainder.

Parameters​

Header Parameters

authorization
x-api-key

Responses​

Successful Response

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

Playground​

Headers

Samples​


Refresh Events Connections​

POST
/atlas/events/connections/refresh/

Run the connection-events ingest's recent-window scan now.

Mirror of the cron's import_recent. Synchronous from the
caller's perspective — usually completes in seconds because the
overlap window is short. For arbitrary-range backfills use the
admin cookie-session endpoint at
POST /events/connections/backfill instead; this api-key
endpoint is the cron's manual companion (parallel to
POST /atlas/probes/refresh/).

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​


Atlas — built on RIPE Atlas data.