Skip to Content
Referencia de la APIResumen

Visión general de la referencia de la API

Referencia completa de la API REST de SharpAPI v1. Todos los endpoints devuelven JSON y siguen convenciones coherentes para autenticación, filtrado, paginación y gestión de errores.

URL base

https://api.sharpapi.io/api/v1

Utiliza siempre api.sharpapi.io como URL base, no sharpapi.io.

Especificación OpenAPI

La especificación completa de OpenAPI 3.1 está disponible para importarla en herramientas como Postman, Insomnia o generadores de código:

Esta especificación cubre todos los endpoints, los esquemas de solicitud/respuesta y los requisitos de autenticación.

Formato de la solicitud

  • Todas las solicitudes utilizan HTTPS
  • Autenticación mediante la cabecera X-API-Key, la cabecera Authorization: Bearer o el parámetro de consulta api_key
  • Los cuerpos de las solicitudes (cuando proceda) utilizan JSON con Content-Type: application/json
  • Todos los nombres de campos están en snake_case

Resumen de endpoints

SharpAPI expone 35 rutas en 7 espacios de nombres, además de endpoints de referencia y de estado.

Cuotas (Odds)

MétodoRutaAuthPlan mínimo
GET/api/v1/oddsFree
GET/api/v1/odds/deltaFree
GET/api/v1/odds/bestFree
GET/api/v1/odds/comparisonFree
POST/api/v1/odds/batchFree

Eventos

MétodoRutaAuthPlan mínimo
GET/api/v1/eventsFree
GET/api/v1/events/:eventIdFree
GET/api/v1/events/:eventId/oddsFree
GET/api/v1/events/:eventId/marketsFree

Oportunidades

MétodoRutaAuthPlan mínimo
GET/api/v1/opportunities/evPro
GET/api/v1/opportunities/arbitrageHobby
GET/api/v1/opportunities/middlesPro

Splits

MétodoRutaAuthPlan mínimo
GET/api/v1/splitsPro
GET/api/v1/splits/historyPro

Streaming

MétodoRutaAuthPlan mínimo
GET/api/v1/streamAdd-on

Cuenta

MétodoRutaAuthPlan mínimo
GET/api/v1/accountFree
GET/api/v1/account/usageFree
GET/api/v1/account/keysFree
POST/api/v1/account/keysFree
DELETE/api/v1/account/keys/:keyIdFree
POST/api/v1/account/keys/:keyId/rotateFree

Datos de referencia (públicos)

MétodoRutaAuthPlan mínimo
GET/api/v1/sportsNo-
GET/api/v1/leaguesNo-
GET/api/v1/sportsbooksNo-
GET/api/v1/marketsNo-
GET/api/v1/teamsNo-

Enterprise

MétodoRutaAuthPlan mínimo
GET/api/v1/futuresEnterprise
GET/api/v1/futures/oddsEnterprise

Estado (Health)

MétodoRutaAuthPlan mínimo
GET/api/v1/healthNo-

Formato de la respuesta

Envoltura de éxito

Todas las respuestas correctas envuelven los datos en una envoltura coherente:

{ "success": true, "data": [ { "id": "draftkings_33483153_moneyline_PHO", "sportsbook": "draftkings", "sport": "basketball", "home_team": "PHI 76ers", "away_team": "PHO Suns", "market_type": "moneyline", "selection": "PHO Suns", "odds_american": -150, "odds_decimal": 1.667, "odds_probability": 0.60, "is_live": false } ], "pagination": { "limit": 50, "offset": 0, "has_more": true, "next_offset": 50, "next_cursor": "eyJlIjoiMzM0ODMxNTMiLCJiIjoiZHJhZnRraW5ncyIsIm0iOiJtb25leWxpbmUiLCJpIjoiZHJhZnRraW5nc18zMzQ4MzE1M19tb25leWxpbmVfUEhJIn0" }, "meta": { "count": 1, "total": 3095, "pagination": { "limit": 50, "offset": 0, "has_more": true, "next_offset": 50, "next_cursor": "eyJlIjoiMzM0ODMxNTMiLCJiIjoiZHJhZnRraW5ncyIsIm0iOiJtb25leWxpbmUiLCJpIjoiZHJhZnRraW5nc18zMzQ4MzE1M19tb25leWxpbmVfUEhJIn0" }, "updated_at": "2026-01-26T02:10:37.846Z", "filters": { "sportsbook": "draftkings", "league": "nba" } } }
CampoDescripción
successtrue para todas las respuestas correctas
dataArray de resultados (u objeto único en endpoints de detalle)
pagination.limitNúmero máximo de elementos por página (predeterminado: 50, máximo: 200)
pagination.offsetDesplazamiento actual dentro de los resultados
pagination.has_moreIndica si existen más resultados más allá de esta página
pagination.next_offsetValor de desplazamiento para la siguiente página (heredado: utiliza next_cursor para endpoints con datos en vivo)
pagination.next_cursorCursor opaco para la siguiente página. Pásalo como ?cursor=: es estable frente a cambios en datos en vivo. Recomendado para recorridos de varias páginas.
meta.countNúmero de elementos devueltos en esta respuesta
meta.totalTotal de elementos coincidentes en todas las páginas
meta.paginationIgual que pagination en el nivel superior (incluido por compatibilidad retroactiva)
meta.updated_atMarca de tiempo ISO 8601 de la última actualización de los datos
meta.filtersReflejo de los filtros aplicados a esta solicitud

