Snapshot de Odds
Obtenha um snapshot das odds atuais das casas de apostas.
GET /api/v1/oddsAlterado na v3.0.0: a resposta de odds agora carrega um único campo timestamp (entrega / frescor do feed). Os antigos campos odds_changed_at, last_seen_at e wire_received_at foram removidos — leia timestamp em vez disso. Não há mais um campo para quando o preço se moveu pela última vez.
Autenticação
Requer API key. Disponível para todos os tiers.
As casas de apostas retornadas em seus resultados dependem do seu tier de assinatura. Usuários do tier Free recebem odds apenas da DraftKings e FanDuel. Veja Acesso a Casas por Tier abaixo.
Parâmetros de Query
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
sportsbook | string | permitidas pelo tier | IDs de casas de apostas separados por vírgula (ex.: draftkings,fanduel). Limites de tier são aplicados. |
sport | string | todos | Filtrar por esporte(s), separados por vírgula (ex.: basketball, football). Suporta aliases de categoria. |
league | string | todas | Filtrar por liga(s), separadas por vírgula (ex.: nba, nfl, nhl) |
market | string | todos | Filtrar por tipo(s) de mercado, separados por vírgula. Suporta aliases de categoria (main, spread, total, props) ou tipos exatos (point_spread, player_points). |
event_id | string | — | Filtrar por ID(s) de evento, separados por vírgula |
is_live | boolean | — | true = apenas ao vivo, false = apenas pré-jogo, omitir = ambos |
min_odds | number | — | Filtro de odds americanas mínimas (ex.: -110) |
max_odds | number | — | Filtro de odds americanas máximas (ex.: +200) |
group_by | string | — | Agrupar resultados por campo (ex.: event) |
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. 200) |
offset | integer | 0 | Offset de paginação. Deve ser ≤ 500. Valores acima de 500 retornam 400 offset_too_large — use cursor para paginação mais profunda. Pode produzir linhas duplicadas quando dados ao vivo são atualizados entre requisições. |
cursor | string | — | Cursor opaco do next_cursor em uma resposta anterior. Necessário para paginação profunda (além do offset 500) e recomendado para qualquer varredura de múltiplas páginas — estável diante de mudanças de dados ao vivo. Tem precedência sobre offset quando ambos são fornecidos. |
Use valores separados por vírgula para filtrar por múltiplas casas de apostas: sportsbook=draftkings,fanduel,betmgm
Aliases de Categoria de Mercado
Em vez de listar tipos de mercado individuais, você pode usar um alias de categoria para corresponder a um grupo de mercados relacionados. Aliases e tipos exatos podem ser misturados livremente em uma lista separada por vírgulas.
| Alias | Expande para |
|---|---|
main | moneyline, point_spread, total_points |
spread | point_spread, puck_line, run_line, set_handicap |
total | total_points, total_goals, total_runs, total_games, total_rounds, team_total |
props | Todos os tipos de mercado player_* (correspondência por prefixo) |
# Buscar todos os mercados "main" (moneyline + spreads + totals)
curl "https://api.sharpapi.io/api/v1/odds?league=nba&market=main" \
-H "X-API-Key: YOUR_API_KEY"
# Misturar um alias com um tipo exato
curl "https://api.sharpapi.io/api/v1/odds?league=nfl&market=spread,moneyline" \
-H "X-API-Key: YOUR_API_KEY"
# Todos os mercados de player props
curl "https://api.sharpapi.io/api/v1/odds?league=nba&market=props" \
-H "X-API-Key: YOUR_API_KEY"O alias props usa correspondência por prefixo, portanto inclui automaticamente qualquer tipo de mercado começando com player_ (ex.: player_points, player_rebounds, player_assists, player_strikeouts, etc.).
Exemplos de Requisição
cURL
curl -X GET "https://api.sharpapi.io/api/v1/odds?league=nba&sportsbook=draftkings&market=moneyline" \
-H "X-API-Key: YOUR_API_KEY"Paginação
Use paginação baseada em cursor para varreduras de múltiplas páginas. O endpoint /odds serve dados ao vivo que são atualizados a cada ~15 segundos. Com paginação baseada em offset, linhas podem mudar de posição entre requisições, causando duplicatas nos limites de página. A paginação baseada em cursor ancora cada página ao último item visto — sem desvios.
Cada resposta inclui tanto next_cursor (estável) quanto next_offset (legado) no objeto pagination. Para varreduras sequenciais do conjunto completo de dados, sempre use next_cursor.
# Primeira página — sem necessidade de cursor
curl "https://api.sharpapi.io/api/v1/odds?league=nfl&limit=200" \
-H "X-API-Key: YOUR_API_KEY"
# Páginas subsequentes — passe next_cursor da resposta anterior
curl "https://api.sharpapi.io/api/v1/odds?league=nfl&limit=200&cursor=eyJlIjoiMzM0ODMxNTMiLCJiIjoiZHJhZnRraW5ncyIsIm0iOiJtb25leWxpbmUiLCJpIjoiZHJhZnRraW5nc18zMzQ4MzE1M19tb25leWxpbmVfUEhJIn0" \
-H "X-API-Key: YOUR_API_KEY"Ordem dos resultados
Os resultados são retornados em ordem cronológica por hora de início do evento — primeiro os eventos já em andamento e os que começam mais cedo, depois os posteriores. Eventos sem hora de início no feed são ordenados por último.
Uma única página é, portanto, uma fatia da programação, não uma amostra de todo o conjunto de resultados. Uma casa de apostas sem jogos começando dentro do trecho da programação que aquela página cobre não aparecerá nela, mesmo que tenha muitas linhas correspondentes mais tarde no mesmo dia — esse é o comportamento esperado, não uma falha de cobertura. Para verificar se uma casa oferece um mercado, filtre com ?sportsbook= ou restrinja com ?league= em vez de ler uma primeira página sem filtro.
Em uma página com linhas, é isso que meta.books informa: uma casa listada em in_scope sem entrada em in_page não retornou linhas naquela página — geralmente porque seus jogos ficam fora do trecho da programação que aquela página cobre, e não porque ela não oferece o mercado.
Cursores são opacos — não os analise nem os construa. Eles codificam a posição de ordenação do último item na página atual e só são válidos para os mesmos parâmetros de filtro.
?offset=N continua funcionando para paginação rasa (até offset 500) e é apropriado para requisições de página única ou acesso direto por posição. Além de 500, a API retorna 400 offset_too_large — caso contrário, o servidor teria que ordenar todo o conjunto filtrado de resultados a cada página, o que é muito mais barato evitar do que otimizar por requisição. Use cursor para qualquer coisa mais profunda.
{
"error": {
"code": "offset_too_large",
"message": "offset must be <= 500; use `cursor=` from the previous response for deeper pagination",
"max_offset": 500
}
}Resposta
Sucesso (200)
{
"success": true,
"data": [
{
"id": "draftkings_33483153_moneyline_PHO",
"sportsbook": "draftkings",
"event_id": "33483153",
"sport": "basketball",
"league": "nba",
"home_team": "PHI 76ers",
"away_team": "PHO Suns",
"market_type": "moneyline",
"selection": "PHO Suns",
"selection_type": "away",
"odds_american": -150,
"odds_decimal": 1.667,
"odds_probability": 0.60,
"line": null,
"event_start_time": "2026-01-26T19:00:00Z",
"timestamp": "2026-01-26T02:10:24.125Z",
"is_live": false
},
{
"id": "draftkings_33483153_moneyline_PHI",
"sportsbook": "draftkings",
"event_id": "33483153",
"sport": "basketball",
"league": "nba",
"home_team": "PHI 76ers",
"away_team": "PHO Suns",
"market_type": "moneyline",
"selection": "PHI 76ers",
"selection_type": "home",
"odds_american": 130,
"odds_decimal": 2.30,
"odds_probability": 0.4348,
"line": null,
"event_start_time": "2026-01-26T19:00:00Z",
"timestamp": "2026-01-26T02:10:24.125Z",
"is_live": false
}
],
"meta": {
"count": 2,
"total": 3095,
"books_available": ["draftkings", "fanduel", "betmgm", "caesars", "pinnacle"],
"books_returned": ["draftkings"],
"pagination": {
"limit": 50,
"offset": 0,
"has_more": true,
"next_offset": 50,
"next_cursor": "eyJlIjoiMzM0ODMxNTMiLCJiIjoiZHJhZnRraW5ncyIsIm0iOiJtb25leWxpbmUiLCJpIjoiZHJhZnRraW5nc18zMzQ4MzE1M19tb25leWxpbmVfUEhJIn0"
},
"updated_at": "2026-01-26T02:10:37.846Z",
"filters": {
"league": "nba",
"sportsbook": "draftkings",
"market": "moneyline"
}
}
}Resultados vazios (200): meta.store
Uma página vazia — 200 com "data": [] e "count": 0 — pode significar duas coisas diferentes: seus filtros não corresponderam a nada, ou a instância que respondeu não tinha nada carregado naquele momento (por exemplo, durante uma troca de store). Desde setembro de 2026 a resposta diz qual é o caso. Sempre que /odds retorna zero linhas, um bloco meta.store é adicionado, e reason é o campo no qual você deve se basear:
{
"data": [],
"pagination": {
"limit": 50,
"offset": 0,
"count": 0,
"has_more": false,
"next_offset": null
},
"updated_at": "2026-09-07T02:41:18.552Z",
"meta": {
"store": {
"generation": 5019,
"ready": true,
"books": 39,
"rows": 810137,
"reason": "no_match"
}
}
}reason | Significado | O que fazer |
|---|---|---|
warming | A instância que respondeu não concluiu nenhum ciclo de atualização desde a última mudança de modo — nada foi carregado ainda | Tentar novamente |
store_empty | A instância está pronta, mas não contém nenhuma linha de odds, por exemplo no meio de uma troca de store | Tentar novamente — não trate a página vazia como definitiva |
no_match | A instância está pronta e com dados; seus filtros não corresponderam a nada | Definitivo — tentar novamente não mudará a resposta |
| Campo | Tipo | Significado |
|---|---|---|
generation | integer | Geração do snapshot a partir da qual esta resposta foi servida. 0 significa que nada foi carregado desde o início do processo. |
ready | boolean | Pelo menos um ciclo de atualização foi concluído desde a última mudança de modo da instância. |
books | integer | Casas de apostas presentes no snapshot a partir do qual esta resposta foi servida, independentemente dos seus filtros. |
rows | integer | Linhas de odds mantidas por esse snapshot, independentemente dos seus filtros. |
reason | string | warming, store_empty ou no_match — veja acima. |
event_status | string | Presente apenas quando a página está vazia porque o único evento pelo qual você filtrou com event_id terminou: final (uma conclusão registrada está retida — o mesmo registro que /events/{eventId} serve como status: "final") ou gone (o evento saiu da programação na última hora, aproximadamente, sem uma conclusão registrada — a mesma condição sob a qual /events/{eventId} responde 410 Gone). Omitido nos demais casos. Veja Eventos finalizados abaixo. |
completed_at | string | Acompanha apenas event_status: "final" — o instante RFC 3339 em que a conclusão foi detectada, idêntico ao completed_at de /events/{eventId}. Nunca é enviado com gone. |
- Presente apenas em resultados vazios. Uma resposta com linhas é idêntica byte a byte à anterior e não carrega
meta.store; parsers que leemdata+pagination+updated_atcontinuam funcionando. bookserowsdescrevem o snapshot inteiro, não a sua consulta —rows: 810137é evidência de que o store estava populado, não uma contagem do que você teria obtido.- Consultas que se resolvem para duas ou mais casas de apostas também carregam
meta.books(o escopo de casas resolvido:in_scopee as contagensin_pagepor casa);meta.storeé adicionado ao lado dele. O mesmo vale para a página vazia de uma seleção de casas do dashboard que não se resolveu para nenhuma casa — veja Seleção de casas vazia abaixo. - Um valor desconhecido de
leagueousportsbooké rejeitado com400 invalid_filterem vez de respondido com uma página vazia. Os demais filtros não são validados contra o catálogo: ummarket_typeouevent_idque não existe em lugar nenhum retorna uma página vazia comum comreason: "no_match".
Eventos finalizados: event_status e completed_at
Um cliente que continua consultando /odds?event_id=<id> depois que o jogo termina recebe uma página vazia definitiva — reason: "no_match" é verdadeiro, mas não diz por que nada correspondeu. Quando a página está vazia porque o único evento pelo qual você filtrou terminou, meta.store também diz isso. Esta é a resposta real para um jogo da MLB que havia terminado na mesma noite (uma consulta de uma única casa, para que o corpo fique curto — uma consulta com várias casas carrega meta.books ao lado, como acima):
GET /api/v1/odds?event_id=mlb_twins_whitesox_2026-09-06_b3&sportsbook=pinnacle&limit=1{
"data": [],
"pagination": {
"limit": 1,
"offset": 0,
"count": 0,
"has_more": false,
"next_offset": null
},
"updated_at": "2026-09-07T10:04:34.951684418Z",
"meta": {
"store": {
"generation": 13456,
"ready": true,
"books": 39,
"rows": 947879,
"reason": "no_match",
"event_status": "final",
"completed_at": "2026-09-07T02:09:37Z"
}
}
}/events/mlb_twins_whitesox_2026-09-06_b3 retornou status: "final" com o mesmo completed_at no mesmo instante — os dois endpoints leem o mesmo registro, portanto não podem discordar.
event_status | Significado | O que fazer |
|---|---|---|
final | Uma conclusão registrada está retida para o evento; completed_at é o momento em que ela foi detectada. | Pare de consultar — o evento acabou; obtenha o resultado em /events/{eventId} |
gone | O evento saiu da programação na última hora, aproximadamente, sem uma conclusão registrada — adiado, cancelado ou encerrado tão recentemente que nenhum resultado foi registrado ainda. É a mesma condição sob a qual /events/{eventId} responde 410 Gone, e não afirma que o evento terminou. | Pare de consultar as odds; verifique /events/{eventId} mais tarde para ver se há resultado |
O sinal só é anexado quando todas as condições a seguir são satisfeitas — caso contrário o bloco mantém sua forma comum e nenhuma das duas chaves está presente:
- a requisição filtrou por exatamente um
event_id(uma lista separada por vírgulas não recebe sinal — o campo é singular); - a página está vazia com
reason: "no_match"(uma páginawarmingoustore_emptynunca o carrega — o vazio é do store, ereasonjá diz para tentar novamente); - sabe-se que o evento terminou. Um evento ainda ao vivo ou futuro, ou um id que não existe em lugar nenhum, recebe um
no_matchcomum semevent_status— portanto uma consulta de um único id respondida sem ele significa um id errado ou um evento que não terminou.
Um evento finalizado cujas odds ainda estão em cache retorna essas linhas normalmente; o sinal aparece quando a página se esvazia. completed_at é o momento em que a conclusão foi detectada — normalmente alguns minutos depois de o evento sair do feed ao vivo — e não o apito final; a mesma ressalva de completed_at em /events. O código de status nunca muda: um cliente que consulta um evento ao longo de toda a sua vida continua recebendo 200.
Seleção de casas vazia: meta.books.reason
Se a seleção de casas de apostas salva no seu dashboard não se resolve para nada — todas as casas selecionadas estão ausentes do snapshot atual ou não estão incluídas no seu tier —, uma requisição a /odds sem filtros é respondida com uma página vazia. O store está bem; a seleção é o motivo, e a resposta o nomeia. meta.books — normalmente presente apenas em consultas que se resolvem para duas ou mais casas — é emitido com um escopo vazio, reason: "selection_disjoint" e selected, a seleção que não se resolveu para nada (IDs canônicos de casa, ordenados):
{
"data": [],
"pagination": {
"limit": 50,
"offset": 0,
"count": 0,
"has_more": false,
"next_offset": null
},
"updated_at": "2026-09-07T10:04:34.951684418Z",
"meta": {
"books": {
"in_scope": [],
"in_page": {},
"reason": "selection_disjoint",
"selected": ["betano", "bwin"]
},
"store": {
"generation": 13454,
"ready": true,
"books": 39,
"rows": 947919,
"reason": "no_match"
}
}
}meta.books.reasontem precedência.meta.storecontinua aparecendo ao lado comreason: "no_match"— correto para o store (ele está populado), mas não é a causa. Quandometa.books.reasonestá presente, esse é o motivo da página vazia; tentar novamente não mudará a resposta. Corrija a seleção no seu dashboard, ou faça upgrade se as casas que você selecionou exigirem um tier superior.in_scopeein_pageestão presentes e vazios ([]/{}, nuncanull). O único valor dereasonhoje éselection_disjoint.- Emitido apenas quando a seleção é de fato a causa: a requisição não trazia um filtro
sportsbook=explícito, você tem uma seleção no dashboard e seu tier sozinho teria se resolvido para pelo menos uma casa. Nunca aparece no tier Free (que sempre serve DraftKings e FanDuel, independentemente da seleção) nem com um store vazio ou em aquecimento — essas páginas são explicadas pormeta.store. - Com um filtro
sportsbook=explícito, a mesma divergência é rejeitada em vez de respondida com uma página vazia:403 tier_restricted,403 book_not_selectedou503 book_unavailable. - Páginas que se resolvem para uma ou mais casas não mudam: o bloco de duas ou mais casas não carrega
reasonnemselected, e um escopo de uma única casa não carregameta.booksde forma alguma.
Cabeçalhos de Resposta
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 299
X-RateLimit-Reset: 1737853200
X-Data-Delay: 0
X-Request-Id: req_abc123def456| Cabeçalho | Descrição |
|---|---|
X-RateLimit-Limit | Máximo de requisições por minuto para o seu tier |
X-RateLimit-Remaining | Requisições restantes na janela atual |
X-RateLimit-Reset | Timestamp Unix de quando o rate limit é redefinido |
X-Data-Delay | Atraso dos dados em segundos (0 para tempo real, 60 para o tier Free) |
X-Request-Id | Identificador único da requisição para depuração |
Respostas de Erro
401 Unauthorized
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"
}
}403 Tier Restricted
{
"error": {
"code": "tier_restricted",
"message": "Sportsbook 'pinnacle' requires Sharp tier or higher",
"docs": "https://docs.sharpapi.io/en/pricing"
}
}429 Rate Limited
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded. Retry after 45 seconds.",
"docs": "https://docs.sharpapi.io/en/authentication#rate-limits"
}
}Schema do Objeto Odds
| Campo | Tipo | Descrição |
|---|---|---|
id | string | Identificador único de odds |
sportsbook | string | ID da casa de apostas (ex.: draftkings) |
event_id | string | Identificador do evento |
sport | string | Slug do esporte (ex.: basketball, football) |
league | string | Slug da liga (ex.: nba, nfl) |
home_team | string | Nome do time mandante |
away_team | string | Nome do time visitante |
market_type | string | moneyline, spread, total, player_prop, etc. |
selection | string | A seleção (nome do time, Over/Under, nome do jogador) |
selection_type | string | Identificador canônico do lado. Veja Tipos de seleção abaixo para o enum completo, incluindo formas compostas (ex.: home_over) emitidas em mercados multieixo. |
team_side | string|undefined | Dica bruta de lado do time vinda do adaptador — um dentre home, away, draw. Útil quando selection_type carrega um valor composto (ex.: home_over) e você quer apenas o eixo de time sem precisar fazer parsing. Ausente quando o adaptador não o carimbou. |
odds_american | number | Odds americanas (ex.: -110, +150) |
odds_decimal | number | Odds decimais (ex.: 1.909) |
odds_probability | number | Probabilidade implícita (ex.: 0.5238) |
line | number | null | Valor da linha de spread ou total (null para moneyline) |
is_alternate_line | boolean|undefined | true quando o line desta linha difere da linha principal orientativa da sua coorte — a coorte é (event, market_type, eixo de seleção), resolvida por casa de apostas. Sempre false para mercados sem linha (moneyline, outright). Estável em /opportunities/ev hoje; em rollout para as linhas de /odds. Use para separar snapshots de linha principal e linhas alternativas. |
event_start_time | string | Hora de início do evento em ISO 8601 |
timestamp | string | Horário ISO 8601 em que a SharpAPI atualizou esta odd pela última vez através do seu pipeline — avança a cada ciclo de ingestão. É um sinal de frescor / liveness do feed; não é quando o preço mudou pela última vez. |
is_live | boolean | Se o evento está atualmente ao vivo |
event_uuid | string|undefined | UUID canônico estável do evento do atlas do SharpAPI, quando o evento está mapeado. Enquanto event_id carrega o identificador primário do adaptador (frequentemente o da casa de apostas originadora), event_uuid é um hash estável entre feeds para joins cross-feed. Ausente para eventos não mapeados. |
external_event_id | string|undefined | O ID de evento nativo da própria casa de apostas, quando distinto de event_id. Útil para vincular linhas de volta à UI ou API da casa de apostas. |
deep_link | string|undefined | URL resolvedora apontando para a página de evento ou bilhete da casa de apostas. Passe state= (ex.: state=nj) na requisição para rotear via subdomínios específicos por estado em casas que os exigem (BetMGM, Caesars, BetRivers). |
market_id | string|undefined | Identificador nativo de mercado da casa de apostas. Algumas casas não o expõem — ausente quando desconhecido. |
selection_id | string|undefined | Identificador nativo de seleção/resultado da casa de apostas. Algumas casas não o expõem — ausente quando desconhecido. |
player_name | string|undefined | Nome do jogador (apenas mercados de player prop) |
stat_category | string|undefined | Categoria estatística, ex.: points, rebounds (apenas mercados de player prop) |
home_pitcher | string|undefined | Apenas MLB. Pitcher abridor do time da casa quando publicado pela casa de apostas. |
away_pitcher | string|undefined | Apenas MLB. Pitcher abridor do time visitante quando publicado pela casa de apostas. |
max_bet | number|undefined | O maior tamanho disponível nesta linha. Em uma casa tradicional (Pinnacle, Circa Sports, SBOBET) é a aposta máxima que ela aceitará, em USD. Em uma casa baseada em exchange é o dinheiro que está ao melhor preço, em size_currency. A ausência significa que o operador não publica nenhum tamanho para a linha; um número — inclusive 0.0 — é um valor real. Em uma casa baseada em exchange este campo aparece apenas enquanto há dinheiro ao melhor preço, então um best_bid_liquidity de 0.0 chega sem max_bet — o mesmo fato, não um contraditório. Consulte Liquidez e limites. |
size_currency | string|undefined | Código ISO-4217 em que os valores monetários desta linha estão denominados — max_bet, best_bid_liquidity e total_liquidity. GBP na Betfair e na Smarkets, USD em qualquer outra casa que publique um tamanho, e nunca convertido: o valor próprio do operador é repassado na moeda dele. Ausente em linhas sem tamanho e em casas tradicionais, cujo max_bet é um teto de aposta em USD e não um tamanho no livro. Consulte Liquidez e limites. |
best_bid_liquidity | number|undefined | Apenas casas baseadas em exchange. Dinheiro que está ao preço publicado — o que um tomador consegue casar sem mover o preço. Denominado em size_currency. 0.0 significa que não há nada ali; a ausência significa que o operador não publica o número. |
total_liquidity | number|undefined | Apenas casas baseadas em exchange. Tamanho arriscável somado em todo o livro para esta seleção, não apenas ao melhor preço. Denominado em size_currency. 0.0 significa um livro vazio; a ausência significa que o operador não publica o número. Não derivável de best_bid_liquidity, e algumas casas publicam um sem o outro. |
volume | number|undefined | Volume negociado acumulado nesta seleção, nas unidades nativas da exchange. Apenas exchanges — atualmente Kalshi. Consulte Liquidez e limites. |
volume_24h | number|undefined | Volume negociado das últimas 24 horas, nas unidades nativas da exchange. Apenas exchanges — atualmente Polymarket e Kalshi. |
open_interest | number|undefined | Contratos em aberto pendentes nesta seleção. Apenas exchanges — atualmente Kalshi. |
polymarket_resolution | string|undefined | Apenas Polymarket. Status de resolução do oráculo otimista UMA quando o mercado terminou — um dentre settled_normal, voided, disputed, proposed, unknown. Ausente em mercados Polymarket ainda ao vivo e em todas as casas não-Polymarket. |
Tipos de seleção
selection_type carrega o identificador canônico de lado para cada selection. A maioria dos mercados é de duas vias (ex.: moneyline, point spread, total) e emite um dos valores simples abaixo. Um pequeno conjunto de mercados multieixo (dupla chance no futebol, BTTS combinado, resultado × O/U, round betting de MMA, set betting de tênis, placar exato, etc.) codifica dois resultados por seleção e emite valores compostos unidos por _.
| Família | Valores | Onde aparecem |
|---|---|---|
| Duas vias (lado do time) | home, away | moneyline, point_spread, puck_line, run_line, set_handicap, a maioria dos mercados por período |
| Duas vias (direção da linha) | over, under | total_points, total_goals, total_runs, total_games, total_rounds, todos os props player_*_o_u |
| Duas vias (sim/não) | yes, no | binary, mercados estilo prop sim/não, resultados de exchange “back/lay”, mercados de previsão Polymarket |
| Duas vias (paridade) | even, odd | Mercados de paridade de totais (ex.: total de pontos par/ímpar) |
| Três vias | draw | Moneyline a três vias (1X2 do futebol), lado complementar do draw-no-bet, “sem gol” em next_goal |
| Composto (time × O/U) | home_over, home_under, away_over, away_under | match_result_total_goals do futebol (“Time A e Over N.5”) e mercados análogos resultado-mais-total. Também team_total (“Time A Over N.5”), que carrega um time e uma direção, portanto nunca é um home/over simples. |
| Composto (time × BTTS) | home_yes, home_no, away_yes, away_no, draw_yes, draw_no | match_result_both_teams_to_score do futebol |
| Composto (dupla chance) | home_draw, away_draw, home_away | double_chance do futebol (1X / X2 / 12) e dupla chance de MMA |
| Composto (round / método) | home_r1, home_r2, home_decision, away_r1 etc. | round_betting de MMA e mercados de método de vitória |
| Coringa | other | game_prop, “sem gol” em next_goal, e qualquer seleção em que o mapeador de lado canônico não consegue decompor o resultado de forma limpa. Sempre presente em baixo volume; trate como opaco. |
Parseando valores compostos. Strings compostas de selection_type sempre unem o eixo de time (home / away / draw) ao eixo secundário com um único underscore. Para recuperar apenas o eixo de time sem parsing, leia team_side — é o lado bruto carimbado pelo adaptador para a mesma linha.
Mercados de cauda longa emitem formas adicionais. Mercados como correct_score (ex.: "2_1"), set_betting (ex.: "0_2"), winning_margin, halftime_fulltime, first_goal e anytime_goal codificam resultados de placar ou compostos diretamente em selection_type. Se você depende de um enum fechado, filtre para as famílias acima e trate qualquer valor não reconhecido como opaco — não lance erro.
Filtragem por Faixa de Odds
Use min_odds e max_odds para filtrar pelo valor das odds americanas.
# Retornar apenas odds positivas (+100 e acima)
curl "https://api.sharpapi.io/api/v1/odds?league=nba&min_odds=100" \
-H "X-API-Key: YOUR_API_KEY"
# Retornar apenas odds entre -200 e +200
curl "https://api.sharpapi.io/api/v1/odds?league=nba&min_odds=-200&max_odds=200" \
-H "X-API-Key: YOUR_API_KEY"Resposta Agrupada por Evento
Use group_by=event para agrupar odds por evento em vez de uma lista plana. Isso é útil para construir UIs centradas em eventos.
curl "https://api.sharpapi.io/api/v1/odds?league=nba&group_by=event" \
-H "X-API-Key: YOUR_API_KEY"{
"data": [
{
"event_id": "33483153",
"event_name": "PHI 76ers vs PHO Suns",
"sport": "basketball",
"league": "nba",
"start_time": "2026-01-26T19:00:00Z",
"is_live": false,
"odds": [
{
"id": "draftkings_33483153_moneyline_PHO",
"sportsbook": "draftkings",
"market_type": "moneyline",
"selection": "PHO Suns",
"selection_type": "away",
"odds_american": -150,
"odds_decimal": 1.667,
"odds_probability": 0.60,
"line": null,
"timestamp": "2026-01-26T02:10:24.125Z"
}
]
}
],
"meta": {
"group_by": "event",
"books_available": 5,
"filters": { "league": "nba" },
"updated_at": "2026-01-26T02:10:37.846Z"
}
}Acesso a Casas por Tier
As casas de apostas incluídas em seus resultados de odds dependem do seu tier de assinatura:
| Tier | Casas Disponíveis | Casas de Apostas Incluídas |
|---|---|---|
| Free | 2 | DraftKings, FanDuel |
| Hobby | 5 | + BetMGM, Caesars, theScore Bet |
| Pro | 15 | + Bet365, BetRivers, e mais |
| Sharp | 25 (de 43) | 25 casas à sua escolha entre as 43 disponíveis |
| Enterprise | Todas | Todas as casas de apostas disponíveis |
Pinnacle (sharp book) requer tier Sharp ou superior. Solicitar sportsbook=pinnacle em um tier Free, Hobby ou Pro retornará um erro 403 tier_restricted.
Exemplos de Filtragem
# Obter odds ao vivo da NBA de todas as casas disponíveis
curl "https://api.sharpapi.io/api/v1/odds?league=nba&is_live=true" \
-H "X-API-Key: YOUR_API_KEY"
# Obter odds de moneyline e spread para um evento específico
curl "https://api.sharpapi.io/api/v1/odds?event_id=nba_76ers_suns_2026-01-26_b3&market=moneyline,spread" \
-H "X-API-Key: YOUR_API_KEY"
# Paginar por todas as odds de spread da NFL (use next_cursor de cada resposta)
curl "https://api.sharpapi.io/api/v1/odds?league=nfl&market=spread&limit=200" \
-H "X-API-Key: YOUR_API_KEY"Endpoints Relacionados
- Odds Delta - Obtenha apenas odds que mudaram desde um determinado timestamp
- Best Odds - Obtenha as melhores odds em todas as casas para cada seleção
- Odds Comparison - Compare odds entre casas lado a lado
- Batch Odds - Busque odds para múltiplos eventos em uma única requisição
- Markets - Liste tipos de mercado disponíveis
- Sportsbooks - Liste casas de apostas disponíveis e seus status