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

# Cross-venue arbitrage opportunities from the Arb Bets feed

> Server-side proxy to the Arb Bets vendor feed, called with a Kairos-held key so the credential never reaches a client. Fixed vendor parameters: $100 investment, 1.0% minimum profit. The body is the vendor's payload passed through unchanged — Kairos does not normalize it, and its shape is owned by the vendor. Note the **trailing slash**: the route is registered at `/arb-bets/`, and `/arb-bets` redirects.




## OpenAPI

````yaml /openapi/data-api.yaml get /arb-bets/
openapi: 3.1.0
info:
  title: Kairos Data API
  version: 1.0.0
  summary: >-
    The full Kairos data plane — markets, candles, trades, search, discover,
    sports, trader analytics, and PnL.
  description: |
    The Kairos Data API at `data.kairos.trade` is the platform's primary data
    plane: market metadata and prices, OHLCV candles, live venue trade proxies,
    normalized trade history, full-text search, discovery feeds, the sports
    catalog, public trader analytics, and account PnL.

    ## Authentication

    Most endpoints accept a Kairos **API key** (`X-Client-Id` + `X-Api-Key` +
    `X-Api-Secret`, all three) or a first-party session JWT. Endpoints tagged
    `public` (trader analytics, provider configs, several sports feeds) need
    no credentials at all. Some endpoints additionally require an API-key
    **scope** (`trade:read`, `position:read`) — stated per operation.

    For high-volume market-data consumption (candles/trades/metadata at
    scale), prefer the dedicated **Market Data API** at `md.kairos.trade` —
    it has higher budgets, ETag caching, and a binary candle format.

    ## Rate limits

    Rate limits use a sliding window keyed on the authenticated user (JWT
    `sub`) or, for anonymous callers, the trusted client IP. Routes belong to
    a named **bucket** (`x-kairos-bucket`) whose per-minute budget is shared
    by every route in it; routes with no bucket run under the service default
    of 100/minute. `x-kairos-rate-limit` states the bucket's compile-time
    default — operators can raise or lower a bucket at runtime, so treat the
    documented number as the baseline, not a contract. 429 responses carry
    `Retry-After` and `X-RateLimit-*`.

    ## Conventions

    - Prices are on the **0–100 cents scale** unless a field says otherwise
      (trader-analytics position/trade prices use the 0–1 scale; each field's
      description states its scale).
    - Errors: `{"detail": "<message>"}` for handler errors; FastAPI's
      standard validation envelope for 422s. Errors surfaced from a venue
      adapter instead use `{"error", "provider", "operation", "message"}` —
      see `DataProviderError`. Unhandled failures always return the generic
      500 body; internal details are logged, never returned.
    - Every request body is capped at 8 MiB service-wide (413).
  contact:
    name: Kairos
    url: https://app.kairos.trade/docs/api-reference
  termsOfService: https://kairos.trade/terms
servers:
  - url: https://data.kairos.trade
    description: Production
  - url: https://staging-data.kairos.trade
    description: Staging
security:
  - apiKeyClientId: []
    apiKeyKey: []
    apiKeySecret: []
paths:
  /arb-bets/:
    get:
      tags:
        - Markets
      summary: Cross-venue arbitrage opportunities from the Arb Bets feed
      description: >
        Server-side proxy to the Arb Bets vendor feed, called with a Kairos-held
        key so the credential never reaches a client. Fixed vendor parameters:
        $100 investment, 1.0% minimum profit. The body is the vendor's payload
        passed through unchanged — Kairos does not normalize it, and its shape
        is owned by the vendor. Note the **trailing slash**: the route is
        registered at `/arb-bets/`, and `/arb-bets` redirects.
      operationId: getArbOpportunities
      responses:
        '200':
          description: Vendor payload, passed through.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ArbBetsResponse'
        '401':
          $ref: '#/components/responses/DataUnauthorized'
        '429':
          $ref: '#/components/responses/DataRateLimited'
        '500':
          description: No Arb Bets key is configured on this deployment.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataError'
              example:
                detail: Arb Bets API key not configured
        '503':
          description: Kairos' vendor credential was rejected upstream.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataError'
              example:
                detail: Arb Bets is down right now. Please check back later.
        default:
          description: >-
            Any other upstream failure is passed through with the vendor's
            status code.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataError'
              example:
                detail: 'Arb Bets API error: 502'
