Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/parlay-api-sse-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Parlay Sse API
description: Real-time sports odds aggregation from **33 books and data sources** updated every 2-120 seconds depending on source cadence.
version: 3.2.0
x-credit-currency: credits
x-credit-cost-catalogue-url: /v1/meta/credit-costs
x-pricing-url: /v1/pricing
x-usage-url: /v1/usage
contact:
name: ParlayAPI support
url: https://parlay-api.com/support
email: support@parlay-api.com
license:
name: ParlayAPI Terms of Service
url: https://parlay-api.com/terms
termsOfService: https://parlay-api.com/terms
servers:
- url: https://parlay-api.com
description: Production (primary; HTTP/2, TLS 1.3).
- url: https://api.parlay-api.com
description: Production (high-volume; bypasses Cloudflare edge for trading bots above 30 req/min). Same origin, same auth, same endpoints.
tags:
- name: Sse
paths:
/v1/sse/odds/{sport_key}:
get:
summary: Sse Odds
description: 'Business+ tier SSE endpoint. Same data feed as /ws/odds, just streamed
as text/event-stream so corporate proxies / browser EventSource /
HTTP-only environments work without a WebSocket upgrade.
Auth takes the X-API-Key header, an Authorization: Bearer header, or
?apiKey= (EventSource in a browser cannot set headers). Headers win when
both are present.
Each event is a single JSON line in the standard SSE shape:
data: {"type": "odds_update", "sport_key": "...", ...}\n\n
Heartbeat every 5s by default to prove the stream is live through
corporate proxies and browser EventSource clients. Initial state and
source freshness are sent immediately on connect.'
operationId: sse_odds_v1_sse_odds__sport_key__get
parameters:
- name: sport_key
in: path
required: true
schema:
type: string
title: Sport Key
- name: apiKey
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: API key. Prefer the X-API-Key header, which keeps the key out of URLs and logs; browser EventSource cannot set headers, so this stays supported.
title: Apikey
description: API key. Prefer the X-API-Key header, which keeps the key out of URLs and logs; browser EventSource cannot set headers, so this stays supported.
- name: event_id
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: 'Optional: filter to one game''s event_id'
title: Event Id
description: 'Optional: filter to one game''s event_id'
- name: bookmakers
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Comma-separated books, e.g. fanduel,pinnacle
title: Bookmakers
description: 'Comma-separated books, e.g. fanduel,pinnacle Repeating this parameter is the same as the comma form: ?markets=h2h&markets=spreads and ?markets=h2h,spreads are one request, billed identically, and return the union. A value repeated across occurrences is counted once.'
style: form
explode: false
- name: markets
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Comma-separated prop market keys, e.g. player_points,player_rebounds
title: Markets
description: 'Comma-separated prop market keys, e.g. player_points,player_rebounds Repeating this parameter is the same as the comma form: ?markets=h2h&markets=spreads and ?markets=h2h,spreads are one request, billed identically, and return the union. A value repeated across occurrences is counted once.'
style: form
explode: false
- name: kinds
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: 'Comma-separated row kinds: game,prop'
title: Kinds
description: 'Comma-separated row kinds: game,prop'
- name: heartbeat_s
in: query
required: false
schema:
type: integer
maximum: 30
minimum: 1
description: SSE heartbeat seconds
default: 5
title: Heartbeat S
description: SSE heartbeat seconds
- name: limit
in: query
required: false
schema:
type: integer
maximum: 1000
minimum: 1
description: Initial snapshot row limit
default: 500
title: Limit
description: Initial snapshot row limit
- name: since
in: query
required: false
schema:
anyOf:
- type: integer
- type: 'null'
description: Resume from this timestamp_ms. Skips initial replay of rows older than this.
title: Since
description: Resume from this timestamp_ms. Skips initial replay of rows older than this.
- name: diff
in: query
required: false
schema:
type: boolean
description: If true, frames after initial_state include only fields that changed since the last frame for the same (event_id, bookmaker, market_key) tuple
default: false
title: Diff
description: If true, frames after initial_state include only fields that changed since the last frame for the same (event_id, bookmaker, market_key) tuple
- name: max_age_s
in: query
required: false
schema:
type: integer
maximum: 3600
minimum: 1
description: Drop initial_state rows older than this many seconds. Defaults to the same 600s freshness bound /odds enforces.
default: 600
title: Max Age S
description: Drop initial_state rows older than this many seconds. Defaults to the same 600s freshness bound /odds enforces.
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
tags:
- Sse
/v1/sse/hot/{sport_key}:
get:
summary: Sse Odds
description: 'Business+ tier SSE endpoint. Same data feed as /ws/odds, just streamed
as text/event-stream so corporate proxies / browser EventSource /
HTTP-only environments work without a WebSocket upgrade.
Auth takes the X-API-Key header, an Authorization: Bearer header, or
?apiKey= (EventSource in a browser cannot set headers). Headers win when
both are present.
Each event is a single JSON line in the standard SSE shape:
data: {"type": "odds_update", "sport_key": "...", ...}\n\n
Heartbeat every 5s by default to prove the stream is live through
corporate proxies and browser EventSource clients. Initial state and
source freshness are sent immediately on connect.'
operationId: sse_odds_v1_sse_hot__sport_key__get
parameters:
- name: sport_key
in: path
required: true
schema:
type: string
title: Sport Key
- name: apiKey
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: API key. Prefer the X-API-Key header, which keeps the key out of URLs and logs; browser EventSource cannot set headers, so this stays supported.
title: Apikey
description: API key. Prefer the X-API-Key header, which keeps the key out of URLs and logs; browser EventSource cannot set headers, so this stays supported.
- name: event_id
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: 'Optional: filter to one game''s event_id'
title: Event Id
description: 'Optional: filter to one game''s event_id'
- name: bookmakers
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Comma-separated books, e.g. fanduel,pinnacle
title: Bookmakers
description: 'Comma-separated books, e.g. fanduel,pinnacle Repeating this parameter is the same as the comma form: ?markets=h2h&markets=spreads and ?markets=h2h,spreads are one request, billed identically, and return the union. A value repeated across occurrences is counted once.'
style: form
explode: false
- name: markets
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: Comma-separated prop market keys, e.g. player_points,player_rebounds
title: Markets
description: 'Comma-separated prop market keys, e.g. player_points,player_rebounds Repeating this parameter is the same as the comma form: ?markets=h2h&markets=spreads and ?markets=h2h,spreads are one request, billed identically, and return the union. A value repeated across occurrences is counted once.'
style: form
explode: false
- name: kinds
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: 'Comma-separated row kinds: game,prop'
title: Kinds
description: 'Comma-separated row kinds: game,prop'
- name: heartbeat_s
in: query
required: false
schema:
type: integer
maximum: 30
minimum: 1
description: SSE heartbeat seconds
default: 5
title: Heartbeat S
description: SSE heartbeat seconds
- name: limit
in: query
required: false
schema:
type: integer
maximum: 1000
minimum: 1
description: Initial snapshot row limit
default: 500
title: Limit
description: Initial snapshot row limit
- name: since
in: query
required: false
schema:
anyOf:
- type: integer
- type: 'null'
description: Resume from this timestamp_ms. Skips initial replay of rows older than this.
title: Since
description: Resume from this timestamp_ms. Skips initial replay of rows older than this.
- name: diff
in: query
required: false
schema:
type: boolean
description: If true, frames after initial_state include only fields that changed since the last frame for the same (event_id, bookmaker, market_key) tuple
default: false
title: Diff
description: If true, frames after initial_state include only fields that changed since the last frame for the same (event_id, bookmaker, market_key) tuple
- name: max_age_s
in: query
required: false
schema:
type: integer
maximum: 3600
minimum: 1
description: Drop initial_state rows older than this many seconds. Defaults to the same 600s freshness bound /odds enforces.
default: 600
title: Max Age S
description: Drop initial_state rows older than this many seconds. Defaults to the same 600s freshness bound /odds enforces.
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
tags:
- Sse
components:
schemas:
ValidationError:
properties:
loc:
items:
anyOf:
- type: string
- type: integer
type: array
title: Location
msg:
type: string
title: Message
type:
type: string
title: Error Type
input:
title: Input
ctx:
type: object
title: Context
type: object
required:
- loc
- msg
- type
title: ValidationError
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
securitySchemes:
apiKeyHeader:
type: apiKey
in: header
name: X-API-Key
description: API key passed in the X-API-Key header. Recommended.
apiKeyQuery:
type: apiKey
in: query
name: apiKey
description: API key passed as the ?apiKey= query parameter. Useful for browser fetch() and webhooks where header control is limited. Equivalent to X-API-Key.
bearerAuth:
type: http
scheme: bearer
bearerFormat: APIKey
description: 'API key passed via Authorization: Bearer <key>. Equivalent to X-API-Key for compatibility with auth libraries that expect bearer tokens.'