odds-api-io 1.0.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 +329 -0
- package/dist/cjs/client.js +426 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/errors.js +73 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +20 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types.js +6 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/client.js +422 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/errors.js +64 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types.js +5 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/types/client.d.ts +275 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/errors.d.ts +40 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/types.d.ts +180 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
import { OddsAPIError, InvalidAPIKeyError, RateLimitExceededError, NotFoundError, TimeoutError, NetworkError, } from './errors.js';
|
|
2
|
+
const DEFAULT_BASE_URL = 'https://api2.odds-api.io/v3';
|
|
3
|
+
const DEFAULT_TIMEOUT = 10000;
|
|
4
|
+
/**
|
|
5
|
+
* Official Node.js client for Odds-API.io
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { OddsAPIClient } from 'odds-api-io';
|
|
10
|
+
*
|
|
11
|
+
* const client = new OddsAPIClient({ apiKey: 'your-api-key' });
|
|
12
|
+
* const sports = await client.getSports();
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export class OddsAPIClient {
|
|
16
|
+
constructor(config) {
|
|
17
|
+
this.apiKey = config.apiKey;
|
|
18
|
+
this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;
|
|
19
|
+
this.timeout = config.timeout || DEFAULT_TIMEOUT;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Make a GET request to the API
|
|
23
|
+
*/
|
|
24
|
+
async request(path, params = {}, requiresAuth = false) {
|
|
25
|
+
const url = new URL(`${this.baseUrl}/${path}`);
|
|
26
|
+
// Add query parameters
|
|
27
|
+
if (requiresAuth) {
|
|
28
|
+
params.apiKey = this.apiKey;
|
|
29
|
+
}
|
|
30
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
31
|
+
if (value !== undefined && value !== null) {
|
|
32
|
+
url.searchParams.append(key, String(value));
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
const controller = new AbortController();
|
|
36
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
37
|
+
try {
|
|
38
|
+
const response = await fetch(url.toString(), {
|
|
39
|
+
method: 'GET',
|
|
40
|
+
signal: controller.signal,
|
|
41
|
+
headers: {
|
|
42
|
+
'User-Agent': 'odds-api-io-node-sdk/1.0.0',
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
clearTimeout(timeoutId);
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
await this.handleErrorResponse(response);
|
|
48
|
+
}
|
|
49
|
+
return (await response.json());
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
clearTimeout(timeoutId);
|
|
53
|
+
if (error.name === 'AbortError') {
|
|
54
|
+
throw new TimeoutError(`Request timeout after ${this.timeout}ms`);
|
|
55
|
+
}
|
|
56
|
+
if (error instanceof OddsAPIError) {
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
throw new NetworkError(`Network request failed: ${error.message}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Make a PUT request to the API
|
|
64
|
+
*/
|
|
65
|
+
async requestPut(path, params = {}, requiresAuth = false) {
|
|
66
|
+
const url = new URL(`${this.baseUrl}/${path}`);
|
|
67
|
+
// Add query parameters
|
|
68
|
+
if (requiresAuth) {
|
|
69
|
+
params.apiKey = this.apiKey;
|
|
70
|
+
}
|
|
71
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
72
|
+
if (value !== undefined && value !== null) {
|
|
73
|
+
url.searchParams.append(key, String(value));
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
const controller = new AbortController();
|
|
77
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
78
|
+
try {
|
|
79
|
+
const response = await fetch(url.toString(), {
|
|
80
|
+
method: 'PUT',
|
|
81
|
+
signal: controller.signal,
|
|
82
|
+
headers: {
|
|
83
|
+
'User-Agent': 'odds-api-io-node-sdk/1.0.0',
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
clearTimeout(timeoutId);
|
|
87
|
+
if (!response.ok) {
|
|
88
|
+
await this.handleErrorResponse(response);
|
|
89
|
+
}
|
|
90
|
+
return (await response.json());
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
clearTimeout(timeoutId);
|
|
94
|
+
if (error.name === 'AbortError') {
|
|
95
|
+
throw new TimeoutError(`Request timeout after ${this.timeout}ms`);
|
|
96
|
+
}
|
|
97
|
+
if (error instanceof OddsAPIError) {
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
throw new NetworkError(`Network request failed: ${error.message}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Handle error responses from the API
|
|
105
|
+
*/
|
|
106
|
+
async handleErrorResponse(response) {
|
|
107
|
+
const status = response.status;
|
|
108
|
+
let errorMessage;
|
|
109
|
+
try {
|
|
110
|
+
const errorBody = await response.text();
|
|
111
|
+
errorMessage = errorBody || response.statusText;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
errorMessage = response.statusText;
|
|
115
|
+
}
|
|
116
|
+
switch (status) {
|
|
117
|
+
case 401:
|
|
118
|
+
throw new InvalidAPIKeyError('Invalid API key');
|
|
119
|
+
case 429:
|
|
120
|
+
throw new RateLimitExceededError('Rate limit exceeded - please wait before retrying');
|
|
121
|
+
case 404:
|
|
122
|
+
throw new NotFoundError('Resource not found');
|
|
123
|
+
default:
|
|
124
|
+
throw new OddsAPIError(`API error ${status}: ${errorMessage}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// ============================================================================
|
|
128
|
+
// SPORTS & LEAGUES
|
|
129
|
+
// ============================================================================
|
|
130
|
+
/**
|
|
131
|
+
* Get all available sports
|
|
132
|
+
*
|
|
133
|
+
* @returns List of available sports
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```typescript
|
|
137
|
+
* const sports = await client.getSports();
|
|
138
|
+
* console.log(`Found ${sports.length} sports`);
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
async getSports() {
|
|
142
|
+
return this.request('sports');
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get leagues for a specific sport
|
|
146
|
+
*
|
|
147
|
+
* @param sport - Sport identifier (e.g., 'basketball', 'football')
|
|
148
|
+
* @returns List of leagues
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* const leagues = await client.getLeagues('basketball');
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
async getLeagues(sport) {
|
|
156
|
+
return this.request('leagues', { sport }, true);
|
|
157
|
+
}
|
|
158
|
+
// ============================================================================
|
|
159
|
+
// EVENTS
|
|
160
|
+
// ============================================================================
|
|
161
|
+
/**
|
|
162
|
+
* Get events with optional filters
|
|
163
|
+
*
|
|
164
|
+
* @param params - Event filter parameters
|
|
165
|
+
* @returns List of events
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* ```typescript
|
|
169
|
+
* const events = await client.getEvents({
|
|
170
|
+
* sport: 'basketball',
|
|
171
|
+
* league: 'usa-nba'
|
|
172
|
+
* });
|
|
173
|
+
* ```
|
|
174
|
+
*/
|
|
175
|
+
async getEvents(params) {
|
|
176
|
+
return this.request('events', params, true);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get a specific event by ID
|
|
180
|
+
*
|
|
181
|
+
* @param eventId - Event ID
|
|
182
|
+
* @returns Event details
|
|
183
|
+
*
|
|
184
|
+
* @example
|
|
185
|
+
* ```typescript
|
|
186
|
+
* const event = await client.getEventById('62924717');
|
|
187
|
+
* ```
|
|
188
|
+
*/
|
|
189
|
+
async getEventById(eventId) {
|
|
190
|
+
return this.request(`events/${eventId}`, {}, true);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get currently live events for a sport
|
|
194
|
+
*
|
|
195
|
+
* @param sport - Sport identifier
|
|
196
|
+
* @returns List of live events
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* ```typescript
|
|
200
|
+
* const liveEvents = await client.getLiveEvents('basketball');
|
|
201
|
+
* ```
|
|
202
|
+
*/
|
|
203
|
+
async getLiveEvents(sport) {
|
|
204
|
+
return this.request('events/live', { sport }, true);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Search for events by keyword
|
|
208
|
+
*
|
|
209
|
+
* @param query - Search query
|
|
210
|
+
* @returns List of matching events
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* ```typescript
|
|
214
|
+
* const events = await client.searchEvents('Lakers');
|
|
215
|
+
* ```
|
|
216
|
+
*/
|
|
217
|
+
async searchEvents(query) {
|
|
218
|
+
return this.request('events/search', { query }, true);
|
|
219
|
+
}
|
|
220
|
+
// ============================================================================
|
|
221
|
+
// ODDS
|
|
222
|
+
// ============================================================================
|
|
223
|
+
/**
|
|
224
|
+
* Get odds for a specific event
|
|
225
|
+
*
|
|
226
|
+
* @param params - Odds query parameters
|
|
227
|
+
* @returns Event odds data
|
|
228
|
+
*
|
|
229
|
+
* @example
|
|
230
|
+
* ```typescript
|
|
231
|
+
* const odds = await client.getEventOdds({
|
|
232
|
+
* eventId: '62924717',
|
|
233
|
+
* bookmakers: 'pinnacle,bet365'
|
|
234
|
+
* });
|
|
235
|
+
* ```
|
|
236
|
+
*/
|
|
237
|
+
async getEventOdds(params) {
|
|
238
|
+
return this.request('odds', params, true);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Track odds movements for an event
|
|
242
|
+
*
|
|
243
|
+
* @param params - Odds movement parameters
|
|
244
|
+
* @returns Historical odds movements
|
|
245
|
+
*
|
|
246
|
+
* @example
|
|
247
|
+
* ```typescript
|
|
248
|
+
* const movements = await client.getOddsMovement({
|
|
249
|
+
* eventId: '62924717',
|
|
250
|
+
* bookmaker: 'pinnacle',
|
|
251
|
+
* market: 'moneyline'
|
|
252
|
+
* });
|
|
253
|
+
* ```
|
|
254
|
+
*/
|
|
255
|
+
async getOddsMovement(params) {
|
|
256
|
+
return this.request('odds/movements', params, true);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Get odds for multiple events at once
|
|
260
|
+
*
|
|
261
|
+
* @param params - Multi-event odds parameters
|
|
262
|
+
* @returns Array of event odds
|
|
263
|
+
*
|
|
264
|
+
* @example
|
|
265
|
+
* ```typescript
|
|
266
|
+
* const odds = await client.getOddsForMultipleEvents({
|
|
267
|
+
* eventIds: '12345,67890',
|
|
268
|
+
* bookmakers: 'pinnacle,bet365'
|
|
269
|
+
* });
|
|
270
|
+
* ```
|
|
271
|
+
*/
|
|
272
|
+
async getOddsForMultipleEvents(params) {
|
|
273
|
+
return this.request('odds/multi', params, true);
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Get odds updated since a given timestamp
|
|
277
|
+
*
|
|
278
|
+
* @param params - Updated odds parameters
|
|
279
|
+
* @returns Array of updated event odds
|
|
280
|
+
*
|
|
281
|
+
* @example
|
|
282
|
+
* ```typescript
|
|
283
|
+
* const updatedOdds = await client.getUpdatedOddsSince({
|
|
284
|
+
* since: Date.now() - 3600000, // Last hour
|
|
285
|
+
* bookmaker: 'pinnacle',
|
|
286
|
+
* sport: 'basketball'
|
|
287
|
+
* });
|
|
288
|
+
* ```
|
|
289
|
+
*/
|
|
290
|
+
async getUpdatedOddsSince(params) {
|
|
291
|
+
return this.request('odds/updated', params, true);
|
|
292
|
+
}
|
|
293
|
+
// ============================================================================
|
|
294
|
+
// PARTICIPANTS
|
|
295
|
+
// ============================================================================
|
|
296
|
+
/**
|
|
297
|
+
* Get participants (teams/players) for a sport
|
|
298
|
+
*
|
|
299
|
+
* @param params - Participant query parameters
|
|
300
|
+
* @returns List of participants
|
|
301
|
+
*
|
|
302
|
+
* @example
|
|
303
|
+
* ```typescript
|
|
304
|
+
* const participants = await client.getParticipants({
|
|
305
|
+
* sport: 'basketball',
|
|
306
|
+
* search: 'Warriors'
|
|
307
|
+
* });
|
|
308
|
+
* ```
|
|
309
|
+
*/
|
|
310
|
+
async getParticipants(params) {
|
|
311
|
+
return this.request('participants', params, true);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Get a specific participant by ID
|
|
315
|
+
*
|
|
316
|
+
* @param participantId - Participant ID
|
|
317
|
+
* @returns Participant details
|
|
318
|
+
*
|
|
319
|
+
* @example
|
|
320
|
+
* ```typescript
|
|
321
|
+
* const participant = await client.getParticipantById(3428);
|
|
322
|
+
* ```
|
|
323
|
+
*/
|
|
324
|
+
async getParticipantById(participantId) {
|
|
325
|
+
return this.request(`participants/${participantId}`, {}, true);
|
|
326
|
+
}
|
|
327
|
+
// ============================================================================
|
|
328
|
+
// BOOKMAKERS
|
|
329
|
+
// ============================================================================
|
|
330
|
+
/**
|
|
331
|
+
* Get all available bookmakers
|
|
332
|
+
*
|
|
333
|
+
* @returns List of bookmakers
|
|
334
|
+
*
|
|
335
|
+
* @example
|
|
336
|
+
* ```typescript
|
|
337
|
+
* const bookmakers = await client.getBookmakers();
|
|
338
|
+
* ```
|
|
339
|
+
*/
|
|
340
|
+
async getBookmakers() {
|
|
341
|
+
return this.request('bookmakers');
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Get your selected bookmakers
|
|
345
|
+
*
|
|
346
|
+
* @returns List of selected bookmakers
|
|
347
|
+
*
|
|
348
|
+
* @example
|
|
349
|
+
* ```typescript
|
|
350
|
+
* const selected = await client.getSelectedBookmakers();
|
|
351
|
+
* ```
|
|
352
|
+
*/
|
|
353
|
+
async getSelectedBookmakers() {
|
|
354
|
+
return this.request('bookmakers/selected', {}, true);
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Select specific bookmakers for your account
|
|
358
|
+
*
|
|
359
|
+
* @param bookmakers - Comma-separated bookmaker IDs
|
|
360
|
+
* @returns Success response
|
|
361
|
+
*
|
|
362
|
+
* @example
|
|
363
|
+
* ```typescript
|
|
364
|
+
* await client.selectBookmakers('pinnacle,bet365');
|
|
365
|
+
* ```
|
|
366
|
+
*/
|
|
367
|
+
async selectBookmakers(bookmakers) {
|
|
368
|
+
return this.requestPut('bookmakers/selected/select', { bookmakers }, true);
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Clear your selected bookmakers
|
|
372
|
+
*
|
|
373
|
+
* @returns Success response
|
|
374
|
+
*
|
|
375
|
+
* @example
|
|
376
|
+
* ```typescript
|
|
377
|
+
* await client.clearSelectedBookmakers();
|
|
378
|
+
* ```
|
|
379
|
+
*/
|
|
380
|
+
async clearSelectedBookmakers() {
|
|
381
|
+
return this.requestPut('bookmakers/selected/clear', {}, true);
|
|
382
|
+
}
|
|
383
|
+
// ============================================================================
|
|
384
|
+
// BETTING ANALYSIS
|
|
385
|
+
// ============================================================================
|
|
386
|
+
/**
|
|
387
|
+
* Find arbitrage betting opportunities
|
|
388
|
+
*
|
|
389
|
+
* @param params - Arbitrage bet parameters
|
|
390
|
+
* @returns List of arbitrage opportunities
|
|
391
|
+
*
|
|
392
|
+
* @example
|
|
393
|
+
* ```typescript
|
|
394
|
+
* const arbs = await client.getArbitrageBets({
|
|
395
|
+
* bookmakers: 'pinnacle,bet365',
|
|
396
|
+
* limit: 10,
|
|
397
|
+
* includeEventDetails: true
|
|
398
|
+
* });
|
|
399
|
+
* ```
|
|
400
|
+
*/
|
|
401
|
+
async getArbitrageBets(params) {
|
|
402
|
+
return this.request('arbitrage-bets', params, true);
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Find value betting opportunities
|
|
406
|
+
*
|
|
407
|
+
* @param params - Value bet parameters
|
|
408
|
+
* @returns List of value bets
|
|
409
|
+
*
|
|
410
|
+
* @example
|
|
411
|
+
* ```typescript
|
|
412
|
+
* const valueBets = await client.getValueBets({
|
|
413
|
+
* bookmaker: 'pinnacle',
|
|
414
|
+
* includeEventDetails: true
|
|
415
|
+
* });
|
|
416
|
+
* ```
|
|
417
|
+
*/
|
|
418
|
+
async getValueBets(params) {
|
|
419
|
+
return this.request('value-bets', params, true);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error classes for Odds-API.io client
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Base error class for all Odds-API.io errors
|
|
6
|
+
*/
|
|
7
|
+
export class OddsAPIError extends Error {
|
|
8
|
+
constructor(message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'OddsAPIError';
|
|
11
|
+
Object.setPrototypeOf(this, OddsAPIError.prototype);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Thrown when the API key is invalid or missing
|
|
16
|
+
*/
|
|
17
|
+
export class InvalidAPIKeyError extends OddsAPIError {
|
|
18
|
+
constructor(message = 'Invalid API key') {
|
|
19
|
+
super(message);
|
|
20
|
+
this.name = 'InvalidAPIKeyError';
|
|
21
|
+
Object.setPrototypeOf(this, InvalidAPIKeyError.prototype);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Thrown when rate limit is exceeded
|
|
26
|
+
*/
|
|
27
|
+
export class RateLimitExceededError extends OddsAPIError {
|
|
28
|
+
constructor(message = 'Rate limit exceeded - please wait before retrying') {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = 'RateLimitExceededError';
|
|
31
|
+
Object.setPrototypeOf(this, RateLimitExceededError.prototype);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Thrown when a resource is not found (404)
|
|
36
|
+
*/
|
|
37
|
+
export class NotFoundError extends OddsAPIError {
|
|
38
|
+
constructor(message = 'Resource not found') {
|
|
39
|
+
super(message);
|
|
40
|
+
this.name = 'NotFoundError';
|
|
41
|
+
Object.setPrototypeOf(this, NotFoundError.prototype);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Thrown when request times out
|
|
46
|
+
*/
|
|
47
|
+
export class TimeoutError extends OddsAPIError {
|
|
48
|
+
constructor(message = 'Request timeout') {
|
|
49
|
+
super(message);
|
|
50
|
+
this.name = 'TimeoutError';
|
|
51
|
+
Object.setPrototypeOf(this, TimeoutError.prototype);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Thrown when network request fails
|
|
56
|
+
*/
|
|
57
|
+
export class NetworkError extends OddsAPIError {
|
|
58
|
+
constructor(message) {
|
|
59
|
+
super(message);
|
|
60
|
+
this.name = 'NetworkError';
|
|
61
|
+
Object.setPrototypeOf(this, NetworkError.prototype);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAClD,YAAY,UAAkB,iBAAiB;QAC7C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,YAAY;IACtD,YAAY,UAAkB,mDAAmD;QAC/E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAY;IAC7C,YAAY,UAAkB,oBAAoB;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,YAAY;IAC5C,YAAY,UAAkB,iBAAiB;QAC7C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,YAAY;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Odds-API.io Node.js SDK
|
|
3
|
+
*
|
|
4
|
+
* Official Node.js client for Odds-API.io - Real-time sports betting odds from 250+ bookmakers
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export { OddsAPIClient } from './client.js';
|
|
9
|
+
export { OddsAPIError, InvalidAPIKeyError, RateLimitExceededError, NotFoundError, TimeoutError, NetworkError, } from './errors.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,YAAY,GACb,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|