Respuesta de un único recurso

{ "success": true, "data": { "id": "evt_abc123", "sport": "nba", "home_team": "PHI 76ers", "away_team": "PHO Suns", "start_time": "2026-01-26T19:00:00Z" }, "meta": { "updated_at": "2026-01-26T02:10:37.846Z" } }

Envoltura de error

Todos los errores siguen un formato coherente:

{ "error": { "code": "rate_limited", "message": "Rate limit exceeded. Upgrade your plan or wait 45 seconds.", "docs": "https://docs.sharpapi.io/en/authentication#rate-limits" } }
CampoDescripción
error.codeCódigo de error legible por máquina
error.messageDescripción legible para humanos
error.docsEnlace a la documentación pertinente (opcional: incluido en errores de autenticación, plan, límite de tasa y streaming)
error.correct_endpointEndpoint correcto a utilizar (opcional: incluido en errores unknown_endpoint cuando la API reconoce la ruta como una ruta incorrecta conocida)
error.retry_afterSegundos hasta que se permite reintentar (opcional: incluido en errores rate_limited)

Cabeceras estándar de respuesta

Toda respuesta de la API incluye estas cabeceras:

CabeceraEjemploDescripción
X-RateLimit-Limit300Máximo de solicitudes por minuto para tu plan
X-RateLimit-Remaining299Solicitudes restantes en la ventana actual
X-RateLimit-Reset1705804800Marca de tiempo Unix en la que se restablece el límite de tasa
X-Data-Delay0Retraso de los datos en segundos (60 para Free, 0 para planes de pago)
X-Request-Idreq_a1b2c3d4Identificador único de la solicitud para depuración y soporte

Incluye el valor de X-Request-Id cuando contactes con soporte sobre una solicitud concreta.

Comparativa de planes

CaracterísticaFreeHobbyProSharpEnterprise
Casas de apuestas2 (DK, FD)515Las 32Las 32
Retraso de datos60 s0 s0 s0 s0 s
Solicitudes/min121203001.000Personalizado
PinnacleNoNo
EV / Arb / MiddlesNoNo
StreamingNoAdd-onAdd-onAdd-onIncluido
Eventos máx. por lote10105050100

El streaming requiere el complemento WebSocket (99 $/mes) en planes de pago. Enterprise incluye el streaming sin coste adicional.

Filtrado

Todos los endpoints de listado admiten filtrado mediante parámetros de consulta. Los filtros utilizan nombres de parámetros en singular y aceptan valores separados por comas para selección múltiple.

Parámetros de filtro

ParámetroTipoEjemploDescripción
sportsbookstringdraftkings,fanduelFiltra por una o varias casas de apuestas
sportstringbasketball,footballFiltra por deporte
leaguestringnba,nflFiltra por liga
marketstringmoneyline,spreadFiltra por tipo de mercado
eventstringevt_abc123Filtra por ID de evento
livebooleantrueSolo eventos en vivo / en curso
sortstring-odds_americanCampo de ordenación con prefijo opcional - para descendente
fieldsstringid,sportsbook,odds_americanCampos a incluir en la respuesta, separados por comas
min_oddsnumber-110Filtro de cuota americana mínima
max_oddsnumber200Filtro de cuota americana máxima
group_bystringeventAgrupa resultados por campo
limitnumber25Resultados por página (predeterminado: 50, máximo: 200)
offsetnumber50Desplazamiento de paginación. Puede producir filas duplicadas en endpoints en vivo cuando los datos cambian entre solicitudes.
cursorstringCursor opaco procedente de next_cursor. Recomendado para recorridos de varias páginas sobre datos en vivo: elimina la deriva del offset.

Ejemplos

