Endpoint reference
The URL grammar and the generated OpenAPI specification.
URL shape
/{version}/{dataset}/{scope}/{selector}.{format}| Part | Values |
|---|---|
dataset | gold · silver · equity-indices · fx · crude |
scope | in · world, the denomination of the values, not your nationality |
selector | latest · YYYY-MM-DD · series/{7d|30d|90d|1y|YYYY|all} |
format | json · csv · txt |
scope is a currency, not a country
This is the field people get wrong, so it is worth being blunt about.
| You want | Endpoint | Unit |
|---|---|---|
| Gold in rupees per gram | /api/v1/gold/in/latest.json | INR/g |
| Gold in dollars per troy ounce | /api/v1/gold/world/latest.json | USD/ozt |
| USD/INR and the majors | /api/v1/fx/world/latest.json | ratio |
| Nifty 50, Sensex | /api/v1/equity-indices/in/latest.json | index points |
| Brent, WTI | /api/v1/crude/world/latest.json | USD/bbl |
| US Treasury yields | /api/v1/rates/world/latest.json | percent |
in does not mean "Indian markets" and world does not mean "everything".
They mean rupee-denominated and not rupee-denominated. Brent is priced
in dollars, so it is world even though Indian refiners buy it; rupee gold is
in even though the metal is global.
The unit is always stated on the envelope, so if you are unsure, read
unit.quantity and unit.currency from the response rather than inferring it
from the path.
Dataset-first rather than scope-first, because the schema is per-dataset,
gold has a shape, in does not, and adding a country stays purely additive.
Currency is not in the path. Scope implies it, and putting it there would
double the path space. Currency lives in the envelope's unit.
Every endpoint
/api/v1/gold/in/latest.json
/api/v1/gold/in/2026-08-11.json
/api/v1/gold/in/series/30d.json
/api/v1/gold/world/latest.json
/api/v1/all/latest.json every dataset
/api/v1/all/in/latest.json everything denominated in India
/api/v1/all/world/latest.json everything denominated globally
/api/v1/in/latest.json 301 → /api/v1/all/in/latest.json
/api/v1/meta.json source health, staleness, last run
/api/v1/coverage.json per-series earliest date, gaps, licence
/api/v1/calendar/IN-BULLION/2026.json
/api/v1/revisions.json
/llms.txt /llms-full.txt /openapi.json /schema/v1/observation.jsonSpecification
The full OpenAPI 3.1 document is at /openapi.json, with
an interactive, try-it reference rendered from it at
/reference.
That reference is a view of the spec, not a second copy of it, which is the only arrangement that stays correct. A hand-maintained endpoint list drifts within a month.
It templates its paths rather than enumerating them. There are thousands of
live URLs and four shapes; a spec that listed them all would be megabytes and
stale by lunch. dataset, scope and format are enums; selector is a
documented pattern.
The document is generated from the same registries the router uses, so it cannot describe an endpoint that does not exist, and CI fails if the committed copy drifts.
Errors
Errors are JSON with a machine-readable code and a hint that names the fix, so
an agent can correct itself without a human reading the docs:
{
"error": "not_found",
"message": "unknown dataset \"bitcoin\"",
"hint": "known datasets: gold, silver, equity-indices, fx, crude"
}CORS headers are present on error responses too.