@dealcrawl/sdk 2.2.0 → 2.4.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/config.ts","../src/error.ts","../src/utils/request.ts","../src/utils/polling.ts","../src/resources/account.ts","../src/resources/crawl.ts","../src/resources/data.ts","../src/resources/dork.ts","../src/resources/extract.ts","../src/resources/keys.ts","../src/resources/scrape.ts","../src/resources/search.ts","../src/resources/status.ts","../src/resources/webhooks.ts","../src/client.ts"],"names":["sleep"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { RateLimitInfo } from \"./shared\";\n\n/**\n * SDK Configuration options\n */\nexport interface DealCrawlConfig {\n /** API key for authentication (required) */\n apiKey: string;\n\n /** Base URL for the API (default: https://api.dealcrawl.dev) */\n baseUrl?: string;\n\n /** Default timeout for requests in milliseconds (default: 30000) */\n timeout?: number;\n\n /** Maximum number of retries for failed requests (default: 3) */\n maxRetries?: number;\n\n /** Delay between retries in milliseconds (default: 1000) */\n retryDelay?: number;\n\n /** Callback when rate limit is hit */\n onRateLimit?: (info: RateLimitInfo) => void;\n}\n\n/**\n * Internal request context passed to resources\n */\nexport interface RequestContext {\n /** Base URL for API requests */\n baseUrl: string;\n\n /** API key for authentication */\n apiKey: string;\n\n /** Default timeout in milliseconds */\n timeout: number;\n\n /** Maximum number of retries */\n maxRetries: number;\n\n /** Delay between retries in milliseconds */\n retryDelay: number;\n\n /** Rate limit callback */\n onRateLimit?: (info: RateLimitInfo) => void;\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG = {\n baseUrl: \"https://api.dealcrawl.dev\",\n timeout: 30000,\n maxRetries: 3,\n retryDelay: 1000,\n} as const;\n","/**\n * Error codes used by DealCrawl API\n * Copied from @dealcrawl/shared to avoid bundling the entire package\n */\nexport const ERROR_CODES = {\n // Authentication\n INVALID_API_KEY: \"INVALID_API_KEY\",\n MISSING_API_KEY: \"MISSING_API_KEY\",\n API_KEY_EXPIRED: \"API_KEY_EXPIRED\",\n ACCOUNT_SUSPENDED: \"ACCOUNT_SUSPENDED\",\n\n // Rate limiting\n RATE_LIMIT_EXCEEDED: \"RATE_LIMIT_EXCEEDED\",\n QUOTA_EXCEEDED: \"QUOTA_EXCEEDED\",\n\n // Validation\n INVALID_URL: \"INVALID_URL\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n MISSING_REQUIRED_FIELD: \"MISSING_REQUIRED_FIELD\",\n\n // Job errors\n JOB_NOT_FOUND: \"JOB_NOT_FOUND\",\n JOB_FAILED: \"JOB_FAILED\",\n JOB_TIMEOUT: \"JOB_TIMEOUT\",\n\n // Scraping errors\n FETCH_FAILED: \"FETCH_FAILED\",\n PARSE_FAILED: \"PARSE_FAILED\",\n BLOCKED_BY_ROBOTS: \"BLOCKED_BY_ROBOTS\",\n CAPTCHA_DETECTED: \"CAPTCHA_DETECTED\",\n SITE_UNREACHABLE: \"SITE_UNREACHABLE\",\n\n // System errors\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n SERVICE_UNAVAILABLE: \"SERVICE_UNAVAILABLE\",\n REDIS_ERROR: \"REDIS_ERROR\",\n DATABASE_ERROR: \"DATABASE_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/**\n * Custom error class for DealCrawl SDK\n * Provides structured error handling with error codes\n */\nexport class DealCrawlError extends Error {\n /** Error code from ERROR_CODES */\n readonly code: ErrorCode;\n\n /** HTTP status code from the API response */\n readonly statusCode: number;\n\n /** Additional error details */\n readonly details?: Record<string, unknown>;\n\n /** Retry-After header value in seconds (for rate limiting) */\n readonly retryAfter?: number;\n\n constructor(options: {\n code: ErrorCode;\n message: string;\n statusCode?: number;\n details?: Record<string, unknown>;\n retryAfter?: number;\n }) {\n super(options.message);\n this.name = \"DealCrawlError\";\n this.code = options.code;\n this.statusCode = options.statusCode ?? 500;\n this.details = options.details;\n this.retryAfter = options.retryAfter;\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, DealCrawlError);\n }\n }\n\n /**\n * Check if the error is retryable\n * Rate limits and transient errors are retryable\n */\n isRetryable(): boolean {\n const retryableCodes: ErrorCode[] = [\n ERROR_CODES.RATE_LIMIT_EXCEEDED,\n ERROR_CODES.SERVICE_UNAVAILABLE,\n ERROR_CODES.REDIS_ERROR,\n ERROR_CODES.DATABASE_ERROR,\n ];\n return retryableCodes.includes(this.code);\n }\n\n /**\n * Check if the error is due to authentication issues\n */\n isAuthError(): boolean {\n const authCodes: ErrorCode[] = [\n ERROR_CODES.INVALID_API_KEY,\n ERROR_CODES.MISSING_API_KEY,\n ERROR_CODES.API_KEY_EXPIRED,\n ERROR_CODES.ACCOUNT_SUSPENDED,\n ];\n return authCodes.includes(this.code);\n }\n\n /**\n * Check if the error is due to rate limiting\n */\n isRateLimited(): boolean {\n return this.code === ERROR_CODES.RATE_LIMIT_EXCEEDED;\n }\n\n /**\n * Check if the error is due to quota exceeded\n */\n isQuotaExceeded(): boolean {\n return this.code === ERROR_CODES.QUOTA_EXCEEDED;\n }\n\n /**\n * Convert error to JSON-serializable object\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n statusCode: this.statusCode,\n details: this.details,\n retryAfter: this.retryAfter,\n };\n }\n\n /**\n * Create a DealCrawlError from an API error response\n */\n static fromResponse(\n statusCode: number,\n body: {\n code?: string;\n message?: string;\n error?: string;\n details?: Record<string, unknown>;\n retryAfter?: number;\n },\n retryAfter?: number | string | null\n ): DealCrawlError {\n const code =\n (body.code as ErrorCode) || mapStatusCodeToErrorCode(statusCode);\n const message = body.message || body.error || \"An error occurred\";\n\n // Parse retryAfter from parameter or body\n let parsedRetryAfter: number | undefined;\n if (retryAfter !== null && retryAfter !== undefined) {\n parsedRetryAfter =\n typeof retryAfter === \"string\" ? parseInt(retryAfter, 10) : retryAfter;\n if (isNaN(parsedRetryAfter)) {\n parsedRetryAfter = undefined;\n }\n } else if (body.retryAfter !== undefined) {\n parsedRetryAfter = body.retryAfter;\n }\n\n return new DealCrawlError({\n code,\n message,\n statusCode,\n details: body.details,\n retryAfter: parsedRetryAfter,\n });\n }\n}\n\n/**\n * Map HTTP status codes to error codes\n */\nfunction mapStatusCodeToErrorCode(statusCode: number): ErrorCode {\n switch (statusCode) {\n case 400:\n return ERROR_CODES.INVALID_REQUEST;\n case 401:\n return ERROR_CODES.INVALID_API_KEY;\n case 403:\n return ERROR_CODES.ACCOUNT_SUSPENDED;\n case 404:\n return ERROR_CODES.JOB_NOT_FOUND;\n case 429:\n return ERROR_CODES.RATE_LIMIT_EXCEEDED;\n case 500:\n return ERROR_CODES.INTERNAL_ERROR;\n case 503:\n return ERROR_CODES.SERVICE_UNAVAILABLE;\n default:\n return ERROR_CODES.INTERNAL_ERROR;\n }\n}\n","import type { RateLimitInfo } from \"../types/shared\";\nimport { DealCrawlError, ERROR_CODES } from \"../error\";\nimport type { RequestContext } from \"../types/config\";\n\n/**\n * Request options for the HTTP helper\n */\nexport interface RequestOptions {\n /** HTTP method */\n method?: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n\n /** Request body (will be JSON stringified) */\n body?: unknown;\n\n /** Query parameters */\n query?: Record<string, string | number | boolean | undefined>;\n\n /** Request timeout in milliseconds (overrides default) */\n timeout?: number;\n\n /** AbortSignal for request cancellation */\n signal?: AbortSignal;\n}\n\n/**\n * Response wrapper with rate limit info\n */\nexport interface RequestResult<T> {\n /** Response data */\n data: T;\n\n /** Rate limit information from headers */\n rateLimit: RateLimitInfo;\n}\n\n/**\n * Build query string from object\n */\nfunction buildQueryString(\n params: Record<string, string | number | boolean | undefined>\n): string {\n const entries = Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`\n );\n\n return entries.length > 0 ? `?${entries.join(\"&\")}` : \"\";\n}\n\n/**\n * Parse rate limit headers from response\n */\nfunction parseRateLimitHeaders(headers: Headers): RateLimitInfo {\n return {\n limit: parseInt(headers.get(\"X-RateLimit-Limit\") || \"0\", 10) || 0,\n remaining: parseInt(headers.get(\"X-RateLimit-Remaining\") || \"0\", 10) || 0,\n reset: parseInt(headers.get(\"X-RateLimit-Reset\") || \"0\", 10) || 0,\n };\n}\n\n/**\n * Sleep helper for retries\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Make an HTTP request with authentication, error handling, and retries\n */\nexport async function request<T>(\n ctx: RequestContext,\n path: string,\n options: RequestOptions = {}\n): Promise<RequestResult<T>> {\n const { method = \"GET\", body, query, timeout, signal } = options;\n\n // Build URL with query string\n const queryString = query ? buildQueryString(query) : \"\";\n const url = `${ctx.baseUrl}${path}${queryString}`;\n\n const timeoutMs = timeout ?? ctx.timeout;\n\n // Track current controller for external signal handling\n let currentController: AbortController | null = null;\n\n // Named handler for external abort signal\n const onAbort = () => {\n if (currentController) {\n currentController.abort();\n }\n };\n\n // Attach external signal listener once (if provided)\n if (signal) {\n signal.addEventListener(\"abort\", onAbort);\n }\n\n // Cleanup external signal listener (called at end of all retries)\n const cleanupExternalSignal = () => {\n if (signal) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n };\n\n let lastError: DealCrawlError | null = null;\n let attempt = 0;\n\n while (attempt <= ctx.maxRetries) {\n // Create a new AbortController and timeout for each attempt\n const controller = new AbortController();\n currentController = controller;\n\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n // Cleanup function for this specific attempt - idempotent\n let attemptCleanupDone = false;\n const cleanupAttempt = () => {\n if (attemptCleanupDone) return;\n attemptCleanupDone = true;\n clearTimeout(timeoutId);\n currentController = null;\n };\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${ctx.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n cleanupAttempt();\n\n // Parse rate limit headers\n const rateLimit = parseRateLimitHeaders(response.headers);\n\n // Handle rate limiting\n if (response.status === 429) {\n const retryAfter = parseInt(\n response.headers.get(\"Retry-After\") || \"60\",\n 10\n );\n\n // Notify callback\n if (ctx.onRateLimit) {\n ctx.onRateLimit(rateLimit);\n }\n\n throw new DealCrawlError({\n code: ERROR_CODES.RATE_LIMIT_EXCEEDED,\n message: \"Rate limit exceeded\",\n statusCode: 429,\n retryAfter,\n details: { rateLimit },\n });\n }\n\n // Handle errors\n if (!response.ok) {\n let errorBody: Record<string, unknown> = {};\n try {\n errorBody = (await response.json()) as Record<string, unknown>;\n } catch {\n // Response might not be JSON\n }\n\n // Extract Retry-After header if present\n const retryAfterHeader = response.headers.get(\"Retry-After\");\n\n throw DealCrawlError.fromResponse(\n response.status,\n errorBody,\n retryAfterHeader\n );\n }\n\n // Parse response\n let data: T;\n const contentType = response.headers.get(\"Content-Type\") || \"\";\n\n if (contentType.includes(\"application/json\")) {\n data = (await response.json()) as T;\n } else if (\n contentType.includes(\"text/csv\") ||\n contentType.includes(\"text/plain\")\n ) {\n data = (await response.text()) as unknown as T;\n } else {\n data = (await response.json()) as T;\n }\n\n cleanupExternalSignal();\n return { data, rateLimit };\n } catch (error) {\n cleanupAttempt();\n\n // Handle abort/timeout\n if (error instanceof Error && error.name === \"AbortError\") {\n cleanupExternalSignal();\n throw new DealCrawlError({\n code: ERROR_CODES.JOB_TIMEOUT,\n message: `Request timeout after ${timeoutMs}ms`,\n statusCode: 408,\n });\n }\n\n // Handle DealCrawlError\n if (error instanceof DealCrawlError) {\n lastError = error;\n\n // Retry if error is retryable and we have attempts left\n if (error.isRetryable() && attempt < ctx.maxRetries) {\n attempt++;\n await sleep(ctx.retryDelay * attempt); // Exponential backoff\n continue;\n }\n\n cleanupExternalSignal();\n throw error;\n }\n\n // Handle network errors\n cleanupExternalSignal();\n throw new DealCrawlError({\n code: ERROR_CODES.FETCH_FAILED,\n message:\n error instanceof Error ? error.message : \"Network request failed\",\n statusCode: 0,\n });\n }\n }\n\n // Should not reach here, but throw last error if we do\n cleanupExternalSignal();\n throw (\n lastError ??\n new DealCrawlError({\n code: ERROR_CODES.INTERNAL_ERROR,\n message: \"Request failed after retries\",\n statusCode: 500,\n })\n );\n}\n\n/**\n * Convenience method for GET requests\n */\nexport function get<T>(\n ctx: RequestContext,\n path: string,\n query?: Record<string, string | number | boolean | undefined>\n): Promise<RequestResult<T>> {\n return request<T>(ctx, path, { method: \"GET\", query });\n}\n\n/**\n * Convenience method for POST requests\n */\nexport function post<T>(\n ctx: RequestContext,\n path: string,\n body?: unknown\n): Promise<RequestResult<T>> {\n return request<T>(ctx, path, { method: \"POST\", body });\n}\n\n/**\n * Convenience method for PATCH requests\n */\nexport function patch<T>(\n ctx: RequestContext,\n path: string,\n body?: unknown\n): Promise<RequestResult<T>> {\n return request<T>(ctx, path, { method: \"PATCH\", body });\n}\n\n/**\n * Convenience method for DELETE requests\n */\nexport function del<T>(\n ctx: RequestContext,\n path: string,\n body?: unknown\n): Promise<RequestResult<T>> {\n return request<T>(ctx, path, { method: \"DELETE\", body });\n}\n","/**\r\n * Polling Utilities\r\n * Helpers for waiting on async job completion\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type { JobStatusResponse } from \"../types/responses\";\r\nimport { DealCrawlError, ERROR_CODES } from \"../error\";\r\nimport { get } from \"./request\";\r\n\r\n/** Options for waiting on a job */\r\nexport interface WaitOptions {\r\n /** Polling interval in milliseconds (default: 2000) */\r\n pollInterval?: number;\r\n /** Maximum time to wait in milliseconds (default: 300000 = 5 minutes) */\r\n timeout?: number;\r\n /** Callback on each poll */\r\n onProgress?: (status: JobStatusResponse) => void;\r\n /** Callback on status change */\r\n onStatusChange?: (newStatus: string, oldStatus: string) => void;\r\n /** AbortSignal for cancellation */\r\n signal?: AbortSignal;\r\n}\r\n\r\n/** Result of waiting for a job */\r\nexport interface WaitResult<T = unknown> {\r\n /** Job ID */\r\n jobId: string;\r\n /** Final status */\r\n status: \"completed\" | \"failed\";\r\n /** Result data (if completed) */\r\n result?: T;\r\n /** Error message (if failed) */\r\n error?: string;\r\n /** Total time waited in ms */\r\n waitTime: number;\r\n}\r\n\r\n/**\r\n * Wait for a job to complete\r\n * Polls the status endpoint until the job is done\r\n */\r\nexport async function waitForResult<T = unknown>(\r\n ctx: RequestContext,\r\n jobId: string,\r\n options: WaitOptions = {}\r\n): Promise<WaitResult<T>> {\r\n const {\r\n pollInterval = 2000,\r\n timeout = 300000, // 5 minutes\r\n onProgress,\r\n onStatusChange,\r\n signal,\r\n } = options;\r\n\r\n const startTime = Date.now();\r\n let lastStatus: string | null = null;\r\n\r\n while (true) {\r\n // Check for abort\r\n if (signal?.aborted) {\r\n throw new DealCrawlError({\r\n code: ERROR_CODES.JOB_TIMEOUT,\r\n message: \"Wait cancelled by user\",\r\n statusCode: 0,\r\n });\r\n }\r\n\r\n // Check timeout\r\n const elapsed = Date.now() - startTime;\r\n if (elapsed >= timeout) {\r\n throw new DealCrawlError({\r\n code: ERROR_CODES.JOB_TIMEOUT,\r\n message: `Job did not complete within ${timeout}ms`,\r\n statusCode: 408,\r\n details: { jobId, elapsed },\r\n });\r\n }\r\n\r\n // Fetch status\r\n const { data: status } = await get<JobStatusResponse>(\r\n ctx,\r\n `/v1/status/${jobId}`\r\n );\r\n\r\n // Call progress callback\r\n if (onProgress) {\r\n onProgress(status);\r\n }\r\n\r\n // Call status change callback\r\n if (onStatusChange && lastStatus !== null && lastStatus !== status.status) {\r\n onStatusChange(status.status, lastStatus);\r\n }\r\n lastStatus = status.status;\r\n\r\n // Check if done\r\n if (status.status === \"completed\") {\r\n return {\r\n jobId,\r\n status: \"completed\",\r\n result: status.result as T,\r\n waitTime: Date.now() - startTime,\r\n };\r\n }\r\n\r\n if (status.status === \"failed\") {\r\n return {\r\n jobId,\r\n status: \"failed\",\r\n error: status.error,\r\n waitTime: Date.now() - startTime,\r\n };\r\n }\r\n\r\n // Wait before next poll\r\n await sleep(pollInterval);\r\n }\r\n}\r\n\r\n/**\r\n * Wait for multiple jobs to complete\r\n * Returns when all jobs are done (either completed or failed)\r\n */\r\nexport async function waitForAll<T = unknown>(\r\n ctx: RequestContext,\r\n jobIds: string[],\r\n options: WaitOptions = {}\r\n): Promise<WaitResult<T>[]> {\r\n const promises = jobIds.map((jobId) => waitForResult<T>(ctx, jobId, options));\r\n return Promise.all(promises);\r\n}\r\n\r\n/**\r\n * Wait for any job to complete\r\n * Returns as soon as one job finishes\r\n */\r\nexport async function waitForAny<T = unknown>(\r\n ctx: RequestContext,\r\n jobIds: string[],\r\n options: WaitOptions = {}\r\n): Promise<WaitResult<T>> {\r\n const promises = jobIds.map((jobId) => waitForResult<T>(ctx, jobId, options));\r\n return Promise.race(promises);\r\n}\r\n\r\n/**\r\n * Poll with custom condition\r\n * Generic polling utility\r\n */\r\nexport async function pollUntil<T>(\r\n fetchFn: () => Promise<T>,\r\n conditionFn: (data: T) => boolean,\r\n options: {\r\n pollInterval?: number;\r\n timeout?: number;\r\n signal?: AbortSignal;\r\n } = {}\r\n): Promise<T> {\r\n const { pollInterval = 2000, timeout = 300000, signal } = options;\r\n const startTime = Date.now();\r\n\r\n while (true) {\r\n if (signal?.aborted) {\r\n throw new Error(\"Polling cancelled\");\r\n }\r\n\r\n if (Date.now() - startTime >= timeout) {\r\n throw new Error(`Polling timeout after ${timeout}ms`);\r\n }\r\n\r\n const data = await fetchFn();\r\n\r\n if (conditionFn(data)) {\r\n return data;\r\n }\r\n\r\n await sleep(pollInterval);\r\n }\r\n}\r\n\r\n/**\r\n * Sleep helper\r\n */\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n","/**\r\n * Account Resource\r\n * Handles account information and preferences\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type { UpdatePreferencesOptions } from \"../types/options\";\r\nimport type {\r\n AccountInfoResponse,\r\n AccountMetricsResponse,\r\n DealUpMetricsResponse,\r\n RecommendationsResponse,\r\n PreferencesResponse,\r\n UpdatePreferencesResponse,\r\n} from \"../types/responses\";\r\nimport { get, patch, post } from \"../utils/request\";\r\n\r\n/**\r\n * Account resource class\r\n * Provides methods for account information and preferences\r\n */\r\nexport class AccountResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * Get current account information\r\n *\r\n * @example\r\n * ```ts\r\n * const account = await client.account.get();\r\n * console.log(account.name);\r\n * console.log(account.tier);\r\n * console.log(account.usage);\r\n * ```\r\n */\r\n async get(): Promise<AccountInfoResponse> {\r\n const result = await get<AccountInfoResponse>(this.ctx, \"/v1/client\");\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get detailed account metrics\r\n *\r\n * @example\r\n * ```ts\r\n * const metrics = await client.account.getMetrics();\r\n * console.log(metrics.dealMetrics.totalDeals);\r\n * console.log(metrics.categoryPerformance);\r\n * ```\r\n */\r\n async getMetrics(): Promise<AccountMetricsResponse> {\r\n const result = await get<AccountMetricsResponse>(\r\n this.ctx,\r\n \"/v1/client/metrics\"\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get DealUp sync metrics (pro/enterprise only)\r\n *\r\n * @example\r\n * ```ts\r\n * const dealup = await client.account.getDealUpMetrics();\r\n * console.log(dealup.sync.totalSynced);\r\n * console.log(dealup.sync.clicksGenerated);\r\n * ```\r\n */\r\n async getDealUpMetrics(): Promise<DealUpMetricsResponse> {\r\n const result = await get<DealUpMetricsResponse>(\r\n this.ctx,\r\n \"/v1/client/dealup\"\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get crawl recommendations\r\n * AI-suggested URLs to crawl based on past performance\r\n *\r\n * @example\r\n * ```ts\r\n * const recommendations = await client.account.getRecommendations();\r\n * recommendations.recommendations.forEach(r => {\r\n * console.log(r.url, r.reason, r.estimatedDeals);\r\n * });\r\n * ```\r\n */\r\n async getRecommendations(): Promise<RecommendationsResponse> {\r\n const result = await get<RecommendationsResponse>(\r\n this.ctx,\r\n \"/v1/client/recommendations\"\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get current preferences\r\n *\r\n * @example\r\n * ```ts\r\n * const prefs = await client.account.getPreferences();\r\n * console.log(prefs.preferences.minDealScore);\r\n * console.log(prefs.preferences.autoSync);\r\n * ```\r\n */\r\n async getPreferences(): Promise<PreferencesResponse> {\r\n const result = await get<PreferencesResponse>(\r\n this.ctx,\r\n \"/v1/client/preferences\"\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Update account preferences\r\n *\r\n * @example\r\n * ```ts\r\n * const updated = await client.account.updatePreferences({\r\n * minDealScore: 70,\r\n * autoSync: true,\r\n * preferredCategories: [\"software\", \"courses\"]\r\n * });\r\n * ```\r\n */\r\n async updatePreferences(\r\n options: UpdatePreferencesOptions\r\n ): Promise<UpdatePreferencesResponse> {\r\n const result = await patch<UpdatePreferencesResponse>(\r\n this.ctx,\r\n \"/v1/client/preferences\",\r\n {\r\n preferredCategories: options.preferredCategories,\r\n minDealScore: options.minDealScore,\r\n autoSync: options.autoSync,\r\n webhookEnabled: options.webhookEnabled,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Track a DealUp click (webhook endpoint)\r\n * Used internally by DealUp to track click-through\r\n *\r\n * @example\r\n * ```ts\r\n * await client.account.trackClick(\"deal_abc123\", \"homepage\");\r\n * ```\r\n */\r\n async trackClick(\r\n dealId: string,\r\n source?: string\r\n ): Promise<{ success: boolean }> {\r\n const result = await post<{ success: boolean; tracked: boolean }>(\r\n this.ctx,\r\n \"/v1/client/dealup/click\",\r\n {\r\n dealId,\r\n source,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n // ============================================\r\n // CONVENIENCE METHODS\r\n // ============================================\r\n\r\n /**\r\n * Get remaining quota for a resource\r\n *\r\n * @example\r\n * ```ts\r\n * const remaining = await client.account.getRemainingQuota(\"scrapes\");\r\n * console.log(`${remaining} scrapes left this period`);\r\n * ```\r\n */\r\n async getRemainingQuota(\r\n resource: \"scrapes\" | \"crawls\" | \"dorks\"\r\n ): Promise<number> {\r\n const account = await this.get();\r\n const usage = account.usage[resource];\r\n return usage.limit - usage.used;\r\n }\r\n\r\n /**\r\n * Check if account has quota for a resource\r\n *\r\n * @example\r\n * ```ts\r\n * if (await client.account.hasQuota(\"crawls\", 5)) {\r\n * // Safe to start 5 crawls\r\n * }\r\n * ```\r\n */\r\n async hasQuota(\r\n resource: \"scrapes\" | \"crawls\" | \"dorks\",\r\n needed: number = 1\r\n ): Promise<boolean> {\r\n const remaining = await this.getRemainingQuota(resource);\r\n return remaining >= needed;\r\n }\r\n\r\n /**\r\n * Get account tier\r\n *\r\n * @example\r\n * ```ts\r\n * const tier = await client.account.getTier();\r\n * if (tier === \"enterprise\") {\r\n * // Enable advanced features\r\n * }\r\n * ```\r\n */\r\n async getTier(): Promise<\"free\" | \"pro\" | \"enterprise\"> {\r\n const account = await this.get();\r\n return account.tier;\r\n }\r\n\r\n /**\r\n * Check if account is pro or enterprise tier\r\n *\r\n * @example\r\n * ```ts\r\n * if (await client.account.isPremium()) {\r\n * // Show premium features\r\n * }\r\n * ```\r\n */\r\n async isPremium(): Promise<boolean> {\r\n const tier = await this.getTier();\r\n return tier === \"pro\" || tier === \"enterprise\";\r\n }\r\n}\r\n","/**\r\n * Crawl Resource\r\n * Handles website crawling operations\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type {\r\n CrawlOptions,\r\n CrawlTemplate,\r\n CrawlTemplateId,\r\n} from \"../types/options\";\r\nimport type {\r\n CrawlAnalysisResponse,\r\n CrawlJobResponse,\r\n} from \"../types/responses\";\r\nimport { get, post } from \"../utils/request\";\r\n\r\n/**\r\n * Predefined crawl templates with optimized settings\r\n */\r\nconst CRAWL_TEMPLATES: Record<CrawlTemplateId, CrawlTemplate> = {\r\n ecommerce: {\r\n id: \"ecommerce\",\r\n name: \"E-commerce\",\r\n description: \"Optimized for product pages and online stores\",\r\n defaultOptions: {\r\n maxDepth: 3,\r\n maxPages: 500,\r\n delayMs: 1500,\r\n extractDeal: true,\r\n prioritizeDealPages: true,\r\n excludePatterns: [\r\n \"*/cart*\",\r\n \"*/checkout*\",\r\n \"*/account*\",\r\n \"*/login*\",\r\n \"*/register*\",\r\n \"*/wishlist*\",\r\n \"*/compare*\",\r\n ],\r\n },\r\n },\r\n blog: {\r\n id: \"blog\",\r\n name: \"Blog\",\r\n description: \"Optimized for blog posts and articles\",\r\n defaultOptions: {\r\n maxDepth: 2,\r\n maxPages: 200,\r\n delayMs: 1000,\r\n extractDeal: false,\r\n prioritizeDealPages: false,\r\n excludePatterns: [\"*/tag/*\", \"*/category/*\", \"*/author/*\", \"*/page/*\"],\r\n },\r\n },\r\n docs: {\r\n id: \"docs\",\r\n name: \"Documentation\",\r\n description: \"Optimized for documentation sites\",\r\n defaultOptions: {\r\n maxDepth: 4,\r\n maxPages: 300,\r\n delayMs: 500,\r\n extractDeal: false,\r\n prioritizeDealPages: false,\r\n },\r\n },\r\n marketplace: {\r\n id: \"marketplace\",\r\n name: \"Marketplace\",\r\n description: \"Optimized for multi-vendor marketplaces\",\r\n defaultOptions: {\r\n maxDepth: 3,\r\n maxPages: 1000,\r\n delayMs: 2000,\r\n extractDeal: true,\r\n prioritizeDealPages: true,\r\n followExternalLinks: false,\r\n excludePatterns: [\r\n \"*/seller/*\",\r\n \"*/vendor/*\",\r\n \"*/shop/*\",\r\n \"*/reviews*\",\r\n \"*/questions*\",\r\n ],\r\n },\r\n },\r\n custom: {\r\n id: \"custom\",\r\n name: \"Custom\",\r\n description: \"No preset - use your own settings\",\r\n defaultOptions: {},\r\n },\r\n};\r\n\r\n/**\r\n * Crawl resource class\r\n * Provides methods for website crawling\r\n */\r\nexport class CrawlResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * Create a new crawl job\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.crawl.create({\r\n * url: \"https://example.com\",\r\n * maxDepth: 3,\r\n * maxPages: 100,\r\n * extractDeal: true\r\n * });\r\n * console.log(job.jobId);\r\n * ```\r\n */\r\n async create(options: CrawlOptions): Promise<CrawlJobResponse> {\r\n const body = {\r\n startUrl: options.url || options.startUrl,\r\n url: options.url || options.startUrl,\r\n prompt: options.prompt,\r\n maxDepth: options.maxDepth,\r\n maxPages: options.maxPages,\r\n delayMs: options.delayMs,\r\n detectSignals: options.detectSignals,\r\n extractWithAI: options.extractWithAI,\r\n extractDeal: options.extractDeal,\r\n minDealScore: options.minDealScore,\r\n prioritizeDealPages: options.prioritizeDealPages,\r\n followExternalLinks: options.followExternalLinks,\r\n allowedDomains: options.allowedDomains,\r\n excludePatterns: options.excludePatterns,\r\n };\r\n\r\n const result = await post<CrawlJobResponse>(this.ctx, \"/v1/crawl\", body);\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Create a crawl job using a template\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.crawl.withTemplate(\"ecommerce\", {\r\n * url: \"https://shop.example.com\",\r\n * maxPages: 200 // Override template default\r\n * });\r\n * ```\r\n */\r\n async withTemplate(\r\n templateId: CrawlTemplateId,\r\n options: CrawlOptions\r\n ): Promise<CrawlJobResponse> {\r\n const template = CRAWL_TEMPLATES[templateId];\r\n\r\n if (!template) {\r\n throw new Error(\r\n `Invalid crawl templateId: ${templateId}. Available templates: ${Object.keys(CRAWL_TEMPLATES).join(\", \")}`\r\n );\r\n }\r\n\r\n return this.create({\r\n ...template.defaultOptions,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * List available crawl templates\r\n *\r\n * @example\r\n * ```ts\r\n * const templates = client.crawl.listTemplates();\r\n * templates.forEach(t => console.log(t.name, t.description));\r\n * ```\r\n */\r\n listTemplates(): CrawlTemplate[] {\r\n return Object.values(CRAWL_TEMPLATES);\r\n }\r\n\r\n /**\r\n * Get a specific template by ID\r\n *\r\n * @example\r\n * ```ts\r\n * const template = client.crawl.getTemplate(\"ecommerce\");\r\n * console.log(template.defaultOptions);\r\n * ```\r\n */\r\n getTemplate(templateId: CrawlTemplateId): CrawlTemplate | undefined {\r\n return CRAWL_TEMPLATES[templateId];\r\n }\r\n\r\n /**\r\n * Analyze a URL before crawling\r\n * Returns recommended settings based on site structure\r\n *\r\n * @example\r\n * ```ts\r\n * const analysis = await client.crawl.analyze(\"https://shop.example.com\");\r\n * console.log(analysis.recommendedTemplate);\r\n * console.log(analysis.estimatedPages);\r\n * ```\r\n */\r\n async analyze(url: string): Promise<CrawlAnalysisResponse> {\r\n const result = await get<CrawlAnalysisResponse>(\r\n this.ctx,\r\n \"/v1/crawl/analyze\",\r\n {\r\n url,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Crawl a URL with deal extraction enabled\r\n * Convenience method for e-commerce crawling\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.crawl.forDeals(\"https://shop.example.com\", {\r\n * minDealScore: 70\r\n * });\r\n * ```\r\n */\r\n async forDeals(\r\n url: string,\r\n options?: Omit<CrawlOptions, \"url\" | \"extractDeal\" | \"prioritizeDealPages\">\r\n ): Promise<CrawlJobResponse> {\r\n return this.withTemplate(\"ecommerce\", {\r\n url,\r\n extractDeal: true,\r\n prioritizeDealPages: true,\r\n ...options,\r\n });\r\n }\r\n}\r\n","/**\r\n * Data Resource\r\n * Handles data retrieval, listing, and export operations\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type {\r\n ExportDealsOptions,\r\n ExportJobsOptions,\r\n ListDealsOptions,\r\n ListJobsOptions,\r\n} from \"../types/options\";\r\nimport type {\r\n ClientStatsResponse,\r\n DealDetails,\r\n ListDealsResponse,\r\n ListJobsResponse,\r\n} from \"../types/responses\";\r\nimport { get } from \"../utils/request\";\r\n\r\n/**\r\n * Data resource class\r\n * Provides methods for accessing job and deal data\r\n */\r\nexport class DataResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n // ============================================\r\n // JOBS\r\n // ============================================\r\n\r\n /**\r\n * List all jobs\r\n *\r\n * @example\r\n * ```ts\r\n * const jobs = await client.data.listJobs({\r\n * status: \"completed\",\r\n * type: \"crawl\",\r\n * page: 1,\r\n * limit: 20\r\n * });\r\n * console.log(jobs.data);\r\n * console.log(jobs.pagination.total);\r\n * ```\r\n */\r\n async listJobs(options: ListJobsOptions = {}): Promise<ListJobsResponse> {\r\n const result = await get<ListJobsResponse>(this.ctx, \"/v1/data/jobs\", {\r\n page: options.page,\r\n limit: options.limit,\r\n status: options.status,\r\n type: options.type,\r\n sortBy: options.sortBy,\r\n sortOrder: options.sortOrder,\r\n fromDate: options.fromDate,\r\n toDate: options.toDate,\r\n });\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get jobs by status\r\n * Convenience method for filtering by status\r\n *\r\n * @example\r\n * ```ts\r\n * const activeJobs = await client.data.getJobsByStatus(\"active\");\r\n * ```\r\n */\r\n async getJobsByStatus(\r\n status: ListJobsOptions[\"status\"],\r\n options?: Omit<ListJobsOptions, \"status\">\r\n ): Promise<ListJobsResponse> {\r\n return this.listJobs({ status, ...options });\r\n }\r\n\r\n /**\r\n * Get jobs by type\r\n * Convenience method for filtering by type\r\n *\r\n * @example\r\n * ```ts\r\n * const crawlJobs = await client.data.getJobsByType(\"crawl\");\r\n * ```\r\n */\r\n async getJobsByType(\r\n type: ListJobsOptions[\"type\"],\r\n options?: Omit<ListJobsOptions, \"type\">\r\n ): Promise<ListJobsResponse> {\r\n return this.listJobs({ type, ...options });\r\n }\r\n\r\n /**\r\n * Get recent jobs\r\n * Convenience method for getting latest jobs\r\n *\r\n * @example\r\n * ```ts\r\n * const recentJobs = await client.data.getRecentJobs(10);\r\n * ```\r\n */\r\n async getRecentJobs(limit: number = 10): Promise<ListJobsResponse> {\r\n return this.listJobs({\r\n limit,\r\n sortBy: \"created_at\",\r\n sortOrder: \"desc\",\r\n });\r\n }\r\n\r\n // ============================================\r\n // DEALS\r\n // ============================================\r\n\r\n /**\r\n * List all deals\r\n *\r\n * @example\r\n * ```ts\r\n * const deals = await client.data.listDeals({\r\n * minScore: 70,\r\n * category: \"electronics\",\r\n * sortBy: \"deal_score\",\r\n * sortOrder: \"desc\"\r\n * });\r\n * ```\r\n */\r\n async listDeals(options: ListDealsOptions = {}): Promise<ListDealsResponse> {\r\n const result = await get<ListDealsResponse>(this.ctx, \"/v1/data/deals\", {\r\n page: options.page,\r\n limit: options.limit,\r\n minScore: options.minScore,\r\n maxPrice: options.maxPrice,\r\n category: options.category,\r\n merchant: options.merchant,\r\n synced: options.synced?.toString(),\r\n sortBy: options.sortBy,\r\n sortOrder: options.sortOrder,\r\n });\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get a single deal by ID\r\n *\r\n * @example\r\n * ```ts\r\n * const deal = await client.data.getDeal(\"deal_abc123\");\r\n * console.log(deal.product.name);\r\n * console.log(deal.pricing.discountPercent);\r\n * ```\r\n */\r\n async getDeal(dealId: string): Promise<DealDetails> {\r\n if (!dealId || !dealId.trim()) {\r\n throw new Error(\"dealId is required and cannot be empty\");\r\n }\r\n const result = await get<DealDetails>(this.ctx, `/v1/data/deals/${dealId}`);\r\n return result.data;\r\n }\r\n /**\r\n * Get top deals by score\r\n * Convenience method for finding best deals\r\n *\r\n * @example\r\n * ```ts\r\n * const topDeals = await client.data.getTopDeals(20, 80);\r\n * ```\r\n */\r\n async getTopDeals(\r\n limit: number = 20,\r\n minScore: number = 70\r\n ): Promise<ListDealsResponse> {\r\n return this.listDeals({\r\n limit,\r\n minScore,\r\n sortBy: \"deal_score\",\r\n sortOrder: \"desc\",\r\n });\r\n }\r\n\r\n /**\r\n * Get deals by category\r\n * Convenience method for filtering by category\r\n *\r\n * @example\r\n * ```ts\r\n * const electronicsDeals = await client.data.getDealsByCategory(\"electronics\");\r\n async getDealsByCategory(\r\n category: string,\r\n options?: Omit<ListDealsOptions, \"category\">\r\n ): Promise<ListDealsResponse> {\r\n if (!category || !category.trim()) {\r\n throw new Error(\"category is required and cannot be empty\");\r\n }\r\n return this.listDeals({ category, ...options });\r\n } return this.listDeals({ category, ...options });\r\n }\r\n\r\n /**\r\n * Get unsynced deals (not yet sent to DealUp)\r\n *\r\n * @example\r\n * ```ts\r\n * const unsyncedDeals = await client.data.getUnsyncedDeals();\r\n * ```\r\n */\r\n async getUnsyncedDeals(\r\n options?: Omit<ListDealsOptions, \"synced\">\r\n ): Promise<ListDealsResponse> {\r\n return this.listDeals({ synced: false, ...options });\r\n }\r\n\r\n // ============================================\r\n // EXPORT\r\n // ============================================\r\n\r\n /**\r\n * Export jobs data\r\n *\r\n * @example\r\n * ```ts\r\n * // Export as JSON\r\n * const jsonData = await client.data.exportJobs({ format: \"json\" });\r\n *\r\n * // Export as CSV\r\n * const csvData = await client.data.exportJobs({ format: \"csv\" });\r\n * ```\r\n */\r\n async exportJobs(\r\n options: ExportJobsOptions = {}\r\n ): Promise<string | object[]> {\r\n const result = await get<string | object[]>(\r\n this.ctx,\r\n \"/v1/data/export/jobs\",\r\n {\r\n format: options.format || \"json\",\r\n status: options.status,\r\n type: options.type,\r\n fromDate: options.fromDate,\r\n toDate: options.toDate,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Export deals data\r\n *\r\n * @example\r\n * ```ts\r\n * // Export as JSON\r\n * const jsonData = await client.data.exportDeals({ format: \"json\" });\r\n *\r\n * // Export as CSV with filters\r\n * const csvData = await client.data.exportDeals({\r\n * format: \"csv\",\r\n * minScore: 70,\r\n * category: \"software\"\r\n * });\r\n * ```\r\n */\r\n async exportDeals(\r\n options: ExportDealsOptions = {}\r\n ): Promise<string | object[]> {\r\n const result = await get<string | object[]>(\r\n this.ctx,\r\n \"/v1/data/export/deals\",\r\n {\r\n format: options.format || \"json\",\r\n minScore: options.minScore,\r\n maxPrice: options.maxPrice,\r\n category: options.category,\r\n includeRawSignals: options.includeRawSignals,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n // ============================================\r\n // STATS\r\n // ============================================\r\n\r\n /**\r\n * Get client statistics\r\n *\r\n * @example\r\n * ```ts\r\n * const stats = await client.data.getStats();\r\n * console.log(stats.totals.deals);\r\n * console.log(stats.performance.avgDealScore);\r\n * ```\r\n */\r\n async getStats(): Promise<ClientStatsResponse> {\r\n const result = await get<ClientStatsResponse>(this.ctx, \"/v1/data/stats\");\r\n return result.data;\r\n }\r\n}\r\n","/**\r\n * Dork Resource\r\n * Handles Google Dork search operations\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type { DorkOptions } from \"../types/options\";\r\nimport type { DorkJobResponse } from \"../types/responses\";\r\nimport { post } from \"../utils/request\";\r\n\r\n/**\r\n * Dork resource class\r\n * Provides methods for Google Dork searches\r\n */\r\nexport class DorkResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * Create a new dork search job\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.dork.create({\r\n * query: \"discount coupon\",\r\n * site: \"amazon.com\",\r\n * maxResults: 20\r\n * });\r\n * console.log(job.jobId);\r\n * ```\r\n */\r\n async create(options: DorkOptions): Promise<DorkJobResponse> {\r\n const body = {\r\n query: this.buildQuery(options),\r\n maxResults: options.maxResults,\r\n region: options.region,\r\n };\r\n\r\n const result = await post<DorkJobResponse>(this.ctx, \"/v1/dork\", body);\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Search for deals on a specific site\r\n * Convenience method for finding discount pages\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.dork.findDeals(\"amazon.com\", {\r\n * maxResults: 50\r\n * });\r\n * ```\r\n */\r\n async findDeals(\r\n site: string,\r\n options?: Omit<DorkOptions, \"query\" | \"site\">\r\n ): Promise<DorkJobResponse> {\r\n return this.create({\r\n query: \"discount OR coupon OR sale OR promo OR deal\",\r\n site,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Search for product pages on a site\r\n * Looks for common product URL patterns\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.dork.findProducts(\"shop.example.com\", {\r\n * maxResults: 100\r\n * });\r\n * ```\r\n */\r\n async findProducts(\r\n site: string,\r\n options?: Omit<DorkOptions, \"query\" | \"site\" | \"inUrl\">\r\n ): Promise<DorkJobResponse> {\r\n return this.create({\r\n query: \"product OR item OR buy\",\r\n site,\r\n inUrl: \"product\",\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Search for PDFs on a site\r\n * Useful for finding manuals, guides, datasheets\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.dork.findPDFs(\"docs.example.com\", \"user guide\");\r\n * ```\r\n */\r\n async findPDFs(\r\n site: string,\r\n query?: string,\r\n options?: Omit<DorkOptions, \"query\" | \"site\" | \"fileType\">\r\n ): Promise<DorkJobResponse> {\r\n return this.create({\r\n query: query || \"*\",\r\n site,\r\n fileType: \"pdf\",\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Search with custom title filter\r\n * Find pages with specific terms in title\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.dork.inTitle(\"Black Friday\", {\r\n * site: \"bestbuy.com\",\r\n * maxResults: 30\r\n * });\r\n * ```\r\n */\r\n async inTitle(\r\n titleQuery: string,\r\n options?: Omit<DorkOptions, \"inTitle\">\r\n ): Promise<DorkJobResponse> {\r\n return this.create({\r\n query: options?.query || titleQuery,\r\n inTitle: titleQuery,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Search with custom URL filter\r\n * Find pages with specific terms in URL\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.dork.inUrl(\"clearance\", {\r\n * site: \"walmart.com\"\r\n * });\r\n * ```\r\n */\r\n async inUrl(\r\n urlQuery: string,\r\n options?: Omit<DorkOptions, \"inUrl\">\r\n ): Promise<DorkJobResponse> {\r\n return this.create({\r\n query: options?.query || urlQuery,\r\n inUrl: urlQuery,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Build a raw Google dork query string\r\n * Useful for preview or debugging\r\n *\r\n * @example\r\n * ```ts\r\n * const query = client.dork.buildQuery({\r\n * query: \"laptop deals\",\r\n * site: \"amazon.com\",\r\n * inTitle: \"discount\"\r\n * });\r\n * // Returns: \"laptop deals site:amazon.com intitle:discount\"\r\n * ```\r\n */\r\n buildQuery(options: DorkOptions): string {\r\n const parts: string[] = [];\r\n\r\n // Only add query if it's a non-empty string\r\n if (typeof options.query === 'string' && options.query.trim() !== '') {\r\n parts.push(options.query);\r\n }\r\n\r\n if (options.site) {\r\n parts.push(`site:${options.site}`);\r\n }\r\n if (options.fileType) {\r\n parts.push(`filetype:${options.fileType}`);\r\n }\r\n if (options.inUrl) {\r\n parts.push(`inurl:${options.inUrl}`);\r\n }\r\n if (options.inTitle) {\r\n parts.push(`intitle:${options.inTitle}`);\r\n }\r\n\r\n return parts.join(\" \");\r\n }\r\n}\r\n","/**\r\n * Extract Resource\r\n * Handles LLM-based structured data extraction\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type { ExtractOptions, ExtractModel } from \"../types/options\";\r\nimport type { ExtractJobResponse } from \"../types/responses\";\r\nimport { post } from \"../utils/request\";\r\n\r\n/**\r\n * Extract resource class\r\n * Provides methods for structured data extraction using LLMs\r\n */\r\nexport class ExtractResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * Create a new extraction job\r\n * Either schema or prompt must be provided\r\n *\r\n * @example\r\n * ```ts\r\n * // Schema-based extraction\r\n * const job = await client.extract.create({\r\n * url: \"https://example.com/product\",\r\n * schema: {\r\n * type: \"object\",\r\n * properties: {\r\n * name: { type: \"string\" },\r\n * price: { type: \"number\" },\r\n * features: { type: \"array\", items: { type: \"string\" } }\r\n * }\r\n * }\r\n * });\r\n *\r\n * // Prompt-based extraction\r\n * const job = await client.extract.create({\r\n * url: \"https://example.com/article\",\r\n * prompt: \"Extract the main points and author name\"\r\n * });\r\n * ```\r\n */\r\n async create(options: ExtractOptions): Promise<ExtractJobResponse> {\r\n if (!options.schema && !options.prompt) {\r\n throw new Error(\"Either 'schema' or 'prompt' must be provided\");\r\n }\r\n\r\n const body = {\r\n url: options.url,\r\n schema: options.schema,\r\n prompt: options.prompt,\r\n onlyMainContent: options.onlyMainContent,\r\n excludeTags: options.excludeTags,\r\n excludeSelectors: options.excludeSelectors,\r\n model: options.model,\r\n temperature: options.temperature,\r\n webhook: options.webhook,\r\n headers: options.headers,\r\n timeout: options.timeout,\r\n };\r\n\r\n const result = await post<ExtractJobResponse>(\r\n this.ctx,\r\n \"/v1/extract\",\r\n body\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Extract data using a JSON Schema\r\n * Convenience method for schema-based extraction\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.extract.withSchema(\r\n * \"https://example.com/product\",\r\n * {\r\n * type: \"object\",\r\n * properties: {\r\n * name: { type: \"string\" },\r\n * price: { type: \"number\" }\r\n * }\r\n * }\r\n * );\r\n * ```\r\n */\r\n async withSchema(\r\n url: string,\r\n schema: Record<string, unknown>,\r\n options?: Omit<ExtractOptions, \"url\" | \"schema\" | \"prompt\">\r\n ): Promise<ExtractJobResponse> {\r\n return this.create({\r\n url,\r\n schema,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Extract data using a natural language prompt\r\n * Convenience method for prompt-based extraction\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.extract.withPrompt(\r\n * \"https://example.com/article\",\r\n * \"Extract the article title, author, publication date, and a brief summary\"\r\n * );\r\n * ```\r\n */\r\n async withPrompt(\r\n url: string,\r\n prompt: string,\r\n options?: Omit<ExtractOptions, \"url\" | \"schema\" | \"prompt\">\r\n ): Promise<ExtractJobResponse> {\r\n return this.create({\r\n url,\r\n prompt,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Extract product information from a page\r\n * Pre-built schema for common e-commerce use case\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.extract.product(\"https://shop.example.com/item\");\r\n * ```\r\n */\r\n async product(\r\n url: string,\r\n options?: Omit<ExtractOptions, \"url\" | \"schema\" | \"prompt\">\r\n ): Promise<ExtractJobResponse> {\r\n const productSchema = {\r\n type: \"object\",\r\n properties: {\r\n name: { type: \"string\", description: \"Product name\" },\r\n brand: { type: \"string\", description: \"Brand name\" },\r\n price: { type: \"number\", description: \"Current price\" },\r\n originalPrice: {\r\n type: \"number\",\r\n description: \"Original price before discount\",\r\n },\r\n currency: {\r\n type: \"string\",\r\n description: \"Currency code (USD, EUR, etc.)\",\r\n },\r\n description: { type: \"string\", description: \"Product description\" },\r\n features: {\r\n type: \"array\",\r\n items: { type: \"string\" },\r\n description: \"List of product features\",\r\n },\r\n images: {\r\n type: \"array\",\r\n items: { type: \"string\" },\r\n description: \"Product image URLs\",\r\n },\r\n availability: {\r\n type: \"string\",\r\n description: \"In stock, out of stock, etc.\",\r\n },\r\n rating: { type: \"number\", description: \"Average rating\" },\r\n reviewCount: { type: \"number\", description: \"Number of reviews\" },\r\n },\r\n required: [\"name\", \"price\"],\r\n };\r\n\r\n return this.create({\r\n url,\r\n schema: productSchema,\r\n model: \"gpt-4o-mini\",\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Extract article/blog post information\r\n * Pre-built schema for content extraction\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.extract.article(\"https://blog.example.com/post\");\r\n * ```\r\n */\r\n async article(\r\n url: string,\r\n options?: Omit<ExtractOptions, \"url\" | \"schema\" | \"prompt\">\r\n ): Promise<ExtractJobResponse> {\r\n const articleSchema = {\r\n type: \"object\",\r\n properties: {\r\n title: { type: \"string\", description: \"Article title\" },\r\n author: { type: \"string\", description: \"Author name\" },\r\n publishedAt: { type: \"string\", description: \"Publication date\" },\r\n summary: {\r\n type: \"string\",\r\n description: \"Brief summary of the article\",\r\n },\r\n content: { type: \"string\", description: \"Main article content\" },\r\n tags: {\r\n type: \"array\",\r\n items: { type: \"string\" },\r\n description: \"Article tags or categories\",\r\n },\r\n readingTime: {\r\n type: \"number\",\r\n description: \"Estimated reading time in minutes\",\r\n },\r\n },\r\n required: [\"title\", \"content\"],\r\n };\r\n\r\n return this.create({\r\n url,\r\n schema: articleSchema,\r\n onlyMainContent: true,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Extract contact information from a page\r\n * Pre-built schema for contact page scraping\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.extract.contact(\"https://example.com/contact\");\r\n * ```\r\n */\r\n async contact(\r\n url: string,\r\n options?: Omit<ExtractOptions, \"url\" | \"schema\" | \"prompt\">\r\n ): Promise<ExtractJobResponse> {\r\n const contactSchema = {\r\n type: \"object\",\r\n properties: {\r\n companyName: {\r\n type: \"string\",\r\n description: \"Company or organization name\",\r\n },\r\n email: { type: \"string\", description: \"Contact email address\" },\r\n phone: { type: \"string\", description: \"Phone number\" },\r\n address: {\r\n type: \"object\",\r\n properties: {\r\n street: { type: \"string\" },\r\n city: { type: \"string\" },\r\n state: { type: \"string\" },\r\n postalCode: { type: \"string\" },\r\n country: { type: \"string\" },\r\n },\r\n description: \"Physical address\",\r\n },\r\n socialMedia: {\r\n type: \"object\",\r\n properties: {\r\n twitter: { type: \"string\" },\r\n linkedin: { type: \"string\" },\r\n facebook: { type: \"string\" },\r\n instagram: { type: \"string\" },\r\n },\r\n description: \"Social media links\",\r\n },\r\n },\r\n };\r\n\r\n return this.create({\r\n url,\r\n schema: contactSchema,\r\n onlyMainContent: false, // Contact info might be in footer\r\n ...options,\r\n });\r\n }\r\n}\r\n","/**\r\n * Keys Resource\r\n * Handles API key management operations\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type {\r\n CreateApiKeyOptions,\r\n GetApiKeyStatsOptions,\r\n ListApiKeysOptions,\r\n RevokeApiKeyOptions,\r\n RotateApiKeyOptions,\r\n} from \"../types/options\";\r\nimport type {\r\n ApiKeyInfo,\r\n CreateKeyResponse,\r\n DeleteKeyResponse,\r\n KeyStatsResponse,\r\n ListKeysResponse,\r\n RotateKeyResponse,\r\n} from \"../types/responses\";\r\nimport { del, get, post } from \"../utils/request\";\r\n\r\n/**\r\n * Keys resource class\r\n * Provides methods for managing API keys\r\n */\r\nexport class KeysResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * List all API keys\r\n *\r\n * @example\r\n * ```ts\r\n * const keys = await client.keys.list();\r\n * keys.keys.forEach(k => {\r\n * console.log(k.name, k.prefix, k.isActive);\r\n * });\r\n * ```\r\n */\r\n async list(options: ListApiKeysOptions = {}): Promise<ListKeysResponse> {\r\n const result = await get<ListKeysResponse>(this.ctx, \"/v1/keys\", {\r\n includeRevoked: options.includeRevoked,\r\n });\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Create a new API key\r\n *\r\n * @example\r\n * ```ts\r\n * const newKey = await client.keys.create({\r\n * name: \"Production Key\",\r\n * scopes: [\"scrape\", \"crawl\", \"status\", \"data:read\"],\r\n * expiresInDays: 365\r\n * });\r\n *\r\n * // IMPORTANT: Save this key immediately - it won't be shown again!\r\n * console.log(newKey.key);\r\n * ```\r\n */\r\n async create(options: CreateApiKeyOptions): Promise<CreateKeyResponse> {\r\n const result = await post<CreateKeyResponse>(this.ctx, \"/v1/keys\", {\r\n name: options.name,\r\n scopes: options.scopes,\r\n expiresInDays: options.expiresInDays,\r\n ipAllowlist: options.ipAllowlist,\r\n });\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get details of a specific key\r\n *\r\n * @example\r\n * ```ts\r\n * const key = await client.keys.get(\"key_abc123\");\r\n * console.log(key.scopes);\r\n * console.log(key.lastUsedAt);\r\n * ```\r\n */\r\n async get(keyId: string): Promise<ApiKeyInfo> {\r\n const result = await get<ApiKeyInfo>(this.ctx, `/v1/keys/${keyId}`);\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get usage statistics for a key\r\n *\r\n * @example\r\n * ```ts\r\n * const stats = await client.keys.getStats(\"key_abc123\", { days: 30 });\r\n * console.log(stats.stats.totalRequests);\r\n * console.log(stats.stats.byEndpoint);\r\n * ```\r\n */\r\n async getStats(\r\n keyId: string,\r\n options: GetApiKeyStatsOptions = {}\r\n ): Promise<KeyStatsResponse> {\r\n const result = await get<KeyStatsResponse>(\r\n this.ctx,\r\n `/v1/keys/${keyId}/stats`,\r\n {\r\n days: options.days,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Rotate an API key (revoke old, create new)\r\n *\r\n * @example\r\n * ```ts\r\n * const rotated = await client.keys.rotate(\"key_abc123\", {\r\n * newName: \"Production Key v2\"\r\n * });\r\n *\r\n * // Old key is now invalid\r\n * console.log(rotated.oldKeyRevoked); // true\r\n *\r\n * // Save new key immediately!\r\n * console.log(rotated.newKey.key);\r\n * ```\r\n */\r\n async rotate(\r\n keyId: string,\r\n options: RotateApiKeyOptions = {}\r\n ): Promise<RotateKeyResponse> {\r\n const result = await post<RotateKeyResponse>(\r\n this.ctx,\r\n `/v1/keys/${keyId}/rotate`,\r\n {\r\n newName: options.newName,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Revoke (delete) an API key\r\n *\r\n * @example\r\n * ```ts\r\n * // Simple revoke\r\n * await client.keys.revoke(\"key_abc123\");\r\n *\r\n * // With reason\r\n * await client.keys.revoke(\"key_abc123\", {\r\n * reason: \"Key compromised\"\r\n * });\r\n * ```\r\n */\r\n async revoke(\r\n keyId: string,\r\n options: RevokeApiKeyOptions = {}\r\n ): Promise<DeleteKeyResponse> {\r\n const result = await del<DeleteKeyResponse>(\r\n this.ctx,\r\n `/v1/keys/${keyId}`,\r\n options.reason ? { reason: options.reason } : undefined\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Revoke all API keys (except the current one)\r\n *\r\n * @example\r\n * ```ts\r\n * // Use with caution!\r\n * const result = await client.keys.revokeAll();\r\n * console.log(`Revoked ${result.count} keys`);\r\n * ```\r\n */\r\n async revokeAll(): Promise<{ success: boolean; count: number }> {\r\n const result = await del<{ success: boolean; count: number }>(\r\n this.ctx,\r\n \"/v1/keys/all\"\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get active keys only\r\n *\r\n * @example\r\n * ```ts\r\n * const activeKeys = await client.keys.getActive();\r\n * ```\r\n */\r\n async getActive(): Promise<ApiKeyInfo[]> {\r\n const all = await this.list({ includeRevoked: false });\r\n return all.keys.filter((k) => k.isActive);\r\n }\r\n\r\n /**\r\n * Check if a key is valid (active and not expired)\r\n *\r\n * @example\r\n * ```ts\r\n * const isValid = await client.keys.isValid(\"key_abc123\");\r\n * ```\r\n */\r\n async isValid(keyId: string): Promise<boolean> {\r\n try {\r\n const key = await this.get(keyId);\r\n if (!key.isActive) return false;\r\n if (key.expiresAt && new Date(key.expiresAt) < new Date()) return false;\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n","/**\r\n * Scrape Resource\r\n * Handles single page and batch scraping operations\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type { BatchScrapeOptions, ScrapeOptions } from \"../types/options\";\r\nimport type {\r\n BatchScrapeResponse,\r\n BatchStatusResponse,\r\n ScrapeJobResponse,\r\n} from \"../types/responses\";\r\nimport { get, post } from \"../utils/request\";\r\n\r\n/**\r\n * Scrape resource class\r\n * Provides methods for single page scraping\r\n */\r\nexport class ScrapeResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * Create a new scrape job\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.scrape.create({\r\n * url: \"https://example.com/product\",\r\n * extractDeal: true,\r\n * screenshot: { enabled: true, format: \"webp\" }\r\n * });\r\n * console.log(job.jobId);\r\n * ```\r\n */\r\n async create(options: ScrapeOptions): Promise<ScrapeJobResponse> {\r\n const body = {\r\n url: options.url,\r\n detectSignals: options.detectSignals ?? true,\r\n extractWithAI: options.extractWithAI,\r\n extractDeal: options.extractDeal,\r\n extractMultipleDeals: options.extractMultipleDeals,\r\n maxDeals: options.maxDeals,\r\n useAdvancedModel: options.useAdvancedModel,\r\n minDealScore: options.minDealScore,\r\n screenshot: options.screenshot,\r\n excludeTags: options.excludeTags,\r\n excludeSelectors: options.excludeSelectors,\r\n onlyMainContent: options.onlyMainContent,\r\n headers: options.headers,\r\n timeout: options.timeout,\r\n };\r\n\r\n const result = await post<ScrapeJobResponse>(this.ctx, \"/v1/scrape\", body);\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Scrape a URL with deal extraction enabled\r\n * Convenience method for common use case\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.scrape.extractDeal(\"https://example.com/sale\");\r\n * ```\r\n */\r\n async extractDeal(\r\n url: string,\r\n options?: Omit<ScrapeOptions, \"url\" | \"extractDeal\">\r\n ): Promise<ScrapeJobResponse> {\r\n return this.create({\r\n url,\r\n extractDeal: true,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Scrape a list page and extract multiple deals\r\n * Use for category pages, deal lists, search results\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.scrape.extractDeals(\r\n * \"https://amazon.fr/deals\",\r\n * { maxDeals: 30, useAdvancedModel: true }\r\n * );\r\n * ```\r\n */\r\n async extractDeals(\r\n url: string,\r\n options?: Omit<ScrapeOptions, \"url\" | \"extractMultipleDeals\">\r\n ): Promise<ScrapeJobResponse> {\r\n return this.create({\r\n url,\r\n extractMultipleDeals: true,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Scrape a URL with screenshot capture\r\n * Convenience method for screenshot capture\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.scrape.withScreenshot(\"https://example.com\", {\r\n * format: \"webp\",\r\n * fullPage: true\r\n * });\r\n * ```\r\n */\r\n async withScreenshot(\r\n url: string,\r\n screenshotOptions?: Omit<ScrapeOptions[\"screenshot\"], \"enabled\">,\r\n options?: Omit<ScrapeOptions, \"url\" | \"screenshot\">\r\n ): Promise<ScrapeJobResponse> {\r\n return this.create({\r\n url,\r\n screenshot: {\r\n enabled: true,\r\n ...screenshotOptions,\r\n },\r\n ...options,\r\n });\r\n }\r\n\r\n // ============================================\r\n // BATCH SCRAPING METHODS\r\n // ============================================\r\n\r\n /**\r\n * Create a batch scrape job for multiple URLs\r\n * Scrapes 1-100 URLs in a single request\r\n *\r\n * @example\r\n * ```ts\r\n * const batch = await client.scrape.batch({\r\n * urls: [\r\n * { url: \"https://shop1.com/product1\" },\r\n * { url: \"https://shop2.com/deal\", extractDeal: true }\r\n * ],\r\n * defaults: { detectSignals: true }\r\n * });\r\n * console.log(batch.batchId, batch.results);\r\n * ```\r\n */\r\n async batch(options: BatchScrapeOptions): Promise<BatchScrapeResponse> {\r\n const body = {\r\n urls: options.urls,\r\n defaults: options.defaults,\r\n webhookUrl: options.webhookUrl,\r\n priority: options.priority,\r\n delayMs: options.delay,\r\n };\r\n\r\n const result = await post<BatchScrapeResponse>(\r\n this.ctx,\r\n \"/v1/scrape/batch\",\r\n body\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get status of a batch scrape operation\r\n *\r\n * @example\r\n * ```ts\r\n * const status = await client.scrape.getBatchStatus(batchId);\r\n * console.log(`Completed: ${status.completed}/${status.total}`);\r\n * ```\r\n */\r\n async getBatchStatus(batchId: string): Promise<BatchStatusResponse> {\r\n const result = await get<BatchStatusResponse>(\r\n this.ctx,\r\n `/v1/scrape/batch/${batchId}`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Batch scrape with deal extraction enabled for all URLs\r\n * Convenience method for deal-focused batch scraping\r\n *\r\n * @example\r\n * ```ts\r\n * const batch = await client.scrape.batchForDeals([\r\n * \"https://shop1.com/sale\",\r\n * \"https://shop2.com/deals\"\r\n * ]);\r\n * ```\r\n */\r\n async batchForDeals(\r\n urls: string[],\r\n options?: Omit<BatchScrapeOptions, \"urls\">\r\n ): Promise<BatchScrapeResponse> {\r\n return this.batch({\r\n urls: urls.map((url) => ({ url })),\r\n defaults: {\r\n extractDeal: true,\r\n detectSignals: true,\r\n ...options?.defaults,\r\n },\r\n ...options,\r\n });\r\n }\r\n}\r\n","/**\n * Search Resource\n * Handles web search operations with AI optimization\n */\n\nimport type { RequestContext } from \"../types/config\";\nimport type { SearchOptions } from \"../types/options\";\nimport type { SearchJobResponse, SearchStatusResponse } from \"../types/responses\";\nimport { get, post } from \"../utils/request\";\n\n/**\n * Search resource class\n * Provides methods for web search with AI optimization\n */\nexport class SearchResource {\n constructor(private ctx: RequestContext) {}\n\n /**\n * Create a new search job\n *\n * @example\n * ```ts\n * const result = await client.search.create({\n * query: \"laptop deals black friday\",\n * maxResults: 20,\n * useDealScoring: true\n * });\n * ```\n */\n async create(options: SearchOptions): Promise<SearchJobResponse> {\n const body = {\n query: options.query,\n limit: options.maxResults,\n scrapeResults: options.autoScrape,\n maxScrapeResults: options.autoScrapeLimit,\n useAiOptimization: options.useAiOptimization,\n aiProvider: options.aiProvider,\n aiModel: options.aiModel,\n useDealScoring: options.useDealScoring,\n skipCache: options.skipCache,\n filters: options.filters,\n webhook: options.webhook,\n };\n\n const result = await post<SearchJobResponse>(this.ctx, \"/v1/search\", body);\n return result.data;\n }\n\n /**\n * Search with AI query optimization\n * Convenience method for AI-enhanced searches\n *\n * @example\n * ```ts\n * const result = await client.search.withAI(\"iphone discount\", {\n * aiProvider: \"openai\",\n * aiModel: \"gpt-4o-mini\"\n * });\n * ```\n */\n async withAI(\n query: string,\n options?: Omit<SearchOptions, \"query\" | \"useAiOptimization\">\n ): Promise<SearchJobResponse> {\n return this.create({\n query,\n useAiOptimization: true,\n ...options,\n });\n }\n\n /**\n * Search with deal scoring enabled\n * Scores each result for deal relevance (0-100)\n *\n * @example\n * ```ts\n * const result = await client.search.forDeals(\"gaming laptop\");\n * ```\n */\n async forDeals(\n query: string,\n options?: Omit<SearchOptions, \"query\" | \"useDealScoring\">\n ): Promise<SearchJobResponse> {\n return this.create({\n query,\n useDealScoring: true,\n ...options,\n });\n }\n\n /**\n * Search and auto-scrape top results\n * Creates scrape jobs for the best matching URLs\n *\n * @example\n * ```ts\n * const result = await client.search.andScrape(\"promo codes\", {\n * autoScrapeLimit: 5\n * });\n * console.log(result.data.scrapedJobIds);\n * ```\n */\n async andScrape(\n query: string,\n options?: Omit<SearchOptions, \"query\" | \"autoScrape\">\n ): Promise<SearchJobResponse> {\n return this.create({\n query,\n autoScrape: true,\n ...options,\n });\n }\n\n /**\n * Check search API status\n * Returns availability and features info\n *\n * @example\n * ```ts\n * const status = await client.search.getStatus();\n * if (status.available) {\n * console.log(`Provider: ${status.provider}`);\n * }\n * ```\n */\n async getStatus(): Promise<SearchStatusResponse> {\n const result = await get<SearchStatusResponse>(this.ctx, \"/v1/search/status\");\n return result.data;\n }\n}\n","/**\r\n * Status Resource\r\n * Handles job status checking and management\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type { GetDealsOptions } from \"../types/options\";\r\nimport type {\r\n JobStatusResponse,\r\n JobDealsResponse,\r\n ResumeJobResponse,\r\n JobMetricsResponse,\r\n CancelJobResponse,\r\n} from \"../types/responses\";\r\nimport { get, post, del } from \"../utils/request\";\r\n\r\n/**\r\n * Status resource class\r\n * Provides methods for checking and managing job status\r\n */\r\nexport class StatusResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * Get the status of a job\r\n *\r\n * @example\r\n * ```ts\r\n * const status = await client.status.get(\"job_abc123\");\r\n * console.log(status.status); // \"completed\"\r\n * console.log(status.result);\r\n * ```\r\n */\r\n async get(jobId: string): Promise<JobStatusResponse> {\r\n const result = await get<JobStatusResponse>(\r\n this.ctx,\r\n `/v1/status/${jobId}`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get deals found by a job\r\n *\r\n * @example\r\n * ```ts\r\n * const deals = await client.status.getDeals(\"job_abc123\", {\r\n * minScore: 70,\r\n * limit: 20\r\n * });\r\n * console.log(deals.deals);\r\n * ```\r\n */\r\n async getDeals(\r\n jobId: string,\r\n options?: GetDealsOptions\r\n ): Promise<JobDealsResponse> {\r\n const result = await get<JobDealsResponse>(\r\n this.ctx,\r\n `/v1/status/${jobId}/deals`,\r\n {\r\n minScore: options?.minScore,\r\n limit: options?.limit,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Resume a paused or failed job from checkpoint\r\n *\r\n * @example\r\n * ```ts\r\n * const resumed = await client.status.resume(\"job_abc123\");\r\n * console.log(resumed.newJobId);\r\n * ```\r\n */\r\n async resume(jobId: string): Promise<ResumeJobResponse> {\r\n const result = await post<ResumeJobResponse>(\r\n this.ctx,\r\n `/v1/status/${jobId}/resume`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get detailed metrics for a job\r\n *\r\n * @example\r\n * ```ts\r\n * const metrics = await client.status.getMetrics(\"job_abc123\");\r\n * console.log(metrics.metrics.successRate);\r\n * ```\r\n */\r\n async getMetrics(jobId: string): Promise<JobMetricsResponse> {\r\n const result = await get<JobMetricsResponse>(\r\n this.ctx,\r\n `/v1/status/${jobId}/metrics`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Cancel a pending or active job\r\n *\r\n * @example\r\n * ```ts\r\n * const cancelled = await client.status.cancel(\"job_abc123\");\r\n * console.log(cancelled.success);\r\n * ```\r\n */\r\n async cancel(jobId: string): Promise<CancelJobResponse> {\r\n const result = await del<CancelJobResponse>(\r\n this.ctx,\r\n `/v1/status/${jobId}`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Check if a job is complete\r\n * Convenience method for polling\r\n *\r\n * @example\r\n * ```ts\r\n * const isComplete = await client.status.isComplete(\"job_abc123\");\r\n * ```\r\n */\r\n async isComplete(jobId: string): Promise<boolean> {\r\n const status = await this.get(jobId);\r\n return status.status === \"completed\" || status.status === \"failed\";\r\n }\r\n\r\n /**\r\n * Check if a job succeeded\r\n * Convenience method for result checking\r\n *\r\n * @example\r\n * ```ts\r\n * const succeeded = await client.status.succeeded(\"job_abc123\");\r\n * ```\r\n */\r\n async succeeded(jobId: string): Promise<boolean> {\r\n const status = await this.get(jobId);\r\n return status.status === \"completed\";\r\n }\r\n\r\n /**\r\n * Get the result of a completed job\r\n * Throws if job is not complete\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.status.getResult(\"job_abc123\");\r\n * ```\r\n */\r\n async getResult<T = unknown>(jobId: string): Promise<T> {\r\n const status = await this.get(jobId);\r\n\r\n if (status.status === \"failed\") {\r\n throw new Error(`Job failed: ${status.error || \"Unknown error\"}`);\r\n }\r\n\r\n if (status.status !== \"completed\") {\r\n throw new Error(`Job not complete. Status: ${status.status}`);\r\n }\r\n\r\n return status.result as T;\r\n }\r\n}\r\n","/**\r\n * Webhooks Resource\r\n * Handles webhook CRUD operations\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type {\r\n CreateWebhookOptions,\r\n UpdateWebhookOptions,\r\n} from \"../types/options\";\r\nimport type {\r\n CreateWebhookResponse,\r\n ListWebhooksResponse,\r\n WebhookItem,\r\n UpdateWebhookResponse,\r\n DeleteWebhookResponse,\r\n TestWebhookResponse,\r\n} from \"../types/responses\";\r\nimport { get, post, patch, del } from \"../utils/request\";\r\n\r\n/**\r\n * Webhooks resource class\r\n * Provides methods for managing webhooks\r\n */\r\nexport class WebhooksResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * Create a new webhook\r\n *\r\n * @example\r\n * ```ts\r\n * const webhook = await client.webhooks.create({\r\n * event: \"deal.found\",\r\n * url: \"https://my-server.com/webhooks/deals\",\r\n * secret: \"my-webhook-secret\",\r\n * minDealScore: 70\r\n * });\r\n * console.log(webhook.webhookId);\r\n * ```\r\n */\r\n async create(options: CreateWebhookOptions): Promise<CreateWebhookResponse> {\r\n const result = await post<CreateWebhookResponse>(this.ctx, \"/v1/webhooks\", {\r\n event: options.event,\r\n url: options.url,\r\n secret: options.secret,\r\n minDealScore: options.minDealScore,\r\n categories: options.categories,\r\n active: options.active,\r\n });\r\n return result.data;\r\n }\r\n\r\n /**\r\n * List all webhooks\r\n *\r\n * @example\r\n * ```ts\r\n * const webhooks = await client.webhooks.list();\r\n * webhooks.webhooks.forEach(w => {\r\n * console.log(w.event, w.url, w.active);\r\n * });\r\n * ```\r\n */\r\n async list(): Promise<ListWebhooksResponse> {\r\n const result = await get<ListWebhooksResponse>(this.ctx, \"/v1/webhooks\");\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get a webhook by ID\r\n *\r\n * @example\r\n * ```ts\r\n * const webhook = await client.webhooks.get(\"webhook_abc123\");\r\n * console.log(webhook.event);\r\n * ```\r\n */\r\n async get(webhookId: string): Promise<WebhookItem> {\r\n const result = await get<WebhookItem>(\r\n this.ctx,\r\n `/v1/webhooks/${webhookId}`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Update a webhook\r\n *\r\n * @example\r\n * ```ts\r\n * const updated = await client.webhooks.update(\"webhook_abc123\", {\r\n * minDealScore: 80,\r\n * active: false\r\n * });\r\n * ```\r\n */\r\n async update(\r\n webhookId: string,\r\n options: UpdateWebhookOptions\r\n ): Promise<UpdateWebhookResponse> {\r\n const result = await patch<UpdateWebhookResponse>(\r\n this.ctx,\r\n `/v1/webhooks/${webhookId}`,\r\n {\r\n url: options.url,\r\n secret: options.secret,\r\n minDealScore: options.minDealScore,\r\n categories: options.categories,\r\n active: options.active,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Delete a webhook\r\n *\r\n * @example\r\n * ```ts\r\n * await client.webhooks.delete(\"webhook_abc123\");\r\n * ```\r\n */\r\n async delete(webhookId: string): Promise<DeleteWebhookResponse> {\r\n const result = await del<DeleteWebhookResponse>(\r\n this.ctx,\r\n `/v1/webhooks/${webhookId}`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Test a webhook by sending a test payload\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.webhooks.test(\"webhook_abc123\");\r\n * if (result.delivered) {\r\n * console.log(`Delivered in ${result.responseTime}ms`);\r\n * } else {\r\n * console.log(`Failed: ${result.error}`);\r\n * }\r\n * ```\r\n */\r\n async test(webhookId: string): Promise<TestWebhookResponse> {\r\n const result = await post<TestWebhookResponse>(\r\n this.ctx,\r\n `/v1/webhooks/${webhookId}/test`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Enable a webhook\r\n * Convenience method for activating a webhook\r\n *\r\n * @example\r\n * ```ts\r\n * await client.webhooks.enable(\"webhook_abc123\");\r\n * ```\r\n */\r\n async enable(webhookId: string): Promise<UpdateWebhookResponse> {\r\n return this.update(webhookId, { active: true });\r\n }\r\n\r\n /**\r\n * Disable a webhook\r\n * Convenience method for deactivating a webhook\r\n *\r\n * @example\r\n * ```ts\r\n * await client.webhooks.disable(\"webhook_abc123\");\r\n * ```\r\n */\r\n async disable(webhookId: string): Promise<UpdateWebhookResponse> {\r\n return this.update(webhookId, { active: false });\r\n }\r\n\r\n /**\r\n * Get active webhooks only\r\n *\r\n * @example\r\n * ```ts\r\n * const active = await client.webhooks.getActive();\r\n * ```\r\n */\r\n async getActive(): Promise<WebhookItem[]> {\r\n const all = await this.list();\r\n return all.webhooks.filter((w) => w.active);\r\n }\r\n\r\n /**\r\n * Get webhooks by event type\r\n *\r\n * @example\r\n * ```ts\r\n * const dealWebhooks = await client.webhooks.getByEvent(\"deal.found\");\r\n * ```\r\n */\r\n async getByEvent(\r\n event: CreateWebhookOptions[\"event\"]\r\n ): Promise<WebhookItem[]> {\r\n const all = await this.list();\r\n return all.webhooks.filter((w) => w.event === event);\r\n }\r\n}\r\n","/**\r\n * DealCrawl SDK Client\r\n * Main entry point for the SDK\r\n *\r\n * @example\r\n * ```ts\r\n * import { DealCrawl } from \"@dealcrawl/sdk\";\r\n *\r\n * const client = new DealCrawl({ apiKey: \"sk_xxx\" });\r\n *\r\n * // Scrape a page\r\n * const job = await client.scrape.create({\r\n * url: \"https://example.com/product\",\r\n * extractDeal: true\r\n * });\r\n *\r\n * // Wait for result\r\n * const result = await client.waitForResult(job.jobId);\r\n * console.log(result);\r\n * ```\r\n */\r\n\r\nimport type { DealCrawlConfig, RequestContext } from \"./types/config\";\r\nimport { DEFAULT_CONFIG } from \"./types/config\";\r\nimport type { WaitOptions, WaitResult } from \"./utils/polling\";\r\nimport { waitForAll, waitForAny, waitForResult } from \"./utils/polling\";\r\n\r\n// Import resources\r\nimport { AccountResource } from \"./resources/account\";\r\nimport { CrawlResource } from \"./resources/crawl\";\r\nimport { DataResource } from \"./resources/data\";\r\nimport { DorkResource } from \"./resources/dork\";\r\nimport { ExtractResource } from \"./resources/extract\";\r\nimport { KeysResource } from \"./resources/keys\";\r\nimport { ScrapeResource } from \"./resources/scrape\";\r\nimport { SearchResource } from \"./resources/search\";\r\nimport { StatusResource } from \"./resources/status\";\r\nimport { WebhooksResource } from \"./resources/webhooks\";\r\n\r\n/**\r\n * DealCrawl SDK Client\r\n *\r\n * Provides access to all DealCrawl API endpoints through\r\n * organized resource classes following a Stripe-like pattern.\r\n *\r\n * @example\r\n * ```ts\r\n * const client = new DealCrawl({ apiKey: \"sk_xxx\" });\r\n *\r\n * // Core operations\r\n * await client.scrape.create({ url: \"...\" });\r\n * await client.crawl.create({ url: \"...\", maxPages: 100 });\r\n * await client.extract.create({ url: \"...\", schema: {...} });\r\n * await client.dork.create({ query: \"...\" });\r\n *\r\n * // Status & polling\r\n * await client.status.get(jobId);\r\n * await client.waitForResult(jobId);\r\n *\r\n * // Data access\r\n * await client.data.listJobs();\r\n * await client.data.listDeals();\r\n *\r\n * // Management\r\n * await client.webhooks.create({...});\r\n * await client.keys.create({...});\r\n * await client.account.get();\r\n * ```\r\n */\r\nexport class DealCrawl {\r\n /** Internal request context */\r\n private readonly ctx: RequestContext;\r\n\r\n // ============================================\r\n // RESOURCES\r\n // ============================================\r\n\r\n /**\r\n * Scrape resource - Single page and batch scraping\r\n *\r\n * @example\r\n * ```ts\r\n * // Single page\r\n * const job = await client.scrape.create({\r\n * url: \"https://example.com\",\r\n * extractDeal: true\r\n * });\r\n *\r\n * // Batch scraping\r\n * const batch = await client.scrape.batch({\r\n * urls: [{ url: \"https://shop1.com\" }, { url: \"https://shop2.com\" }]\r\n * });\r\n * ```\r\n */\r\n readonly scrape: ScrapeResource;\r\n\r\n /**\r\n * Search resource - Web search with AI optimization\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.search.create({\r\n * query: \"laptop deals\",\r\n * useDealScoring: true\r\n * });\r\n *\r\n * // With AI optimization\r\n * const result = await client.search.withAI(\"iphone discount\");\r\n * ```\r\n */\r\n readonly search: SearchResource;\r\n\r\n /**\r\n * Crawl resource - Website crawling\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.crawl.create({\r\n * url: \"https://shop.example.com\",\r\n * maxPages: 100\r\n * });\r\n *\r\n * // With template\r\n * const job = await client.crawl.withTemplate(\"ecommerce\", {\r\n * url: \"https://shop.example.com\"\r\n * });\r\n * ```\r\n */\r\n readonly crawl: CrawlResource;\r\n\r\n /**\r\n * Extract resource - LLM-based structured data extraction\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.extract.create({\r\n * url: \"https://example.com/product\",\r\n * schema: { type: \"object\", properties: {...} }\r\n * });\r\n * ```\r\n */\r\n readonly extract: ExtractResource;\r\n\r\n /**\r\n * Dork resource - Google Dork searches\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.dork.create({\r\n * query: \"discount coupon\",\r\n * site: \"amazon.com\"\r\n * });\r\n * ```\r\n */\r\n readonly dork: DorkResource;\r\n\r\n /**\r\n * Status resource - Job status management\r\n *\r\n * @example\r\n * ```ts\r\n * const status = await client.status.get(jobId);\r\n * const deals = await client.status.getDeals(jobId);\r\n * await client.status.cancel(jobId);\r\n * ```\r\n */\r\n readonly status: StatusResource;\r\n\r\n /**\r\n * Data resource - Jobs and deals data access\r\n *\r\n * @example\r\n * ```ts\r\n * const jobs = await client.data.listJobs();\r\n * const deals = await client.data.listDeals({ minScore: 70 });\r\n * const stats = await client.data.getStats();\r\n * ```\r\n */\r\n readonly data: DataResource;\r\n\r\n /**\r\n * Webhooks resource - Webhook management\r\n *\r\n * @example\r\n * ```ts\r\n * await client.webhooks.create({\r\n * event: \"deal.found\",\r\n * url: \"https://...\"\r\n * });\r\n * ```\r\n */\r\n readonly webhooks: WebhooksResource;\r\n\r\n /**\r\n * Keys resource - API key management\r\n *\r\n * @example\r\n * ```ts\r\n * const newKey = await client.keys.create({\r\n * name: \"Production\",\r\n * scopes: [\"scrape\", \"status\"]\r\n * });\r\n * ```\r\n */\r\n readonly keys: KeysResource;\r\n\r\n /**\r\n * Account resource - Account info and preferences\r\n *\r\n * @example\r\n * ```ts\r\n * const account = await client.account.get();\r\n * await client.account.updatePreferences({\r\n * minDealScore: 70\r\n * });\r\n * ```\r\n */\r\n readonly account: AccountResource;\r\n\r\n // ============================================\r\n // CONSTRUCTOR\r\n // ============================================\r\n\r\n /**\r\n * Create a new DealCrawl client\r\n *\r\n * @param config - Client configuration\r\n *\r\n * @example\r\n * ```ts\r\n * // Minimal config\r\n * const client = new DealCrawl({ apiKey: \"sk_xxx\" });\r\n *\r\n * // Full config\r\n * const client = new DealCrawl({\r\n * apiKey: \"sk_xxx\",\r\n * baseUrl: \"https://api.dealcrawl.dev\",\r\n * timeout: 30000,\r\n * maxRetries: 3,\r\n * retryDelay: 1000,\r\n * onRateLimit: (info) => console.log(\"Rate limited!\", info)\r\n * });\r\n * ```\r\n */\r\n constructor(config: DealCrawlConfig) {\r\n if (!config.apiKey || !config.apiKey.trim()) {\r\n throw new Error(\"API key is required\");\r\n }\r\n\r\n // Build request context\r\n this.ctx = {\r\n apiKey: config.apiKey,\r\n baseUrl: config.baseUrl ?? DEFAULT_CONFIG.baseUrl,\r\n timeout: config.timeout ?? DEFAULT_CONFIG.timeout,\r\n maxRetries: config.maxRetries ?? DEFAULT_CONFIG.maxRetries,\r\n retryDelay: config.retryDelay ?? DEFAULT_CONFIG.retryDelay,\r\n onRateLimit: config.onRateLimit,\r\n };\r\n\r\n // Initialize resources\r\n this.scrape = new ScrapeResource(this.ctx);\r\n this.search = new SearchResource(this.ctx);\r\n this.crawl = new CrawlResource(this.ctx);\r\n this.extract = new ExtractResource(this.ctx);\r\n this.dork = new DorkResource(this.ctx);\r\n this.status = new StatusResource(this.ctx);\r\n this.data = new DataResource(this.ctx);\r\n this.webhooks = new WebhooksResource(this.ctx);\r\n this.keys = new KeysResource(this.ctx);\r\n this.account = new AccountResource(this.ctx);\r\n }\r\n\r\n // ============================================\r\n // POLLING METHODS\r\n // ============================================\r\n\r\n /**\r\n * Wait for a job to complete\r\n * Polls the status endpoint until the job finishes\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.scrape.create({ url: \"...\" });\r\n *\r\n * // Simple wait\r\n * const result = await client.waitForResult(job.jobId);\r\n *\r\n * // With options\r\n * const result = await client.waitForResult(job.jobId, {\r\n * pollInterval: 1000,\r\n * timeout: 60000,\r\n * onProgress: (status) => console.log(status.progress)\r\n * });\r\n * ```\r\n */\r\n async waitForResult<T = unknown>(\r\n jobId: string,\r\n options?: WaitOptions\r\n ): Promise<WaitResult<T>> {\r\n return waitForResult<T>(this.ctx, jobId, options);\r\n }\r\n\r\n /**\r\n * Wait for multiple jobs to complete\r\n * Returns when all jobs are done\r\n *\r\n * @example\r\n * ```ts\r\n * const jobs = await Promise.all([\r\n * client.scrape.create({ url: \"url1\" }),\r\n * client.scrape.create({ url: \"url2\" }),\r\n * ]);\r\n *\r\n * const results = await client.waitForAll(jobs.map(j => j.jobId));\r\n * ```\r\n */\r\n async waitForAll<T = unknown>(\r\n jobIds: string[],\r\n options?: WaitOptions\r\n ): Promise<WaitResult<T>[]> {\r\n return waitForAll<T>(this.ctx, jobIds, options);\r\n }\r\n\r\n /**\r\n * Wait for any job to complete\r\n * Returns as soon as one job finishes\r\n *\r\n * @example\r\n * ```ts\r\n * const jobIds = [\"job1\", \"job2\", \"job3\"];\r\n * const firstResult = await client.waitForAny(jobIds);\r\n * ```\r\n */\r\n async waitForAny<T = unknown>(\r\n jobIds: string[],\r\n options?: WaitOptions\r\n ): Promise<WaitResult<T>> {\r\n return waitForAny<T>(this.ctx, jobIds, options);\r\n }\r\n\r\n // ============================================\r\n // CONVENIENCE METHODS\r\n // ============================================\r\n\r\n /**\r\n * Scrape a URL and wait for result\r\n * Combines create and waitForResult\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.scrapeAndWait({\r\n * url: \"https://example.com\",\r\n * extractDeal: true\r\n * });\r\n * ```\r\n */\r\n async scrapeAndWait<T = unknown>(\r\n options: Parameters<ScrapeResource[\"create\"]>[0],\r\n waitOptions?: WaitOptions\r\n ): Promise<WaitResult<T>> {\r\n const job = await this.scrape.create(options);\r\n return this.waitForResult<T>(job.jobId, waitOptions);\r\n }\r\n\r\n /**\r\n * Crawl a URL and wait for result\r\n * Combines create and waitForResult\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.crawlAndWait({\r\n * url: \"https://shop.example.com\",\r\n * maxPages: 50\r\n * });\r\n * ```\r\n */\r\n async crawlAndWait<T = unknown>(\r\n options: Parameters<CrawlResource[\"create\"]>[0],\r\n waitOptions?: WaitOptions\r\n ): Promise<WaitResult<T>> {\r\n const job = await this.crawl.create(options);\r\n return this.waitForResult<T>(job.jobId, waitOptions);\r\n }\r\n\r\n /**\r\n * Extract data and wait for result\r\n * Combines create and waitForResult\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.extractAndWait({\r\n * url: \"https://example.com/product\",\r\n * schema: { type: \"object\", properties: {...} }\r\n * });\r\n * ```\r\n */\r\n async extractAndWait<T = unknown>(\r\n options: Parameters<ExtractResource[\"create\"]>[0],\r\n waitOptions?: WaitOptions\r\n ): Promise<WaitResult<T>> {\r\n const job = await this.extract.create(options);\r\n return this.waitForResult<T>(job.jobId, waitOptions);\r\n }\r\n\r\n /**\r\n * Search and return results directly\r\n * Note: Search is synchronous, no waiting needed\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.searchAndWait({\r\n * query: \"gaming laptop deals\",\r\n * useDealScoring: true\r\n * });\r\n * console.log(result.data.results);\r\n * ```\r\n */\r\n async searchAndWait(\r\n options: Parameters<SearchResource[\"create\"]>[0]\r\n ): Promise<ReturnType<SearchResource[\"create\"]>> {\r\n // Search is synchronous, returns results directly\r\n return this.search.create(options);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/types/config.ts","../src/error.ts","../src/utils/request.ts","../src/utils/polling.ts","../src/resources/account.ts","../src/resources/agent.ts","../src/resources/crawl.ts","../src/resources/data.ts","../src/resources/dork.ts","../src/resources/extract.ts","../src/resources/keys.ts","../src/resources/scrape.ts","../src/resources/search.ts","../src/resources/status.ts","../src/resources/webhooks.ts","../src/client.ts"],"names":["sleep"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { RateLimitInfo } from \"./shared\";\n\n/**\n * SDK Configuration options\n */\nexport interface DealCrawlConfig {\n /** API key for authentication (required) */\n apiKey: string;\n\n /** Base URL for the API (default: https://api.dealcrawl.dev) */\n baseUrl?: string;\n\n /** Default timeout for requests in milliseconds (default: 30000) */\n timeout?: number;\n\n /** Maximum number of retries for failed requests (default: 3) */\n maxRetries?: number;\n\n /** Delay between retries in milliseconds (default: 1000) */\n retryDelay?: number;\n\n /** Callback when rate limit is hit */\n onRateLimit?: (info: RateLimitInfo) => void;\n}\n\n/**\n * Internal request context passed to resources\n */\nexport interface RequestContext {\n /** Base URL for API requests */\n baseUrl: string;\n\n /** API key for authentication */\n apiKey: string;\n\n /** Default timeout in milliseconds */\n timeout: number;\n\n /** Maximum number of retries */\n maxRetries: number;\n\n /** Delay between retries in milliseconds */\n retryDelay: number;\n\n /** Rate limit callback */\n onRateLimit?: (info: RateLimitInfo) => void;\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG = {\n baseUrl: \"https://api.dealcrawl.dev\",\n timeout: 30000,\n maxRetries: 3,\n retryDelay: 1000,\n} as const;\n","/**\n * Error codes used by DealCrawl API\n * Copied from @dealcrawl/shared to avoid bundling the entire package\n */\nexport const ERROR_CODES = {\n // Authentication\n INVALID_API_KEY: \"INVALID_API_KEY\",\n MISSING_API_KEY: \"MISSING_API_KEY\",\n API_KEY_EXPIRED: \"API_KEY_EXPIRED\",\n ACCOUNT_SUSPENDED: \"ACCOUNT_SUSPENDED\",\n\n // Rate limiting\n RATE_LIMIT_EXCEEDED: \"RATE_LIMIT_EXCEEDED\",\n QUOTA_EXCEEDED: \"QUOTA_EXCEEDED\",\n\n // Validation\n INVALID_URL: \"INVALID_URL\",\n INVALID_REQUEST: \"INVALID_REQUEST\",\n MISSING_REQUIRED_FIELD: \"MISSING_REQUIRED_FIELD\",\n\n // Job errors\n JOB_NOT_FOUND: \"JOB_NOT_FOUND\",\n JOB_FAILED: \"JOB_FAILED\",\n JOB_TIMEOUT: \"JOB_TIMEOUT\",\n\n // Scraping errors\n FETCH_FAILED: \"FETCH_FAILED\",\n PARSE_FAILED: \"PARSE_FAILED\",\n BLOCKED_BY_ROBOTS: \"BLOCKED_BY_ROBOTS\",\n CAPTCHA_DETECTED: \"CAPTCHA_DETECTED\",\n SITE_UNREACHABLE: \"SITE_UNREACHABLE\",\n\n // System errors\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n SERVICE_UNAVAILABLE: \"SERVICE_UNAVAILABLE\",\n REDIS_ERROR: \"REDIS_ERROR\",\n DATABASE_ERROR: \"DATABASE_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n/**\n * Custom error class for DealCrawl SDK\n * Provides structured error handling with error codes\n */\nexport class DealCrawlError extends Error {\n /** Error code from ERROR_CODES */\n readonly code: ErrorCode;\n\n /** HTTP status code from the API response */\n readonly statusCode: number;\n\n /** Additional error details */\n readonly details?: Record<string, unknown>;\n\n /** Retry-After header value in seconds (for rate limiting) */\n readonly retryAfter?: number;\n\n constructor(options: {\n code: ErrorCode;\n message: string;\n statusCode?: number;\n details?: Record<string, unknown>;\n retryAfter?: number;\n }) {\n super(options.message);\n this.name = \"DealCrawlError\";\n this.code = options.code;\n this.statusCode = options.statusCode ?? 500;\n this.details = options.details;\n this.retryAfter = options.retryAfter;\n\n // Maintains proper stack trace for where our error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, DealCrawlError);\n }\n }\n\n /**\n * Check if the error is retryable\n * Rate limits and transient errors are retryable\n */\n isRetryable(): boolean {\n const retryableCodes: ErrorCode[] = [\n ERROR_CODES.RATE_LIMIT_EXCEEDED,\n ERROR_CODES.SERVICE_UNAVAILABLE,\n ERROR_CODES.REDIS_ERROR,\n ERROR_CODES.DATABASE_ERROR,\n ];\n return retryableCodes.includes(this.code);\n }\n\n /**\n * Check if the error is due to authentication issues\n */\n isAuthError(): boolean {\n const authCodes: ErrorCode[] = [\n ERROR_CODES.INVALID_API_KEY,\n ERROR_CODES.MISSING_API_KEY,\n ERROR_CODES.API_KEY_EXPIRED,\n ERROR_CODES.ACCOUNT_SUSPENDED,\n ];\n return authCodes.includes(this.code);\n }\n\n /**\n * Check if the error is due to rate limiting\n */\n isRateLimited(): boolean {\n return this.code === ERROR_CODES.RATE_LIMIT_EXCEEDED;\n }\n\n /**\n * Check if the error is due to quota exceeded\n */\n isQuotaExceeded(): boolean {\n return this.code === ERROR_CODES.QUOTA_EXCEEDED;\n }\n\n /**\n * Convert error to JSON-serializable object\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n statusCode: this.statusCode,\n details: this.details,\n retryAfter: this.retryAfter,\n };\n }\n\n /**\n * Create a DealCrawlError from an API error response\n */\n static fromResponse(\n statusCode: number,\n body: {\n code?: string;\n message?: string;\n error?: string;\n details?: Record<string, unknown>;\n retryAfter?: number;\n },\n retryAfter?: number | string | null\n ): DealCrawlError {\n const code =\n (body.code as ErrorCode) || mapStatusCodeToErrorCode(statusCode);\n const message = body.message || body.error || \"An error occurred\";\n\n // Parse retryAfter from parameter or body\n let parsedRetryAfter: number | undefined;\n if (retryAfter !== null && retryAfter !== undefined) {\n parsedRetryAfter =\n typeof retryAfter === \"string\" ? parseInt(retryAfter, 10) : retryAfter;\n if (isNaN(parsedRetryAfter)) {\n parsedRetryAfter = undefined;\n }\n } else if (body.retryAfter !== undefined) {\n parsedRetryAfter = body.retryAfter;\n }\n\n return new DealCrawlError({\n code,\n message,\n statusCode,\n details: body.details,\n retryAfter: parsedRetryAfter,\n });\n }\n}\n\n/**\n * Map HTTP status codes to error codes\n */\nfunction mapStatusCodeToErrorCode(statusCode: number): ErrorCode {\n switch (statusCode) {\n case 400:\n return ERROR_CODES.INVALID_REQUEST;\n case 401:\n return ERROR_CODES.INVALID_API_KEY;\n case 403:\n return ERROR_CODES.ACCOUNT_SUSPENDED;\n case 404:\n return ERROR_CODES.JOB_NOT_FOUND;\n case 429:\n return ERROR_CODES.RATE_LIMIT_EXCEEDED;\n case 500:\n return ERROR_CODES.INTERNAL_ERROR;\n case 503:\n return ERROR_CODES.SERVICE_UNAVAILABLE;\n default:\n return ERROR_CODES.INTERNAL_ERROR;\n }\n}\n","import type { RateLimitInfo } from \"../types/shared\";\nimport { DealCrawlError, ERROR_CODES } from \"../error\";\nimport type { RequestContext } from \"../types/config\";\n\n/**\n * Request options for the HTTP helper\n */\nexport interface RequestOptions {\n /** HTTP method */\n method?: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n\n /** Request body (will be JSON stringified) */\n body?: unknown;\n\n /** Query parameters */\n query?: Record<string, string | number | boolean | undefined>;\n\n /** Request timeout in milliseconds (overrides default) */\n timeout?: number;\n\n /** AbortSignal for request cancellation */\n signal?: AbortSignal;\n}\n\n/**\n * Response wrapper with rate limit info\n */\nexport interface RequestResult<T> {\n /** Response data */\n data: T;\n\n /** Rate limit information from headers */\n rateLimit: RateLimitInfo;\n}\n\n/**\n * Build query string from object\n */\nfunction buildQueryString(\n params: Record<string, string | number | boolean | undefined>\n): string {\n const entries = Object.entries(params)\n .filter(([, value]) => value !== undefined)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`\n );\n\n return entries.length > 0 ? `?${entries.join(\"&\")}` : \"\";\n}\n\n/**\n * Parse rate limit headers from response\n */\nfunction parseRateLimitHeaders(headers: Headers): RateLimitInfo {\n return {\n limit: parseInt(headers.get(\"X-RateLimit-Limit\") || \"0\", 10) || 0,\n remaining: parseInt(headers.get(\"X-RateLimit-Remaining\") || \"0\", 10) || 0,\n reset: parseInt(headers.get(\"X-RateLimit-Reset\") || \"0\", 10) || 0,\n };\n}\n\n/**\n * Sleep helper for retries\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Make an HTTP request with authentication, error handling, and retries\n */\nexport async function request<T>(\n ctx: RequestContext,\n path: string,\n options: RequestOptions = {}\n): Promise<RequestResult<T>> {\n const { method = \"GET\", body, query, timeout, signal } = options;\n\n // Build URL with query string\n const queryString = query ? buildQueryString(query) : \"\";\n const url = `${ctx.baseUrl}${path}${queryString}`;\n\n const timeoutMs = timeout ?? ctx.timeout;\n\n // Track current controller for external signal handling\n let currentController: AbortController | null = null;\n\n // Named handler for external abort signal\n const onAbort = () => {\n if (currentController) {\n currentController.abort();\n }\n };\n\n // Attach external signal listener once (if provided)\n if (signal) {\n signal.addEventListener(\"abort\", onAbort);\n }\n\n // Cleanup external signal listener (called at end of all retries)\n const cleanupExternalSignal = () => {\n if (signal) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n };\n\n let lastError: DealCrawlError | null = null;\n let attempt = 0;\n\n while (attempt <= ctx.maxRetries) {\n // Create a new AbortController and timeout for each attempt\n const controller = new AbortController();\n currentController = controller;\n\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n // Cleanup function for this specific attempt - idempotent\n let attemptCleanupDone = false;\n const cleanupAttempt = () => {\n if (attemptCleanupDone) return;\n attemptCleanupDone = true;\n clearTimeout(timeoutId);\n currentController = null;\n };\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${ctx.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n cleanupAttempt();\n\n // Parse rate limit headers\n const rateLimit = parseRateLimitHeaders(response.headers);\n\n // Handle rate limiting\n if (response.status === 429) {\n const retryAfter = parseInt(\n response.headers.get(\"Retry-After\") || \"60\",\n 10\n );\n\n // Notify callback\n if (ctx.onRateLimit) {\n ctx.onRateLimit(rateLimit);\n }\n\n throw new DealCrawlError({\n code: ERROR_CODES.RATE_LIMIT_EXCEEDED,\n message: \"Rate limit exceeded\",\n statusCode: 429,\n retryAfter,\n details: { rateLimit },\n });\n }\n\n // Handle errors\n if (!response.ok) {\n let errorBody: Record<string, unknown> = {};\n try {\n errorBody = (await response.json()) as Record<string, unknown>;\n } catch {\n // Response might not be JSON\n }\n\n // Extract Retry-After header if present\n const retryAfterHeader = response.headers.get(\"Retry-After\");\n\n throw DealCrawlError.fromResponse(\n response.status,\n errorBody,\n retryAfterHeader\n );\n }\n\n // Parse response\n let data: T;\n const contentType = response.headers.get(\"Content-Type\") || \"\";\n\n if (contentType.includes(\"application/json\")) {\n data = (await response.json()) as T;\n } else if (\n contentType.includes(\"text/csv\") ||\n contentType.includes(\"text/plain\")\n ) {\n data = (await response.text()) as unknown as T;\n } else {\n data = (await response.json()) as T;\n }\n\n cleanupExternalSignal();\n return { data, rateLimit };\n } catch (error) {\n cleanupAttempt();\n\n // Handle abort/timeout\n if (error instanceof Error && error.name === \"AbortError\") {\n cleanupExternalSignal();\n throw new DealCrawlError({\n code: ERROR_CODES.JOB_TIMEOUT,\n message: `Request timeout after ${timeoutMs}ms`,\n statusCode: 408,\n });\n }\n\n // Handle DealCrawlError\n if (error instanceof DealCrawlError) {\n lastError = error;\n\n // Retry if error is retryable and we have attempts left\n if (error.isRetryable() && attempt < ctx.maxRetries) {\n attempt++;\n await sleep(ctx.retryDelay * attempt); // Exponential backoff\n continue;\n }\n\n cleanupExternalSignal();\n throw error;\n }\n\n // Handle network errors\n cleanupExternalSignal();\n throw new DealCrawlError({\n code: ERROR_CODES.FETCH_FAILED,\n message:\n error instanceof Error ? error.message : \"Network request failed\",\n statusCode: 0,\n });\n }\n }\n\n // Should not reach here, but throw last error if we do\n cleanupExternalSignal();\n throw (\n lastError ??\n new DealCrawlError({\n code: ERROR_CODES.INTERNAL_ERROR,\n message: \"Request failed after retries\",\n statusCode: 500,\n })\n );\n}\n\n/**\n * Convenience method for GET requests\n */\nexport function get<T>(\n ctx: RequestContext,\n path: string,\n query?: Record<string, string | number | boolean | undefined>\n): Promise<RequestResult<T>> {\n return request<T>(ctx, path, { method: \"GET\", query });\n}\n\n/**\n * Convenience method for POST requests\n */\nexport function post<T>(\n ctx: RequestContext,\n path: string,\n body?: unknown\n): Promise<RequestResult<T>> {\n return request<T>(ctx, path, { method: \"POST\", body });\n}\n\n/**\n * Convenience method for PATCH requests\n */\nexport function patch<T>(\n ctx: RequestContext,\n path: string,\n body?: unknown\n): Promise<RequestResult<T>> {\n return request<T>(ctx, path, { method: \"PATCH\", body });\n}\n\n/**\n * Convenience method for DELETE requests\n */\nexport function del<T>(\n ctx: RequestContext,\n path: string,\n body?: unknown\n): Promise<RequestResult<T>> {\n return request<T>(ctx, path, { method: \"DELETE\", body });\n}\n","/**\r\n * Polling Utilities\r\n * Helpers for waiting on async job completion\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type { JobStatusResponse } from \"../types/responses\";\r\nimport { DealCrawlError, ERROR_CODES } from \"../error\";\r\nimport { get } from \"./request\";\r\n\r\n/** Options for waiting on a job */\r\nexport interface WaitOptions {\r\n /** Polling interval in milliseconds (default: 2000) */\r\n pollInterval?: number;\r\n /** Maximum time to wait in milliseconds (default: 300000 = 5 minutes) */\r\n timeout?: number;\r\n /** Callback on each poll */\r\n onProgress?: (status: JobStatusResponse) => void;\r\n /** Callback on status change */\r\n onStatusChange?: (newStatus: string, oldStatus: string) => void;\r\n /** AbortSignal for cancellation */\r\n signal?: AbortSignal;\r\n}\r\n\r\n/** Result of waiting for a job */\r\nexport interface WaitResult<T = unknown> {\r\n /** Job ID */\r\n jobId: string;\r\n /** Final status */\r\n status: \"completed\" | \"failed\";\r\n /** Result data (if completed) */\r\n result?: T;\r\n /** Error message (if failed) */\r\n error?: string;\r\n /** Total time waited in ms */\r\n waitTime: number;\r\n}\r\n\r\n/**\r\n * Wait for a job to complete\r\n * Polls the status endpoint until the job is done\r\n */\r\nexport async function waitForResult<T = unknown>(\r\n ctx: RequestContext,\r\n jobId: string,\r\n options: WaitOptions = {}\r\n): Promise<WaitResult<T>> {\r\n const {\r\n pollInterval = 2000,\r\n timeout = 300000, // 5 minutes\r\n onProgress,\r\n onStatusChange,\r\n signal,\r\n } = options;\r\n\r\n const startTime = Date.now();\r\n let lastStatus: string | null = null;\r\n\r\n while (true) {\r\n // Check for abort\r\n if (signal?.aborted) {\r\n throw new DealCrawlError({\r\n code: ERROR_CODES.JOB_TIMEOUT,\r\n message: \"Wait cancelled by user\",\r\n statusCode: 0,\r\n });\r\n }\r\n\r\n // Check timeout\r\n const elapsed = Date.now() - startTime;\r\n if (elapsed >= timeout) {\r\n throw new DealCrawlError({\r\n code: ERROR_CODES.JOB_TIMEOUT,\r\n message: `Job did not complete within ${timeout}ms`,\r\n statusCode: 408,\r\n details: { jobId, elapsed },\r\n });\r\n }\r\n\r\n // Fetch status\r\n const { data: status } = await get<JobStatusResponse>(\r\n ctx,\r\n `/v1/status/${jobId}`\r\n );\r\n\r\n // Call progress callback\r\n if (onProgress) {\r\n onProgress(status);\r\n }\r\n\r\n // Call status change callback\r\n if (onStatusChange && lastStatus !== null && lastStatus !== status.status) {\r\n onStatusChange(status.status, lastStatus);\r\n }\r\n lastStatus = status.status;\r\n\r\n // Check if done\r\n if (status.status === \"completed\") {\r\n return {\r\n jobId,\r\n status: \"completed\",\r\n result: status.result as T,\r\n waitTime: Date.now() - startTime,\r\n };\r\n }\r\n\r\n if (status.status === \"failed\") {\r\n return {\r\n jobId,\r\n status: \"failed\",\r\n error: status.error,\r\n waitTime: Date.now() - startTime,\r\n };\r\n }\r\n\r\n // Wait before next poll\r\n await sleep(pollInterval);\r\n }\r\n}\r\n\r\n/**\r\n * Wait for multiple jobs to complete\r\n * Returns when all jobs are done (either completed or failed)\r\n */\r\nexport async function waitForAll<T = unknown>(\r\n ctx: RequestContext,\r\n jobIds: string[],\r\n options: WaitOptions = {}\r\n): Promise<WaitResult<T>[]> {\r\n const promises = jobIds.map((jobId) => waitForResult<T>(ctx, jobId, options));\r\n return Promise.all(promises);\r\n}\r\n\r\n/**\r\n * Wait for any job to complete\r\n * Returns as soon as one job finishes\r\n */\r\nexport async function waitForAny<T = unknown>(\r\n ctx: RequestContext,\r\n jobIds: string[],\r\n options: WaitOptions = {}\r\n): Promise<WaitResult<T>> {\r\n const promises = jobIds.map((jobId) => waitForResult<T>(ctx, jobId, options));\r\n return Promise.race(promises);\r\n}\r\n\r\n/**\r\n * Poll with custom condition\r\n * Generic polling utility\r\n */\r\nexport async function pollUntil<T>(\r\n fetchFn: () => Promise<T>,\r\n conditionFn: (data: T) => boolean,\r\n options: {\r\n pollInterval?: number;\r\n timeout?: number;\r\n signal?: AbortSignal;\r\n } = {}\r\n): Promise<T> {\r\n const { pollInterval = 2000, timeout = 300000, signal } = options;\r\n const startTime = Date.now();\r\n\r\n while (true) {\r\n if (signal?.aborted) {\r\n throw new Error(\"Polling cancelled\");\r\n }\r\n\r\n if (Date.now() - startTime >= timeout) {\r\n throw new Error(`Polling timeout after ${timeout}ms`);\r\n }\r\n\r\n const data = await fetchFn();\r\n\r\n if (conditionFn(data)) {\r\n return data;\r\n }\r\n\r\n await sleep(pollInterval);\r\n }\r\n}\r\n\r\n/**\r\n * Sleep helper\r\n */\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n","/**\r\n * Account Resource\r\n * Handles account information and preferences\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type { UpdatePreferencesOptions } from \"../types/options\";\r\nimport type {\r\n AccountInfoResponse,\r\n AccountMetricsResponse,\r\n DealUpMetricsResponse,\r\n RecommendationsResponse,\r\n PreferencesResponse,\r\n UpdatePreferencesResponse,\r\n} from \"../types/responses\";\r\nimport { get, patch, post } from \"../utils/request\";\r\n\r\n/**\r\n * Account resource class\r\n * Provides methods for account information and preferences\r\n */\r\nexport class AccountResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * Get current account information\r\n *\r\n * @example\r\n * ```ts\r\n * const account = await client.account.get();\r\n * console.log(account.name);\r\n * console.log(account.tier);\r\n * console.log(account.usage);\r\n * ```\r\n */\r\n async get(): Promise<AccountInfoResponse> {\r\n const result = await get<AccountInfoResponse>(this.ctx, \"/v1/client\");\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get detailed account metrics\r\n *\r\n * @example\r\n * ```ts\r\n * const metrics = await client.account.getMetrics();\r\n * console.log(metrics.dealMetrics.totalDeals);\r\n * console.log(metrics.categoryPerformance);\r\n * ```\r\n */\r\n async getMetrics(): Promise<AccountMetricsResponse> {\r\n const result = await get<AccountMetricsResponse>(\r\n this.ctx,\r\n \"/v1/client/metrics\"\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get DealUp sync metrics (pro/enterprise only)\r\n *\r\n * @example\r\n * ```ts\r\n * const dealup = await client.account.getDealUpMetrics();\r\n * console.log(dealup.sync.totalSynced);\r\n * console.log(dealup.sync.clicksGenerated);\r\n * ```\r\n */\r\n async getDealUpMetrics(): Promise<DealUpMetricsResponse> {\r\n const result = await get<DealUpMetricsResponse>(\r\n this.ctx,\r\n \"/v1/client/dealup\"\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get crawl recommendations\r\n * AI-suggested URLs to crawl based on past performance\r\n *\r\n * @example\r\n * ```ts\r\n * const recommendations = await client.account.getRecommendations();\r\n * recommendations.recommendations.forEach(r => {\r\n * console.log(r.url, r.reason, r.estimatedDeals);\r\n * });\r\n * ```\r\n */\r\n async getRecommendations(): Promise<RecommendationsResponse> {\r\n const result = await get<RecommendationsResponse>(\r\n this.ctx,\r\n \"/v1/client/recommendations\"\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get current preferences\r\n *\r\n * @example\r\n * ```ts\r\n * const prefs = await client.account.getPreferences();\r\n * console.log(prefs.preferences.minDealScore);\r\n * console.log(prefs.preferences.autoSync);\r\n * ```\r\n */\r\n async getPreferences(): Promise<PreferencesResponse> {\r\n const result = await get<PreferencesResponse>(\r\n this.ctx,\r\n \"/v1/client/preferences\"\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Update account preferences\r\n *\r\n * @example\r\n * ```ts\r\n * const updated = await client.account.updatePreferences({\r\n * minDealScore: 70,\r\n * autoSync: true,\r\n * preferredCategories: [\"software\", \"courses\"]\r\n * });\r\n * ```\r\n */\r\n async updatePreferences(\r\n options: UpdatePreferencesOptions\r\n ): Promise<UpdatePreferencesResponse> {\r\n const result = await patch<UpdatePreferencesResponse>(\r\n this.ctx,\r\n \"/v1/client/preferences\",\r\n {\r\n preferredCategories: options.preferredCategories,\r\n minDealScore: options.minDealScore,\r\n autoSync: options.autoSync,\r\n webhookEnabled: options.webhookEnabled,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Track a DealUp click (webhook endpoint)\r\n * Used internally by DealUp to track click-through\r\n *\r\n * @example\r\n * ```ts\r\n * await client.account.trackClick(\"deal_abc123\", \"homepage\");\r\n * ```\r\n */\r\n async trackClick(\r\n dealId: string,\r\n source?: string\r\n ): Promise<{ success: boolean }> {\r\n const result = await post<{ success: boolean; tracked: boolean }>(\r\n this.ctx,\r\n \"/v1/client/dealup/click\",\r\n {\r\n dealId,\r\n source,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n // ============================================\r\n // CONVENIENCE METHODS\r\n // ============================================\r\n\r\n /**\r\n * Get remaining quota for a resource\r\n *\r\n * @example\r\n * ```ts\r\n * const remaining = await client.account.getRemainingQuota(\"scrapes\");\r\n * console.log(`${remaining} scrapes left this period`);\r\n * ```\r\n */\r\n async getRemainingQuota(\r\n resource: \"scrapes\" | \"crawls\" | \"dorks\"\r\n ): Promise<number> {\r\n const account = await this.get();\r\n const usage = account.usage[resource];\r\n return usage.limit - usage.used;\r\n }\r\n\r\n /**\r\n * Check if account has quota for a resource\r\n *\r\n * @example\r\n * ```ts\r\n * if (await client.account.hasQuota(\"crawls\", 5)) {\r\n * // Safe to start 5 crawls\r\n * }\r\n * ```\r\n */\r\n async hasQuota(\r\n resource: \"scrapes\" | \"crawls\" | \"dorks\",\r\n needed: number = 1\r\n ): Promise<boolean> {\r\n const remaining = await this.getRemainingQuota(resource);\r\n return remaining >= needed;\r\n }\r\n\r\n /**\r\n * Get account tier\r\n *\r\n * @example\r\n * ```ts\r\n * const tier = await client.account.getTier();\r\n * if (tier === \"enterprise\") {\r\n * // Enable advanced features\r\n * }\r\n * ```\r\n */\r\n async getTier(): Promise<\"free\" | \"pro\" | \"enterprise\"> {\r\n const account = await this.get();\r\n return account.tier;\r\n }\r\n\r\n /**\r\n * Check if account is pro or enterprise tier\r\n *\r\n * @example\r\n * ```ts\r\n * if (await client.account.isPremium()) {\r\n * // Show premium features\r\n * }\r\n * ```\r\n */\r\n async isPremium(): Promise<boolean> {\r\n const tier = await this.getTier();\r\n return tier === \"pro\" || tier === \"enterprise\";\r\n }\r\n}\r\n","/**\n * Agent Resource\n * Handles AI agent operations for autonomous web navigation and data extraction\n */\n\nimport type { RequestContext } from \"../types/config\";\nimport type { AgentOptions, SchemaGenerationOptions } from \"../types/options\";\nimport type {\n AgentJobResponse,\n AgentStatusResponse,\n AgentResultResponse,\n SchemaGenerationResponse,\n} from \"../types/responses\";\nimport { get, post } from \"../utils/request\";\n\n/**\n * Agent resource class\n * Provides methods for creating and managing AI agent jobs\n *\n * The agent uses the ReAct pattern (Observation → Thought → Action → Evaluation)\n * to navigate web pages and extract structured data based on natural language instructions.\n *\n * @example\n * ```ts\n * // Create an agent to search and extract product info\n * const job = await client.agent.create({\n * url: \"https://amazon.com\",\n * prompt: \"Search for wireless headphones under $50 and extract the top 5 results with name, price, and rating\",\n * schema: {\n * type: \"object\",\n * properties: {\n * products: {\n * type: \"array\",\n * items: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * price: { type: \"number\" },\n * rating: { type: \"number\" }\n * }\n * }\n * }\n * }\n * },\n * maxSteps: 15\n * });\n *\n * // Wait for result\n * const result = await client.waitForResult(job.jobId);\n * ```\n */\nexport class AgentResource {\n constructor(private ctx: RequestContext) {}\n\n /**\n * Create a new AI agent job\n *\n * @param options - Agent configuration options\n * @returns Job creation response with jobId and status URL\n *\n * @example\n * ```ts\n * const job = await client.agent.create({\n * url: \"https://booking.com\",\n * prompt: \"Find hotels in Paris for 2 adults, March 15-17, sort by price and extract the 3 cheapest options\",\n * maxSteps: 20,\n * takeScreenshots: true\n * });\n * ```\n */\n async create(options: AgentOptions): Promise<AgentJobResponse> {\n const body = {\n url: options.url,\n urls: options.urls,\n prompt: options.prompt,\n schema: options.schema,\n maxSteps: options.maxSteps ?? 10,\n actions: options.actions,\n model: options.model ?? \"openai\",\n timeout: options.timeout ?? 30000,\n onlyMainContent: options.onlyMainContent ?? true,\n takeScreenshots: options.takeScreenshots ?? false,\n headers: options.headers,\n webhook: options.webhook,\n };\n\n const result = await post<AgentJobResponse>(this.ctx, \"/v1/agent\", body);\n return result.data;\n }\n\n /**\n * Get the status of an agent job\n *\n * @param jobId - The job ID to check\n * @returns Agent status with progress and partial results\n *\n * @example\n * ```ts\n * const status = await client.agent.getStatus(jobId);\n * console.log(`Step ${status.partialResult?.steps.length}/${status.totalSteps}`);\n * ```\n */\n async getStatus(jobId: string): Promise<AgentStatusResponse> {\n const result = await get<AgentStatusResponse>(\n this.ctx,\n `/v1/status/${jobId}`\n );\n return result.data;\n }\n\n /**\n * Create an agent with preset actions\n * Useful for handling common scenarios like cookie consent, popups, etc.\n *\n * @example\n * ```ts\n * const job = await client.agent.withPresetActions(\n * \"https://shop.com\",\n * \"Find the best discount and extract product details\",\n * [\n * { type: \"click\", selector: \"#accept-cookies\" },\n * { type: \"wait\", milliseconds: 1000 }\n * ]\n * );\n * ```\n */\n async withPresetActions(\n url: string,\n prompt: string,\n actions: AgentOptions[\"actions\"],\n options?: Omit<AgentOptions, \"url\" | \"prompt\" | \"actions\">\n ): Promise<AgentJobResponse> {\n return this.create({\n url,\n prompt,\n actions,\n ...options,\n });\n }\n\n /**\n * Create an agent with a JSON schema for structured output\n * The agent will extract data matching the provided schema\n *\n * @example\n * ```ts\n * const job = await client.agent.withSchema(\n * \"https://linkedin.com/company/example\",\n * \"Extract company information\",\n * {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * employees: { type: \"number\" },\n * description: { type: \"string\" },\n * website: { type: \"string\" }\n * },\n * required: [\"name\"]\n * }\n * );\n * ```\n */\n async withSchema(\n url: string,\n prompt: string,\n schema: Record<string, unknown>,\n options?: Omit<AgentOptions, \"url\" | \"prompt\" | \"schema\">\n ): Promise<AgentJobResponse> {\n return this.create({\n url,\n prompt,\n schema,\n ...options,\n });\n }\n\n /**\n * Create an agent optimized for deal/product extraction\n * Pre-configured for e-commerce scenarios\n *\n * @example\n * ```ts\n * const job = await client.agent.forDeals(\n * \"https://slickdeals.net\",\n * \"Find the top 10 tech deals posted today\"\n * );\n * ```\n */\n async forDeals(\n url: string,\n prompt: string,\n options?: Omit<AgentOptions, \"url\" | \"prompt\" | \"schema\">\n ): Promise<AgentJobResponse> {\n return this.create({\n url,\n prompt: `${prompt}. Extract deal information including: product name, current price, original price (if available), discount percentage, merchant/store, and any promo codes or coupons.`,\n schema: {\n type: \"object\",\n properties: {\n deals: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n productName: { type: \"string\" },\n currentPrice: { type: \"number\" },\n originalPrice: { type: \"number\" },\n discountPercent: { type: \"number\" },\n merchant: { type: \"string\" },\n promoCode: { type: \"string\" },\n url: { type: \"string\" },\n expiresAt: { type: \"string\" },\n },\n required: [\"productName\", \"currentPrice\"],\n },\n },\n },\n required: [\"deals\"],\n },\n maxSteps: options?.maxSteps ?? 15,\n ...options,\n });\n }\n\n /**\n * Create an agent to fill and submit a form\n * Useful for search forms, login forms, etc.\n *\n * @example\n * ```ts\n * const job = await client.agent.fillForm(\n * \"https://kayak.com\",\n * \"Search for flights from Paris to New York on March 20, return March 27\",\n * { takeScreenshots: true }\n * );\n * ```\n */\n async fillForm(\n url: string,\n instructions: string,\n options?: Omit<AgentOptions, \"url\" | \"prompt\">\n ): Promise<AgentJobResponse> {\n return this.create({\n url,\n prompt: `Navigate to the form and ${instructions}. After submitting, extract the results.`,\n maxSteps: options?.maxSteps ?? 12,\n ...options,\n });\n }\n\n /**\n * Create an agent using Claude (Anthropic) instead of GPT\n *\n * @example\n * ```ts\n * const job = await client.agent.withClaude(\n * \"https://complex-site.com\",\n * \"Navigate through the multi-step checkout process\"\n * );\n * ```\n */\n async withClaude(\n url: string,\n prompt: string,\n options?: Omit<AgentOptions, \"url\" | \"prompt\" | \"model\">\n ): Promise<AgentJobResponse> {\n return this.create({\n url,\n prompt,\n model: \"anthropic\",\n ...options,\n });\n }\n\n /**\n * Generate a JSON Schema from a natural language prompt\n *\n * This is useful for building extraction schemas without manual JSON writing.\n * The generated schema can be used with the main agent.create() method.\n *\n * @param options - Schema generation options\n * @returns Generated schema with refined prompt and confidence score\n *\n * @example Basic usage:\n * ```ts\n * const result = await client.agent.generateSchema({\n * prompt: \"Find the best student deals on Coursera for marketing courses\"\n * });\n *\n * console.log(result.schema);\n * // { type: \"object\", properties: { courses: { ... } } }\n *\n * console.log(result.refinedPrompt);\n * // \"Extract student offers for marketing courses...\"\n *\n * // Use the generated schema with an agent\n * const job = await client.agent.create({\n * url: \"https://coursera.org\",\n * prompt: result.refinedPrompt,\n * schema: result.schema\n * });\n * ```\n *\n * @example With context from conversation:\n * ```ts\n * const result = await client.agent.generateSchema({\n * prompt: \"Find student deals on online courses\",\n * context: {\n * domains: [\"marketing\", \"web development\"],\n * dataTypes: [\"free courses\", \"discounts\"],\n * format: \"json\"\n * }\n * });\n *\n * if (result.confidence < 0.7 && result.suggestedQuestions) {\n * // Ask user for clarification\n * console.log(\"Please clarify:\", result.suggestedQuestions);\n * }\n * ```\n */\n async generateSchema(\n options: SchemaGenerationOptions\n ): Promise<SchemaGenerationResponse> {\n const body = {\n prompt: options.prompt,\n context: options.context,\n model: options.model ?? \"openai\",\n };\n\n const result = await post<SchemaGenerationResponse>(\n this.ctx,\n \"/v1/agent/schema\",\n body\n );\n return result.data;\n }\n}\n","/**\r\n * Crawl Resource\r\n * Handles website crawling operations\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type {\r\n CrawlOptions,\r\n CrawlTemplate,\r\n CrawlTemplateId,\r\n} from \"../types/options\";\r\nimport type {\r\n CrawlAnalysisResponse,\r\n CrawlJobResponse,\r\n} from \"../types/responses\";\r\nimport { get, post } from \"../utils/request\";\r\n\r\n/**\r\n * Predefined crawl templates with optimized settings\r\n */\r\nconst CRAWL_TEMPLATES: Record<CrawlTemplateId, CrawlTemplate> = {\r\n ecommerce: {\r\n id: \"ecommerce\",\r\n name: \"E-commerce\",\r\n description: \"Optimized for product pages and online stores\",\r\n defaultOptions: {\r\n maxDepth: 3,\r\n maxPages: 500,\r\n delayMs: 1500,\r\n extractDeal: true,\r\n prioritizeDealPages: true,\r\n excludePatterns: [\r\n \"*/cart*\",\r\n \"*/checkout*\",\r\n \"*/account*\",\r\n \"*/login*\",\r\n \"*/register*\",\r\n \"*/wishlist*\",\r\n \"*/compare*\",\r\n ],\r\n },\r\n },\r\n blog: {\r\n id: \"blog\",\r\n name: \"Blog\",\r\n description: \"Optimized for blog posts and articles\",\r\n defaultOptions: {\r\n maxDepth: 2,\r\n maxPages: 200,\r\n delayMs: 1000,\r\n extractDeal: false,\r\n prioritizeDealPages: false,\r\n excludePatterns: [\"*/tag/*\", \"*/category/*\", \"*/author/*\", \"*/page/*\"],\r\n },\r\n },\r\n docs: {\r\n id: \"docs\",\r\n name: \"Documentation\",\r\n description: \"Optimized for documentation sites\",\r\n defaultOptions: {\r\n maxDepth: 4,\r\n maxPages: 300,\r\n delayMs: 500,\r\n extractDeal: false,\r\n prioritizeDealPages: false,\r\n },\r\n },\r\n marketplace: {\r\n id: \"marketplace\",\r\n name: \"Marketplace\",\r\n description: \"Optimized for multi-vendor marketplaces\",\r\n defaultOptions: {\r\n maxDepth: 3,\r\n maxPages: 1000,\r\n delayMs: 2000,\r\n extractDeal: true,\r\n prioritizeDealPages: true,\r\n followExternalLinks: false,\r\n excludePatterns: [\r\n \"*/seller/*\",\r\n \"*/vendor/*\",\r\n \"*/shop/*\",\r\n \"*/reviews*\",\r\n \"*/questions*\",\r\n ],\r\n },\r\n },\r\n custom: {\r\n id: \"custom\",\r\n name: \"Custom\",\r\n description: \"No preset - use your own settings\",\r\n defaultOptions: {},\r\n },\r\n};\r\n\r\n/**\r\n * Crawl resource class\r\n * Provides methods for website crawling\r\n */\r\nexport class CrawlResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * Create a new crawl job\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.crawl.create({\r\n * url: \"https://example.com\",\r\n * maxDepth: 3,\r\n * maxPages: 100,\r\n * extractDeal: true\r\n * });\r\n * console.log(job.jobId);\r\n * ```\r\n */\r\n async create(options: CrawlOptions): Promise<CrawlJobResponse> {\r\n const body = {\r\n startUrl: options.url || options.startUrl,\r\n url: options.url || options.startUrl,\r\n prompt: options.prompt,\r\n maxDepth: options.maxDepth,\r\n maxPages: options.maxPages,\r\n delayMs: options.delayMs,\r\n detectSignals: options.detectSignals,\r\n extractWithAI: options.extractWithAI,\r\n extractDeal: options.extractDeal,\r\n minDealScore: options.minDealScore,\r\n prioritizeDealPages: options.prioritizeDealPages,\r\n followExternalLinks: options.followExternalLinks,\r\n allowedDomains: options.allowedDomains,\r\n excludePatterns: options.excludePatterns,\r\n };\r\n\r\n const result = await post<CrawlJobResponse>(this.ctx, \"/v1/crawl\", body);\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Create a crawl job using a template\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.crawl.withTemplate(\"ecommerce\", {\r\n * url: \"https://shop.example.com\",\r\n * maxPages: 200 // Override template default\r\n * });\r\n * ```\r\n */\r\n async withTemplate(\r\n templateId: CrawlTemplateId,\r\n options: CrawlOptions\r\n ): Promise<CrawlJobResponse> {\r\n const template = CRAWL_TEMPLATES[templateId];\r\n\r\n if (!template) {\r\n throw new Error(\r\n `Invalid crawl templateId: ${templateId}. Available templates: ${Object.keys(CRAWL_TEMPLATES).join(\", \")}`\r\n );\r\n }\r\n\r\n return this.create({\r\n ...template.defaultOptions,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * List available crawl templates\r\n *\r\n * @example\r\n * ```ts\r\n * const templates = client.crawl.listTemplates();\r\n * templates.forEach(t => console.log(t.name, t.description));\r\n * ```\r\n */\r\n listTemplates(): CrawlTemplate[] {\r\n return Object.values(CRAWL_TEMPLATES);\r\n }\r\n\r\n /**\r\n * Get a specific template by ID\r\n *\r\n * @example\r\n * ```ts\r\n * const template = client.crawl.getTemplate(\"ecommerce\");\r\n * console.log(template.defaultOptions);\r\n * ```\r\n */\r\n getTemplate(templateId: CrawlTemplateId): CrawlTemplate | undefined {\r\n return CRAWL_TEMPLATES[templateId];\r\n }\r\n\r\n /**\r\n * Analyze a URL before crawling\r\n * Returns recommended settings based on site structure\r\n *\r\n * @example\r\n * ```ts\r\n * const analysis = await client.crawl.analyze(\"https://shop.example.com\");\r\n * console.log(analysis.recommendedTemplate);\r\n * console.log(analysis.estimatedPages);\r\n * ```\r\n */\r\n async analyze(url: string): Promise<CrawlAnalysisResponse> {\r\n const result = await get<CrawlAnalysisResponse>(\r\n this.ctx,\r\n \"/v1/crawl/analyze\",\r\n {\r\n url,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Crawl a URL with deal extraction enabled\r\n * Convenience method for e-commerce crawling\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.crawl.forDeals(\"https://shop.example.com\", {\r\n * minDealScore: 70\r\n * });\r\n * ```\r\n */\r\n async forDeals(\r\n url: string,\r\n options?: Omit<CrawlOptions, \"url\" | \"extractDeal\" | \"prioritizeDealPages\">\r\n ): Promise<CrawlJobResponse> {\r\n return this.withTemplate(\"ecommerce\", {\r\n url,\r\n extractDeal: true,\r\n prioritizeDealPages: true,\r\n ...options,\r\n });\r\n }\r\n}\r\n","/**\r\n * Data Resource\r\n * Handles data retrieval, listing, and export operations\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type {\r\n ExportDealsOptions,\r\n ExportJobsOptions,\r\n ListDealsOptions,\r\n ListJobsOptions,\r\n} from \"../types/options\";\r\nimport type {\r\n ClientStatsResponse,\r\n DealDetails,\r\n ListDealsResponse,\r\n ListJobsResponse,\r\n} from \"../types/responses\";\r\nimport { get } from \"../utils/request\";\r\n\r\n/**\r\n * Data resource class\r\n * Provides methods for accessing job and deal data\r\n */\r\nexport class DataResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n // ============================================\r\n // JOBS\r\n // ============================================\r\n\r\n /**\r\n * List all jobs\r\n *\r\n * @example\r\n * ```ts\r\n * const jobs = await client.data.listJobs({\r\n * status: \"completed\",\r\n * type: \"crawl\",\r\n * page: 1,\r\n * limit: 20\r\n * });\r\n * console.log(jobs.data);\r\n * console.log(jobs.pagination.total);\r\n * ```\r\n */\r\n async listJobs(options: ListJobsOptions = {}): Promise<ListJobsResponse> {\r\n const result = await get<ListJobsResponse>(this.ctx, \"/v1/data/jobs\", {\r\n page: options.page,\r\n limit: options.limit,\r\n status: options.status,\r\n type: options.type,\r\n sortBy: options.sortBy,\r\n sortOrder: options.sortOrder,\r\n fromDate: options.fromDate,\r\n toDate: options.toDate,\r\n });\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get jobs by status\r\n * Convenience method for filtering by status\r\n *\r\n * @example\r\n * ```ts\r\n * const activeJobs = await client.data.getJobsByStatus(\"active\");\r\n * ```\r\n */\r\n async getJobsByStatus(\r\n status: ListJobsOptions[\"status\"],\r\n options?: Omit<ListJobsOptions, \"status\">\r\n ): Promise<ListJobsResponse> {\r\n return this.listJobs({ status, ...options });\r\n }\r\n\r\n /**\r\n * Get jobs by type\r\n * Convenience method for filtering by type\r\n *\r\n * @example\r\n * ```ts\r\n * const crawlJobs = await client.data.getJobsByType(\"crawl\");\r\n * ```\r\n */\r\n async getJobsByType(\r\n type: ListJobsOptions[\"type\"],\r\n options?: Omit<ListJobsOptions, \"type\">\r\n ): Promise<ListJobsResponse> {\r\n return this.listJobs({ type, ...options });\r\n }\r\n\r\n /**\r\n * Get recent jobs\r\n * Convenience method for getting latest jobs\r\n *\r\n * @example\r\n * ```ts\r\n * const recentJobs = await client.data.getRecentJobs(10);\r\n * ```\r\n */\r\n async getRecentJobs(limit: number = 10): Promise<ListJobsResponse> {\r\n return this.listJobs({\r\n limit,\r\n sortBy: \"created_at\",\r\n sortOrder: \"desc\",\r\n });\r\n }\r\n\r\n // ============================================\r\n // DEALS\r\n // ============================================\r\n\r\n /**\r\n * List all deals\r\n *\r\n * @example\r\n * ```ts\r\n * const deals = await client.data.listDeals({\r\n * minScore: 70,\r\n * category: \"electronics\",\r\n * sortBy: \"deal_score\",\r\n * sortOrder: \"desc\"\r\n * });\r\n * ```\r\n */\r\n async listDeals(options: ListDealsOptions = {}): Promise<ListDealsResponse> {\r\n const result = await get<ListDealsResponse>(this.ctx, \"/v1/data/deals\", {\r\n page: options.page,\r\n limit: options.limit,\r\n minScore: options.minScore,\r\n maxPrice: options.maxPrice,\r\n category: options.category,\r\n merchant: options.merchant,\r\n synced: options.synced?.toString(),\r\n sortBy: options.sortBy,\r\n sortOrder: options.sortOrder,\r\n });\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get a single deal by ID\r\n *\r\n * @example\r\n * ```ts\r\n * const deal = await client.data.getDeal(\"deal_abc123\");\r\n * console.log(deal.product.name);\r\n * console.log(deal.pricing.discountPercent);\r\n * ```\r\n */\r\n async getDeal(dealId: string): Promise<DealDetails> {\r\n if (!dealId || !dealId.trim()) {\r\n throw new Error(\"dealId is required and cannot be empty\");\r\n }\r\n const result = await get<DealDetails>(this.ctx, `/v1/data/deals/${dealId}`);\r\n return result.data;\r\n }\r\n /**\r\n * Get top deals by score\r\n * Convenience method for finding best deals\r\n *\r\n * @example\r\n * ```ts\r\n * const topDeals = await client.data.getTopDeals(20, 80);\r\n * ```\r\n */\r\n async getTopDeals(\r\n limit: number = 20,\r\n minScore: number = 70\r\n ): Promise<ListDealsResponse> {\r\n return this.listDeals({\r\n limit,\r\n minScore,\r\n sortBy: \"deal_score\",\r\n sortOrder: \"desc\",\r\n });\r\n }\r\n\r\n /**\r\n * Get deals by category\r\n * Convenience method for filtering by category\r\n *\r\n * @example\r\n * ```ts\r\n * const electronicsDeals = await client.data.getDealsByCategory(\"electronics\");\r\n async getDealsByCategory(\r\n category: string,\r\n options?: Omit<ListDealsOptions, \"category\">\r\n ): Promise<ListDealsResponse> {\r\n if (!category || !category.trim()) {\r\n throw new Error(\"category is required and cannot be empty\");\r\n }\r\n return this.listDeals({ category, ...options });\r\n } return this.listDeals({ category, ...options });\r\n }\r\n\r\n /**\r\n * Get unsynced deals (not yet sent to DealUp)\r\n *\r\n * @example\r\n * ```ts\r\n * const unsyncedDeals = await client.data.getUnsyncedDeals();\r\n * ```\r\n */\r\n async getUnsyncedDeals(\r\n options?: Omit<ListDealsOptions, \"synced\">\r\n ): Promise<ListDealsResponse> {\r\n return this.listDeals({ synced: false, ...options });\r\n }\r\n\r\n // ============================================\r\n // EXPORT\r\n // ============================================\r\n\r\n /**\r\n * Export jobs data\r\n *\r\n * @example\r\n * ```ts\r\n * // Export as JSON\r\n * const jsonData = await client.data.exportJobs({ format: \"json\" });\r\n *\r\n * // Export as CSV\r\n * const csvData = await client.data.exportJobs({ format: \"csv\" });\r\n * ```\r\n */\r\n async exportJobs(\r\n options: ExportJobsOptions = {}\r\n ): Promise<string | object[]> {\r\n const result = await get<string | object[]>(\r\n this.ctx,\r\n \"/v1/data/export/jobs\",\r\n {\r\n format: options.format || \"json\",\r\n status: options.status,\r\n type: options.type,\r\n fromDate: options.fromDate,\r\n toDate: options.toDate,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Export deals data\r\n *\r\n * @example\r\n * ```ts\r\n * // Export as JSON\r\n * const jsonData = await client.data.exportDeals({ format: \"json\" });\r\n *\r\n * // Export as CSV with filters\r\n * const csvData = await client.data.exportDeals({\r\n * format: \"csv\",\r\n * minScore: 70,\r\n * category: \"software\"\r\n * });\r\n * ```\r\n */\r\n async exportDeals(\r\n options: ExportDealsOptions = {}\r\n ): Promise<string | object[]> {\r\n const result = await get<string | object[]>(\r\n this.ctx,\r\n \"/v1/data/export/deals\",\r\n {\r\n format: options.format || \"json\",\r\n minScore: options.minScore,\r\n maxPrice: options.maxPrice,\r\n category: options.category,\r\n includeRawSignals: options.includeRawSignals,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n // ============================================\r\n // STATS\r\n // ============================================\r\n\r\n /**\r\n * Get client statistics\r\n *\r\n * @example\r\n * ```ts\r\n * const stats = await client.data.getStats();\r\n * console.log(stats.totals.deals);\r\n * console.log(stats.performance.avgDealScore);\r\n * ```\r\n */\r\n async getStats(): Promise<ClientStatsResponse> {\r\n const result = await get<ClientStatsResponse>(this.ctx, \"/v1/data/stats\");\r\n return result.data;\r\n }\r\n}\r\n","/**\r\n * Dork Resource\r\n * Handles Google Dork search operations\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type { DorkOptions } from \"../types/options\";\r\nimport type { DorkJobResponse } from \"../types/responses\";\r\nimport { post } from \"../utils/request\";\r\n\r\n/**\r\n * Dork resource class\r\n * Provides methods for Google Dork searches\r\n */\r\nexport class DorkResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * Create a new dork search job\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.dork.create({\r\n * query: \"discount coupon\",\r\n * site: \"amazon.com\",\r\n * maxResults: 20\r\n * });\r\n * console.log(job.jobId);\r\n * ```\r\n */\r\n async create(options: DorkOptions): Promise<DorkJobResponse> {\r\n const body = {\r\n query: this.buildQuery(options),\r\n maxResults: options.maxResults,\r\n region: options.region,\r\n };\r\n\r\n const result = await post<DorkJobResponse>(this.ctx, \"/v1/dork\", body);\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Search for deals on a specific site\r\n * Convenience method for finding discount pages\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.dork.findDeals(\"amazon.com\", {\r\n * maxResults: 50\r\n * });\r\n * ```\r\n */\r\n async findDeals(\r\n site: string,\r\n options?: Omit<DorkOptions, \"query\" | \"site\">\r\n ): Promise<DorkJobResponse> {\r\n return this.create({\r\n query: \"discount OR coupon OR sale OR promo OR deal\",\r\n site,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Search for product pages on a site\r\n * Looks for common product URL patterns\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.dork.findProducts(\"shop.example.com\", {\r\n * maxResults: 100\r\n * });\r\n * ```\r\n */\r\n async findProducts(\r\n site: string,\r\n options?: Omit<DorkOptions, \"query\" | \"site\" | \"inUrl\">\r\n ): Promise<DorkJobResponse> {\r\n return this.create({\r\n query: \"product OR item OR buy\",\r\n site,\r\n inUrl: \"product\",\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Search for PDFs on a site\r\n * Useful for finding manuals, guides, datasheets\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.dork.findPDFs(\"docs.example.com\", \"user guide\");\r\n * ```\r\n */\r\n async findPDFs(\r\n site: string,\r\n query?: string,\r\n options?: Omit<DorkOptions, \"query\" | \"site\" | \"fileType\">\r\n ): Promise<DorkJobResponse> {\r\n return this.create({\r\n query: query || \"*\",\r\n site,\r\n fileType: \"pdf\",\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Search with custom title filter\r\n * Find pages with specific terms in title\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.dork.inTitle(\"Black Friday\", {\r\n * site: \"bestbuy.com\",\r\n * maxResults: 30\r\n * });\r\n * ```\r\n */\r\n async inTitle(\r\n titleQuery: string,\r\n options?: Omit<DorkOptions, \"inTitle\">\r\n ): Promise<DorkJobResponse> {\r\n return this.create({\r\n query: options?.query || titleQuery,\r\n inTitle: titleQuery,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Search with custom URL filter\r\n * Find pages with specific terms in URL\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.dork.inUrl(\"clearance\", {\r\n * site: \"walmart.com\"\r\n * });\r\n * ```\r\n */\r\n async inUrl(\r\n urlQuery: string,\r\n options?: Omit<DorkOptions, \"inUrl\">\r\n ): Promise<DorkJobResponse> {\r\n return this.create({\r\n query: options?.query || urlQuery,\r\n inUrl: urlQuery,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Build a raw Google dork query string\r\n * Useful for preview or debugging\r\n *\r\n * @example\r\n * ```ts\r\n * const query = client.dork.buildQuery({\r\n * query: \"laptop deals\",\r\n * site: \"amazon.com\",\r\n * inTitle: \"discount\"\r\n * });\r\n * // Returns: \"laptop deals site:amazon.com intitle:discount\"\r\n * ```\r\n */\r\n buildQuery(options: DorkOptions): string {\r\n const parts: string[] = [];\r\n\r\n // Only add query if it's a non-empty string\r\n if (typeof options.query === 'string' && options.query.trim() !== '') {\r\n parts.push(options.query);\r\n }\r\n\r\n if (options.site) {\r\n parts.push(`site:${options.site}`);\r\n }\r\n if (options.fileType) {\r\n parts.push(`filetype:${options.fileType}`);\r\n }\r\n if (options.inUrl) {\r\n parts.push(`inurl:${options.inUrl}`);\r\n }\r\n if (options.inTitle) {\r\n parts.push(`intitle:${options.inTitle}`);\r\n }\r\n\r\n return parts.join(\" \");\r\n }\r\n}\r\n","/**\r\n * Extract Resource\r\n * Handles LLM-based structured data extraction\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type { ExtractOptions, ExtractModel } from \"../types/options\";\r\nimport type { ExtractJobResponse } from \"../types/responses\";\r\nimport { post } from \"../utils/request\";\r\n\r\n/**\r\n * Extract resource class\r\n * Provides methods for structured data extraction using LLMs\r\n */\r\nexport class ExtractResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * Create a new extraction job\r\n * Either schema or prompt must be provided\r\n *\r\n * @example\r\n * ```ts\r\n * // Schema-based extraction\r\n * const job = await client.extract.create({\r\n * url: \"https://example.com/product\",\r\n * schema: {\r\n * type: \"object\",\r\n * properties: {\r\n * name: { type: \"string\" },\r\n * price: { type: \"number\" },\r\n * features: { type: \"array\", items: { type: \"string\" } }\r\n * }\r\n * }\r\n * });\r\n *\r\n * // Prompt-based extraction\r\n * const job = await client.extract.create({\r\n * url: \"https://example.com/article\",\r\n * prompt: \"Extract the main points and author name\"\r\n * });\r\n * ```\r\n */\r\n async create(options: ExtractOptions): Promise<ExtractJobResponse> {\r\n if (!options.schema && !options.prompt) {\r\n throw new Error(\"Either 'schema' or 'prompt' must be provided\");\r\n }\r\n\r\n const body = {\r\n url: options.url,\r\n schema: options.schema,\r\n prompt: options.prompt,\r\n onlyMainContent: options.onlyMainContent,\r\n excludeTags: options.excludeTags,\r\n excludeSelectors: options.excludeSelectors,\r\n model: options.model,\r\n temperature: options.temperature,\r\n webhook: options.webhook,\r\n headers: options.headers,\r\n timeout: options.timeout,\r\n };\r\n\r\n const result = await post<ExtractJobResponse>(\r\n this.ctx,\r\n \"/v1/extract\",\r\n body\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Extract data using a JSON Schema\r\n * Convenience method for schema-based extraction\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.extract.withSchema(\r\n * \"https://example.com/product\",\r\n * {\r\n * type: \"object\",\r\n * properties: {\r\n * name: { type: \"string\" },\r\n * price: { type: \"number\" }\r\n * }\r\n * }\r\n * );\r\n * ```\r\n */\r\n async withSchema(\r\n url: string,\r\n schema: Record<string, unknown>,\r\n options?: Omit<ExtractOptions, \"url\" | \"schema\" | \"prompt\">\r\n ): Promise<ExtractJobResponse> {\r\n return this.create({\r\n url,\r\n schema,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Extract data using a natural language prompt\r\n * Convenience method for prompt-based extraction\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.extract.withPrompt(\r\n * \"https://example.com/article\",\r\n * \"Extract the article title, author, publication date, and a brief summary\"\r\n * );\r\n * ```\r\n */\r\n async withPrompt(\r\n url: string,\r\n prompt: string,\r\n options?: Omit<ExtractOptions, \"url\" | \"schema\" | \"prompt\">\r\n ): Promise<ExtractJobResponse> {\r\n return this.create({\r\n url,\r\n prompt,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Extract product information from a page\r\n * Pre-built schema for common e-commerce use case\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.extract.product(\"https://shop.example.com/item\");\r\n * ```\r\n */\r\n async product(\r\n url: string,\r\n options?: Omit<ExtractOptions, \"url\" | \"schema\" | \"prompt\">\r\n ): Promise<ExtractJobResponse> {\r\n const productSchema = {\r\n type: \"object\",\r\n properties: {\r\n name: { type: \"string\", description: \"Product name\" },\r\n brand: { type: \"string\", description: \"Brand name\" },\r\n price: { type: \"number\", description: \"Current price\" },\r\n originalPrice: {\r\n type: \"number\",\r\n description: \"Original price before discount\",\r\n },\r\n currency: {\r\n type: \"string\",\r\n description: \"Currency code (USD, EUR, etc.)\",\r\n },\r\n description: { type: \"string\", description: \"Product description\" },\r\n features: {\r\n type: \"array\",\r\n items: { type: \"string\" },\r\n description: \"List of product features\",\r\n },\r\n images: {\r\n type: \"array\",\r\n items: { type: \"string\" },\r\n description: \"Product image URLs\",\r\n },\r\n availability: {\r\n type: \"string\",\r\n description: \"In stock, out of stock, etc.\",\r\n },\r\n rating: { type: \"number\", description: \"Average rating\" },\r\n reviewCount: { type: \"number\", description: \"Number of reviews\" },\r\n },\r\n required: [\"name\", \"price\"],\r\n };\r\n\r\n return this.create({\r\n url,\r\n schema: productSchema,\r\n model: \"gpt-4o-mini\",\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Extract article/blog post information\r\n * Pre-built schema for content extraction\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.extract.article(\"https://blog.example.com/post\");\r\n * ```\r\n */\r\n async article(\r\n url: string,\r\n options?: Omit<ExtractOptions, \"url\" | \"schema\" | \"prompt\">\r\n ): Promise<ExtractJobResponse> {\r\n const articleSchema = {\r\n type: \"object\",\r\n properties: {\r\n title: { type: \"string\", description: \"Article title\" },\r\n author: { type: \"string\", description: \"Author name\" },\r\n publishedAt: { type: \"string\", description: \"Publication date\" },\r\n summary: {\r\n type: \"string\",\r\n description: \"Brief summary of the article\",\r\n },\r\n content: { type: \"string\", description: \"Main article content\" },\r\n tags: {\r\n type: \"array\",\r\n items: { type: \"string\" },\r\n description: \"Article tags or categories\",\r\n },\r\n readingTime: {\r\n type: \"number\",\r\n description: \"Estimated reading time in minutes\",\r\n },\r\n },\r\n required: [\"title\", \"content\"],\r\n };\r\n\r\n return this.create({\r\n url,\r\n schema: articleSchema,\r\n onlyMainContent: true,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Extract contact information from a page\r\n * Pre-built schema for contact page scraping\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.extract.contact(\"https://example.com/contact\");\r\n * ```\r\n */\r\n async contact(\r\n url: string,\r\n options?: Omit<ExtractOptions, \"url\" | \"schema\" | \"prompt\">\r\n ): Promise<ExtractJobResponse> {\r\n const contactSchema = {\r\n type: \"object\",\r\n properties: {\r\n companyName: {\r\n type: \"string\",\r\n description: \"Company or organization name\",\r\n },\r\n email: { type: \"string\", description: \"Contact email address\" },\r\n phone: { type: \"string\", description: \"Phone number\" },\r\n address: {\r\n type: \"object\",\r\n properties: {\r\n street: { type: \"string\" },\r\n city: { type: \"string\" },\r\n state: { type: \"string\" },\r\n postalCode: { type: \"string\" },\r\n country: { type: \"string\" },\r\n },\r\n description: \"Physical address\",\r\n },\r\n socialMedia: {\r\n type: \"object\",\r\n properties: {\r\n twitter: { type: \"string\" },\r\n linkedin: { type: \"string\" },\r\n facebook: { type: \"string\" },\r\n instagram: { type: \"string\" },\r\n },\r\n description: \"Social media links\",\r\n },\r\n },\r\n };\r\n\r\n return this.create({\r\n url,\r\n schema: contactSchema,\r\n onlyMainContent: false, // Contact info might be in footer\r\n ...options,\r\n });\r\n }\r\n}\r\n","/**\r\n * Keys Resource\r\n * Handles API key management operations\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type {\r\n CreateApiKeyOptions,\r\n GetApiKeyStatsOptions,\r\n ListApiKeysOptions,\r\n RevokeApiKeyOptions,\r\n RotateApiKeyOptions,\r\n} from \"../types/options\";\r\nimport type {\r\n ApiKeyInfo,\r\n CreateKeyResponse,\r\n DeleteKeyResponse,\r\n KeyStatsResponse,\r\n ListKeysResponse,\r\n RotateKeyResponse,\r\n} from \"../types/responses\";\r\nimport { del, get, post } from \"../utils/request\";\r\n\r\n/**\r\n * Keys resource class\r\n * Provides methods for managing API keys\r\n */\r\nexport class KeysResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * List all API keys\r\n *\r\n * @example\r\n * ```ts\r\n * const keys = await client.keys.list();\r\n * keys.keys.forEach(k => {\r\n * console.log(k.name, k.prefix, k.isActive);\r\n * });\r\n * ```\r\n */\r\n async list(options: ListApiKeysOptions = {}): Promise<ListKeysResponse> {\r\n const result = await get<ListKeysResponse>(this.ctx, \"/v1/keys\", {\r\n includeRevoked: options.includeRevoked,\r\n });\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Create a new API key\r\n *\r\n * @example\r\n * ```ts\r\n * const newKey = await client.keys.create({\r\n * name: \"Production Key\",\r\n * scopes: [\"scrape\", \"crawl\", \"status\", \"data:read\"],\r\n * expiresInDays: 365\r\n * });\r\n *\r\n * // IMPORTANT: Save this key immediately - it won't be shown again!\r\n * console.log(newKey.key);\r\n * ```\r\n */\r\n async create(options: CreateApiKeyOptions): Promise<CreateKeyResponse> {\r\n const result = await post<CreateKeyResponse>(this.ctx, \"/v1/keys\", {\r\n name: options.name,\r\n scopes: options.scopes,\r\n expiresInDays: options.expiresInDays,\r\n ipAllowlist: options.ipAllowlist,\r\n });\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get details of a specific key\r\n *\r\n * @example\r\n * ```ts\r\n * const key = await client.keys.get(\"key_abc123\");\r\n * console.log(key.scopes);\r\n * console.log(key.lastUsedAt);\r\n * ```\r\n */\r\n async get(keyId: string): Promise<ApiKeyInfo> {\r\n const result = await get<ApiKeyInfo>(this.ctx, `/v1/keys/${keyId}`);\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get usage statistics for a key\r\n *\r\n * @example\r\n * ```ts\r\n * const stats = await client.keys.getStats(\"key_abc123\", { days: 30 });\r\n * console.log(stats.stats.totalRequests);\r\n * console.log(stats.stats.byEndpoint);\r\n * ```\r\n */\r\n async getStats(\r\n keyId: string,\r\n options: GetApiKeyStatsOptions = {}\r\n ): Promise<KeyStatsResponse> {\r\n const result = await get<KeyStatsResponse>(\r\n this.ctx,\r\n `/v1/keys/${keyId}/stats`,\r\n {\r\n days: options.days,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Rotate an API key (revoke old, create new)\r\n *\r\n * @example\r\n * ```ts\r\n * const rotated = await client.keys.rotate(\"key_abc123\", {\r\n * newName: \"Production Key v2\"\r\n * });\r\n *\r\n * // Old key is now invalid\r\n * console.log(rotated.oldKeyRevoked); // true\r\n *\r\n * // Save new key immediately!\r\n * console.log(rotated.newKey.key);\r\n * ```\r\n */\r\n async rotate(\r\n keyId: string,\r\n options: RotateApiKeyOptions = {}\r\n ): Promise<RotateKeyResponse> {\r\n const result = await post<RotateKeyResponse>(\r\n this.ctx,\r\n `/v1/keys/${keyId}/rotate`,\r\n {\r\n newName: options.newName,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Revoke (delete) an API key\r\n *\r\n * @example\r\n * ```ts\r\n * // Simple revoke\r\n * await client.keys.revoke(\"key_abc123\");\r\n *\r\n * // With reason\r\n * await client.keys.revoke(\"key_abc123\", {\r\n * reason: \"Key compromised\"\r\n * });\r\n * ```\r\n */\r\n async revoke(\r\n keyId: string,\r\n options: RevokeApiKeyOptions = {}\r\n ): Promise<DeleteKeyResponse> {\r\n const result = await del<DeleteKeyResponse>(\r\n this.ctx,\r\n `/v1/keys/${keyId}`,\r\n options.reason ? { reason: options.reason } : undefined\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Revoke all API keys (except the current one)\r\n *\r\n * @example\r\n * ```ts\r\n * // Use with caution!\r\n * const result = await client.keys.revokeAll();\r\n * console.log(`Revoked ${result.count} keys`);\r\n * ```\r\n */\r\n async revokeAll(): Promise<{ success: boolean; count: number }> {\r\n const result = await del<{ success: boolean; count: number }>(\r\n this.ctx,\r\n \"/v1/keys/all\"\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get active keys only\r\n *\r\n * @example\r\n * ```ts\r\n * const activeKeys = await client.keys.getActive();\r\n * ```\r\n */\r\n async getActive(): Promise<ApiKeyInfo[]> {\r\n const all = await this.list({ includeRevoked: false });\r\n return all.keys.filter((k) => k.isActive);\r\n }\r\n\r\n /**\r\n * Check if a key is valid (active and not expired)\r\n *\r\n * @example\r\n * ```ts\r\n * const isValid = await client.keys.isValid(\"key_abc123\");\r\n * ```\r\n */\r\n async isValid(keyId: string): Promise<boolean> {\r\n try {\r\n const key = await this.get(keyId);\r\n if (!key.isActive) return false;\r\n if (key.expiresAt && new Date(key.expiresAt) < new Date()) return false;\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n}\r\n","/**\r\n * Scrape Resource\r\n * Handles single page and batch scraping operations\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type { BatchScrapeOptions, ScrapeOptions } from \"../types/options\";\r\nimport type {\r\n BatchScrapeResponse,\r\n BatchStatusResponse,\r\n ScrapeJobResponse,\r\n} from \"../types/responses\";\r\nimport { get, post } from \"../utils/request\";\r\n\r\n/**\r\n * Scrape resource class\r\n * Provides methods for single page scraping\r\n */\r\nexport class ScrapeResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * Create a new scrape job\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.scrape.create({\r\n * url: \"https://example.com/product\",\r\n * extractDeal: true,\r\n * screenshot: { enabled: true, format: \"webp\" }\r\n * });\r\n * console.log(job.jobId);\r\n * ```\r\n */\r\n async create(options: ScrapeOptions): Promise<ScrapeJobResponse> {\r\n const body = {\r\n url: options.url,\r\n detectSignals: options.detectSignals ?? true,\r\n extractWithAI: options.extractWithAI,\r\n extractDeal: options.extractDeal,\r\n extractMultipleDeals: options.extractMultipleDeals,\r\n maxDeals: options.maxDeals,\r\n useAdvancedModel: options.useAdvancedModel,\r\n minDealScore: options.minDealScore,\r\n screenshot: options.screenshot,\r\n excludeTags: options.excludeTags,\r\n excludeSelectors: options.excludeSelectors,\r\n onlyMainContent: options.onlyMainContent,\r\n headers: options.headers,\r\n timeout: options.timeout,\r\n };\r\n\r\n const result = await post<ScrapeJobResponse>(this.ctx, \"/v1/scrape\", body);\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Scrape a URL with deal extraction enabled\r\n * Convenience method for common use case\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.scrape.extractDeal(\"https://example.com/sale\");\r\n * ```\r\n */\r\n async extractDeal(\r\n url: string,\r\n options?: Omit<ScrapeOptions, \"url\" | \"extractDeal\">\r\n ): Promise<ScrapeJobResponse> {\r\n return this.create({\r\n url,\r\n extractDeal: true,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Scrape a list page and extract multiple deals\r\n * Use for category pages, deal lists, search results\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.scrape.extractDeals(\r\n * \"https://amazon.fr/deals\",\r\n * { maxDeals: 30, useAdvancedModel: true }\r\n * );\r\n * ```\r\n */\r\n async extractDeals(\r\n url: string,\r\n options?: Omit<ScrapeOptions, \"url\" | \"extractMultipleDeals\">\r\n ): Promise<ScrapeJobResponse> {\r\n return this.create({\r\n url,\r\n extractMultipleDeals: true,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Scrape a URL with screenshot capture\r\n * Convenience method for screenshot capture\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.scrape.withScreenshot(\"https://example.com\", {\r\n * format: \"webp\",\r\n * fullPage: true\r\n * });\r\n * ```\r\n */\r\n async withScreenshot(\r\n url: string,\r\n screenshotOptions?: Omit<ScrapeOptions[\"screenshot\"], \"enabled\">,\r\n options?: Omit<ScrapeOptions, \"url\" | \"screenshot\">\r\n ): Promise<ScrapeJobResponse> {\r\n return this.create({\r\n url,\r\n screenshot: {\r\n enabled: true,\r\n ...screenshotOptions,\r\n },\r\n ...options,\r\n });\r\n }\r\n\r\n // ============================================\r\n // BATCH SCRAPING METHODS\r\n // ============================================\r\n\r\n /**\r\n * Create a batch scrape job for multiple URLs\r\n * Scrapes 1-100 URLs in a single request\r\n *\r\n * @example\r\n * ```ts\r\n * const batch = await client.scrape.batch({\r\n * urls: [\r\n * { url: \"https://shop1.com/product1\" },\r\n * { url: \"https://shop2.com/deal\", extractDeal: true }\r\n * ],\r\n * defaults: { detectSignals: true }\r\n * });\r\n * console.log(batch.batchId, batch.results);\r\n * ```\r\n */\r\n async batch(options: BatchScrapeOptions): Promise<BatchScrapeResponse> {\r\n const body = {\r\n urls: options.urls,\r\n defaults: options.defaults,\r\n webhookUrl: options.webhookUrl,\r\n priority: options.priority,\r\n delayMs: options.delay,\r\n };\r\n\r\n const result = await post<BatchScrapeResponse>(\r\n this.ctx,\r\n \"/v1/scrape/batch\",\r\n body\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get status of a batch scrape operation\r\n *\r\n * @example\r\n * ```ts\r\n * const status = await client.scrape.getBatchStatus(batchId);\r\n * console.log(`Completed: ${status.completed}/${status.total}`);\r\n * ```\r\n */\r\n async getBatchStatus(batchId: string): Promise<BatchStatusResponse> {\r\n const result = await get<BatchStatusResponse>(\r\n this.ctx,\r\n `/v1/scrape/batch/${batchId}`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Batch scrape with deal extraction enabled for all URLs\r\n * Convenience method for deal-focused batch scraping\r\n *\r\n * @example\r\n * ```ts\r\n * const batch = await client.scrape.batchForDeals([\r\n * \"https://shop1.com/sale\",\r\n * \"https://shop2.com/deals\"\r\n * ]);\r\n * ```\r\n */\r\n async batchForDeals(\r\n urls: string[],\r\n options?: Omit<BatchScrapeOptions, \"urls\">\r\n ): Promise<BatchScrapeResponse> {\r\n return this.batch({\r\n urls: urls.map((url) => ({ url })),\r\n defaults: {\r\n extractDeal: true,\r\n detectSignals: true,\r\n ...options?.defaults,\r\n },\r\n ...options,\r\n });\r\n }\r\n}\r\n","/**\n * Search Resource\n * Handles web search operations with AI optimization\n */\n\nimport type { RequestContext } from \"../types/config\";\nimport type { SearchOptions } from \"../types/options\";\nimport type { SearchJobResponse, SearchStatusResponse } from \"../types/responses\";\nimport { get, post } from \"../utils/request\";\n\n/**\n * Search resource class\n * Provides methods for web search with AI optimization\n */\nexport class SearchResource {\n constructor(private ctx: RequestContext) {}\n\n /**\n * Create a new search job\n *\n * @example\n * ```ts\n * const result = await client.search.create({\n * query: \"laptop deals black friday\",\n * maxResults: 20,\n * useDealScoring: true\n * });\n * ```\n */\n async create(options: SearchOptions): Promise<SearchJobResponse> {\n const body = {\n query: options.query,\n limit: options.maxResults,\n scrapeResults: options.autoScrape,\n maxScrapeResults: options.autoScrapeLimit,\n useAiOptimization: options.useAiOptimization,\n aiProvider: options.aiProvider,\n aiModel: options.aiModel,\n useDealScoring: options.useDealScoring,\n skipCache: options.skipCache,\n filters: options.filters,\n webhook: options.webhook,\n };\n\n const result = await post<SearchJobResponse>(this.ctx, \"/v1/search\", body);\n return result.data;\n }\n\n /**\n * Search with AI query optimization\n * Convenience method for AI-enhanced searches\n *\n * @example\n * ```ts\n * const result = await client.search.withAI(\"iphone discount\", {\n * aiProvider: \"openai\",\n * aiModel: \"gpt-4o-mini\"\n * });\n * ```\n */\n async withAI(\n query: string,\n options?: Omit<SearchOptions, \"query\" | \"useAiOptimization\">\n ): Promise<SearchJobResponse> {\n return this.create({\n query,\n useAiOptimization: true,\n ...options,\n });\n }\n\n /**\n * Search with deal scoring enabled\n * Scores each result for deal relevance (0-100)\n *\n * @example\n * ```ts\n * const result = await client.search.forDeals(\"gaming laptop\");\n * ```\n */\n async forDeals(\n query: string,\n options?: Omit<SearchOptions, \"query\" | \"useDealScoring\">\n ): Promise<SearchJobResponse> {\n return this.create({\n query,\n useDealScoring: true,\n ...options,\n });\n }\n\n /**\n * Search and auto-scrape top results\n * Creates scrape jobs for the best matching URLs\n *\n * @example\n * ```ts\n * const result = await client.search.andScrape(\"promo codes\", {\n * autoScrapeLimit: 5\n * });\n * console.log(result.data.scrapedJobIds);\n * ```\n */\n async andScrape(\n query: string,\n options?: Omit<SearchOptions, \"query\" | \"autoScrape\">\n ): Promise<SearchJobResponse> {\n return this.create({\n query,\n autoScrape: true,\n ...options,\n });\n }\n\n /**\n * Check search API status\n * Returns availability and features info\n *\n * @example\n * ```ts\n * const status = await client.search.getStatus();\n * if (status.available) {\n * console.log(`Provider: ${status.provider}`);\n * }\n * ```\n */\n async getStatus(): Promise<SearchStatusResponse> {\n const result = await get<SearchStatusResponse>(this.ctx, \"/v1/search/status\");\n return result.data;\n }\n}\n","/**\r\n * Status Resource\r\n * Handles job status checking and management\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type { GetDealsOptions } from \"../types/options\";\r\nimport type {\r\n JobStatusResponse,\r\n JobDealsResponse,\r\n ResumeJobResponse,\r\n JobMetricsResponse,\r\n CancelJobResponse,\r\n} from \"../types/responses\";\r\nimport { get, post, del } from \"../utils/request\";\r\n\r\n/**\r\n * Status resource class\r\n * Provides methods for checking and managing job status\r\n */\r\nexport class StatusResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * Get the status of a job\r\n *\r\n * @example\r\n * ```ts\r\n * const status = await client.status.get(\"job_abc123\");\r\n * console.log(status.status); // \"completed\"\r\n * console.log(status.result);\r\n * ```\r\n */\r\n async get(jobId: string): Promise<JobStatusResponse> {\r\n const result = await get<JobStatusResponse>(\r\n this.ctx,\r\n `/v1/status/${jobId}`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get deals found by a job\r\n *\r\n * @example\r\n * ```ts\r\n * const deals = await client.status.getDeals(\"job_abc123\", {\r\n * minScore: 70,\r\n * limit: 20\r\n * });\r\n * console.log(deals.deals);\r\n * ```\r\n */\r\n async getDeals(\r\n jobId: string,\r\n options?: GetDealsOptions\r\n ): Promise<JobDealsResponse> {\r\n const result = await get<JobDealsResponse>(\r\n this.ctx,\r\n `/v1/status/${jobId}/deals`,\r\n {\r\n minScore: options?.minScore,\r\n limit: options?.limit,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Resume a paused or failed job from checkpoint\r\n *\r\n * @example\r\n * ```ts\r\n * const resumed = await client.status.resume(\"job_abc123\");\r\n * console.log(resumed.newJobId);\r\n * ```\r\n */\r\n async resume(jobId: string): Promise<ResumeJobResponse> {\r\n const result = await post<ResumeJobResponse>(\r\n this.ctx,\r\n `/v1/status/${jobId}/resume`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get detailed metrics for a job\r\n *\r\n * @example\r\n * ```ts\r\n * const metrics = await client.status.getMetrics(\"job_abc123\");\r\n * console.log(metrics.metrics.successRate);\r\n * ```\r\n */\r\n async getMetrics(jobId: string): Promise<JobMetricsResponse> {\r\n const result = await get<JobMetricsResponse>(\r\n this.ctx,\r\n `/v1/status/${jobId}/metrics`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Cancel a pending or active job\r\n *\r\n * @example\r\n * ```ts\r\n * const cancelled = await client.status.cancel(\"job_abc123\");\r\n * console.log(cancelled.success);\r\n * ```\r\n */\r\n async cancel(jobId: string): Promise<CancelJobResponse> {\r\n const result = await del<CancelJobResponse>(\r\n this.ctx,\r\n `/v1/status/${jobId}`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Check if a job is complete\r\n * Convenience method for polling\r\n *\r\n * @example\r\n * ```ts\r\n * const isComplete = await client.status.isComplete(\"job_abc123\");\r\n * ```\r\n */\r\n async isComplete(jobId: string): Promise<boolean> {\r\n const status = await this.get(jobId);\r\n return status.status === \"completed\" || status.status === \"failed\";\r\n }\r\n\r\n /**\r\n * Check if a job succeeded\r\n * Convenience method for result checking\r\n *\r\n * @example\r\n * ```ts\r\n * const succeeded = await client.status.succeeded(\"job_abc123\");\r\n * ```\r\n */\r\n async succeeded(jobId: string): Promise<boolean> {\r\n const status = await this.get(jobId);\r\n return status.status === \"completed\";\r\n }\r\n\r\n /**\r\n * Get the result of a completed job\r\n * Throws if job is not complete\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.status.getResult(\"job_abc123\");\r\n * ```\r\n */\r\n async getResult<T = unknown>(jobId: string): Promise<T> {\r\n const status = await this.get(jobId);\r\n\r\n if (status.status === \"failed\") {\r\n throw new Error(`Job failed: ${status.error || \"Unknown error\"}`);\r\n }\r\n\r\n if (status.status !== \"completed\") {\r\n throw new Error(`Job not complete. Status: ${status.status}`);\r\n }\r\n\r\n return status.result as T;\r\n }\r\n}\r\n","/**\r\n * Webhooks Resource\r\n * Handles webhook CRUD operations\r\n */\r\n\r\nimport type { RequestContext } from \"../types/config\";\r\nimport type {\r\n CreateWebhookOptions,\r\n UpdateWebhookOptions,\r\n} from \"../types/options\";\r\nimport type {\r\n CreateWebhookResponse,\r\n ListWebhooksResponse,\r\n WebhookItem,\r\n UpdateWebhookResponse,\r\n DeleteWebhookResponse,\r\n TestWebhookResponse,\r\n} from \"../types/responses\";\r\nimport { get, post, patch, del } from \"../utils/request\";\r\n\r\n/**\r\n * Webhooks resource class\r\n * Provides methods for managing webhooks\r\n */\r\nexport class WebhooksResource {\r\n constructor(private ctx: RequestContext) {}\r\n\r\n /**\r\n * Create a new webhook\r\n *\r\n * @example\r\n * ```ts\r\n * const webhook = await client.webhooks.create({\r\n * event: \"deal.found\",\r\n * url: \"https://my-server.com/webhooks/deals\",\r\n * secret: \"my-webhook-secret\",\r\n * minDealScore: 70\r\n * });\r\n * console.log(webhook.webhookId);\r\n * ```\r\n */\r\n async create(options: CreateWebhookOptions): Promise<CreateWebhookResponse> {\r\n const result = await post<CreateWebhookResponse>(this.ctx, \"/v1/webhooks\", {\r\n event: options.event,\r\n url: options.url,\r\n secret: options.secret,\r\n minDealScore: options.minDealScore,\r\n categories: options.categories,\r\n active: options.active,\r\n });\r\n return result.data;\r\n }\r\n\r\n /**\r\n * List all webhooks\r\n *\r\n * @example\r\n * ```ts\r\n * const webhooks = await client.webhooks.list();\r\n * webhooks.webhooks.forEach(w => {\r\n * console.log(w.event, w.url, w.active);\r\n * });\r\n * ```\r\n */\r\n async list(): Promise<ListWebhooksResponse> {\r\n const result = await get<ListWebhooksResponse>(this.ctx, \"/v1/webhooks\");\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Get a webhook by ID\r\n *\r\n * @example\r\n * ```ts\r\n * const webhook = await client.webhooks.get(\"webhook_abc123\");\r\n * console.log(webhook.event);\r\n * ```\r\n */\r\n async get(webhookId: string): Promise<WebhookItem> {\r\n const result = await get<WebhookItem>(\r\n this.ctx,\r\n `/v1/webhooks/${webhookId}`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Update a webhook\r\n *\r\n * @example\r\n * ```ts\r\n * const updated = await client.webhooks.update(\"webhook_abc123\", {\r\n * minDealScore: 80,\r\n * active: false\r\n * });\r\n * ```\r\n */\r\n async update(\r\n webhookId: string,\r\n options: UpdateWebhookOptions\r\n ): Promise<UpdateWebhookResponse> {\r\n const result = await patch<UpdateWebhookResponse>(\r\n this.ctx,\r\n `/v1/webhooks/${webhookId}`,\r\n {\r\n url: options.url,\r\n secret: options.secret,\r\n minDealScore: options.minDealScore,\r\n categories: options.categories,\r\n active: options.active,\r\n }\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Delete a webhook\r\n *\r\n * @example\r\n * ```ts\r\n * await client.webhooks.delete(\"webhook_abc123\");\r\n * ```\r\n */\r\n async delete(webhookId: string): Promise<DeleteWebhookResponse> {\r\n const result = await del<DeleteWebhookResponse>(\r\n this.ctx,\r\n `/v1/webhooks/${webhookId}`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Test a webhook by sending a test payload\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.webhooks.test(\"webhook_abc123\");\r\n * if (result.delivered) {\r\n * console.log(`Delivered in ${result.responseTime}ms`);\r\n * } else {\r\n * console.log(`Failed: ${result.error}`);\r\n * }\r\n * ```\r\n */\r\n async test(webhookId: string): Promise<TestWebhookResponse> {\r\n const result = await post<TestWebhookResponse>(\r\n this.ctx,\r\n `/v1/webhooks/${webhookId}/test`\r\n );\r\n return result.data;\r\n }\r\n\r\n /**\r\n * Enable a webhook\r\n * Convenience method for activating a webhook\r\n *\r\n * @example\r\n * ```ts\r\n * await client.webhooks.enable(\"webhook_abc123\");\r\n * ```\r\n */\r\n async enable(webhookId: string): Promise<UpdateWebhookResponse> {\r\n return this.update(webhookId, { active: true });\r\n }\r\n\r\n /**\r\n * Disable a webhook\r\n * Convenience method for deactivating a webhook\r\n *\r\n * @example\r\n * ```ts\r\n * await client.webhooks.disable(\"webhook_abc123\");\r\n * ```\r\n */\r\n async disable(webhookId: string): Promise<UpdateWebhookResponse> {\r\n return this.update(webhookId, { active: false });\r\n }\r\n\r\n /**\r\n * Get active webhooks only\r\n *\r\n * @example\r\n * ```ts\r\n * const active = await client.webhooks.getActive();\r\n * ```\r\n */\r\n async getActive(): Promise<WebhookItem[]> {\r\n const all = await this.list();\r\n return all.webhooks.filter((w) => w.active);\r\n }\r\n\r\n /**\r\n * Get webhooks by event type\r\n *\r\n * @example\r\n * ```ts\r\n * const dealWebhooks = await client.webhooks.getByEvent(\"deal.found\");\r\n * ```\r\n */\r\n async getByEvent(\r\n event: CreateWebhookOptions[\"event\"]\r\n ): Promise<WebhookItem[]> {\r\n const all = await this.list();\r\n return all.webhooks.filter((w) => w.event === event);\r\n }\r\n}\r\n","/**\r\n * DealCrawl SDK Client\r\n * Main entry point for the SDK\r\n *\r\n * @example\r\n * ```ts\r\n * import { DealCrawl } from \"@dealcrawl/sdk\";\r\n *\r\n * const client = new DealCrawl({ apiKey: \"sk_xxx\" });\r\n *\r\n * // Scrape a page\r\n * const job = await client.scrape.create({\r\n * url: \"https://example.com/product\",\r\n * extractDeal: true\r\n * });\r\n *\r\n * // Wait for result\r\n * const result = await client.waitForResult(job.jobId);\r\n * console.log(result);\r\n * ```\r\n */\r\n\r\nimport type { DealCrawlConfig, RequestContext } from \"./types/config\";\r\nimport { DEFAULT_CONFIG } from \"./types/config\";\r\nimport type { WaitOptions, WaitResult } from \"./utils/polling\";\r\nimport { waitForAll, waitForAny, waitForResult } from \"./utils/polling\";\r\n\r\n// Import resources\r\nimport { AccountResource } from \"./resources/account\";\r\nimport { AgentResource } from \"./resources/agent\";\r\nimport { CrawlResource } from \"./resources/crawl\";\r\nimport { DataResource } from \"./resources/data\";\r\nimport { DorkResource } from \"./resources/dork\";\r\nimport { ExtractResource } from \"./resources/extract\";\r\nimport { KeysResource } from \"./resources/keys\";\r\nimport { ScrapeResource } from \"./resources/scrape\";\r\nimport { SearchResource } from \"./resources/search\";\r\nimport { StatusResource } from \"./resources/status\";\r\nimport { WebhooksResource } from \"./resources/webhooks\";\r\n\r\n/**\r\n * DealCrawl SDK Client\r\n *\r\n * Provides access to all DealCrawl API endpoints through\r\n * organized resource classes following a Stripe-like pattern.\r\n *\r\n * @example\r\n * ```ts\r\n * const client = new DealCrawl({ apiKey: \"sk_xxx\" });\r\n *\r\n * // Core operations\r\n * await client.scrape.create({ url: \"...\" });\r\n * await client.crawl.create({ url: \"...\", maxPages: 100 });\r\n * await client.extract.create({ url: \"...\", schema: {...} });\r\n * await client.dork.create({ query: \"...\" });\r\n *\r\n * // Status & polling\r\n * await client.status.get(jobId);\r\n * await client.waitForResult(jobId);\r\n *\r\n * // Data access\r\n * await client.data.listJobs();\r\n * await client.data.listDeals();\r\n *\r\n * // Management\r\n * await client.webhooks.create({...});\r\n * await client.keys.create({...});\r\n * await client.account.get();\r\n * ```\r\n */\r\nexport class DealCrawl {\r\n /** Internal request context */\r\n private readonly ctx: RequestContext;\r\n\r\n // ============================================\r\n // RESOURCES\r\n // ============================================\r\n\r\n /**\r\n * Scrape resource - Single page and batch scraping\r\n *\r\n * @example\r\n * ```ts\r\n * // Single page\r\n * const job = await client.scrape.create({\r\n * url: \"https://example.com\",\r\n * extractDeal: true\r\n * });\r\n *\r\n * // Batch scraping\r\n * const batch = await client.scrape.batch({\r\n * urls: [{ url: \"https://shop1.com\" }, { url: \"https://shop2.com\" }]\r\n * });\r\n * ```\r\n */\r\n readonly scrape: ScrapeResource;\r\n\r\n /**\r\n * Search resource - Web search with AI optimization\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.search.create({\r\n * query: \"laptop deals\",\r\n * useDealScoring: true\r\n * });\r\n *\r\n * // With AI optimization\r\n * const result = await client.search.withAI(\"iphone discount\");\r\n * ```\r\n */\r\n readonly search: SearchResource;\r\n\r\n /**\r\n * Crawl resource - Website crawling\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.crawl.create({\r\n * url: \"https://shop.example.com\",\r\n * maxPages: 100\r\n * });\r\n *\r\n * // With template\r\n * const job = await client.crawl.withTemplate(\"ecommerce\", {\r\n * url: \"https://shop.example.com\"\r\n * });\r\n * ```\r\n */\r\n readonly crawl: CrawlResource;\r\n\r\n /**\r\n * Extract resource - LLM-based structured data extraction\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.extract.create({\r\n * url: \"https://example.com/product\",\r\n * schema: { type: \"object\", properties: {...} }\r\n * });\r\n * ```\r\n */\r\n readonly extract: ExtractResource;\r\n\r\n /**\r\n * Dork resource - Google Dork searches\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.dork.create({\r\n * query: \"discount coupon\",\r\n * site: \"amazon.com\"\r\n * });\r\n * ```\r\n */\r\n readonly dork: DorkResource;\r\n\r\n /**\r\n * Agent resource - AI-powered autonomous web navigation\r\n *\r\n * The agent uses ReAct pattern (Observation → Thought → Action → Evaluation)\r\n * to navigate web pages and extract structured data based on natural language.\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.agent.create({\r\n * url: \"https://amazon.com\",\r\n * prompt: \"Search for wireless headphones under $50 and extract top 5 results\",\r\n * maxSteps: 15\r\n * });\r\n *\r\n * // With schema for structured output\r\n * const job = await client.agent.withSchema(\r\n * \"https://example.com\",\r\n * \"Extract product info\",\r\n * { type: \"object\", properties: {...} }\r\n * );\r\n * ```\r\n */\r\n readonly agent: AgentResource;\r\n\r\n /**\r\n * Status resource - Job status management\r\n *\r\n * @example\r\n * ```ts\r\n * const status = await client.status.get(jobId);\r\n * const deals = await client.status.getDeals(jobId);\r\n * await client.status.cancel(jobId);\r\n * ```\r\n */\r\n readonly status: StatusResource;\r\n\r\n /**\r\n * Data resource - Jobs and deals data access\r\n *\r\n * @example\r\n * ```ts\r\n * const jobs = await client.data.listJobs();\r\n * const deals = await client.data.listDeals({ minScore: 70 });\r\n * const stats = await client.data.getStats();\r\n * ```\r\n */\r\n readonly data: DataResource;\r\n\r\n /**\r\n * Webhooks resource - Webhook management\r\n *\r\n * @example\r\n * ```ts\r\n * await client.webhooks.create({\r\n * event: \"deal.found\",\r\n * url: \"https://...\"\r\n * });\r\n * ```\r\n */\r\n readonly webhooks: WebhooksResource;\r\n\r\n /**\r\n * Keys resource - API key management\r\n *\r\n * @example\r\n * ```ts\r\n * const newKey = await client.keys.create({\r\n * name: \"Production\",\r\n * scopes: [\"scrape\", \"status\"]\r\n * });\r\n * ```\r\n */\r\n readonly keys: KeysResource;\r\n\r\n /**\r\n * Account resource - Account info and preferences\r\n *\r\n * @example\r\n * ```ts\r\n * const account = await client.account.get();\r\n * await client.account.updatePreferences({\r\n * minDealScore: 70\r\n * });\r\n * ```\r\n */\r\n readonly account: AccountResource;\r\n\r\n // ============================================\r\n // CONSTRUCTOR\r\n // ============================================\r\n\r\n /**\r\n * Create a new DealCrawl client\r\n *\r\n * @param config - Client configuration\r\n *\r\n * @example\r\n * ```ts\r\n * // Minimal config\r\n * const client = new DealCrawl({ apiKey: \"sk_xxx\" });\r\n *\r\n * // Full config\r\n * const client = new DealCrawl({\r\n * apiKey: \"sk_xxx\",\r\n * baseUrl: \"https://api.dealcrawl.dev\",\r\n * timeout: 30000,\r\n * maxRetries: 3,\r\n * retryDelay: 1000,\r\n * onRateLimit: (info) => console.log(\"Rate limited!\", info)\r\n * });\r\n * ```\r\n */\r\n constructor(config: DealCrawlConfig) {\r\n if (!config.apiKey || !config.apiKey.trim()) {\r\n throw new Error(\"API key is required\");\r\n }\r\n\r\n // Build request context\r\n this.ctx = {\r\n apiKey: config.apiKey,\r\n baseUrl: config.baseUrl ?? DEFAULT_CONFIG.baseUrl,\r\n timeout: config.timeout ?? DEFAULT_CONFIG.timeout,\r\n maxRetries: config.maxRetries ?? DEFAULT_CONFIG.maxRetries,\r\n retryDelay: config.retryDelay ?? DEFAULT_CONFIG.retryDelay,\r\n onRateLimit: config.onRateLimit,\r\n };\r\n\r\n // Initialize resources\r\n this.scrape = new ScrapeResource(this.ctx);\r\n this.search = new SearchResource(this.ctx);\r\n this.crawl = new CrawlResource(this.ctx);\r\n this.extract = new ExtractResource(this.ctx);\r\n this.dork = new DorkResource(this.ctx);\r\n this.agent = new AgentResource(this.ctx);\r\n this.status = new StatusResource(this.ctx);\r\n this.data = new DataResource(this.ctx);\r\n this.webhooks = new WebhooksResource(this.ctx);\r\n this.keys = new KeysResource(this.ctx);\r\n this.account = new AccountResource(this.ctx);\r\n }\r\n\r\n // ============================================\r\n // POLLING METHODS\r\n // ============================================\r\n\r\n /**\r\n * Wait for a job to complete\r\n * Polls the status endpoint until the job finishes\r\n *\r\n * @example\r\n * ```ts\r\n * const job = await client.scrape.create({ url: \"...\" });\r\n *\r\n * // Simple wait\r\n * const result = await client.waitForResult(job.jobId);\r\n *\r\n * // With options\r\n * const result = await client.waitForResult(job.jobId, {\r\n * pollInterval: 1000,\r\n * timeout: 60000,\r\n * onProgress: (status) => console.log(status.progress)\r\n * });\r\n * ```\r\n */\r\n async waitForResult<T = unknown>(\r\n jobId: string,\r\n options?: WaitOptions\r\n ): Promise<WaitResult<T>> {\r\n return waitForResult<T>(this.ctx, jobId, options);\r\n }\r\n\r\n /**\r\n * Wait for multiple jobs to complete\r\n * Returns when all jobs are done\r\n *\r\n * @example\r\n * ```ts\r\n * const jobs = await Promise.all([\r\n * client.scrape.create({ url: \"url1\" }),\r\n * client.scrape.create({ url: \"url2\" }),\r\n * ]);\r\n *\r\n * const results = await client.waitForAll(jobs.map(j => j.jobId));\r\n * ```\r\n */\r\n async waitForAll<T = unknown>(\r\n jobIds: string[],\r\n options?: WaitOptions\r\n ): Promise<WaitResult<T>[]> {\r\n return waitForAll<T>(this.ctx, jobIds, options);\r\n }\r\n\r\n /**\r\n * Wait for any job to complete\r\n * Returns as soon as one job finishes\r\n *\r\n * @example\r\n * ```ts\r\n * const jobIds = [\"job1\", \"job2\", \"job3\"];\r\n * const firstResult = await client.waitForAny(jobIds);\r\n * ```\r\n */\r\n async waitForAny<T = unknown>(\r\n jobIds: string[],\r\n options?: WaitOptions\r\n ): Promise<WaitResult<T>> {\r\n return waitForAny<T>(this.ctx, jobIds, options);\r\n }\r\n\r\n // ============================================\r\n // CONVENIENCE METHODS\r\n // ============================================\r\n\r\n /**\r\n * Scrape a URL and wait for result\r\n * Combines create and waitForResult\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.scrapeAndWait({\r\n * url: \"https://example.com\",\r\n * extractDeal: true\r\n * });\r\n * ```\r\n */\r\n async scrapeAndWait<T = unknown>(\r\n options: Parameters<ScrapeResource[\"create\"]>[0],\r\n waitOptions?: WaitOptions\r\n ): Promise<WaitResult<T>> {\r\n const job = await this.scrape.create(options);\r\n return this.waitForResult<T>(job.jobId, waitOptions);\r\n }\r\n\r\n /**\r\n * Crawl a URL and wait for result\r\n * Combines create and waitForResult\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.crawlAndWait({\r\n * url: \"https://shop.example.com\",\r\n * maxPages: 50\r\n * });\r\n * ```\r\n */\r\n async crawlAndWait<T = unknown>(\r\n options: Parameters<CrawlResource[\"create\"]>[0],\r\n waitOptions?: WaitOptions\r\n ): Promise<WaitResult<T>> {\r\n const job = await this.crawl.create(options);\r\n return this.waitForResult<T>(job.jobId, waitOptions);\r\n }\r\n\r\n /**\r\n * Extract data and wait for result\r\n * Combines create and waitForResult\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.extractAndWait({\r\n * url: \"https://example.com/product\",\r\n * schema: { type: \"object\", properties: {...} }\r\n * });\r\n * ```\r\n */\r\n async extractAndWait<T = unknown>(\r\n options: Parameters<ExtractResource[\"create\"]>[0],\r\n waitOptions?: WaitOptions\r\n ): Promise<WaitResult<T>> {\r\n const job = await this.extract.create(options);\r\n return this.waitForResult<T>(job.jobId, waitOptions);\r\n }\r\n\r\n /**\r\n * Search and return results directly\r\n * Note: Search is synchronous, no waiting needed\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.searchAndWait({\r\n * query: \"gaming laptop deals\",\r\n * useDealScoring: true\r\n * });\r\n * console.log(result.data.results);\r\n * ```\r\n */\r\n async searchAndWait(\r\n options: Parameters<SearchResource[\"create\"]>[0]\r\n ): Promise<ReturnType<SearchResource[\"create\"]>> {\r\n // Search is synchronous, returns results directly\r\n return this.search.create(options);\r\n }\r\n\r\n /**\r\n * Create an agent job and wait for result\r\n * Combines create and waitForResult\r\n *\r\n * @example\r\n * ```ts\r\n * const result = await client.agentAndWait({\r\n * url: \"https://booking.com\",\r\n * prompt: \"Find hotels in Paris for March 15-17\",\r\n * maxSteps: 20\r\n * });\r\n * console.log(result.data);\r\n * ```\r\n */\r\n async agentAndWait<T = unknown>(\r\n options: Parameters<AgentResource[\"create\"]>[0],\r\n waitOptions?: WaitOptions\r\n ): Promise<WaitResult<T>> {\r\n const job = await this.agent.create(options);\r\n return this.waitForResult<T>(job.jobId, waitOptions);\r\n }\r\n}\r\n"]}