---
title: "Settlement window for a crypto up/down market"
method: GET
path: "/v1/markets/{slug}/twap"
tags: ["Markets"]
---

# Settlement window for a crypto up/down market

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

## Request

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

**Min tier: `free`.** Every Chainlink observation across the window that settles this market, plus their mean and an explicit `coverage` verdict.

`window` is your input, not something derived from the market. Polymarket uses 30 seconds for 5-minute markets and 60 for 15-minute ones, but `start_date` is null or wrong on all but a handful of catalog rows, so the market cannot say which kind it is. Inferring it would silently return the wrong window for half the surface; the default is 30 and the response always echoes what was used.

The `{slug}` segment also accepts a raw `condition_id`, though symbol resolution reads the slug, so a `condition_id` only works for markets that have a catalog row.

Equity and index up/down markets (`aapl-`, `spx-`) return `404`: they settle on Pyth feeds that are not recorded here.

## Path parameters

- `slug` string, required

## Query parameters

- `window` 30 | 60

## Response `200`

Observations across the settlement window, oldest first.

- MarketTwapWindowPage
  - `condition_id` string
  - `slug` string
  - `symbol` string: The feed symbol this market settles against.
  - `settles_at` integer: Market close, unix ms — the instant the settlement TWAP is taken.
  - `window` 30 | 60: The window used, echoing your request.
  - `window_mean` number, nullable: Mean of `value` across the returned observations; null when nothing was captured.
  - `coverage` 'none' | 'partial' | 'complete': `none` = the market settled before recording began (permanent for anything before capture start — the feed has no history). `partial` = fewer observations than the feed's ~1/s cadence implies. `complete` = the window is covered. An empty `data` array on its own cannot distinguish "unrecorded" from "flat".
  - `data` CryptoTwapTick[]
    - `ts` integer: Chainlink observation time, unix ms.
    - `received_ts` integer: Feed delivery time, unix ms.
    - `latency_ms` integer: Delivery lag behind the observation. Typically ~1.4s.
    - `symbol` string
    - `window_seconds` 0 | 30 | 60: 30 settles 5-minute markets, 60 settles 15-minute markets, 0 is the Chainlink spot reference (not a TWAP).
    - `value` number: Convenience float. Lossy above 2^53 — BTC already exceeds that. Settle on `value_e18`.
    - `value_e18` string: The exact E18 fixed-point integer, as a string. This is the value settlement is decided on.
  - `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.
- `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)
