---
title: "Thermal anomalies: heat sources measured by satellite"
method: GET
path: "/api/v1/thermal-anomalies"
---

# Thermal anomalies: heat sources measured by satellite

`GET /api/v1/thermal-anomalies`

## Request

- Base URL: `https://offnadir-delta.com`
- URL: `https://offnadir-delta.com/api/v1/thermal-anomalies`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

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 thermal anomaly is a satellite measurement, not a report (fire radiative power, VIIRS on NOAA-20 / NOAA-21 / Suomi NPP via NASA FIRMS). Two kinds are returned. kind=facility: a heat source of at least 10 MW within 2 km of a registered facility — a refinery, power plant, port, base, dam, bridge and the like; airports are excluded — that is at least 5 times the strongest detection within 500 m of the same spot in the 21 days before (or where none was detected). kind=night_source: a night-time heat source of at least 20 MW with no registered facility within 2 km, at least 5 times its own spot's 21-day maximum and 3 times that of the surrounding 10 km, compact and with little burning around it; its facility and distance_m are null, and it does not rule out vegetation fires. Each record states what was measured — strength, time, satellite, the earlier level, and for kind=facility the distance to the facility — and never a cause: a detection does not distinguish an attack, an accident, flaring or a vegetation fire, and the heat source may be outside the facility. Every record is also an event (same event_id as GET /api/v1/signals with categories=thermal_anomaly, where it carries measured=true and measured_kind=thermal), so the event endpoints work on it. linked_events lists reported events tied to the same facility by name within 3 days of the detection; it needs a plan with event relations (otherwise null, and meta.notes says so). Severity is inherited from linked reporting and is null when there is none. The measurement detail — which facility or place it was near, the distance, the strength, the summary and linked_events — needs a plan with the full event detail. Without it every record still returns that a heat source was measured, when, the pixel 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. Cursor pagination via meta.next_cursor.

## Query parameters

- `bbox` string
- `start_date` string, date
- `end_date` string, date
- `limit` integer
- `cursor` string

## Response `200`

A page of thermal anomalies, newest detection first.

- object
  - `meta` object
  - `thermal_anomalies` object[]

## Other responses

- `400`: Error response with a stable machine-readable code.
- `401`: Error response with a stable machine-readable code.
- `402`: Error response with a stable machine-readable code.
- `403`: Error response with a stable machine-readable code.
- `429`: Error response with a stable machine-readable code.

---

[API](https://skmtc.dev/offnadir-delta/apis/off-nadir-delta-api.md) · [All operations](https://skmtc.dev/offnadir-delta/apis/off-nadir-delta-api/llms.txt) · [OpenAPI document](https://skmtc.dev/offnadir-delta/apis/off-nadir-delta-api/revisions/5cf3f2bed5a2?raw)