components:
  schemas:
    ArbBetsResponse:
      type: object
      description: >
        Vendor payload, passed through unchanged. Fields are documented as
        observed — the vendor owns this shape and can change it without a Kairos
        deploy.
      properties:
        success:
          type: boolean
        generated_at:
          type: string
        investment_amount:
          type: number
        min_profit_filter:
          type: number
        total_markets_analyzed:
          type: integer
        total_arbitrages_found:
          type: integer
        markets_skipped:
          type: integer
        skip_reasons:
          type: object
          additionalProperties:
            type: integer
        profitable_count:
          type: integer
        profitable_arbitrages:
          type: array
          items:
            $ref: '#/components/schemas/ArbBetsOpportunity'
    DataError:
      type: object
      description: Handler error envelope (FastAPI HTTPException).
      required:
        - detail
      properties:
        detail:
          type: string
          description: Human-readable error message.
          example: Invalid provider
    ArbBetsOpportunity:
      type: object
      properties:
        kalshi_id:
          type: string
        poly_clob_token_ids:
          type: array
          items:
            type: string
        market_name_a:
          type: string
        market_name_b:
          type: string
        platform_a:
          type: string
        platform_b:
          type: string
        url_a:
          type: string
        url_b:
          type: string
        volume_a:
          type: number
        volume_b:
          type: number
        best_arbitrage:
          $ref: '#/components/schemas/ArbBetsStrategy'
    ArbBetsStrategy:
      type: object
      description: The two-leg bet the vendor scored as best for this opportunity.
      properties:
        combination:
          type: string
        platform_1:
          type: string
        side_1:
          type: string
          enum:
            - 'Yes'
            - 'No'
        price_1:
          type: number
        bet_amount_1:
          type: number
        payout_1:
          type: number
        platform_2:
          type: string
        side_2:
          type: string
          enum:
            - 'Yes'
            - 'No'
        price_2:
          type: number
        bet_amount_2:
          type: number
        payout_2:
          type: number
        total_prob:
          type: number
          description: Combined implied probability. Below 1 is what makes the pair an arb.
        gross_profit:
          type: number
        net_profit:
          type: number
        roi_percent:
          type: number
        fees:
          type: number
  responses:
    DataUnauthorized:
      description: >
        No valid credential presented — missing/invalid API-key headers, or an
        invalid/expired session token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/DataError'
          example:
            detail: Not authenticated
    DataRateLimited:
      description: >
        Rate limit exceeded for this route's sliding window, keyed on the
        session `sub` when

        authenticated and on the trusted client IP otherwise. Honor
        `Retry-After`. A per-API-key

        data ceiling (set per credential) rejects with `{"detail": "API key data
        rate limit

        exceeded"}` instead of the `error` envelope below.
      headers:
        Retry-After:
          schema:
            type: integer
        X-RateLimit-Limit:
          schema:
            type: integer
        X-RateLimit-Remaining:
          schema:
            type: integer
        X-RateLimit-Reset:
          schema:
            type: integer
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: 'Rate limit exceeded: 100 per 1 minute'
  securitySchemes:
    apiKeyClientId:
      type: apiKey
      in: header
      name: X-Client-Id
      description: >-
        Credential client id (`kairos_ck_...`). Must be sent together with
        X-Api-Key and X-Api-Secret.
    apiKeyKey:
      type: apiKey
      in: header
      name: X-Api-Key
      description: 64-char hex API key.
    apiKeySecret:
      type: apiKey
      in: header
      name: X-Api-Secret
      description: 64-char hex API secret.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.