Las cuotas deportivas
en una sola API
Cuotas normalizadas de decenas de casas — incluidas las italianas que las APIs globales no tienen — en un formato JSON estable. Para tus modelos, bots y herramientas.
# una petición, todas las cuotas de un evento curl "https://odss-api.com/api/v1/odds?sport=calcio&league=serie%20a" \ -H "x-api-key: odss_live_..." { "count": 118, "offset": 0, "returned": 118, "state": "prematch", "odds": [{ "event_id": "a3f9c1e07b2d4865", "event": "Inter - Milan", "league": "Serie A", "market": "1x2", "commence_time": "2026-08-23T18:45:00Z", "bookmakers": [ { "key":"snai", "outcomes":{"HOME":2.10,"DRAW":3.40,"AWAY":3.60}, "last_update":"2026-07-14T10:32:05Z" }, { "key":"bet365", "outcomes":{"HOME":2.05,"DRAW":3.50,"AWAY":3.70}, "last_update":"2026-07-14T10:28:12Z" } ]}]}
Casas en el feed
Tres pasos para integrar las cuotas
Crea la clave
Regístrate y genera una clave odss_live en un minuto. El plan Free es para siempre, sin tarjeta.
Llama a /odds
Un endpoint, todas las cuotas cross-book por evento y mercado. Filtra por deporte, liga, mercado y casa.
Integra y sincroniza
event_id estable para reconocer eventos, last_update para la frescura, offset para leer todo el calendario.
El foso: las casas italianas.
Las casas ADM que las APIs globales no tienen
Sisal, SNAI, Eurobet, GoldBet, Planetwin365, Betflag y decenas de casas italianas más, leídas directamente. Además de bet365, Betfair Exchange y Pinnacle como referencia sharp.
Esquema estable
Un formato JSON público y versionado: la forma interna del motor nunca llega a tu código.
Integración fiable
event_id determinista durante toda la ventana prepartido, last_update ISO por casa, paginación con offset: sincronizaciones sin sorpresas.
Frescura honesta
Las casas italianas giran en ciclo continuo y la frescura real está medida y pública, casa por casa, en la status page; bet365 y Betfair llegan vía feeds de partners con cadencia de unos minutos. Cada cuota declara su last_update: nada de números caducados vestidos de live.
La comparación honesta.
Dónde estamos frente a las APIs globales y la media del mercado. Sin nombres, sin promesas.
Comparación con la media de los proveedores globales/enterprise evaluados (jul 2026). Nuestro lado es verificable desde los endpoints públicos y la documentación.
Casas & ligas
Números en vivo, contados desde el feed ahora mismo — no un inventario de catálogo.
—
casas activas en el feed
—
deportes cotizados ahora
—
ligas en el tablero
Las ligas en el tablero ahora
Datos en vivo del feed (endpoint público /api/v1/leagues): para cada deporte, las ligas cotizadas en este momento. Los nombres son los valores del filtro league.
Cargando el calendario…
El tablero sigue la temporada: en verano el fútbol de clubes es naturalmente menor.
Documentación
Base URL https://odss-api.com. Autentícate con la cabecera x-api-key: odss_live_… o Authorization: Bearer. Respuestas JSON, cuotas decimales europeas.
Primera llamada en 3 pasos
Crea la clave
Regístrate y genera una clave en el panel. El plan Free es para siempre.
Lista los deportes
Verifica la clave con una llamada a /sports.
Pide las cuotas
Llama a /odds con deporte y mercado: recibes las cuotas cross-book.
GET /api/v1/odds ejemplo
curl "https://odss-api.com/api/v1/odds?sport=calcio&league=serie%20a&limit=5" \ -H "x-api-key: odss_live_..."
const r = await fetch(
"https://odss-api.com/api/v1/odds?sport=calcio&league=serie%20a&limit=5",
{ headers: { "x-api-key": "odss_live_..." } }
);
const { count, odds } = await r.json();
import requests
r = requests.get(
"https://odss-api.com/api/v1/odds",
params={"sport": "calcio", "league": "serie a", "limit": 5},
headers={"x-api-key": "odss_live_..."},
)
data = r.json() # { count, offset, returned, state, odds: [...] }
GET /api/v1/odds
Las cuotas cross-book actuales, agrupadas por evento, mercado y línea. Cada registro lista las casas con sus resultados y el timestamp de su última actualización.
Parámetros
| Parámetro | Descripción |
|---|---|
| sport | Filtro exacto de deporte (ej. calcio, tennis, basket). Valores: ver /api/v1/sports. |
| market | Mercado canónico: 1x2, ou, btts, dc, handicap, moneyline… |
| bookmakers | Lista CSV de claves de casa (ej. snai,bet365). Valores: ver /api/v1/bookmakers. |
| league | Filtro por subcadena, sin distinguir mayúsculas (ej. serie a). Valores: ver /api/v1/leagues. |
| event_id | Un solo evento, por id exacto. |
| state | prematch (por defecto), live (in-play, con marcador y minuto) o all (ambos). Con live, si el motor in-play está apagado la lista está vacía y live_enabled=false. Si la clave tiene un ámbito de feed (solo prematch o solo live), un state fuera del ámbito devuelve 403 y all degrada al estado permitido. |
| limit | Registros por página. Por defecto 500, máx. 2000. |
| offset | Índice de inicio para la paginación. Por defecto 0. |
Campos de la respuesta
| Campo | Descripción |
|---|---|
| count | Total de registros que cumplen los filtros (en todas las páginas). |
| offset · returned | Eco del offset pedido y registros devueltos en esta página. |
| odds[].event_id | Id determinista del evento: idéntico para todos los mercados del mismo partido y estable durante toda la ventana prepartido. |
| odds[].event | Nombre normalizado del evento (Local - Visitante). |
| odds[].sport · league | Deporte y liga/competición del evento. |
| odds[].home_team · away_team | Los dos equipos, cuando están disponibles. |
| odds[].commence_time | Inicio del evento, ISO 8601 UTC. |
| odds[].market · line · scope · period | Mercado canónico, línea opcional (ej. 2.5), ámbito (ej. equipo) y periodo (ej. 1ª parte). |
| odds[].state · score · minute | state = prematch o live. Para el live: score (ej. "1-0") y minute (ej. "63'") actuales. Mismo event_id que el prematch → correlaciona el mismo partido en ambos estados. |
| …bookmakers[].key | Clave de la casa, con country, playable_it e is_exchange. |
| …bookmakers[].outcomes | Mapa resultado → cuota decimal (ej. HOME: 2.10). |
| …bookmakers[].last_update | Timestamp ISO de la última actualización correcta de esa casa. |
Paginación
Repite la llamada aumentando offset en returned, mientras offset + returned < count. El tablero está vivo: count puede variar ligeramente entre páginas.
GET /api/v1/odds?sport=calcio&limit=1000&offset=0
GET /api/v1/odds?sport=calcio&limit=1000&offset=1000
# … finché offset + returned < count
GET /api/v1/sports
Los deportes disponibles ahora mismo en el feed (los valores del parámetro sport).
GET /api/v1/bookmakers
Las casas activas en el feed, con country, playable_it (false para referencias sharp como Pinnacle) e is_exchange (comisión sobre la ganancia).
GET /api/v1/leagues público, sin clave
El calendario actual agregado: para cada deporte las ligas cotizadas, con número de eventos y de casas. Útil para descubrir valores del filtro league.
GET /api/v1/stream Enterprise
Server-Sent Events: un evento hello al conectar, luego eventos odds con los registros CAMBIADOS (mismo esquema que /odds, cada uno con su state) y los eliminados, en un máximo de ~10 segundos desde que el motor los detecta — sin polling. Parámetros opcionales sport y state (prematch|live|all); snapshot inicial vía GET /odds?state=…. La cadencia de los datos sigue siendo la del motor (frescura por casa medida en la status page; bet365/Betfair vía feeds partner): el stream elimina la latencia de polling, manda last_update. Máx. 3 streams concurrentes; la conexión cuenta como 1 petición de cuota.
GET /api/v1/coverage público, sin clave
Inventario del catálogo de casas por región. Es un recuento de catálogo, no la lista de casas activas en el feed: para eso usa /api/v1/bookmakers o /api/v1/leagues.
POST /api/mcp MCP
Servidor MCP (JSON-RPC 2.0) para agentes IA y conectores (Claude, ChatGPT…). Autenticación con la misma clave (Authorization: Bearer odss_live_… o x-api-key). Herramientas: get_odds (con state=live), list_sports, list_bookmakers, list_leagues. Solo tools/call consume cuota; el handshake es gratis. Stateless.
curl -X POST https://odss-api.com/api/mcp \
-H "Authorization: Bearer odss_live_..." -H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"get_odds","arguments":{"sport":"calcio","state":"live","limit":5}}}'
Webhook Enterprise
Registra una URL (https) desde el panel o vía API — POST /api/account/webhooks con la sesión de cuenta (body {url, sport?, state?}; el secret se muestra una vez, máx. 20 por cuenta) — y recibe los cambios de cuota por POST — mismo payload {changed, removed} que el stream. Cada entrega va firmada: X-Odss-Signature: t=<unix>,v1=<hex> = HMAC-SHA256 de «{timestamp}.{body}» con el secreto (verifícala, rechaza timestamps viejos). Solo https, sin redirecciones; los endpoints que fallan se autodesactivan. Responde 2xx.
Límites, cabeceras y errores
Cada respuesta autenticada incluye X-RateLimit-Limit (cuota mensual del plan) y X-RateLimit-Remaining. La cuota es una ventana móvil de 30 días.
| Status | Descripción |
|---|---|
| 401 | Clave ausente, no válida o revocada. |
| 403 | Fuera de ámbito: cuenta suspendida, feed fuera del ámbito de la clave (ej. live con clave solo-prematch) o función exclusiva de Enterprise (stream, webhooks). |
| 429 | Burst: superadas las peticiones por minuto del plan. Cabecera Retry-After: 60. |
| 429 | Cuota mensual agotada: sube de plan o espera la ventana. |
| 502 | Feed temporalmente no disponible: reintenta con backoff. |
Machine-readable · contrato y agentes
Para generar clientes, SDKs o usar la API desde un agente IA: el contrato OpenAPI 3.1 y una guía breve para LLM son públicos y siempre sincronizados.
| Campo | Descripción |
|---|---|
| /openapi.json | Contrato OpenAPI 3.1 (endpoints, parámetros, esquemas, auth x-api-key). |
| /llms.txt | Guía markdown para LLM (llmstxt.org): resumen y enlaces a recursos. |
| /postman_collection.json | Colección Postman: impórtala y define la variable x-api-key para probar los endpoints al momento. |
| /sdk/odss_api.py | SDK de Python oficial (un solo archivo, sin dependencias): cliente tipado con paginación automática y soporte live. |
| /sdk/odss-api.ts | SDK de TypeScript oficial (un solo archivo, sin dependencias): tipos, iterador async y helper para el stream SSE. |
| /.well-known/api-catalog | Catálogo de API (RFC 9727, linkset JSON). |
Licencia de uso
El uso interno (modelos, bots, análisis, backtests) está incluido en todos los planes. Redistribuir los datos — p. ej. mostrarlos a los usuarios finales de tu producto — requiere autorización escrita: escribe a [email protected] y definimos una licencia adecuada a tu caso.
El plan adecuado para tu volumen.
La misma cobertura en todos los planes: solo pagas el volumen. Empieza gratis, cancela cuando quieras.
Free
Para explorar la API. Para siempre, sin tarjeta.
- 500 peticiones / mes
- 30 peticiones / min
- Cobertura completa: todos los deportes y casas del feed
Starter
Para bots e integraciones en producción.
- 50.000 peticiones / mes
- 120 peticiones / min
- Cobertura completa: todos los deportes y casas del feed
Pro
Para plataformas y volúmenes altos.
- 500.000 peticiones / mes
- 600 peticiones / min
- Prioridad de asistencia
Enterprise
Para plataformas, empresas y revendedores: configura volumen, rate y licencia — el precio se actualiza solo y activas en el checkout, sin negociación.
Te autoriza a mostrar los datos a los usuarios finales de tu producto (sin ella, el uso queda interno). Lee la licencia →
- Streaming SSE incluido (/api/v1/stream)
- Cuota y rate configurados en tu cuenta
- Activación automática al pagar, cancela cuando quieras
Al continuar aceptas la Licencia Enterprise y de Redistribución (legible desde el enlace de arriba) además de los Términos del servicio.
Pagos vía Stripe · cancelación en un clic desde el portal · la cuota es una ventana móvil de 30 días
Preguntas frecuentes.
¿Puedo usar los datos en un producto comercial (SaaS)?
El uso interno — tus modelos, bots, análisis, herramientas — está incluido en todos los planes. Mostrar los datos a los usuarios finales de tu producto requiere autorización escrita: escribe a [email protected] y definimos una licencia adecuada a tu volumen.
¿Cada cuánto se actualizan las cuotas?
Las casas italianas en ciclo continuo — la frescura REAL, medida casa por casa (p50/p95), es pública en la status page; bet365 y Betfair llegan vía feeds de partners con cadencia de unos minutos. No hace falta que nos creas: cada cuota de la respuesta lleva su last_update.
¿Hay prueba de los planes de pago?
El plan Free es para siempre y tiene la misma cobertura que los planes de pago: es la mejor forma de verificar los datos. Si necesitas más volumen para una evaluación, escribe a [email protected].
¿En qué se diferencia de surebett.app?
Mismo motor, dos productos: odss-api vende las cuotas en bruto normalizadas para construir encima; surebett.app es el producto final, con los arbitrajes ya calculados y stakes equilibrados.