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

Responses cache for five minutes; a repeated call inside that window costs nothing new.

request
$ curl https://api.pressureatlas.com/v1/pressure/latest \
    -H "Authorization: Bearer pa_your_key"
response 200
{
  "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 to macro.
  • 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.
request
$ curl "https://api.pressureatlas.com/v1/pressure/recent?date_start=2026-08-15&date_end=2026-08-19" \
    -H "Authorization: Bearer pa_your_key"
response 200
{
  "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_end as for /v1/pressure/recent.
  • /v1/metrics/:slug/export - the full history as format=csv or format=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.

response 200
{
  "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.

response 200
{
  "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.

StatusCodeWhen
401unauthorizedMissing, invalid, or revoked key.
400invalid_request, invalid_windowBad date format, start after end, window before history.
403not_availableA dataset or feature outside your account's access.
404unknown_dataset, wrong_routeSlug not in the catalog; or the slug exists but is served by the other path (the message names it).
429rate_limitedPer-minute or daily budget spent; Retry-After is set.
503upstream_unavailable, data_pendingThe data source is unavailable, or the newest day is still preparing.
error body
{
  "error": {
    "code": "rate_limited",
    "message": "You've used the 200 calls included today. The counter resets at midnight UTC."
  }
}