API v1 · REST + JSON
Meridian Data API reference
Commodity prices as JSON over HTTPS. Every response is a flat, typed object with an as-of timestamp and a request id. No SDK, no streaming protocol, no XML.
Quickstart
Issue a key on the signup page, put it in an environment variable, and make one request. That is the whole setup.
export MERIDIAN_API_KEY="mc_live_…"
export MERIDIAN_BASE="https://api.meridian-data.example/v1"
curl -s "$MERIDIAN_BASE/commodities/XAU" \
-H "Authorization: Bearer $MERIDIAN_API_KEY" \
-H "Accept: application/json"
The response:
{
"data": {
"symbol": "XAU",
"name": "Gold",
"category": "Metals",
"unit": "USD/oz",
"price": 2412.35,
"change": 18.4,
"changePct": 0.77
},
"meta": {
"request_id": "req_8f2c41d0a7b94e13",
"as_of": "2026-10-29T09:14:02Z",
"count": 1,
"api_version": "v1"
}
}
Try the live demo endpoint without a key: GET /api/v1/commodities
Authentication
Pass your key as a bearer token in the Authorization header. Keys are prefixed mc_live_ and are scoped to your account, not to a region.
Authorization: Bearer mc_live_9f3c…
- · Never put the key in a query string — it will be logged by proxies.
- · Rotate keys from the dashboard; old keys keep a 24-hour grace period.
- · Missing keys return 401 missing_api_key; suspended keys return 403 key_disabled.
Rate limits
Limits are enforced per key with a token bucket. Responses include the standard headers on every request, including the ones that succeed.
| Plan | Sustained | Burst | Monthly quota |
|---|---|---|---|
| Free | 5 req/s | 20 | 10,000 |
| Pro | 50 req/s | 200 | 2,000,000 |
| Enterprise | 250 req/s+ | 1,000+ | Contract |
X-RateLimit-Limit: 50
X-RateLimit-Remaining: 49
X-RateLimit-Reset: 1761734100
# When exceeded
HTTP/1.1 429 Too Many Requests
Retry-After: 1
Endpoints
All endpoints are HTTPS-only GETs. Responses are cacheable for the duration of the as-of window.
| Method | Path | Description | Parameters |
|---|---|---|---|
| GET | /v1/commodities |
List every covered instrument with last, change and session statistics.
Auth: API key |
symbol, category, limit, cursor |
| GET | /v1/commodities/:symbol |
One instrument by symbol, including unit, category and session range.
Auth: API key |
symbol (path), as_of |
| GET | /v1/prices |
Alias of the list endpoint, kept for compatibility with the public board.
Auth: API key |
category, limit, cursor |
| GET | /v1/research |
Research-note metadata and standfirsts. Full text on the website.
Auth: API key |
category, limit, cursor |
The demo server also exposes unauthenticated /api/prices and /api/v1/* endpoints with the same response shape, so you can inspect the contract before signing up.
Pagination
List endpoints return up to 100 records and a cursor. Pass the cursor back unchanged; do not construct or modify it. An empty next_cursor means you have the last page.
GET /v1/commodities?category=Energy&limit=2
GET /v1/commodities?category=Energy&limit=2&cursor=eyJvIjoyfQ…
{
"data": [ … ],
"meta": {
"request_id": "req_…",
"count": 2,
"next_cursor": "eyJvIjo0fQ…"
}
}
Errors
Errors use conventional HTTP status codes and a stable machine-readable code. Branch on the code, never on the message.
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_request | A query parameter is malformed or out of range. |
| 401 | missing_api_key | No Authorization header was supplied. |
| 403 | key_disabled | The key is valid but suspended or out of plan. |
| 404 | unknown_symbol | No instrument matches the requested symbol. |
| 429 | rate_limited | Burst or monthly quota exceeded. Retry after Retry-After. |
| 503 | upstream_unavailable | A regional ingest node is unavailable. Retry with jitter. |
{
"error": {
"type": "invalid_request_error",
"code": "unknown_symbol",
"message": "No instrument matches \"XYZ\"."
},
"meta": { "request_id": "req_…", "api_version": "v1" }
}
Versioning & support
The version is part of the path (/v1). Additive fields may appear at any time — ignore unknown keys. Breaking changes ship under a new version with at least twelve months' notice.
Support
hello@meridian-data.example
Response within one business day on Pro.
Status
All systems operational
99.98% 90-day uptime · 99.9% SLA