gatsbie 1.0.0 → 1.0.2

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/dist/index.d.mts CHANGED
@@ -21,14 +21,18 @@ interface RecaptchaV3Solution {
21
21
  token: string;
22
22
  userAgent: string;
23
23
  }
24
- /** Solution for Akamai challenges. */
25
- interface AkamaiSolution {
24
+ /** Cookies returned by Akamai. */
25
+ interface AkamaiCookies {
26
26
  abck: string;
27
27
  bmSz: string;
28
- userAgent: string;
29
28
  country?: string;
30
29
  usrLocale?: string;
31
30
  }
31
+ /** Solution for Akamai challenges. */
32
+ interface AkamaiSolution {
33
+ cookies: AkamaiCookies;
34
+ userAgent: string;
35
+ }
32
36
  /** Solution for Vercel challenges. */
33
37
  interface VercelSolution {
34
38
  vcrcs: string;
@@ -59,9 +63,13 @@ interface PerimeterXSolution {
59
63
  cookies: PerimeterXCookies;
60
64
  userAgent: string;
61
65
  }
66
+ /** Cookies returned by Cloudflare WAF. */
67
+ interface CloudflareWAFCookies {
68
+ cfClearance: string;
69
+ }
62
70
  /** Solution for Cloudflare WAF challenges. */
63
71
  interface CloudflareWAFSolution {
64
- cfClearance: string;
72
+ cookies: CloudflareWAFCookies;
65
73
  userAgent: string;
66
74
  }
67
75
  /** Solution for Datadome Slider challenges. */
@@ -69,6 +77,42 @@ interface DatadomeSliderSolution {
69
77
  datadome: string;
70
78
  userAgent: string;
71
79
  }
80
+ /** Cookies returned by CaptchaFox. */
81
+ interface CaptchaFoxCookies {
82
+ bmS: string;
83
+ bmSc: string;
84
+ }
85
+ /** Solution for CaptchaFox challenges. */
86
+ interface CaptchaFoxSolution {
87
+ cookie: CaptchaFoxCookies;
88
+ userAgent: string;
89
+ }
90
+ /** Solution for Castle challenges. */
91
+ interface CastleSolution {
92
+ token: string;
93
+ userAgent: string;
94
+ }
95
+ /** Solution for Incapsula Reese84 challenges. */
96
+ interface Reese84Solution {
97
+ reese84: string;
98
+ userAgent: string;
99
+ }
100
+ /** Solution for Forter challenges. */
101
+ interface ForterSolution {
102
+ token: string;
103
+ userAgent: string;
104
+ }
105
+ /** Solution for Funcaptcha challenges. */
106
+ interface FuncaptchaSolution {
107
+ token: string;
108
+ userAgent: string;
109
+ }
110
+ /** Solution for Akamai SBSD challenges. */
111
+ interface SBSDSolution {
112
+ bmS: string;
113
+ bmSc: string;
114
+ userAgent: string;
115
+ }
72
116
  /** Request for solving Datadome device check challenges. */
73
117
  interface DatadomeRequest {
74
118
  proxy: string;
@@ -130,6 +174,50 @@ interface DatadomeSliderRequest {
130
174
  targetUrl: string;
131
175
  targetMethod?: string;
132
176
  }
177
+ /** Request for solving CaptchaFox challenges. */
178
+ interface CaptchaFoxRequest {
179
+ proxy: string;
180
+ targetUrl: string;
181
+ siteKey: string;
182
+ }
183
+ /** Castle configuration parameters. */
184
+ interface CastleConfigJSON {
185
+ avoidCookies?: boolean;
186
+ pk: string;
187
+ wUrl: string;
188
+ swUrl: string;
189
+ }
190
+ /** Request for solving Castle challenges. */
191
+ interface CastleRequest {
192
+ proxy: string;
193
+ targetUrl: string;
194
+ configJson: CastleConfigJSON;
195
+ }
196
+ /** Request for solving Incapsula Reese84 challenges. */
197
+ interface Reese84Request {
198
+ proxy: string;
199
+ reese84JsUrl: string;
200
+ }
201
+ /** Request for solving Forter challenges. */
202
+ interface ForterRequest {
203
+ proxy: string;
204
+ targetUrl: string;
205
+ forterJsUrl: string;
206
+ siteId: string;
207
+ }
208
+ /** Request for solving Funcaptcha challenges. */
209
+ interface FuncaptchaRequest {
210
+ proxy: string;
211
+ targetUrl: string;
212
+ customApiHost: string;
213
+ publicKey: string;
214
+ }
215
+ /** Request for solving Akamai SBSD challenges. */
216
+ interface SBSDRequest {
217
+ proxy: string;
218
+ targetUrl: string;
219
+ targetMethod: string;
220
+ }
133
221
  /** Options for configuring the Gatsbie client. */
134
222
  interface ClientOptions {
135
223
  /** Custom base URL for the API. */
@@ -206,6 +294,30 @@ declare class Client {
206
294
  * Solve a Datadome Slider CAPTCHA challenge.
207
295
  */
208
296
  solveDatadomeSlider(request: DatadomeSliderRequest): Promise<SolveResponse<DatadomeSliderSolution>>;
297
+ /**
298
+ * Solve a CaptchaFox challenge.
299
+ */
300
+ solveCaptchaFox(request: CaptchaFoxRequest): Promise<SolveResponse<CaptchaFoxSolution>>;
301
+ /**
302
+ * Solve a Castle challenge.
303
+ */
304
+ solveCastle(request: CastleRequest): Promise<SolveResponse<CastleSolution>>;
305
+ /**
306
+ * Solve an Incapsula Reese84 challenge.
307
+ */
308
+ solveReese84(request: Reese84Request): Promise<SolveResponse<Reese84Solution>>;
309
+ /**
310
+ * Solve a Forter challenge.
311
+ */
312
+ solveForter(request: ForterRequest): Promise<SolveResponse<ForterSolution>>;
313
+ /**
314
+ * Solve a Funcaptcha (Arkose Labs) challenge.
315
+ */
316
+ solveFuncaptcha(request: FuncaptchaRequest): Promise<SolveResponse<FuncaptchaSolution>>;
317
+ /**
318
+ * Solve an Akamai SBSD challenge.
319
+ */
320
+ solveSBSD(request: SBSDRequest): Promise<SolveResponse<SBSDSolution>>;
209
321
  }
210
322
 
211
323
  /**
@@ -262,4 +374,4 @@ declare class RequestError extends GatsbieError {
262
374
  constructor(message: string, cause?: Error | undefined);
263
375
  }
264
376
 
265
- export { APIError, type AkamaiRequest, type AkamaiSolution, Client, type ClientOptions, type CloudflareWAFRequest, type CloudflareWAFSolution, type DatadomeRequest, type DatadomeSliderRequest, type DatadomeSliderSolution, type DatadomeSolution, ErrorCode, GatsbieError, type HealthResponse, type PerimeterXCookies, type PerimeterXRequest, type PerimeterXSolution, type RecaptchaV3Request, type RecaptchaV3Solution, RequestError, type ShapeRequest, type ShapeSolution, type SolveResponse, type TurnstileRequest, type TurnstileSolution, type VercelRequest, type VercelSolution };
377
+ export { APIError, type AkamaiRequest, type AkamaiSolution, type CaptchaFoxCookies, type CaptchaFoxRequest, type CaptchaFoxSolution, type CastleConfigJSON, type CastleRequest, type CastleSolution, Client, type ClientOptions, type CloudflareWAFRequest, type CloudflareWAFSolution, type DatadomeRequest, type DatadomeSliderRequest, type DatadomeSliderSolution, type DatadomeSolution, ErrorCode, type ForterRequest, type ForterSolution, type FuncaptchaRequest, type FuncaptchaSolution, GatsbieError, type HealthResponse, type PerimeterXCookies, type PerimeterXRequest, type PerimeterXSolution, type RecaptchaV3Request, type RecaptchaV3Solution, type Reese84Request, type Reese84Solution, RequestError, type SBSDRequest, type SBSDSolution, type ShapeRequest, type ShapeSolution, type SolveResponse, type TurnstileRequest, type TurnstileSolution, type VercelRequest, type VercelSolution };
package/dist/index.d.ts CHANGED
@@ -21,14 +21,18 @@ interface RecaptchaV3Solution {
21
21
  token: string;
22
22
  userAgent: string;
23
23
  }
24
- /** Solution for Akamai challenges. */
25
- interface AkamaiSolution {
24
+ /** Cookies returned by Akamai. */
25
+ interface AkamaiCookies {
26
26
  abck: string;
27
27
  bmSz: string;
28
- userAgent: string;
29
28
  country?: string;
30
29
  usrLocale?: string;
31
30
  }
31
+ /** Solution for Akamai challenges. */
32
+ interface AkamaiSolution {
33
+ cookies: AkamaiCookies;
34
+ userAgent: string;
35
+ }
32
36
  /** Solution for Vercel challenges. */
33
37
  interface VercelSolution {
34
38
  vcrcs: string;
@@ -59,9 +63,13 @@ interface PerimeterXSolution {
59
63
  cookies: PerimeterXCookies;
60
64
  userAgent: string;
61
65
  }
66
+ /** Cookies returned by Cloudflare WAF. */
67
+ interface CloudflareWAFCookies {
68
+ cfClearance: string;
69
+ }
62
70
  /** Solution for Cloudflare WAF challenges. */
63
71
  interface CloudflareWAFSolution {
64
- cfClearance: string;
72
+ cookies: CloudflareWAFCookies;
65
73
  userAgent: string;
66
74
  }
67
75
  /** Solution for Datadome Slider challenges. */
@@ -69,6 +77,42 @@ interface DatadomeSliderSolution {
69
77
  datadome: string;
70
78
  userAgent: string;
71
79
  }
80
+ /** Cookies returned by CaptchaFox. */
81
+ interface CaptchaFoxCookies {
82
+ bmS: string;
83
+ bmSc: string;
84
+ }
85
+ /** Solution for CaptchaFox challenges. */
86
+ interface CaptchaFoxSolution {
87
+ cookie: CaptchaFoxCookies;
88
+ userAgent: string;
89
+ }
90
+ /** Solution for Castle challenges. */
91
+ interface CastleSolution {
92
+ token: string;
93
+ userAgent: string;
94
+ }
95
+ /** Solution for Incapsula Reese84 challenges. */
96
+ interface Reese84Solution {
97
+ reese84: string;
98
+ userAgent: string;
99
+ }
100
+ /** Solution for Forter challenges. */
101
+ interface ForterSolution {
102
+ token: string;
103
+ userAgent: string;
104
+ }
105
+ /** Solution for Funcaptcha challenges. */
106
+ interface FuncaptchaSolution {
107
+ token: string;
108
+ userAgent: string;
109
+ }
110
+ /** Solution for Akamai SBSD challenges. */
111
+ interface SBSDSolution {
112
+ bmS: string;
113
+ bmSc: string;
114
+ userAgent: string;
115
+ }
72
116
  /** Request for solving Datadome device check challenges. */
73
117
  interface DatadomeRequest {
74
118
  proxy: string;
@@ -130,6 +174,50 @@ interface DatadomeSliderRequest {
130
174
  targetUrl: string;
131
175
  targetMethod?: string;
132
176
  }
177
+ /** Request for solving CaptchaFox challenges. */
178
+ interface CaptchaFoxRequest {
179
+ proxy: string;
180
+ targetUrl: string;
181
+ siteKey: string;
182
+ }
183
+ /** Castle configuration parameters. */
184
+ interface CastleConfigJSON {
185
+ avoidCookies?: boolean;
186
+ pk: string;
187
+ wUrl: string;
188
+ swUrl: string;
189
+ }
190
+ /** Request for solving Castle challenges. */
191
+ interface CastleRequest {
192
+ proxy: string;
193
+ targetUrl: string;
194
+ configJson: CastleConfigJSON;
195
+ }
196
+ /** Request for solving Incapsula Reese84 challenges. */
197
+ interface Reese84Request {
198
+ proxy: string;
199
+ reese84JsUrl: string;
200
+ }
201
+ /** Request for solving Forter challenges. */
202
+ interface ForterRequest {
203
+ proxy: string;
204
+ targetUrl: string;
205
+ forterJsUrl: string;
206
+ siteId: string;
207
+ }
208
+ /** Request for solving Funcaptcha challenges. */
209
+ interface FuncaptchaRequest {
210
+ proxy: string;
211
+ targetUrl: string;
212
+ customApiHost: string;
213
+ publicKey: string;
214
+ }
215
+ /** Request for solving Akamai SBSD challenges. */
216
+ interface SBSDRequest {
217
+ proxy: string;
218
+ targetUrl: string;
219
+ targetMethod: string;
220
+ }
133
221
  /** Options for configuring the Gatsbie client. */
134
222
  interface ClientOptions {
135
223
  /** Custom base URL for the API. */
@@ -206,6 +294,30 @@ declare class Client {
206
294
  * Solve a Datadome Slider CAPTCHA challenge.
207
295
  */
208
296
  solveDatadomeSlider(request: DatadomeSliderRequest): Promise<SolveResponse<DatadomeSliderSolution>>;
297
+ /**
298
+ * Solve a CaptchaFox challenge.
299
+ */
300
+ solveCaptchaFox(request: CaptchaFoxRequest): Promise<SolveResponse<CaptchaFoxSolution>>;
301
+ /**
302
+ * Solve a Castle challenge.
303
+ */
304
+ solveCastle(request: CastleRequest): Promise<SolveResponse<CastleSolution>>;
305
+ /**
306
+ * Solve an Incapsula Reese84 challenge.
307
+ */
308
+ solveReese84(request: Reese84Request): Promise<SolveResponse<Reese84Solution>>;
309
+ /**
310
+ * Solve a Forter challenge.
311
+ */
312
+ solveForter(request: ForterRequest): Promise<SolveResponse<ForterSolution>>;
313
+ /**
314
+ * Solve a Funcaptcha (Arkose Labs) challenge.
315
+ */
316
+ solveFuncaptcha(request: FuncaptchaRequest): Promise<SolveResponse<FuncaptchaSolution>>;
317
+ /**
318
+ * Solve an Akamai SBSD challenge.
319
+ */
320
+ solveSBSD(request: SBSDRequest): Promise<SolveResponse<SBSDSolution>>;
209
321
  }
210
322
 
211
323
  /**
@@ -262,4 +374,4 @@ declare class RequestError extends GatsbieError {
262
374
  constructor(message: string, cause?: Error | undefined);
263
375
  }
264
376
 
265
- export { APIError, type AkamaiRequest, type AkamaiSolution, Client, type ClientOptions, type CloudflareWAFRequest, type CloudflareWAFSolution, type DatadomeRequest, type DatadomeSliderRequest, type DatadomeSliderSolution, type DatadomeSolution, ErrorCode, GatsbieError, type HealthResponse, type PerimeterXCookies, type PerimeterXRequest, type PerimeterXSolution, type RecaptchaV3Request, type RecaptchaV3Solution, RequestError, type ShapeRequest, type ShapeSolution, type SolveResponse, type TurnstileRequest, type TurnstileSolution, type VercelRequest, type VercelSolution };
377
+ export { APIError, type AkamaiRequest, type AkamaiSolution, type CaptchaFoxCookies, type CaptchaFoxRequest, type CaptchaFoxSolution, type CastleConfigJSON, type CastleRequest, type CastleSolution, Client, type ClientOptions, type CloudflareWAFRequest, type CloudflareWAFSolution, type DatadomeRequest, type DatadomeSliderRequest, type DatadomeSliderSolution, type DatadomeSolution, ErrorCode, type ForterRequest, type ForterSolution, type FuncaptchaRequest, type FuncaptchaSolution, GatsbieError, type HealthResponse, type PerimeterXCookies, type PerimeterXRequest, type PerimeterXSolution, type RecaptchaV3Request, type RecaptchaV3Solution, type Reese84Request, type Reese84Solution, RequestError, type SBSDRequest, type SBSDSolution, type ShapeRequest, type ShapeSolution, type SolveResponse, type TurnstileRequest, type TurnstileSolution, type VercelRequest, type VercelSolution };
package/dist/index.js CHANGED
@@ -226,11 +226,13 @@ var Client = class {
226
226
  taskId: data.taskId,
227
227
  service: data.service,
228
228
  solution: {
229
- abck: data.solution._abck,
230
- bmSz: data.solution.bm_sz,
231
- userAgent: data.solution.ua,
232
- country: data.solution.Country,
233
- usrLocale: data.solution.UsrLocale
229
+ cookies: {
230
+ abck: data.solution.cookies_dict._abck,
231
+ bmSz: data.solution.cookies_dict.bm_sz,
232
+ country: data.solution.cookies_dict.Country,
233
+ usrLocale: data.solution.cookies_dict.UsrLocale
234
+ },
235
+ userAgent: data.solution.ua
234
236
  },
235
237
  cost: data.cost,
236
238
  solveTime: data.solveTime
@@ -272,14 +274,14 @@ var Client = class {
272
274
  method: request.method
273
275
  };
274
276
  const data = await this.request("POST", "/v1/solve/shape", body);
275
- const { ua, ...headers } = data.solution;
277
+ const { "User-Agent": userAgent, ...headers } = data.solution;
276
278
  return {
277
279
  success: data.success,
278
280
  taskId: data.taskId,
279
281
  service: data.service,
280
282
  solution: {
281
283
  headers,
282
- userAgent: ua
284
+ userAgent: userAgent || ""
283
285
  },
284
286
  cost: data.cost,
285
287
  solveTime: data.solveTime
@@ -353,7 +355,9 @@ var Client = class {
353
355
  taskId: data.taskId,
354
356
  service: data.service,
355
357
  solution: {
356
- cfClearance: data.solution.cf_clearance,
358
+ cookies: {
359
+ cfClearance: data.solution.cookies.cf_clearance
360
+ },
357
361
  userAgent: data.solution.ua
358
362
  },
359
363
  cost: data.cost,
@@ -383,6 +387,154 @@ var Client = class {
383
387
  solveTime: data.solveTime
384
388
  };
385
389
  }
390
+ /**
391
+ * Solve a CaptchaFox challenge.
392
+ */
393
+ async solveCaptchaFox(request) {
394
+ const body = {
395
+ task_type: "captchafox",
396
+ proxy: request.proxy,
397
+ target_url: request.targetUrl,
398
+ site_key: request.siteKey
399
+ };
400
+ const data = await this.request("POST", "/v1/solve/captchafox", body);
401
+ return {
402
+ success: data.success,
403
+ taskId: data.taskId,
404
+ service: data.service,
405
+ solution: {
406
+ cookie: {
407
+ bmS: data.solution.cookie.bm_s,
408
+ bmSc: data.solution.cookie.bm_sc
409
+ },
410
+ userAgent: data.solution.ua
411
+ },
412
+ cost: data.cost,
413
+ solveTime: data.solveTime
414
+ };
415
+ }
416
+ /**
417
+ * Solve a Castle challenge.
418
+ */
419
+ async solveCastle(request) {
420
+ const body = {
421
+ task_type: "castle",
422
+ proxy: request.proxy,
423
+ target_url: request.targetUrl,
424
+ config_json: {
425
+ avoidCookies: request.configJson.avoidCookies,
426
+ pk: request.configJson.pk,
427
+ wUrl: request.configJson.wUrl,
428
+ swUrl: request.configJson.swUrl
429
+ }
430
+ };
431
+ const data = await this.request("POST", "/v1/solve/castle", body);
432
+ return {
433
+ success: data.success,
434
+ taskId: data.taskId,
435
+ service: data.service,
436
+ solution: {
437
+ token: data.solution.token,
438
+ userAgent: data.solution.ua
439
+ },
440
+ cost: data.cost,
441
+ solveTime: data.solveTime
442
+ };
443
+ }
444
+ /**
445
+ * Solve an Incapsula Reese84 challenge.
446
+ */
447
+ async solveReese84(request) {
448
+ const body = {
449
+ task_type: "reese84",
450
+ proxy: request.proxy,
451
+ reese84_js_url: request.reese84JsUrl
452
+ };
453
+ const data = await this.request("POST", "/v1/solve/reese84", body);
454
+ return {
455
+ success: data.success,
456
+ taskId: data.taskId,
457
+ service: data.service,
458
+ solution: {
459
+ reese84: data.solution.reese84,
460
+ userAgent: data.solution.user_agent
461
+ },
462
+ cost: data.cost,
463
+ solveTime: data.solveTime
464
+ };
465
+ }
466
+ /**
467
+ * Solve a Forter challenge.
468
+ */
469
+ async solveForter(request) {
470
+ const body = {
471
+ task_type: "forter",
472
+ proxy: request.proxy,
473
+ target_url: request.targetUrl,
474
+ forter_js_url: request.forterJsUrl,
475
+ site_id: request.siteId
476
+ };
477
+ const data = await this.request("POST", "/v1/solve/forter", body);
478
+ return {
479
+ success: data.success,
480
+ taskId: data.taskId,
481
+ service: data.service,
482
+ solution: {
483
+ token: data.solution.token,
484
+ userAgent: data.solution.ua
485
+ },
486
+ cost: data.cost,
487
+ solveTime: data.solveTime
488
+ };
489
+ }
490
+ /**
491
+ * Solve a Funcaptcha (Arkose Labs) challenge.
492
+ */
493
+ async solveFuncaptcha(request) {
494
+ const body = {
495
+ task_type: "funcaptcha",
496
+ proxy: request.proxy,
497
+ target_url: request.targetUrl,
498
+ custom_api_host: request.customApiHost,
499
+ public_key: request.publicKey
500
+ };
501
+ const data = await this.request("POST", "/v1/solve/funcaptcha", body);
502
+ return {
503
+ success: data.success,
504
+ taskId: data.taskId,
505
+ service: data.service,
506
+ solution: {
507
+ token: data.solution.token,
508
+ userAgent: data.solution.ua
509
+ },
510
+ cost: data.cost,
511
+ solveTime: data.solveTime
512
+ };
513
+ }
514
+ /**
515
+ * Solve an Akamai SBSD challenge.
516
+ */
517
+ async solveSBSD(request) {
518
+ const body = {
519
+ task_type: "sbsd",
520
+ proxy: request.proxy,
521
+ target_url: request.targetUrl,
522
+ target_method: request.targetMethod
523
+ };
524
+ const data = await this.request("POST", "/v1/solve/sbsd", body);
525
+ return {
526
+ success: data.success,
527
+ taskId: data.taskId,
528
+ service: data.service,
529
+ solution: {
530
+ bmS: data.solution.bm_s,
531
+ bmSc: data.solution.bm_sc,
532
+ userAgent: data.solution.ua
533
+ },
534
+ cost: data.cost,
535
+ solveTime: data.solveTime
536
+ };
537
+ }
386
538
  };
387
539
  // Annotate the CommonJS export names for ESM import in node:
388
540
  0 && (module.exports = {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts"],"sourcesContent":["/**\n * Gatsbie SDK - Official Node.js SDK for the Gatsbie Captcha API.\n *\n * @example\n * ```typescript\n * import { Client } from \"gatsbie\";\n *\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\n\nexport { Client } from \"./client\";\nexport {\n APIError,\n ErrorCode,\n GatsbieError,\n RequestError,\n} from \"./errors\";\nexport type {\n // Response types\n HealthResponse,\n SolveResponse,\n // Solution types\n AkamaiSolution,\n CloudflareWAFSolution,\n DatadomeSliderSolution,\n DatadomeSolution,\n PerimeterXCookies,\n PerimeterXSolution,\n RecaptchaV3Solution,\n ShapeSolution,\n TurnstileSolution,\n VercelSolution,\n // Request types\n AkamaiRequest,\n CloudflareWAFRequest,\n DatadomeRequest,\n DatadomeSliderRequest,\n PerimeterXRequest,\n RecaptchaV3Request,\n ShapeRequest,\n TurnstileRequest,\n VercelRequest,\n // Options\n ClientOptions,\n} from \"./types\";\n","/**\n * Error codes returned by the Gatsbie API.\n */\nexport const ErrorCode = {\n AUTH_FAILED: \"AUTH_FAILED\",\n INSUFFICIENT_CREDITS: \"INSUFFICIENT_CREDITS\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n UPSTREAM_ERROR: \"UPSTREAM_ERROR\",\n SOLVE_FAILED: \"SOLVE_FAILED\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Base error class for Gatsbie SDK errors.\n */\nexport class GatsbieError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GatsbieError\";\n Object.setPrototypeOf(this, GatsbieError.prototype);\n }\n}\n\n/**\n * Error thrown when the Gatsbie API returns an error response.\n */\nexport class APIError extends GatsbieError {\n readonly code: string;\n readonly details?: string;\n readonly timestamp?: number;\n readonly httpStatus?: number;\n\n constructor(options: {\n code: string;\n message: string;\n details?: string;\n timestamp?: number;\n httpStatus?: number;\n }) {\n const msg = options.details\n ? `gatsbie: ${options.code}: ${options.message} (${options.details})`\n : `gatsbie: ${options.code}: ${options.message}`;\n super(msg);\n this.name = \"APIError\";\n this.code = options.code;\n this.details = options.details;\n this.timestamp = options.timestamp;\n this.httpStatus = options.httpStatus;\n Object.setPrototypeOf(this, APIError.prototype);\n }\n\n /** Check if this is an authentication error. */\n isAuthError(): boolean {\n return this.code === ErrorCode.AUTH_FAILED;\n }\n\n /** Check if this error is due to insufficient credits. */\n isInsufficientCredits(): boolean {\n return this.code === ErrorCode.INSUFFICIENT_CREDITS;\n }\n\n /** Check if this error is due to an invalid request. */\n isInvalidRequest(): boolean {\n return this.code === ErrorCode.INVALID_REQUEST;\n }\n\n /** Check if this error is from an upstream service. */\n isUpstreamError(): boolean {\n return this.code === ErrorCode.UPSTREAM_ERROR;\n }\n\n /** Check if the captcha solving failed. */\n isSolveFailed(): boolean {\n return this.code === ErrorCode.SOLVE_FAILED;\n }\n\n /** Check if this is an internal server error. */\n isInternalError(): boolean {\n return this.code === ErrorCode.INTERNAL_ERROR;\n }\n}\n\n/**\n * Error thrown when a request fails (network error, timeout, etc.).\n */\nexport class RequestError extends GatsbieError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"RequestError\";\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n","import { APIError, RequestError } from \"./errors\";\nimport type {\n AkamaiRequest,\n AkamaiSolution,\n ClientOptions,\n CloudflareWAFRequest,\n CloudflareWAFSolution,\n DatadomeRequest,\n DatadomeSliderRequest,\n DatadomeSliderSolution,\n DatadomeSolution,\n HealthResponse,\n PerimeterXRequest,\n PerimeterXSolution,\n RecaptchaV3Request,\n RecaptchaV3Solution,\n ShapeRequest,\n ShapeSolution,\n SolveResponse,\n TurnstileRequest,\n TurnstileSolution,\n VercelRequest,\n VercelSolution,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api2.gatsbie.io\";\nconst DEFAULT_TIMEOUT = 120000;\n\n/**\n * Gatsbie API client.\n *\n * @example\n * ```typescript\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\nexport class Client {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n /**\n * Create a new Gatsbie API client.\n *\n * @param apiKey - Your Gatsbie API key (should start with 'gats_').\n * @param options - Optional client configuration.\n */\n constructor(apiKey: string, options: ClientOptions = {}) {\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!response.ok) {\n const error = (data.error as Record<string, unknown>) || {};\n throw new APIError({\n code: (error.code as string) || \"UNKNOWN\",\n message: (error.message as string) || \"Unknown error\",\n details: error.details as string | undefined,\n timestamp: error.timestamp as number | undefined,\n httpStatus: response.status,\n });\n }\n\n return data as T;\n } catch (err) {\n if (err instanceof APIError) {\n throw err;\n }\n if (err instanceof Error) {\n if (err.name === \"AbortError\") {\n throw new RequestError(\"Request timed out\", err);\n }\n throw new RequestError(`Request failed: ${err.message}`, err);\n }\n throw new RequestError(\"Request failed\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ========================================================================\n // API Methods\n // ========================================================================\n\n /**\n * Check the API server health status.\n */\n async health(): Promise<HealthResponse> {\n return this.request<HealthResponse>(\"GET\", \"/health\");\n }\n\n /**\n * Solve a Datadome device check challenge.\n */\n async solveDatadome(\n request: DatadomeRequest\n ): Promise<SolveResponse<DatadomeSolution>> {\n const body = {\n task_type: \"datadome-device-check\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-device-check\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a reCAPTCHA v3 challenge.\n */\n async solveRecaptchaV3(\n request: RecaptchaV3Request\n ): Promise<SolveResponse<RecaptchaV3Solution>> {\n const body: Record<string, unknown> = {\n task_type: \"recaptchav3\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n if (request.action) body.action = request.action;\n if (request.title) body.title = request.title;\n if (request.enterprise) body.enterprise = request.enterprise;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/recaptchav3\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai bot management challenge.\n */\n async solveAkamai(\n request: AkamaiRequest\n ): Promise<SolveResponse<AkamaiSolution>> {\n const body: Record<string, unknown> = {\n task_type: \"akamai\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n akamai_js_url: request.akamaiJsUrl,\n };\n if (request.pageFp) body.page_fp = request.pageFp;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n _abck: string;\n bm_sz: string;\n ua: string;\n Country?: string;\n UsrLocale?: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/akamai\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n abck: data.solution._abck,\n bmSz: data.solution.bm_sz,\n userAgent: data.solution.ua,\n country: data.solution.Country,\n usrLocale: data.solution.UsrLocale,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Vercel bot protection challenge.\n */\n async solveVercel(\n request: VercelRequest\n ): Promise<SolveResponse<VercelSolution>> {\n const body = {\n task_type: \"vercel\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { _vcrcs: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/vercel\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n vcrcs: data.solution._vcrcs,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Shape antibot challenge.\n */\n async solveShape(\n request: ShapeRequest\n ): Promise<SolveResponse<ShapeSolution>> {\n const body = {\n task_type: \"shape\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_api: request.targetApi,\n shape_js_url: request.shapeJsUrl,\n title: request.title,\n method: request.method,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: Record<string, string>;\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/shape\", body);\n\n // Shape returns dynamic headers, extract ua separately\n const { ua, ...headers } = data.solution;\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n headers,\n userAgent: ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare Turnstile challenge.\n */\n async solveTurnstile(\n request: TurnstileRequest\n ): Promise<SolveResponse<TurnstileSolution>> {\n const body = {\n task_type: \"turnstile\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/turnstile\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a PerimeterX Invisible challenge.\n */\n async solvePerimeterX(\n request: PerimeterXRequest\n ): Promise<SolveResponse<PerimeterXSolution>> {\n const body = {\n task_type: \"perimeterx_invisible\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n perimeterx_js_url: request.perimeterxJsUrl,\n pxAppId: request.pxAppId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n perimeterx_cookies: {\n _px3: string;\n _pxde: string;\n _pxvid: string;\n pxcts: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/perimeterx-invisible\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n px3: data.solution.perimeterx_cookies._px3,\n pxde: data.solution.perimeterx_cookies._pxde,\n pxvid: data.solution.perimeterx_cookies._pxvid,\n pxcts: data.solution.perimeterx_cookies.pxcts,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare WAF challenge.\n */\n async solveCloudflareWAF(\n request: CloudflareWAFRequest\n ): Promise<SolveResponse<CloudflareWAFSolution>> {\n const body = {\n task_type: \"cloudflare_waf\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { cf_clearance: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/cloudflare-waf\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cfClearance: data.solution.cf_clearance,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Datadome Slider CAPTCHA challenge.\n */\n async solveDatadomeSlider(\n request: DatadomeSliderRequest\n ): Promise<SolveResponse<DatadomeSliderSolution>> {\n const body = {\n task_type: \"datadome-slider\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-slider\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/client.ts"],"sourcesContent":["/**\n * Gatsbie SDK - Official Node.js SDK for the Gatsbie Captcha API.\n *\n * @example\n * ```typescript\n * import { Client } from \"gatsbie\";\n *\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\n\nexport { Client } from \"./client\";\nexport {\n APIError,\n ErrorCode,\n GatsbieError,\n RequestError,\n} from \"./errors\";\nexport type {\n // Response types\n HealthResponse,\n SolveResponse,\n // Solution types\n AkamaiSolution,\n CaptchaFoxCookies,\n CaptchaFoxSolution,\n CastleSolution,\n CloudflareWAFSolution,\n DatadomeSliderSolution,\n DatadomeSolution,\n ForterSolution,\n FuncaptchaSolution,\n PerimeterXCookies,\n PerimeterXSolution,\n RecaptchaV3Solution,\n Reese84Solution,\n SBSDSolution,\n ShapeSolution,\n TurnstileSolution,\n VercelSolution,\n // Request types\n AkamaiRequest,\n CaptchaFoxRequest,\n CastleConfigJSON,\n CastleRequest,\n CloudflareWAFRequest,\n DatadomeRequest,\n DatadomeSliderRequest,\n ForterRequest,\n FuncaptchaRequest,\n PerimeterXRequest,\n RecaptchaV3Request,\n Reese84Request,\n SBSDRequest,\n ShapeRequest,\n TurnstileRequest,\n VercelRequest,\n // Options\n ClientOptions,\n} from \"./types\";\n","/**\n * Error codes returned by the Gatsbie API.\n */\nexport const ErrorCode = {\n AUTH_FAILED: \"AUTH_FAILED\",\n INSUFFICIENT_CREDITS: \"INSUFFICIENT_CREDITS\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n UPSTREAM_ERROR: \"UPSTREAM_ERROR\",\n SOLVE_FAILED: \"SOLVE_FAILED\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Base error class for Gatsbie SDK errors.\n */\nexport class GatsbieError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GatsbieError\";\n Object.setPrototypeOf(this, GatsbieError.prototype);\n }\n}\n\n/**\n * Error thrown when the Gatsbie API returns an error response.\n */\nexport class APIError extends GatsbieError {\n readonly code: string;\n readonly details?: string;\n readonly timestamp?: number;\n readonly httpStatus?: number;\n\n constructor(options: {\n code: string;\n message: string;\n details?: string;\n timestamp?: number;\n httpStatus?: number;\n }) {\n const msg = options.details\n ? `gatsbie: ${options.code}: ${options.message} (${options.details})`\n : `gatsbie: ${options.code}: ${options.message}`;\n super(msg);\n this.name = \"APIError\";\n this.code = options.code;\n this.details = options.details;\n this.timestamp = options.timestamp;\n this.httpStatus = options.httpStatus;\n Object.setPrototypeOf(this, APIError.prototype);\n }\n\n /** Check if this is an authentication error. */\n isAuthError(): boolean {\n return this.code === ErrorCode.AUTH_FAILED;\n }\n\n /** Check if this error is due to insufficient credits. */\n isInsufficientCredits(): boolean {\n return this.code === ErrorCode.INSUFFICIENT_CREDITS;\n }\n\n /** Check if this error is due to an invalid request. */\n isInvalidRequest(): boolean {\n return this.code === ErrorCode.INVALID_REQUEST;\n }\n\n /** Check if this error is from an upstream service. */\n isUpstreamError(): boolean {\n return this.code === ErrorCode.UPSTREAM_ERROR;\n }\n\n /** Check if the captcha solving failed. */\n isSolveFailed(): boolean {\n return this.code === ErrorCode.SOLVE_FAILED;\n }\n\n /** Check if this is an internal server error. */\n isInternalError(): boolean {\n return this.code === ErrorCode.INTERNAL_ERROR;\n }\n}\n\n/**\n * Error thrown when a request fails (network error, timeout, etc.).\n */\nexport class RequestError extends GatsbieError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"RequestError\";\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n","import { APIError, RequestError } from \"./errors\";\nimport type {\n AkamaiRequest,\n AkamaiSolution,\n CaptchaFoxRequest,\n CaptchaFoxSolution,\n CastleRequest,\n CastleSolution,\n ClientOptions,\n CloudflareWAFRequest,\n CloudflareWAFSolution,\n DatadomeRequest,\n DatadomeSliderRequest,\n DatadomeSliderSolution,\n DatadomeSolution,\n ForterRequest,\n ForterSolution,\n FuncaptchaRequest,\n FuncaptchaSolution,\n HealthResponse,\n PerimeterXRequest,\n PerimeterXSolution,\n RecaptchaV3Request,\n RecaptchaV3Solution,\n Reese84Request,\n Reese84Solution,\n SBSDRequest,\n SBSDSolution,\n ShapeRequest,\n ShapeSolution,\n SolveResponse,\n TurnstileRequest,\n TurnstileSolution,\n VercelRequest,\n VercelSolution,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api2.gatsbie.io\";\nconst DEFAULT_TIMEOUT = 120000;\n\n/**\n * Gatsbie API client.\n *\n * @example\n * ```typescript\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\nexport class Client {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n /**\n * Create a new Gatsbie API client.\n *\n * @param apiKey - Your Gatsbie API key (should start with 'gats_').\n * @param options - Optional client configuration.\n */\n constructor(apiKey: string, options: ClientOptions = {}) {\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!response.ok) {\n const error = (data.error as Record<string, unknown>) || {};\n throw new APIError({\n code: (error.code as string) || \"UNKNOWN\",\n message: (error.message as string) || \"Unknown error\",\n details: error.details as string | undefined,\n timestamp: error.timestamp as number | undefined,\n httpStatus: response.status,\n });\n }\n\n return data as T;\n } catch (err) {\n if (err instanceof APIError) {\n throw err;\n }\n if (err instanceof Error) {\n if (err.name === \"AbortError\") {\n throw new RequestError(\"Request timed out\", err);\n }\n throw new RequestError(`Request failed: ${err.message}`, err);\n }\n throw new RequestError(\"Request failed\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ========================================================================\n // API Methods\n // ========================================================================\n\n /**\n * Check the API server health status.\n */\n async health(): Promise<HealthResponse> {\n return this.request<HealthResponse>(\"GET\", \"/health\");\n }\n\n /**\n * Solve a Datadome device check challenge.\n */\n async solveDatadome(\n request: DatadomeRequest\n ): Promise<SolveResponse<DatadomeSolution>> {\n const body = {\n task_type: \"datadome-device-check\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-device-check\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a reCAPTCHA v3 challenge.\n */\n async solveRecaptchaV3(\n request: RecaptchaV3Request\n ): Promise<SolveResponse<RecaptchaV3Solution>> {\n const body: Record<string, unknown> = {\n task_type: \"recaptchav3\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n if (request.action) body.action = request.action;\n if (request.title) body.title = request.title;\n if (request.enterprise) body.enterprise = request.enterprise;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/recaptchav3\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai bot management challenge.\n */\n async solveAkamai(\n request: AkamaiRequest\n ): Promise<SolveResponse<AkamaiSolution>> {\n const body: Record<string, unknown> = {\n task_type: \"akamai\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n akamai_js_url: request.akamaiJsUrl,\n };\n if (request.pageFp) body.page_fp = request.pageFp;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n cookies_dict: {\n _abck: string;\n bm_sz: string;\n Country?: string;\n UsrLocale?: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/akamai\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n abck: data.solution.cookies_dict._abck,\n bmSz: data.solution.cookies_dict.bm_sz,\n country: data.solution.cookies_dict.Country,\n usrLocale: data.solution.cookies_dict.UsrLocale,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Vercel bot protection challenge.\n */\n async solveVercel(\n request: VercelRequest\n ): Promise<SolveResponse<VercelSolution>> {\n const body = {\n task_type: \"vercel\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { _vcrcs: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/vercel\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n vcrcs: data.solution._vcrcs,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Shape antibot challenge.\n */\n async solveShape(\n request: ShapeRequest\n ): Promise<SolveResponse<ShapeSolution>> {\n const body = {\n task_type: \"shape\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_api: request.targetApi,\n shape_js_url: request.shapeJsUrl,\n title: request.title,\n method: request.method,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: Record<string, string>;\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/shape\", body);\n\n // Shape returns dynamic headers, extract User-Agent separately\n const { \"User-Agent\": userAgent, ...headers } = data.solution;\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n headers,\n userAgent: userAgent || \"\",\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare Turnstile challenge.\n */\n async solveTurnstile(\n request: TurnstileRequest\n ): Promise<SolveResponse<TurnstileSolution>> {\n const body = {\n task_type: \"turnstile\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/turnstile\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a PerimeterX Invisible challenge.\n */\n async solvePerimeterX(\n request: PerimeterXRequest\n ): Promise<SolveResponse<PerimeterXSolution>> {\n const body = {\n task_type: \"perimeterx_invisible\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n perimeterx_js_url: request.perimeterxJsUrl,\n pxAppId: request.pxAppId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n perimeterx_cookies: {\n _px3: string;\n _pxde: string;\n _pxvid: string;\n pxcts: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/perimeterx-invisible\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n px3: data.solution.perimeterx_cookies._px3,\n pxde: data.solution.perimeterx_cookies._pxde,\n pxvid: data.solution.perimeterx_cookies._pxvid,\n pxcts: data.solution.perimeterx_cookies.pxcts,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare WAF challenge.\n */\n async solveCloudflareWAF(\n request: CloudflareWAFRequest\n ): Promise<SolveResponse<CloudflareWAFSolution>> {\n const body = {\n task_type: \"cloudflare_waf\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n cookies: {\n cf_clearance: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/cloudflare-waf\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n cfClearance: data.solution.cookies.cf_clearance,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Datadome Slider CAPTCHA challenge.\n */\n async solveDatadomeSlider(\n request: DatadomeSliderRequest\n ): Promise<SolveResponse<DatadomeSliderSolution>> {\n const body = {\n task_type: \"datadome-slider\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-slider\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a CaptchaFox challenge.\n */\n async solveCaptchaFox(\n request: CaptchaFoxRequest\n ): Promise<SolveResponse<CaptchaFoxSolution>> {\n const body = {\n task_type: \"captchafox\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { cookie: { bm_s: string; bm_sc: string }; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/captchafox\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookie: {\n bmS: data.solution.cookie.bm_s,\n bmSc: data.solution.cookie.bm_sc,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Castle challenge.\n */\n async solveCastle(\n request: CastleRequest\n ): Promise<SolveResponse<CastleSolution>> {\n const body = {\n task_type: \"castle\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n config_json: {\n avoidCookies: request.configJson.avoidCookies,\n pk: request.configJson.pk,\n wUrl: request.configJson.wUrl,\n swUrl: request.configJson.swUrl,\n },\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/castle\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Incapsula Reese84 challenge.\n */\n async solveReese84(\n request: Reese84Request\n ): Promise<SolveResponse<Reese84Solution>> {\n const body = {\n task_type: \"reese84\",\n proxy: request.proxy,\n reese84_js_url: request.reese84JsUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { reese84: string; user_agent: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/reese84\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n reese84: data.solution.reese84,\n userAgent: data.solution.user_agent,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Forter challenge.\n */\n async solveForter(\n request: ForterRequest\n ): Promise<SolveResponse<ForterSolution>> {\n const body = {\n task_type: \"forter\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n forter_js_url: request.forterJsUrl,\n site_id: request.siteId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/forter\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Funcaptcha (Arkose Labs) challenge.\n */\n async solveFuncaptcha(\n request: FuncaptchaRequest\n ): Promise<SolveResponse<FuncaptchaSolution>> {\n const body = {\n task_type: \"funcaptcha\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n custom_api_host: request.customApiHost,\n public_key: request.publicKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/funcaptcha\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai SBSD challenge.\n */\n async solveSBSD(request: SBSDRequest): Promise<SolveResponse<SBSDSolution>> {\n const body = {\n task_type: \"sbsd\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { bm_s: string; bm_sc: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/sbsd\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n bmS: data.solution.bm_s,\n bmSc: data.solution.bm_sc,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGO,IAAM,YAAY;AAAA,EACvB,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,gBAAgB;AAClB;AAOO,IAAM,eAAN,MAAM,sBAAqB,MAAM;AAAA,EACtC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,cAAa,SAAS;AAAA,EACpD;AACF;AAKO,IAAM,WAAN,MAAM,kBAAiB,aAAa;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAMT;AACD,UAAM,MAAM,QAAQ,UAChB,YAAY,QAAQ,IAAI,KAAK,QAAQ,OAAO,KAAK,QAAQ,OAAO,MAChE,YAAY,QAAQ,IAAI,KAAK,QAAQ,OAAO;AAChD,UAAM,GAAG;AACT,SAAK,OAAO;AACZ,SAAK,OAAO,QAAQ;AACpB,SAAK,UAAU,QAAQ;AACvB,SAAK,YAAY,QAAQ;AACzB,SAAK,aAAa,QAAQ;AAC1B,WAAO,eAAe,MAAM,UAAS,SAAS;AAAA,EAChD;AAAA;AAAA,EAGA,cAAuB;AACrB,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,wBAAiC;AAC/B,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,mBAA4B;AAC1B,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,kBAA2B;AACzB,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,gBAAyB;AACvB,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAGA,kBAA2B;AACzB,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AACF;AAKO,IAAM,eAAN,MAAM,sBAAqB,aAAa;AAAA,EAC7C,YAAY,SAAiC,OAAe;AAC1D,UAAM,OAAO;AAD8B;AAE3C,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,cAAa,SAAS;AAAA,EACpD;AACF;;;ACxDA,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AAkBjB,IAAM,SAAN,MAAa;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjB,YAAY,QAAgB,UAAyB,CAAC,GAAG;AACvD,SAAK,SAAS;AACd,SAAK,WAAW,QAAQ,WAAW,kBAAkB,QAAQ,OAAO,EAAE;AACtE,SAAK,UAAU,QAAQ,WAAW;AAAA,EACpC;AAAA,EAEA,MAAc,QACZ,QACA,MACA,MACY;AACZ,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,OAAO;AAEnE,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,QACrD;AAAA,QACA,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,eAAe,UAAU,KAAK,MAAM;AAAA,QACtC;AAAA,QACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,QACpC,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,YAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,QAAS,KAAK,SAAqC,CAAC;AAC1D,cAAM,IAAI,SAAS;AAAA,UACjB,MAAO,MAAM,QAAmB;AAAA,UAChC,SAAU,MAAM,WAAsB;AAAA,UACtC,SAAS,MAAM;AAAA,UACf,WAAW,MAAM;AAAA,UACjB,YAAY,SAAS;AAAA,QACvB,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,cAAM;AAAA,MACR;AACA,UAAI,eAAe,OAAO;AACxB,YAAI,IAAI,SAAS,cAAc;AAC7B,gBAAM,IAAI,aAAa,qBAAqB,GAAG;AAAA,QACjD;AACA,cAAM,IAAI,aAAa,mBAAmB,IAAI,OAAO,IAAI,GAAG;AAAA,MAC9D;AACA,YAAM,IAAI,aAAa,gBAAgB;AAAA,IACzC,UAAE;AACA,mBAAa,SAAS;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAkC;AACtC,WAAO,KAAK,QAAwB,OAAO,SAAS;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACJ,SAC0C;AAC1C,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ,gBAAgB;AAAA,IACzC;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,mCAAmC,IAAI;AAElD,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,UAAU,KAAK,SAAS;AAAA,QACxB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACJ,SAC6C;AAC7C,UAAM,OAAgC;AAAA,MACpC,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ;AAAA,IACpB;AACA,QAAI,QAAQ,OAAQ,MAAK,SAAS,QAAQ;AAC1C,QAAI,QAAQ,MAAO,MAAK,QAAQ,QAAQ;AACxC,QAAI,QAAQ,WAAY,MAAK,aAAa,QAAQ;AAElD,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,yBAAyB,IAAI;AAExC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,OAAO,KAAK,SAAS;AAAA,QACrB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,SACwC;AACxC,UAAM,OAAgC;AAAA,MACpC,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ;AAAA,IACzB;AACA,QAAI,QAAQ,OAAQ,MAAK,UAAU,QAAQ;AAE3C,UAAM,OAAO,MAAM,KAAK,QAerB,QAAQ,oBAAoB,IAAI;AAEnC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,SAAS;AAAA,UACP,MAAM,KAAK,SAAS,aAAa;AAAA,UACjC,MAAM,KAAK,SAAS,aAAa;AAAA,UACjC,SAAS,KAAK,SAAS,aAAa;AAAA,UACpC,WAAW,KAAK,SAAS,aAAa;AAAA,QACxC;AAAA,QACA,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,SACwC;AACxC,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,IACtB;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,oBAAoB,IAAI;AAEnC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,OAAO,KAAK,SAAS;AAAA,QACrB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,SACuC;AACvC,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,YAAY,QAAQ;AAAA,MACpB,cAAc,QAAQ;AAAA,MACtB,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,mBAAmB,IAAI;AAGlC,UAAM,EAAE,cAAc,WAAW,GAAG,QAAQ,IAAI,KAAK;AAErD,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR;AAAA,QACA,WAAW,aAAa;AAAA,MAC1B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,SAC2C;AAC3C,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ;AAAA,IACpB;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,uBAAuB,IAAI;AAEtC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,OAAO,KAAK,SAAS;AAAA,QACrB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,SAC4C;AAC5C,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,mBAAmB,QAAQ;AAAA,MAC3B,SAAS,QAAQ;AAAA,IACnB;AAEA,UAAM,OAAO,MAAM,KAAK,QAerB,QAAQ,kCAAkC,IAAI;AAEjD,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,SAAS;AAAA,UACP,KAAK,KAAK,SAAS,mBAAmB;AAAA,UACtC,MAAM,KAAK,SAAS,mBAAmB;AAAA,UACvC,OAAO,KAAK,SAAS,mBAAmB;AAAA,UACxC,OAAO,KAAK,SAAS,mBAAmB;AAAA,QAC1C;AAAA,QACA,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBACJ,SAC+C;AAC/C,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ,gBAAgB;AAAA,IACzC;AAEA,UAAM,OAAO,MAAM,KAAK,QAYrB,QAAQ,4BAA4B,IAAI;AAE3C,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,SAAS;AAAA,UACP,aAAa,KAAK,SAAS,QAAQ;AAAA,QACrC;AAAA,QACA,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACJ,SACgD;AAChD,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ,gBAAgB;AAAA,IACzC;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,6BAA6B,IAAI;AAE5C,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,UAAU,KAAK,SAAS;AAAA,QACxB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,SAC4C;AAC5C,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ;AAAA,IACpB;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,wBAAwB,IAAI;AAEvC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,QAAQ;AAAA,UACN,KAAK,KAAK,SAAS,OAAO;AAAA,UAC1B,MAAM,KAAK,SAAS,OAAO;AAAA,QAC7B;AAAA,QACA,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,SACwC;AACxC,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,aAAa;AAAA,QACX,cAAc,QAAQ,WAAW;AAAA,QACjC,IAAI,QAAQ,WAAW;AAAA,QACvB,MAAM,QAAQ,WAAW;AAAA,QACzB,OAAO,QAAQ,WAAW;AAAA,MAC5B;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,oBAAoB,IAAI;AAEnC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,OAAO,KAAK,SAAS;AAAA,QACrB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,SACyC;AACzC,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,gBAAgB,QAAQ;AAAA,IAC1B;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,qBAAqB,IAAI;AAEpC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,SAAS,KAAK,SAAS;AAAA,QACvB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,SACwC;AACxC,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ;AAAA,MACvB,SAAS,QAAQ;AAAA,IACnB;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,oBAAoB,IAAI;AAEnC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,OAAO,KAAK,SAAS;AAAA,QACrB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,SAC4C;AAC5C,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,iBAAiB,QAAQ;AAAA,MACzB,YAAY,QAAQ;AAAA,IACtB;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,wBAAwB,IAAI;AAEvC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,OAAO,KAAK,SAAS;AAAA,QACrB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,SAA4D;AAC1E,UAAM,OAAO;AAAA,MACX,WAAW;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,YAAY,QAAQ;AAAA,MACpB,eAAe,QAAQ;AAAA,IACzB;AAEA,UAAM,OAAO,MAAM,KAAK,QAOrB,QAAQ,kBAAkB,IAAI;AAEjC,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,UAAU;AAAA,QACR,KAAK,KAAK,SAAS;AAAA,QACnB,MAAM,KAAK,SAAS;AAAA,QACpB,WAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,MACA,MAAM,KAAK;AAAA,MACX,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AACF;","names":[]}
package/dist/index.mjs CHANGED
@@ -196,11 +196,13 @@ var Client = class {
196
196
  taskId: data.taskId,
197
197
  service: data.service,
198
198
  solution: {
199
- abck: data.solution._abck,
200
- bmSz: data.solution.bm_sz,
201
- userAgent: data.solution.ua,
202
- country: data.solution.Country,
203
- usrLocale: data.solution.UsrLocale
199
+ cookies: {
200
+ abck: data.solution.cookies_dict._abck,
201
+ bmSz: data.solution.cookies_dict.bm_sz,
202
+ country: data.solution.cookies_dict.Country,
203
+ usrLocale: data.solution.cookies_dict.UsrLocale
204
+ },
205
+ userAgent: data.solution.ua
204
206
  },
205
207
  cost: data.cost,
206
208
  solveTime: data.solveTime
@@ -242,14 +244,14 @@ var Client = class {
242
244
  method: request.method
243
245
  };
244
246
  const data = await this.request("POST", "/v1/solve/shape", body);
245
- const { ua, ...headers } = data.solution;
247
+ const { "User-Agent": userAgent, ...headers } = data.solution;
246
248
  return {
247
249
  success: data.success,
248
250
  taskId: data.taskId,
249
251
  service: data.service,
250
252
  solution: {
251
253
  headers,
252
- userAgent: ua
254
+ userAgent: userAgent || ""
253
255
  },
254
256
  cost: data.cost,
255
257
  solveTime: data.solveTime
@@ -323,7 +325,9 @@ var Client = class {
323
325
  taskId: data.taskId,
324
326
  service: data.service,
325
327
  solution: {
326
- cfClearance: data.solution.cf_clearance,
328
+ cookies: {
329
+ cfClearance: data.solution.cookies.cf_clearance
330
+ },
327
331
  userAgent: data.solution.ua
328
332
  },
329
333
  cost: data.cost,
@@ -353,6 +357,154 @@ var Client = class {
353
357
  solveTime: data.solveTime
354
358
  };
355
359
  }
360
+ /**
361
+ * Solve a CaptchaFox challenge.
362
+ */
363
+ async solveCaptchaFox(request) {
364
+ const body = {
365
+ task_type: "captchafox",
366
+ proxy: request.proxy,
367
+ target_url: request.targetUrl,
368
+ site_key: request.siteKey
369
+ };
370
+ const data = await this.request("POST", "/v1/solve/captchafox", body);
371
+ return {
372
+ success: data.success,
373
+ taskId: data.taskId,
374
+ service: data.service,
375
+ solution: {
376
+ cookie: {
377
+ bmS: data.solution.cookie.bm_s,
378
+ bmSc: data.solution.cookie.bm_sc
379
+ },
380
+ userAgent: data.solution.ua
381
+ },
382
+ cost: data.cost,
383
+ solveTime: data.solveTime
384
+ };
385
+ }
386
+ /**
387
+ * Solve a Castle challenge.
388
+ */
389
+ async solveCastle(request) {
390
+ const body = {
391
+ task_type: "castle",
392
+ proxy: request.proxy,
393
+ target_url: request.targetUrl,
394
+ config_json: {
395
+ avoidCookies: request.configJson.avoidCookies,
396
+ pk: request.configJson.pk,
397
+ wUrl: request.configJson.wUrl,
398
+ swUrl: request.configJson.swUrl
399
+ }
400
+ };
401
+ const data = await this.request("POST", "/v1/solve/castle", body);
402
+ return {
403
+ success: data.success,
404
+ taskId: data.taskId,
405
+ service: data.service,
406
+ solution: {
407
+ token: data.solution.token,
408
+ userAgent: data.solution.ua
409
+ },
410
+ cost: data.cost,
411
+ solveTime: data.solveTime
412
+ };
413
+ }
414
+ /**
415
+ * Solve an Incapsula Reese84 challenge.
416
+ */
417
+ async solveReese84(request) {
418
+ const body = {
419
+ task_type: "reese84",
420
+ proxy: request.proxy,
421
+ reese84_js_url: request.reese84JsUrl
422
+ };
423
+ const data = await this.request("POST", "/v1/solve/reese84", body);
424
+ return {
425
+ success: data.success,
426
+ taskId: data.taskId,
427
+ service: data.service,
428
+ solution: {
429
+ reese84: data.solution.reese84,
430
+ userAgent: data.solution.user_agent
431
+ },
432
+ cost: data.cost,
433
+ solveTime: data.solveTime
434
+ };
435
+ }
436
+ /**
437
+ * Solve a Forter challenge.
438
+ */
439
+ async solveForter(request) {
440
+ const body = {
441
+ task_type: "forter",
442
+ proxy: request.proxy,
443
+ target_url: request.targetUrl,
444
+ forter_js_url: request.forterJsUrl,
445
+ site_id: request.siteId
446
+ };
447
+ const data = await this.request("POST", "/v1/solve/forter", body);
448
+ return {
449
+ success: data.success,
450
+ taskId: data.taskId,
451
+ service: data.service,
452
+ solution: {
453
+ token: data.solution.token,
454
+ userAgent: data.solution.ua
455
+ },
456
+ cost: data.cost,
457
+ solveTime: data.solveTime
458
+ };
459
+ }
460
+ /**
461
+ * Solve a Funcaptcha (Arkose Labs) challenge.
462
+ */
463
+ async solveFuncaptcha(request) {
464
+ const body = {
465
+ task_type: "funcaptcha",
466
+ proxy: request.proxy,
467
+ target_url: request.targetUrl,
468
+ custom_api_host: request.customApiHost,
469
+ public_key: request.publicKey
470
+ };
471
+ const data = await this.request("POST", "/v1/solve/funcaptcha", body);
472
+ return {
473
+ success: data.success,
474
+ taskId: data.taskId,
475
+ service: data.service,
476
+ solution: {
477
+ token: data.solution.token,
478
+ userAgent: data.solution.ua
479
+ },
480
+ cost: data.cost,
481
+ solveTime: data.solveTime
482
+ };
483
+ }
484
+ /**
485
+ * Solve an Akamai SBSD challenge.
486
+ */
487
+ async solveSBSD(request) {
488
+ const body = {
489
+ task_type: "sbsd",
490
+ proxy: request.proxy,
491
+ target_url: request.targetUrl,
492
+ target_method: request.targetMethod
493
+ };
494
+ const data = await this.request("POST", "/v1/solve/sbsd", body);
495
+ return {
496
+ success: data.success,
497
+ taskId: data.taskId,
498
+ service: data.service,
499
+ solution: {
500
+ bmS: data.solution.bm_s,
501
+ bmSc: data.solution.bm_sc,
502
+ userAgent: data.solution.ua
503
+ },
504
+ cost: data.cost,
505
+ solveTime: data.solveTime
506
+ };
507
+ }
356
508
  };
357
509
  export {
358
510
  APIError,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/client.ts"],"sourcesContent":["/**\n * Error codes returned by the Gatsbie API.\n */\nexport const ErrorCode = {\n AUTH_FAILED: \"AUTH_FAILED\",\n INSUFFICIENT_CREDITS: \"INSUFFICIENT_CREDITS\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n UPSTREAM_ERROR: \"UPSTREAM_ERROR\",\n SOLVE_FAILED: \"SOLVE_FAILED\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Base error class for Gatsbie SDK errors.\n */\nexport class GatsbieError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GatsbieError\";\n Object.setPrototypeOf(this, GatsbieError.prototype);\n }\n}\n\n/**\n * Error thrown when the Gatsbie API returns an error response.\n */\nexport class APIError extends GatsbieError {\n readonly code: string;\n readonly details?: string;\n readonly timestamp?: number;\n readonly httpStatus?: number;\n\n constructor(options: {\n code: string;\n message: string;\n details?: string;\n timestamp?: number;\n httpStatus?: number;\n }) {\n const msg = options.details\n ? `gatsbie: ${options.code}: ${options.message} (${options.details})`\n : `gatsbie: ${options.code}: ${options.message}`;\n super(msg);\n this.name = \"APIError\";\n this.code = options.code;\n this.details = options.details;\n this.timestamp = options.timestamp;\n this.httpStatus = options.httpStatus;\n Object.setPrototypeOf(this, APIError.prototype);\n }\n\n /** Check if this is an authentication error. */\n isAuthError(): boolean {\n return this.code === ErrorCode.AUTH_FAILED;\n }\n\n /** Check if this error is due to insufficient credits. */\n isInsufficientCredits(): boolean {\n return this.code === ErrorCode.INSUFFICIENT_CREDITS;\n }\n\n /** Check if this error is due to an invalid request. */\n isInvalidRequest(): boolean {\n return this.code === ErrorCode.INVALID_REQUEST;\n }\n\n /** Check if this error is from an upstream service. */\n isUpstreamError(): boolean {\n return this.code === ErrorCode.UPSTREAM_ERROR;\n }\n\n /** Check if the captcha solving failed. */\n isSolveFailed(): boolean {\n return this.code === ErrorCode.SOLVE_FAILED;\n }\n\n /** Check if this is an internal server error. */\n isInternalError(): boolean {\n return this.code === ErrorCode.INTERNAL_ERROR;\n }\n}\n\n/**\n * Error thrown when a request fails (network error, timeout, etc.).\n */\nexport class RequestError extends GatsbieError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"RequestError\";\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n","import { APIError, RequestError } from \"./errors\";\nimport type {\n AkamaiRequest,\n AkamaiSolution,\n ClientOptions,\n CloudflareWAFRequest,\n CloudflareWAFSolution,\n DatadomeRequest,\n DatadomeSliderRequest,\n DatadomeSliderSolution,\n DatadomeSolution,\n HealthResponse,\n PerimeterXRequest,\n PerimeterXSolution,\n RecaptchaV3Request,\n RecaptchaV3Solution,\n ShapeRequest,\n ShapeSolution,\n SolveResponse,\n TurnstileRequest,\n TurnstileSolution,\n VercelRequest,\n VercelSolution,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api2.gatsbie.io\";\nconst DEFAULT_TIMEOUT = 120000;\n\n/**\n * Gatsbie API client.\n *\n * @example\n * ```typescript\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\nexport class Client {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n /**\n * Create a new Gatsbie API client.\n *\n * @param apiKey - Your Gatsbie API key (should start with 'gats_').\n * @param options - Optional client configuration.\n */\n constructor(apiKey: string, options: ClientOptions = {}) {\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!response.ok) {\n const error = (data.error as Record<string, unknown>) || {};\n throw new APIError({\n code: (error.code as string) || \"UNKNOWN\",\n message: (error.message as string) || \"Unknown error\",\n details: error.details as string | undefined,\n timestamp: error.timestamp as number | undefined,\n httpStatus: response.status,\n });\n }\n\n return data as T;\n } catch (err) {\n if (err instanceof APIError) {\n throw err;\n }\n if (err instanceof Error) {\n if (err.name === \"AbortError\") {\n throw new RequestError(\"Request timed out\", err);\n }\n throw new RequestError(`Request failed: ${err.message}`, err);\n }\n throw new RequestError(\"Request failed\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ========================================================================\n // API Methods\n // ========================================================================\n\n /**\n * Check the API server health status.\n */\n async health(): Promise<HealthResponse> {\n return this.request<HealthResponse>(\"GET\", \"/health\");\n }\n\n /**\n * Solve a Datadome device check challenge.\n */\n async solveDatadome(\n request: DatadomeRequest\n ): Promise<SolveResponse<DatadomeSolution>> {\n const body = {\n task_type: \"datadome-device-check\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-device-check\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a reCAPTCHA v3 challenge.\n */\n async solveRecaptchaV3(\n request: RecaptchaV3Request\n ): Promise<SolveResponse<RecaptchaV3Solution>> {\n const body: Record<string, unknown> = {\n task_type: \"recaptchav3\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n if (request.action) body.action = request.action;\n if (request.title) body.title = request.title;\n if (request.enterprise) body.enterprise = request.enterprise;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/recaptchav3\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai bot management challenge.\n */\n async solveAkamai(\n request: AkamaiRequest\n ): Promise<SolveResponse<AkamaiSolution>> {\n const body: Record<string, unknown> = {\n task_type: \"akamai\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n akamai_js_url: request.akamaiJsUrl,\n };\n if (request.pageFp) body.page_fp = request.pageFp;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n _abck: string;\n bm_sz: string;\n ua: string;\n Country?: string;\n UsrLocale?: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/akamai\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n abck: data.solution._abck,\n bmSz: data.solution.bm_sz,\n userAgent: data.solution.ua,\n country: data.solution.Country,\n usrLocale: data.solution.UsrLocale,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Vercel bot protection challenge.\n */\n async solveVercel(\n request: VercelRequest\n ): Promise<SolveResponse<VercelSolution>> {\n const body = {\n task_type: \"vercel\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { _vcrcs: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/vercel\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n vcrcs: data.solution._vcrcs,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Shape antibot challenge.\n */\n async solveShape(\n request: ShapeRequest\n ): Promise<SolveResponse<ShapeSolution>> {\n const body = {\n task_type: \"shape\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_api: request.targetApi,\n shape_js_url: request.shapeJsUrl,\n title: request.title,\n method: request.method,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: Record<string, string>;\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/shape\", body);\n\n // Shape returns dynamic headers, extract ua separately\n const { ua, ...headers } = data.solution;\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n headers,\n userAgent: ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare Turnstile challenge.\n */\n async solveTurnstile(\n request: TurnstileRequest\n ): Promise<SolveResponse<TurnstileSolution>> {\n const body = {\n task_type: \"turnstile\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/turnstile\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a PerimeterX Invisible challenge.\n */\n async solvePerimeterX(\n request: PerimeterXRequest\n ): Promise<SolveResponse<PerimeterXSolution>> {\n const body = {\n task_type: \"perimeterx_invisible\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n perimeterx_js_url: request.perimeterxJsUrl,\n pxAppId: request.pxAppId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n perimeterx_cookies: {\n _px3: string;\n _pxde: string;\n _pxvid: string;\n pxcts: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/perimeterx-invisible\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n px3: data.solution.perimeterx_cookies._px3,\n pxde: data.solution.perimeterx_cookies._pxde,\n pxvid: data.solution.perimeterx_cookies._pxvid,\n pxcts: data.solution.perimeterx_cookies.pxcts,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare WAF challenge.\n */\n async solveCloudflareWAF(\n request: CloudflareWAFRequest\n ): Promise<SolveResponse<CloudflareWAFSolution>> {\n const body = {\n task_type: \"cloudflare_waf\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { cf_clearance: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/cloudflare-waf\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cfClearance: data.solution.cf_clearance,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Datadome Slider CAPTCHA challenge.\n */\n async solveDatadomeSlider(\n request: DatadomeSliderRequest\n ): Promise<SolveResponse<DatadomeSliderSolution>> {\n const body = {\n task_type: \"datadome-slider\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-slider\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/client.ts"],"sourcesContent":["/**\n * Error codes returned by the Gatsbie API.\n */\nexport const ErrorCode = {\n AUTH_FAILED: \"AUTH_FAILED\",\n INSUFFICIENT_CREDITS: \"INSUFFICIENT_CREDITS\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n UPSTREAM_ERROR: \"UPSTREAM_ERROR\",\n SOLVE_FAILED: \"SOLVE_FAILED\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Base error class for Gatsbie SDK errors.\n */\nexport class GatsbieError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"GatsbieError\";\n Object.setPrototypeOf(this, GatsbieError.prototype);\n }\n}\n\n/**\n * Error thrown when the Gatsbie API returns an error response.\n */\nexport class APIError extends GatsbieError {\n readonly code: string;\n readonly details?: string;\n readonly timestamp?: number;\n readonly httpStatus?: number;\n\n constructor(options: {\n code: string;\n message: string;\n details?: string;\n timestamp?: number;\n httpStatus?: number;\n }) {\n const msg = options.details\n ? `gatsbie: ${options.code}: ${options.message} (${options.details})`\n : `gatsbie: ${options.code}: ${options.message}`;\n super(msg);\n this.name = \"APIError\";\n this.code = options.code;\n this.details = options.details;\n this.timestamp = options.timestamp;\n this.httpStatus = options.httpStatus;\n Object.setPrototypeOf(this, APIError.prototype);\n }\n\n /** Check if this is an authentication error. */\n isAuthError(): boolean {\n return this.code === ErrorCode.AUTH_FAILED;\n }\n\n /** Check if this error is due to insufficient credits. */\n isInsufficientCredits(): boolean {\n return this.code === ErrorCode.INSUFFICIENT_CREDITS;\n }\n\n /** Check if this error is due to an invalid request. */\n isInvalidRequest(): boolean {\n return this.code === ErrorCode.INVALID_REQUEST;\n }\n\n /** Check if this error is from an upstream service. */\n isUpstreamError(): boolean {\n return this.code === ErrorCode.UPSTREAM_ERROR;\n }\n\n /** Check if the captcha solving failed. */\n isSolveFailed(): boolean {\n return this.code === ErrorCode.SOLVE_FAILED;\n }\n\n /** Check if this is an internal server error. */\n isInternalError(): boolean {\n return this.code === ErrorCode.INTERNAL_ERROR;\n }\n}\n\n/**\n * Error thrown when a request fails (network error, timeout, etc.).\n */\nexport class RequestError extends GatsbieError {\n constructor(message: string, public readonly cause?: Error) {\n super(message);\n this.name = \"RequestError\";\n Object.setPrototypeOf(this, RequestError.prototype);\n }\n}\n","import { APIError, RequestError } from \"./errors\";\nimport type {\n AkamaiRequest,\n AkamaiSolution,\n CaptchaFoxRequest,\n CaptchaFoxSolution,\n CastleRequest,\n CastleSolution,\n ClientOptions,\n CloudflareWAFRequest,\n CloudflareWAFSolution,\n DatadomeRequest,\n DatadomeSliderRequest,\n DatadomeSliderSolution,\n DatadomeSolution,\n ForterRequest,\n ForterSolution,\n FuncaptchaRequest,\n FuncaptchaSolution,\n HealthResponse,\n PerimeterXRequest,\n PerimeterXSolution,\n RecaptchaV3Request,\n RecaptchaV3Solution,\n Reese84Request,\n Reese84Solution,\n SBSDRequest,\n SBSDSolution,\n ShapeRequest,\n ShapeSolution,\n SolveResponse,\n TurnstileRequest,\n TurnstileSolution,\n VercelRequest,\n VercelSolution,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://api2.gatsbie.io\";\nconst DEFAULT_TIMEOUT = 120000;\n\n/**\n * Gatsbie API client.\n *\n * @example\n * ```typescript\n * const client = new Client(\"gats_your_api_key\");\n *\n * const response = await client.solveTurnstile({\n * proxy: \"http://user:pass@proxy:8080\",\n * targetUrl: \"https://example.com\",\n * siteKey: \"0x4AAAAAAABS7TtLxsNa7Z2e\",\n * });\n *\n * console.log(response.solution.token);\n * ```\n */\nexport class Client {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n /**\n * Create a new Gatsbie API client.\n *\n * @param apiKey - Your Gatsbie API key (should start with 'gats_').\n * @param options - Optional client configuration.\n */\n constructor(apiKey: string, options: ClientOptions = {}) {\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n const data = (await response.json()) as Record<string, unknown>;\n\n if (!response.ok) {\n const error = (data.error as Record<string, unknown>) || {};\n throw new APIError({\n code: (error.code as string) || \"UNKNOWN\",\n message: (error.message as string) || \"Unknown error\",\n details: error.details as string | undefined,\n timestamp: error.timestamp as number | undefined,\n httpStatus: response.status,\n });\n }\n\n return data as T;\n } catch (err) {\n if (err instanceof APIError) {\n throw err;\n }\n if (err instanceof Error) {\n if (err.name === \"AbortError\") {\n throw new RequestError(\"Request timed out\", err);\n }\n throw new RequestError(`Request failed: ${err.message}`, err);\n }\n throw new RequestError(\"Request failed\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ========================================================================\n // API Methods\n // ========================================================================\n\n /**\n * Check the API server health status.\n */\n async health(): Promise<HealthResponse> {\n return this.request<HealthResponse>(\"GET\", \"/health\");\n }\n\n /**\n * Solve a Datadome device check challenge.\n */\n async solveDatadome(\n request: DatadomeRequest\n ): Promise<SolveResponse<DatadomeSolution>> {\n const body = {\n task_type: \"datadome-device-check\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-device-check\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a reCAPTCHA v3 challenge.\n */\n async solveRecaptchaV3(\n request: RecaptchaV3Request\n ): Promise<SolveResponse<RecaptchaV3Solution>> {\n const body: Record<string, unknown> = {\n task_type: \"recaptchav3\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n if (request.action) body.action = request.action;\n if (request.title) body.title = request.title;\n if (request.enterprise) body.enterprise = request.enterprise;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/recaptchav3\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai bot management challenge.\n */\n async solveAkamai(\n request: AkamaiRequest\n ): Promise<SolveResponse<AkamaiSolution>> {\n const body: Record<string, unknown> = {\n task_type: \"akamai\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n akamai_js_url: request.akamaiJsUrl,\n };\n if (request.pageFp) body.page_fp = request.pageFp;\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n cookies_dict: {\n _abck: string;\n bm_sz: string;\n Country?: string;\n UsrLocale?: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/akamai\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n abck: data.solution.cookies_dict._abck,\n bmSz: data.solution.cookies_dict.bm_sz,\n country: data.solution.cookies_dict.Country,\n usrLocale: data.solution.cookies_dict.UsrLocale,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Vercel bot protection challenge.\n */\n async solveVercel(\n request: VercelRequest\n ): Promise<SolveResponse<VercelSolution>> {\n const body = {\n task_type: \"vercel\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { _vcrcs: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/vercel\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n vcrcs: data.solution._vcrcs,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Shape antibot challenge.\n */\n async solveShape(\n request: ShapeRequest\n ): Promise<SolveResponse<ShapeSolution>> {\n const body = {\n task_type: \"shape\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_api: request.targetApi,\n shape_js_url: request.shapeJsUrl,\n title: request.title,\n method: request.method,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: Record<string, string>;\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/shape\", body);\n\n // Shape returns dynamic headers, extract User-Agent separately\n const { \"User-Agent\": userAgent, ...headers } = data.solution;\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n headers,\n userAgent: userAgent || \"\",\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare Turnstile challenge.\n */\n async solveTurnstile(\n request: TurnstileRequest\n ): Promise<SolveResponse<TurnstileSolution>> {\n const body = {\n task_type: \"turnstile\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/turnstile\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a PerimeterX Invisible challenge.\n */\n async solvePerimeterX(\n request: PerimeterXRequest\n ): Promise<SolveResponse<PerimeterXSolution>> {\n const body = {\n task_type: \"perimeterx_invisible\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n perimeterx_js_url: request.perimeterxJsUrl,\n pxAppId: request.pxAppId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n perimeterx_cookies: {\n _px3: string;\n _pxde: string;\n _pxvid: string;\n pxcts: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/perimeterx-invisible\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n px3: data.solution.perimeterx_cookies._px3,\n pxde: data.solution.perimeterx_cookies._pxde,\n pxvid: data.solution.perimeterx_cookies._pxvid,\n pxcts: data.solution.perimeterx_cookies.pxcts,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Cloudflare WAF challenge.\n */\n async solveCloudflareWAF(\n request: CloudflareWAFRequest\n ): Promise<SolveResponse<CloudflareWAFSolution>> {\n const body = {\n task_type: \"cloudflare_waf\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: {\n cookies: {\n cf_clearance: string;\n };\n ua: string;\n };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/cloudflare-waf\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookies: {\n cfClearance: data.solution.cookies.cf_clearance,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Datadome Slider CAPTCHA challenge.\n */\n async solveDatadomeSlider(\n request: DatadomeSliderRequest\n ): Promise<SolveResponse<DatadomeSliderSolution>> {\n const body = {\n task_type: \"datadome-slider\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod ?? \"GET\",\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { datadome: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/datadome-slider\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n datadome: data.solution.datadome,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a CaptchaFox challenge.\n */\n async solveCaptchaFox(\n request: CaptchaFoxRequest\n ): Promise<SolveResponse<CaptchaFoxSolution>> {\n const body = {\n task_type: \"captchafox\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n site_key: request.siteKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { cookie: { bm_s: string; bm_sc: string }; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/captchafox\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n cookie: {\n bmS: data.solution.cookie.bm_s,\n bmSc: data.solution.cookie.bm_sc,\n },\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Castle challenge.\n */\n async solveCastle(\n request: CastleRequest\n ): Promise<SolveResponse<CastleSolution>> {\n const body = {\n task_type: \"castle\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n config_json: {\n avoidCookies: request.configJson.avoidCookies,\n pk: request.configJson.pk,\n wUrl: request.configJson.wUrl,\n swUrl: request.configJson.swUrl,\n },\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/castle\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Incapsula Reese84 challenge.\n */\n async solveReese84(\n request: Reese84Request\n ): Promise<SolveResponse<Reese84Solution>> {\n const body = {\n task_type: \"reese84\",\n proxy: request.proxy,\n reese84_js_url: request.reese84JsUrl,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { reese84: string; user_agent: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/reese84\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n reese84: data.solution.reese84,\n userAgent: data.solution.user_agent,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Forter challenge.\n */\n async solveForter(\n request: ForterRequest\n ): Promise<SolveResponse<ForterSolution>> {\n const body = {\n task_type: \"forter\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n forter_js_url: request.forterJsUrl,\n site_id: request.siteId,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/forter\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve a Funcaptcha (Arkose Labs) challenge.\n */\n async solveFuncaptcha(\n request: FuncaptchaRequest\n ): Promise<SolveResponse<FuncaptchaSolution>> {\n const body = {\n task_type: \"funcaptcha\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n custom_api_host: request.customApiHost,\n public_key: request.publicKey,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { token: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/funcaptcha\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n token: data.solution.token,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n\n /**\n * Solve an Akamai SBSD challenge.\n */\n async solveSBSD(request: SBSDRequest): Promise<SolveResponse<SBSDSolution>> {\n const body = {\n task_type: \"sbsd\",\n proxy: request.proxy,\n target_url: request.targetUrl,\n target_method: request.targetMethod,\n };\n\n const data = await this.request<{\n success: boolean;\n taskId: string;\n service: string;\n solution: { bm_s: string; bm_sc: string; ua: string };\n cost: number;\n solveTime: number;\n }>(\"POST\", \"/v1/solve/sbsd\", body);\n\n return {\n success: data.success,\n taskId: data.taskId,\n service: data.service,\n solution: {\n bmS: data.solution.bm_s,\n bmSc: data.solution.bm_sc,\n userAgent: data.solution.ua,\n },\n cost: data.cost,\n solveTime: data.solveTime,\n };\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gatsbie",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Official Node.js SDK for the Gatsbie Captcha API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",