oddsapi for spread, total, moneyline.-- 1) Per-type counts by source
select season, week, line_type, source, count(*) as rows
from market_lines
where season = 2025 and week = 8
group by 1,2,3,4
order by 1,2,3,4;
-- 2) Totals by line type
select
count(*) filter (where line_type = 'moneyline') as ml_rows,
count(*) filter (where line_type = 'spread') as spread_rows,
count(*) filter (where line_type = 'total') as total_rows
from market_lines
where season = 2025 and week = 8;
-- 3) Recent sample rows (closing_line fallback to line_value)
select
game_id, season, week, line_type,
coalesce(closing_line, line_value) as line_val,
book_name, source, "timestamp"
from market_lines
where season = 2025 and week = 8
order by "timestamp" desc
limit 30;
-- 4) Moneylines look like American odds (-175 / +150)
select
game_id, coalesce(closing_line, line_value) as moneyline_price,
book_name, source, "timestamp"
from market_lines
where season = 2025 and week = 8
and line_type = 'moneyline'
order by "timestamp" desc
limit 30;
-- 5) Book coverage by type
select line_type, source, book_name, count(*) as rows
from market_lines
where season = 2025 and week = 8
group by 1,2,3
order by 1,2,3;~295 FBS games × ~9–11 books × 1 row per game/book/type → ~2,600–3,200 rows per type.