---
title: "Bulk Parquet exports of archived months (BUSINESS+)"
method: GET
path: "/exports"
tags: ["Exports"]
---

# Bulk Parquet exports of archived months (BUSINESS+)

`GET /exports`

## Request

- Base URL: `https://madeonsol.com/api/v1`
- URL: `https://madeonsol.com/api/v1/exports`
- Auth: HTTP bearer

BUSINESS+ (BASIC/PRO/ULTRA get 403 with an `upgrade` block; ENTERPRISE passes). Two modes on one route.

**Listing** (no params): every fully archived closed month per dataset — `token_trades`, `rhc_trades`, `token_ohlc_1m`, `rhc_ohlc_1m` — with row count, byte size and file count. A month appears only once both archive providers have verified it (the same ledger the nightly archive exporter writes), so the list is the set you can actually download.

**Download** (`dataset` + `month`): presigned S3 GET links for that month's Parquet files (zstd-compressed, one or more files per month). Links are valid for about **1 hour** — fetch them when you are ready to download, not ahead of time; re-request to mint fresh ones. The ledger row count is returned so you can verify the files you pulled. Both params are required together.

The current (open) month is never listed — it is live in Postgres and served by the paginated endpoints (`/tokens/{mint}/trades`, `/rhc/trades`, `/tokens/{mint}/candles`). Files are identical to the immutable dual-provider archive described at https://madeonsol.com/data-integrity — ideal for backtests, model training and offline analytics without paging through the API.

## Query parameters

- `dataset` 'token_trades' | 'rhc_trades' | 'token_ohlc_1m' | 'rhc_ohlc_1m'
- `month` string

## Response `200`

Listing (no params) or one month's download links (dataset + month).

- union
  - object
    - `datasets` object[], required
      - `dataset` 'token_trades' | 'rhc_trades' | 'token_ohlc_1m' | 'rhc_ohlc_1m', required
      - `months` object[], required: Fully archived closed months, newest first.
        - `month` string, required: `YYYY-MM`, UTC-derived closed month
        - `rows` integer, required: Row count recorded in the archive ledger at export time
        - `bytes` integer, required: Total compressed Parquet bytes for the month
        - `files` integer, required: Number of Parquet files the month is split into
  - object
    - `dataset` 'token_trades' | 'rhc_trades' | 'token_ohlc_1m' | 'rhc_ohlc_1m', required
    - `month` string, required
    - `rows` integer, required
    - `bytes` integer, required
    - `files` object[], required
      - `name` string, required: Object name, e.g. `token_trades/2026-07/part-0001.parquet`
      - `bytes` integer, required
      - `url` string, uri, required: Presigned S3 GET URL — no auth header needed, plain HTTP GET
      - `expires_at` string, date-time, required: When the presigned URL stops working (~1 h after issue)
    - `license_note` string, required: The terms the files are released under (BUSINESS embed license; redistribution is ENTERPRISE)

## Other responses

- `400`: `dataset` or `month` invalid, or only one of the two given.
- `401`: Missing or invalid API key, or an expired free-tier key. Authentication-stage error: no `X-RateLimit-*` headers, no `_rid`.
- `403`: Tier below BUSINESS. Standard tier-gate body with an `upgrade` block.
- `404`: That month is not (yet) fully archived for that dataset — it is either the open month or still being verified.
- `429`: Too many requests. Every 429 carries `Retry-After`. A quota 429 (`rate_limit_exceeded`, with `X-RateLimit-*`), a heavy-query concurrency 429 (`error_kind` `concurrency`/`capacity`), or the per-IP authentication-failure block (30 failed auths/min; plain `error` + `retry_after_seconds`, no `X-RateLimit-*`).
- `500`: Unexpected server error from the route (`Internal server error`, with `_rid`). Safe to retry with backoff. A failed API-key lookup is a 503 `auth_backend_unavailable`, never a 500.
- `502`: The archive store could not be reached to sign the links. Retry later; nothing was consumed from your quota.
- `503`: The API-key or subscription lookup could not be answered (authentication stage). Retryable and not your fault: it is never counted as a failed authentication. Honour `Retry-After`; no `X-RateLimit-*`, no `_rid`.

---

[API](https://skmtc.dev/madeonsol/apis/madeonsol-api.md) · [All operations](https://skmtc.dev/madeonsol/apis/madeonsol-api/llms.txt) · [OpenAPI document](https://skmtc.dev/madeonsol/apis/madeonsol-api/revisions/96ce84657f55?raw)