# Múltiples casas de apuestas (separadas por comas) curl "https://api.sharpapi.io/api/v1/odds?sportsbook=draftkings,fanduel" \ -H "X-API-Key: YOUR_KEY" # Combinar filtros curl "https://api.sharpapi.io/api/v1/odds?league=nba,nhl&sportsbook=pinnacle&live=true" \ -H "X-API-Key: YOUR_KEY" # Paginar a través de los resultados curl "https://api.sharpapi.io/api/v1/odds?limit=25&offset=50" \ -H "X-API-Key: YOUR_KEY"

Los nombres de los parámetros están siempre en singular (sportsbook, no sportsbooks). Usa comas para pasar varios valores: sportsbook=draftkings,fanduel.

Formatos de cuotas

Todas las cuotas se devuelven como campos planos en cada objeto de cuotas:

{ "odds_american": -110, "odds_decimal": 1.909, "odds_probability": 0.5238 }
CampoEjemploDescripción
odds_american-110, +150Formato estándar estadounidense
odds_decimal1.909, 2.50Formato multiplicador
odds_probability0.5238Probabilidad implícita (de 0 a 1)

Códigos de error

Lista canónica de códigos de error emitidos por la API. La cadena en error.code es el contrato estable: compruébala en lugar del texto message.

Códigos de error HTTP

Emitidos en respuestas REST.

CódigoEstado HTTPDescripción
missing_api_key401No se ha suministrado ninguna API key mediante X-API-Key, ?api_key= o Authorization: Bearer
invalid_api_key401Se ha suministrado una API key, pero no se reconoce
expired_api_key401La API key ha caducado: genera una nueva en el panel
disabled_api_key401La API key está deshabilitada, normalmente porque la suscripción ha caducado
unauthorized401Falló la autenticación con bearer token en endpoints de administración o /api/v1/monitoring/* (distinto de invalid_api_key)
invalid_token401La verificación del token de sesión de Clerk falló (endpoints exclusivos del panel)
tier_restricted403El endpoint o la función no está disponible en tu plan: la respuesta incluye tier y required_tier
not_found404Recurso no encontrado
method_not_allowed405El método HTTP no se admite en esta ruta
gone410El evento ha terminado o ha caducado: utiliza /api/v1/events para los eventos actuales
unknown_endpoint410Ruta de API incorrecta: la respuesta incluye correct_endpoint con la ruta correcta (p. ej. /api/v1/arbitrage/api/v1/opportunities/arbitrage)
validation_error400El cuerpo de la solicitud o los parámetros de consulta no superaron la validación
offset_too_large400offset supera el máximo por endpoint (actualmente 500 en /odds y /odds/delta). Cambia a paginación basada en cursor o avanza since
rate_limited429Se ha superado el límite de tasa de solicitudes por minuto: la respuesta incluye retry_after
concurrent_request_cap429Demasiadas solicitudes en curso para tu plan: reduce el paralelismo o mejora el plan
too_many_streams429Se ha superado el número máximo de streams SSE o WebSocket simultáneos para esta API key
backpressureEmitido como un event: error de SSE (no es un estado HTTP) cuando el cliente no puede mantener el ritmo; el servidor cierra entonces el stream
upstream_error502Problema temporal al conectar con una casa de apuestas o un proveedor de autenticación de origen
service_unavailable503Un servicio necesario (p. ej. gestión de claves) no está configurado o está fuera de línea
not_ready503Un almacén de respaldo del que depende el endpoint (p. ej. ClickHouse, captura de líneas de cierre) aún no está listo para atender la solicitud. Reintenta con backoff
internal_error500Error inesperado del servidor: reintenta con backoff y contacta con soporte indicando X-Request-Id si persiste

bad_request e invalid_request están obsoletos: ambos se han fusionado en validation_error. Los clientes que coincidan con las cadenas antiguas deberían añadir validation_error a su mapa de errores.

Códigos de error de tramas WebSocket

Emitidos únicamente dentro de tramas {"type": "error", "code": "..."} en una conexión WebSocket abierta. Describen errores en el protocolo del cliente y no se corresponden con un estado HTTP.

CódigoSignificado
invalid_messageLa trama no se pudo analizar como JSON o no coincide con la forma esperada
unknown_message_typeEl campo type no es uno de los valores documentados (auth, subscribe, filter, refresh_token, ping)
missing_tokenLa trama auth o refresh_token no incluyó un campo token
missing_channelsLa trama subscribe no incluyó un array channels no vacío
not_authenticatedLa trama requiere una sesión autenticada (se envió subscribe, filter o refresh_token antes de auth)
already_authenticatedEl cliente envió una segunda trama auth después de que la primera tuviera éxito
Last updated on