Skip to main content
A crypto market is a binary market whose question is about the price of a digital asset rather than a sporting or political outcome. It trades, settles and redeems exactly like any other binary market — same orderbook, same EIP-712 order, same ConditionalTokens redemption — but the payload carries an extra machine-readable block so you never have to parse the market title or the rules text. Two product lines exist today:

Long-dated price markets

Operator-listed YES / NO questions — “will BTC touch 64,400before30July?","willtheJulyUTCclosebeabove64,400 before 30 July?", "will the July UTC close be above 65,000?”. Lifetimes of days to months. Described on this page.

Up/Down windows

Machine-minted Up / Down markets on a recurring 15-minute (or hourly / daily) grid, grouped into a series. Their own page — they add a cryptoWindow block and a series navigation endpoint.
Both lines carry the same crypto block, the same instrument catalog and the same live price feed, so a client that renders one renders the other with one extra null-check.

Finding crypto markets

Crypto markets live under the crypto vertical. The event list takes the filter directly:
All three accept repeated keys (?asset=btc&asset=eth) or CSV (?asset=btc,eth), up to 20 distinct values per field. GET /api/verticals returns the counts behind those chips — on the crypto vertical only, the summary carries an extra crypto block:
Each bucket is an independent overlap count (one event can sit in several) — never derive one from another, or from count. cadences and assets map 1:1 onto ?cadence= / ?asset=; preMarket is informational only — there is no matching /api/events filter, so it has no list to reconcile against. Only buckets with count > 0 are emitted.

The crypto block

Every market payload — /api/markets, /api/markets/{slug}, and the nested markets[] on /api/events — carries a crypto field. It is null on every non-crypto market, and on a crypto market it is the structured counterpart of the human resolutionCriteria text:
title carries the strike. On a crypto market with a targetPrice, the market title is the bare strike digits ("64400") — the surrounding copy lives on the parent event. Format the number yourself (thousands separators, currency); don’t string-parse the rule out of the title.
Branch on crypto, not on marketType. Operator-listed crypto markets carry marketType: "CRYPTO_PRICE_EVENT", but factory-minted Up/Down windows leave marketType null. The reliable discriminators are crypto !== null (any crypto market) and cryptoWindow !== null (Up/Down window specifically).

Product catalog

productType values the platform models. The listable column marks what an operator can create in the current release; the rest are modelled and understood by the settlement engine but gated off. Touch products (THRESHOLD_*) settle on a first touch: equality counts, and the YES outcome locks the moment the barrier is touched, even though the market settles after the observation window ends.

Instruments

Prices are sourced from Chainlink — one-minute candlestick data for long-dated products, Data Streams reports for the Up/Down open pin. The crypto-price-history endpoint below rejects an instrument outside this catalog with 422 instrument_unsupported.

Underlying price curve

The probability charts (/ohlc, /price-history) describe the market. This endpoint describes the coin — the reference price the market is written against, from the same finalized one-minute candles the oracle ingests:
Path parameter is the market symbol (like the other market sub-resources — only the root /api/markets/{slug} detail takes a slug). range is required: Buckets with no source candle are absent, not zero-filled — a 1h request typically returns 57–60 points. Draw gaps, don’t interpolate across them.
  • points[] are per-bucket closes in ascending time order, already scaled to human decimal strings. Only complete, grid-aligned buckets are returned, so the series is stable between polls — from / to echo the snapped window the server actually queried.
  • spot is the latest finalized minute for the instrument and may sit past to; null when no candles exist yet.
  • priceToBeat is the reference line to draw on the same axis — the frozen open of an Up/Down window, already scaled. It is null on long-dated markets: their reference line is crypto.targetPrice.
Public endpoint — no auth required. Two IP buckets apply together: the shared markets ceiling (600 req/min) and this route’s own (120 req/min). Responses carry Cache-Control: public, max-age=30.
For a live price, don’t poll this endpoint — subscribe to crypto_price_tick and append ticks to the curve you fetched. One feed per instrument serves every strike and every window on that asset.

Settlement

Crypto markets settle through the standard binary path — oracle proposes, challenge window, finalize, redeem — see Settlement flow. The difference is the evidence: the outcome is derived from Chainlink price data against the immutable rule captured in the crypto block at listing time, not from a sports data provider. The rule is written once and never edited, so crypto on an open market is the same rule the settlement engine will bind.