@crawlkit-sh/sdk 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,6 +17,7 @@ Turn any website into structured data with a single API call. CrawlKit handles p
17
17
  - **Screenshots** - Capture full-page screenshots
18
18
  - **LinkedIn Scraping** - Scrape company profiles and person profiles
19
19
  - **Instagram Scraping** - Scrape profiles and posts/reels
20
+ - **TikTok Scraping** - Scrape profiles, posts, and paginated post lists
20
21
  - **App Store Data** - Fetch reviews and details from Google Play & Apple App Store
21
22
  - **Browser Automation** - Click, type, scroll, and execute JavaScript
22
23
  - **TypeScript First** - Full type safety with comprehensive type definitions
@@ -272,6 +273,39 @@ console.log(details.description);
272
273
  const iosReviews = await crawlkit.appstore.appstoreReviews({
273
274
  appId: '123456789'
274
275
  });
276
+
277
+ // Apple App Store app details
278
+ const iosDetails = await crawlkit.appstore.appstoreDetail({
279
+ appId: '1492793493'
280
+ });
281
+ console.log(iosDetails.appName);
282
+ ```
283
+
284
+ ### TikTok Scraping
285
+
286
+ Scrape TikTok profiles and content:
287
+
288
+ ```typescript
289
+ const profile = await crawlkit.tiktok.profile({
290
+ username: 'nike'
291
+ });
292
+
293
+ console.log(profile.profile.username);
294
+ console.log(profile.profile.stats?.followers);
295
+
296
+ const post = await crawlkit.tiktok.content({
297
+ url: 'https://www.tiktok.com/@nike/video/1234567890'
298
+ });
299
+
300
+ console.log(post.post.id);
301
+ console.log(post.post.mediaType);
302
+
303
+ const posts = await crawlkit.tiktok.posts({
304
+ username: 'nike'
305
+ });
306
+
307
+ console.log(posts.posts.length);
308
+ console.log(posts.pagination.hasMore);
275
309
  ```
276
310
 
277
311
  ## Error Handling
@@ -348,7 +382,11 @@ const crawlkit = new CrawlKit({
348
382
  | `instagram.content()` | 1 |
349
383
  | `appstore.playstoreReviews()` | 1 per page |
350
384
  | `appstore.playstoreDetail()` | 1 |
385
+ | `appstore.appstoreDetail()` | 1 |
351
386
  | `appstore.appstoreReviews()` | 1 per page |
387
+ | `tiktok.profile()` | 1 |
388
+ | `tiktok.content()` | 1 |
389
+ | `tiktok.posts()` | 1 per page |
352
390
 
353
391
  ## TypeScript Support
354
392
 
@@ -373,7 +411,7 @@ For detailed API documentation and guides, visit [docs.crawlkit.sh](https://docs
373
411
 
374
412
  ## Support
375
413
 
376
- - [GitHub Issues](https://github.com/crawlkit/sdk/issues)
414
+ - [GitHub Issues](https://github.com/mozhn/crawlkit-sdk/issues)
377
415
  - [Documentation](https://docs.crawlkit.sh)
378
416
  - Email: support@crawlkit.sh
379
417
 
package/dist/index.cjs CHANGED
@@ -519,6 +519,28 @@ var AppStoreResource = class extends BaseResource {
519
519
  async playstoreDetail(params) {
520
520
  return this.post("/v1/crawl/playstore/detail", params);
521
521
  }
522
+ /**
523
+ * Fetch Apple App Store app details
524
+ *
525
+ * @param params - App detail parameters
526
+ * @returns App information including metadata, ratings, and media
527
+ * @throws {CrawlKitError} On API errors
528
+ *
529
+ * @example
530
+ * ```typescript
531
+ * const result = await crawlkit.appstore.appstoreDetail({
532
+ * appId: '1492793493',
533
+ * options: { lang: 'en' }
534
+ * });
535
+ * console.log(result.appName);
536
+ * console.log(result.rating);
537
+ * ```
538
+ *
539
+ * @costs 1 credit
540
+ */
541
+ async appstoreDetail(params) {
542
+ return this.post("/v1/crawl/appstore/detail", params);
543
+ }
522
544
  /**
523
545
  * Fetch Apple App Store reviews for an app
524
546
  *
@@ -552,6 +574,80 @@ var AppStoreResource = class extends BaseResource {
552
574
  }
553
575
  };
554
576
 
577
+ // src/resources/tiktok.ts
578
+ var TikTokResource = class extends BaseResource {
579
+ /**
580
+ * Scrape a TikTok profile
581
+ *
582
+ * @param params - Profile parameters (username)
583
+ * @returns Profile data including stats and metadata
584
+ * @throws {CrawlKitError} On API errors
585
+ *
586
+ * @example
587
+ * ```typescript
588
+ * const result = await crawlkit.tiktok.profile({
589
+ * username: 'nike'
590
+ * });
591
+ * console.log(result.profile.username);
592
+ * console.log(result.profile.stats?.followers);
593
+ * ```
594
+ *
595
+ * @costs 1 credit
596
+ */
597
+ async profile(params) {
598
+ return this.post("/v1/crawl/tiktok/profile", params);
599
+ }
600
+ /**
601
+ * Scrape a single TikTok content item
602
+ *
603
+ * @param params - Post parameters (post URL)
604
+ * @returns Post details including author, media, stats, and hashtags
605
+ * @throws {CrawlKitError} On API errors
606
+ *
607
+ * @example
608
+ * ```typescript
609
+ * const result = await crawlkit.tiktok.content({
610
+ * url: 'https://www.tiktok.com/@nike/video/1234567890'
611
+ * });
612
+ * console.log(result.post.id);
613
+ * console.log(result.post.video?.url);
614
+ * ```
615
+ *
616
+ * @costs 1 credit
617
+ */
618
+ async content(params) {
619
+ return this.post("/v1/crawl/tiktok/post", params);
620
+ }
621
+ /**
622
+ * List TikTok content with cursor-based pagination
623
+ *
624
+ * @param params - Post list parameters (username and optional cursor/secUid)
625
+ * @returns A page of posts and pagination metadata
626
+ * @throws {CrawlKitError} On API errors
627
+ *
628
+ * @example
629
+ * ```typescript
630
+ * const firstPage = await crawlkit.tiktok.posts({
631
+ * username: 'nike'
632
+ * });
633
+ *
634
+ * if (firstPage.pagination.hasMore) {
635
+ * const nextPage = await crawlkit.tiktok.posts({
636
+ * username: 'nike',
637
+ * cursor: Number(firstPage.pagination.cursor),
638
+ * secUid: firstPage.pagination.secUid ?? undefined
639
+ * });
640
+ * console.log(nextPage.posts.length);
641
+ * }
642
+ * ```
643
+ *
644
+ * @costs 1 credit per page
645
+ */
646
+ async posts(params) {
647
+ return this.post("/v1/crawl/tiktok/posts", params);
648
+ }
649
+ };
650
+
555
651
  // src/client.ts
556
652
  var CrawlKit = class {
557
653
  /**
@@ -593,6 +689,7 @@ var CrawlKit = class {
593
689
  this.linkedin = new LinkedInResource(resourceConfig);
594
690
  this.instagram = new InstagramResource(resourceConfig);
595
691
  this.appstore = new AppStoreResource(resourceConfig);
692
+ this.tiktok = new TikTokResource(resourceConfig);
596
693
  }
597
694
  /**
598
695
  * Scrape a URL and return markdown, HTML, metadata, and links
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors/index.ts","../src/resources/base.ts","../src/resources/crawl.ts","../src/resources/linkedin.ts","../src/resources/instagram.ts","../src/resources/appstore.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ErrorCode } from '../types/common.js';\n\n/**\n * Base error class for all CrawlKit errors\n */\nexport class CrawlKitError extends Error {\n /** Error code from API */\n public readonly code: ErrorCode;\n /** HTTP status code */\n public readonly statusCode: number;\n /** Credits refunded if operation failed */\n public readonly creditsRefunded?: number;\n /** Remaining credits after operation */\n public readonly creditsRemaining?: number;\n\n constructor(\n code: ErrorCode,\n message: string,\n statusCode: number,\n creditsRefunded?: number,\n creditsRemaining?: number\n ) {\n super(message);\n this.name = 'CrawlKitError';\n this.code = code;\n this.statusCode = statusCode;\n this.creditsRefunded = creditsRefunded;\n this.creditsRemaining = creditsRemaining;\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Authentication error - invalid or missing API key\n */\nexport class AuthenticationError extends CrawlKitError {\n constructor(message: string = 'Invalid or missing API key') {\n super('VALIDATION_ERROR', message, 401);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Insufficient credits to perform the operation\n */\nexport class InsufficientCreditsError extends CrawlKitError {\n /** Credits required for the operation */\n public readonly required?: number;\n /** Credits available */\n public readonly available?: number;\n\n constructor(\n message: string,\n creditsRefunded?: number,\n creditsRemaining?: number\n ) {\n super('INSUFFICIENT_CREDITS', message, 402, creditsRefunded, creditsRemaining);\n this.name = 'InsufficientCreditsError';\n this.available = creditsRemaining;\n }\n}\n\n/**\n * Validation error - invalid request parameters\n */\nexport class ValidationError extends CrawlKitError {\n constructor(message: string) {\n super('VALIDATION_ERROR', message, 400);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Rate limit exceeded\n */\nexport class RateLimitError extends CrawlKitError {\n constructor(message: string = 'Rate limit exceeded') {\n super('RATE_LIMITED', message, 429);\n this.name = 'RateLimitError';\n }\n}\n\n/**\n * Request timeout\n */\nexport class TimeoutError extends CrawlKitError {\n constructor(\n message: string,\n creditsRefunded?: number,\n creditsRemaining?: number\n ) {\n super('TIMEOUT', message, 408, creditsRefunded, creditsRemaining);\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Resource not found (404)\n */\nexport class NotFoundError extends CrawlKitError {\n constructor(message: string = 'Resource not found') {\n super('NOT_FOUND', message, 404);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Network or connection error\n */\nexport class NetworkError extends CrawlKitError {\n constructor(\n code: ErrorCode,\n message: string,\n creditsRefunded?: number,\n creditsRemaining?: number\n ) {\n super(code, message, 502, creditsRefunded, creditsRemaining);\n this.name = 'NetworkError';\n }\n}\n\n/**\n * Create appropriate error instance from API response\n */\nexport function createErrorFromResponse(\n code: string,\n message: string,\n statusCode: number,\n creditsRefunded?: number,\n creditsRemaining?: number\n): CrawlKitError {\n const errorCode = code as ErrorCode;\n\n switch (statusCode) {\n case 401:\n return new AuthenticationError(message);\n case 402:\n return new InsufficientCreditsError(message, creditsRefunded, creditsRemaining);\n case 429:\n return new RateLimitError(message);\n case 404:\n return new NotFoundError(message);\n }\n\n switch (errorCode) {\n case 'VALIDATION_ERROR':\n return new ValidationError(message);\n case 'INSUFFICIENT_CREDITS':\n return new InsufficientCreditsError(message, creditsRefunded, creditsRemaining);\n case 'TIMEOUT':\n return new TimeoutError(message, creditsRefunded, creditsRemaining);\n case 'RATE_LIMITED':\n return new RateLimitError(message);\n case 'NOT_FOUND':\n return new NotFoundError(message);\n case 'DNS_FAILED':\n case 'CONNECTION_REFUSED':\n case 'SSL_ERROR':\n case 'TOO_MANY_REDIRECTS':\n case 'PROXY_ERROR':\n return new NetworkError(errorCode, message, creditsRefunded, creditsRemaining);\n default:\n return new CrawlKitError(\n errorCode,\n message,\n statusCode,\n creditsRefunded,\n creditsRemaining\n );\n }\n}\n","import { createErrorFromResponse, CrawlKitError } from '../errors/index.js';\nimport type { ApiResponse, ApiErrorResponse } from '../types/common.js';\n\n/**\n * Configuration for resource instances\n */\nexport interface ResourceConfig {\n /** API key for authentication */\n apiKey: string;\n /** Base URL for the API */\n baseUrl: string;\n /** Default timeout in milliseconds */\n timeout: number;\n /** Fetch implementation */\n fetch: typeof globalThis.fetch;\n}\n\n/**\n * Base class for API resources\n * Provides common HTTP functionality for all resource classes\n */\nexport abstract class BaseResource {\n protected readonly config: ResourceConfig;\n\n constructor(config: ResourceConfig) {\n this.config = config;\n }\n\n /**\n * Make a POST request to the API\n * @param endpoint - API endpoint path (e.g., '/v1/crawl/scrape')\n * @param body - Request body object\n * @returns Parsed response data\n * @throws {CrawlKitError} On API errors\n */\n protected async post<T, B extends object = object>(\n endpoint: string,\n body: B\n ): Promise<T> {\n const url = `${this.config.baseUrl}${endpoint}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await this.config.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `ApiKey ${this.config.apiKey}`,\n 'User-Agent': '@crawlkit/sdk',\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n let json: ApiResponse<T>;\n try {\n json = await response.json() as ApiResponse<T>;\n } catch {\n throw new CrawlKitError(\n 'PARSE_ERROR',\n 'Failed to parse API response',\n response.status\n );\n }\n\n if (!json.success) {\n const errorResponse = json as ApiErrorResponse;\n throw createErrorFromResponse(\n errorResponse.error.code,\n errorResponse.error.message,\n response.status,\n errorResponse.creditsRefunded,\n errorResponse.creditsRemaining\n );\n }\n\n return json.data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Re-throw CrawlKitError instances\n if (error instanceof CrawlKitError) {\n throw error;\n }\n\n // Handle abort/timeout\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new CrawlKitError(\n 'TIMEOUT',\n `Request timed out after ${this.config.timeout}ms`,\n 408\n );\n }\n\n // Handle network errors\n throw new CrawlKitError(\n 'UNKNOWN',\n error.message || 'An unknown error occurred',\n 500\n );\n }\n\n throw new CrawlKitError('UNKNOWN', 'An unknown error occurred', 500);\n }\n }\n\n /**\n * Make a GET request to the API\n * @param endpoint - API endpoint path\n * @param params - Query parameters\n * @returns Parsed response data\n * @throws {CrawlKitError} On API errors\n */\n protected async get<T>(\n endpoint: string,\n params?: Record<string, string | number | boolean | undefined>\n ): Promise<T> {\n let url = `${this.config.baseUrl}${endpoint}`;\n\n // Add query parameters\n if (params) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n }\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await this.config.fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': `ApiKey ${this.config.apiKey}`,\n 'User-Agent': '@crawlkit/sdk',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n let json: ApiResponse<T>;\n try {\n json = await response.json() as ApiResponse<T>;\n } catch {\n throw new CrawlKitError(\n 'PARSE_ERROR',\n 'Failed to parse API response',\n response.status\n );\n }\n\n if (!json.success) {\n const errorResponse = json as ApiErrorResponse;\n throw createErrorFromResponse(\n errorResponse.error.code,\n errorResponse.error.message,\n response.status,\n errorResponse.creditsRefunded,\n errorResponse.creditsRemaining\n );\n }\n\n return json.data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof CrawlKitError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new CrawlKitError(\n 'TIMEOUT',\n `Request timed out after ${this.config.timeout}ms`,\n 408\n );\n }\n\n throw new CrawlKitError(\n 'UNKNOWN',\n error.message || 'An unknown error occurred',\n 500\n );\n }\n\n throw new CrawlKitError('UNKNOWN', 'An unknown error occurred', 500);\n }\n }\n}\n","import { BaseResource } from './base.js';\nimport type {\n ScrapeParams,\n ScrapeData,\n ExtractParams,\n ExtractData,\n SearchParams,\n SearchData,\n ScreenshotParams,\n ScreenshotData,\n} from '../types/index.js';\n\n/**\n * Core crawl operations resource\n * Provides scrape, extract, search, and screenshot functionality\n */\nexport class CrawlResource extends BaseResource {\n /**\n * Scrape a URL and return markdown, HTML, metadata, and links\n *\n * @param params - Scrape parameters\n * @returns Scraped page data including markdown, HTML, metadata, and links\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.scrape({\n * url: 'https://example.com',\n * options: {\n * onlyMainContent: true,\n * waitFor: '#content'\n * }\n * });\n * console.log(result.markdown);\n * ```\n *\n * @costs 1 credit\n */\n async scrape(params: ScrapeParams): Promise<ScrapeData> {\n return this.post<ScrapeData>('/v1/crawl/scrape', params);\n }\n\n /**\n * Extract structured data from a URL using AI\n *\n * @param params - Extract parameters including JSON schema\n * @returns Extracted structured data along with page content\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * interface Product {\n * name: string;\n * price: number;\n * }\n *\n * const result = await crawlkit.extract<Product>({\n * url: 'https://example.com/product',\n * schema: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * price: { type: 'number' }\n * }\n * }\n * });\n * console.log(result.json.name, result.json.price);\n * ```\n *\n * @costs 5 credits\n */\n async extract<T = unknown>(params: ExtractParams): Promise<ExtractData<T>> {\n return this.post<ExtractData<T>>('/v1/crawl/extract', params);\n }\n\n /**\n * Perform a web search\n *\n * @param params - Search parameters\n * @returns Search results with titles, URLs, and snippets\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.search({\n * query: 'typescript best practices',\n * options: {\n * maxResults: 10,\n * timeRange: 'w' // Past week\n * }\n * });\n * result.results.forEach(r => console.log(r.title, r.url));\n * ```\n *\n * @costs 1 credit per page (~10 results)\n */\n async search(params: SearchParams): Promise<SearchData> {\n return this.post<SearchData>('/v1/crawl/search', params);\n }\n\n /**\n * Take a full-page screenshot of a URL\n *\n * @param params - Screenshot parameters\n * @returns Public URL of the screenshot\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.screenshot({\n * url: 'https://example.com',\n * options: {\n * width: 1920,\n * height: 1080,\n * waitForSelector: '#content'\n * }\n * });\n * console.log('Screenshot URL:', result.url);\n * ```\n *\n * @costs 1 credit\n */\n async screenshot(params: ScreenshotParams): Promise<ScreenshotData> {\n return this.post<ScreenshotData>('/v1/crawl/screenshot', params);\n }\n}\n","import { BaseResource } from './base.js';\nimport type {\n LinkedInCompanyParams,\n LinkedInCompanyData,\n LinkedInPersonParams,\n LinkedInPersonData,\n} from '../types/index.js';\n\n/**\n * LinkedIn scraping operations\n * Provides company and person profile scraping\n */\nexport class LinkedInResource extends BaseResource {\n /**\n * Scrape a LinkedIn company profile\n *\n * @param params - Company profile parameters\n * @returns Company profile data including description, employees, jobs, posts\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.linkedin.company({\n * url: 'https://www.linkedin.com/company/openai',\n * options: { includeJobs: true }\n * });\n * console.log(result.company.name);\n * console.log(result.company.followers);\n * console.log(result.company.jobs);\n * ```\n *\n * @costs 1 credit\n */\n async company(params: LinkedInCompanyParams): Promise<LinkedInCompanyData> {\n return this.post<LinkedInCompanyData>('/v1/crawl/linkedin/company', params);\n }\n\n /**\n * Scrape LinkedIn person profile(s)\n *\n * @param params - Person profile parameters (single URL or array of URLs, max 10)\n * @returns Person profile data for each URL\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * // Single profile\n * const result = await crawlkit.linkedin.person({\n * url: 'https://www.linkedin.com/in/username'\n * });\n *\n * // Multiple profiles (batch)\n * const batchResult = await crawlkit.linkedin.person({\n * url: [\n * 'https://www.linkedin.com/in/user1',\n * 'https://www.linkedin.com/in/user2'\n * ]\n * });\n * console.log(`Success: ${batchResult.successCount}, Failed: ${batchResult.failedCount}`);\n * ```\n *\n * @costs 3 credits per URL\n */\n async person(params: LinkedInPersonParams): Promise<LinkedInPersonData> {\n return this.post<LinkedInPersonData>('/v1/crawl/linkedin/person', params);\n }\n}\n","import { BaseResource } from './base.js';\nimport type {\n InstagramProfileParams,\n InstagramProfileData,\n InstagramContentParams,\n InstagramContentData,\n} from '../types/index.js';\n\n/**\n * Instagram scraping operations\n * Provides profile and content (posts/reels) scraping\n */\nexport class InstagramResource extends BaseResource {\n /**\n * Scrape an Instagram profile\n *\n * @param params - Profile parameters (username or URL)\n * @returns Profile data including bio, follower count, and recent posts\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.instagram.profile({\n * username: 'instagram'\n * });\n * console.log(result.profile.full_name);\n * console.log(result.profile.follower_count);\n * console.log(result.profile.posts.length);\n * ```\n *\n * @costs 1 credit\n */\n async profile(params: InstagramProfileParams): Promise<InstagramProfileData> {\n return this.post<InstagramProfileData>('/v1/crawl/instagram/profile', params);\n }\n\n /**\n * Scrape Instagram content (post, reel, or video)\n *\n * @param params - Content parameters (shortcode or full URL)\n * @returns Content data including media URLs, likes, comments, and owner info\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * // Using shortcode\n * const result = await crawlkit.instagram.content({\n * shortcode: 'CxIIgCCq8mg'\n * });\n *\n * // Using full URL\n * const result = await crawlkit.instagram.content({\n * shortcode: 'https://www.instagram.com/p/CxIIgCCq8mg/'\n * });\n *\n * console.log(result.post.like_count);\n * console.log(result.post.video_url);\n * ```\n *\n * @costs 1 credit\n */\n async content(params: InstagramContentParams): Promise<InstagramContentData> {\n return this.post<InstagramContentData>('/v1/crawl/instagram/content', params);\n }\n}\n","import { BaseResource } from './base.js';\nimport type {\n PlayStoreReviewsParams,\n PlayStoreReviewsData,\n PlayStoreDetailParams,\n PlayStoreDetailData,\n AppStoreReviewsParams,\n AppStoreReviewsData,\n} from '../types/index.js';\n\n/**\n * App store operations\n * Provides Google Play Store and Apple App Store data scraping\n */\nexport class AppStoreResource extends BaseResource {\n /**\n * Fetch Google Play Store reviews for an app\n *\n * @param params - Reviews parameters including app ID and optional pagination cursor\n * @returns Reviews with pagination information\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * // First page\n * const result = await crawlkit.appstore.playstoreReviews({\n * appId: 'com.example.app',\n * options: { lang: 'en' }\n * });\n *\n * // Next page\n * if (result.pagination.hasMore) {\n * const nextPage = await crawlkit.appstore.playstoreReviews({\n * appId: 'com.example.app',\n * cursor: result.pagination.nextCursor\n * });\n * }\n * ```\n *\n * @costs 1 credit per page\n */\n async playstoreReviews(params: PlayStoreReviewsParams): Promise<PlayStoreReviewsData> {\n return this.post<PlayStoreReviewsData>('/v1/crawl/playstore/reviews', params);\n }\n\n /**\n * Fetch Google Play Store app details\n *\n * @param params - App detail parameters\n * @returns Comprehensive app information including ratings, screenshots, permissions\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.appstore.playstoreDetail({\n * appId: 'com.example.app',\n * options: { lang: 'en' }\n * });\n * console.log(result.appName);\n * console.log(result.rating);\n * console.log(result.installs);\n * ```\n *\n * @costs 1 credit\n */\n async playstoreDetail(params: PlayStoreDetailParams): Promise<PlayStoreDetailData> {\n return this.post<PlayStoreDetailData>('/v1/crawl/playstore/detail', params);\n }\n\n /**\n * Fetch Apple App Store reviews for an app\n *\n * @param params - Reviews parameters including app ID and optional pagination cursor\n * @returns Reviews with pagination information\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * // First page\n * const result = await crawlkit.appstore.appstoreReviews({\n * appId: '123456789',\n * options: { lang: 'en' }\n * });\n *\n * // Paginate through all reviews\n * let cursor = result.pagination.nextCursor;\n * while (cursor) {\n * const nextPage = await crawlkit.appstore.appstoreReviews({\n * appId: '123456789',\n * cursor\n * });\n * cursor = nextPage.pagination.nextCursor;\n * }\n * ```\n *\n * @costs 1 credit per page\n */\n async appstoreReviews(params: AppStoreReviewsParams): Promise<AppStoreReviewsData> {\n return this.post<AppStoreReviewsData>('/v1/crawl/appstore/reviews', params);\n }\n}\n","import { CrawlResource } from './resources/crawl.js';\nimport { LinkedInResource } from './resources/linkedin.js';\nimport { InstagramResource } from './resources/instagram.js';\nimport { AppStoreResource } from './resources/appstore.js';\nimport { AuthenticationError } from './errors/index.js';\nimport type { ResourceConfig } from './resources/base.js';\nimport type {\n ScrapeParams,\n ScrapeData,\n ExtractParams,\n ExtractData,\n SearchParams,\n SearchData,\n ScreenshotParams,\n ScreenshotData,\n} from './types/index.js';\n\n/**\n * Configuration options for the CrawlKit client\n */\nexport interface CrawlKitConfig {\n /**\n * API key for authentication\n * Must start with 'ck_' prefix\n * Get your API key at https://crawlkit.sh\n */\n apiKey: string;\n\n /**\n * Base URL for the API\n * @default 'https://api.crawlkit.sh'\n */\n baseUrl?: string;\n\n /**\n * Default timeout in milliseconds for all requests\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Custom fetch implementation\n * Useful for testing or environments without native fetch\n */\n fetch?: typeof globalThis.fetch;\n}\n\n/**\n * CrawlKit SDK client for web scraping API\n *\n * @example\n * ```typescript\n * import { CrawlKit } from '@crawlkit/sdk';\n *\n * const crawlkit = new CrawlKit({ apiKey: 'ck_your_api_key' });\n *\n * // Scrape a webpage\n * const page = await crawlkit.scrape({ url: 'https://example.com' });\n * console.log(page.markdown);\n *\n * // Extract structured data with AI\n * const data = await crawlkit.extract({\n * url: 'https://example.com/product',\n * schema: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * price: { type: 'number' }\n * }\n * }\n * });\n *\n * // Scrape social media\n * const company = await crawlkit.linkedin.company({\n * url: 'https://linkedin.com/company/openai'\n * });\n * ```\n */\nexport class CrawlKit {\n private readonly config: Required<Omit<CrawlKitConfig, 'fetch'>> & { fetch: typeof globalThis.fetch };\n private readonly crawl: CrawlResource;\n\n /**\n * LinkedIn scraping operations\n * Provides company and person profile scraping\n */\n public readonly linkedin: LinkedInResource;\n\n /**\n * Instagram scraping operations\n * Provides profile and content scraping\n */\n public readonly instagram: InstagramResource;\n\n /**\n * App store operations\n * Provides Google Play Store and Apple App Store data\n */\n public readonly appstore: AppStoreResource;\n\n /**\n * Create a new CrawlKit client\n *\n * @param config - Client configuration\n * @throws {AuthenticationError} If API key is invalid or missing\n *\n * @example\n * ```typescript\n * const crawlkit = new CrawlKit({\n * apiKey: 'ck_your_api_key',\n * timeout: 60000 // 60 seconds\n * });\n * ```\n */\n constructor(config: CrawlKitConfig) {\n // Validate API key\n if (!config.apiKey) {\n throw new AuthenticationError('API key is required');\n }\n\n if (!config.apiKey.startsWith('ck_')) {\n throw new AuthenticationError(\n 'Invalid API key format. API keys must start with \"ck_\"'\n );\n }\n\n this.config = {\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? 'https://api.crawlkit.sh',\n timeout: config.timeout ?? 30000,\n fetch: config.fetch ?? globalThis.fetch.bind(globalThis),\n };\n\n // Initialize resources\n const resourceConfig: ResourceConfig = {\n apiKey: this.config.apiKey,\n baseUrl: this.config.baseUrl,\n timeout: this.config.timeout,\n fetch: this.config.fetch,\n };\n\n this.crawl = new CrawlResource(resourceConfig);\n this.linkedin = new LinkedInResource(resourceConfig);\n this.instagram = new InstagramResource(resourceConfig);\n this.appstore = new AppStoreResource(resourceConfig);\n }\n\n /**\n * Scrape a URL and return markdown, HTML, metadata, and links\n *\n * @param params - Scrape parameters\n * @returns Scraped page data including markdown, HTML, metadata, and links\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * // Basic scraping\n * const result = await crawlkit.scrape({\n * url: 'https://example.com'\n * });\n * console.log(result.markdown);\n * console.log(result.metadata.title);\n *\n * // With browser automation\n * const spaResult = await crawlkit.scrape({\n * url: 'https://example.com/spa',\n * options: {\n * waitFor: '#content-loaded',\n * actions: [\n * { type: 'click', selector: '#load-more' },\n * { type: 'wait', milliseconds: 2000 }\n * ]\n * }\n * });\n * ```\n *\n * @costs 1 credit\n */\n async scrape(params: ScrapeParams): Promise<ScrapeData> {\n return this.crawl.scrape(params);\n }\n\n /**\n * Extract structured data from a URL using AI\n *\n * Uses LLM to extract data according to the provided JSON schema.\n *\n * @param params - Extract parameters including JSON schema\n * @returns Extracted structured data along with page content\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * interface Product {\n * name: string;\n * price: number;\n * description: string;\n * inStock: boolean;\n * }\n *\n * const result = await crawlkit.extract<Product>({\n * url: 'https://example.com/product/123',\n * schema: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * price: { type: 'number' },\n * description: { type: 'string' },\n * inStock: { type: 'boolean' }\n * }\n * },\n * options: {\n * prompt: 'Extract product information from this page'\n * }\n * });\n *\n * // TypeScript knows result.json is Product\n * console.log(result.json.name);\n * console.log(result.json.price);\n * ```\n *\n * @costs 5 credits\n */\n async extract<T = unknown>(params: ExtractParams): Promise<ExtractData<T>> {\n return this.crawl.extract<T>(params);\n }\n\n /**\n * Perform a web search\n *\n * @param params - Search parameters\n * @returns Search results with titles, URLs, and snippets\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.search({\n * query: 'typescript best practices 2024',\n * options: {\n * maxResults: 20,\n * timeRange: 'm', // Past month\n * region: 'us-en'\n * }\n * });\n *\n * for (const item of result.results) {\n * console.log(`${item.position}. ${item.title}`);\n * console.log(` ${item.url}`);\n * console.log(` ${item.snippet}\\n`);\n * }\n * ```\n *\n * @costs 1 credit per page (~10 results)\n */\n async search(params: SearchParams): Promise<SearchData> {\n return this.crawl.search(params);\n }\n\n /**\n * Take a full-page screenshot of a URL\n *\n * @param params - Screenshot parameters\n * @returns Public URL of the screenshot\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.screenshot({\n * url: 'https://example.com',\n * options: {\n * width: 1920,\n * height: 1080,\n * waitForSelector: '#main-content'\n * }\n * });\n *\n * console.log('Screenshot URL:', result.url);\n * console.log(`Dimensions: ${result.width}x${result.height}`);\n * ```\n *\n * @costs 1 credit\n */\n async screenshot(params: ScreenshotParams): Promise<ScreenshotData> {\n return this.crawl.screenshot(params);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors/index.ts","../src/resources/base.ts","../src/resources/crawl.ts","../src/resources/linkedin.ts","../src/resources/instagram.ts","../src/resources/appstore.ts","../src/resources/tiktok.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ErrorCode } from '../types/common.js';\n\n/**\n * Base error class for all CrawlKit errors\n */\nexport class CrawlKitError extends Error {\n /** Error code from API */\n public readonly code: ErrorCode;\n /** HTTP status code */\n public readonly statusCode: number;\n /** Credits refunded if operation failed */\n public readonly creditsRefunded?: number;\n /** Remaining credits after operation */\n public readonly creditsRemaining?: number;\n\n constructor(\n code: ErrorCode,\n message: string,\n statusCode: number,\n creditsRefunded?: number,\n creditsRemaining?: number\n ) {\n super(message);\n this.name = 'CrawlKitError';\n this.code = code;\n this.statusCode = statusCode;\n this.creditsRefunded = creditsRefunded;\n this.creditsRemaining = creditsRemaining;\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\n/**\n * Authentication error - invalid or missing API key\n */\nexport class AuthenticationError extends CrawlKitError {\n constructor(message: string = 'Invalid or missing API key') {\n super('VALIDATION_ERROR', message, 401);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * Insufficient credits to perform the operation\n */\nexport class InsufficientCreditsError extends CrawlKitError {\n /** Credits required for the operation */\n public readonly required?: number;\n /** Credits available */\n public readonly available?: number;\n\n constructor(\n message: string,\n creditsRefunded?: number,\n creditsRemaining?: number\n ) {\n super('INSUFFICIENT_CREDITS', message, 402, creditsRefunded, creditsRemaining);\n this.name = 'InsufficientCreditsError';\n this.available = creditsRemaining;\n }\n}\n\n/**\n * Validation error - invalid request parameters\n */\nexport class ValidationError extends CrawlKitError {\n constructor(message: string) {\n super('VALIDATION_ERROR', message, 400);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * Rate limit exceeded\n */\nexport class RateLimitError extends CrawlKitError {\n constructor(message: string = 'Rate limit exceeded') {\n super('RATE_LIMITED', message, 429);\n this.name = 'RateLimitError';\n }\n}\n\n/**\n * Request timeout\n */\nexport class TimeoutError extends CrawlKitError {\n constructor(\n message: string,\n creditsRefunded?: number,\n creditsRemaining?: number\n ) {\n super('TIMEOUT', message, 408, creditsRefunded, creditsRemaining);\n this.name = 'TimeoutError';\n }\n}\n\n/**\n * Resource not found (404)\n */\nexport class NotFoundError extends CrawlKitError {\n constructor(message: string = 'Resource not found') {\n super('NOT_FOUND', message, 404);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * Network or connection error\n */\nexport class NetworkError extends CrawlKitError {\n constructor(\n code: ErrorCode,\n message: string,\n creditsRefunded?: number,\n creditsRemaining?: number\n ) {\n super(code, message, 502, creditsRefunded, creditsRemaining);\n this.name = 'NetworkError';\n }\n}\n\n/**\n * Create appropriate error instance from API response\n */\nexport function createErrorFromResponse(\n code: string,\n message: string,\n statusCode: number,\n creditsRefunded?: number,\n creditsRemaining?: number\n): CrawlKitError {\n const errorCode = code as ErrorCode;\n\n switch (statusCode) {\n case 401:\n return new AuthenticationError(message);\n case 402:\n return new InsufficientCreditsError(message, creditsRefunded, creditsRemaining);\n case 429:\n return new RateLimitError(message);\n case 404:\n return new NotFoundError(message);\n }\n\n switch (errorCode) {\n case 'VALIDATION_ERROR':\n return new ValidationError(message);\n case 'INSUFFICIENT_CREDITS':\n return new InsufficientCreditsError(message, creditsRefunded, creditsRemaining);\n case 'TIMEOUT':\n return new TimeoutError(message, creditsRefunded, creditsRemaining);\n case 'RATE_LIMITED':\n return new RateLimitError(message);\n case 'NOT_FOUND':\n return new NotFoundError(message);\n case 'DNS_FAILED':\n case 'CONNECTION_REFUSED':\n case 'SSL_ERROR':\n case 'TOO_MANY_REDIRECTS':\n case 'PROXY_ERROR':\n return new NetworkError(errorCode, message, creditsRefunded, creditsRemaining);\n default:\n return new CrawlKitError(\n errorCode,\n message,\n statusCode,\n creditsRefunded,\n creditsRemaining\n );\n }\n}\n","import { createErrorFromResponse, CrawlKitError } from '../errors/index.js';\nimport type { ApiResponse, ApiErrorResponse } from '../types/common.js';\n\n/**\n * Configuration for resource instances\n */\nexport interface ResourceConfig {\n /** API key for authentication */\n apiKey: string;\n /** Base URL for the API */\n baseUrl: string;\n /** Default timeout in milliseconds */\n timeout: number;\n /** Fetch implementation */\n fetch: typeof globalThis.fetch;\n}\n\n/**\n * Base class for API resources\n * Provides common HTTP functionality for all resource classes\n */\nexport abstract class BaseResource {\n protected readonly config: ResourceConfig;\n\n constructor(config: ResourceConfig) {\n this.config = config;\n }\n\n /**\n * Make a POST request to the API\n * @param endpoint - API endpoint path (e.g., '/v1/crawl/scrape')\n * @param body - Request body object\n * @returns Parsed response data\n * @throws {CrawlKitError} On API errors\n */\n protected async post<T, B extends object = object>(\n endpoint: string,\n body: B\n ): Promise<T> {\n const url = `${this.config.baseUrl}${endpoint}`;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await this.config.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `ApiKey ${this.config.apiKey}`,\n 'User-Agent': '@crawlkit/sdk',\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n let json: ApiResponse<T>;\n try {\n json = await response.json() as ApiResponse<T>;\n } catch {\n throw new CrawlKitError(\n 'PARSE_ERROR',\n 'Failed to parse API response',\n response.status\n );\n }\n\n if (!json.success) {\n const errorResponse = json as ApiErrorResponse;\n throw createErrorFromResponse(\n errorResponse.error.code,\n errorResponse.error.message,\n response.status,\n errorResponse.creditsRefunded,\n errorResponse.creditsRemaining\n );\n }\n\n return json.data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Re-throw CrawlKitError instances\n if (error instanceof CrawlKitError) {\n throw error;\n }\n\n // Handle abort/timeout\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new CrawlKitError(\n 'TIMEOUT',\n `Request timed out after ${this.config.timeout}ms`,\n 408\n );\n }\n\n // Handle network errors\n throw new CrawlKitError(\n 'UNKNOWN',\n error.message || 'An unknown error occurred',\n 500\n );\n }\n\n throw new CrawlKitError('UNKNOWN', 'An unknown error occurred', 500);\n }\n }\n\n /**\n * Make a GET request to the API\n * @param endpoint - API endpoint path\n * @param params - Query parameters\n * @returns Parsed response data\n * @throws {CrawlKitError} On API errors\n */\n protected async get<T>(\n endpoint: string,\n params?: Record<string, string | number | boolean | undefined>\n ): Promise<T> {\n let url = `${this.config.baseUrl}${endpoint}`;\n\n // Add query parameters\n if (params) {\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n searchParams.append(key, String(value));\n }\n }\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await this.config.fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': `ApiKey ${this.config.apiKey}`,\n 'User-Agent': '@crawlkit/sdk',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n let json: ApiResponse<T>;\n try {\n json = await response.json() as ApiResponse<T>;\n } catch {\n throw new CrawlKitError(\n 'PARSE_ERROR',\n 'Failed to parse API response',\n response.status\n );\n }\n\n if (!json.success) {\n const errorResponse = json as ApiErrorResponse;\n throw createErrorFromResponse(\n errorResponse.error.code,\n errorResponse.error.message,\n response.status,\n errorResponse.creditsRefunded,\n errorResponse.creditsRemaining\n );\n }\n\n return json.data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof CrawlKitError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new CrawlKitError(\n 'TIMEOUT',\n `Request timed out after ${this.config.timeout}ms`,\n 408\n );\n }\n\n throw new CrawlKitError(\n 'UNKNOWN',\n error.message || 'An unknown error occurred',\n 500\n );\n }\n\n throw new CrawlKitError('UNKNOWN', 'An unknown error occurred', 500);\n }\n }\n}\n","import { BaseResource } from './base.js';\nimport type {\n ScrapeParams,\n ScrapeData,\n ExtractParams,\n ExtractData,\n SearchParams,\n SearchData,\n ScreenshotParams,\n ScreenshotData,\n} from '../types/index.js';\n\n/**\n * Core crawl operations resource\n * Provides scrape, extract, search, and screenshot functionality\n */\nexport class CrawlResource extends BaseResource {\n /**\n * Scrape a URL and return markdown, HTML, metadata, and links\n *\n * @param params - Scrape parameters\n * @returns Scraped page data including markdown, HTML, metadata, and links\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.scrape({\n * url: 'https://example.com',\n * options: {\n * onlyMainContent: true,\n * waitFor: '#content'\n * }\n * });\n * console.log(result.markdown);\n * ```\n *\n * @costs 1 credit\n */\n async scrape(params: ScrapeParams): Promise<ScrapeData> {\n return this.post<ScrapeData>('/v1/crawl/scrape', params);\n }\n\n /**\n * Extract structured data from a URL using AI\n *\n * @param params - Extract parameters including JSON schema\n * @returns Extracted structured data along with page content\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * interface Product {\n * name: string;\n * price: number;\n * }\n *\n * const result = await crawlkit.extract<Product>({\n * url: 'https://example.com/product',\n * schema: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * price: { type: 'number' }\n * }\n * }\n * });\n * console.log(result.json.name, result.json.price);\n * ```\n *\n * @costs 5 credits\n */\n async extract<T = unknown>(params: ExtractParams): Promise<ExtractData<T>> {\n return this.post<ExtractData<T>>('/v1/crawl/extract', params);\n }\n\n /**\n * Perform a web search\n *\n * @param params - Search parameters\n * @returns Search results with titles, URLs, and snippets\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.search({\n * query: 'typescript best practices',\n * options: {\n * maxResults: 10,\n * timeRange: 'w' // Past week\n * }\n * });\n * result.results.forEach(r => console.log(r.title, r.url));\n * ```\n *\n * @costs 1 credit per page (~10 results)\n */\n async search(params: SearchParams): Promise<SearchData> {\n return this.post<SearchData>('/v1/crawl/search', params);\n }\n\n /**\n * Take a full-page screenshot of a URL\n *\n * @param params - Screenshot parameters\n * @returns Public URL of the screenshot\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.screenshot({\n * url: 'https://example.com',\n * options: {\n * width: 1920,\n * height: 1080,\n * waitForSelector: '#content'\n * }\n * });\n * console.log('Screenshot URL:', result.url);\n * ```\n *\n * @costs 1 credit\n */\n async screenshot(params: ScreenshotParams): Promise<ScreenshotData> {\n return this.post<ScreenshotData>('/v1/crawl/screenshot', params);\n }\n}\n","import { BaseResource } from './base.js';\nimport type {\n LinkedInCompanyParams,\n LinkedInCompanyData,\n LinkedInPersonParams,\n LinkedInPersonData,\n} from '../types/index.js';\n\n/**\n * LinkedIn scraping operations\n * Provides company and person profile scraping\n */\nexport class LinkedInResource extends BaseResource {\n /**\n * Scrape a LinkedIn company profile\n *\n * @param params - Company profile parameters\n * @returns Company profile data including description, employees, jobs, posts\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.linkedin.company({\n * url: 'https://www.linkedin.com/company/openai',\n * options: { includeJobs: true }\n * });\n * console.log(result.company.name);\n * console.log(result.company.followers);\n * console.log(result.company.jobs);\n * ```\n *\n * @costs 1 credit\n */\n async company(params: LinkedInCompanyParams): Promise<LinkedInCompanyData> {\n return this.post<LinkedInCompanyData>('/v1/crawl/linkedin/company', params);\n }\n\n /**\n * Scrape LinkedIn person profile(s)\n *\n * @param params - Person profile parameters (single URL or array of URLs, max 10)\n * @returns Person profile data for each URL\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * // Single profile\n * const result = await crawlkit.linkedin.person({\n * url: 'https://www.linkedin.com/in/username'\n * });\n *\n * // Multiple profiles (batch)\n * const batchResult = await crawlkit.linkedin.person({\n * url: [\n * 'https://www.linkedin.com/in/user1',\n * 'https://www.linkedin.com/in/user2'\n * ]\n * });\n * console.log(`Success: ${batchResult.successCount}, Failed: ${batchResult.failedCount}`);\n * ```\n *\n * @costs 3 credits per URL\n */\n async person(params: LinkedInPersonParams): Promise<LinkedInPersonData> {\n return this.post<LinkedInPersonData>('/v1/crawl/linkedin/person', params);\n }\n}\n","import { BaseResource } from './base.js';\nimport type {\n InstagramProfileParams,\n InstagramProfileData,\n InstagramContentParams,\n InstagramContentData,\n} from '../types/index.js';\n\n/**\n * Instagram scraping operations\n * Provides profile and content (posts/reels) scraping\n */\nexport class InstagramResource extends BaseResource {\n /**\n * Scrape an Instagram profile\n *\n * @param params - Profile parameters (username or URL)\n * @returns Profile data including bio, follower count, and recent posts\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.instagram.profile({\n * username: 'instagram'\n * });\n * console.log(result.profile.full_name);\n * console.log(result.profile.follower_count);\n * console.log(result.profile.posts.length);\n * ```\n *\n * @costs 1 credit\n */\n async profile(params: InstagramProfileParams): Promise<InstagramProfileData> {\n return this.post<InstagramProfileData>('/v1/crawl/instagram/profile', params);\n }\n\n /**\n * Scrape Instagram content (post, reel, or video)\n *\n * @param params - Content parameters (shortcode or full URL)\n * @returns Content data including media URLs, likes, comments, and owner info\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * // Using shortcode\n * const result = await crawlkit.instagram.content({\n * shortcode: 'CxIIgCCq8mg'\n * });\n *\n * // Using full URL\n * const result = await crawlkit.instagram.content({\n * shortcode: 'https://www.instagram.com/p/CxIIgCCq8mg/'\n * });\n *\n * console.log(result.post.like_count);\n * console.log(result.post.video_url);\n * ```\n *\n * @costs 1 credit\n */\n async content(params: InstagramContentParams): Promise<InstagramContentData> {\n return this.post<InstagramContentData>('/v1/crawl/instagram/content', params);\n }\n}\n","import { BaseResource } from './base.js';\nimport type {\n PlayStoreReviewsParams,\n PlayStoreReviewsData,\n PlayStoreDetailParams,\n PlayStoreDetailData,\n AppStoreDetailParams,\n AppStoreDetailData,\n AppStoreReviewsParams,\n AppStoreReviewsData,\n} from '../types/index.js';\n\n/**\n * App store operations\n * Provides Google Play Store and Apple App Store data scraping\n */\nexport class AppStoreResource extends BaseResource {\n /**\n * Fetch Google Play Store reviews for an app\n *\n * @param params - Reviews parameters including app ID and optional pagination cursor\n * @returns Reviews with pagination information\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * // First page\n * const result = await crawlkit.appstore.playstoreReviews({\n * appId: 'com.example.app',\n * options: { lang: 'en' }\n * });\n *\n * // Next page\n * if (result.pagination.hasMore) {\n * const nextPage = await crawlkit.appstore.playstoreReviews({\n * appId: 'com.example.app',\n * cursor: result.pagination.nextCursor\n * });\n * }\n * ```\n *\n * @costs 1 credit per page\n */\n async playstoreReviews(params: PlayStoreReviewsParams): Promise<PlayStoreReviewsData> {\n return this.post<PlayStoreReviewsData>('/v1/crawl/playstore/reviews', params);\n }\n\n /**\n * Fetch Google Play Store app details\n *\n * @param params - App detail parameters\n * @returns Comprehensive app information including ratings, screenshots, permissions\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.appstore.playstoreDetail({\n * appId: 'com.example.app',\n * options: { lang: 'en' }\n * });\n * console.log(result.appName);\n * console.log(result.rating);\n * console.log(result.installs);\n * ```\n *\n * @costs 1 credit\n */\n async playstoreDetail(params: PlayStoreDetailParams): Promise<PlayStoreDetailData> {\n return this.post<PlayStoreDetailData>('/v1/crawl/playstore/detail', params);\n }\n\n /**\n * Fetch Apple App Store app details\n *\n * @param params - App detail parameters\n * @returns App information including metadata, ratings, and media\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.appstore.appstoreDetail({\n * appId: '1492793493',\n * options: { lang: 'en' }\n * });\n * console.log(result.appName);\n * console.log(result.rating);\n * ```\n *\n * @costs 1 credit\n */\n async appstoreDetail(params: AppStoreDetailParams): Promise<AppStoreDetailData> {\n return this.post<AppStoreDetailData>('/v1/crawl/appstore/detail', params);\n }\n\n /**\n * Fetch Apple App Store reviews for an app\n *\n * @param params - Reviews parameters including app ID and optional pagination cursor\n * @returns Reviews with pagination information\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * // First page\n * const result = await crawlkit.appstore.appstoreReviews({\n * appId: '123456789',\n * options: { lang: 'en' }\n * });\n *\n * // Paginate through all reviews\n * let cursor = result.pagination.nextCursor;\n * while (cursor) {\n * const nextPage = await crawlkit.appstore.appstoreReviews({\n * appId: '123456789',\n * cursor\n * });\n * cursor = nextPage.pagination.nextCursor;\n * }\n * ```\n *\n * @costs 1 credit per page\n */\n async appstoreReviews(params: AppStoreReviewsParams): Promise<AppStoreReviewsData> {\n return this.post<AppStoreReviewsData>('/v1/crawl/appstore/reviews', params);\n }\n}\n","import { BaseResource } from './base.js';\nimport type {\n TikTokProfileParams,\n TikTokProfileData,\n TikTokPostParams,\n TikTokPostData,\n TikTokPostsParams,\n TikTokPostsData,\n} from '../types/index.js';\n\n/**\n * TikTok scraping operations\n * Provides profile, single content, and paginated content list scraping\n */\nexport class TikTokResource extends BaseResource {\n /**\n * Scrape a TikTok profile\n *\n * @param params - Profile parameters (username)\n * @returns Profile data including stats and metadata\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.tiktok.profile({\n * username: 'nike'\n * });\n * console.log(result.profile.username);\n * console.log(result.profile.stats?.followers);\n * ```\n *\n * @costs 1 credit\n */\n async profile(params: TikTokProfileParams): Promise<TikTokProfileData> {\n return this.post<TikTokProfileData>('/v1/crawl/tiktok/profile', params);\n }\n\n /**\n * Scrape a single TikTok content item\n *\n * @param params - Post parameters (post URL)\n * @returns Post details including author, media, stats, and hashtags\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.tiktok.content({\n * url: 'https://www.tiktok.com/@nike/video/1234567890'\n * });\n * console.log(result.post.id);\n * console.log(result.post.video?.url);\n * ```\n *\n * @costs 1 credit\n */\n async content(params: TikTokPostParams): Promise<TikTokPostData> {\n return this.post<TikTokPostData>('/v1/crawl/tiktok/post', params);\n }\n\n /**\n * List TikTok content with cursor-based pagination\n *\n * @param params - Post list parameters (username and optional cursor/secUid)\n * @returns A page of posts and pagination metadata\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const firstPage = await crawlkit.tiktok.posts({\n * username: 'nike'\n * });\n *\n * if (firstPage.pagination.hasMore) {\n * const nextPage = await crawlkit.tiktok.posts({\n * username: 'nike',\n * cursor: Number(firstPage.pagination.cursor),\n * secUid: firstPage.pagination.secUid ?? undefined\n * });\n * console.log(nextPage.posts.length);\n * }\n * ```\n *\n * @costs 1 credit per page\n */\n async posts(params: TikTokPostsParams): Promise<TikTokPostsData> {\n return this.post<TikTokPostsData>('/v1/crawl/tiktok/posts', params);\n }\n}\n","import { CrawlResource } from './resources/crawl.js';\nimport { LinkedInResource } from './resources/linkedin.js';\nimport { InstagramResource } from './resources/instagram.js';\nimport { AppStoreResource } from './resources/appstore.js';\nimport { TikTokResource } from './resources/tiktok.js';\nimport { AuthenticationError } from './errors/index.js';\nimport type { ResourceConfig } from './resources/base.js';\nimport type {\n ScrapeParams,\n ScrapeData,\n ExtractParams,\n ExtractData,\n SearchParams,\n SearchData,\n ScreenshotParams,\n ScreenshotData,\n} from './types/index.js';\n\n/**\n * Configuration options for the CrawlKit client\n */\nexport interface CrawlKitConfig {\n /**\n * API key for authentication\n * Must start with 'ck_' prefix\n * Get your API key at https://crawlkit.sh\n */\n apiKey: string;\n\n /**\n * Base URL for the API\n * @default 'https://api.crawlkit.sh'\n */\n baseUrl?: string;\n\n /**\n * Default timeout in milliseconds for all requests\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Custom fetch implementation\n * Useful for testing or environments without native fetch\n */\n fetch?: typeof globalThis.fetch;\n}\n\n/**\n * CrawlKit SDK client for web scraping API\n *\n * @example\n * ```typescript\n * import { CrawlKit } from '@crawlkit/sdk';\n *\n * const crawlkit = new CrawlKit({ apiKey: 'ck_your_api_key' });\n *\n * // Scrape a webpage\n * const page = await crawlkit.scrape({ url: 'https://example.com' });\n * console.log(page.markdown);\n *\n * // Extract structured data with AI\n * const data = await crawlkit.extract({\n * url: 'https://example.com/product',\n * schema: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * price: { type: 'number' }\n * }\n * }\n * });\n *\n * // Scrape social media\n * const company = await crawlkit.linkedin.company({\n * url: 'https://linkedin.com/company/openai'\n * });\n *\n * const profile = await crawlkit.tiktok.profile({\n * username: 'nike'\n * });\n * ```\n */\nexport class CrawlKit {\n private readonly config: Required<Omit<CrawlKitConfig, 'fetch'>> & { fetch: typeof globalThis.fetch };\n private readonly crawl: CrawlResource;\n\n /**\n * LinkedIn scraping operations\n * Provides company and person profile scraping\n */\n public readonly linkedin: LinkedInResource;\n\n /**\n * Instagram scraping operations\n * Provides profile and content scraping\n */\n public readonly instagram: InstagramResource;\n\n /**\n * App store operations\n * Provides Google Play Store and Apple App Store data\n */\n public readonly appstore: AppStoreResource;\n\n /**\n * TikTok scraping operations\n * Provides profile, content, and paginated posts scraping\n */\n public readonly tiktok: TikTokResource;\n\n /**\n * Create a new CrawlKit client\n *\n * @param config - Client configuration\n * @throws {AuthenticationError} If API key is invalid or missing\n *\n * @example\n * ```typescript\n * const crawlkit = new CrawlKit({\n * apiKey: 'ck_your_api_key',\n * timeout: 60000 // 60 seconds\n * });\n * ```\n */\n constructor(config: CrawlKitConfig) {\n // Validate API key\n if (!config.apiKey) {\n throw new AuthenticationError('API key is required');\n }\n\n if (!config.apiKey.startsWith('ck_')) {\n throw new AuthenticationError(\n 'Invalid API key format. API keys must start with \"ck_\"'\n );\n }\n\n this.config = {\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? 'https://api.crawlkit.sh',\n timeout: config.timeout ?? 30000,\n fetch: config.fetch ?? globalThis.fetch.bind(globalThis),\n };\n\n // Initialize resources\n const resourceConfig: ResourceConfig = {\n apiKey: this.config.apiKey,\n baseUrl: this.config.baseUrl,\n timeout: this.config.timeout,\n fetch: this.config.fetch,\n };\n\n this.crawl = new CrawlResource(resourceConfig);\n this.linkedin = new LinkedInResource(resourceConfig);\n this.instagram = new InstagramResource(resourceConfig);\n this.appstore = new AppStoreResource(resourceConfig);\n this.tiktok = new TikTokResource(resourceConfig);\n }\n\n /**\n * Scrape a URL and return markdown, HTML, metadata, and links\n *\n * @param params - Scrape parameters\n * @returns Scraped page data including markdown, HTML, metadata, and links\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * // Basic scraping\n * const result = await crawlkit.scrape({\n * url: 'https://example.com'\n * });\n * console.log(result.markdown);\n * console.log(result.metadata.title);\n *\n * // With browser automation\n * const spaResult = await crawlkit.scrape({\n * url: 'https://example.com/spa',\n * options: {\n * waitFor: '#content-loaded',\n * actions: [\n * { type: 'click', selector: '#load-more' },\n * { type: 'wait', milliseconds: 2000 }\n * ]\n * }\n * });\n * ```\n *\n * @costs 1 credit\n */\n async scrape(params: ScrapeParams): Promise<ScrapeData> {\n return this.crawl.scrape(params);\n }\n\n /**\n * Extract structured data from a URL using AI\n *\n * Uses LLM to extract data according to the provided JSON schema.\n *\n * @param params - Extract parameters including JSON schema\n * @returns Extracted structured data along with page content\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * interface Product {\n * name: string;\n * price: number;\n * description: string;\n * inStock: boolean;\n * }\n *\n * const result = await crawlkit.extract<Product>({\n * url: 'https://example.com/product/123',\n * schema: {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * price: { type: 'number' },\n * description: { type: 'string' },\n * inStock: { type: 'boolean' }\n * }\n * },\n * options: {\n * prompt: 'Extract product information from this page'\n * }\n * });\n *\n * // TypeScript knows result.json is Product\n * console.log(result.json.name);\n * console.log(result.json.price);\n * ```\n *\n * @costs 5 credits\n */\n async extract<T = unknown>(params: ExtractParams): Promise<ExtractData<T>> {\n return this.crawl.extract<T>(params);\n }\n\n /**\n * Perform a web search\n *\n * @param params - Search parameters\n * @returns Search results with titles, URLs, and snippets\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.search({\n * query: 'typescript best practices 2024',\n * options: {\n * maxResults: 20,\n * timeRange: 'm', // Past month\n * region: 'us-en'\n * }\n * });\n *\n * for (const item of result.results) {\n * console.log(`${item.position}. ${item.title}`);\n * console.log(` ${item.url}`);\n * console.log(` ${item.snippet}\\n`);\n * }\n * ```\n *\n * @costs 1 credit per page (~10 results)\n */\n async search(params: SearchParams): Promise<SearchData> {\n return this.crawl.search(params);\n }\n\n /**\n * Take a full-page screenshot of a URL\n *\n * @param params - Screenshot parameters\n * @returns Public URL of the screenshot\n * @throws {CrawlKitError} On API errors\n *\n * @example\n * ```typescript\n * const result = await crawlkit.screenshot({\n * url: 'https://example.com',\n * options: {\n * width: 1920,\n * height: 1080,\n * waitForSelector: '#main-content'\n * }\n * });\n *\n * console.log('Screenshot URL:', result.url);\n * console.log(`Dimensions: ${result.width}x${result.height}`);\n * ```\n *\n * @costs 1 credit\n */\n async screenshot(params: ScreenshotParams): Promise<ScreenshotData> {\n return this.crawl.screenshot(params);\n }\n}\n"]}