One odds data point is one returned price row: participant or outcome × line or value × sportsbook. Missing prices are not charged. Additional participants, alternate lines, and sportsbooks each add returned rows. Examples:
• GET /api/v2/events/{id}?market_ids=1&affiliate_ids=3&main_line=true&hide_closed=true — a two-sided moneyline normally returns two participant price rows = 2 odds data points, plus the response's event/score/live-state rows
• GET /api/v2/events/{id}?market_ids=1,2,3&affiliate_ids=3,19,23&main_line=true&hide_closed=true — six main-line participant/outcome rows × three books = up to 18 odds data points when every price is available, plus event/score/live-state rows
Every successful 200 snapshot bills the price rows it returns, even when a price is unchanged. V2 event snapshot responses also add one event datapoint per event, one score datapoint when present, and one more score-category datapoint when live game state is present. Delayed plans should repeat narrow filtered snapshots at the cadence their use case needs. On a zero-delay plan, use /api/v2/markets/delta only when the account has a known zero-delay entitlement, the bootstrap response explicitly returns X-Data-Delay-Seconds: 0, and meta.delta_last_id is a valid positive integer (as a number or numeric string). Otherwise, repeat a narrow filtered snapshot. Each changed price row is one odds point. X-Datapoints is authoritative for the billed total on billed responses. X-Datapoints-Breakdown is optional, is not currently emitted by /api/v2/markets/delta. WebSocket price-row messages count as one point each. Reference data (/sports, /affiliates, and /markets) is always free.