scavio 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -5
- package/dist/index.cjs +12 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +37 -36
- package/dist/index.d.ts +37 -36
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -65,23 +65,52 @@ await client.google.trends({ query: "bitcoin" });
|
|
|
65
65
|
|
|
66
66
|
### Amazon
|
|
67
67
|
|
|
68
|
+
Responses are normalized to a stable shape (see the breaking-change note
|
|
69
|
+
below); each call costs 1 credit. `country` is an ISO 3166-1 alpha-2
|
|
70
|
+
marketplace code (`us`, `gb`, `de`, ...) and defaults to `us`.
|
|
71
|
+
|
|
68
72
|
```typescript
|
|
69
73
|
// Search products
|
|
70
74
|
await client.amazon.search({
|
|
71
75
|
query: "laptop",
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
sort_by: "price_asc", // optional
|
|
75
|
-
pages: 1, // optional
|
|
76
|
+
country: "de", // optional, marketplace
|
|
77
|
+
page: 2, // optional, 1-based
|
|
76
78
|
});
|
|
77
79
|
|
|
78
80
|
// Get product by ASIN
|
|
79
81
|
await client.amazon.product({
|
|
80
82
|
asin: "B09V3KXJPB",
|
|
81
|
-
|
|
83
|
+
country: "us", // optional
|
|
82
84
|
});
|
|
85
|
+
|
|
86
|
+
// Every seller offering that ASIN, with the buy box winner flagged
|
|
87
|
+
const res = await client.amazon.offers({ asin: "B09V3KXJPB" });
|
|
88
|
+
// res.data -> { asin, title, count, total_offers, has_more_pages, page, offers[] }
|
|
89
|
+
// res.data.offers[i] -> { price, currency, condition, seller_name,
|
|
90
|
+
// is_buy_box_winner, is_fulfilled_by_amazon,
|
|
91
|
+
// shipping_price, list_price, delivery, prime_delivery }
|
|
92
|
+
|
|
93
|
+
// Supported marketplaces (no API key required)
|
|
94
|
+
await client.amazon.options();
|
|
83
95
|
```
|
|
84
96
|
|
|
97
|
+
There is no sort parameter: the marketplace was verified to ignore every sort
|
|
98
|
+
value and return the same unordered set, so exposing one would be a filter that
|
|
99
|
+
silently does nothing.
|
|
100
|
+
|
|
101
|
+
#### Amazon changed in 0.12.0 (breaking)
|
|
102
|
+
|
|
103
|
+
Amazon moved to a new upstream and the API now returns a normalized shape
|
|
104
|
+
instead of the previous raw provider payload.
|
|
105
|
+
|
|
106
|
+
- `search` returns `{query, page, total_results, total_results_text, count, products[], filters[], related_searches[]}`.
|
|
107
|
+
Each product is `{asin, title, url, image, price, currency, rating, reviews_count, is_sponsored, position, badge, sales_volume, delivery{is_free, date, fastest_date}}`.
|
|
108
|
+
- `product` returns flat fields: `price`, `list_price`, `currency`, `rating`, `reviews_count`, `features`, `images`, `videos`, `variants`, `specifications`, `best_sellers_rank`, `shipping`, and more. The old `buybox[]` array no longer exists — use `offers` for per-seller pricing.
|
|
109
|
+
- `offers` is new: every seller for one ASIN. 1 credit, page 1 only.
|
|
110
|
+
- `country` (ISO 3166-1 alpha-2) is the marketplace selector and replaces `domain`; `page` replaces `start_page`. Both old names still work as deprecated aliases.
|
|
111
|
+
- Nine options were removed: `language`, `currency`, `device`, `sort_by`, `pages`, `category_id`, `merchant_id`, `zip_code`, `autoselect_variant`. Sending one anyway still returns 200, with a top-level `warnings` array naming what was ignored.
|
|
112
|
+
- `options()` still returns `domains` and `countries`; `languages` and `currencies` are now always empty, because neither is a request parameter any more.
|
|
113
|
+
|
|
85
114
|
### Walmart
|
|
86
115
|
|
|
87
116
|
```typescript
|
package/dist/index.cjs
CHANGED
|
@@ -311,7 +311,18 @@ var AmazonNamespace = class {
|
|
|
311
311
|
...rest
|
|
312
312
|
});
|
|
313
313
|
}
|
|
314
|
-
/**
|
|
314
|
+
/** Every seller offer for one ASIN: price, seller, condition, shipping, and
|
|
315
|
+
* which offer holds the buy box. Page 1 only. */
|
|
316
|
+
async offers(options) {
|
|
317
|
+
const { asin, ...rest } = options;
|
|
318
|
+
return this.client._post("/api/v1/amazon/offers", {
|
|
319
|
+
query: asin,
|
|
320
|
+
...rest
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
/** Supported Amazon marketplaces, as `domains` and `countries`. `languages`
|
|
324
|
+
* and `currencies` remain in the payload but are always empty: neither is a
|
|
325
|
+
* request parameter any more. */
|
|
315
326
|
async options() {
|
|
316
327
|
return this.client._get("/api/v1/amazon/options");
|
|
317
328
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../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/tiktok-shop.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 { Scavio } from \"./client.js\";\nexport type { ScavioConfig } from \"./client.js\";\n\nexport {\n ScavioError,\n MissingAPIKeyError,\n InvalidAPIKeyError,\n InsufficientCreditsError,\n BadRequestError,\n NotFoundError,\n RateLimitError,\n ScavioAPIError,\n ScavioConnectionError,\n ScavioTimeoutError,\n} from \"./errors.js\";\n\nexport type {\n GoogleSearchOptions,\n GoogleAiModeOptions,\n GoogleMapsSearchOptions,\n GoogleMapsPlaceOptions,\n GoogleMapsReviewsOptions,\n GoogleShoppingOptions,\n GoogleShoppingProductOptions,\n GoogleShoppingStoresOptions,\n GoogleFlightsOptions,\n GoogleHotelsOptions,\n GoogleHotelsDetailOptions,\n GoogleNewsOptions,\n GoogleTrendsOptions,\n GoogleTrendingOptions,\n} from \"./namespaces/google.js\";\nexport type {\n AmazonSearchOptions,\n AmazonProductOptions,\n} from \"./namespaces/amazon.js\";\nexport type {\n WalmartSearchOptions,\n WalmartProductOptions,\n} from \"./namespaces/walmart.js\";\nexport type {\n YouTubeSearchOptions,\n YouTubeShortsOptions,\n YouTubeSuggestionsOptions,\n YouTubeVideoOptions,\n YouTubeMetadataOptions,\n YouTubeCommentsOptions,\n YouTubeCommentRepliesOptions,\n YouTubeTranscriptOptions,\n YouTubeRelatedOptions,\n YouTubeChannelSearchOptions,\n YouTubeChannelOptions,\n YouTubeChannelVideosOptions,\n YouTubeChannelShortsOptions,\n YouTubeChannelCommunityOptions,\n YouTubeChannelResolveOptions,\n YouTubeStreamsOptions,\n} from \"./namespaces/youtube.js\";\nexport type {\n RedditSort,\n RedditFeedSort,\n RedditSearchOptions,\n RedditSearchSuggestionsOptions,\n RedditPostOptions,\n RedditPostCommentsOptions,\n RedditCommentRepliesOptions,\n RedditSubredditOptions,\n RedditSubredditPostsOptions,\n RedditUserOptions,\n RedditUserFeedOptions,\n RedditPopularOptions,\n} from \"./namespaces/reddit.js\";\nexport type {\n TikTokProfileOptions,\n TikTokUserPostsOptions,\n TikTokVideoOptions,\n TikTokVideoCommentsOptions,\n TikTokCommentRepliesOptions,\n TikTokSearchVideosOptions,\n TikTokSearchUsersOptions,\n TikTokHashtagOptions,\n TikTokHashtagVideosOptions,\n TikTokUserFollowersOptions,\n TikTokUserFollowingsOptions,\n} from \"./namespaces/tiktok.js\";\nexport type {\n TikTokShopRegion,\n TikTokShopListingRegion,\n TikTokShopReviewSort,\n TikTokShopSearchOptions,\n TikTokShopSuggestionsOptions,\n TikTokShopProductOptions,\n TikTokShopProductReviewsOptions,\n TikTokShopCategoryProductsOptions,\n TikTokShopShopProductsOptions,\n TikTokShopResolveOptions,\n} from \"./namespaces/tiktok-shop.js\";\nexport type {\n InstagramProfileOptions,\n InstagramUserFeedOptions,\n InstagramStoriesOptions,\n InstagramPostOptions,\n InstagramPostCommentsOptions,\n InstagramCommentRepliesOptions,\n InstagramSearchOptions,\n InstagramFollowOptions,\n} from \"./namespaces/instagram.js\";\nexport type {\n XSearchOptions,\n XTweetOptions,\n XTweetCommentsOptions,\n XTweetRetweetersOptions,\n XUserOptions,\n XUserFeedOptions,\n XTrendingOptions,\n} from \"./namespaces/x.js\";\nexport type {\n LinkedInPersonOptions,\n LinkedInPersonRefOptions,\n LinkedInPersonPostsOptions,\n LinkedInPersonContactOptions,\n LinkedInCompanyOptions,\n LinkedInCompanyPostsOptions,\n LinkedInCompanyRefOptions,\n LinkedInSearchPeopleOptions,\n LinkedInSearchJobsOptions,\n LinkedInSearchPostsOptions,\n LinkedInJobOptions,\n LinkedInPostOptions,\n LinkedInPostCommentsOptions,\n} from \"./namespaces/linkedin.js\";\n","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\n/** Marketplace regions served by suggestions, product, reviews, and shop products. */\nexport type TikTokShopRegion =\n | \"US\"\n | \"GB\"\n | \"SG\"\n | \"MY\"\n | \"PH\"\n | \"TH\"\n | \"VN\"\n | \"ID\";\n\n/** Marketplace regions served by category listings. */\nexport type TikTokShopListingRegion = \"US\" | \"GB\";\n\n/** Review ordering: 'relevant' is text-complete and image-heavy, 'recent' is fresher but text-sparse. */\nexport type TikTokShopReviewSort = \"relevant\" | \"recent\";\n\nexport interface TikTokShopSearchOptions {\n /** Search query (1-200 characters). US catalog only. */\n search: string;\n /** Opaque cursor from a prior response's next_cursor. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface TikTokShopSuggestionsOptions {\n /** Partial query to expand (1-100 characters). */\n search: string;\n /** Marketplace region (default 'US'). */\n region?: TikTokShopRegion;\n [key: string]: unknown;\n}\n\nexport interface TikTokShopProductOptions {\n /** TikTok Shop product id (6-25 digits). */\n product_id: string;\n /** Marketplace region (default 'US'). */\n region?: TikTokShopRegion;\n [key: string]: unknown;\n}\n\nexport interface TikTokShopProductReviewsOptions {\n /** TikTok Shop product id (6-25 digits). */\n product_id: string;\n /** 1-based page number (1-500, default 1). */\n page?: number;\n /** Reviews per page (1-200, default 20). */\n page_size?: number;\n /** 'relevant' (default) is text-complete and image-heavy; 'recent' is fresher but far more text-sparse. */\n sort?: TikTokShopReviewSort;\n /** Only reviews with this star rating (1-5). */\n rating?: number;\n /** Only reviews with a photo or video (default false). */\n has_media?: boolean;\n /** Only verified purchases (default false). */\n verified_only?: boolean;\n /** Marketplace region (default 'US'). */\n region?: TikTokShopRegion;\n [key: string]: unknown;\n}\n\nexport interface TikTokShopCategoryProductsOptions {\n /** Category id from tiktokShop.categories(); level 1 or 2 both work. */\n category_id: string;\n /** Opaque cursor from a prior response's next_cursor. */\n cursor?: string;\n /** Marketplace region, 'US' or 'GB' only (default 'US'). */\n region?: TikTokShopListingRegion;\n [key: string]: unknown;\n}\n\nexport interface TikTokShopShopProductsOptions {\n /** TikTok Shop seller id (also called seller_id elsewhere on TikTok). */\n shop_id: string;\n /** Opaque cursor from a prior response's next_cursor. */\n cursor?: string;\n /** Marketplace region (default 'US'). */\n region?: TikTokShopRegion;\n [key: string]: unknown;\n}\n\nexport interface TikTokShopResolveOptions {\n /** A TikTok Shop product or store URL, affiliate share link, or vt.tiktok.com short link. */\n url: string;\n [key: string]: unknown;\n}\n\nexport class TikTokShopNamespace {\n constructor(private client: Scavio) {}\n\n /**\n * Search TikTok Shop products by keyword (US catalog), up to 30 per page with\n * exact prices, ratings, and shop details. Paginate with next_cursor and dedupe\n * by product_id across pages.\n *\n * This is one of the three endpoints that return exact prices; tiktokShop.product()\n * does not return a price. A product_id returned here is not guaranteed to resolve\n * on tiktokShop.product() - only about 44% do.\n */\n async search(\n options: TikTokShopSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/search\", options);\n }\n\n /**\n * Keyword autocomplete and expansion for a partial query, across 8 marketplace\n * regions. Suggestions are not guaranteed prefix matches: a misspelling returns\n * typo corrections, and results can include brand and shop names.\n */\n async searchSuggestions(\n options: TikTokShopSuggestionsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/search/suggestions\", options);\n }\n\n /**\n * Full product detail: description, images, variants with stock, shipping, shop\n * profile, category path, and top reviews.\n *\n * Two limits worth knowing before you build on this:\n *\n * 1. It resolves only about 44% of the product ids returned by tiktokShop.search().\n * Upstream has no detail data for the rest, so an HTTP 404 is a normal outcome,\n * not an error. Skip the item rather than retrying - retries do not help and no\n * other region carries it. Search to product is not a reliable pipeline.\n *\n * This method throws `NotFoundError` on that 404 (there is no `data` field in\n * the response body to test), so a loop over search ids must catch it or it\n * dies on the first miss:\n *\n * ```ts\n * import { NotFoundError } from \"scavio\";\n *\n * for (const productId of productIds) {\n * try {\n * const detail = await client.tiktokShop.product({ product_id: productId });\n * } catch (e) {\n * if (e instanceof NotFoundError) continue; // no detail upstream; skip\n * throw e;\n * }\n * }\n * ```\n *\n * tiktokShop.productReviews() often works for ids product() cannot resolve: of\n * 8 such ids tested, 8 returned HTTP 200 and 7 carried at least one review, so\n * it is a useful fallback source of product detail.\n * 2. It does NOT return a price. Upstream masks the price on the product page.\n * Exact prices come from tiktokShop.search(), tiktokShop.shopProducts(), and\n * tiktokShop.categoryProducts().\n */\n async product(\n options: TikTokShopProductOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/product\", options);\n }\n\n /**\n * Paginated product reviews with text, images, star histogram, and\n * verified-purchase flags, up to 200 per call. total_reviews drifts between calls\n * and must not be used to compute a page count; page with has_more instead.\n */\n async productReviews(\n options: TikTokShopProductReviewsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/product/reviews\", options);\n }\n\n /**\n * The global TikTok Shop category tree: 28 top-level categories, 240 nodes, two\n * levels deep. Category ids are identical in every region and names are always\n * English.\n */\n async categories(): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/categories\", {});\n }\n\n /**\n * Products listed under a category id from tiktokShop.categories(), with exact\n * prices. Page size is inconsistent upstream (15 to 20 per page), so always\n * paginate with next_cursor rather than assuming a fixed page size. Category\n * listings are shallow: after a few pages the source stops returning new products\n * and has_more turns false, which is the end of the listing rather than an error.\n */\n async categoryProducts(\n options: TikTokShopCategoryProductsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/category/products\", options);\n }\n\n /**\n * A shop's product catalog, 30 per page, with exact prices. Shop follower count,\n * location, and shop-level rating are not available here; call\n * tiktokShop.product() for the full shop profile.\n */\n async shopProducts(\n options: TikTokShopShopProductsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/shop/products\", options);\n }\n\n /**\n * Resolve any TikTok Shop URL or share link to a product_id or shop_id, ready to\n * pass to the other methods. Accepts canonical product and store pages,\n * tiktok.com/view links, affiliate share links, and vt.tiktok.com short links.\n */\n async resolve(\n options: TikTokShopResolveOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/resolve\", options);\n }\n}\n","import type { Scavio } from \"../client.js\";\n\n/**\n * Instagram endpoints (/api/v1/instagram). Credit cost varies by endpoint:\n * `userPosts` costs 2 credits, every other endpoint costs 8.\n * See https://scavio.dev/docs/instagram-api.\n */\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\n// The provider retired the `linkedin/web/*` namespace these were built on. Live\n// endpoints now run on `web_v2`, which is URL-native: public params are\n// unchanged (the permalink is built server-side) and `url` is accepted\n// everywhere as a direct alternative. Params web_v2 has no equivalent for (the\n// include_* flags, the member urn) are gone. Pagination is back as of the\n// provider's 2026-07-31 release: list endpoints take an opaque `cursor` and\n// return `next_cursor`, and personPosts gained a `type` feed selector.\n//\n// Five endpoints have no upstream left and always return HTTP 410 unbilled:\n// personContact, companyPeople, companyJobs, searchPeople, searchPosts. They are\n// kept so existing code fails loudly rather than with a TypeError.\n\n/** A member reference: a vanity handle, or a full profile URL. */\nexport interface LinkedInPersonOptions {\n /** Public identifier (vanity handle), e.g. \"williamhgates\". */\n username?: string;\n /** Full LinkedIn profile URL, as an alternative to username. */\n url?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPersonPostsRequest extends LinkedInPersonOptions {\n /** Which feed: the member's own posts (default), posts they commented on, or posts they reacted to. */\n type?: \"posts\" | \"comments\" | \"reactions\";\n /** Opaque cursor from a previous response's next_cursor. */\n cursor?: string;\n}\n\n/** A company reference: a universal name (slug), or a full company URL. */\nexport interface LinkedInCompanyOptions {\n /** Company universal name (slug), e.g. \"microsoft\". */\n company?: string;\n /** Full LinkedIn company URL, as an alternative to company. */\n url?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInCompanyPostsRequest extends LinkedInCompanyOptions {\n /** Opaque cursor from a previous response's next_cursor. */\n cursor?: string;\n}\n\n// The person/company option shapes were reworked when the urn and count params\n// lost their upstream. These aliases keep the old type names importable so\n// existing TypeScript code still compiles.\n/** @deprecated Use {@link LinkedInPersonOptions}. */\nexport type LinkedInPersonRefOptions = LinkedInPersonOptions;\n/** @deprecated Use {@link LinkedInPersonPostsRequest}. */\nexport type LinkedInPersonPostsOptions = LinkedInPersonPostsRequest;\n/** @deprecated Use {@link LinkedInCompanyPostsRequest}. */\nexport type LinkedInCompanyPostsOptions = LinkedInCompanyPostsRequest;\n\nexport interface LinkedInSearchJobsOptions {\n /** Search keyword. */\n search: string;\n /** Geographic filter; omit to search everywhere. */\n location?: string;\n /** Opaque cursor from a previous response's next_cursor. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInJobOptions {\n /** Job listing id. */\n job_id?: string;\n /** Full LinkedIn job URL, as an alternative to job_id. */\n url?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPostOptions {\n /** Post id or activity urn. */\n post_id?: string;\n /** Full LinkedIn post URL, as an alternative to post_id. */\n url?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPostCommentsOptions extends LinkedInPostOptions {\n /** 1-based page number. Page size varies, so page until a page comes back empty. */\n page?: number;\n}\n\n/** @deprecated Retired upstream; always returns HTTP 410. */\nexport interface LinkedInPersonContactOptions {\n username?: string;\n [key: string]: unknown;\n}\n\n/** @deprecated Retired upstream; always returns HTTP 410. */\nexport interface LinkedInCompanyRefOptions {\n company_id?: string;\n company?: string;\n [key: string]: unknown;\n}\n\n/** @deprecated Retired upstream; always returns HTTP 410. */\nexport interface LinkedInSearchPeopleOptions {\n search?: string;\n title?: string;\n company?: string;\n school?: string;\n location?: string;\n [key: string]: unknown;\n}\n\n/** @deprecated Retired upstream; always returns HTTP 410. */\nexport interface LinkedInSearchPostsOptions {\n search?: string;\n [key: string]: unknown;\n}\n\nexport class LinkedInNamespace {\n constructor(private client: Scavio) {}\n\n /** Full profile: about text, experience, education, honours and links. */\n async person(\n options: LinkedInPersonOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/person\", options);\n }\n\n /** The about-only slice of the profile payload. */\n async personAbout(\n options: LinkedInPersonOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/person/about\", options);\n }\n\n /**\n * A member's posts, or the posts they commented on or reacted to via `type`.\n * 50 per page; pass the previous response's `next_cursor` to advance.\n */\n async personPosts(\n options: LinkedInPersonPostsRequest,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/person/posts\", options);\n }\n\n /** Company profile, including locations and featured employees. */\n async company(\n options: LinkedInCompanyOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/company\", options);\n }\n\n /** Recent company posts, 50 per page; advance with `next_cursor`. */\n async companyPosts(\n options: LinkedInCompanyPostsRequest,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/company/posts\", options);\n }\n\n /**\n * Job search, 25 per page; advance with `next_cursor`. Upstream rotates its\n * result set, so pages overlap slightly - dedupe by job id.\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 /** Full detail for one job listing, including the hiring company. */\n async job(\n options: LinkedInJobOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/job\", options);\n }\n\n /** Full detail for one post, including its top visible comments. */\n async post(\n options: LinkedInPostOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/post\", options);\n }\n\n /** Comments with their replies. Page size varies - keep paging until empty. */\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 /**\n * @deprecated Retired by the upstream provider. Always returns HTTP 410 and is\n * never billed.\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 /**\n * @deprecated Retired by the upstream provider. Always returns HTTP 410 and is\n * never billed. `company()` returns `featured_employees`, a small sample of\n * staff profiles.\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 /**\n * @deprecated Retired by the upstream provider. Always returns HTTP 410 and is\n * never billed. Use `searchJobs()` with the company name as the search term.\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 /**\n * @deprecated Retired by the upstream provider. Always returns HTTP 410 and is\n * never billed.\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 /**\n * @deprecated Retired by the upstream provider. Always returns HTTP 410 and is\n * never billed.\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","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 { TikTokShopNamespace } from \"./namespaces/tiktok-shop.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 tiktokShop: TikTokShopNamespace;\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.tiktokShop = new TikTokShopNamespace(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":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../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/tiktok-shop.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 { Scavio } from \"./client.js\";\nexport type { ScavioConfig } from \"./client.js\";\n\nexport {\n ScavioError,\n MissingAPIKeyError,\n InvalidAPIKeyError,\n InsufficientCreditsError,\n BadRequestError,\n NotFoundError,\n RateLimitError,\n ScavioAPIError,\n ScavioConnectionError,\n ScavioTimeoutError,\n} from \"./errors.js\";\n\nexport type {\n GoogleSearchOptions,\n GoogleAiModeOptions,\n GoogleMapsSearchOptions,\n GoogleMapsPlaceOptions,\n GoogleMapsReviewsOptions,\n GoogleShoppingOptions,\n GoogleShoppingProductOptions,\n GoogleShoppingStoresOptions,\n GoogleFlightsOptions,\n GoogleHotelsOptions,\n GoogleHotelsDetailOptions,\n GoogleNewsOptions,\n GoogleTrendsOptions,\n GoogleTrendingOptions,\n} from \"./namespaces/google.js\";\nexport type {\n AmazonSearchOptions,\n AmazonProductOptions,\n AmazonOffersOptions,\n} from \"./namespaces/amazon.js\";\nexport type {\n WalmartSearchOptions,\n WalmartProductOptions,\n} from \"./namespaces/walmart.js\";\nexport type {\n YouTubeSearchOptions,\n YouTubeShortsOptions,\n YouTubeSuggestionsOptions,\n YouTubeVideoOptions,\n YouTubeMetadataOptions,\n YouTubeCommentsOptions,\n YouTubeCommentRepliesOptions,\n YouTubeTranscriptOptions,\n YouTubeRelatedOptions,\n YouTubeChannelSearchOptions,\n YouTubeChannelOptions,\n YouTubeChannelVideosOptions,\n YouTubeChannelShortsOptions,\n YouTubeChannelCommunityOptions,\n YouTubeChannelResolveOptions,\n YouTubeStreamsOptions,\n} from \"./namespaces/youtube.js\";\nexport type {\n RedditSort,\n RedditFeedSort,\n RedditSearchOptions,\n RedditSearchSuggestionsOptions,\n RedditPostOptions,\n RedditPostCommentsOptions,\n RedditCommentRepliesOptions,\n RedditSubredditOptions,\n RedditSubredditPostsOptions,\n RedditUserOptions,\n RedditUserFeedOptions,\n RedditPopularOptions,\n} from \"./namespaces/reddit.js\";\nexport type {\n TikTokProfileOptions,\n TikTokUserPostsOptions,\n TikTokVideoOptions,\n TikTokVideoCommentsOptions,\n TikTokCommentRepliesOptions,\n TikTokSearchVideosOptions,\n TikTokSearchUsersOptions,\n TikTokHashtagOptions,\n TikTokHashtagVideosOptions,\n TikTokUserFollowersOptions,\n TikTokUserFollowingsOptions,\n} from \"./namespaces/tiktok.js\";\nexport type {\n TikTokShopRegion,\n TikTokShopListingRegion,\n TikTokShopReviewSort,\n TikTokShopSearchOptions,\n TikTokShopSuggestionsOptions,\n TikTokShopProductOptions,\n TikTokShopProductReviewsOptions,\n TikTokShopCategoryProductsOptions,\n TikTokShopShopProductsOptions,\n TikTokShopResolveOptions,\n} from \"./namespaces/tiktok-shop.js\";\nexport type {\n InstagramProfileOptions,\n InstagramUserFeedOptions,\n InstagramStoriesOptions,\n InstagramPostOptions,\n InstagramPostCommentsOptions,\n InstagramCommentRepliesOptions,\n InstagramSearchOptions,\n InstagramFollowOptions,\n} from \"./namespaces/instagram.js\";\nexport type {\n XSearchOptions,\n XTweetOptions,\n XTweetCommentsOptions,\n XTweetRetweetersOptions,\n XUserOptions,\n XUserFeedOptions,\n XTrendingOptions,\n} from \"./namespaces/x.js\";\nexport type {\n LinkedInPersonOptions,\n LinkedInPersonRefOptions,\n LinkedInPersonPostsOptions,\n LinkedInPersonContactOptions,\n LinkedInCompanyOptions,\n LinkedInCompanyPostsOptions,\n LinkedInCompanyRefOptions,\n LinkedInSearchPeopleOptions,\n LinkedInSearchJobsOptions,\n LinkedInSearchPostsOptions,\n LinkedInJobOptions,\n LinkedInPostOptions,\n LinkedInPostCommentsOptions,\n} from \"./namespaces/linkedin.js\";\n","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\n/**\n * Amazon moved to a new upstream in 2026-07 and the API now returns a\n * normalized shape instead of the old raw provider payload. Nine options went\n * with the old provider: language, currency, device, sort_by, pages,\n * category_id, merchant_id, zip_code and autoselect_variant. They are removed\n * rather than kept as no-ops - notably `sort_by`, which the marketplace was\n * verified to ignore entirely (every sort value returned the same unordered\n * set). Sending a retired option anyway still returns 200, with a top-level\n * `warnings` array naming what was ignored.\n *\n * `country` is the canonical marketplace selector; `domain` and `start_page`\n * remain as deprecated aliases because published SDK versions send them.\n */\nexport interface AmazonSearchOptions {\n /** Product search query (1-500 characters). */\n query: string;\n /** Marketplace country code (ISO 3166-1 alpha-2, e.g. 'us', 'gb', 'de'). Defaults to 'us'. */\n country?: string;\n /** @deprecated Amazon domain suffix ('com', 'co.uk'). Use `country` instead. */\n domain?: string;\n /** Results page, 1-based. One page per call, 1 credit each. */\n page?: number;\n /** @deprecated Alias for `page`. */\n start_page?: number;\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 /** Marketplace country code (ISO 3166-1 alpha-2, e.g. 'us', 'gb', 'de'). Defaults to 'us'. */\n country?: string;\n /** @deprecated Amazon domain suffix ('com', 'co.uk'). Use `country` instead. */\n domain?: string;\n [key: string]: unknown;\n}\n\nexport interface AmazonOffersOptions {\n /** Amazon ASIN (e.g. 'B09XS7JWHH'). Sent to the API as 'query'. */\n asin: string;\n /** Marketplace country code (ISO 3166-1 alpha-2, e.g. 'us', 'gb', 'de'). Defaults to 'us'. */\n country?: string;\n /** @deprecated Amazon domain suffix ('com', 'co.uk'). Use `country` instead. */\n domain?: string;\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 /** Every seller offer for one ASIN: price, seller, condition, shipping, and\n * which offer holds the buy box. Page 1 only. */\n async offers(options: AmazonOffersOptions): Promise<Record<string, unknown>> {\n const { asin, ...rest } = options;\n return this.client._post(\"/api/v1/amazon/offers\", {\n query: asin,\n ...rest,\n });\n }\n\n /** Supported Amazon marketplaces, as `domains` and `countries`. `languages`\n * and `currencies` remain in the payload but are always empty: neither is a\n * request parameter any more. */\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\n/** Marketplace regions served by suggestions, product, reviews, and shop products. */\nexport type TikTokShopRegion =\n | \"US\"\n | \"GB\"\n | \"SG\"\n | \"MY\"\n | \"PH\"\n | \"TH\"\n | \"VN\"\n | \"ID\";\n\n/** Marketplace regions served by category listings. */\nexport type TikTokShopListingRegion = \"US\" | \"GB\";\n\n/** Review ordering: 'relevant' is text-complete and image-heavy, 'recent' is fresher but text-sparse. */\nexport type TikTokShopReviewSort = \"relevant\" | \"recent\";\n\nexport interface TikTokShopSearchOptions {\n /** Search query (1-200 characters). US catalog only. */\n search: string;\n /** Opaque cursor from a prior response's next_cursor. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface TikTokShopSuggestionsOptions {\n /** Partial query to expand (1-100 characters). */\n search: string;\n /** Marketplace region (default 'US'). */\n region?: TikTokShopRegion;\n [key: string]: unknown;\n}\n\nexport interface TikTokShopProductOptions {\n /** TikTok Shop product id (6-25 digits). */\n product_id: string;\n /** Marketplace region (default 'US'). */\n region?: TikTokShopRegion;\n [key: string]: unknown;\n}\n\nexport interface TikTokShopProductReviewsOptions {\n /** TikTok Shop product id (6-25 digits). */\n product_id: string;\n /** 1-based page number (1-500, default 1). */\n page?: number;\n /** Reviews per page (1-200, default 20). */\n page_size?: number;\n /** 'relevant' (default) is text-complete and image-heavy; 'recent' is fresher but far more text-sparse. */\n sort?: TikTokShopReviewSort;\n /** Only reviews with this star rating (1-5). */\n rating?: number;\n /** Only reviews with a photo or video (default false). */\n has_media?: boolean;\n /** Only verified purchases (default false). */\n verified_only?: boolean;\n /** Marketplace region (default 'US'). */\n region?: TikTokShopRegion;\n [key: string]: unknown;\n}\n\nexport interface TikTokShopCategoryProductsOptions {\n /** Category id from tiktokShop.categories(); level 1 or 2 both work. */\n category_id: string;\n /** Opaque cursor from a prior response's next_cursor. */\n cursor?: string;\n /** Marketplace region, 'US' or 'GB' only (default 'US'). */\n region?: TikTokShopListingRegion;\n [key: string]: unknown;\n}\n\nexport interface TikTokShopShopProductsOptions {\n /** TikTok Shop seller id (also called seller_id elsewhere on TikTok). */\n shop_id: string;\n /** Opaque cursor from a prior response's next_cursor. */\n cursor?: string;\n /** Marketplace region (default 'US'). */\n region?: TikTokShopRegion;\n [key: string]: unknown;\n}\n\nexport interface TikTokShopResolveOptions {\n /** A TikTok Shop product or store URL, affiliate share link, or vt.tiktok.com short link. */\n url: string;\n [key: string]: unknown;\n}\n\nexport class TikTokShopNamespace {\n constructor(private client: Scavio) {}\n\n /**\n * Search TikTok Shop products by keyword (US catalog), up to 30 per page with\n * exact prices, ratings, and shop details. Paginate with next_cursor and dedupe\n * by product_id across pages.\n *\n * This is one of the three endpoints that return exact prices; tiktokShop.product()\n * does not return a price. A product_id returned here is not guaranteed to resolve\n * on tiktokShop.product() - only about 44% do.\n */\n async search(\n options: TikTokShopSearchOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/search\", options);\n }\n\n /**\n * Keyword autocomplete and expansion for a partial query, across 8 marketplace\n * regions. Suggestions are not guaranteed prefix matches: a misspelling returns\n * typo corrections, and results can include brand and shop names.\n */\n async searchSuggestions(\n options: TikTokShopSuggestionsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/search/suggestions\", options);\n }\n\n /**\n * Full product detail: description, images, variants with stock, shipping, shop\n * profile, category path, and top reviews.\n *\n * Two limits worth knowing before you build on this:\n *\n * 1. It resolves only about 44% of the product ids returned by tiktokShop.search().\n * Upstream has no detail data for the rest, so an HTTP 404 is a normal outcome,\n * not an error. Skip the item rather than retrying - retries do not help and no\n * other region carries it. Search to product is not a reliable pipeline.\n *\n * This method throws `NotFoundError` on that 404 (there is no `data` field in\n * the response body to test), so a loop over search ids must catch it or it\n * dies on the first miss:\n *\n * ```ts\n * import { NotFoundError } from \"scavio\";\n *\n * for (const productId of productIds) {\n * try {\n * const detail = await client.tiktokShop.product({ product_id: productId });\n * } catch (e) {\n * if (e instanceof NotFoundError) continue; // no detail upstream; skip\n * throw e;\n * }\n * }\n * ```\n *\n * tiktokShop.productReviews() often works for ids product() cannot resolve: of\n * 8 such ids tested, 8 returned HTTP 200 and 7 carried at least one review, so\n * it is a useful fallback source of product detail.\n * 2. It does NOT return a price. Upstream masks the price on the product page.\n * Exact prices come from tiktokShop.search(), tiktokShop.shopProducts(), and\n * tiktokShop.categoryProducts().\n */\n async product(\n options: TikTokShopProductOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/product\", options);\n }\n\n /**\n * Paginated product reviews with text, images, star histogram, and\n * verified-purchase flags, up to 200 per call. total_reviews drifts between calls\n * and must not be used to compute a page count; page with has_more instead.\n */\n async productReviews(\n options: TikTokShopProductReviewsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/product/reviews\", options);\n }\n\n /**\n * The global TikTok Shop category tree: 28 top-level categories, 240 nodes, two\n * levels deep. Category ids are identical in every region and names are always\n * English.\n */\n async categories(): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/categories\", {});\n }\n\n /**\n * Products listed under a category id from tiktokShop.categories(), with exact\n * prices. Page size is inconsistent upstream (15 to 20 per page), so always\n * paginate with next_cursor rather than assuming a fixed page size. Category\n * listings are shallow: after a few pages the source stops returning new products\n * and has_more turns false, which is the end of the listing rather than an error.\n */\n async categoryProducts(\n options: TikTokShopCategoryProductsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/category/products\", options);\n }\n\n /**\n * A shop's product catalog, 30 per page, with exact prices. Shop follower count,\n * location, and shop-level rating are not available here; call\n * tiktokShop.product() for the full shop profile.\n */\n async shopProducts(\n options: TikTokShopShopProductsOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/shop/products\", options);\n }\n\n /**\n * Resolve any TikTok Shop URL or share link to a product_id or shop_id, ready to\n * pass to the other methods. Accepts canonical product and store pages,\n * tiktok.com/view links, affiliate share links, and vt.tiktok.com short links.\n */\n async resolve(\n options: TikTokShopResolveOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/tiktok-shop/resolve\", options);\n }\n}\n","import type { Scavio } from \"../client.js\";\n\n/**\n * Instagram endpoints (/api/v1/instagram). Credit cost varies by endpoint:\n * `userPosts` costs 2 credits, every other endpoint costs 8.\n * See https://scavio.dev/docs/instagram-api.\n */\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\n// The provider retired the `linkedin/web/*` namespace these were built on. Live\n// endpoints now run on `web_v2`, which is URL-native: public params are\n// unchanged (the permalink is built server-side) and `url` is accepted\n// everywhere as a direct alternative. Params web_v2 has no equivalent for (the\n// include_* flags, the member urn) are gone. Pagination is back as of the\n// provider's 2026-07-31 release: list endpoints take an opaque `cursor` and\n// return `next_cursor`, and personPosts gained a `type` feed selector.\n//\n// Five endpoints have no upstream left and always return HTTP 410 unbilled:\n// personContact, companyPeople, companyJobs, searchPeople, searchPosts. They are\n// kept so existing code fails loudly rather than with a TypeError.\n\n/** A member reference: a vanity handle, or a full profile URL. */\nexport interface LinkedInPersonOptions {\n /** Public identifier (vanity handle), e.g. \"williamhgates\". */\n username?: string;\n /** Full LinkedIn profile URL, as an alternative to username. */\n url?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPersonPostsRequest extends LinkedInPersonOptions {\n /** Which feed: the member's own posts (default), posts they commented on, or posts they reacted to. */\n type?: \"posts\" | \"comments\" | \"reactions\";\n /** Opaque cursor from a previous response's next_cursor. */\n cursor?: string;\n}\n\n/** A company reference: a universal name (slug), or a full company URL. */\nexport interface LinkedInCompanyOptions {\n /** Company universal name (slug), e.g. \"microsoft\". */\n company?: string;\n /** Full LinkedIn company URL, as an alternative to company. */\n url?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInCompanyPostsRequest extends LinkedInCompanyOptions {\n /** Opaque cursor from a previous response's next_cursor. */\n cursor?: string;\n}\n\n// The person/company option shapes were reworked when the urn and count params\n// lost their upstream. These aliases keep the old type names importable so\n// existing TypeScript code still compiles.\n/** @deprecated Use {@link LinkedInPersonOptions}. */\nexport type LinkedInPersonRefOptions = LinkedInPersonOptions;\n/** @deprecated Use {@link LinkedInPersonPostsRequest}. */\nexport type LinkedInPersonPostsOptions = LinkedInPersonPostsRequest;\n/** @deprecated Use {@link LinkedInCompanyPostsRequest}. */\nexport type LinkedInCompanyPostsOptions = LinkedInCompanyPostsRequest;\n\nexport interface LinkedInSearchJobsOptions {\n /** Search keyword. */\n search: string;\n /** Geographic filter; omit to search everywhere. */\n location?: string;\n /** Opaque cursor from a previous response's next_cursor. */\n cursor?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInJobOptions {\n /** Job listing id. */\n job_id?: string;\n /** Full LinkedIn job URL, as an alternative to job_id. */\n url?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPostOptions {\n /** Post id or activity urn. */\n post_id?: string;\n /** Full LinkedIn post URL, as an alternative to post_id. */\n url?: string;\n [key: string]: unknown;\n}\n\nexport interface LinkedInPostCommentsOptions extends LinkedInPostOptions {\n /** 1-based page number. Page size varies, so page until a page comes back empty. */\n page?: number;\n}\n\n/** @deprecated Retired upstream; always returns HTTP 410. */\nexport interface LinkedInPersonContactOptions {\n username?: string;\n [key: string]: unknown;\n}\n\n/** @deprecated Retired upstream; always returns HTTP 410. */\nexport interface LinkedInCompanyRefOptions {\n company_id?: string;\n company?: string;\n [key: string]: unknown;\n}\n\n/** @deprecated Retired upstream; always returns HTTP 410. */\nexport interface LinkedInSearchPeopleOptions {\n search?: string;\n title?: string;\n company?: string;\n school?: string;\n location?: string;\n [key: string]: unknown;\n}\n\n/** @deprecated Retired upstream; always returns HTTP 410. */\nexport interface LinkedInSearchPostsOptions {\n search?: string;\n [key: string]: unknown;\n}\n\nexport class LinkedInNamespace {\n constructor(private client: Scavio) {}\n\n /** Full profile: about text, experience, education, honours and links. */\n async person(\n options: LinkedInPersonOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/person\", options);\n }\n\n /** The about-only slice of the profile payload. */\n async personAbout(\n options: LinkedInPersonOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/person/about\", options);\n }\n\n /**\n * A member's posts, or the posts they commented on or reacted to via `type`.\n * 50 per page; pass the previous response's `next_cursor` to advance.\n */\n async personPosts(\n options: LinkedInPersonPostsRequest,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/person/posts\", options);\n }\n\n /** Company profile, including locations and featured employees. */\n async company(\n options: LinkedInCompanyOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/company\", options);\n }\n\n /** Recent company posts, 50 per page; advance with `next_cursor`. */\n async companyPosts(\n options: LinkedInCompanyPostsRequest,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/company/posts\", options);\n }\n\n /**\n * Job search, 25 per page; advance with `next_cursor`. Upstream rotates its\n * result set, so pages overlap slightly - dedupe by job id.\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 /** Full detail for one job listing, including the hiring company. */\n async job(\n options: LinkedInJobOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/job\", options);\n }\n\n /** Full detail for one post, including its top visible comments. */\n async post(\n options: LinkedInPostOptions,\n ): Promise<Record<string, unknown>> {\n return this.client._post(\"/api/v1/linkedin/post\", options);\n }\n\n /** Comments with their replies. Page size varies - keep paging until empty. */\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 /**\n * @deprecated Retired by the upstream provider. Always returns HTTP 410 and is\n * never billed.\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 /**\n * @deprecated Retired by the upstream provider. Always returns HTTP 410 and is\n * never billed. `company()` returns `featured_employees`, a small sample of\n * staff profiles.\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 /**\n * @deprecated Retired by the upstream provider. Always returns HTTP 410 and is\n * never billed. Use `searchJobs()` with the company name as the search term.\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 /**\n * @deprecated Retired by the upstream provider. Always returns HTTP 410 and is\n * never billed.\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 /**\n * @deprecated Retired by the upstream provider. Always returns HTTP 410 and is\n * never billed.\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","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 { TikTokShopNamespace } from \"./namespaces/tiktok-shop.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 tiktokShop: TikTokShopNamespace;\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.tiktokShop = new TikTokShopNamespace(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":[]}
|