Docs / REST API
REST API
The same data as the MCP tools, over plain HTTPS with an
API key from the app, passed as a bearer token
or an x-api-key header - for curl, scripts, and jobs. Rate
limits are on the shared reference page; errors are
below.
GET /v1/pressure/latest
The newest closed UTC day your account includes: label is
its state, lowest first expanded, released,
equilibrium, pressurized or
compressed. The in-progress day is never served here. A new account's readings run
through the latest reading, so for it this is the latest closed day.
flow (building or releasing) and
pace (accelerating or slowing) say which way
Pressure is moving that day and whether that movement is accelerating or slowing;
together they name its flow state, such as Releasing — Slowing. They describe
the smoothed trend, so they can differ from one day's change in state, and they
are re-estimated daily, so a recent day's flow can change. A day before the
first state, or one whose flow has not arrived yet, carries empty strings.
They are a separate reading from
label, which names the state.
Query
dataset- slug from /v1/datasets; defaults tomacro.
Responses cache for five minutes; a repeated call inside that window costs nothing new.
$ curl https://api.pressureatlas.com/v1/pressure/latest \
-H "Authorization: Bearer pa_your_key"
{
"date": "2026-08-19",
"label": "pressurized",
"flow": "releasing",
"pace": "slowing",
"dataset": "macro",
"dataset_name": "Macro (Global)"
}
GET /v1/pressure/recent
The readings your account includes, counted against your account's daily budget. A new account reads the most recent 365 closed days, through the latest reading; /v1/datasets states yours.
Query
dataset- defaults tomacro.date_start,date_end-YYYY-MM-DD, inclusive. Without them the response covers every day your account includes. A window reaching past either end is cut to it, with a note.
$ curl "https://api.pressureatlas.com/v1/pressure/recent?date_start=2026-08-15&date_end=2026-08-19" \
-H "Authorization: Bearer pa_your_key"
{
"dataset": "macro",
"window": { "start": "2026-08-15", "end": "2026-08-19" },
"notes": [],
"readings": [
{ "date": "2026-08-15", "label": "equilibrium", "flow": "building", "pace": "accelerating" },
{ "date": "2026-08-16", "label": "equilibrium", "flow": "building", "pace": "accelerating" },
{ "date": "2026-08-17", "label": "pressurized", "flow": "building", "pace": "slowing" },
{ "date": "2026-08-18", "label": "pressurized", "flow": "building", "pace": "slowing" },
{ "date": "2026-08-19", "label": "pressurized", "flow": "releasing", "pace": "slowing" }
]
}
GET /v1/metrics/:slug/latest
Every metric in the catalog other than Pressure is read here, by its slug
from /v1/datasets (the catalog names the path
for each row under read_with). The reading is on that metric's
own scale and the value field is named after the metric; a metric served as
states has only its label, as Pressure does.
Also
/v1/metrics/:slug/recent- daily readings for a window;date_start,date_endas for /v1/pressure/recent./v1/metrics/:slug/export- the full history asformat=csvorformat=json, on accounts with export.
When the metric carries an explanation, the latest reading includes it as
plain text. When it carries a flow, every reading includes flow
and pace, exactly as the Pressure readings do.
{
"date": "2026-08-19",
"drift": "6.20",
"label": "mid",
"dataset": "drift",
"dataset_name": "Drift",
"explanation": "Smoothed over two weeks."
}
GET /v1/datasets
The catalog with your access per dataset. The full catalog is
always visible. Each row names the path that serves it
(read_with) and carries the metric's explanation when one is
set.
{
"datasets": [
{
"slug": "macro",
"name": "Macro (Global)",
"description": "Pressure: a daily measurement ...",
"read_with": "/v1/pressure",
"your_access": "the most recent 365 days of pressure",
"export": false
}
]
}
Errors
REST errors are standard HTTP with one JSON body shape.
| Status | Code | When |
|---|---|---|
| 401 | unauthorized | Missing, invalid, or revoked key. |
| 400 | invalid_request, invalid_window | Bad date format, start after end, window before history. |
| 403 | not_available | A dataset or feature outside your account's access. |
| 404 | unknown_dataset, wrong_route | Slug not in the catalog; or the slug exists but is served by the other path (the message names it). |
| 429 | rate_limited | Per-minute or daily budget spent; Retry-After is set. |
| 503 | upstream_unavailable, data_pending | The data source is unavailable, or the newest day is still preparing. |
{
"error": {
"code": "rate_limited",
"message": "You've used the 200 calls included today. The counter resets at midnight UTC."
}
}