The external arbitrage endpoint delivers the same scored opportunity data as the session-auth endpoint, but it authenticates with an API key instead of a JWT. This design allows trading bots, automated pipelines, and server-side integrations to fetch opportunities without maintaining a browser session. Every request is logged for usage tracking, and consumption is visible in your Developer Console.
Endpoint
GET https://api.predexy.com/api/v1/external/arbitrage/opportunities
Authentication
Pass your API key in the X-API-Key header. Keys are prefixed with pdx_ and can be created in the Developer Console.
X-API-Key: pdx_a1b2c3d4e5f6...
Your API key is shown only once at creation. Store it in a secrets manager or environment variable — it cannot be retrieved again through the API.
Rate limits
API key requests are subject to the paid-tier rate limit:
| Tier | Requests / min | Burst |
|---|
| API key | 600 | 50 |
If you exceed this limit, the API returns 429 RATE_LIMITED with X-RateLimit-Reset indicating when the window resets.
Query parameters
Minimum arbitrage score to include. Range 0–100.
Filter by tier: actionable, informational, or noise.
Filter by market category, e.g. crypto, politics.
Filter by lifecycle status: active, stale, or resolved.
Filter by policy guarantee class: STRICT or QUASI.
Filter by runtime risk gate: allowed, degraded, or blocked.
Maximum items to return (1–200).
Example request
curl "https://api.predexy.com/api/v1/external/arbitrage/opportunities?classification=actionable&min_score=70&limit=20" \
-H "X-API-Key: pdx_a1b2c3d4e5f6..."
Response
The response shape is identical to the session-auth endpoint. data.opportunities is an array of ArbitrageOpportunity objects, and data.stats provides aggregate scan statistics. See ArbitrageOpportunity schema for the full field reference.
{
"data": {
"opportunities": [
{
"id": "arb_poly_limit_abc123",
"canonical_question_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"question_title": "Will BTC reach $100k by 2026?",
"question_slug": "will-btc-reach-100k-by-2026",
"category": "crypto",
"end_time": "2026-01-01T00:00:00Z",
"type": "direct",
"buy_platform": { "id": "...", "slug": "limitless", "name": "Limitless" },
"sell_platform": { "id": "...", "slug": "polymarket", "name": "Polymarket" },
"buy_price": 0.58,
"sell_price": 0.65,
"spread": 0.07,
"spread_bps": 700,
"net_spread": 0.03,
"estimated_profit": 3.00,
"arbitrage_score": 78,
"classification": "actionable",
"liquidity": 15000.00,
"volume24h": 52000.00,
"status": "active",
"guarantee": "STRICT",
"risk_gate_state": "allowed",
"risk_gate_reason": null,
"detected_at": "2026-04-25T14:22:00Z",
"fees": {
"buy_fee": 0.02,
"sell_fee": 0.02,
"total_fees": 0.04
}
}
],
"stats": {
"total_opportunities": 14,
"actionable_count": 5,
"informational_count": 9,
"avg_spread": 0.031,
"max_profit": 6.40,
"scanned_at": "2026-04-25T14:25:00Z"
}
},
"meta": {
"count": 14,
"offset": 0,
"limit": 20
}
}
Usage tracking
Every request to this endpoint is logged to your account’s usage record. You can inspect call counts, latency, and per-endpoint breakdowns in the Developer Console using the usage stats endpoints.
For high-frequency trading bots, filter aggressively at the query parameter level rather than in your application code. Requesting only classification=actionable&risk_gate=allowed&status=active dramatically reduces response size and parse time, and keeps you within rate limits for more polling cycles per minute.