CUCKOOTRADE
Synthetic market data API

What happens ifyou need a live feed on Saturday?

the endpoint that answers it
$curl -N 'https://cuckootrade.com/api/v1/stream?symbols=CUCKOO,CRASH'

Server-sent events, curl-able, no key and no WebSocket client — and the synthetic session never closes.

CuckooTrade is a free, deterministic market data API that speaks Alpaca, Alpha Vantage, and Polygon — and serves the market conditions you can't schedule and the failures no provider will sell you. Every answer is one URL, with no key and no signup behind it.

1 lineto switch to your real provider
3provider wire formats mimicked
100%reproducible, byte for byte
24/7synthetic sessions, even when markets close
Compatibility

A drop-in for the API you already use

Same paths, same parameters, same JSON shape as the provider you're replacing — Alpaca, Alpha Vantage, or Polygon. Your client works unmodified: change the base URL to develop against CuckooTrade, then point it back when you're ready for live data.

The provider lives in the path — /api/v1/alpaca/…, /api/v1/alphavantage/…, /api/v1/polygon/… — and every surface serves the same deterministic world, so a symbol's bars agree across all of them.

See the full endpoint reference →

  client = StockHistoricalDataClient(
      api_key, secret_key,
-     url_override="https://data.alpaca.markets",
+     url_override="https://cuckootrade.com/api/v1/alpaca",
  )
- curl 'https://www.alphavantage.co/query?
+ curl 'https://cuckootrade.com/api/v1/alphavantage/query?
      function=TIME_SERIES_DAILY&symbol=IBM&apikey=any'
- curl 'https://api.polygon.io/v2/aggs/
+ curl 'https://cuckootrade.com/api/v1/polygon/v2/aggs/
      ticker/MSFT/range/1/day/2026-07-01/2026-08-01'
Why CuckooTrade

Built for development, CI, and demos

Real market data APIs need keys, cost money, rate-limit your CI, and go quiet when markets close. CuckooTrade removes all of that for the phases where real data isn't the point.

No key, no signup

Your first request works from curl, CI, or any HTTP client — no account and no secrets to manage. Free at 60 requests per minute per address, with standard rate-limit headers.

Deterministic by design

Every bar is a pure function of symbol, timestamp, and seed. Identical requests return identical bytes, so committed fixtures stay valid and test runs stay reproducible.

Always open

The data follows the real NYSE calendar, but the API never closes. Charts stay realistic and streams keep ticking on nights, weekends, and holidays.

Scenario tickers

Test the market conditions you can't schedule

Reserved symbols return scripted market behavior on demand — crashes, halts, overnight gaps, fat-finger spikes. Each pattern repeats on a calendar anchor, so it appears in any 30-day window and reproduces in every environment. Select a ticker to open it in the playground.

Fault injection

And the failures no provider will sell you

Scenario tickers break the data. scenario= breaks the transport: a 503 on demand, a response that hangs, a body that stops halfway through, a socket that dies mid-frame. The one that matters most is flap:2 — the endpoint fails twice and then works, so your retry and backoff have something to actually recover from.

Nothing fires without the parameter, and every fault is deterministic: drop:20s drops at twenty seconds, every time, for everyone. Random chaos makes flaky tests. These are built to live in CI.

How to test retry logic →

break it on purpose
$ curl '…/bars?symbols=AAPL&scenario=flap:2'
fails twice, then serves normally

$ curl '…/bars?symbols=AAPL&scenario=status:503'
that status, in the provider's error shape

$ curl -N '…/stream?symbols=CUCKOO&scenario=drop:20s'
socket dies at 20s, mid-frame, no close event
Determinism

Same request, same bytes

Don't take our word for it. Your browser is fetching the identical request twice right now and comparing SHA-256 hashes of the two raw responses.

Because every bar is computed, not stored, data you fetched yesterday never shifts underneath you — and neither does next month's re-run of your test suite. The guarantee is versioned: if the generator ever changes, that becomes generation 2, and generation 1 stays queryable.

How the guarantee works →

Integration

Works from any stack

Plain HTTP with permissive CORS — no client library required. Use the official Alpaca SDKs, fetch from the browser, script it with curl, or subscribe to the live SSE stream — the ticker running at the top of this page is that stream, and curl -N gets you the exact same feed.

AI coding tools are covered too: a machine-readable index at /api and llms.txt let them discover and use the whole API on their own.

curl 'https://cuckootrade.com/api/v1/alpaca/v2/stocks/bars?symbols=AAPL,CRASH&timeframe=1Day&start=2026-07-01'
from datetime import datetime

from alpaca.data.historical import StockHistoricalDataClient
from alpaca.data.requests import StockBarsRequest
from alpaca.data.timeframe import TimeFrame

client = StockHistoricalDataClient(
    api_key="any", secret_key="any",  # never checked
    url_override="https://cuckootrade.com/api/v1/alpaca",
)
bars = client.get_stock_bars(StockBarsRequest(
    symbol_or_symbols=["AAPL", "CRASH"],
    timeframe=TimeFrame.Day,
    start=datetime(2026, 7, 1),
))
print(bars["CRASH"][0])
const res = await fetch(
  'https://cuckootrade.com/api/v1/alpaca/v2/stocks/bars' +
  '?symbols=AAPL,CRASH&timeframe=1Day&start=2026-07-01'
)
const { bars } = await res.json()
console.log(bars.CRASH[0])
# server-sent events: a live synthetic feed
curl -N 'https://cuckootrade.com/api/v1/stream?symbols=CUCKOO,CRASH'
Synthetic by design

Openly fake, clearly labeled

Nothing on CuckooTrade is real market data, and nothing pretends to be. Every response is generated on demand and marked with an X-Cuckoo-Synthetic: true header, so a test fixture can never be mistaken for the real thing.

That also defines the boundary: CuckooTrade is for exercising code paths — development, testing, demos, teaching. It is not suitable for backtesting or strategy validation, because results against synthetic data say nothing about real markets.

response headers
HTTP/2 200
content-type: application/json
x-cuckoo-synthetic: true
x-cuckoo-generation: 1
cache-control: public, max-age=31536000, immutable

Make your first request

No key, no signup, no setup — this command works right now.

$ curl 'https://cuckootrade.com/api/v1/alpaca/v2/stocks/bars?symbols=AAPL,CRASH&timeframe=1Day'