> ## Documentation Index
> Fetch the complete documentation index at: https://docs.revalonlabs.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# External Arbitrage API — API Key Access

> Access Predexy's arbitrage opportunity feed with an API key instead of a session JWT. Designed for trading bots, automated scripts, and paid integrations.

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](/api-reference/api-keys).

```
X-API-Key: pdx_a1b2c3d4e5f6...
```

<Warning>
  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.
</Warning>

## 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

<ParamField query="min_score" type="number" default="40">
  Minimum arbitrage score to include. Range 0–100.
</ParamField>

<ParamField query="classification" type="string">
  Filter by tier: `actionable`, `informational`, or `noise`.
</ParamField>

<ParamField query="category" type="string">
  Filter by market category, e.g. `crypto`, `politics`.
</ParamField>

<ParamField query="status" type="string">
  Filter by lifecycle status: `active`, `stale`, or `resolved`.
</ParamField>

<ParamField query="guarantee" type="string">
  Filter by policy guarantee class: `STRICT` or `QUASI`.
</ParamField>

<ParamField query="risk_gate" type="string">
  Filter by runtime risk gate: `allowed`, `degraded`, or `blocked`.
</ParamField>

<ParamField query="limit" type="number" default="50">
  Maximum items to return (1–200).
</ParamField>

## Example request

```bash cURL theme={null}
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](/api-reference/arbitrage-opportunities#arbitrageopportunity-schema) for the full field reference.

```json theme={null}
{
  "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](/api-reference/usage-stats).

<Tip>
  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.
</Tip>
