snapdata

Endpoint reference

The URL grammar and the generated OpenAPI specification.

URL shape

/{version}/{dataset}/{scope}/{selector}.{format}
PartValues
datasetgold · silver · equity-indices · fx · crude
scopein · world, the denomination of the values, not your nationality
selectorlatest · YYYY-MM-DD · series/{7d|30d|90d|1y|YYYY|all}
formatjson · csv · txt

scope is a currency, not a country

This is the field people get wrong, so it is worth being blunt about.

You wantEndpointUnit
Gold in rupees per gram/api/v1/gold/in/latest.jsonINR/g
Gold in dollars per troy ounce/api/v1/gold/world/latest.jsonUSD/ozt
USD/INR and the majors/api/v1/fx/world/latest.jsonratio
Nifty 50, Sensex/api/v1/equity-indices/in/latest.jsonindex points
Brent, WTI/api/v1/crude/world/latest.jsonUSD/bbl
US Treasury yields/api/v1/rates/world/latest.jsonpercent

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.json

Specification

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.

On this page