Closing Line Value (CLV)
Analise o quão bem as odds de fechamento de um sportsbook se comparam com a probabilidade devigada (no-vig) da Pinnacle. CLV positivo significa que o book fechou mais frouxo que a Pinnacle — um proxy histórico para vantagem (edge).
GET /api/v1/historical/clvTier Sharp ou superior obrigatório. Os tiers Pro e inferiores recebem um erro 403 tier_restricted. Este endpoint é controlado pela feature closing_lines.
Janela de dados da Fase 1: As linhas de fechamento são capturadas em tempo real conforme os jogos entram ao vivo. O armazenamento Valkey retém os dados por 30 dias. Dados históricos além de 30 dias ainda não estão disponíveis.
Como as Linhas de Fechamento São Capturadas
Quando um jogo passa de pré-partida para ao vivo, o servidor captura as últimas odds de pré-partida de cada book como a linha de fechamento daquele evento. O preço de fechamento é devigado usando o método Power (o mesmo do cálculo de EV) para produzir uma probabilidade no-vig por seleção.
O CLV é então calculado como:
CLV% = (pin_no_vig_prob - book_no_vig_prob) / book_no_vig_prob × 100Onde pin_no_vig_prob é a probabilidade devigada da Pinnacle (a referência sharp) e book_no_vig_prob é a probabilidade devigada do book recreativo (soft book). Um CLV% positivo significa que o book recreativo fechou em um preço mais favorável do que a linha justa da Pinnacle.
Autenticação
Requer API key. Tier Sharp ou superior obrigatório (feature closing_lines).
Parâmetros de Query
| Parâmetro | Tipo | Padrão | Descrição |
|---|---|---|---|
from | string | 7 dias atrás | Data inicial (YYYY-MM-DD ou ISO 8601). Limitada à janela de 30 dias. |
to | string | hoje | Data final (YYYY-MM-DD ou ISO 8601). |
group_by | string | sportsbook | Dimensão de agregação. Uma de: sportsbook, sport, league, market, day. |
sport | string | todos | Filtra por esporte(s), separados por vírgula (ex.: basketball,football). |
league | string | todas | Filtra por liga(s), separadas por vírgula (ex.: nba,nfl). |
sportsbook | string | todos | Filtra por sportsbook(s), separados por vírgula. |
Janela de Datas
O tier Sharp permite até 30 dias de histórico (a janela atual de retenção para dados de linha de fechamento). Solicitar datas fora dessa janela é silenciosamente ajustado para a data mais antiga disponível.
Exemplos de Requisições
cURL
# CLV por sportsbook nos últimos 7 dias
curl -X GET "https://api.sharpapi.io/api/v1/historical/clv?from=2026-04-10&to=2026-04-17&group_by=sportsbook" \
-H "X-API-Key: YOUR_API_KEY"
# CLV agrupado por esporte, apenas NBA
curl -X GET "https://api.sharpapi.io/api/v1/historical/clv?league=nba&group_by=sport" \
-H "X-API-Key: YOUR_API_KEY"
# CLV agrupado por dia para a DraftKings
curl -X GET "https://api.sharpapi.io/api/v1/historical/clv?sportsbook=draftkings&group_by=day" \
-H "X-API-Key: YOUR_API_KEY"Resposta
Sucesso (200)
{
"success": true,
"data": {
"group_by": "sportsbook",
"groups": [
{
"group_key": "draftkings",
"samples": 312,
"avg_clv_percent": 1.42,
"avg_abs_clv_percent": 2.18,
"distinct_books": 1,
"distinct_sports": 4
},
{
"group_key": "fanduel",
"samples": 289,
"avg_clv_percent": 0.87,
"avg_abs_clv_percent": 1.95,
"distinct_books": 1,
"distinct_sports": 4
},
{
"group_key": "betmgm",
"samples": 201,
"avg_clv_percent": -0.21,
"avg_abs_clv_percent": 1.74,
"distinct_books": 1,
"distinct_sports": 3
}
],
"date_range": {
"from": "2026-04-10T00:00:00.000",
"to": "2026-04-17T00:00:00.000"
},
"total_events": 58,
"comparable_events": 51,
"sharp_reference": "pinnacle"
},
"meta": {
"source": "valkey:closing_line",
"tier_window_days": 30,
"phase": "1",
"filters": {
"sport": null,
"league": null,
"sportsbook": null,
"group_by": "sportsbook"
},
"updated_at": "2026-04-17T20:00:00.000000000Z"
}
}Resultado vazio (sem dados de linha de fechamento ainda):
{
"success": true,
"data": {
"group_by": "sportsbook",
"groups": [],
"date_range": { "from": "...", "to": "..." },
"total_events": 0,
"comparable_events": 0,
"sharp_reference": "pinnacle"
},
"meta": { "source": "valkey:closing_line", "phase": "1", ... }
}Um array groups vazio é uma resposta válida quando nenhum dado de linha de fechamento foi capturado para o intervalo de datas solicitado — não é um erro.
Respostas de Erro
403 Tier Restricted
{
"error": {
"code": "tier_restricted",
"message": "The 'closing_lines' feature requires Sharp or higher.",
"required_tier": "sharp",
"docs": "https://docs.sharpapi.io/en/pricing"
}
}400 Validation Error
{
"error": {
"code": "validation_error",
"message": "Invalid group_by. Must be one of: day, league, market, sport, sportsbook"
}
}Campos da Resposta
Objeto data
| Campo | Tipo | Descrição |
|---|---|---|
group_by | string | A dimensão usada para agregação |
groups | array | Array de linhas de grupo, ordenadas por samples em ordem decrescente |
date_range | object | Valores from/to efetivamente usados após o ajuste de tier |
total_events | integer | Total de eventos encontrados no intervalo de datas (antes do filtro da Pinnacle) |
comparable_events | integer | Eventos com uma linha de fechamento da Pinnacle disponível para comparação |
sharp_reference | string | Sharp book usado como referência de odds justas ("pinnacle") |
Campos da linha de grupo
| Campo | Tipo | Descrição |
|---|---|---|
group_key | string | O identificador do grupo (nome do sportsbook, esporte, liga, tipo de mercado ou data YYYY-MM-DD) |
samples | integer | Número de comparações de linha de fechamento neste grupo |
avg_clv_percent | number | CLV% médio entre todas as amostras. Positivo = book fechou mais frouxo que a Pinnacle. |
avg_abs_clv_percent | number | CLV% absoluto médio (medida de eficiência de mercado independente de direção) |
distinct_books | integer | Número de books distintos neste grupo |
distinct_sports | integer | Número de esportes distintos neste grupo |
Objeto meta
| Campo | Tipo | Descrição |
|---|---|---|
source | string | Sempre "valkey:closing_line" (backend da Fase 1) |
tier_window_days | integer | Máximo de dias de lookback para o seu tier (Sharp = 30) |
phase | string | "1" — captura em tempo real a partir das transições para ao vivo. Backfill via ClickHouse planejado para a Fase 2. |
updated_at | string | Timestamp ISO 8601 da resposta |
Interpretando o CLV
| CLV% | Interpretação |
|---|---|
| > +2% | Book fechou consistentemente muito mais frouxo que linhas sharp — alto valor capturado |
| +0,5% a +2% | Book fechou ligeiramente frouxo — típico de books recreativos |
| -0,5% a +0,5% | Fechamento próximo ao mercado — eficiente ou misto |
| < -0,5% | Book apertou no fechamento — pode indicar steam chasing ou ação do lado sharp |
Um CLV médio positivo nas suas apostas é o indicador mais forte de que você está apostando em preços ineficientes. Em uma amostra grande, CLV positivo prevê fortemente ROI positivo.
Endpoints Relacionados
- Closing Odds por Data — Preços de fechamento brutos por evento para uma data específica
- Oportunidades +EV — Apostas de valor esperado positivo em tempo real
- Snapshot de Odds — Odds atuais pré-partida e ao vivo