API Overview
The Polystrike API is designed for low-latency access to prediction market metadata and signals.
Infrastructure
Section titled “Infrastructure”All endpoints are hosted on high-performance bare-metal servers to ensure maximum uptime and minimal response times.
Base URL: https://polystrike.xyz/api/v1
Data Freshness
Section titled “Data Freshness”Measured on production, 2026-07-29. These are observed numbers, not design targets.
| Data | Cadence / latency |
|---|---|
| Tweet detection (post published → counted) | p50 11.5s, p90 12.6–15.1s, p99 28.2s, worst observed 631s |
| X timeline poll | 1s for @elonmusk, 5s for other tracked accounts |
| Engagement-metric refresh (likes/reposts) | full timeline re-read every 10 min |
| Deletion confirmation | absent from 2 consecutive re-reads → ~20 min |
real_counter and the deltas | recomputed as each qualifying post lands |
prediction/* and signals/* model outputs | 60s inside an event’s final 24h, 300s otherwise |
market_price (Polymarket CLOB order book) | 2s poll loop across tracked tokens; it cycles many tokens, so effective per-token resolution is ~40s |
| XTracker settlement oracle (not ours) | roughly 5 min |
Notes that matter when you build against this:
- X’s index is the floor. X’s REST timeline needs ~10.8s at minimum to list a new post, and the latency is quantized. We already poll faster than X publishes, so polling harder does not move the median.
- Engagement metrics lag by one cycle. Likes and reposts are zero when a post is first seen — it is seconds old. The 10-minute re-read fills in the real values.
- A filtered-stream push path exists but is not serving. Measured head-to-head over 4 days it detects at p50 6.3s, ~5.2s faster than the poller. Today it runs as a measurement path and does not write the counters these endpoints read. The poller is retained either way: a push stream cannot observe a deletion.
- Latency is not edge. Our own paper testing measured that when a count boundary breaks, the price collapse completes in roughly 2–3 seconds — upstream of both feeds. We are not winning that race and do not market these figures as if we were.
Authentication
Section titled “Authentication”Endpoints are either Public (no key needed) or Pro (requires X-API-Key header).
- Public (Anonymous): Free access to metadata/counters. Rate limited to 100 requests/hour.
- Pro ($79/mo): Full access to predictions, signals, and portfolio analysis. Rate limited to 10,000 requests/hour.
Access Methods
Section titled “Access Methods”Direct HTTP API (this documentation):
curl -H "X-API-Key: ps_pro_..." https://polystrike.xyz/api/v1/prediction/elonOpenAPI Specification (for automated discovery):
curl https://polystrike.xyz/openapi.jsonThe OpenAPI spec provides machine-readable documentation of all endpoints, parameters, authentication schemes, and response types. Use it to:
- Generate client libraries in any language
- Integrate with AI agents and automated systems
- Understand the API structure programmatically
MCP Server (for Claude Desktop users): Natural language access through the Model Context Protocol. See MCP Server Setup for configuration.
To upgrade to Pro:
- Telegram: @dizpers
- X: @dizpers
- Email:
[email protected](Subject: Polystrike PRO)
Response Format
Section titled “Response Format”All responses are standard JSON. Timestamps are UTC Milliseconds.
{ "timestamp": 1770188662000, "data": [ ... ]}Rate Limits
Section titled “Rate Limits”| Tier | Limit |
|---|---|
| Anonymous | 100 req/hour (by IP) |
| Pro | 10,000 req/hour (by Key) |
Feature Comparison by Tier
Section titled “Feature Comparison by Tier”Below is the exact field visibility for each endpoint.
GET /meta/elon — Public (No Key, Rate Limited)
Section titled “GET /meta/elon — Public (No Key, Rate Limited)”| Field | Anonymous | Pro |
|---|---|---|
event_id | ✅ | ✅ |
event_title | ✅ | ✅ |
start_ts | ✅ | ✅ |
end_ts | ✅ | ✅ |
polymarket_xtracker_counter | ✅ | ✅ |
real_counter | ✅ | ✅ |
polymarket_ui_counter | ✅ | ✅ |
settlement_delta | ✅ | ✅ |
display_delta | ✅ | ✅ |
internal_delta | ✅ | ✅ |
GET /meta/elon/tweets — Public (Rate Limited)
Section titled “GET /meta/elon/tweets — Public (Rate Limited)”| Field | Anonymous | Pro |
|---|---|---|
tweet_id | ✅ | ✅ |
text | ✅ | ✅ |
created_ts | ✅ | ✅ |
referenced_text | ✅ | ✅ |
referenced_author_id | ✅ | ✅ |
is_reply | ✅ | ✅ |
is_quote | ✅ | ✅ |
is_retweet | ✅ | ✅ |
is_counted | null | ✅ |
GET /prediction/elon — Public (Rate Limited)
Section titled “GET /prediction/elon — Public (Rate Limited)”| Field | Anonymous | Pro |
|---|---|---|
event_id | ✅ | ✅ |
event_title | ✅ | ✅ |
polymarket_xtracker_counter | ✅ | ✅ |
polymarket_ui_counter | ✅ | ✅ |
real_counter | ✅ | ✅ |
settlement_delta | ✅ | ✅ |
display_delta | ✅ | ✅ |
internal_delta | ✅ | ✅ |
seconds_remaining | ✅ | ✅ |
markets[].title | ✅ | ✅ |
markets[].market_price | ✅ | ✅ |
sleep_probability | ❌ | ✅ |
velocity_counted_1h | ❌ | ✅ |
velocity_all_1h | ❌ | ✅ |
markets[].model_prob | ❌ | ✅ |
forecast.p5 | ❌ | ✅ |
forecast.p50 | ❌ | ✅ |
forecast.p95 | ❌ | ✅ |
markets[].edge | ❌ | ✅ |
markets[].signal | ❌ | ✅ |
Changed 2026-07-23:
sleep_probabilityand thevelocity_counted_1h/velocity_all_1hprojection inputs moved to Pro (previously free), so a free consumer can no longer reconstruct the model’s late-window projection. Free still gets all counters/deltas,seconds_remaining, and per-bucketmarket_price.
GET /signals/elon — Pro Only (401 without key)
Section titled “GET /signals/elon — Pro Only (401 without key)”Optional query parameter: ?bankroll=100 — sizes suggested_bet to your bankroll via Kelly criterion.
| Field | Anonymous | Pro |
|---|---|---|
event_id | ❌ 401 | ✅ |
event_title | ❌ 401 | ✅ |
signals[].bucket | ❌ 401 | ✅ |
signals[].action | ❌ 401 | ✅ |
signals[].model_prob | ❌ 401 | ✅ |
signals[].market_price | ❌ 401 | ✅ |
signals[].edge | ❌ 401 | ✅ |
signals[].ev | ❌ 401 | ✅ |
signals[].kelly_fraction | ❌ 401 | ✅ |
signals[].suggested_bet | ❌ 401 | ✅ (sized to ?bankroll if provided) |
signals[].confidence | ❌ 401 | ✅ |
signals[].moneyness | ❌ 401 | ✅ |
signals[].time_confidence | ❌ 401 | ✅ |
signals[].asymmetry_edge | ❌ 401 | ✅ |
signals[].reasons | ❌ 401 | ✅ |
signals[].bankroll | ❌ 401 | ✅ |
GET /portfolio/elon?wallet=0x… — Pro Only (401 without key)
Section titled “GET /portfolio/elon?wallet=0x… — Pro Only (401 without key)”| Field | Anonymous | Pro |
|---|---|---|
wallet | ❌ 401 | ✅ |
event.id | ❌ 401 | ✅ |
event.title | ❌ 401 | ✅ |
event.end_ts | ❌ 401 | ✅ |
prediction.p5 / p50 / p95 | ❌ 401 | ✅ |
prediction.real_counter | ❌ 401 | ✅ |
prediction.seconds_remaining | ❌ 401 | ✅ |
positions[].event_id | ❌ 401 | ✅ |
positions[].bucket | ❌ 401 | ✅ |
positions[].tokens | ❌ 401 | ✅ |
positions[].avg_price | ❌ 401 | ✅ |
positions[].cost_basis | ❌ 401 | ✅ |
positions[].current_price | ❌ 401 | ✅ |
positions[].current_value | ❌ 401 | ✅ |
positions[].pnl | ❌ 401 | ✅ |
positions[].pnl_percent | ❌ 401 | ✅ |
positions[].analysis.win_probability | ❌ 401 | ✅ |
positions[].analysis.market_implied | ❌ 401 | ✅ |
positions[].analysis.edge | ❌ 401 | ✅ |
positions[].analysis.edge_percent | ❌ 401 | ✅ |
positions[].analysis.signal | ❌ 401 | ✅ |
positions[].analysis.recommendation | ❌ 401 | ✅ |
portfolio.total_positions | ❌ 401 | ✅ |
portfolio.total_cost | ❌ 401 | ✅ |
portfolio.current_value | ❌ 401 | ✅ |
portfolio.total_pnl | ❌ 401 | ✅ |
portfolio.total_pnl_percent | ❌ 401 | ✅ |