Download returns 404 or “file not found”
Polymarket- Check the date. Exports are generated daily. Use a date that exists in the list response. Polymarket uses the v1 API, which does not zero-pad months and days (e.g.
2025-11-8, not2025-11-08). Kalshi uses the v2 API, which uses standardYYYY-MM-DDformatting. - Check the path. For asset ID:
https://datasets.predictiondata.dev/polymarket/{export_type}/{asset_id}/{date}.csv.gz— usebooks,trades, oronchain/fillsas the export type (not plainonchain). For slug:https://datasets.predictiondata.dev/polymarket/{export_type}/{market_slug}/{outcome}/{date}.csv.gz?slug=true&apikey=YOUR_KEY(e.g..../books/will-the-seattle-seahawks-win-super-bowl-2026/YES/2026-2-9.csv.gz?slug=true&apikey=...). - List first. Call the list endpoint and use the same
asset_idanddate(or slug/outcome) that appear there. Don’t guess IDs or dates.
- Use the exact
pathfrom the list response inGET /v2/datasets/{path}. Don’t modify or construct the path yourself. - The download URL returns a 302 redirect. If your client doesn’t follow redirects, you’ll get a redirect response instead of the file. Use
curl -Lor enable redirect following in your HTTP client.
“Unauthorized” or authentication errors
- Polymarket downloads: Auth is via the query parameter
apikey=YOUR_API_KEY. If you forget it or typo the key, you’ll get 401/403. - Kalshi: Auth is the header
x-auth-token: YOUR_API_KEY. Query params are not used for auth. Make sure the header is sent on both the list and the download request. - Wrong tier: Your key’s tier must allow the exchange (e.g. Kalshi tier for Kalshi data). If you get access denied, ask calder@predictiondata.dev to confirm your tier.
List returns empty or no exports
- Polymarket: Confirm the market/event/asset exists and has data for the date range. New markets may not have backfilled history yet. Try an event slug you know has markets (e.g. from the Polymarket site).
- Kalshi: Same idea — check the ticker. Ensure you’re sending
x-auth-token; missing or invalid tokens return a 401 error. - Date: Exports are usually produced once per day. There is no same-day data for “today” until the next run (e.g. after 2am UTC for Polymarket).
Wrong or weird date format
- Polymarket (v1 API): Dates are not zero-padded (e.g.
2025-11-8, not2025-11-08). Use the exact date string from the list response. - Kalshi (v2 API): Standard
YYYY-MM-DDformat (e.g.2025-11-08). - All times are UTC. The “day” of an export is the UTC date.
Slug vs asset ID (Polymarket) — which to use?
- Event slug — What you see in the URL for a Polymarket event (e.g.
super-bowl-champion-2026-731). Use it to list all markets in that event. - Market slug — The URL-friendly name for a single market (e.g.
will-the-seattle-seahawks-win-super-bowl-2026). - Asset ID — The internal CLOB token ID (long number). You get it from our list response. Use it in download URLs when you don’t want to pass slug + outcome.
- Use
asset_id+datein the path andapikeyin the query, or - Use
market_slug+outcome(YES/NO) +datein the path and bothslug=trueandapikeyin the query. Don’t mix: if you use slug in the path, you must setslug=true.
Kalshi download returns HTML or a redirect URL instead of the file
The Kalshi download endpoint returns a 302 redirect to a signed CloudFront URL. You must follow that redirect to get the file. In curl, use-L. In code, allow your HTTP client to follow redirects (often the default). If you only read the first response body, you’ll get the redirect page or URL, not the actual data.
Rate limits / “too many requests”
We do not rate limit by request count or download volume for normal use. If you see rate-limiting errors, they may be from a proxy or from the CDN (e.g. after following the Kalshi redirect). If you’re doing very high volume (e.g. bulk backfill), reach out to calder@predictiondata.dev.How do I read the files?
CSV files are gzip-compressed (.csv.gz):
- Command line:
gunzip -k file.csv.gzorgzip -dc file.csv.gz > file.csv. - Python:
pandas.read_csv('file.csv.gz')(pandas handles gzip automatically). - Other languages: Use a gzip library or decompress before parsing.
.parquet, Kalshi only) are zstd-compressed:
- Python:
pandas.read_parquet('file.parquet')or usepyarrow. - Other languages: Use any Parquet library (Arrow, DuckDB, etc.).
Still stuck?
- Double-check the Quickstart for the exact URLs and parameters.
- Confirm your API key and tier with calder@predictiondata.dev.
- For Polymarket, re-fetch the list response and use the same
asset_id,date, andexport_type(or slug + outcome) in your download URL. - For Kalshi, re-fetch the list response and use the exact
pathfrom the response.