Night-light anomalies: city night lights below half of their own usual level
3 tokens minimum per request; above 30 rows, 1 token per 10 rows returned (rounded up) — the same rule as a page of signals, and the same plan window applies (meta.window_clamp says when it was cut). A night-light anomaly is a satellite measurement, not a report: on a night, the lights measured over one of a fixed list of cities were below 50% of that city's own usual level (NASA Black Marble, VIIRS). A night is judged only when at least 70% of the city's box could be observed; the usual level is the median of the most recent earlier such nights (at least 5, at most 30). Nights of one continuing drop are one record (a new record starts after a judged night that was not a drop, or a gap of more than 3 days). Each record carries the city (name, country, centre and the half-size of its box), night (the latest night of the drop, a UTC date), first_night and nights (every drop night in the record), ratio_to_usual and percent_of_usual (0.41 / 41 = 41% of the usual level), observed_share (how much of the box was observed that night), baseline_nights, product (the Black Marble product, e.g. VJ146A2_NRT), granule (the product file the value was read from) and provisional. provisional=true means the value came from the near-real-time product and can change when the standard product arrives about nine days later. The nightly brightness values themselves are not returned. Every record is also an event (same event_id as GET /api/v1/signals with categories=nightlight_anomaly, where it carries measured=true and measured_kind=nightlight), so the event endpoints work on it. related_events lists events tied to this one by a stored relation — nothing is inferred when the record is read, so it is usually empty; it needs a plan with event relations (otherwise null, and meta.notes says so). The detail — which city, the level against usual, the nights, the observed share and the summary — needs a plan with the full event detail. Without it every record still returns that it was recorded, when, the position and its kind, with detail_withheld=true, a placeholder title and null in the withheld fields (meta.detail_included and meta.detail_required_plan say so); the same records in GET /api/v1/signals carry the placeholder title too. cities lists every monitored city on every page, whether or not it has a record — it is not filtered by bbox, dates or cursor: slug, name, country_code, lat, lng, status (usual = the latest judged night was within the usual range; below = the latest judged night, no more than 3 days old, was below 50% of the usual level; not_judged = neither can be said, and reason says why), level (the latest judged night: night, ratio_to_usual, percent_of_usual, observed_share, provisional), nights (the last 30 days, newest first; ratio_to_usual is null on a night that was not judged) and baseline_nights. Join cities[].slug to a record's city.slug. A city marked usual states a measurement of one night, not that nothing happened there; the nightly brightness values are not returned for cities either. For cities, a plan without the full event detail gets every monitored city (slug, name, country_code, lat, lng) with status, reason, level, nights and baseline_nights null and detail_withheld=true — which city is below its usual level is part of the detail. meta.definition carries the thresholds, meta.notes what the record does and does not establish, and meta.attribution the source credit, which must be shown with the data. Cursor pagination via meta.next_cursor.
Request
- Base URL: https://offnadir-delta.com
- URL: https://offnadir-delta.com/api/v1/nightlight-anomalies
- Auth: one of:
- HTTP bearer
- API key in header X-API-Key
Query parameters
Bounding box "minLon,minLat,maxLon,maxLat" (WGS84). Omit for worldwide.
Date range start, YYYY-MM-DD (UTC). Give with end_date, or neither for the last 7 days up to the latest day your plan can read.
Date range end, YYYY-MM-DD (UTC), inclusive.
Max rows per page (1-100, default 50).
Opaque cursor from meta.next_cursor. Bound to the query it came from.
Response
A page of records, newest first.
Changes
No recorded changes to this operation across all 1 revision of this API.