---
title: "Bulk OHLCV download — presigned parquet from R2 cold tier (Basic+, flag-gated)"
method: GET
path: "/v1/download"
tags: ["download"]
---

# Bulk OHLCV download — presigned parquet from R2 cold tier (Basic+, flag-gated)

`GET /v1/download`

Bulk download of OHLCV bars for a symbol+interval+year from R2 cold tier.

Returns a 307 redirect to a time-limited presigned URL (1 hour TTL).
Free and anonymous callers are blocked — bulk download is the paid depth moat.

Tier gates:
  Free/anonymous: 403 plan_gated.
  Basic: 365-day window — years within the last year only.
  Pro+: full history (back to 1996 for XAU/USD daily).

Flag gate: 404 when core_ohlc_serving_enabled=False.

## Query parameters

- `symbol` string, required — Symbol to download. E.g. "XAU/USD", "XAU-USD-SPOT", "GLD". Only symbols with R2-exported data are available.
- `interval` string — Bar interval. One of: 1m, 5m, 15m, 30m, 1h, 2h, 4h, 1d.
- `year` integer, required — Calendar year to download (1996-2026). Each year is one parquet file partitioned from the R2 store.
- `fmt` string — Download format. "parquet" (default) = presigned R2 URL. "csv" = same parquet file (CSV transcode is a future enhancement; both formats serve the parquet object today).

## Other responses

- `307` — Redirect to presigned R2 URL (parquet file).
- `401` — Authentication failed.
- `403` — The caller's tier does not allow this request.
- `404` — The requested resource is unavailable or not found.
- `422` — Validation Error
- `429` — Per-minute, anonymous, or monthly quota exceeded.
- `500` — The operation failed internally.
- `503` — A required backend or data source is temporarily unavailable.

---

[API](https://skmtc.net/goldprice/apis/gold-api.md) · [All operations](https://skmtc.net/goldprice/apis/gold-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/goldprice/gold-api/revisions/5e6518098e6e/schema)
