propline 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +396 -0
- package/dist/index.cjs +401 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +446 -0
- package/dist/index.d.ts +446 -0
- package/dist/index.js +369 -0
- package/dist/index.js.map +1 -0
- package/package.json +64 -0
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response shape definitions for PropLine API.
|
|
3
|
+
*
|
|
4
|
+
* These mirror the JSON returned by api.prop-line.com and are intentionally
|
|
5
|
+
* loose — every interface allows extra fields so adding a column server-side
|
|
6
|
+
* never breaks consumers. Use them as guides, not contracts.
|
|
7
|
+
*/
|
|
8
|
+
interface Sport {
|
|
9
|
+
key: string;
|
|
10
|
+
title: string;
|
|
11
|
+
active: boolean;
|
|
12
|
+
[k: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
interface Event {
|
|
15
|
+
id: number | string;
|
|
16
|
+
sport_key: string;
|
|
17
|
+
home_team: string;
|
|
18
|
+
away_team: string;
|
|
19
|
+
commence_time: string;
|
|
20
|
+
[k: string]: unknown;
|
|
21
|
+
}
|
|
22
|
+
interface Outcome {
|
|
23
|
+
name: string;
|
|
24
|
+
description?: string | null;
|
|
25
|
+
price: number;
|
|
26
|
+
point?: number | null;
|
|
27
|
+
[k: string]: unknown;
|
|
28
|
+
}
|
|
29
|
+
interface ResolvedOutcome extends Outcome {
|
|
30
|
+
resolution: "won" | "lost" | "push" | "void" | null;
|
|
31
|
+
actual_value: number | null;
|
|
32
|
+
resolved_at: string | null;
|
|
33
|
+
redacted?: boolean;
|
|
34
|
+
}
|
|
35
|
+
interface Market {
|
|
36
|
+
key: string;
|
|
37
|
+
outcomes: Outcome[];
|
|
38
|
+
[k: string]: unknown;
|
|
39
|
+
}
|
|
40
|
+
interface Bookmaker {
|
|
41
|
+
key: string;
|
|
42
|
+
title: string;
|
|
43
|
+
markets: Market[];
|
|
44
|
+
[k: string]: unknown;
|
|
45
|
+
}
|
|
46
|
+
interface OddsResponse {
|
|
47
|
+
id: number | string;
|
|
48
|
+
sport_key: string;
|
|
49
|
+
home_team: string;
|
|
50
|
+
away_team: string;
|
|
51
|
+
commence_time: string;
|
|
52
|
+
bookmakers: Bookmaker[];
|
|
53
|
+
[k: string]: unknown;
|
|
54
|
+
}
|
|
55
|
+
interface MarketSummary {
|
|
56
|
+
key: string;
|
|
57
|
+
outcomes_count: number;
|
|
58
|
+
[k: string]: unknown;
|
|
59
|
+
}
|
|
60
|
+
interface OutcomeSnapshot {
|
|
61
|
+
recorded_at: string;
|
|
62
|
+
price: number;
|
|
63
|
+
point?: number | null;
|
|
64
|
+
[k: string]: unknown;
|
|
65
|
+
}
|
|
66
|
+
interface OddsHistoryOutcome {
|
|
67
|
+
name: string;
|
|
68
|
+
description?: string | null;
|
|
69
|
+
snapshots: OutcomeSnapshot[];
|
|
70
|
+
snapshots_available?: number;
|
|
71
|
+
redacted?: boolean;
|
|
72
|
+
[k: string]: unknown;
|
|
73
|
+
}
|
|
74
|
+
interface OddsHistoryMarket {
|
|
75
|
+
key: string;
|
|
76
|
+
outcomes: OddsHistoryOutcome[];
|
|
77
|
+
[k: string]: unknown;
|
|
78
|
+
}
|
|
79
|
+
interface OddsHistoryResponse {
|
|
80
|
+
id: number | string;
|
|
81
|
+
sport_key: string;
|
|
82
|
+
home_team: string;
|
|
83
|
+
away_team: string;
|
|
84
|
+
commence_time: string;
|
|
85
|
+
markets: OddsHistoryMarket[];
|
|
86
|
+
upgrade_url?: string;
|
|
87
|
+
[k: string]: unknown;
|
|
88
|
+
}
|
|
89
|
+
interface ScoreEvent {
|
|
90
|
+
id: number | string;
|
|
91
|
+
sport_key: string;
|
|
92
|
+
home_team: string;
|
|
93
|
+
away_team: string;
|
|
94
|
+
commence_time: string;
|
|
95
|
+
status: "upcoming" | "in_progress" | "final" | string;
|
|
96
|
+
home_score: number | null;
|
|
97
|
+
away_score: number | null;
|
|
98
|
+
[k: string]: unknown;
|
|
99
|
+
}
|
|
100
|
+
interface PlayerStat {
|
|
101
|
+
player_name: string;
|
|
102
|
+
team_abbr: string;
|
|
103
|
+
stat_type: string;
|
|
104
|
+
stat_value: number;
|
|
105
|
+
[k: string]: unknown;
|
|
106
|
+
}
|
|
107
|
+
interface StatsResponse {
|
|
108
|
+
id: number | string;
|
|
109
|
+
sport_key: string;
|
|
110
|
+
home_team: string;
|
|
111
|
+
away_team: string;
|
|
112
|
+
status: string;
|
|
113
|
+
home_score: number | null;
|
|
114
|
+
away_score: number | null;
|
|
115
|
+
stats: PlayerStat[];
|
|
116
|
+
[k: string]: unknown;
|
|
117
|
+
}
|
|
118
|
+
interface ResultsMarket {
|
|
119
|
+
key: string;
|
|
120
|
+
outcomes: ResolvedOutcome[];
|
|
121
|
+
[k: string]: unknown;
|
|
122
|
+
}
|
|
123
|
+
interface ResultsResponse {
|
|
124
|
+
id: number | string;
|
|
125
|
+
sport_key: string;
|
|
126
|
+
home_team: string;
|
|
127
|
+
away_team: string;
|
|
128
|
+
status: string;
|
|
129
|
+
home_score: number | null;
|
|
130
|
+
away_score: number | null;
|
|
131
|
+
markets: ResultsMarket[];
|
|
132
|
+
upgrade_url?: string;
|
|
133
|
+
[k: string]: unknown;
|
|
134
|
+
}
|
|
135
|
+
interface PlayerHistoryEntry {
|
|
136
|
+
event_id: number | string;
|
|
137
|
+
commence_time: string;
|
|
138
|
+
home_team: string;
|
|
139
|
+
away_team: string;
|
|
140
|
+
bookmaker: string;
|
|
141
|
+
bookmaker_title: string;
|
|
142
|
+
line: number | null;
|
|
143
|
+
over_price: number | null;
|
|
144
|
+
under_price: number | null;
|
|
145
|
+
actual_value: number | null;
|
|
146
|
+
over_result: "won" | "lost" | "push" | "void" | null;
|
|
147
|
+
under_result: "won" | "lost" | "push" | "void" | null;
|
|
148
|
+
resolved_at: string | null;
|
|
149
|
+
redacted?: boolean;
|
|
150
|
+
[k: string]: unknown;
|
|
151
|
+
}
|
|
152
|
+
interface PlayerHistoryResponse {
|
|
153
|
+
player_name: string;
|
|
154
|
+
sport_key: string;
|
|
155
|
+
market: string;
|
|
156
|
+
entries: PlayerHistoryEntry[];
|
|
157
|
+
upgrade_url?: string;
|
|
158
|
+
[k: string]: unknown;
|
|
159
|
+
}
|
|
160
|
+
interface Webhook {
|
|
161
|
+
id: number;
|
|
162
|
+
url: string;
|
|
163
|
+
secret: string;
|
|
164
|
+
active: boolean;
|
|
165
|
+
events: string[];
|
|
166
|
+
filter_sport_key: string | null;
|
|
167
|
+
filter_event_id: number | null;
|
|
168
|
+
filter_market_key: string | null;
|
|
169
|
+
filter_player_name: string | null;
|
|
170
|
+
min_price_change_pct: number | null;
|
|
171
|
+
created_at: string;
|
|
172
|
+
[k: string]: unknown;
|
|
173
|
+
}
|
|
174
|
+
interface WebhookDelivery {
|
|
175
|
+
id: number;
|
|
176
|
+
webhook_id: number;
|
|
177
|
+
status: "pending" | "success" | "failed" | string;
|
|
178
|
+
response_code: number | null;
|
|
179
|
+
attempts: number;
|
|
180
|
+
delivered_at: string | null;
|
|
181
|
+
payload: Record<string, unknown>;
|
|
182
|
+
[k: string]: unknown;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** Base error for all PropLine API failures. */
|
|
186
|
+
declare class PropLineError extends Error {
|
|
187
|
+
readonly statusCode: number;
|
|
188
|
+
readonly detail: string;
|
|
189
|
+
constructor(statusCode: number, detail: string);
|
|
190
|
+
}
|
|
191
|
+
/** Thrown when the API key is missing or invalid (HTTP 401). */
|
|
192
|
+
declare class AuthError extends PropLineError {
|
|
193
|
+
constructor(detail?: string);
|
|
194
|
+
}
|
|
195
|
+
/** Thrown when the daily request limit is exceeded (HTTP 429). */
|
|
196
|
+
declare class RateLimitError extends PropLineError {
|
|
197
|
+
constructor(detail?: string);
|
|
198
|
+
}
|
|
199
|
+
interface PropLineOptions {
|
|
200
|
+
/** API base URL. Default: `https://api.prop-line.com/v1`. */
|
|
201
|
+
baseUrl?: string;
|
|
202
|
+
/** Request timeout in milliseconds. Default: 15000. */
|
|
203
|
+
timeoutMs?: number;
|
|
204
|
+
/** Custom fetch implementation. Defaults to global `fetch` (Node 18+). */
|
|
205
|
+
fetch?: typeof fetch;
|
|
206
|
+
}
|
|
207
|
+
interface GetOddsOptions {
|
|
208
|
+
/** Specific event ID to get odds (with player props) for. Omit for bulk odds. */
|
|
209
|
+
eventId?: number | string;
|
|
210
|
+
/** Market keys to filter by. */
|
|
211
|
+
markets?: string[];
|
|
212
|
+
}
|
|
213
|
+
interface GetOddsHistoryOptions {
|
|
214
|
+
markets?: string[];
|
|
215
|
+
}
|
|
216
|
+
interface GetScoresOptions {
|
|
217
|
+
/** Days back to include (default 3). */
|
|
218
|
+
daysFrom?: number;
|
|
219
|
+
}
|
|
220
|
+
interface GetStatsOptions {
|
|
221
|
+
/** Stat types to filter by (e.g. `["strikeouts", "hits"]`). */
|
|
222
|
+
statType?: string[];
|
|
223
|
+
}
|
|
224
|
+
interface GetResultsOptions {
|
|
225
|
+
markets?: string[];
|
|
226
|
+
}
|
|
227
|
+
interface GetPlayerHistoryOptions {
|
|
228
|
+
/** Market key (e.g. `"pitcher_strikeouts"`). Required. */
|
|
229
|
+
market: string;
|
|
230
|
+
/** Restrict to a single bookmaker (e.g. `"draftkings"`). */
|
|
231
|
+
bookmaker?: string;
|
|
232
|
+
/** Max entries (1-100). Default 20. */
|
|
233
|
+
limit?: number;
|
|
234
|
+
}
|
|
235
|
+
interface ExportResolvedPropsOptions {
|
|
236
|
+
/** Sport key (e.g. `"baseball_mlb"`). Required. */
|
|
237
|
+
sport: string;
|
|
238
|
+
/** Optional market filter. */
|
|
239
|
+
market?: string;
|
|
240
|
+
/** Optional bookmaker filter. */
|
|
241
|
+
bookmaker?: string;
|
|
242
|
+
/** ISO datetime lower bound on `resolved_at`. */
|
|
243
|
+
since?: string;
|
|
244
|
+
/** ISO datetime upper bound on `resolved_at`. */
|
|
245
|
+
until?: string;
|
|
246
|
+
/** If set, stream the CSV to this path and resolve to the path. Otherwise resolve to the CSV bytes. */
|
|
247
|
+
outPath?: string;
|
|
248
|
+
}
|
|
249
|
+
interface CreateWebhookOptions {
|
|
250
|
+
/** HTTPS endpoint to receive POSTed events. Required. */
|
|
251
|
+
url: string;
|
|
252
|
+
/** Event types to subscribe to. Default: all. */
|
|
253
|
+
events?: Array<"line_movement" | "resolution">;
|
|
254
|
+
filterSportKey?: string;
|
|
255
|
+
filterEventId?: number;
|
|
256
|
+
filterMarketKey?: string;
|
|
257
|
+
filterPlayerName?: string;
|
|
258
|
+
/** Minimum % change in American odds to fire a line_movement. Point-only shifts always pass. */
|
|
259
|
+
minPriceChangePct?: number;
|
|
260
|
+
}
|
|
261
|
+
interface UpdateWebhookOptions {
|
|
262
|
+
url?: string;
|
|
263
|
+
events?: Array<"line_movement" | "resolution">;
|
|
264
|
+
filterSportKey?: string;
|
|
265
|
+
filterEventId?: number;
|
|
266
|
+
filterMarketKey?: string;
|
|
267
|
+
filterPlayerName?: string;
|
|
268
|
+
minPriceChangePct?: number;
|
|
269
|
+
active?: boolean;
|
|
270
|
+
}
|
|
271
|
+
interface ListWebhookDeliveriesOptions {
|
|
272
|
+
/** Max deliveries to return. Default 50. */
|
|
273
|
+
limit?: number;
|
|
274
|
+
}
|
|
275
|
+
interface VerifySignatureOptions {
|
|
276
|
+
/** Webhook signing secret (returned once from `createWebhook`). */
|
|
277
|
+
secret: string;
|
|
278
|
+
/** Value of the `X-PropLine-Timestamp` header. */
|
|
279
|
+
timestamp: string;
|
|
280
|
+
/** Raw request body. */
|
|
281
|
+
body: Uint8Array | Buffer | string;
|
|
282
|
+
/** Value of the `X-PropLine-Signature` header. */
|
|
283
|
+
signature: string;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Client for the PropLine player props API.
|
|
287
|
+
*
|
|
288
|
+
* @example
|
|
289
|
+
* ```ts
|
|
290
|
+
* import { PropLine } from "propline";
|
|
291
|
+
*
|
|
292
|
+
* const client = new PropLine("your_api_key");
|
|
293
|
+
* const sports = await client.getSports();
|
|
294
|
+
* ```
|
|
295
|
+
*/
|
|
296
|
+
declare class PropLine {
|
|
297
|
+
readonly apiKey: string;
|
|
298
|
+
readonly baseUrl: string;
|
|
299
|
+
readonly timeoutMs: number;
|
|
300
|
+
private readonly _fetch;
|
|
301
|
+
constructor(apiKey: string, options?: PropLineOptions);
|
|
302
|
+
private _buildUrl;
|
|
303
|
+
private _request;
|
|
304
|
+
/** List all available sports. */
|
|
305
|
+
getSports(): Promise<Sport[]>;
|
|
306
|
+
/** List upcoming events for a sport. */
|
|
307
|
+
getEvents(sport: string): Promise<Event[]>;
|
|
308
|
+
/**
|
|
309
|
+
* Get current odds. With `eventId`, returns single-event odds (including
|
|
310
|
+
* player props). Without, returns bulk odds for all upcoming events.
|
|
311
|
+
*
|
|
312
|
+
* Each response carries a `bookmakers` array — iterate it to compare
|
|
313
|
+
* lines across Bovada, DraftKings, FanDuel, Pinnacle, Unibet, and
|
|
314
|
+
* PrizePicks (coverage varies by sport).
|
|
315
|
+
*/
|
|
316
|
+
getOdds(sport: string, options: GetOddsOptions & {
|
|
317
|
+
eventId: number | string;
|
|
318
|
+
}): Promise<OddsResponse>;
|
|
319
|
+
getOdds(sport: string, options?: Omit<GetOddsOptions, "eventId"> & {
|
|
320
|
+
eventId?: undefined;
|
|
321
|
+
}): Promise<OddsResponse[]>;
|
|
322
|
+
/** List the available market types for an event. */
|
|
323
|
+
getMarkets(sport: string, eventId: number | string): Promise<MarketSummary[]>;
|
|
324
|
+
/**
|
|
325
|
+
* Get historical odds movement for an event.
|
|
326
|
+
*
|
|
327
|
+
* Pro tier: full snapshots. Free tier: redacted (snapshot counts only).
|
|
328
|
+
*/
|
|
329
|
+
getOddsHistory(sport: string, eventId: number | string, options?: GetOddsHistoryOptions): Promise<OddsHistoryResponse>;
|
|
330
|
+
/** Get game scores and status (free tier). */
|
|
331
|
+
getScores(sport: string, options?: GetScoresOptions): Promise<ScoreEvent[]>;
|
|
332
|
+
/**
|
|
333
|
+
* Get raw player/team box-score stats (book-agnostic, free tier).
|
|
334
|
+
*
|
|
335
|
+
* Returns actual stat values decoupled from any bookmaker's lines.
|
|
336
|
+
*/
|
|
337
|
+
getStats(sport: string, eventId: number | string, options?: GetStatsOptions): Promise<StatsResponse>;
|
|
338
|
+
/**
|
|
339
|
+
* Get resolved prop outcomes with actual player stats.
|
|
340
|
+
*
|
|
341
|
+
* Pro tier: full data. Free tier: redacted (resolution + actual nulled).
|
|
342
|
+
*/
|
|
343
|
+
getResults(sport: string, eventId: number | string, options?: GetResultsOptions): Promise<ResultsResponse>;
|
|
344
|
+
/**
|
|
345
|
+
* Recent resolved prop history for a player on a market.
|
|
346
|
+
*
|
|
347
|
+
* One entry per (event, bookmaker) pair. Pro: full. Free: redacted.
|
|
348
|
+
*/
|
|
349
|
+
getPlayerHistory(sport: string, playerName: string, options: GetPlayerHistoryOptions): Promise<PlayerHistoryResponse>;
|
|
350
|
+
/**
|
|
351
|
+
* Bulk CSV export of resolved prop outcomes (Pro+ tier).
|
|
352
|
+
*
|
|
353
|
+
* If `outPath` is provided, streams the CSV to disk and resolves to the
|
|
354
|
+
* path. Otherwise resolves to the full CSV bytes as a `Uint8Array`.
|
|
355
|
+
*
|
|
356
|
+
* @example
|
|
357
|
+
* ```ts
|
|
358
|
+
* await client.exportResolvedProps({
|
|
359
|
+
* sport: "baseball_mlb",
|
|
360
|
+
* market: "pitcher_strikeouts",
|
|
361
|
+
* since: "2026-04-01T00:00:00Z",
|
|
362
|
+
* outPath: "./mlb-strikeouts.csv",
|
|
363
|
+
* });
|
|
364
|
+
* ```
|
|
365
|
+
*/
|
|
366
|
+
exportResolvedProps(options: ExportResolvedPropsOptions & {
|
|
367
|
+
outPath: string;
|
|
368
|
+
}): Promise<string>;
|
|
369
|
+
exportResolvedProps(options: ExportResolvedPropsOptions & {
|
|
370
|
+
outPath?: undefined;
|
|
371
|
+
}): Promise<Uint8Array>;
|
|
372
|
+
/**
|
|
373
|
+
* Register a webhook subscription. Streaming tier only.
|
|
374
|
+
*
|
|
375
|
+
* The returned object includes the full signing `secret` — this is the
|
|
376
|
+
* ONLY time it's revealed. Store it securely.
|
|
377
|
+
*/
|
|
378
|
+
createWebhook(options: CreateWebhookOptions): Promise<Webhook>;
|
|
379
|
+
/** List your webhook subscriptions. Secrets are masked. */
|
|
380
|
+
listWebhooks(): Promise<Webhook[]>;
|
|
381
|
+
/** Get a single webhook subscription. Secret is masked. */
|
|
382
|
+
getWebhook(webhookId: number): Promise<Webhook>;
|
|
383
|
+
/** Update fields on a webhook. Only supplied fields are changed. */
|
|
384
|
+
updateWebhook(webhookId: number, options: UpdateWebhookOptions): Promise<Webhook>;
|
|
385
|
+
/** Delete a webhook (cascades its delivery history). */
|
|
386
|
+
deleteWebhook(webhookId: number): Promise<{
|
|
387
|
+
ok: boolean;
|
|
388
|
+
} | unknown>;
|
|
389
|
+
/** Queue a sample `test` payload to the webhook's URL. */
|
|
390
|
+
testWebhook(webhookId: number): Promise<unknown>;
|
|
391
|
+
/** Last 50 (default) delivery attempts for a webhook. */
|
|
392
|
+
listWebhookDeliveries(webhookId: number, options?: ListWebhookDeliveriesOptions): Promise<WebhookDelivery[]>;
|
|
393
|
+
/**
|
|
394
|
+
* Verify that an inbound webhook delivery was signed by PropLine.
|
|
395
|
+
*
|
|
396
|
+
* Compares HMAC-SHA256(secret, `${timestamp}.` + body) against the
|
|
397
|
+
* `X-PropLine-Signature` header in constant time.
|
|
398
|
+
*
|
|
399
|
+
* @example
|
|
400
|
+
* ```ts
|
|
401
|
+
* import { PropLine } from "propline";
|
|
402
|
+
*
|
|
403
|
+
* app.post("/hooks/propline", express.raw({ type: "*\/*" }), (req, res) => {
|
|
404
|
+
* const ok = PropLine.verifySignature({
|
|
405
|
+
* secret: process.env.WEBHOOK_SECRET!,
|
|
406
|
+
* timestamp: req.header("X-PropLine-Timestamp")!,
|
|
407
|
+
* body: req.body, // raw Buffer
|
|
408
|
+
* signature: req.header("X-PropLine-Signature")!,
|
|
409
|
+
* });
|
|
410
|
+
* if (!ok) return res.status(401).end();
|
|
411
|
+
* // ...
|
|
412
|
+
* });
|
|
413
|
+
* ```
|
|
414
|
+
*/
|
|
415
|
+
static verifySignature(options: VerifySignatureOptions): boolean;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
* PropLine — Node/TypeScript SDK for the PropLine player props API.
|
|
420
|
+
*
|
|
421
|
+
* @example
|
|
422
|
+
* ```ts
|
|
423
|
+
* import { PropLine } from "propline";
|
|
424
|
+
*
|
|
425
|
+
* const client = new PropLine("your_api_key");
|
|
426
|
+
* const events = await client.getEvents("basketball_nba");
|
|
427
|
+
* const odds = await client.getOdds("basketball_nba", {
|
|
428
|
+
* eventId: events[0].id,
|
|
429
|
+
* markets: ["player_points", "player_rebounds"],
|
|
430
|
+
* });
|
|
431
|
+
* ```
|
|
432
|
+
*/
|
|
433
|
+
|
|
434
|
+
/** String constants for bookmaker keys in odds responses. */
|
|
435
|
+
declare const Bookmakers: {
|
|
436
|
+
readonly BOVADA: "bovada";
|
|
437
|
+
readonly DRAFTKINGS: "draftkings";
|
|
438
|
+
readonly FANDUEL: "fanduel";
|
|
439
|
+
readonly PINNACLE: "pinnacle";
|
|
440
|
+
readonly PRIZEPICKS: "prizepicks";
|
|
441
|
+
readonly UNIBET: "unibet";
|
|
442
|
+
};
|
|
443
|
+
type BookmakerKey = (typeof Bookmakers)[keyof typeof Bookmakers];
|
|
444
|
+
declare const VERSION = "0.1.0";
|
|
445
|
+
|
|
446
|
+
export { AuthError, type Bookmaker, type BookmakerKey, Bookmakers, type CreateWebhookOptions, type Event, type ExportResolvedPropsOptions, type GetOddsHistoryOptions, type GetOddsOptions, type GetPlayerHistoryOptions, type GetResultsOptions, type GetScoresOptions, type GetStatsOptions, type ListWebhookDeliveriesOptions, type Market, type MarketSummary, type OddsHistoryMarket, type OddsHistoryOutcome, type OddsHistoryResponse, type OddsResponse, type Outcome, type OutcomeSnapshot, type PlayerHistoryEntry, type PlayerHistoryResponse, type PlayerStat, PropLine, PropLineError, type PropLineOptions, RateLimitError, type ResolvedOutcome, type ResultsMarket, type ResultsResponse, type ScoreEvent, type Sport, type StatsResponse, type UpdateWebhookOptions, VERSION, type VerifySignatureOptions, type Webhook, type WebhookDelivery };
|