scavio 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/retry.ts","../src/http.ts","../src/rate-limiter.ts","../src/namespaces/amazon.ts","../src/namespaces/google.ts","../src/namespaces/reddit.ts","../src/namespaces/tiktok.ts","../src/namespaces/instagram.ts","../src/namespaces/walmart.ts","../src/namespaces/youtube.ts","../src/namespaces/twitter.ts","../src/namespaces/linkedin.ts","../src/client.ts"],"sourcesContent":["export class ScavioError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ScavioError\";\n }\n}\n\nexport class MissingAPIKeyError extends ScavioError {\n constructor() {\n super(\n \"No API key provided. Pass apiKey or set the SCAVIO_API_KEY \" +\n \"environment variable. Get your free key at https://dashboard.scavio.dev\",\n );\n this.name = \"MissingAPIKeyError\";\n }\n}\n\n/** The request could not reach the API (DNS, connection reset, TLS, ...). */\nexport class ScavioConnectionError extends ScavioError {\n constructor(message = \"Connection error\") {\n super(message);\n this.name = \"ScavioConnectionError\";\n }\n}\n\n/** The request did not complete within the configured timeout. */\nexport class ScavioTimeoutError extends ScavioError {\n constructor(message = \"Request timed out\") {\n super(message);\n this.name = \"ScavioTimeoutError\";\n }\n}\n\nexport class InvalidAPIKeyError extends ScavioError {\n public readonly statusCode = 401;\n public readonly responseBody?: Record<string, unknown>;\n\n constructor(message = \"Invalid API key\", responseBody?: Record<string, unknown>) {\n super(message);\n this.name = \"InvalidAPIKeyError\";\n this.responseBody = responseBody;\n }\n}\n\nexport class InsufficientCreditsError extends ScavioError {\n public readonly statusCode = 402;\n public readonly responseBody?: Record<string, unknown>;\n\n constructor(message = \"Insufficient credits\", responseBody?: Record<string, unknown>) {\n super(message);\n this.name = \"InsufficientCreditsError\";\n this.responseBody = responseBody;\n }\n}\n\nexport class BadRequestError extends ScavioError {\n public readonly statusCode = 400;\n public readonly responseBody?: Record<string, unknown>;\n\n constructor(message = \"Bad request\", responseBody?: Record<string, unknown>) {\n super(message);\n this.name = \"BadRequestError\";\n this.responseBody = responseBody;\n }\n}\n\nexport class NotFoundError extends ScavioError {\n public readonly statusCode = 404;\n public readonly responseBody?: Record<string, unknown>;\n\n constructor(message = \"Not found\", responseBody?: Record<string, unknown>) {\n super(message);\n this.name = \"NotFoundError\";\n this.responseBody = responseBody;\n }\n}\n\nexport class RateLimitError extends ScavioError {\n public readonly statusCode = 429;\n public readonly responseBody?: Record<string, unknown>;\n\n constructor(message = \"Rate limit exceeded\", responseBody?: Record<string, unknown>) {\n super(message);\n this.name = \"RateLimitError\";\n this.responseBody = responseBody;\n }\n}\n\nexport class ScavioAPIError extends ScavioError {\n public readonly statusCode: number;\n public readonly responseBody?: Record<string, unknown>;\n\n constructor(\n statusCode: number,\n message: string,\n responseBody?: Record<string, unknown>,\n ) {\n super(`API error ${statusCode}: ${message}`);\n this.name = \"ScavioAPIError\";\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n }\n}\n","/**\n * Retry policy: exponential backoff with full jitter and Retry-After support.\n * Mirrors the Python SDK's RetryConfig.\n */\n\n/** Statuses that are safe to retry: rate limiting plus transient upstream errors. */\nexport const DEFAULT_RETRY_STATUSES: ReadonlySet<number> = new Set([\n 429, 500, 502, 503, 504,\n]);\n\nexport interface RetryConfig {\n /** Additional attempts after the first request. 0 disables retries. */\n maxRetries: number;\n /** Base backoff in seconds; attempt n waits up to baseDelay * 2**n before jitter. */\n baseDelay: number;\n /** Upper bound (seconds) on any single backoff wait. */\n maxDelay: number;\n /** HTTP status codes that trigger a retry. */\n retryStatuses: ReadonlySet<number>;\n}\n\nexport function makeRetryConfig(maxRetries: number): RetryConfig {\n return {\n maxRetries,\n baseDelay: 0.5,\n maxDelay: 8.0,\n retryStatuses: DEFAULT_RETRY_STATUSES,\n };\n}\n\nexport function shouldRetryStatus(\n config: RetryConfig,\n statusCode: number,\n attempt: number,\n): boolean {\n return attempt < config.maxRetries && config.retryStatuses.has(statusCode);\n}\n\nexport function shouldRetryException(\n config: RetryConfig,\n attempt: number,\n): boolean {\n return attempt < config.maxRetries;\n}\n\n/**\n * Seconds to sleep before the next attempt. Honors a Retry-After value when\n * present; otherwise uses exponential backoff with full jitter.\n */\nexport function backoff(\n config: RetryConfig,\n attempt: number,\n retryAfter?: number,\n): number {\n if (retryAfter !== undefined) {\n return Math.min(Math.max(retryAfter, 0), config.maxDelay);\n }\n const capped = Math.min(config.maxDelay, config.baseDelay * 2 ** attempt);\n return Math.random() * capped;\n}\n\n/** Parse a Retry-After header (delta-seconds or HTTP-date) to seconds. */\nexport function parseRetryAfter(header: string | null): number | undefined {\n if (!header) return undefined;\n const trimmed = header.trim();\n const asNumber = Number(trimmed);\n if (!Number.isNaN(asNumber) && trimmed !== \"\") {\n return asNumber;\n }\n const asDate = Date.parse(trimmed);\n if (!Number.isNaN(asDate)) {\n return Math.max((asDate - Date.now()) / 1000, 0);\n }\n return undefined;\n}\n","import {\n BadRequestError,\n InsufficientCreditsError,\n InvalidAPIKeyError,\n NotFoundError,\n RateLimitError,\n ScavioAPIError,\n ScavioConnectionError,\n ScavioTimeoutError,\n} from \"./errors.js\";\nimport type { RateLimiter } from \"./rate-limiter.js\";\nimport {\n backoff,\n makeRetryConfig,\n parseRetryAfter,\n shouldRetryException,\n shouldRetryStatus,\n type RetryConfig,\n} from \"./retry.js\";\n\nexport const BASE_URL = \"https://api.scavio.dev\";\nexport const DEFAULT_TIMEOUT = 30_000;\nexport const DEFAULT_MAX_RETRIES = 2;\n\nfunction buildHeaders(apiKey: string): Record<string, string> {\n return {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"X-Client-Source\": \"scavio-js\",\n };\n}\n\nfunction stripUndefined(\n obj: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction handleError(statusCode: number, body: Record<string, unknown>): never {\n let error = body.error ?? \"Unknown error\";\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n error = (error as { message: string }).message;\n }\n const msg = String(error);\n const responseBody = Object.keys(body).length > 0 ? body : undefined;\n\n if (statusCode === 400) throw new BadRequestError(msg, responseBody);\n if (statusCode === 401) throw new InvalidAPIKeyError(msg, responseBody);\n if (statusCode === 402) throw new InsufficientCreditsError(msg, responseBody);\n if (statusCode === 404) throw new NotFoundError(msg, responseBody);\n if (statusCode === 429) throw new RateLimitError(msg, responseBody);\n throw new ScavioAPIError(statusCode, msg, responseBody);\n}\n\nfunction sleep(seconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n}\n\nfunction isAbortError(err: unknown): boolean {\n return (\n err instanceof Error &&\n (err.name === \"AbortError\" || err.name === \"TimeoutError\")\n );\n}\n\nfunction getHeader(response: Response, name: string): string | null {\n const headers = response.headers;\n if (headers && typeof headers.get === \"function\") {\n return headers.get(name);\n }\n return null;\n}\n\nexport async function request(options: {\n method: \"GET\" | \"POST\";\n path: string;\n apiKey: string;\n baseUrl: string;\n timeout: number;\n rateLimiter: RateLimiter;\n body?: Record<string, unknown>;\n maxRetries?: number;\n}): Promise<Record<string, unknown>> {\n const url = `${options.baseUrl}${options.path}`;\n const headers = buildHeaders(options.apiKey);\n const retry: RetryConfig = makeRetryConfig(\n options.maxRetries ?? DEFAULT_MAX_RETRIES,\n );\n\n let attempt = 0;\n\n for (;;) {\n await options.rateLimiter.wait();\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), options.timeout);\n\n let response: Response;\n try {\n const fetchOptions: RequestInit = {\n method: options.method,\n headers,\n signal: controller.signal,\n };\n\n if (options.method === \"POST\" && options.body) {\n fetchOptions.body = JSON.stringify(stripUndefined(options.body));\n }\n\n response = await fetch(url, fetchOptions);\n } catch (err) {\n clearTimeout(timeoutId);\n const timedOut = isAbortError(err);\n if (shouldRetryException(retry, attempt)) {\n await sleep(backoff(retry, attempt));\n attempt += 1;\n continue;\n }\n const msg = err instanceof Error ? err.message : String(err);\n if (timedOut) {\n throw new ScavioTimeoutError(msg);\n }\n throw new ScavioConnectionError(msg);\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (response.ok) {\n return (await response.json()) as Record<string, unknown>;\n }\n\n if (shouldRetryStatus(retry, response.status, attempt)) {\n const retryAfter = parseRetryAfter(getHeader(response, \"Retry-After\"));\n await sleep(backoff(retry, attempt, retryAfter));\n attempt += 1;\n continue;\n }\n\n let body: Record<string, unknown> = {};\n try {\n body = (await response.json()) as Record<string, unknown>;\n } catch {\n // ignore parse failures\n }\n handleError(response.status, body);\n }\n}\n","export class RateLimiter {\n private readonly maxPerSecond: number;\n private readonly timestamps: number[] = [];\n private pending: Promise<void> = Promise.resolve();\n\n constructor(maxPerSecond: number) {\n this.maxPerSecond = maxPerSecond;\n }\n\n async wait(): Promise<void> {\n const ticket = this.pending.then(() => this.acquire());\n this.pending = ticket;\n return ticket;\n }\n\n private async acquire(): Promise<void> {\n this.cleanup();\n if (this.timestamps.length >= this.maxPerSecond) {\n const sleepMs = 1000 - (Date.now() - this.timestamps[0]!);\n if (sleepMs > 0) {\n await new Promise<void>((resolve) => setTimeout(resolve, sleepMs));\n }\n this.cleanup();\n }\n this.timestamps.push(Date.now());\n }\n\n private cleanup(): void {\n const now = Date.now();\n while (this.timestamps.length > 0 && now - this.timestamps[0]! >= 1000) {\n this.timestamps.shift();\n }\n }\n}\n","import type { Scavio } from \"../client.js\";\n\nexport interface AmazonSearchOptions {\n /** Product search query (1-500 characters). */\n query: string;\n /** Amazon domain suffix (default 'com', e.g. 'co.uk'). */\n domain?: string;\n /** Country code for localization. */\n country?: string;\n /** Language code. */\n language?: string;\n /** Currency code (ISO 4217, e.g. 'USD'). */\n currency?: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\" | \"tablet\";\n /** Result sort order. */\n sort_by?:\n | \"most_recent\"\n | \"price_low_to_high\"\n | \"price_high_to_low\"\n | \"featured\"\n | \"average_review\"\n | \"bestsellers\";\n /** Starting page (1-indexed). */\n start_page?: number;\n /** Number of pages to fetch. */\n pages?: number;\n /** Amazon category id. */\n category_id?: string;\n /** Filter to a specific merchant. */\n merchant_id?: string;\n /** ZIP/postal code for localized pricing. */\n zip_code?: string;\n /** Auto-select the default variant. */\n autoselect_variant?: boolean;\n [key: string]: unknown;\n}\n\nexport interface AmazonProductOptions {\n /** Amazon ASIN (e.g. 'B09XS7JWHH'). Sent to the API as 'query'. */\n asin: string;\n /** Amazon domain suffix (default 'com'). */\n domain?: string;\n /** Country code for localization. */\n country?: string;\n /** Language code. */\n language?: string;\n /** Currency code (ISO 4217, e.g. 'USD'). */\n currency?: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\" | \"tablet\";\n /** ZIP/postal code for localized pricing. */\n zip_code?: string;\n /** Auto-select the default variant. */\n autoselect_variant?: boolean;\n [key: string]: unknown;\n}\n\nexport class AmazonNamespace {\n constructor(private client: Scavio) {}\n\n async search(\n options: AmazonSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/amazon/search\", options);\n }\n\n async product(\n options: AmazonProductOptions,\n ): Promise<Record<string, unknown>> {\n const { asin, ...rest } = options;\n return this.client._post(\"/api/v1/amazon/product\", {\n query: asin,\n ...rest,\n });\n }\n\n /** Supported Amazon domains, languages, currencies, and countries. */\n async options(): Promise<Record<string, unknown>> {\n return this.client._get(\"/api/v1/amazon/options\");\n }\n}\n","import type { Scavio } from \"../client.js\";\n\n/**\n * Google endpoints (scrape.do engine, /api/v2/google). A faithful passthrough\n * that returns Google's full response. Every endpoint costs 1 credit. Any\n * additional scrape.do parameter can be added to the options object.\n * See https://scavio.dev/docs/search-api.\n */\n\nexport interface GoogleSearchOptions {\n /** Search query (1-500 characters). */\n query: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\";\n /** Result offset: 0 = page 1, 10 = page 2, ... up to 990. */\n start?: number;\n /** Include the raw Google HTML in the response. */\n include_html?: boolean;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Regional Google domain (e.g. 'google.co.uk'). */\n google_domain?: string;\n /** Canonical location name; auto-encoded to a UULE string. */\n location?: string;\n /** Pre-encoded UULE location string (takes priority over location). */\n uule?: string;\n /** Language restrict (e.g. 'lang_en'). */\n lr?: string;\n /** Country restrict (e.g. 'countryUS'). */\n cr?: string;\n /** SafeSearch filter. */\n safe?: \"active\";\n /** Disable spelling correction / auto-fixes when true. */\n nfpr?: boolean;\n /** '0' disables the omitted/similar-results filter. */\n filter?: \"0\" | \"1\";\n /** Restrict results to a recent time window. */\n time_period?:\n | \"last_hour\"\n | \"last_day\"\n | \"last_week\"\n | \"last_month\"\n | \"last_year\";\n /** Resolve a deferred AI Overview (server default true). */\n resolve_ai_overview?: boolean;\n [key: string]: unknown;\n}\n\nexport interface GoogleAiModeOptions {\n /** Question or prompt (1-500 characters). */\n query: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\";\n /** Include the raw Google HTML in the response. */\n include_html?: boolean;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Regional Google domain (e.g. 'google.co.uk'). */\n google_domain?: string;\n /** Canonical location name; auto-encoded to a UULE string. */\n location?: string;\n /** Pre-encoded UULE location string (takes priority over location). */\n uule?: string;\n /** SafeSearch filter. */\n safe?: \"active\";\n [key: string]: unknown;\n}\n\nexport interface GoogleMapsSearchOptions {\n /** Search query (1-500 characters). */\n query: string;\n /** Result offset; must be a multiple of 20 (0, 20, 40, ...). */\n start?: number;\n /** Map center as '@lat,lng,zoomz'; controls where results come from. */\n ll?: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Regional Google domain (e.g. 'google.co.uk'). */\n google_domain?: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleMapsPlaceOptions {\n /** Place ID (ChIJ...). */\n place_id?: string;\n /** Numeric CID. */\n data_cid?: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleMapsReviewsOptions {\n /** Data ID (0xHEX:0xHEX). */\n data_id?: string;\n /** Place ID (ChIJ...). */\n place_id?: string;\n /** Reviews per page (1-20). */\n num?: number;\n /** Pagination cursor from a prior response. */\n next_page_token?: string;\n /** Sort order. */\n sort_by?: \"relevance\" | \"newest\" | \"highest_rating\" | \"lowest_rating\";\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Regional Google domain (e.g. 'google.co.uk'). */\n google_domain?: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleShoppingOptions {\n /** Product search query (1-500 characters). */\n query: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\";\n /** Result offset. */\n start?: number;\n /** Minimum price filter. */\n min_price?: number;\n /** Maximum price filter. */\n max_price?: number;\n /** 0 = relevance, 1 = price ascending, 2 = price descending. */\n sort_by?: number;\n /** Only items with free shipping. */\n free_shipping?: boolean;\n /** Only items on sale. */\n on_sale?: boolean;\n /** Opaque Google Shopping filter token. */\n shoprs?: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Regional Google domain (e.g. 'google.co.uk'). */\n google_domain?: string;\n /** Canonical location name; auto-encoded to a UULE string. */\n location?: string;\n /** Pre-encoded UULE location string (takes priority over location). */\n uule?: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleShoppingProductOptions {\n /** Durable product catalog id. */\n catalog_id?: string;\n /** Product query; required when catalog_id is set. */\n query?: string;\n /** Immersive product page token. */\n immersive_product_page_token?: string;\n /** Alias for immersive_product_page_token. */\n page_token?: string;\n /** Product id. */\n product_id?: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\" | \"tablet\";\n /** Regional Google domain (e.g. 'google.co.uk'). */\n google_domain?: string;\n /** Seller sort order. */\n sort_by?: \"base_price\" | \"total_price\" | \"promotion\" | \"seller_rating\";\n /** Load all available stores. */\n load_all_stores?: boolean;\n /** Fetch additional stores. */\n more_stores?: boolean;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Canonical location name; auto-encoded to a UULE string. */\n location?: string;\n /** Pre-encoded UULE location string (takes priority over location). */\n uule?: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleShoppingStoresOptions {\n /** Durable product catalog id. */\n catalog_id: string;\n /** Pagination cursor from shopping_product. */\n next_page_token: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleFlightsOptions {\n /** Departure IATA code(s); comma-separated allowed. */\n departure_id: string;\n /** Arrival IATA code(s); comma-separated allowed. */\n arrival_id: string;\n /** Outbound date (YYYY-MM-DD). */\n outbound_date: string;\n /** 1 = round trip, 2 = one way, 3 = multi-city. */\n type?: number;\n /** Return date (YYYY-MM-DD); required when type=1. */\n return_date?: string;\n /** Number of adults (1-9). */\n adults?: number;\n /** Number of children (0-9). */\n children?: number;\n /** Infants in seat (0-4). */\n infants_in_seat?: number;\n /** Infants on lap (0-4). */\n infants_on_lap?: number;\n /** 1 = economy, 2 = premium, 3 = business, 4 = first. */\n travel_class?: number;\n /** 0 = any, 1 = nonstop, 2 = <=1 stop, 3 = <=2 stops. */\n stops?: number;\n /** 1 = top, 2 = price, 3 = departure, 4 = arrival, 5 = duration, 6 = emissions. */\n sort_by?: number;\n /** Comma-separated airline codes/alliances to include. */\n include_airlines?: string;\n /** Comma-separated airline codes/alliances to exclude. */\n exclude_airlines?: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Currency code (ISO 4217, e.g. 'USD'). */\n currency?: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleHotelsOptions {\n /** Search query; use a '<City> hotels' form. */\n query: string;\n /** Check-in date (YYYY-MM-DD). */\n check_in_date: string;\n /** Check-out date (YYYY-MM-DD). */\n check_out_date: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Currency code (ISO 4217, e.g. 'USD'). */\n currency?: string;\n /** 3 = lowest price, 8 = highest rating, 13 = most reviewed. */\n sort_by?: number;\n /** Minimum nightly price. */\n min_price?: number;\n /** Maximum nightly price. */\n max_price?: number;\n /** 7 = 3.5+, 8 = 4.0+, 9 = 4.5+. */\n rating?: number;\n /** Comma-separated star ratings (2-5). */\n hotel_class?: string;\n /** Comma-separated amenity ids. */\n amenities?: string;\n /** Comma-separated property-type ids (e.g. '12' for vacation rentals). */\n property_types?: string;\n /** Only properties with free cancellation. */\n free_cancellation?: boolean;\n /** Only eco-certified properties. */\n eco_certified?: boolean;\n /** Only properties with special offers. */\n special_offers?: boolean;\n /** Pagination cursor from a prior response. */\n next_page_token?: string;\n /** Number of properties to return (1-20). */\n limit?: number;\n [key: string]: unknown;\n}\n\nexport interface GoogleHotelsDetailOptions {\n /** Property detail token from a hotels listing. */\n detail_token: string;\n /** Check-in date (YYYY-MM-DD). */\n check_in_date: string;\n /** Check-out date (YYYY-MM-DD). */\n check_out_date: string;\n /** Currency code (ISO 4217, e.g. 'USD'). */\n currency?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleNewsOptions {\n /** Keyword search. */\n query?: string;\n /** Browse a news topic. */\n topic_token?: string;\n /** Browse a topic section. */\n section_token?: string;\n /** Fetch full coverage of a story. */\n story_token?: string;\n /** Browse a publication. */\n publication_token?: string;\n /** Knowledge Graph entity id. */\n kgmid?: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Regional Google domain (e.g. 'google.co.uk'). */\n google_domain?: string;\n /** Sort order: 0 = relevance, 1 = date (only with query or kgmid). */\n so?: number;\n [key: string]: unknown;\n}\n\nexport interface GoogleTrendsOptions {\n /** Search term(s); comma-separated for comparisons. */\n query: string;\n /** Location code (e.g. 'US', 'GB', 'US-CA'). */\n geo?: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Time range (e.g. 'today 12-m', 'now 7-d'). */\n date?: string;\n /** Timezone offset in minutes. */\n tz?: string;\n /** Which trends dataset to return. */\n data_type?:\n | \"TIMESERIES\"\n | \"GEO_MAP\"\n | \"GEO_MAP_0\"\n | \"RELATED_QUERIES\"\n | \"RELATED_TOPICS\";\n /** Category id. */\n cat?: string;\n /** Google property filter. */\n gprop?: \"images\" | \"news\" | \"youtube\" | \"froogle\";\n /** Resolution for GEO_MAP data. */\n region?: \"COUNTRY\" | \"REGION\" | \"DMA\" | \"CITY\";\n [key: string]: unknown;\n}\n\nexport interface GoogleTrendingOptions {\n /** Country code (e.g. 'US'). */\n geo: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Trending window: 4, 24, 48, or 168. */\n hours?: number;\n /** Category id (0-20). */\n cat?: number;\n /** Sort order. */\n sort?: \"relevance\" | \"search_volume\" | \"recency\" | \"title\";\n /** Filter by trend status. */\n status?: \"all\" | \"active\";\n [key: string]: unknown;\n}\n\nexport class GoogleNamespace {\n constructor(private client: Scavio) {}\n\n /** Google SERP search (includes the AI Overview when Google returns one). */\n async search(options: GoogleSearchOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google\", options);\n }\n\n /** Google AI Mode answer. */\n async aiMode(options: GoogleAiModeOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/ai-mode\", options);\n }\n\n /** Google Maps local results. */\n async mapsSearch(options: GoogleMapsSearchOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/maps/search\", options);\n }\n\n /** Google Maps place details. Provide place_id or data_cid. */\n async mapsPlace(options: GoogleMapsPlaceOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/maps/place\", options);\n }\n\n /** Google Maps reviews. Provide data_id or place_id. */\n async mapsReviews(options: GoogleMapsReviewsOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/maps/reviews\", options);\n }\n\n /** Google Shopping search results. */\n async shopping(options: GoogleShoppingOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/shopping\", options);\n }\n\n /** Google Shopping product. Pass catalog_id + query for full details and sellers. */\n async shoppingProduct(\n options: GoogleShoppingProductOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/shopping/product\", options);\n }\n\n /** Google Shopping product sellers (continuation of shoppingProduct). */\n async shoppingStores(\n options: GoogleShoppingStoresOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/shopping/product/stores\", options);\n }\n\n /** Google Flights. */\n async flights(options: GoogleFlightsOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/flights\", options);\n }\n\n /** Google Hotels search. */\n async hotels(options: GoogleHotelsOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/hotels\", options);\n }\n\n /** Google Hotels property details (from a hotels listing detail_token). */\n async hotelsDetail(\n options: GoogleHotelsDetailOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/hotels/detail\", options);\n }\n\n /** Google News. Provide query or a topic/story/publication token. */\n async news(options: GoogleNewsOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/news\", options);\n }\n\n /** Google Trends data. */\n async trends(options: GoogleTrendsOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/trends\", options);\n }\n\n /** Google Trending Now for a country. */\n async trending(options: GoogleTrendingOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/trending\", options);\n }\n}\n","import type { Scavio } from \"../client.js\";\n\n/** Comment / feed sort orders. */\nexport type RedditSort = \"HOT\" | \"NEW\" | \"TOP\" | \"BEST\" | \"CONTROVERSIAL\";\n/** Subreddit feed sort orders. */\nexport type RedditFeedSort =\n | \"BEST\"\n | \"HOT\"\n | \"NEW\"\n | \"TOP\"\n | \"CONTROVERSIAL\"\n | \"RISING\";\n\nexport interface RedditSearchOptions {\n /** Search query (1-500 characters). */\n query: string;\n /** Result type (server default 'posts'). */\n type?: \"posts\" | \"comments\";\n /** Sort order (server default 'new'). */\n sort?: \"new\" | \"relevance\" | \"hot\" | \"top\" | \"comments\";\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface RedditSearchSuggestionsOptions {\n /** Search query (1-500 characters). */\n query: string;\n [key: string]: unknown;\n}\n\nexport interface RedditPostOptions {\n /** Post fullname (t3_...) or bare id. */\n post_id?: string;\n /** Full Reddit post URL. */\n url?: string;\n [key: string]: unknown;\n}\n\nexport interface RedditPostCommentsOptions {\n /** Post fullname (t3_...). */\n post_id: string;\n /** Comment sort order (default 'TOP'). */\n sort?: RedditSort;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface RedditCommentRepliesOptions {\n /** Post fullname (t3_...). */\n post_id: string;\n /** reply_cursor from a comment in the comments endpoint. */\n cursor: string;\n /** Comment sort order (default 'TOP'). */\n sort?: RedditSort;\n [key: string]: unknown;\n}\n\nexport interface RedditSubredditOptions {\n /** Subreddit name (without r/). */\n subreddit: string;\n [key: string]: unknown;\n}\n\nexport interface RedditSubredditPostsOptions {\n /** Subreddit name (without r/). */\n subreddit: string;\n /** Feed sort order (default 'HOT'). */\n sort?: RedditFeedSort;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface RedditUserOptions {\n /** Redditor username (without u/). */\n username: string;\n [key: string]: unknown;\n}\n\nexport interface RedditUserFeedOptions {\n /** Redditor username (without u/). */\n username: string;\n /** Sort order (default 'NEW'). */\n sort?: RedditSort;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface RedditPopularOptions {\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport class RedditNamespace {\n constructor(private client: Scavio) {}\n\n async search(\n options: RedditSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/search\", options);\n }\n\n async searchSuggestions(\n options: RedditSearchSuggestionsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/search/suggestions\", options);\n }\n\n async post(options: RedditPostOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/post\", options);\n }\n\n async postComments(\n options: RedditPostCommentsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/post/comments\", options);\n }\n\n async commentReplies(\n options: RedditCommentRepliesOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/post/comments/replies\", options);\n }\n\n async subreddit(\n options: RedditSubredditOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/subreddit\", options);\n }\n\n async subredditPosts(\n options: RedditSubredditPostsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/subreddit/posts\", options);\n }\n\n async user(options: RedditUserOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/user\", options);\n }\n\n async userPosts(\n options: RedditUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/user/posts\", options);\n }\n\n async userComments(\n options: RedditUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/user/comments\", options);\n }\n\n async popular(\n options: RedditPopularOptions = {},\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/popular\", options);\n }\n\n async trending(): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/trending\", {});\n }\n}\n","import type { Scavio } from \"../client.js\";\n\nexport interface TikTokProfileOptions {\n /** TikTok @username (without the @). */\n username?: string;\n /** TikTok sec_user_id. */\n sec_user_id?: string;\n [key: string]: unknown;\n}\n\nexport interface TikTokUserPostsOptions {\n /** TikTok sec_user_id. */\n sec_user_id: string;\n /** Pagination cursor (default '0'). */\n cursor?: string;\n /** Results per page (1-30). */\n count?: number;\n /** '0' = latest, '1' = popular. */\n sort_type?: \"0\" | \"1\";\n [key: string]: unknown;\n}\n\nexport interface TikTokVideoOptions {\n /** TikTok video id. */\n video_id: string;\n [key: string]: unknown;\n}\n\nexport interface TikTokVideoCommentsOptions {\n /** TikTok video id. */\n video_id: string;\n /** Pagination cursor (default '0'). */\n cursor?: string;\n /** Results per page (1-50). */\n count?: number;\n [key: string]: unknown;\n}\n\nexport interface TikTokCommentRepliesOptions {\n /** TikTok video id. */\n video_id: string;\n /** Parent comment id. */\n comment_id: string;\n /** Pagination cursor (default '0'). */\n cursor?: string;\n /** Results per page (1-50). */\n count?: number;\n [key: string]: unknown;\n}\n\nexport interface TikTokSearchVideosOptions {\n /** Search keyword (1-500 characters). */\n keyword: string;\n /** Pagination cursor (default '0'). */\n cursor?: string;\n /** Results per page (1-30). */\n count?: number;\n /** '0' = relevance, '1' = most likes. */\n sort_type?: \"0\" | \"1\";\n /** Age filter in days: 0 = all time, 1, 7, 30, 90, 180. */\n publish_time?: \"0\" | \"1\" | \"7\" | \"30\" | \"90\" | \"180\";\n [key: string]: unknown;\n}\n\nexport interface TikTokSearchUsersOptions {\n /** Search keyword (1-500 characters). */\n keyword: string;\n /** Pagination cursor (default '0'). */\n cursor?: string;\n /** Results per page (1-30). */\n count?: number;\n [key: string]: unknown;\n}\n\nexport interface TikTokHashtagOptions {\n /** Hashtag name (without the #). */\n hashtag_name?: string;\n /** Hashtag id. */\n hashtag_id?: string;\n [key: string]: unknown;\n}\n\nexport interface TikTokHashtagVideosOptions {\n /** Hashtag id. */\n hashtag_id: string;\n /** Pagination cursor (default '0'). */\n cursor?: string;\n /** Results per page (1-30). */\n count?: number;\n [key: string]: unknown;\n}\n\nexport interface TikTokUserFollowersOptions {\n /** TikTok sec_user_id. */\n sec_user_id: string;\n /** Results per page (1-20). */\n count?: number;\n /** Pagination token from a prior response. */\n page_token?: string;\n /** Minimum timestamp cursor. */\n min_time?: number;\n [key: string]: unknown;\n}\n\nexport interface TikTokUserFollowingsOptions {\n /** TikTok sec_user_id. */\n sec_user_id: string;\n /** Results per page (1-20). */\n count?: number;\n /** Pagination token from a prior response. */\n page_token?: string;\n /** Minimum timestamp cursor. */\n min_time?: number;\n [key: string]: unknown;\n}\n\nexport class TikTokNamespace {\n constructor(private client: Scavio) {}\n\n async profile(\n options: TikTokProfileOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/profile\", options);\n }\n\n async userPosts(\n options: TikTokUserPostsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/user/posts\", options);\n }\n\n async video(\n options: TikTokVideoOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/video\", options);\n }\n\n async videoComments(\n options: TikTokVideoCommentsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/video/comments\", options);\n }\n\n async commentReplies(\n options: TikTokCommentRepliesOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/video/comments/replies\", options);\n }\n\n async searchVideos(\n options: TikTokSearchVideosOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/search/videos\", options);\n }\n\n async searchUsers(\n options: TikTokSearchUsersOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/search/users\", options);\n }\n\n async hashtag(\n options: TikTokHashtagOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/hashtag\", options);\n }\n\n async hashtagVideos(\n options: TikTokHashtagVideosOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/hashtag/videos\", options);\n }\n\n async userFollowers(\n options: TikTokUserFollowersOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/user/followers\", options);\n }\n\n async userFollowings(\n options: TikTokUserFollowingsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/user/followings\", options);\n }\n}\n","import type { Scavio } from \"../client.js\";\n\nexport interface InstagramProfileOptions {\n /** Instagram username (without the @). */\n username?: string;\n /** Instagram numeric user id. */\n user_id?: string;\n [key: string]: unknown;\n}\n\nexport interface InstagramUserFeedOptions {\n /** Instagram username (without the @). */\n username?: string;\n /** Instagram numeric user id. */\n user_id?: string;\n /** Results per page (1-50). */\n count?: number;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface InstagramStoriesOptions {\n /** Instagram username (without the @). */\n username?: string;\n /** Instagram numeric user id. */\n user_id?: string;\n [key: string]: unknown;\n}\n\nexport interface InstagramPostOptions {\n /** Full Instagram post URL. */\n url?: string;\n /** Instagram media id. */\n media_id?: string;\n /** Instagram shortcode (from the post URL). */\n shortcode?: string;\n [key: string]: unknown;\n}\n\nexport interface InstagramPostCommentsOptions {\n /** Instagram shortcode (from the post URL). */\n shortcode?: string;\n /** Full Instagram post URL. */\n url?: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n /** Comment sort order. */\n sort_order?: \"popular\" | \"newest\";\n [key: string]: unknown;\n}\n\nexport interface InstagramCommentRepliesOptions {\n /** Instagram media id. */\n media_id: string;\n /** Parent comment id. */\n comment_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface InstagramSearchOptions {\n /** Search keyword (1-500 characters). */\n keyword: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface InstagramFollowOptions {\n /** Instagram username (without the @). */\n username?: string;\n /** Instagram numeric user id. */\n user_id?: string;\n /** Results per page (1-100). */\n count?: number;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport class InstagramNamespace {\n constructor(private client: Scavio) {}\n\n async profile(\n options: InstagramProfileOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/profile\", options);\n }\n\n async userPosts(\n options: InstagramUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/user/posts\", options);\n }\n\n async userReels(\n options: InstagramUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/user/reels\", options);\n }\n\n async userTagged(\n options: InstagramUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/user/tagged\", options);\n }\n\n async userStories(\n options: InstagramStoriesOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/user/stories\", options);\n }\n\n async post(\n options: InstagramPostOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/post\", options);\n }\n\n async postComments(\n options: InstagramPostCommentsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/post/comments\", options);\n }\n\n async commentReplies(\n options: InstagramCommentRepliesOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/post/comments/replies\", options);\n }\n\n async searchUsers(\n options: InstagramSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/search/users\", options);\n }\n\n async searchHashtags(\n options: InstagramSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/search/hashtags\", options);\n }\n\n async userFollowers(\n options: InstagramFollowOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/user/followers\", options);\n }\n\n async userFollowings(\n options: InstagramFollowOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/user/followings\", options);\n }\n}\n","import type { Scavio } from \"../client.js\";\n\nexport interface WalmartSearchOptions {\n /** Product search query (1-500 characters). */\n query: string;\n /** Walmart domain. */\n domain?: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\" | \"tablet\";\n /** Result sort order. */\n sort_by?: \"best_match\" | \"price_low\" | \"price_high\" | \"best_seller\";\n /** Starting page (1-indexed). */\n start_page?: number;\n /** Minimum price filter (USD). */\n min_price?: number;\n /** Maximum price filter (USD). */\n max_price?: number;\n /** Delivery speed filter. */\n fulfillment_speed?: \"today\" | \"tomorrow\" | \"2_days\" | \"anytime\";\n /** Fulfillment type filter. */\n fulfillment_type?: \"in_store\";\n /** ZIP code for localized results. */\n delivery_zip?: string;\n /** Store id for in-store availability. */\n store_id?: string;\n [key: string]: unknown;\n}\n\nexport interface WalmartProductOptions {\n /** Walmart product id. */\n product_id: string;\n /** Walmart domain. */\n domain?: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\" | \"tablet\";\n /** ZIP code for localized pricing. */\n delivery_zip?: string;\n /** Store id for in-store availability. */\n store_id?: string;\n [key: string]: unknown;\n}\n\nexport class WalmartNamespace {\n constructor(private client: Scavio) {}\n\n async search(\n options: WalmartSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/walmart/search\", options);\n }\n\n async product(\n options: WalmartProductOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/walmart/product\", options);\n }\n}\n","import type { Scavio } from \"../client.js\";\n\nexport interface YouTubeSearchOptions {\n /** Search query (1-500 characters). Sent to the API as 'search'. */\n query: string;\n /** Filter by upload date. */\n upload_date?: \"last_hour\" | \"today\" | \"this_week\" | \"this_month\" | \"this_year\";\n /** Filter by result type. */\n type?: \"video\" | \"channel\" | \"playlist\" | \"movie\";\n /** short (<4 min), medium (4-20 min), long (>20 min). */\n duration?: \"short\" | \"medium\" | \"long\";\n /** Sort order. */\n sort_by?: \"relevance\" | \"date\" | \"view_count\" | \"rating\";\n /**\n * Feature filters, e.g. [\"hd\", \"4k\", \"subtitles\", \"creative_commons\",\n * \"live\", \"360\", \"3d\", \"hdr\", \"vr180\"].\n */\n features?: string[];\n /** Pagination cursor from a prior response. */\n cursor?: string;\n /** HD videos only. */\n hd?: boolean;\n /** Videos with subtitles/CC only. */\n subtitles?: boolean;\n /** Creative Commons licensed only. */\n creative_commons?: boolean;\n /** Live videos only. */\n live?: boolean;\n /** HDR videos only. */\n hdr?: boolean;\n /** Videos with location metadata only. */\n location?: boolean;\n /** VR180 videos only. */\n vr180?: boolean;\n /** 4K videos only. Sent to the API as '4k'. */\n fourK?: boolean;\n /** 360-degree videos only. Sent to the API as '360'. */\n video_360?: boolean;\n /** 3D videos only. Sent to the API as '3d'. */\n video_3d?: boolean;\n [key: string]: unknown;\n}\n\nexport interface YouTubeShortsOptions {\n /** Search query (1-500 characters). Sent to the API as 'search'. */\n query: string;\n /** Sort order. */\n sort_by?: \"relevance\" | \"date\" | \"view_count\" | \"rating\";\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeSuggestionsOptions {\n /** Search query (1-500 characters). Sent to the API as 'search'. */\n query: string;\n /** Language code for suggestions (default 'en'). */\n language?: string;\n /** Region code for suggestions (default 'US'). */\n region?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeVideoOptions {\n /** YouTube video id (e.g. 'dQw4w9WgXcQ') or a full watch URL. */\n video_id: string;\n [key: string]: unknown;\n}\n\n/** @deprecated Use YouTubeVideoOptions with youtube.video(). */\nexport interface YouTubeMetadataOptions {\n /** YouTube video id (e.g. 'dQw4w9WgXcQ') or a full watch URL. */\n video_id: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeCommentsOptions {\n /** YouTube video id or a full watch URL. */\n video_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeCommentRepliesOptions {\n /** YouTube video id or a full watch URL. */\n video_id: string;\n /** Reply cursor from a parent comment's 'reply_cursor'. */\n reply_cursor: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeTranscriptOptions {\n /** YouTube video id or a full watch URL. */\n video_id: string;\n /** Caption language code (default 'en'). */\n language?: string;\n /** 'text' for plain transcript, 'srt' for timed subtitles (default 'text'). */\n format?: \"text\" | \"srt\";\n [key: string]: unknown;\n}\n\nexport interface YouTubeRelatedOptions {\n /** YouTube video id or a full watch URL. */\n video_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeChannelSearchOptions {\n /** Search query (1-500 characters). Sent to the API as 'search'. */\n query: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeChannelOptions {\n /** YouTube channel id, @handle, or channel URL. */\n channel_id: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeChannelVideosOptions {\n /** YouTube channel id. */\n channel_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeChannelShortsOptions {\n /** YouTube channel id. */\n channel_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeChannelCommunityOptions {\n /** YouTube channel id. */\n channel_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeChannelResolveOptions {\n /** A channel @handle or channel URL to resolve to a channel id. */\n channel: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeStreamsOptions {\n /** YouTube video id or a full watch URL. */\n video_id: string;\n [key: string]: unknown;\n}\n\nexport class YouTubeNamespace {\n constructor(private client: Scavio) {}\n\n async search(\n options: YouTubeSearchOptions,\n ): Promise<Record<string, unknown>> {\n const { query, fourK, video_360, video_3d, ...rest } = options;\n const body: Record<string, unknown> = {\n search: query,\n ...rest,\n };\n if (fourK !== undefined) body[\"4k\"] = fourK;\n if (video_360 !== undefined) body[\"360\"] = video_360;\n if (video_3d !== undefined) body[\"3d\"] = video_3d;\n return this.client._post(\"/api/v1/youtube/search\", body);\n }\n\n async shorts(\n options: YouTubeShortsOptions,\n ): Promise<Record<string, unknown>> {\n const { query, ...rest } = options;\n return this.client._post(\"/api/v1/youtube/shorts\", {\n search: query,\n ...rest,\n });\n }\n\n async suggestions(\n options: YouTubeSuggestionsOptions,\n ): Promise<Record<string, unknown>> {\n const { query, ...rest } = options;\n return this.client._post(\"/api/v1/youtube/suggestions\", {\n search: query,\n ...rest,\n });\n }\n\n async video(\n options: YouTubeVideoOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/video\", options);\n }\n\n /** @deprecated Use youtube.video(). Alias kept for backward compatibility. */\n async metadata(\n options: YouTubeMetadataOptions,\n ): Promise<Record<string, unknown>> {\n return this.video(options);\n }\n\n async comments(\n options: YouTubeCommentsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/comments\", options);\n }\n\n async commentReplies(\n options: YouTubeCommentRepliesOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/comments/replies\", options);\n }\n\n async transcript(\n options: YouTubeTranscriptOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/transcript\", options);\n }\n\n async related(\n options: YouTubeRelatedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/related\", options);\n }\n\n async channelSearch(\n options: YouTubeChannelSearchOptions,\n ): Promise<Record<string, unknown>> {\n const { query, ...rest } = options;\n return this.client._post(\"/api/v1/youtube/channel/search\", {\n search: query,\n ...rest,\n });\n }\n\n async channel(\n options: YouTubeChannelOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/channel\", options);\n }\n\n async channelVideos(\n options: YouTubeChannelVideosOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/channel/videos\", options);\n }\n\n async channelShorts(\n options: YouTubeChannelShortsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/channel/shorts\", options);\n }\n\n async channelCommunity(\n options: YouTubeChannelCommunityOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/channel/community\", options);\n }\n\n async channelResolve(\n options: YouTubeChannelResolveOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/channel/resolve\", options);\n }\n\n async streams(\n options: YouTubeStreamsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/streams\", options);\n }\n}\n","import type { Scavio } from \"../client.js\";\n\nexport interface TwitterSearchOptions {\n /** Search query (1-500 characters). */\n search: string;\n /** Result category (default 'Top'). */\n search_type?: \"Top\" | \"Latest\" | \"People\" | \"Photos\" | \"Videos\";\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface TwitterTweetOptions {\n /** Tweet id. */\n tweet_id: string;\n [key: string]: unknown;\n}\n\nexport interface TwitterTweetCommentsOptions {\n /** Tweet id. */\n tweet_id: string;\n /** 'top' (ranked) or 'latest' (chronological); default 'top'. */\n rank?: \"top\" | \"latest\";\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface TwitterTweetRetweetersOptions {\n /** Tweet id. */\n tweet_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface TwitterUserOptions {\n /** A Twitter handle (without the @). */\n screen_name: string;\n [key: string]: unknown;\n}\n\nexport interface TwitterUserFeedOptions {\n /** A Twitter handle (without the @). */\n screen_name: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface TwitterTrendingOptions {\n /** Country name (default 'UnitedStates'). */\n country?: string;\n [key: string]: unknown;\n}\n\nexport class TwitterNamespace {\n constructor(private client: Scavio) {}\n\n async search(\n options: TwitterSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/twitter/search\", options);\n }\n\n async tweet(\n options: TwitterTweetOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/twitter/tweet\", options);\n }\n\n async tweetComments(\n options: TwitterTweetCommentsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/twitter/tweet/comments\", options);\n }\n\n async tweetRetweeters(\n options: TwitterTweetRetweetersOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/twitter/tweet/retweeters\", options);\n }\n\n async user(\n options: TwitterUserOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/twitter/user\", options);\n }\n\n async userTweets(\n options: TwitterUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/twitter/user/tweets\", options);\n }\n\n async userReplies(\n options: TwitterUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/twitter/user/replies\", options);\n }\n\n async userMedia(\n options: TwitterUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/twitter/user/media\", options);\n }\n\n async userFollowers(\n options: TwitterUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/twitter/user/followers\", options);\n }\n\n async userFollowings(\n options: TwitterUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/twitter/user/followings\", options);\n }\n\n async trending(\n options: TwitterTrendingOptions = {},\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/twitter/trending\", options);\n }\n}\n","import type { Scavio } from \"../client.js\";\n\nexport interface LinkedInPersonOptions {\n /** Public identifier (vanity handle). */\n username: string;\n /** Include the experiences section (default true server-side). */\n include_experiences?: boolean;\n /** Include the educations section (default true server-side). */\n include_educations?: boolean;\n /** Include the skills section (default true server-side). */\n include_skills?: boolean;\n /** Include the certifications section (default true server-side). */\n include_certifications?: boolean;\n /** Include follower and connection counts (default true server-side). */\n include_follower_and_connection?: boolean;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPersonRefOptions {\n /** Member urn. */\n urn?: string;\n /** Public identifier; resolved to a urn if urn is omitted. */\n username?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPersonPostsOptions {\n /** Member urn. */\n urn?: string;\n /** Public identifier; resolved to a urn if urn is omitted. */\n username?: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPersonContactOptions {\n /** Public identifier (vanity handle). */\n username: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInCompanyOptions {\n /** Company universal name (slug) or LinkedIn company URL. */\n company: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInCompanyPostsOptions {\n /** Company universal name (slug) or LinkedIn company URL. */\n company: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n /** Results per page (1-100). */\n count?: number;\n [key: string]: unknown;\n}\n\nexport interface LinkedInCompanyRefOptions {\n /** Numeric company id. */\n company_id?: string;\n /** Company slug/url; resolved to a company_id if company_id is omitted. */\n company?: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInSearchPeopleOptions {\n /** Name to search for. */\n search?: string;\n /** Job title filter. */\n title?: string;\n /** Company filter. */\n company?: string;\n /** School filter. */\n school?: string;\n /** A geo name or id to filter by. */\n location?: string;\n /** Page cursor (page number). */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInSearchJobsOptions {\n /** Search query (1-500 characters). */\n search: string;\n /** Page cursor (page number). */\n cursor?: string;\n /** Date-posted filter. */\n date_posted?: string;\n /** Geo code to filter by. */\n geocode?: string;\n /** Experience level filter. */\n experience_level?: string;\n /** Remote filter. */\n remote?: string;\n /** Job type filter. */\n job_type?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInSearchPostsOptions {\n /** Search query (1-500 characters). */\n search: string;\n /** Page cursor (page number). */\n cursor?: string;\n /** Date-posted filter. */\n date_posted?: string;\n /** Sort order. */\n sort_by?: string;\n /** Content type filter. */\n content_type?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInJobOptions {\n /** Job listing id. */\n job_id: string;\n /** Include the required-skills section. */\n include_skills?: boolean;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPostOptions {\n /** Post id or activity urn. */\n post_id: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPostCommentsOptions {\n /** Post id or activity urn. */\n post_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n /** Comment sort order. */\n sort_order?: \"relevance\" | \"recent\";\n /** Post type. */\n post_type?: \"activity\" | \"ugc\";\n [key: string]: unknown;\n}\n\nexport class LinkedInNamespace {\n constructor(private client: Scavio) {}\n\n async person(\n options: LinkedInPersonOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/person\", options);\n }\n\n async personAbout(\n options: LinkedInPersonRefOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/person/about\", options);\n }\n\n async personPosts(\n options: LinkedInPersonPostsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/person/posts\", options);\n }\n\n async personContact(\n options: LinkedInPersonContactOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/person/contact\", options);\n }\n\n async company(\n options: LinkedInCompanyOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/company\", options);\n }\n\n async companyPosts(\n options: LinkedInCompanyPostsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/company/posts\", options);\n }\n\n async companyPeople(\n options: LinkedInCompanyRefOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/company/people\", options);\n }\n\n async companyJobs(\n options: LinkedInCompanyRefOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/company/jobs\", options);\n }\n\n async searchPeople(\n options: LinkedInSearchPeopleOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/search/people\", options);\n }\n\n async searchJobs(\n options: LinkedInSearchJobsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/search/jobs\", options);\n }\n\n async searchPosts(\n options: LinkedInSearchPostsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/search/posts\", options);\n }\n\n async job(\n options: LinkedInJobOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/job\", options);\n }\n\n async post(\n options: LinkedInPostOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/post\", options);\n }\n\n async postComments(\n options: LinkedInPostCommentsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/post/comments\", options);\n }\n}\n","import { MissingAPIKeyError, ScavioError } from \"./errors.js\";\nimport { BASE_URL, DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT, request } from \"./http.js\";\nimport { RateLimiter } from \"./rate-limiter.js\";\nimport { AmazonNamespace } from \"./namespaces/amazon.js\";\nimport type { GoogleSearchOptions } from \"./namespaces/google.js\";\nimport { GoogleNamespace } from \"./namespaces/google.js\";\nimport { RedditNamespace } from \"./namespaces/reddit.js\";\nimport { TikTokNamespace } from \"./namespaces/tiktok.js\";\nimport { InstagramNamespace } from \"./namespaces/instagram.js\";\nimport { WalmartNamespace } from \"./namespaces/walmart.js\";\nimport { YouTubeNamespace } from \"./namespaces/youtube.js\";\nimport { TwitterNamespace } from \"./namespaces/twitter.js\";\nimport { LinkedInNamespace } from \"./namespaces/linkedin.js\";\n\nexport interface ScavioConfig {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n maxRequestsPerSecond?: number;\n /**\n * Additional retry attempts after the first request on transient failures\n * (HTTP 429/500/502/503/504 and network/timeout errors). Defaults to 2.\n * Set to 0 to disable retries.\n */\n maxRetries?: number;\n}\n\nexport class Scavio {\n readonly google: GoogleNamespace;\n readonly amazon: AmazonNamespace;\n readonly walmart: WalmartNamespace;\n readonly youtube: YouTubeNamespace;\n readonly reddit: RedditNamespace;\n readonly tiktok: TikTokNamespace;\n readonly instagram: InstagramNamespace;\n readonly twitter: TwitterNamespace;\n readonly linkedin: LinkedInNamespace;\n\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly rateLimiter: RateLimiter;\n\n constructor(config?: ScavioConfig) {\n this.apiKey = config?.apiKey ?? process.env.SCAVIO_API_KEY ?? \"\";\n if (!this.apiKey) {\n throw new MissingAPIKeyError();\n }\n\n this.baseUrl = (config?.baseUrl ?? BASE_URL).replace(/\\/+$/, \"\");\n this.timeout = config?.timeout ?? DEFAULT_TIMEOUT;\n this.maxRetries = config?.maxRetries ?? DEFAULT_MAX_RETRIES;\n\n const rps = config?.maxRequestsPerSecond ?? 1;\n if (rps < 1 || rps > 10) {\n throw new ScavioError(\"maxRequestsPerSecond must be between 1 and 10\");\n }\n this.rateLimiter = new RateLimiter(rps);\n\n this.google = new GoogleNamespace(this);\n this.amazon = new AmazonNamespace(this);\n this.walmart = new WalmartNamespace(this);\n this.youtube = new YouTubeNamespace(this);\n this.reddit = new RedditNamespace(this);\n this.tiktok = new TikTokNamespace(this);\n this.instagram = new InstagramNamespace(this);\n this.twitter = new TwitterNamespace(this);\n this.linkedin = new LinkedInNamespace(this);\n }\n\n /** @internal */\n async _post(\n path: string,\n body: object,\n ): Promise<Record<string, unknown>> {\n return request({\n method: \"POST\",\n path,\n apiKey: this.apiKey,\n baseUrl: this.baseUrl,\n timeout: this.timeout,\n maxRetries: this.maxRetries,\n rateLimiter: this.rateLimiter,\n body: body as Record<string, unknown>,\n });\n }\n\n /** @internal */\n async _get(path: string): Promise<Record<string, unknown>> {\n return request({\n method: \"GET\",\n path,\n apiKey: this.apiKey,\n baseUrl: this.baseUrl,\n timeout: this.timeout,\n maxRetries: this.maxRetries,\n rateLimiter: this.rateLimiter,\n });\n }\n\n async search(\n options: GoogleSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.google.search(options);\n }\n\n async getUsage(): Promise<Record<string, unknown>> {\n return this._get(\"/api/v1/usage\");\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/retry.ts","../src/http.ts","../src/rate-limiter.ts","../src/namespaces/amazon.ts","../src/namespaces/google.ts","../src/namespaces/reddit.ts","../src/namespaces/tiktok.ts","../src/namespaces/instagram.ts","../src/namespaces/walmart.ts","../src/namespaces/youtube.ts","../src/namespaces/x.ts","../src/namespaces/linkedin.ts","../src/client.ts"],"sourcesContent":["export class ScavioError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ScavioError\";\n }\n}\n\nexport class MissingAPIKeyError extends ScavioError {\n constructor() {\n super(\n \"No API key provided. Pass apiKey or set the SCAVIO_API_KEY \" +\n \"environment variable. Get your free key at https://dashboard.scavio.dev\",\n );\n this.name = \"MissingAPIKeyError\";\n }\n}\n\n/** The request could not reach the API (DNS, connection reset, TLS, ...). */\nexport class ScavioConnectionError extends ScavioError {\n constructor(message = \"Connection error\") {\n super(message);\n this.name = \"ScavioConnectionError\";\n }\n}\n\n/** The request did not complete within the configured timeout. */\nexport class ScavioTimeoutError extends ScavioError {\n constructor(message = \"Request timed out\") {\n super(message);\n this.name = \"ScavioTimeoutError\";\n }\n}\n\nexport class InvalidAPIKeyError extends ScavioError {\n public readonly statusCode = 401;\n public readonly responseBody?: Record<string, unknown>;\n\n constructor(message = \"Invalid API key\", responseBody?: Record<string, unknown>) {\n super(message);\n this.name = \"InvalidAPIKeyError\";\n this.responseBody = responseBody;\n }\n}\n\nexport class InsufficientCreditsError extends ScavioError {\n public readonly statusCode = 402;\n public readonly responseBody?: Record<string, unknown>;\n\n constructor(message = \"Insufficient credits\", responseBody?: Record<string, unknown>) {\n super(message);\n this.name = \"InsufficientCreditsError\";\n this.responseBody = responseBody;\n }\n}\n\nexport class BadRequestError extends ScavioError {\n public readonly statusCode = 400;\n public readonly responseBody?: Record<string, unknown>;\n\n constructor(message = \"Bad request\", responseBody?: Record<string, unknown>) {\n super(message);\n this.name = \"BadRequestError\";\n this.responseBody = responseBody;\n }\n}\n\nexport class NotFoundError extends ScavioError {\n public readonly statusCode = 404;\n public readonly responseBody?: Record<string, unknown>;\n\n constructor(message = \"Not found\", responseBody?: Record<string, unknown>) {\n super(message);\n this.name = \"NotFoundError\";\n this.responseBody = responseBody;\n }\n}\n\nexport class RateLimitError extends ScavioError {\n public readonly statusCode = 429;\n public readonly responseBody?: Record<string, unknown>;\n\n constructor(message = \"Rate limit exceeded\", responseBody?: Record<string, unknown>) {\n super(message);\n this.name = \"RateLimitError\";\n this.responseBody = responseBody;\n }\n}\n\nexport class ScavioAPIError extends ScavioError {\n public readonly statusCode: number;\n public readonly responseBody?: Record<string, unknown>;\n\n constructor(\n statusCode: number,\n message: string,\n responseBody?: Record<string, unknown>,\n ) {\n super(`API error ${statusCode}: ${message}`);\n this.name = \"ScavioAPIError\";\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n }\n}\n","/**\n * Retry policy: exponential backoff with full jitter and Retry-After support.\n * Mirrors the Python SDK's RetryConfig.\n */\n\n/** Statuses that are safe to retry: rate limiting plus transient upstream errors. */\nexport const DEFAULT_RETRY_STATUSES: ReadonlySet<number> = new Set([\n 429, 500, 502, 503, 504,\n]);\n\nexport interface RetryConfig {\n /** Additional attempts after the first request. 0 disables retries. */\n maxRetries: number;\n /** Base backoff in seconds; attempt n waits up to baseDelay * 2**n before jitter. */\n baseDelay: number;\n /** Upper bound (seconds) on any single backoff wait. */\n maxDelay: number;\n /** HTTP status codes that trigger a retry. */\n retryStatuses: ReadonlySet<number>;\n}\n\nexport function makeRetryConfig(maxRetries: number): RetryConfig {\n return {\n maxRetries,\n baseDelay: 0.5,\n maxDelay: 8.0,\n retryStatuses: DEFAULT_RETRY_STATUSES,\n };\n}\n\nexport function shouldRetryStatus(\n config: RetryConfig,\n statusCode: number,\n attempt: number,\n): boolean {\n return attempt < config.maxRetries && config.retryStatuses.has(statusCode);\n}\n\nexport function shouldRetryException(\n config: RetryConfig,\n attempt: number,\n): boolean {\n return attempt < config.maxRetries;\n}\n\n/**\n * Seconds to sleep before the next attempt. Honors a Retry-After value when\n * present; otherwise uses exponential backoff with full jitter.\n */\nexport function backoff(\n config: RetryConfig,\n attempt: number,\n retryAfter?: number,\n): number {\n if (retryAfter !== undefined) {\n return Math.min(Math.max(retryAfter, 0), config.maxDelay);\n }\n const capped = Math.min(config.maxDelay, config.baseDelay * 2 ** attempt);\n return Math.random() * capped;\n}\n\n/** Parse a Retry-After header (delta-seconds or HTTP-date) to seconds. */\nexport function parseRetryAfter(header: string | null): number | undefined {\n if (!header) return undefined;\n const trimmed = header.trim();\n const asNumber = Number(trimmed);\n if (!Number.isNaN(asNumber) && trimmed !== \"\") {\n return asNumber;\n }\n const asDate = Date.parse(trimmed);\n if (!Number.isNaN(asDate)) {\n return Math.max((asDate - Date.now()) / 1000, 0);\n }\n return undefined;\n}\n","import {\n BadRequestError,\n InsufficientCreditsError,\n InvalidAPIKeyError,\n NotFoundError,\n RateLimitError,\n ScavioAPIError,\n ScavioConnectionError,\n ScavioTimeoutError,\n} from \"./errors.js\";\nimport type { RateLimiter } from \"./rate-limiter.js\";\nimport {\n backoff,\n makeRetryConfig,\n parseRetryAfter,\n shouldRetryException,\n shouldRetryStatus,\n type RetryConfig,\n} from \"./retry.js\";\n\nexport const BASE_URL = \"https://api.scavio.dev\";\nexport const DEFAULT_TIMEOUT = 30_000;\nexport const DEFAULT_MAX_RETRIES = 2;\n\nfunction buildHeaders(apiKey: string): Record<string, string> {\n return {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"X-Client-Source\": \"scavio-js\",\n };\n}\n\nfunction stripUndefined(\n obj: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction handleError(statusCode: number, body: Record<string, unknown>): never {\n let error = body.error ?? \"Unknown error\";\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n error = (error as { message: string }).message;\n }\n const msg = String(error);\n const responseBody = Object.keys(body).length > 0 ? body : undefined;\n\n if (statusCode === 400) throw new BadRequestError(msg, responseBody);\n if (statusCode === 401) throw new InvalidAPIKeyError(msg, responseBody);\n if (statusCode === 402) throw new InsufficientCreditsError(msg, responseBody);\n if (statusCode === 404) throw new NotFoundError(msg, responseBody);\n if (statusCode === 429) throw new RateLimitError(msg, responseBody);\n throw new ScavioAPIError(statusCode, msg, responseBody);\n}\n\nfunction sleep(seconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n}\n\nfunction isAbortError(err: unknown): boolean {\n return (\n err instanceof Error &&\n (err.name === \"AbortError\" || err.name === \"TimeoutError\")\n );\n}\n\nfunction getHeader(response: Response, name: string): string | null {\n const headers = response.headers;\n if (headers && typeof headers.get === \"function\") {\n return headers.get(name);\n }\n return null;\n}\n\nexport async function request(options: {\n method: \"GET\" | \"POST\";\n path: string;\n apiKey: string;\n baseUrl: string;\n timeout: number;\n rateLimiter: RateLimiter;\n body?: Record<string, unknown>;\n maxRetries?: number;\n}): Promise<Record<string, unknown>> {\n const url = `${options.baseUrl}${options.path}`;\n const headers = buildHeaders(options.apiKey);\n const retry: RetryConfig = makeRetryConfig(\n options.maxRetries ?? DEFAULT_MAX_RETRIES,\n );\n\n let attempt = 0;\n\n for (;;) {\n await options.rateLimiter.wait();\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), options.timeout);\n\n let response: Response;\n try {\n const fetchOptions: RequestInit = {\n method: options.method,\n headers,\n signal: controller.signal,\n };\n\n if (options.method === \"POST\" && options.body) {\n fetchOptions.body = JSON.stringify(stripUndefined(options.body));\n }\n\n response = await fetch(url, fetchOptions);\n } catch (err) {\n clearTimeout(timeoutId);\n const timedOut = isAbortError(err);\n if (shouldRetryException(retry, attempt)) {\n await sleep(backoff(retry, attempt));\n attempt += 1;\n continue;\n }\n const msg = err instanceof Error ? err.message : String(err);\n if (timedOut) {\n throw new ScavioTimeoutError(msg);\n }\n throw new ScavioConnectionError(msg);\n } finally {\n clearTimeout(timeoutId);\n }\n\n if (response.ok) {\n return (await response.json()) as Record<string, unknown>;\n }\n\n if (shouldRetryStatus(retry, response.status, attempt)) {\n const retryAfter = parseRetryAfter(getHeader(response, \"Retry-After\"));\n await sleep(backoff(retry, attempt, retryAfter));\n attempt += 1;\n continue;\n }\n\n let body: Record<string, unknown> = {};\n try {\n body = (await response.json()) as Record<string, unknown>;\n } catch {\n // ignore parse failures\n }\n handleError(response.status, body);\n }\n}\n","export class RateLimiter {\n private readonly maxPerSecond: number;\n private readonly timestamps: number[] = [];\n private pending: Promise<void> = Promise.resolve();\n\n constructor(maxPerSecond: number) {\n this.maxPerSecond = maxPerSecond;\n }\n\n async wait(): Promise<void> {\n const ticket = this.pending.then(() => this.acquire());\n this.pending = ticket;\n return ticket;\n }\n\n private async acquire(): Promise<void> {\n this.cleanup();\n if (this.timestamps.length >= this.maxPerSecond) {\n const sleepMs = 1000 - (Date.now() - this.timestamps[0]!);\n if (sleepMs > 0) {\n await new Promise<void>((resolve) => setTimeout(resolve, sleepMs));\n }\n this.cleanup();\n }\n this.timestamps.push(Date.now());\n }\n\n private cleanup(): void {\n const now = Date.now();\n while (this.timestamps.length > 0 && now - this.timestamps[0]! >= 1000) {\n this.timestamps.shift();\n }\n }\n}\n","import type { Scavio } from \"../client.js\";\n\nexport interface AmazonSearchOptions {\n /** Product search query (1-500 characters). */\n query: string;\n /** Amazon domain suffix (default 'com', e.g. 'co.uk'). */\n domain?: string;\n /** Country code for localization. */\n country?: string;\n /** Language code. */\n language?: string;\n /** Currency code (ISO 4217, e.g. 'USD'). */\n currency?: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\" | \"tablet\";\n /** Result sort order. */\n sort_by?:\n | \"most_recent\"\n | \"price_low_to_high\"\n | \"price_high_to_low\"\n | \"featured\"\n | \"average_review\"\n | \"bestsellers\";\n /** Starting page (1-indexed). */\n start_page?: number;\n /** Number of pages to fetch. */\n pages?: number;\n /** Amazon category id. */\n category_id?: string;\n /** Filter to a specific merchant. */\n merchant_id?: string;\n /** ZIP/postal code for localized pricing. */\n zip_code?: string;\n /** Auto-select the default variant. */\n autoselect_variant?: boolean;\n [key: string]: unknown;\n}\n\nexport interface AmazonProductOptions {\n /** Amazon ASIN (e.g. 'B09XS7JWHH'). Sent to the API as 'query'. */\n asin: string;\n /** Amazon domain suffix (default 'com'). */\n domain?: string;\n /** Country code for localization. */\n country?: string;\n /** Language code. */\n language?: string;\n /** Currency code (ISO 4217, e.g. 'USD'). */\n currency?: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\" | \"tablet\";\n /** ZIP/postal code for localized pricing. */\n zip_code?: string;\n /** Auto-select the default variant. */\n autoselect_variant?: boolean;\n [key: string]: unknown;\n}\n\nexport class AmazonNamespace {\n constructor(private client: Scavio) {}\n\n async search(\n options: AmazonSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/amazon/search\", options);\n }\n\n async product(\n options: AmazonProductOptions,\n ): Promise<Record<string, unknown>> {\n const { asin, ...rest } = options;\n return this.client._post(\"/api/v1/amazon/product\", {\n query: asin,\n ...rest,\n });\n }\n\n /** Supported Amazon domains, languages, currencies, and countries. */\n async options(): Promise<Record<string, unknown>> {\n return this.client._get(\"/api/v1/amazon/options\");\n }\n}\n","import type { Scavio } from \"../client.js\";\n\n/**\n * Google endpoints (scrape.do engine, /api/v2/google). A faithful passthrough\n * that returns Google's full response. Every endpoint costs 1 credit. Any\n * additional scrape.do parameter can be added to the options object.\n * See https://scavio.dev/docs/search-api.\n */\n\nexport interface GoogleSearchOptions {\n /** Search query (1-500 characters). */\n query: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\";\n /** Result offset: 0 = page 1, 10 = page 2, ... up to 990. */\n start?: number;\n /** Include the raw Google HTML in the response. */\n include_html?: boolean;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Regional Google domain (e.g. 'google.co.uk'). */\n google_domain?: string;\n /** Canonical location name; auto-encoded to a UULE string. */\n location?: string;\n /** Pre-encoded UULE location string (takes priority over location). */\n uule?: string;\n /** Language restrict (e.g. 'lang_en'). */\n lr?: string;\n /** Country restrict (e.g. 'countryUS'). */\n cr?: string;\n /** SafeSearch filter. */\n safe?: \"active\";\n /** Disable spelling correction / auto-fixes when true. */\n nfpr?: boolean;\n /** '0' disables the omitted/similar-results filter. */\n filter?: \"0\" | \"1\";\n /** Restrict results to a recent time window. */\n time_period?:\n | \"last_hour\"\n | \"last_day\"\n | \"last_week\"\n | \"last_month\"\n | \"last_year\";\n /** Resolve a deferred AI Overview (server default true). */\n resolve_ai_overview?: boolean;\n [key: string]: unknown;\n}\n\nexport interface GoogleAiModeOptions {\n /** Question or prompt (1-500 characters). */\n query: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\";\n /** Include the raw Google HTML in the response. */\n include_html?: boolean;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Regional Google domain (e.g. 'google.co.uk'). */\n google_domain?: string;\n /** Canonical location name; auto-encoded to a UULE string. */\n location?: string;\n /** Pre-encoded UULE location string (takes priority over location). */\n uule?: string;\n /** SafeSearch filter. */\n safe?: \"active\";\n [key: string]: unknown;\n}\n\nexport interface GoogleMapsSearchOptions {\n /** Search query (1-500 characters). */\n query: string;\n /** Result offset; must be a multiple of 20 (0, 20, 40, ...). */\n start?: number;\n /** Map center as '@lat,lng,zoomz'; controls where results come from. */\n ll?: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Regional Google domain (e.g. 'google.co.uk'). */\n google_domain?: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleMapsPlaceOptions {\n /** Place ID (ChIJ...). */\n place_id?: string;\n /** Numeric CID. */\n data_cid?: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleMapsReviewsOptions {\n /** Data ID (0xHEX:0xHEX). */\n data_id?: string;\n /** Place ID (ChIJ...). */\n place_id?: string;\n /** Reviews per page (1-20). */\n num?: number;\n /** Pagination cursor from a prior response. */\n next_page_token?: string;\n /** Sort order. */\n sort_by?: \"relevance\" | \"newest\" | \"highest_rating\" | \"lowest_rating\";\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Regional Google domain (e.g. 'google.co.uk'). */\n google_domain?: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleShoppingOptions {\n /** Product search query (1-500 characters). */\n query: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\";\n /** Result offset. */\n start?: number;\n /** Minimum price filter. */\n min_price?: number;\n /** Maximum price filter. */\n max_price?: number;\n /** 0 = relevance, 1 = price ascending, 2 = price descending. */\n sort_by?: number;\n /** Only items with free shipping. */\n free_shipping?: boolean;\n /** Only items on sale. */\n on_sale?: boolean;\n /** Opaque Google Shopping filter token. */\n shoprs?: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Regional Google domain (e.g. 'google.co.uk'). */\n google_domain?: string;\n /** Canonical location name; auto-encoded to a UULE string. */\n location?: string;\n /** Pre-encoded UULE location string (takes priority over location). */\n uule?: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleShoppingProductOptions {\n /** Durable product catalog id. */\n catalog_id?: string;\n /** Product query; required when catalog_id is set. */\n query?: string;\n /** Immersive product page token. */\n immersive_product_page_token?: string;\n /** Alias for immersive_product_page_token. */\n page_token?: string;\n /** Product id. */\n product_id?: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\" | \"tablet\";\n /** Regional Google domain (e.g. 'google.co.uk'). */\n google_domain?: string;\n /** Seller sort order. */\n sort_by?: \"base_price\" | \"total_price\" | \"promotion\" | \"seller_rating\";\n /** Load all available stores. */\n load_all_stores?: boolean;\n /** Fetch additional stores. */\n more_stores?: boolean;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Canonical location name; auto-encoded to a UULE string. */\n location?: string;\n /** Pre-encoded UULE location string (takes priority over location). */\n uule?: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleShoppingStoresOptions {\n /** Durable product catalog id. */\n catalog_id: string;\n /** Pagination cursor from shopping_product. */\n next_page_token: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleFlightsOptions {\n /** Departure IATA code(s); comma-separated allowed. */\n departure_id: string;\n /** Arrival IATA code(s); comma-separated allowed. */\n arrival_id: string;\n /** Outbound date (YYYY-MM-DD). */\n outbound_date: string;\n /** 1 = round trip, 2 = one way, 3 = multi-city. */\n type?: number;\n /** Return date (YYYY-MM-DD); required when type=1. */\n return_date?: string;\n /** Number of adults (1-9). */\n adults?: number;\n /** Number of children (0-9). */\n children?: number;\n /** Infants in seat (0-4). */\n infants_in_seat?: number;\n /** Infants on lap (0-4). */\n infants_on_lap?: number;\n /** 1 = economy, 2 = premium, 3 = business, 4 = first. */\n travel_class?: number;\n /** 0 = any, 1 = nonstop, 2 = <=1 stop, 3 = <=2 stops. */\n stops?: number;\n /** 1 = top, 2 = price, 3 = departure, 4 = arrival, 5 = duration, 6 = emissions. */\n sort_by?: number;\n /** Comma-separated airline codes/alliances to include. */\n include_airlines?: string;\n /** Comma-separated airline codes/alliances to exclude. */\n exclude_airlines?: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Currency code (ISO 4217, e.g. 'USD'). */\n currency?: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleHotelsOptions {\n /** Search query; use a '<City> hotels' form. */\n query: string;\n /** Check-in date (YYYY-MM-DD). */\n check_in_date: string;\n /** Check-out date (YYYY-MM-DD). */\n check_out_date: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Currency code (ISO 4217, e.g. 'USD'). */\n currency?: string;\n /** 3 = lowest price, 8 = highest rating, 13 = most reviewed. */\n sort_by?: number;\n /** Minimum nightly price. */\n min_price?: number;\n /** Maximum nightly price. */\n max_price?: number;\n /** 7 = 3.5+, 8 = 4.0+, 9 = 4.5+. */\n rating?: number;\n /** Comma-separated star ratings (2-5). */\n hotel_class?: string;\n /** Comma-separated amenity ids. */\n amenities?: string;\n /** Comma-separated property-type ids (e.g. '12' for vacation rentals). */\n property_types?: string;\n /** Only properties with free cancellation. */\n free_cancellation?: boolean;\n /** Only eco-certified properties. */\n eco_certified?: boolean;\n /** Only properties with special offers. */\n special_offers?: boolean;\n /** Pagination cursor from a prior response. */\n next_page_token?: string;\n /** Number of properties to return (1-20). */\n limit?: number;\n [key: string]: unknown;\n}\n\nexport interface GoogleHotelsDetailOptions {\n /** Property detail token from a hotels listing. */\n detail_token: string;\n /** Check-in date (YYYY-MM-DD). */\n check_in_date: string;\n /** Check-out date (YYYY-MM-DD). */\n check_out_date: string;\n /** Currency code (ISO 4217, e.g. 'USD'). */\n currency?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n [key: string]: unknown;\n}\n\nexport interface GoogleNewsOptions {\n /** Keyword search. */\n query?: string;\n /** Browse a news topic. */\n topic_token?: string;\n /** Browse a topic section. */\n section_token?: string;\n /** Fetch full coverage of a story. */\n story_token?: string;\n /** Browse a publication. */\n publication_token?: string;\n /** Knowledge Graph entity id. */\n kgmid?: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Country of the search (ISO 3166-1 alpha-2, e.g. 'us'). */\n gl?: string;\n /** Regional Google domain (e.g. 'google.co.uk'). */\n google_domain?: string;\n /** Sort order: 0 = relevance, 1 = date (only with query or kgmid). */\n so?: number;\n [key: string]: unknown;\n}\n\nexport interface GoogleTrendsOptions {\n /** Search term(s); comma-separated for comparisons. */\n query: string;\n /** Location code (e.g. 'US', 'GB', 'US-CA'). */\n geo?: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Time range (e.g. 'today 12-m', 'now 7-d'). */\n date?: string;\n /** Timezone offset in minutes. */\n tz?: string;\n /** Which trends dataset to return. */\n data_type?:\n | \"TIMESERIES\"\n | \"GEO_MAP\"\n | \"GEO_MAP_0\"\n | \"RELATED_QUERIES\"\n | \"RELATED_TOPICS\";\n /** Category id. */\n cat?: string;\n /** Google property filter. */\n gprop?: \"images\" | \"news\" | \"youtube\" | \"froogle\";\n /** Resolution for GEO_MAP data. */\n region?: \"COUNTRY\" | \"REGION\" | \"DMA\" | \"CITY\";\n [key: string]: unknown;\n}\n\nexport interface GoogleTrendingOptions {\n /** Country code (e.g. 'US'). */\n geo: string;\n /** UI language (ISO 639-1, e.g. 'en'). */\n hl?: string;\n /** Trending window: 4, 24, 48, or 168. */\n hours?: number;\n /** Category id (0-20). */\n cat?: number;\n /** Sort order. */\n sort?: \"relevance\" | \"search_volume\" | \"recency\" | \"title\";\n /** Filter by trend status. */\n status?: \"all\" | \"active\";\n [key: string]: unknown;\n}\n\nexport class GoogleNamespace {\n constructor(private client: Scavio) {}\n\n /** Google SERP search (includes the AI Overview when Google returns one). */\n async search(options: GoogleSearchOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google\", options);\n }\n\n /** Google AI Mode answer. */\n async aiMode(options: GoogleAiModeOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/ai-mode\", options);\n }\n\n /** Google Maps local results. */\n async mapsSearch(options: GoogleMapsSearchOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/maps/search\", options);\n }\n\n /** Google Maps place details. Provide place_id or data_cid. */\n async mapsPlace(options: GoogleMapsPlaceOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/maps/place\", options);\n }\n\n /** Google Maps reviews. Provide data_id or place_id. */\n async mapsReviews(options: GoogleMapsReviewsOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/maps/reviews\", options);\n }\n\n /** Google Shopping search results. */\n async shopping(options: GoogleShoppingOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/shopping\", options);\n }\n\n /** Google Shopping product. Pass catalog_id + query for full details and sellers. */\n async shoppingProduct(\n options: GoogleShoppingProductOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/shopping/product\", options);\n }\n\n /** Google Shopping product sellers (continuation of shoppingProduct). */\n async shoppingStores(\n options: GoogleShoppingStoresOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/shopping/product/stores\", options);\n }\n\n /** Google Flights. */\n async flights(options: GoogleFlightsOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/flights\", options);\n }\n\n /** Google Hotels search. */\n async hotels(options: GoogleHotelsOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/hotels\", options);\n }\n\n /** Google Hotels property details (from a hotels listing detail_token). */\n async hotelsDetail(\n options: GoogleHotelsDetailOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/hotels/detail\", options);\n }\n\n /** Google News. Provide query or a topic/story/publication token. */\n async news(options: GoogleNewsOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/news\", options);\n }\n\n /** Google Trends data. */\n async trends(options: GoogleTrendsOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/trends\", options);\n }\n\n /** Google Trending Now for a country. */\n async trending(options: GoogleTrendingOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v2/google/trending\", options);\n }\n}\n","import type { Scavio } from \"../client.js\";\n\n/** Comment / feed sort orders. */\nexport type RedditSort = \"HOT\" | \"NEW\" | \"TOP\" | \"BEST\" | \"CONTROVERSIAL\";\n/** Subreddit feed sort orders. */\nexport type RedditFeedSort =\n | \"BEST\"\n | \"HOT\"\n | \"NEW\"\n | \"TOP\"\n | \"CONTROVERSIAL\"\n | \"RISING\";\n\nexport interface RedditSearchOptions {\n /** Search query (1-500 characters). */\n query: string;\n /** Result type (server default 'posts'). */\n type?: \"posts\" | \"comments\";\n /** Sort order (server default 'new'). */\n sort?: \"new\" | \"relevance\" | \"hot\" | \"top\" | \"comments\";\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface RedditSearchSuggestionsOptions {\n /** Search query (1-500 characters). */\n query: string;\n [key: string]: unknown;\n}\n\nexport interface RedditPostOptions {\n /** Post fullname (t3_...) or bare id. */\n post_id?: string;\n /** Full Reddit post URL. */\n url?: string;\n [key: string]: unknown;\n}\n\nexport interface RedditPostCommentsOptions {\n /** Post fullname (t3_...). */\n post_id: string;\n /** Comment sort order (default 'TOP'). */\n sort?: RedditSort;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface RedditCommentRepliesOptions {\n /** Post fullname (t3_...). */\n post_id: string;\n /** reply_cursor from a comment in the comments endpoint. */\n cursor: string;\n /** Comment sort order (default 'TOP'). */\n sort?: RedditSort;\n [key: string]: unknown;\n}\n\nexport interface RedditSubredditOptions {\n /** Subreddit name (without r/). */\n subreddit: string;\n [key: string]: unknown;\n}\n\nexport interface RedditSubredditPostsOptions {\n /** Subreddit name (without r/). */\n subreddit: string;\n /** Feed sort order (default 'HOT'). */\n sort?: RedditFeedSort;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface RedditUserOptions {\n /** Redditor username (without u/). */\n username: string;\n [key: string]: unknown;\n}\n\nexport interface RedditUserFeedOptions {\n /** Redditor username (without u/). */\n username: string;\n /** Sort order (default 'NEW'). */\n sort?: RedditSort;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface RedditPopularOptions {\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport class RedditNamespace {\n constructor(private client: Scavio) {}\n\n async search(\n options: RedditSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/search\", options);\n }\n\n async searchSuggestions(\n options: RedditSearchSuggestionsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/search/suggestions\", options);\n }\n\n async post(options: RedditPostOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/post\", options);\n }\n\n async postComments(\n options: RedditPostCommentsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/post/comments\", options);\n }\n\n async commentReplies(\n options: RedditCommentRepliesOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/post/comments/replies\", options);\n }\n\n async subreddit(\n options: RedditSubredditOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/subreddit\", options);\n }\n\n async subredditPosts(\n options: RedditSubredditPostsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/subreddit/posts\", options);\n }\n\n async user(options: RedditUserOptions): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/user\", options);\n }\n\n async userPosts(\n options: RedditUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/user/posts\", options);\n }\n\n async userComments(\n options: RedditUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/user/comments\", options);\n }\n\n async popular(\n options: RedditPopularOptions = {},\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/popular\", options);\n }\n\n async trending(): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/reddit/trending\", {});\n }\n}\n","import type { Scavio } from \"../client.js\";\n\nexport interface TikTokProfileOptions {\n /** TikTok @username (without the @). */\n username?: string;\n /** TikTok sec_user_id. */\n sec_user_id?: string;\n [key: string]: unknown;\n}\n\nexport interface TikTokUserPostsOptions {\n /** TikTok sec_user_id. */\n sec_user_id: string;\n /** Pagination cursor (default '0'). */\n cursor?: string;\n /** Results per page (1-30). */\n count?: number;\n /** '0' = latest, '1' = popular. */\n sort_type?: \"0\" | \"1\";\n [key: string]: unknown;\n}\n\nexport interface TikTokVideoOptions {\n /** TikTok video id. */\n video_id: string;\n [key: string]: unknown;\n}\n\nexport interface TikTokVideoCommentsOptions {\n /** TikTok video id. */\n video_id: string;\n /** Pagination cursor (default '0'). */\n cursor?: string;\n /** Results per page (1-50). */\n count?: number;\n [key: string]: unknown;\n}\n\nexport interface TikTokCommentRepliesOptions {\n /** TikTok video id. */\n video_id: string;\n /** Parent comment id. */\n comment_id: string;\n /** Pagination cursor (default '0'). */\n cursor?: string;\n /** Results per page (1-50). */\n count?: number;\n [key: string]: unknown;\n}\n\nexport interface TikTokSearchVideosOptions {\n /** Search keyword (1-500 characters). */\n keyword: string;\n /** Pagination cursor (default '0'). */\n cursor?: string;\n /** Results per page (1-30). */\n count?: number;\n /** '0' = relevance, '1' = most likes. */\n sort_type?: \"0\" | \"1\";\n /** Age filter in days: 0 = all time, 1, 7, 30, 90, 180. */\n publish_time?: \"0\" | \"1\" | \"7\" | \"30\" | \"90\" | \"180\";\n [key: string]: unknown;\n}\n\nexport interface TikTokSearchUsersOptions {\n /** Search keyword (1-500 characters). */\n keyword: string;\n /** Pagination cursor (default '0'). */\n cursor?: string;\n /** Results per page (1-30). */\n count?: number;\n [key: string]: unknown;\n}\n\nexport interface TikTokHashtagOptions {\n /** Hashtag name (without the #). */\n hashtag_name?: string;\n /** Hashtag id. */\n hashtag_id?: string;\n [key: string]: unknown;\n}\n\nexport interface TikTokHashtagVideosOptions {\n /** Hashtag id. */\n hashtag_id: string;\n /** Pagination cursor (default '0'). */\n cursor?: string;\n /** Results per page (1-30). */\n count?: number;\n [key: string]: unknown;\n}\n\nexport interface TikTokUserFollowersOptions {\n /** TikTok sec_user_id. */\n sec_user_id: string;\n /** Results per page (1-20). */\n count?: number;\n /** Pagination token from a prior response. */\n page_token?: string;\n /** Minimum timestamp cursor. */\n min_time?: number;\n [key: string]: unknown;\n}\n\nexport interface TikTokUserFollowingsOptions {\n /** TikTok sec_user_id. */\n sec_user_id: string;\n /** Results per page (1-20). */\n count?: number;\n /** Pagination token from a prior response. */\n page_token?: string;\n /** Minimum timestamp cursor. */\n min_time?: number;\n [key: string]: unknown;\n}\n\nexport class TikTokNamespace {\n constructor(private client: Scavio) {}\n\n async profile(\n options: TikTokProfileOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/profile\", options);\n }\n\n async userPosts(\n options: TikTokUserPostsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/user/posts\", options);\n }\n\n async video(\n options: TikTokVideoOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/video\", options);\n }\n\n async videoComments(\n options: TikTokVideoCommentsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/video/comments\", options);\n }\n\n async commentReplies(\n options: TikTokCommentRepliesOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/video/comments/replies\", options);\n }\n\n async searchVideos(\n options: TikTokSearchVideosOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/search/videos\", options);\n }\n\n async searchUsers(\n options: TikTokSearchUsersOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/search/users\", options);\n }\n\n async hashtag(\n options: TikTokHashtagOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/hashtag\", options);\n }\n\n async hashtagVideos(\n options: TikTokHashtagVideosOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/hashtag/videos\", options);\n }\n\n async userFollowers(\n options: TikTokUserFollowersOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/user/followers\", options);\n }\n\n async userFollowings(\n options: TikTokUserFollowingsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok/user/followings\", options);\n }\n}\n","import type { Scavio } from \"../client.js\";\n\nexport interface InstagramProfileOptions {\n /** Instagram username (without the @). */\n username?: string;\n /** Instagram numeric user id. */\n user_id?: string;\n [key: string]: unknown;\n}\n\nexport interface InstagramUserFeedOptions {\n /** Instagram username (without the @). */\n username?: string;\n /** Instagram numeric user id. */\n user_id?: string;\n /** Results per page (1-50). */\n count?: number;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface InstagramStoriesOptions {\n /** Instagram username (without the @). */\n username?: string;\n /** Instagram numeric user id. */\n user_id?: string;\n [key: string]: unknown;\n}\n\nexport interface InstagramPostOptions {\n /** Full Instagram post URL. */\n url?: string;\n /** Instagram media id. */\n media_id?: string;\n /** Instagram shortcode (from the post URL). */\n shortcode?: string;\n [key: string]: unknown;\n}\n\nexport interface InstagramPostCommentsOptions {\n /** Instagram shortcode (from the post URL). */\n shortcode?: string;\n /** Full Instagram post URL. */\n url?: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n /** Comment sort order. */\n sort_order?: \"popular\" | \"newest\";\n [key: string]: unknown;\n}\n\nexport interface InstagramCommentRepliesOptions {\n /** Instagram media id. */\n media_id: string;\n /** Parent comment id. */\n comment_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface InstagramSearchOptions {\n /** Search keyword (1-500 characters). */\n keyword: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface InstagramFollowOptions {\n /** Instagram username (without the @). */\n username?: string;\n /** Instagram numeric user id. */\n user_id?: string;\n /** Results per page (1-100). */\n count?: number;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport class InstagramNamespace {\n constructor(private client: Scavio) {}\n\n async profile(\n options: InstagramProfileOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/profile\", options);\n }\n\n async userPosts(\n options: InstagramUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/user/posts\", options);\n }\n\n async userReels(\n options: InstagramUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/user/reels\", options);\n }\n\n async userTagged(\n options: InstagramUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/user/tagged\", options);\n }\n\n async userStories(\n options: InstagramStoriesOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/user/stories\", options);\n }\n\n async post(\n options: InstagramPostOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/post\", options);\n }\n\n async postComments(\n options: InstagramPostCommentsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/post/comments\", options);\n }\n\n async commentReplies(\n options: InstagramCommentRepliesOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/post/comments/replies\", options);\n }\n\n async searchUsers(\n options: InstagramSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/search/users\", options);\n }\n\n async searchHashtags(\n options: InstagramSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/search/hashtags\", options);\n }\n\n async userFollowers(\n options: InstagramFollowOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/user/followers\", options);\n }\n\n async userFollowings(\n options: InstagramFollowOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/instagram/user/followings\", options);\n }\n}\n","import type { Scavio } from \"../client.js\";\n\nexport interface WalmartSearchOptions {\n /** Product search query (1-500 characters). */\n query: string;\n /** Walmart domain. */\n domain?: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\" | \"tablet\";\n /** Result sort order. */\n sort_by?: \"best_match\" | \"price_low\" | \"price_high\" | \"best_seller\";\n /** Starting page (1-indexed). */\n start_page?: number;\n /** Minimum price filter (USD). */\n min_price?: number;\n /** Maximum price filter (USD). */\n max_price?: number;\n /** Delivery speed filter. */\n fulfillment_speed?: \"today\" | \"tomorrow\" | \"2_days\" | \"anytime\";\n /** Fulfillment type filter. */\n fulfillment_type?: \"in_store\";\n /** ZIP code for localized results. */\n delivery_zip?: string;\n /** Store id for in-store availability. */\n store_id?: string;\n [key: string]: unknown;\n}\n\nexport interface WalmartProductOptions {\n /** Walmart product id. */\n product_id: string;\n /** Walmart domain. */\n domain?: string;\n /** Device to emulate. */\n device?: \"desktop\" | \"mobile\" | \"tablet\";\n /** ZIP code for localized pricing. */\n delivery_zip?: string;\n /** Store id for in-store availability. */\n store_id?: string;\n [key: string]: unknown;\n}\n\nexport class WalmartNamespace {\n constructor(private client: Scavio) {}\n\n async search(\n options: WalmartSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/walmart/search\", options);\n }\n\n async product(\n options: WalmartProductOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/walmart/product\", options);\n }\n}\n","import type { Scavio } from \"../client.js\";\n\nexport interface YouTubeSearchOptions {\n /** Search query (1-500 characters). Sent to the API as 'search'. */\n query: string;\n /** Filter by upload date. */\n upload_date?: \"last_hour\" | \"today\" | \"this_week\" | \"this_month\" | \"this_year\";\n /** Filter by result type. */\n type?: \"video\" | \"channel\" | \"playlist\" | \"movie\";\n /** short (<4 min), medium (4-20 min), long (>20 min). */\n duration?: \"short\" | \"medium\" | \"long\";\n /** Sort order. */\n sort_by?: \"relevance\" | \"date\" | \"view_count\" | \"rating\";\n /**\n * Feature filters, e.g. [\"hd\", \"4k\", \"subtitles\", \"creative_commons\",\n * \"live\", \"360\", \"3d\", \"hdr\", \"vr180\"].\n */\n features?: string[];\n /** Pagination cursor from a prior response. */\n cursor?: string;\n /** HD videos only. */\n hd?: boolean;\n /** Videos with subtitles/CC only. */\n subtitles?: boolean;\n /** Creative Commons licensed only. */\n creative_commons?: boolean;\n /** Live videos only. */\n live?: boolean;\n /** HDR videos only. */\n hdr?: boolean;\n /** Videos with location metadata only. */\n location?: boolean;\n /** VR180 videos only. */\n vr180?: boolean;\n /** 4K videos only. Sent to the API as '4k'. */\n fourK?: boolean;\n /** 360-degree videos only. Sent to the API as '360'. */\n video_360?: boolean;\n /** 3D videos only. Sent to the API as '3d'. */\n video_3d?: boolean;\n [key: string]: unknown;\n}\n\nexport interface YouTubeShortsOptions {\n /** Search query (1-500 characters). Sent to the API as 'search'. */\n query: string;\n /** Sort order. */\n sort_by?: \"relevance\" | \"date\" | \"view_count\" | \"rating\";\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeSuggestionsOptions {\n /** Search query (1-500 characters). Sent to the API as 'search'. */\n query: string;\n /** Language code for suggestions (default 'en'). */\n language?: string;\n /** Region code for suggestions (default 'US'). */\n region?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeVideoOptions {\n /** YouTube video id (e.g. 'dQw4w9WgXcQ') or a full watch URL. */\n video_id: string;\n [key: string]: unknown;\n}\n\n/** @deprecated Use YouTubeVideoOptions with youtube.video(). */\nexport interface YouTubeMetadataOptions {\n /** YouTube video id (e.g. 'dQw4w9WgXcQ') or a full watch URL. */\n video_id: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeCommentsOptions {\n /** YouTube video id or a full watch URL. */\n video_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeCommentRepliesOptions {\n /** YouTube video id or a full watch URL. */\n video_id: string;\n /** Reply cursor from a parent comment's 'reply_cursor'. */\n reply_cursor: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeTranscriptOptions {\n /** YouTube video id or a full watch URL. */\n video_id: string;\n /** Caption language code (default 'en'). */\n language?: string;\n /** 'text' for plain transcript, 'srt' for timed subtitles (default 'text'). */\n format?: \"text\" | \"srt\";\n [key: string]: unknown;\n}\n\nexport interface YouTubeRelatedOptions {\n /** YouTube video id or a full watch URL. */\n video_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeChannelSearchOptions {\n /** Search query (1-500 characters). Sent to the API as 'search'. */\n query: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeChannelOptions {\n /** YouTube channel id, @handle, or channel URL. */\n channel_id: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeChannelVideosOptions {\n /** YouTube channel id. */\n channel_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeChannelShortsOptions {\n /** YouTube channel id. */\n channel_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeChannelCommunityOptions {\n /** YouTube channel id. */\n channel_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeChannelResolveOptions {\n /** A channel @handle or channel URL to resolve to a channel id. */\n channel: string;\n [key: string]: unknown;\n}\n\nexport interface YouTubeStreamsOptions {\n /** YouTube video id or a full watch URL. */\n video_id: string;\n [key: string]: unknown;\n}\n\nexport class YouTubeNamespace {\n constructor(private client: Scavio) {}\n\n async search(\n options: YouTubeSearchOptions,\n ): Promise<Record<string, unknown>> {\n const { query, fourK, video_360, video_3d, ...rest } = options;\n const body: Record<string, unknown> = {\n search: query,\n ...rest,\n };\n if (fourK !== undefined) body[\"4k\"] = fourK;\n if (video_360 !== undefined) body[\"360\"] = video_360;\n if (video_3d !== undefined) body[\"3d\"] = video_3d;\n return this.client._post(\"/api/v1/youtube/search\", body);\n }\n\n async shorts(\n options: YouTubeShortsOptions,\n ): Promise<Record<string, unknown>> {\n const { query, ...rest } = options;\n return this.client._post(\"/api/v1/youtube/shorts\", {\n search: query,\n ...rest,\n });\n }\n\n async suggestions(\n options: YouTubeSuggestionsOptions,\n ): Promise<Record<string, unknown>> {\n const { query, ...rest } = options;\n return this.client._post(\"/api/v1/youtube/suggestions\", {\n search: query,\n ...rest,\n });\n }\n\n async video(\n options: YouTubeVideoOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/video\", options);\n }\n\n /** @deprecated Use youtube.video(). Alias kept for backward compatibility. */\n async metadata(\n options: YouTubeMetadataOptions,\n ): Promise<Record<string, unknown>> {\n return this.video(options);\n }\n\n async comments(\n options: YouTubeCommentsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/comments\", options);\n }\n\n async commentReplies(\n options: YouTubeCommentRepliesOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/comments/replies\", options);\n }\n\n async transcript(\n options: YouTubeTranscriptOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/transcript\", options);\n }\n\n async related(\n options: YouTubeRelatedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/related\", options);\n }\n\n async channelSearch(\n options: YouTubeChannelSearchOptions,\n ): Promise<Record<string, unknown>> {\n const { query, ...rest } = options;\n return this.client._post(\"/api/v1/youtube/channel/search\", {\n search: query,\n ...rest,\n });\n }\n\n async channel(\n options: YouTubeChannelOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/channel\", options);\n }\n\n async channelVideos(\n options: YouTubeChannelVideosOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/channel/videos\", options);\n }\n\n async channelShorts(\n options: YouTubeChannelShortsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/channel/shorts\", options);\n }\n\n async channelCommunity(\n options: YouTubeChannelCommunityOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/channel/community\", options);\n }\n\n async channelResolve(\n options: YouTubeChannelResolveOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/channel/resolve\", options);\n }\n\n async streams(\n options: YouTubeStreamsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/youtube/streams\", options);\n }\n}\n","import type { Scavio } from \"../client.js\";\n\nexport interface XSearchOptions {\n /** Search query (1-500 characters). */\n search: string;\n /** Result category (default 'Top'). */\n search_type?: \"Top\" | \"Latest\" | \"People\" | \"Photos\" | \"Videos\";\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface XTweetOptions {\n /** Tweet id. */\n tweet_id: string;\n [key: string]: unknown;\n}\n\nexport interface XTweetCommentsOptions {\n /** Tweet id. */\n tweet_id: string;\n /** 'top' (ranked) or 'latest' (chronological); default 'top'. */\n rank?: \"top\" | \"latest\";\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface XTweetRetweetersOptions {\n /** Tweet id. */\n tweet_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface XUserOptions {\n /** An X handle (without the @). */\n screen_name: string;\n [key: string]: unknown;\n}\n\nexport interface XUserFeedOptions {\n /** An X handle (without the @). */\n screen_name: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface XTrendingOptions {\n /** Country name (default 'UnitedStates'). */\n country?: string;\n [key: string]: unknown;\n}\n\nexport class XNamespace {\n constructor(private client: Scavio) {}\n\n async search(\n options: XSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/x/search\", options);\n }\n\n async tweet(\n options: XTweetOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/x/tweet\", options);\n }\n\n async tweetComments(\n options: XTweetCommentsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/x/tweet/comments\", options);\n }\n\n async tweetRetweeters(\n options: XTweetRetweetersOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/x/tweet/retweeters\", options);\n }\n\n async user(\n options: XUserOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/x/user\", options);\n }\n\n async userTweets(\n options: XUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/x/user/tweets\", options);\n }\n\n async userReplies(\n options: XUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/x/user/replies\", options);\n }\n\n async userMedia(\n options: XUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/x/user/media\", options);\n }\n\n async userFollowers(\n options: XUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/x/user/followers\", options);\n }\n\n async userFollowings(\n options: XUserFeedOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/x/user/followings\", options);\n }\n\n async trending(\n options: XTrendingOptions = {},\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/x/trending\", options);\n }\n}\n","import type { Scavio } from \"../client.js\";\n\nexport interface LinkedInPersonOptions {\n /** Public identifier (vanity handle). */\n username: string;\n /** Include the experiences section (default true server-side). */\n include_experiences?: boolean;\n /** Include the educations section (default true server-side). */\n include_educations?: boolean;\n /** Include the skills section (default true server-side). */\n include_skills?: boolean;\n /** Include the certifications section (default true server-side). */\n include_certifications?: boolean;\n /** Include follower and connection counts (default true server-side). */\n include_follower_and_connection?: boolean;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPersonRefOptions {\n /** Member urn. */\n urn?: string;\n /** Public identifier; resolved to a urn if urn is omitted. */\n username?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPersonPostsOptions {\n /** Member urn. */\n urn?: string;\n /** Public identifier; resolved to a urn if urn is omitted. */\n username?: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPersonContactOptions {\n /** Public identifier (vanity handle). */\n username: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInCompanyOptions {\n /** Company universal name (slug) or LinkedIn company URL. */\n company: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInCompanyPostsOptions {\n /** Company universal name (slug) or LinkedIn company URL. */\n company: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n /** Results per page (1-100). */\n count?: number;\n [key: string]: unknown;\n}\n\nexport interface LinkedInCompanyRefOptions {\n /** Numeric company id. */\n company_id?: string;\n /** Company slug/url; resolved to a company_id if company_id is omitted. */\n company?: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInSearchPeopleOptions {\n /** Name to search for. */\n search?: string;\n /** Job title filter. */\n title?: string;\n /** Company filter. */\n company?: string;\n /** School filter. */\n school?: string;\n /** A geo name or id to filter by. */\n location?: string;\n /** Page cursor (page number). */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInSearchJobsOptions {\n /** Search query (1-500 characters). */\n search: string;\n /** Page cursor (page number). */\n cursor?: string;\n /** Date-posted filter. */\n date_posted?: string;\n /** Geo code to filter by. */\n geocode?: string;\n /** Experience level filter. */\n experience_level?: string;\n /** Remote filter. */\n remote?: string;\n /** Job type filter. */\n job_type?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInSearchPostsOptions {\n /** Search query (1-500 characters). */\n search: string;\n /** Page cursor (page number). */\n cursor?: string;\n /** Date-posted filter. */\n date_posted?: string;\n /** Sort order. */\n sort_by?: string;\n /** Content type filter. */\n content_type?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInJobOptions {\n /** Job listing id. */\n job_id: string;\n /** Include the required-skills section. */\n include_skills?: boolean;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPostOptions {\n /** Post id or activity urn. */\n post_id: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPostCommentsOptions {\n /** Post id or activity urn. */\n post_id: string;\n /** Pagination cursor from a prior response. */\n cursor?: string;\n /** Comment sort order. */\n sort_order?: \"relevance\" | \"recent\";\n /** Post type. */\n post_type?: \"activity\" | \"ugc\";\n [key: string]: unknown;\n}\n\nexport class LinkedInNamespace {\n constructor(private client: Scavio) {}\n\n async person(\n options: LinkedInPersonOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/person\", options);\n }\n\n async personAbout(\n options: LinkedInPersonRefOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/person/about\", options);\n }\n\n async personPosts(\n options: LinkedInPersonPostsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/person/posts\", options);\n }\n\n async personContact(\n options: LinkedInPersonContactOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/person/contact\", options);\n }\n\n async company(\n options: LinkedInCompanyOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/company\", options);\n }\n\n async companyPosts(\n options: LinkedInCompanyPostsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/company/posts\", options);\n }\n\n async companyPeople(\n options: LinkedInCompanyRefOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/company/people\", options);\n }\n\n async companyJobs(\n options: LinkedInCompanyRefOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/company/jobs\", options);\n }\n\n async searchPeople(\n options: LinkedInSearchPeopleOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/search/people\", options);\n }\n\n async searchJobs(\n options: LinkedInSearchJobsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/search/jobs\", options);\n }\n\n async searchPosts(\n options: LinkedInSearchPostsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/search/posts\", options);\n }\n\n async job(\n options: LinkedInJobOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/job\", options);\n }\n\n async post(\n options: LinkedInPostOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/post\", options);\n }\n\n async postComments(\n options: LinkedInPostCommentsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/post/comments\", options);\n }\n}\n","import { MissingAPIKeyError, ScavioError } from \"./errors.js\";\nimport { BASE_URL, DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT, request } from \"./http.js\";\nimport { RateLimiter } from \"./rate-limiter.js\";\nimport { AmazonNamespace } from \"./namespaces/amazon.js\";\nimport type { GoogleSearchOptions } from \"./namespaces/google.js\";\nimport { GoogleNamespace } from \"./namespaces/google.js\";\nimport { RedditNamespace } from \"./namespaces/reddit.js\";\nimport { TikTokNamespace } from \"./namespaces/tiktok.js\";\nimport { InstagramNamespace } from \"./namespaces/instagram.js\";\nimport { WalmartNamespace } from \"./namespaces/walmart.js\";\nimport { YouTubeNamespace } from \"./namespaces/youtube.js\";\nimport { XNamespace } from \"./namespaces/x.js\";\nimport { LinkedInNamespace } from \"./namespaces/linkedin.js\";\n\nexport interface ScavioConfig {\n apiKey?: string;\n baseUrl?: string;\n timeout?: number;\n maxRequestsPerSecond?: number;\n /**\n * Additional retry attempts after the first request on transient failures\n * (HTTP 429/500/502/503/504 and network/timeout errors). Defaults to 2.\n * Set to 0 to disable retries.\n */\n maxRetries?: number;\n}\n\nexport class Scavio {\n readonly google: GoogleNamespace;\n readonly amazon: AmazonNamespace;\n readonly walmart: WalmartNamespace;\n readonly youtube: YouTubeNamespace;\n readonly reddit: RedditNamespace;\n readonly tiktok: TikTokNamespace;\n readonly instagram: InstagramNamespace;\n readonly x: XNamespace;\n readonly linkedin: LinkedInNamespace;\n\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n private readonly maxRetries: number;\n private readonly rateLimiter: RateLimiter;\n\n constructor(config?: ScavioConfig) {\n this.apiKey = config?.apiKey ?? process.env.SCAVIO_API_KEY ?? \"\";\n if (!this.apiKey) {\n throw new MissingAPIKeyError();\n }\n\n this.baseUrl = (config?.baseUrl ?? BASE_URL).replace(/\\/+$/, \"\");\n this.timeout = config?.timeout ?? DEFAULT_TIMEOUT;\n this.maxRetries = config?.maxRetries ?? DEFAULT_MAX_RETRIES;\n\n const rps = config?.maxRequestsPerSecond ?? 1;\n if (rps < 1 || rps > 10) {\n throw new ScavioError(\"maxRequestsPerSecond must be between 1 and 10\");\n }\n this.rateLimiter = new RateLimiter(rps);\n\n this.google = new GoogleNamespace(this);\n this.amazon = new AmazonNamespace(this);\n this.walmart = new WalmartNamespace(this);\n this.youtube = new YouTubeNamespace(this);\n this.reddit = new RedditNamespace(this);\n this.tiktok = new TikTokNamespace(this);\n this.instagram = new InstagramNamespace(this);\n this.x = new XNamespace(this);\n this.linkedin = new LinkedInNamespace(this);\n }\n\n /** @internal */\n async _post(\n path: string,\n body: object,\n ): Promise<Record<string, unknown>> {\n return request({\n method: \"POST\",\n path,\n apiKey: this.apiKey,\n baseUrl: this.baseUrl,\n timeout: this.timeout,\n maxRetries: this.maxRetries,\n rateLimiter: this.rateLimiter,\n body: body as Record<string, unknown>,\n });\n }\n\n /** @internal */\n async _get(path: string): Promise<Record<string, unknown>> {\n return request({\n method: \"GET\",\n path,\n apiKey: this.apiKey,\n baseUrl: this.baseUrl,\n timeout: this.timeout,\n maxRetries: this.maxRetries,\n rateLimiter: this.rateLimiter,\n });\n }\n\n async search(\n options: GoogleSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.google.search(options);\n }\n\n async getUsage(): Promise<Record<string, unknown>> {\n return this._get(\"/api/v1/usage\");\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "scavio",
3
- "version": "0.7.0",
4
- "description": "TypeScript SDK for the Scavio Search API — real-time Google, Amazon, Walmart, YouTube, Reddit, TikTok, Instagram, Twitter, and LinkedIn data",
3
+ "version": "0.8.0",
4
+ "description": "TypeScript SDK for the Scavio Search API — real-time Google, Amazon, Walmart, YouTube, Reddit, TikTok, Instagram, X, and LinkedIn data",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
7
7
  "module": "./dist/index.js",
@@ -48,7 +48,7 @@
48
48
  "serp",
49
49
  "scraping",
50
50
  "instagram",
51
- "twitter",
51
+ "x",
52
52
  "linkedin",
53
53
  "tavily-alternative",
54
54
  "serpapi-alternative"