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

## Response `200`

Successful Response

- unknown

## Other responses

- `307` — Redirect to presigned R2 URL (parquet file).
- `400` — Invalid request parameters.
- `403` — plan_gated — Free tier or depth exceeded.
- `404` — disabled — endpoint not yet active.
- `422` — Validation Error
- `503` — R2 not configured or object not found.

---

[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/7885a141754c/schema)
