Delta de Odds
Obtenha apenas as odds que mudaram desde um timestamp específico. Este endpoint retorna o mesmo formato de odds que /odds, mas filtrado para itens atualizados após o seu valor since, tornando-o ideal para clientes de polling que desejam atualizações incrementais sem buscar novamente o snapshot completo.
GET /api/v1/odds/deltaAutenticação
Requer API key. Disponível em todos os tiers.
Avance since a partir da página terminal de cada janela de delta — a página em que pagination.has_more é false. Nessa página, meta.server_time informa a marca d’água do servidor; use-a como since da sua próxima requisição. Em todas as páginas anteriores (has_more: true), meta.server_time permanece deliberadamente no since que você enviou, para que você não pule linhas que ainda não buscou — interprete-o ali como “continue paginando”, não como uma nova marca d’água.
Parâmetros de Query
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
since | string | obrigatório | Timestamp ISO 8601. Retorna apenas odds atualizadas após este horário (ex.: 2026-02-11T12:00:00Z) |
sportsbook | string | todos | IDs de sportsbook separados por vírgula (ex.: draftkings,fanduel) |
sport | string | todos | Filtrar por esporte (ex.: basketball, football) |
league | string | todas | Filtrar por liga (ex.: nba, nfl) |
market | string | todos | Filtrar por tipo de mercado (ex.: moneyline, spread, total). Suporta aliases de categoria — veja Odds: Aliases de Categoria de Mercado. |
event_id | string | - | Filtrar por ID do evento |
is_live | boolean | false | Retornar apenas eventos ao vivo/in-play |
min_odds | number | - | Filtro mínimo de odds americanas (ex.: -110) |
max_odds | number | - | Filtro máximo de odds americanas (ex.: +200) |
state | string | — | Código de estado dos EUA apenas para o destino do deep link; não filtra odds nem retorna preços específicos por estado. Aceita os 50 códigos de estados dos EUA e dc; códigos não vazios não aceitos (incluindo on) retornam 400 invalid_filter. Quando definido, as URLs deep_link incluem ?state=XX; valores omitidos ou vazios não geram ?state=, e o redirecionamento aplica então seu próprio padrão pa. Afeta apenas casas com URLs dependentes do estado (BetMGM, Caesars, BetRivers). |
limit | integer | 50 | Máximo de resultados por página (máx. 500) |
offset | integer | 0 | Offset de paginação. Deve ser ≤ 500. Enquanto has_more for true, solicite a próxima página com offset igual ao next_offset da resposta, mantendo since inalterado. Avance since apenas a partir da página terminal (has_more: false). |
O parâmetro since é obrigatório. Omiti-lo retorna um erro 400 validation_error.
since tem uma janela de retenção de 10 minutos para remoções. Remoções de odds com mais de 10 minutos são removidas da memória. Se você enviar um since mais antigo que isso, o array data ainda respeita o seu timestamp, mas a lista removed só pode conter odds removidas nos últimos 10 minutos — e since_clamped: true será definido na resposta. Avance since na cadência da seção Padrão de Polling abaixo para evitar isso.
Exemplos de Requisições
cURL
# Get all odds changes in the last 30 seconds
curl -X GET "https://api.sharpapi.io/api/v1/odds/delta?since=2026-02-11T12:00:00Z&league=nba" \
-H "X-API-Key: YOUR_API_KEY"Resposta
Sucesso (200)
{
"data": [
{
"id": "199954867251468",
"sportsbook": "draftkings",
"event_id": "nba_celtics_lakers_2026-02-08_b3",
"sport": "basketball",
"league": "nba",
"home_team": "Los Angeles Lakers",
"away_team": "Boston Celtics",
"market_type": "moneyline",
"selection": "Boston Celtics",
"selection_type": "away",
"odds_american": -150,
"odds_decimal": 1.667,
"odds_probability": 0.60,
"line": null,
"event_start_time": "2026-02-08T19:00:00Z",
"timestamp": "2026-02-08T12:00:15.125Z",
"is_live": false,
"is_main_line": true
}
],
"removed": [
{
"id": "102044417046441",
"sportsbook": "pinnacle",
"removed_at": "2026-02-08T12:00:07Z",
"event_start": "2026-02-08T12:00:00Z",
"was_live": false,
"boundary": true
}
],
"pagination": {
"limit": 50,
"offset": 0,
"count": 1,
"total": 1,
"has_more": false,
"next_offset": null
},
"updated_at": "2026-02-08T12:00:20Z",
"meta": {
"server_time": "2026-02-08T12:00:20Z"
}
}Cabeçalhos de Resposta
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 299
X-RateLimit-Reset: 1737853200
X-Data-Delay: 0
X-Request-Id: req_delta_abc123Respostas de Erro
400 Parâmetro since ausente
{
"error": {
"code": "validation_error",
"message": "The 'since' parameter is required for the delta endpoint",
"docs": "https://docs.sharpapi.io/en/api-reference/odds-delta"
}
}400 Offset muito grande
{
"error": {
"code": "offset_too_large",
"message": "offset must be <= 500; page with `next_offset` until `has_more` is false, then advance `since` to the response's top-level `updated_at` (mirrored as `meta.server_time`; a response field, not a row field) — it holds at your current `since` while `has_more` is true; keep paging while `next_offset` is non-null even if `overflow` is true (that only means `total` is capped); when `next_offset` is null while `has_more` or `overflow` is true, re-bootstrap from paged `/odds` (`cursor=`) and resume delta with a fresh `since`",
"max_offset": 500
}
}401 Não autorizado
Se nenhuma chave for enviada, retorna missing_api_key; uma chave inválida retorna invalid_api_key.
{
"error": {
"code": "missing_api_key",
"message": "API key required. Pass via X-API-Key header, api_key query parameter, or Bearer token.",
"docs": "https://docs.sharpapi.io/en/authentication"
}
}Schema da Resposta de Delta
O array data contém os mesmos objetos de odds que o endpoint /odds. Apenas odds atualizadas após o timestamp since são incluídas.
O Array removed
O array removed de nível superior nomeia cada linha de odds que saiu do quadro desde o seu timestamp since — mercados que uma casa retirou (suspensão, um limiar de handicap/total retirado por um movimento de linha, evento liquidado). Delete esses ids do seu estado local; este é o sinal de fechamento explícito, então você nunca precisa comparar snapshots por conta própria. Presente apenas quando ao menos uma remoção correspondeu aos seus filtros. Veja Ciclo de Vida do Mercado para o mapa completo de sinais de fechamento/suspensão.
| Campo | Tipo | Descrição |
|---|---|---|
removed[].id | string | O ID da odd que não está mais no quadro |
removed[].sportsbook | string | A casa que a removeu |
removed[].removed_at | string | Timestamp ISO 8601 de quando a SharpAPI observou a remoção |
removed[].event_start | string | Opcional. Horário de início programado do evento, conforme informado pela casa esportiva no momento da remoção. Presente quando a casa forneceu um horário de início válido. |
removed[].was_live | boolean | Opcional. Se o mercado removido era um mercado ao vivo no momento da remoção. false = pré-evento/prematch; true = ao vivo/em andamento. |
removed[].boundary | boolean | Opcional. Presente e true somente quando was_live é false e a casa esportiva está publicando atualmente linhas ao vivo para este evento. É um auxílio de filtragem — não um código de motivo nem um detector de transição determinístico. Um mercado pré-evento removido horas após o evento ir ao vivo também pode receber boundary: true. Ausente quando was_live é true, o evento ainda não está ao vivo nessa casa, ou a casa não fornece dados ao vivo. Eventos de remoção SSE/WS permanecem inalterados e não incluem esses campos. |
A resposta de delta inclui campos adicionais:
| Campo | Tipo | Descrição |
|---|---|---|
meta.server_time | string | Marca d’água em ISO 8601, espelhada como updated_at de nível superior. Permanece no since que você enviou enquanto has_more for true; apenas na página terminal (has_more: false) informa a marca d’água do servidor. Avance seu since somente a partir da página terminal |
meta.books_changed | array | Lista de IDs de sportsbook que tiveram atualizações neste delta |
pagination.total | integer | Contagem exata de mudanças correspondentes na página terminal. Enquanto has_more for true, é um limite superior restrito a 10000 — não o use para progresso nem dimensionamento antes de a travessia terminar |
pagination.next_cursor | null | Sempre null explícito em /odds/delta — este endpoint pagina com next_offset + since, nunca com cursores. Emitido explicitamente para que “sem cursor aqui” seja distinguível de um campo ausente |
overflow | boolean | Opcional. Presente e true quando total não é uma contagem exata para esta página — a cauda bruta de candidatos excedeu o teto de 10000, ou (nível Free) a varredura limitada do servidor parou antes de cobrir toda a janela. As linhas de data não são afetadas: continue paginando enquanto next_offset não for null; total e overflow se corrigem na página que drena. Refaça o bootstrap quando next_offset for null enquanto has_more ou overflow for true |
Flags de Truncamento e Clamping
Duas flags booleanas opcionais de nível superior aparecem apenas quando o servidor teve que aplicar um limite de segurança à resposta. Clientes bem comportados que fazem polling na cadência recomendada nunca as veem.
| Campo | Tipo | Descrição |
|---|---|---|
removed_truncated | boolean | Presente e true quando o array removed atingiu o limite de 1000 entradas do servidor. Há mais odds removidas que o servidor não incluiu. Geralmente significa que seu since é muito antigo ou seus filtros são muito amplos — restrinja a janela ou o conjunto de filtros e refaça o polling. |
since_clamped | boolean | Presente e true quando since era mais antigo que a retenção de remoções de 10 minutos do servidor. O array data ainda respeita o seu since original, mas removed é restrito aos últimos 10 minutos de remoções. Avance since a cada ciclo com o meta.server_time da página terminal para evitar isso. |
Padrão de Polling
O padrão de polling recomendado drena cada janela e então encadeia since a partir da página terminal:
- Faça uma requisição inicial com
sincedefinido para um timestamp recente - Aplique
datacomo upserts eremovedcomo exclusões - Enquanto
pagination.has_morefortrueepagination.next_offsetnão for null, solicite a próxima página comoffsetigual anext_offset, mantendosinceinalterado - Na página terminal (
has_more: false), leiameta.server_timee use-o como o valorsincena sua próxima requisição — a menos queoverflowainda sejatruenessa página (varredura limitada do nível Free): então refaça o bootstrap em vez de avançar (veja abaixo) - Repita no intervalo desejado (ex.: a cada 5 segundos)
Isso garante:
- Sem lacunas -
server_timeé o relógio do servidor e só avança quando você já tem todas as linhas da janela, então você não perderá atualizações por desvio de relógio nem por uma leitura parcial - Sem duplicatas - cada janela de delta é não sobreposta
- Payload mínimo - apenas odds alteradas são retornadas
Avançar since a partir de uma página com has_more: true não pode pular dados — meta.server_time é igual ao seu since atual nessas páginas — mas impede o seu loop de progredir: a próxima requisição relê a mesma janela. Sempre drene até a página terminal antes de avançar since.
Quando uma janela não pode ser drenada
offset é limitado a 500, então uma janela com mais mudanças correspondentes do que a paginação por offset alcança termina com next_offset: null enquanto has_more ainda é true. No nível Free, a varredura limitada do servidor também pode deixar overflow: true na própria página terminal (has_more: false) — linhas além do orçamento de varredura são inalcançáveis em qualquer offset, e avançar since ali as pularia. Os dois estados são o mesmo sinal — refaça o bootstrap sempre que next_offset for null enquanto has_more ou overflow for true:
- Busque uma base completa em
/oddscom paginaçãocursor= - Retome o polling de delta com
sincedefinido para oupdated_atda primeira página da base — páginas posteriores são lidas mais tarde; usar o valor da última página deixaria lacunas com as mudanças que chegaram a páginas anteriores durante a varredura
Fazendo polling na cadência recomendada com limit=500, as janelas ficam pequenas o bastante para que esse caminho raramente seja necessário.
Se nenhuma odd tiver mudado desde o seu timestamp since, a resposta terá um array data vazio e count: 0. Isso é normal e esperado durante períodos de pouca atividade.
Endpoints Relacionados
- Snapshot de Odds - Obtenha o snapshot completo atual de odds
- Stream SSE - Atualizações push em tempo real via Server-Sent Events
- Stream WebSocket - Atualizações push em tempo real via WebSocket