Cuotas por Lotes
Obtén cuotas de varios eventos en una sola petición. Esto evita realizar llamadas a la API independientes para cada evento, reduciendo la latencia y el consumo del rate limit.
POST /api/v1/odds/batchAutenticación
Requiere API key. Disponible en todos los planes.
Cuerpo de la Petición
Envía un cuerpo JSON con los siguientes campos:
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
event_ids | string[] | Sí | Array de IDs de eventos para los que se obtendrán las cuotas |
sportsbook | string | No | Filtro de un único ID de sportsbook (por defecto, todos los disponibles según tu plan) |
market | string | No | Filtro de un único tipo de mercado (por defecto, todos) |
Límites de Lote por Plan
El número máximo de eventos por petición de lote depende de tu plan:
| Plan | Máx. Eventos por Lote |
|---|---|
| Free | 10 |
| Hobby | 10 |
| Pro | 50 |
| Sharp | 50 |
| Enterprise | 100 |
Superar el límite de lote de tu plan devolverá un error 400 validation_error. Divide las peticiones grandes en varios lotes si es necesario.
Ejemplos de Petición
cURL
curl -X POST "https://api.sharpapi.io/api/v1/odds/batch" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"event_ids": ["evt_nba_lal_bos_20260126", "evt_nba_gsw_mia_20260126"],
"sportsbook": "draftkings",
"market": "moneyline"
}'Respuesta
Éxito (200)
{
"success": true,
"data": {
"events": [
{
"event_id": "evt_nba_lal_bos_20260126",
"event_name": "Los Angeles Lakers @ Boston Celtics",
"sport": "basketball",
"league": "nba",
"start_time": "2026-01-26T19:30:00Z",
"is_live": false,
"odds": [
{
"sportsbook": "draftkings",
"market_type": "moneyline",
"selection": "Boston Celtics",
"selection_type": "home",
"odds_american": -210,
"odds_decimal": 1.476,
"line": null,
"last_seen_at": "2026-01-26T10:15:00.000Z"
},
{
"sportsbook": "draftkings",
"market_type": "moneyline",
"selection": "Los Angeles Lakers",
"selection_type": "away",
"odds_american": 175,
"odds_decimal": 2.75,
"line": null,
"last_seen_at": "2026-01-26T10:15:00.000Z"
}
]
},
{
"event_id": "evt_nba_gsw_mia_20260126",
"event_name": "Golden State Warriors @ Miami Heat",
"sport": "basketball",
"league": "nba",
"start_time": "2026-01-26T20:00:00Z",
"is_live": false,
"odds": [
{
"sportsbook": "draftkings",
"market_type": "moneyline",
"selection": "Miami Heat",
"selection_type": "home",
"odds_american": -130,
"odds_decimal": 1.769,
"line": null,
"last_seen_at": "2026-01-26T10:15:05.000Z"
}
]
}
],
"missing_events": []
},
"meta": {
"requested": 2,
"found": 2,
"missing": 0,
"max_batch": 50,
"filters": {
"sportsbook": "draftkings",
"market": "moneyline"
},
"updated_at": "2026-01-26T10:15:05.000Z"
}
}Cabeceras de Respuesta
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 296
X-RateLimit-Reset: 1737853200
X-Data-Delay: 0
X-Request-Id: req_batch_abc123Respuestas de Error
400 Límite de Lote Superado
{
"error": {
"code": "validation_error",
"message": "Batch limit exceeded. Your tier (hobby) allows 10 events per batch, but 25 were requested.",
"docs": "https://docs.sharpapi.io/en/api-reference/odds-batch"
}
}400 Campo de Eventos Faltante
{
"error": {
"code": "validation_error",
"message": "The 'event_ids' field is required and must be a non-empty array of event IDs.",
"docs": "https://docs.sharpapi.io/en/api-reference/odds-batch"
}
}401 No Autorizado
{
"error": {
"code": "unauthorized",
"message": "Invalid or missing API key",
"docs": "https://docs.sharpapi.io/en/authentication"
}
}Estructura de la Respuesta
La respuesta del lote anida los eventos y los IDs faltantes bajo data, con los conteos en meta:
Objeto Data
| Campo | Tipo | Descripción |
|---|---|---|
data.events | EventOdds[] | Array de objetos de evento con cuotas anidadas |
data.missing_events | string[] | IDs de eventos que no se encontraron o no tenían cuotas |
Objeto Meta
| Campo | Tipo | Descripción |
|---|---|---|
meta.requested | integer | Número de IDs de eventos en tu petición |
meta.found | integer | Número de eventos que tenían datos de cuotas |
meta.missing | integer | Número de eventos no encontrados |
meta.max_batch | integer | Tamaño máximo de lote para tu plan |
meta.filters | object | Filtros aplicados (sportsbook, market) |
Si un ID de evento de tu petición no tiene cuotas (por ejemplo, el evento ha terminado o no existe), aparecerá en data.missing_events en lugar de provocar un error. La respuesta seguirá incluyendo las cuotas de todos los eventos válidos.
Esquema de la Respuesta
Cada elemento del array data.events es un objeto de evento con cuotas anidadas:
Objeto Event
| Campo | Tipo | Descripción |
|---|---|---|
event_id | string | Identificador del evento |
event_name | string | Nombre legible del evento |
sport | string | Slug del deporte |
league | string | Slug de la liga |
start_time | string | Hora de inicio del evento en ISO 8601 |
is_live | boolean | Si el evento está en directo |
game_state | object | undefined | Estado del juego en directo (solo para eventos en directo con marcador) |
odds | array | Array de cuotas para este evento |
Objeto Odds (anidado en el evento)
| Campo | Tipo | Descripción |
|---|---|---|
sportsbook | string | ID del sportsbook |
market_type | string | Tipo de mercado |
selection | string | Nombre de la selección |
selection_type | string | home, away, over, under |
odds_american | number | Cuotas americanas |
odds_decimal | number | Cuotas decimales |
line | number | null | Valor de la línea |
last_seen_at | string | Marca de tiempo ISO 8601 de cuándo nuestro pipeline observó esta fila por última vez. Úsala como señal de frescura del pipeline. |
odds_changed_at | string | Marca de tiempo ISO 8601 de cuándo el precio, la línea o el flag is_live cambiaron realmente por última vez. Proporcionada por el sportsbook cuando está disponible; en Pinnacle se mantiene a lo largo de actualizaciones sin cambios — consulta Entendiendo odds_changed_at de Pinnacle. |
Casos de Uso
Carga de Cuotas Pre-partido
Carga las cuotas de toda la jornada del día en una sola llamada en lugar de hacer decenas de peticiones individuales:
# Get all NBA event IDs from the events endpoint
events_response = requests.get(
'https://api.sharpapi.io/api/v1/events',
params={'league': 'nba', 'limit': 50},
headers={'X-API-Key': 'YOUR_API_KEY'}
)
event_ids = [e['id'] for e in events_response.json()['data']]
# Batch fetch all odds at once
odds_response = requests.post(
'https://api.sharpapi.io/api/v1/odds/batch',
headers={'X-API-Key': 'YOUR_API_KEY', 'Content-Type': 'application/json'},
json={'event_ids': event_ids}
)Refresco del Dashboard
Refresca periódicamente las cuotas de los eventos que un usuario está siguiendo:
async function refreshWatchlist(eventIds) {
const response = await fetch('https://api.sharpapi.io/api/v1/odds/batch', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({ event_ids: eventIds })
});
const { data, meta } = await response.json();
if (data.missing_events.length > 0) {
console.warn('Missing events:', data.missing_events);
}
return data.events;
}Endpoints Relacionados
- Snapshot de Cuotas - Obtén cuotas con filtros de consulta flexibles
- Mejores Cuotas - Obtén las mejores cuotas entre books por selección
- Eventos - Lista los eventos para obtener los IDs de evento para peticiones por lotes