MachineEconomy.ai
LIVE

PUBLIC API · v1

Pull every number yourself.

Free and open — no authentication required. Built for developers, researchers, and analysts. Index endpoints return snake_case JSON in a top-level { data, meta } envelope; reports are also available over RSS at /feed.xml.

Citing our figures is free for everyone, commercial use included. Reuse beyond citing is free for non-commercial purposes under CC BY-NC 4.0; for commercial reuse, or API use beyond the free rate limit, write to hello@machineeconomy.ai. How to cite →

BASE https://machineeconomy.ai/api/v1NO AUTHJSON · SNAKE_CASE

ENDPOINTS · 9 ROUTES

Each example is the live response, built by the same builder as its route. Values refresh daily after the cron run; this page revalidates every 900s (with /api/v1/metrics).

GET

/api/v1/mei

The latest Machine Economy Index. score_geometric is the headline composite, the weighted geometric mean of four components; score_arithmetic and balance_gap give the arithmetic composite and their difference. Component scores are integers; composites are stored to one decimal place. score_low and score_high carry the robustness band — the 5th–95th percentile range from the §6.7 sensitivity analysis (10,000 Monte Carlo draws over component weights and normalization goalposts; not measurement uncertainty), null until the first post-ship calculate-mei run populates them. 503 if no score has been calculated yet. ISR revalidate 3600s.

EXAMPLE RESPONSE
{
  "data": {
    "score_geometric": 33.7,
    "score_arithmetic": 36.8,
    "balance_gap": 3,
    "components": {
      "payment": 37,
      "physical": 51,
      "legal": 16,
      "macro": 43
    },
    "score_low": 30,
    "score_high": 38,
    "methodology_version": "1.3",
    "calculated_at": "2026-11-06T17:33:37.522Z"
  },
  "meta": {
    "source": "MachineEconomy.ai",
    "docs": "https://machineeconomy.ai/methodology",
    "methodology_version": "1.3"
  }
}
$ curl https://machineeconomy.ai/api/v1/mei

REQUEST BEHAVIOR

AUTH

Free and unauthenticated. No key, no signup. Data updates daily — polling faster adds nothing.

RATE LIMIT

100 req / min per IP — a 1-minute sliding window, GET and POST — shared across all /api/v1/* (not per-route). Over the limit → 429 with a Retry-After header (seconds until retry) and { "error": "Rate limit exceeded. Please retry later." }. No X-RateLimit-* headers.

CACHING

ISR revalidation: /mei, /widget, /lrrs and /lrrs/coverage-log at 3600s; /metrics and /diagnostics at 900s; /api/openapi.json at 86400s. An Upstash read-through cache mirrors those TTLs on the database read path.

CORS

All /api/* responses send Access-Control-Allow-Origin: * and allow GET, POST and OPTIONS, with Content-Type as an allowed header.

ERRORS

Errors are { error }. 503 on /mei · /widget before the first calculation ("No MEI score available"); 400 on /newsletter for invalid JSON or a bad email, 500 if the subscription fails; 429 over the rate limit.

DATA-QUALITY FLAGS ON /metrics

is_stale
the value is carried forward: the latest fetch failed, or its value was refused.
is_provisional
pending verification — excluded from the MEI composite until verified.
is_mei_input
whether the metric is an index input (registry member) or tracked as context only.
hold
set, with the reason and its dates, while a metric is held at its last clean value because its value-jump safeguard refused the fetched value — only from since to review_by (UTC days, both included); null otherwise. Outside those dates a value still carried forward shows only is_stale: true.
note
set, with its dates, while a published note says what a metric's value contains; null otherwise.

Full field-level schemas, query params, and error responses live in the OpenAPI 3.1 spec. Per-metric sources and cadences are on the methodology page.