Qeema — Open Affordability Index

A live, child-weighted affordability index for crisis economies. Every read endpoint is unauthenticated: the data being open is the point. Reads are rate limited per IP; bulk export more tightly still. Reading the numbers honestly. Every price-bearing object carries `is_imputed`. An imputed value is an estimate produced by a model, never a measurement, and is never silently mixed with observed data. Snapshots also carry `coverage`, `imputed_share` and `comparable` — `comparable` is false until every basket item has a price, and a consumer ranking locations must check it, because a partially-observed basket costs less simply because part of it is missing. `cost.usd` is null when no exchange rate within the configured staleness horizon was available. That is a deliberate refusal to invent a conversion, not missing data.

Download the OpenAPI 3 specification

GET /api/v1/countries

Countries this deployment publishes

GET /api/v1/countries/{countryCode}/basket

The basket being costed, with its weights

Weights are a judgement rather than a fact, so they are published: a consumer cannot disagree with the basket composition without seeing it.

GET /api/v1/countries/{countryCode}/fx

Official and parallel exchange rates

Both rates and the premium between them. The gap is itself a headline indicator of economic stress.

GET /api/v1/countries/{countryCode}/index/current

Latest snapshot per location

The most recent snapshot for each location individually, so a location that has not reported today is still returned with its last known figure rather than dropped.

GET /api/v1/locations/{locationSlug}/index

Time series for one location

GET /api/v1/locations/{locationSlug}/index/{date}

One snapshot with its full item breakdown

GET /api/v1/countries/{countryCode}/coverage

Coverage and freshness per location

Published so a consumer can judge the data before using it.

GET /api/v1/countries/{countryCode}/export.csv

Bulk CSV export, streamed

Rate limited more tightly than ordinary reads. Carries the data licence in an X-Qeema-License header, because a CSV passed on loses the context the API page carried.

POST /api/v1/submissions

Report a price

The only write route. Unauthenticated because requiring a signup would suppress the participation the platform runs on. A repeated client_idempotency_key returns 200 with status "duplicate" rather than creating a second row.

GET /api/v1/health

Service health