---
title: "Market OHLCV candles (full history)"
method: GET
path: "/v1/markets/{slug}/candles"
tags: ["Markets"]
---

# Market OHLCV candles (full history)

`GET /v1/markets/{slug}/candles`

## Request

- Base URL: `https://crowdintel.xyz/api`
- URL: `https://crowdintel.xyz/api/v1/markets/{slug}/candles`
- Auth: HTTP bearer

**Min tier: `free`.** True OHLCV price history for a market, at 1m-1d resolution, over its full lifetime — no retention window and no row cap beyond cursor paging. Served from a ClickHouse 1-minute rollup, so `open`/`close` are the bucket's real first and last trade rather than an average.

The `{slug}` path segment also accepts a raw `condition_id` (`0x` + 64 hex). Some markets have on-chain history but no catalog entry, and a raw `condition_id` is the only way to address those.

Each bucket carries a `quality` field. `degraded` means the underlying fills for that window cannot be attributed to an outcome (Feb-Apr 2026), so volume is understated there; price is unaffected.

## Path parameters

- `slug` string, required

## Query parameters

- `interval` '1m' | '5m' | '15m' | '30m' | '1h' | '4h' | '1d'
- `from` string
- `to` string
- `token_id` string
- `limit` integer
- `cursor` string

## Response `200`

OHLCV buckets, oldest first.

- MarketCandlePage
  - `condition_id` string
  - `token_id` string, nullable: Outcome token the series was built from.
  - `outcome` string, nullable: That token's outcome label, e.g. 'Yes'.
  - `interval` string
  - `data` MarketCandle[]
    - `ts` integer: Bucket start, unix ms (UTC).
    - `open` number: First trade price in the bucket.
    - `high` number
    - `low` number
    - `close` number: Last trade price in the bucket.
    - `vwap` number, nullable: Volume-weighted average price; null when volume is 0.
    - `volume_shares` number
    - `volume_usd` number
    - `trades` integer: Deduplicated fill count.
    - `buys` integer
    - `sells` integer
    - `quality` 'ok' | 'degraded': `degraded` = fills in this window are not outcome-attributable, so volume is understated. Price is unaffected.
  - `next_cursor` string, nullable

## Other responses

- `400`: Malformed parameters or a rejected guardrail (e.g. unfiltered trades query, cluster blowup, window > 90 days).
- `401`: Missing, invalid, or revoked API key. Returned before the rate limiter runs, so it carries no `X-RateLimit-*` headers.
- `403`: Key valid but its tier is below this endpoint's minimum. Returned before the rate limiter runs, so it carries no `X-RateLimit-*` headers.
- `404`: The requested resource was not found.
- `429`: Hourly or monthly rate limit exceeded.

---

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