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.
@@ -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,5 @@
1
+ /**
2
+ * TypeScript type definitions for Odds-API.io
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}