Skip to content

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).

Data keyPay per call (x402)Open
Price$29 for 30 days, $290 for a year$0.01 per callfree
HowX-API-Key: ps_pro_... headerx402 payment header, no keynothing
Rate limit10,000 requests/hourno hourly cap-
Coversevery data endpoint, bulk parquet, WebSocketevery data endpoint except bulk parquet and the WebSocketthe endpoints listed under “Open” below

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.

Terminal window
curl -A "my-app/1.0" -H "X-API-Key: ps_pro_..." https://polystrike.xyz/api/v1/meta/elon

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",
"contact": "[email protected]"
}

{user} is elon, cruz or trump.

EndpointReturnsReference
GET /api/v1/meta/{user}Counters and deltas for each open windowElon, Cruz, Trump
GET /api/v1/meta/elon/tweets, /api/v1/meta/cruz/tweets, /api/v1/meta/trump/postsRecent posts, up to 100 per page, with is_countedsame
GET /api/v1/prediction/{user}Counters, posting pace and each bucket’s title and market_price; no forecastssame
GET /api/v1/history/{user}/counterCounter snapshots over timeHistory
GET /api/v1/history/{user}/pricesBucket price snapshotsHistory
GET /api/v1/history/{user}/booksOrder-book snapshotsHistory
GET /api/v1/history/{user}/tweetsEvery post, deleted ones included, with the counted verdictHistory
EndpointReturnsReference
GET /api/v1/bulk/{user}Full parquet archive for one accountHistory
wss://polystrike.xyz/wsCounter snapshots pushed as they are writtenWebSocket
EndpointReturnsReference
GET /api/v1/health{"timestamp": ..., "status": "ok"}System
POST /api/v1/waitlistContact form; also how to send a Data-key paymentSystem
GET /api/v1/bulk/publicParquet files older than 30 days, CC BY 4.0Public archive
GET /api/v1/meta/cryptoCrypto price-market metadata (experimental)Crypto
EndpointStatus
GET /api/v1/signals/{user}410 not_sold since 2026-11-08
GET /api/v1/portfolio/elon, GET /api/v1/portfolio/elon/rebalancing410 not_sold since 2026-11-08
POST /api/v1/keys/free403 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.

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.

WhatFigure
@elonmusk: post published to countedmedian 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)
@tedcruzpolled 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 Xfull 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.