API Overview
The Polystrike API serves the record of Polymarket’s post-count markets for Elon Musk (elon), Ted Cruz (cruz) and Donald Trump (trump). It is paid-only: there is no free tier, no free key and no anonymous access to data endpoints.
Base URL: https://polystrike.xyz
Every request needs a User-Agent header: Cloudflare rejects some default client user agents (Python’s urllib, for one). Timestamps are Unix epoch milliseconds (UTC).
Authentication
Section titled “Authentication”| Data key | Pay per call (x402) | Open | |
|---|---|---|---|
| Price | $29 for 30 days, $290 for a year | $0.01 per call | free |
| How | X-API-Key: ps_pro_... header | x402 payment header, no key | nothing |
| Rate limit | 10,000 requests/hour | no hourly cap | - |
| Covers | every data endpoint, bulk parquet, WebSocket | every data endpoint except bulk parquet and the WebSocket | the endpoints listed under “Open” below |
Data key
Section titled “Data key”Send USDC on Polygon or Base to 0x2B1204Ed8152F888092cB4e25FeF6348C646C578 ($29 for 30 days, $290 for a year), then submit the transaction hash and your email at polystrike.xyz/#waitlist or [email protected]. Keys are issued by hand, usually within a few hours.
curl -A "my-app/1.0" -H "X-API-Key: ps_pro_..." https://polystrike.xyz/api/v1/meta/elonPay per call (x402)
Section titled “Pay per call (x402)”Call a data endpoint without a key. The response is HTTP 402 with the payment requirements in the PAYMENT-REQUIRED header. Pay $0.01 in USDC on Base and retry with the payment in X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (x402 v2).
The 402 body has five fields:
{ "error": "payment_required", "message": "This endpoint is part of the Data tier. Subscribe for $29/month ($290/year): ...", "pricing": "https://polystrike.xyz/#pricing", "docs": "https://polystrike.xyz/SKILL.md",}Endpoints
Section titled “Endpoints”{user} is elon, cruz or trump.
Data key or x402
Section titled “Data key or x402”| Endpoint | Returns | Reference |
|---|---|---|
GET /api/v1/meta/{user} | Counters and deltas for each open window | Elon, Cruz, Trump |
GET /api/v1/meta/elon/tweets, /api/v1/meta/cruz/tweets, /api/v1/meta/trump/posts | Recent posts, up to 100 per page, with is_counted | same |
GET /api/v1/prediction/{user} | Counters, posting pace and each bucket’s title and market_price; no forecasts | same |
GET /api/v1/history/{user}/counter | Counter snapshots over time | History |
GET /api/v1/history/{user}/prices | Bucket price snapshots | History |
GET /api/v1/history/{user}/books | Order-book snapshots | History |
GET /api/v1/history/{user}/tweets | Every post, deleted ones included, with the counted verdict | History |
Data key only
Section titled “Data key only”| Endpoint | Returns | Reference |
|---|---|---|
GET /api/v1/bulk/{user} | Full parquet archive for one account | History |
wss://polystrike.xyz/ws | Counter snapshots pushed as they are written | WebSocket |
| Endpoint | Returns | Reference |
|---|---|---|
GET /api/v1/health | {"timestamp": ..., "status": "ok"} | System |
POST /api/v1/waitlist | Contact form; also how to send a Data-key payment | System |
GET /api/v1/bulk/public | Parquet files older than 30 days, CC BY 4.0 | Public archive |
GET /api/v1/meta/crypto | Crypto price-market metadata (experimental) | Crypto |
Retired
Section titled “Retired”| Endpoint | Status |
|---|---|
GET /api/v1/signals/{user} | 410 not_sold since 2026-11-08 |
GET /api/v1/portfolio/elon, GET /api/v1/portfolio/elon/rebalancing | 410 not_sold since 2026-11-08 |
POST /api/v1/keys/free | 403 free_keys_paused since 2026-11-08 |
Forecasts, trading signals, position sizing and portfolio analysis are not part of the product. The retired endpoints answer 410 to every caller, before any payment is asked.
Response format
Section titled “Response format”Responses are JSON objects. Counter and price endpoints wrap the open windows in data:
{ "timestamp": 1790795280353, "freshness": "live", "freshness_delay_sec": 0, "data": [ ... ]}freshness is "live" and freshness_delay_sec is 0 for Data keys and x402 payers. Posts responses carry no freshness fields.
Freshness
Section titled “Freshness”| What | Figure |
|---|---|
@elonmusk: post published to counted | median 11.5 s, p90 12.6-15.1 s, p99 28.2 s, worst logged 631 s (measured on production 2026-07-29, for @elonmusk only) |
@tedcruz | polled every 5 s; no published post-to-count figure |
@realDonaldTrump (Truth Social) | read every ~15 s, or about every 5 minutes when the fast reader is blocked; no published post-to-count figure |
| Deletion flag on X | full timeline re-read every 10 minutes; a post missing from two re-reads in a row is flagged, so about 20 minutes after deletion |
| XTracker (not ours) | updates about every 5 minutes |
X’s timeline index needs about 10.8 s to list a new post, so polling @elonmusk harder does not move the median. These figures say how current a number is, not that it is tradeable: in our own paper testing, when a post pushed the count past a bucket boundary, the price had finished moving within about 2-3 seconds, before our feed had the post.
Other ways in
Section titled “Other ways in”- OpenAPI spec: polystrike.xyz/openapi.json, for generating clients.
- Agent reference: polystrike.xyz/SKILL.md, every endpoint, field and error in one file.
- MCP server: read-only tools for Claude and other MCP clients. See MCP Server Setup.