@bowmark/web 1.22.0 → 1.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generated/library.d.ts +2636 -62
- package/dist/generated/validators.js +5975 -3302
- package/package.json +1 -1
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
// rather than imported. An `import` or `export` at the top level of this file would
|
|
6
6
|
// turn it into a module and every declaration below would stop being global.
|
|
7
7
|
//
|
|
8
|
-
// Manifest version:
|
|
9
|
-
//
|
|
8
|
+
// Manifest version: 33a70781b68188bc68feb315e91e0c61cb56ecb49e10d82f223e4feb9d6b3399
|
|
9
|
+
// 50 capabilities, 418 providers, 1121 typed functions, 20 refused.
|
|
10
10
|
// 51,715 family members, sharing 2 interface(s) — declared once and pointed at, never repeated per member.
|
|
11
11
|
//
|
|
12
12
|
// REFUSED — these functions are real and callable, and their declared arguments
|
|
@@ -155,6 +155,118 @@ type CallOptions = {
|
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
+
declare namespace BowmarkCapability_browser_agent {
|
|
159
|
+
// ── Browser agent — the unit's own declarations, verbatim ──
|
|
160
|
+
type BrowserAgentStatus = "running" | "needs_input" | "idle" | "failed" | "stopped" | "closed";
|
|
161
|
+
interface BrowserAgentQuestion {
|
|
162
|
+
kind: "question" | "takeover"; // takeover = a person must act in watchUrl (login, captcha)
|
|
163
|
+
question: string;
|
|
164
|
+
}
|
|
165
|
+
interface StartBrowserAgentOptions {
|
|
166
|
+
task: string; // plain language, name the site
|
|
167
|
+
backend?: string; // default "browser_use"
|
|
168
|
+
model?: string; // e.g. "claude-sonnet-5"; default "gpt-5.6-luna"
|
|
169
|
+
maxCostUsd?: number; // vendor spend ceiling per turn, default 2, max 25
|
|
170
|
+
proxyCountry?: string; // e.g. "us"
|
|
171
|
+
timeoutMs?: number;
|
|
172
|
+
}
|
|
173
|
+
interface StartBrowserAgentResult {
|
|
174
|
+
id: string; // keep this: status/send/stop take it
|
|
175
|
+
status: BrowserAgentStatus;
|
|
176
|
+
watchUrl: string; // private link to WATCH AND CONTROL the live browser — show it to your user only
|
|
177
|
+
backend: string;
|
|
178
|
+
model: string;
|
|
179
|
+
warnings: string[];
|
|
180
|
+
}
|
|
181
|
+
interface BrowserAgentStep { at: string; kind: "thinking" | "action" | "message"; text: string }
|
|
182
|
+
interface BrowserAgentStatusOptions {
|
|
183
|
+
cursor?: string; // from the previous status() — only newer steps return
|
|
184
|
+
waitMs?: number; // wait up to this long (max 60000) for the status to change
|
|
185
|
+
timeoutMs?: number;
|
|
186
|
+
}
|
|
187
|
+
interface BrowserAgentStatusResult {
|
|
188
|
+
id: string;
|
|
189
|
+
status: BrowserAgentStatus;
|
|
190
|
+
question: BrowserAgentQuestion | null; // set when status is "needs_input"
|
|
191
|
+
result: string | null; // the agent's answer for its last finished turn
|
|
192
|
+
error: string | null;
|
|
193
|
+
steps: BrowserAgentStep[];
|
|
194
|
+
cursor: string;
|
|
195
|
+
task: string;
|
|
196
|
+
backend: string;
|
|
197
|
+
model: string;
|
|
198
|
+
closed: boolean;
|
|
199
|
+
warnings: string[];
|
|
200
|
+
}
|
|
201
|
+
interface SendBrowserAgentOptions { interrupt?: boolean; timeoutMs?: number }
|
|
202
|
+
interface SendBrowserAgentResult { id: string; status: BrowserAgentStatus; warnings: string[] }
|
|
203
|
+
interface StopBrowserAgentResult { id: string; status: BrowserAgentStatus; warnings: string[] }
|
|
204
|
+
interface BrowserAgentSummary {
|
|
205
|
+
id: string; status: BrowserAgentStatus; task: string; backend: string; model: string;
|
|
206
|
+
question: BrowserAgentQuestion | null; createdAt: string; closedAt: string | null;
|
|
207
|
+
}
|
|
208
|
+
interface ListBrowserAgentsOptions { open?: boolean } // default true
|
|
209
|
+
interface ListBrowserAgentsResult { sessions: BrowserAgentSummary[]; warnings: string[] }
|
|
210
|
+
interface WatchLinkResult { id: string; watchUrl: string; warnings: string[] }
|
|
211
|
+
|
|
212
|
+
type CallOptions = {
|
|
213
|
+
timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
|
|
214
|
+
// A provider slower than this is DROPPED from the results and
|
|
215
|
+
// NAMED in warnings — never silently absent
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* LAST RESORT, and it costs money: hands a plain-language task to a hosted AI browser agent
|
|
220
|
+
* (Browser Use) when no Bowmark function covers the site or a script against one failed.
|
|
221
|
+
* Returns a session id and a private link your user can open to watch and take over the live
|
|
222
|
+
* browser; later scripts poll it, answer its questions and stop it.
|
|
223
|
+
*/
|
|
224
|
+
interface Unit {
|
|
225
|
+
/**
|
|
226
|
+
* Starts a hosted browser agent on `task` and returns at once with its session `id` and a
|
|
227
|
+
* `watchUrl`. Use ONLY after the library had nothing for this site or a function failed — each
|
|
228
|
+
* turn spends real vendor money, charged to the account. Show `watchUrl` to your user: it lets
|
|
229
|
+
* them watch the agent and take over the browser (log in, solve a captcha). Then poll with
|
|
230
|
+
* `status`.
|
|
231
|
+
*/
|
|
232
|
+
start(options: StartBrowserAgentOptions): Promise<StartBrowserAgentResult>;
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Reads a session: `running`, `needs_input` (relay `question` to your user, answer with
|
|
236
|
+
* `send`), `idle` (done — read `result`), `failed`, `stopped` or `closed`. Pass the previous
|
|
237
|
+
* `cursor` for only new steps, and `waitMs` (≤ 60000) to wait for a change instead of polling
|
|
238
|
+
* tightly.
|
|
239
|
+
*/
|
|
240
|
+
status(id: string, options?: BrowserAgentStatusOptions): Promise<BrowserAgentStatusResult>;
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Sends the agent a follow-up in the same browser: an answer to its question, the go-ahead
|
|
244
|
+
* after your user took over, or a new instruction. Runs when its current turn ends, or at once
|
|
245
|
+
* with `interrupt: true`. Each turn is billed.
|
|
246
|
+
*/
|
|
247
|
+
send(id: string, message: string, options?: SendBrowserAgentOptions): Promise<SendBrowserAgentResult>;
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Stops the agent and shuts its browser; the watch link stops working. Always stop a session
|
|
251
|
+
* you are done with — an open browser keeps costing money until Bowmark closes it after 20
|
|
252
|
+
* idle minutes.
|
|
253
|
+
*/
|
|
254
|
+
stop(id: string): Promise<StopBrowserAgentResult>;
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Lists this account's browser agent sessions, open ones by default — how to recover an id you
|
|
258
|
+
* lost.
|
|
259
|
+
*/
|
|
260
|
+
list(options?: ListBrowserAgentsOptions): Promise<ListBrowserAgentsResult>;
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Makes a NEW watch link for an open session, for when the one from `start` was lost. The
|
|
264
|
+
* previous link stops working.
|
|
265
|
+
*/
|
|
266
|
+
watchLink(id: string): Promise<WatchLinkResult>;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
158
270
|
declare namespace BowmarkCapability_bundles {
|
|
159
271
|
// ── Check whether a set of products can be built and bought right now — the unit's own declarations, verbatim ──
|
|
160
272
|
interface BundleItemAvailability {
|
|
@@ -571,31 +683,21 @@ type CallOptions = {
|
|
|
571
683
|
}
|
|
572
684
|
|
|
573
685
|
/**
|
|
574
|
-
* Actually RUNS a developer dashboard's signup flow and hands back a real, usable API key
|
|
575
|
-
*
|
|
576
|
-
*
|
|
577
|
-
*
|
|
578
|
-
*
|
|
579
|
-
* permission for. MAKE THE EMAIL UNIQUE PER CALL (see the worked example) — the dashboard
|
|
580
|
-
* dedupes by address, so a copied literal example email gets "Redundant origin" on the second
|
|
581
|
-
* and every later run.
|
|
686
|
+
* Actually RUNS a developer dashboard's signup flow and hands back a real, usable API key.
|
|
687
|
+
* Supports: Alpha Vantage (instant, no verification). Call it directly; don't just describe
|
|
688
|
+
* the steps. For Alpha Vantage with a placeholder identity: MAKE THE EMAIL UNIQUE PER CALL
|
|
689
|
+
* (see the worked example) — the dashboard dedupes by address, so a copied literal example
|
|
690
|
+
* email gets "Redundant origin" on the second and every later run.
|
|
582
691
|
*/
|
|
583
692
|
interface Unit {
|
|
584
693
|
/**
|
|
585
|
-
* Signs up for a real API key on a
|
|
586
|
-
*
|
|
587
|
-
* `qa-${Date.now()}@example.com`
|
|
588
|
-
*
|
|
589
|
-
*
|
|
590
|
-
* their own, invent placeholder-shaped ones like the example's — the signup is instant and
|
|
591
|
-
* unverified, so nothing is lost by not stopping to ask first. MAKE THE EMAIL UNIQUE EVERY
|
|
592
|
-
* CALL (e.g. embed `Date.now()`, as the example does) — the dashboard rejects a repeated
|
|
593
|
-
* address with "Redundant origin", so a literal copied example email fails on the second and
|
|
594
|
-
* every later run. `details.occupation` is optional and dashboard-specific. Returns the real
|
|
595
|
-
* key plus the dashboard's own confirmation sentence. `options.timeoutMs` sets the call budget
|
|
596
|
-
* (default 30000).
|
|
694
|
+
* Signs up for a real developer API key on a dashboard. `service` selects which dashboard:
|
|
695
|
+
* "alphavantage" for stock data. For alphavantage: `details.organization` and `details.email`
|
|
696
|
+
* required (MAKE EMAIL UNIQUE PER CALL, e.g. `qa-${Date.now()}@example.com`);
|
|
697
|
+
* `details.occupation` optional. Returns real key plus confirmation. `options.timeoutMs` sets
|
|
698
|
+
* call budget (default 30000).
|
|
597
699
|
*/
|
|
598
|
-
signUp(service: string, details:
|
|
700
|
+
signUp(service: string, details: object, options?: CallOptions): Promise<DeveloperApiKeySignupResult>;
|
|
599
701
|
}
|
|
600
702
|
}
|
|
601
703
|
|
|
@@ -730,6 +832,27 @@ type CallOptions = {
|
|
|
730
832
|
|
|
731
833
|
declare namespace BowmarkCapability_flights {
|
|
732
834
|
// ── Flights — the unit's own declarations, verbatim ──
|
|
835
|
+
// ── "Which day is cheapest?" ── NOT a flights.* function: it is ONE provider call,
|
|
836
|
+
// bowmark.providers.google_flights.getPriceGraph(query: FlightQuery): Promise<PriceGraph>,
|
|
837
|
+
// typed here so no second lookup is needed. Only from/to/depart/return are read.
|
|
838
|
+
// The window is Google's own: about depart-7 days to depart+52 days, not selectable,
|
|
839
|
+
// so to cover a whole month from its 1st pass depart = the 8th.
|
|
840
|
+
type PricePoint = {
|
|
841
|
+
date: string // departure date, "2026-11-08"
|
|
842
|
+
returnDate: string | null // the return priced with it; null for one-way
|
|
843
|
+
price: number | null // cheapest total that day; null where none was priced
|
|
844
|
+
currency: string
|
|
845
|
+
}
|
|
846
|
+
type PriceGraph = {
|
|
847
|
+
from: string
|
|
848
|
+
to: string
|
|
849
|
+
tripType: "round trip" | "one way"
|
|
850
|
+
rangeStart: string // the window Google actually returned
|
|
851
|
+
rangeEnd: string
|
|
852
|
+
points: PricePoint[] // ascending by date
|
|
853
|
+
cheapest: PricePoint | null // ties go to the earliest date
|
|
854
|
+
url: string
|
|
855
|
+
}
|
|
733
856
|
type FlightQuery = {
|
|
734
857
|
from: string // IATA ("SFO") — best for cross-provider matching
|
|
735
858
|
to: string
|
|
@@ -882,7 +1005,10 @@ type FlightStatusResult = {
|
|
|
882
1005
|
* returning `flights: []`, since an empty list would otherwise be indistinguishable from a
|
|
883
1006
|
* route nobody flies. `options.timeoutMs` sets the per-site budget (default 30000) — a site
|
|
884
1007
|
* slower than that is dropped and named, so the answer arrives inside the calling client's own
|
|
885
|
-
* tool-call limit rather than not at all.
|
|
1008
|
+
* tool-call limit rather than not at all. **For 'which day is cheapest' over a range of dates,
|
|
1009
|
+
* do not call this once per date**: `bowmark.providers.google_flights.getPriceGraph(query:
|
|
1010
|
+
* FlightQuery): Promise<PriceGraph>` (both typed above) prices every departure date from about
|
|
1011
|
+
* depart-7 to depart+52 in one call.
|
|
886
1012
|
*/
|
|
887
1013
|
search(query: FlightQuery, options?: CallOptions): Promise<FlightSearchResult>;
|
|
888
1014
|
|
|
@@ -2597,11 +2723,12 @@ type ShippingQuery = {
|
|
|
2597
2723
|
// One normalized shipping-rate quote. Same shape no matter which carrier
|
|
2598
2724
|
// quoted it.
|
|
2599
2725
|
type ShippingRate = {
|
|
2600
|
-
source: string // "usps" | "ups"
|
|
2726
|
+
source: string // "usps" | "ups" | "pirateship"
|
|
2601
2727
|
serviceCode: string // the carrier's own code, verbatim
|
|
2602
2728
|
serviceName: string // the carrier's own name, e.g. "UPS Ground"
|
|
2603
2729
|
price: { amount: number; currency: string } // integer minor units (cents)
|
|
2604
2730
|
transitDays: number | null // null when the carrier didn't state one
|
|
2731
|
+
deliveryEstimate?: string | null // the carrier's own delivery-date text, when stated
|
|
2605
2732
|
}
|
|
2606
2733
|
|
|
2607
2734
|
type ShippingEstimateResult = {
|
|
@@ -2619,25 +2746,82 @@ type CallOptions = {
|
|
|
2619
2746
|
* Prices a domestic package across USPS and UPS for a ZIP-to-ZIP move, weight and optional
|
|
2620
2747
|
* dimensions, and returns normalized quotes cheapest first — service name, price and transit
|
|
2621
2748
|
* days where the carrier states one. Direct JSON, no browser. USPS needs no key and always
|
|
2622
|
-
* quotes
|
|
2623
|
-
*
|
|
2749
|
+
* quotes. Pirate Ship (source `pirateship`) also quotes USPS AND UPS with no key, at its
|
|
2750
|
+
* discounted label prices, with a delivery date. UPS direct is BYOK; without a UPS developer
|
|
2751
|
+
* key that one leg is dropped and named in `warnings`.
|
|
2624
2752
|
*/
|
|
2625
2753
|
interface Unit {
|
|
2626
2754
|
/**
|
|
2627
2755
|
* Prices a domestic package — `{ fromZip: "20024", toZip: "10001", weightOz: 16 }` — across
|
|
2628
2756
|
* every USPS and UPS service that quotes it, and returns `rates` cheapest first.
|
|
2629
2757
|
* `length`/`width`/`height` (inches) must be given together or omitted entirely. USPS needs no
|
|
2630
|
-
* API key.
|
|
2631
|
-
*
|
|
2632
|
-
*
|
|
2633
|
-
*
|
|
2634
|
-
*
|
|
2635
|
-
*
|
|
2758
|
+
* API key. Pirate Ship (`source: "pirateship"`) needs none either and quotes BOTH USPS and UPS
|
|
2759
|
+
* at its discounted label prices, with the carrier named in `serviceName` and a
|
|
2760
|
+
* `deliveryEstimate` date; given no dimensions, it prices a 10x8x4 inch box. UPS direct is
|
|
2761
|
+
* BYOK: bring your own UPS developer key or that leg is dropped and named in `warnings` (it is
|
|
2762
|
+
* never served off a fleet credential). `warnings` also names any carrier dropped for a
|
|
2763
|
+
* timeout or an error. THROWS `AllProvidersFailedError` when NEITHER carrier answered, because
|
|
2764
|
+
* that is a different fact from "no service quotes this shipment" and only one of them means
|
|
2765
|
+
* there truly is no rate. `options.timeoutMs` sets the per-carrier budget (default 30000).
|
|
2636
2766
|
*/
|
|
2637
2767
|
estimate(query: ShippingQuery, options?: CallOptions): Promise<ShippingEstimateResult>;
|
|
2638
2768
|
}
|
|
2639
2769
|
}
|
|
2640
2770
|
|
|
2771
|
+
declare namespace BowmarkCapability_stream_highlights {
|
|
2772
|
+
// ── Stream highlights — cut a highlight of your own live broadcast — the unit's own declarations, verbatim ──
|
|
2773
|
+
interface CreateHighlightOptions {
|
|
2774
|
+
platform?: "twitch" // the default, and the only one today
|
|
2775
|
+
videoId?: string // id or video link; omit for the newest broadcast (the live one, while live)
|
|
2776
|
+
startSeconds: number // seconds into that broadcast
|
|
2777
|
+
endSeconds: number
|
|
2778
|
+
title: string
|
|
2779
|
+
description?: string
|
|
2780
|
+
language?: string // default "en"
|
|
2781
|
+
tags?: string[]
|
|
2782
|
+
game?: string // category name, e.g. "Wetrix"
|
|
2783
|
+
}
|
|
2784
|
+
interface StreamHighlight {
|
|
2785
|
+
// "created" by this call; "existing" = a highlight with this exact title was
|
|
2786
|
+
// already on the channel, nothing new made; "unknown" = no answer came back —
|
|
2787
|
+
// check dashboardUrl. Calling again with the same title is always safe.
|
|
2788
|
+
status: "created" | "existing" | "unknown"
|
|
2789
|
+
platform: "twitch"
|
|
2790
|
+
highlightId: string | null // null only when status is "unknown"
|
|
2791
|
+
url: string | null
|
|
2792
|
+
title: string
|
|
2793
|
+
videoId: string
|
|
2794
|
+
startSeconds: number
|
|
2795
|
+
endSeconds: number
|
|
2796
|
+
channel: string
|
|
2797
|
+
dashboardUrl: string
|
|
2798
|
+
warnings: string[]
|
|
2799
|
+
}
|
|
2800
|
+
|
|
2801
|
+
type CallOptions = {
|
|
2802
|
+
timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
|
|
2803
|
+
// A provider slower than this is DROPPED from the results and
|
|
2804
|
+
// NAMED in warnings — never silently absent
|
|
2805
|
+
}
|
|
2806
|
+
|
|
2807
|
+
/**
|
|
2808
|
+
* Cuts a permanent Highlight out of a streamer's own broadcast on Twitch — including the one
|
|
2809
|
+
* still live — between two offsets in seconds, with a title. Needs the streamer's Twitch
|
|
2810
|
+
* sign-in: the first run answers needs_user with a link to sign in, and later runs reuse it.
|
|
2811
|
+
*/
|
|
2812
|
+
interface Unit {
|
|
2813
|
+
/**
|
|
2814
|
+
* Cuts a highlight from [startSeconds, endSeconds] of the signed-in streamer's broadcast
|
|
2815
|
+
* (`videoId`, or the newest one — the live one while streaming) and titles it. Safe to call
|
|
2816
|
+
* again with the same title: an existing highlight of that title is returned with status
|
|
2817
|
+
* "existing" instead of being cut twice. THROWS with "Retry shortly" when the live broadcast's
|
|
2818
|
+
* archive has not recorded up to endSeconds yet (it trails real time by a minute or two).
|
|
2819
|
+
* Needs a Twitch sign-in.
|
|
2820
|
+
*/
|
|
2821
|
+
create(options: CreateHighlightOptions): Promise<StreamHighlight>;
|
|
2822
|
+
}
|
|
2823
|
+
}
|
|
2824
|
+
|
|
2641
2825
|
declare namespace BowmarkCapability_tariff {
|
|
2642
2826
|
// ── HS/HTS tariff code lookup — the unit's own declarations, verbatim ──
|
|
2643
2827
|
|
|
@@ -3855,6 +4039,291 @@ interface AlphavantageSignUpResult {
|
|
|
3855
4039
|
}
|
|
3856
4040
|
}
|
|
3857
4041
|
|
|
4042
|
+
declare namespace BowmarkProvider_amazon {
|
|
4043
|
+
// ── Amazon — the unit's own declarations, verbatim ──
|
|
4044
|
+
interface AmazonProduct {
|
|
4045
|
+
asin: string;
|
|
4046
|
+
title: string;
|
|
4047
|
+
url: string;
|
|
4048
|
+
price: number | null;
|
|
4049
|
+
listPrice: number | null;
|
|
4050
|
+
rating: number | null;
|
|
4051
|
+
ratingCount: number | null;
|
|
4052
|
+
sponsored: boolean;
|
|
4053
|
+
}
|
|
4054
|
+
interface SearchProductsArgs {
|
|
4055
|
+
keywords: string;
|
|
4056
|
+
department?: string;
|
|
4057
|
+
sort?: string;
|
|
4058
|
+
priceMin?: number;
|
|
4059
|
+
priceMax?: number;
|
|
4060
|
+
brand?: string;
|
|
4061
|
+
}
|
|
4062
|
+
interface AmazonKeywordSuggestion {
|
|
4063
|
+
value: string;
|
|
4064
|
+
}
|
|
4065
|
+
interface AmazonBestSellerCategory {
|
|
4066
|
+
name: string;
|
|
4067
|
+
slug: string;
|
|
4068
|
+
}
|
|
4069
|
+
interface AmazonBestSellerEntry {
|
|
4070
|
+
asin: string;
|
|
4071
|
+
rank: number;
|
|
4072
|
+
title: string;
|
|
4073
|
+
url: string;
|
|
4074
|
+
price: number | null;
|
|
4075
|
+
rating: number | null;
|
|
4076
|
+
ratingCount: number | null;
|
|
4077
|
+
}
|
|
4078
|
+
interface AmazonBestSellerRankEntry {
|
|
4079
|
+
category: string;
|
|
4080
|
+
rank: number;
|
|
4081
|
+
}
|
|
4082
|
+
interface AmazonProductDetail {
|
|
4083
|
+
asin: string;
|
|
4084
|
+
title: string;
|
|
4085
|
+
url: string;
|
|
4086
|
+
brand: string | null;
|
|
4087
|
+
price: number | null;
|
|
4088
|
+
listPrice: number | null;
|
|
4089
|
+
inStock: boolean;
|
|
4090
|
+
availabilityText: string | null;
|
|
4091
|
+
rating: number | null;
|
|
4092
|
+
ratingCount: number | null;
|
|
4093
|
+
features: string[]; // the site's own free-text bullet points — read them off a result, never guess one from prose
|
|
4094
|
+
specifications: Record<string, string>;
|
|
4095
|
+
breadcrumbs: string[];
|
|
4096
|
+
bestSellersRank: AmazonBestSellerRankEntry[];
|
|
4097
|
+
images: string[];
|
|
4098
|
+
soldBy: string | null;
|
|
4099
|
+
sellerId: string | null;
|
|
4100
|
+
}
|
|
4101
|
+
interface AmazonVariation {
|
|
4102
|
+
asin: string;
|
|
4103
|
+
dimensions: Record<string, string>; // e.g. { style_name: "Skillet", size_name: "12-inch" } — the site's own dimension names
|
|
4104
|
+
isCurrent: boolean;
|
|
4105
|
+
}
|
|
4106
|
+
interface AmazonReview {
|
|
4107
|
+
reviewId: string;
|
|
4108
|
+
author: string;
|
|
4109
|
+
rating: number;
|
|
4110
|
+
title: string;
|
|
4111
|
+
date: string; // the site's own sentence, e.g. "Reviewed in the United States on August 9, 2026"
|
|
4112
|
+
variant: string | null; // e.g. "Style: Skillet, Size: 15-inch"
|
|
4113
|
+
verifiedPurchase: boolean;
|
|
4114
|
+
body: string; // paragraphs joined with a blank line, in the site's own order
|
|
4115
|
+
helpfulCount: number;
|
|
4116
|
+
}
|
|
4117
|
+
interface AmazonRelatedProduct {
|
|
4118
|
+
asin: string;
|
|
4119
|
+
title: string;
|
|
4120
|
+
url: string;
|
|
4121
|
+
price: number | null;
|
|
4122
|
+
rating: number | null; // null on a "Frequently bought together" row — that rail never shows one
|
|
4123
|
+
ratingCount: number | null;
|
|
4124
|
+
}
|
|
4125
|
+
interface AmazonRelatedProducts {
|
|
4126
|
+
boughtTogether: AmazonRelatedProduct[]; // complements, never the current ASIN
|
|
4127
|
+
related: AmazonRelatedProduct[]; // "Customers who viewed this item also viewed" — substitutes
|
|
4128
|
+
unavailableRails: string[]; // sims-consolidated-N_feature_div ids Amazon lazy-loads rather than serving inline
|
|
4129
|
+
}
|
|
4130
|
+
interface AmazonDeal {
|
|
4131
|
+
asin: string;
|
|
4132
|
+
title: string;
|
|
4133
|
+
url: string;
|
|
4134
|
+
dealPrice: number;
|
|
4135
|
+
listPrice: number | null;
|
|
4136
|
+
percentOff: number | null;
|
|
4137
|
+
limitedTimeText: string | null; // e.g. "Limited time deal", or "Ends in 2026-09-16T06:59:59.000Z" for a countdown deal
|
|
4138
|
+
}
|
|
4139
|
+
interface AmazonSellerRatingPeriod {
|
|
4140
|
+
averageRating: number | null;
|
|
4141
|
+
ratingCount: number | null;
|
|
4142
|
+
}
|
|
4143
|
+
interface AmazonSeller {
|
|
4144
|
+
sellerId: string;
|
|
4145
|
+
name: string;
|
|
4146
|
+
positivePercentageLast12Months: number | null; // Amazon's own headline figure; no lifetime equivalent is published
|
|
4147
|
+
ratings: {
|
|
4148
|
+
last30Days: AmazonSellerRatingPeriod;
|
|
4149
|
+
last90Days: AmazonSellerRatingPeriod;
|
|
4150
|
+
last12Months: AmazonSellerRatingPeriod;
|
|
4151
|
+
lifetime: AmazonSellerRatingPeriod;
|
|
4152
|
+
};
|
|
4153
|
+
businessName: string | null;
|
|
4154
|
+
businessAddress: string[];
|
|
4155
|
+
aboutSeller: string | null;
|
|
4156
|
+
}
|
|
4157
|
+
interface GetDeliveryEstimateArgs {
|
|
4158
|
+
product: string;
|
|
4159
|
+
zip: string;
|
|
4160
|
+
}
|
|
4161
|
+
interface AmazonDeliveryEstimate {
|
|
4162
|
+
asin: string;
|
|
4163
|
+
zip: string;
|
|
4164
|
+
zipResolved: boolean; // false = the fields below are Amazon's default location, not this zip
|
|
4165
|
+
deliveryDate: string | null;
|
|
4166
|
+
priceLabel: string | null;
|
|
4167
|
+
condition: string | null; // the site's own labels — read the values off a result, never guess one from prose
|
|
4168
|
+
}
|
|
4169
|
+
interface AmazonSellerOffer {
|
|
4170
|
+
condition: string; // e.g. "New", "Used - Good", "Used - Acceptable" — read the values off a result, never guess one from prose
|
|
4171
|
+
price: number | null;
|
|
4172
|
+
shippingCost: number | null; // derived from shippingLabel ("FREE" -> 0)
|
|
4173
|
+
shippingLabel: string | null; // the site's own delivery-price label, e.g. "FREE" or "$3.99"
|
|
4174
|
+
deliveryEstimate: string | null; // e.g. "September 24 - 29"
|
|
4175
|
+
sellerName: string; // "Amazon.com" when Amazon itself is the seller
|
|
4176
|
+
sellerId: string | null; // null when sold by Amazon.com itself — getSeller's argument otherwise
|
|
4177
|
+
sellerRating: number | null; // 0-5
|
|
4178
|
+
sellerRatingCount: number | null;
|
|
4179
|
+
}
|
|
4180
|
+
interface AmazonSellerOffersResult {
|
|
4181
|
+
asin: string;
|
|
4182
|
+
totalOfferCount: number | null; // Amazon's own count, including offers this page did not render
|
|
4183
|
+
offers: AmazonSellerOffer[]; // page one only, up to 10 — see the note on listSellerOffers
|
|
4184
|
+
}
|
|
4185
|
+
|
|
4186
|
+
/**
|
|
4187
|
+
* Search Amazon's catalogue and read a product the way a shopper does — price, stock, rating,
|
|
4188
|
+
* the customer reviews, the other products it recommends, every size and colour the listing
|
|
4189
|
+
* sells, when it would arrive at a given ZIP — plus the rankings (best sellers, new releases,
|
|
4190
|
+
* movers and shakers, most wished for), today's deals and a marketplace seller's feedback.
|
|
4191
|
+
* searchProducts, suggestKeywords, listBestSellerCategories, getProduct, listVariations,
|
|
4192
|
+
* listReviews, listRelatedProducts, listBestSellers, listNewReleases, listMostWishedFor,
|
|
4193
|
+
* listDeals, getSeller, getDeliveryEstimate and listSellerOffers are built; everything else is
|
|
4194
|
+
* still a declared stub.
|
|
4195
|
+
*/
|
|
4196
|
+
interface Unit {
|
|
4197
|
+
/**
|
|
4198
|
+
* Search Amazon's catalogue for what a person would type — "cast iron skillet", "usb c hub" —
|
|
4199
|
+
* and get back the result cards as the site ranks them: ASIN, title, price, list price, star
|
|
4200
|
+
* rating, review count, whether the row is a paid placement, and its product URL. Optionally
|
|
4201
|
+
* narrowed to a department, a brand, a price range and a sort order. THE provider's door:
|
|
4202
|
+
* every function below that takes an ASIN is fed by this one.
|
|
4203
|
+
*/
|
|
4204
|
+
searchProducts(args: SearchProductsArgs): Promise<AmazonProduct[]>;
|
|
4205
|
+
|
|
4206
|
+
/**
|
|
4207
|
+
* Ask Amazon's own search box what it would autocomplete a prefix to — "cast iron" comes back
|
|
4208
|
+
* as "cast iron skillets", "cast iron", "cast iron dutch oven". What an agent holding a vague
|
|
4209
|
+
* noun calls before it commits to a search, and the cheapest call in the provider.
|
|
4210
|
+
*/
|
|
4211
|
+
suggestKeywords(prefix: string): Promise<AmazonKeywordSuggestion[]>;
|
|
4212
|
+
|
|
4213
|
+
/**
|
|
4214
|
+
* List the departments Amazon publishes Best Sellers rankings for — Electronics, Kitchen &
|
|
4215
|
+
* Dining, Books, roughly forty of them — each with the slug ("electronics", "kitchen",
|
|
4216
|
+
* "books") that listBestSellers, listNewReleases, listMostWishedFor and listMoversAndShakers
|
|
4217
|
+
* take. The door for all four ranking functions: a caller holding the word "kitchen" cannot
|
|
4218
|
+
* reach a ranking without this.
|
|
4219
|
+
*/
|
|
4220
|
+
listBestSellerCategories(): Promise<AmazonBestSellerCategory[]>;
|
|
4221
|
+
|
|
4222
|
+
/**
|
|
4223
|
+
* Read one product page the way a shopper reads it: title, brand, ASIN, current price and list
|
|
4224
|
+
* price, whether it is in stock, the star rating and how many ratings it has, the bullet-point
|
|
4225
|
+
* features, the specification table, the images, its category breadcrumb, its Best Sellers
|
|
4226
|
+
* Rank, and who it is sold by. The single most-wanted read on the whole site.
|
|
4227
|
+
*/
|
|
4228
|
+
getProduct(asinOrUrl: string): Promise<AmazonProductDetail>;
|
|
4229
|
+
|
|
4230
|
+
/**
|
|
4231
|
+
* List every version of a product that is really the same listing — the 8-inch, 10.25-inch,
|
|
4232
|
+
* 12-inch and 15-inch skillet; the colours; the pack sizes — each with the ASIN that buys it.
|
|
4233
|
+
* What an agent needs when the person said "the 12 inch one" and the search returned whichever
|
|
4234
|
+
* size Amazon ranked first. Empty when the listing has no variations — a real answer, not a
|
|
4235
|
+
* parse failure.
|
|
4236
|
+
*/
|
|
4237
|
+
listVariations(asinOrUrl: string): Promise<AmazonVariation[]>;
|
|
4238
|
+
|
|
4239
|
+
/**
|
|
4240
|
+
* Read what customers actually wrote about a product — reviewer name, star rating, headline,
|
|
4241
|
+
* date, the variant they bought, whether the purchase was Verified, the review body, and how
|
|
4242
|
+
* many people found it helpful. Amazon shows a logged-out visitor its top eight reviews on the
|
|
4243
|
+
* product page itself; sorting, filtering and paging past them needs a signed-in account,
|
|
4244
|
+
* which sign-up has not shipped for yet. The read an agent needs to answer "is this any good"
|
|
4245
|
+
* rather than "what does it cost".
|
|
4246
|
+
*/
|
|
4247
|
+
listReviews(asinOrUrl: string): Promise<AmazonReview[]>;
|
|
4248
|
+
|
|
4249
|
+
/**
|
|
4250
|
+
* The other products Amazon puts next to this one — "Frequently bought together" and
|
|
4251
|
+
* "Customers who viewed this item also viewed" — each with its ASIN, title, price and rating,
|
|
4252
|
+
* kept in separate arrays so a caller can tell a complement from a substitute. Names any
|
|
4253
|
+
* further rail Amazon lazy-loads rather than serving inline rather than silently dropping it.
|
|
4254
|
+
* How an agent moves from one product to the alternatives without inventing a new search
|
|
4255
|
+
* query.
|
|
4256
|
+
*/
|
|
4257
|
+
listRelatedProducts(asinOrUrl: string): Promise<AmazonRelatedProducts>;
|
|
4258
|
+
|
|
4259
|
+
/**
|
|
4260
|
+
* Amazon's hourly-updated top sellers in one department (the slug listBestSellerCategories
|
|
4261
|
+
* returns, e.g. "kitchen") — each row's ASIN, rank, title, price and rating, in rank order.
|
|
4262
|
+
* What is actually selling right now, as opposed to searchProducts' relevance ranking. Page
|
|
4263
|
+
* one only (up to 30 rows) — Amazon publishes more per department across a paging control this
|
|
4264
|
+
* pass did not find.
|
|
4265
|
+
*/
|
|
4266
|
+
listBestSellers(department: string): Promise<AmazonBestSellerEntry[]>;
|
|
4267
|
+
|
|
4268
|
+
/**
|
|
4269
|
+
* What is newly out in a department (the slug listBestSellerCategories returns, e.g.
|
|
4270
|
+
* "kitchen"), in Amazon's own hot-new-releases order — each row's ASIN, rank, title, price and
|
|
4271
|
+
* rating. The ranking a caller wants when "best seller" would only ever return the same
|
|
4272
|
+
* entrenched products. Page one only (up to 30 rows), the same limit listBestSellers carries
|
|
4273
|
+
* and for the same reason.
|
|
4274
|
+
*/
|
|
4275
|
+
listNewReleases(department: string): Promise<AmazonBestSellerEntry[]>;
|
|
4276
|
+
|
|
4277
|
+
/**
|
|
4278
|
+
* What people in a department (the slug listBestSellerCategories returns, e.g. "kitchen") are
|
|
4279
|
+
* adding to wish lists and registries most — each row's ASIN, rank, title, price and rating.
|
|
4280
|
+
* Demand that has not turned into a purchase yet, which is a different signal from
|
|
4281
|
+
* listBestSellers' sales rank. Page one only (up to 30 rows), the same limit the other
|
|
4282
|
+
* rankings carry.
|
|
4283
|
+
*/
|
|
4284
|
+
listMostWishedFor(department: string): Promise<AmazonBestSellerEntry[]>;
|
|
4285
|
+
|
|
4286
|
+
/**
|
|
4287
|
+
* Today's Deals — what is discounted right now: ASIN, title, the deal price, the price it was,
|
|
4288
|
+
* the percentage off, and any "limited time" wording (a plain label, or, for a countdown deal,
|
|
4289
|
+
* the fragment plus its ISO deadline). Read off the page's own widget JSON rather than scraped
|
|
4290
|
+
* from a card, so the discount is a published field rather than something to compute. Page one
|
|
4291
|
+
* only (30 deals) — the site's own paging control was not found this pass.
|
|
4292
|
+
*/
|
|
4293
|
+
listDeals(): Promise<AmazonDeal[]>;
|
|
4294
|
+
|
|
4295
|
+
/**
|
|
4296
|
+
* Read a marketplace seller's storefront — their name, feedback across four windows (30 days,
|
|
4297
|
+
* 90 days, the last 12 months and lifetime), the one positive-percentage figure Amazon
|
|
4298
|
+
* publishes (last 12 months only), their registered business name and address, and their
|
|
4299
|
+
* free-text "About Seller" text. What tells an agent whether the cheap third-party offer is
|
|
4300
|
+
* from a shop with 86,000 ratings or one with thirty. The door is getProduct's sellerId field
|
|
4301
|
+
* — a listing Amazon sells itself has none.
|
|
4302
|
+
*/
|
|
4303
|
+
getSeller(sellerId: string): Promise<AmazonSeller>;
|
|
4304
|
+
|
|
4305
|
+
/**
|
|
4306
|
+
* When a product would actually arrive at a given US ZIP, and what it costs to get it there —
|
|
4307
|
+
* sets the ZIP for one session (Amazon's own "glow" location picker, no account needed) and
|
|
4308
|
+
* reads the delivery block the product page then re-renders for it: the site's own delivery
|
|
4309
|
+
* sentence, the price label and the condition it attaches. `zipResolved` is false, and the
|
|
4310
|
+
* three fields are Amazon's DEFAULT location rather than the caller's ZIP, on an invalid ZIP.
|
|
4311
|
+
*/
|
|
4312
|
+
getDeliveryEstimate(args: GetDeliveryEstimateArgs): Promise<AmazonDeliveryEstimate>;
|
|
4313
|
+
|
|
4314
|
+
/**
|
|
4315
|
+
* Every seller offering the same listing side by side — condition (new, used, its grade),
|
|
4316
|
+
* price, shipping cost and estimate, and the seller's own name, id and star rating — read off
|
|
4317
|
+
* the site's "All Offers Display" modal rather than the buy-box winner alone. What tells an
|
|
4318
|
+
* agent who has it cheapest, and whether the cheap one is Amazon itself or a thirty-rating
|
|
4319
|
+
* marketplace seller. Page one only (up to 10 offers, `totalOfferCount` reports the site's own
|
|
4320
|
+
* full count) — no paging control was found in the modal's static markup this pass. Empty
|
|
4321
|
+
* `offers` on a listing with no other sellers is a real answer, not a parse failure.
|
|
4322
|
+
*/
|
|
4323
|
+
listSellerOffers(asinOrUrl: string): Promise<AmazonSellerOffersResult>;
|
|
4324
|
+
}
|
|
4325
|
+
}
|
|
4326
|
+
|
|
3858
4327
|
declare namespace BowmarkProvider_americandreamvacations {
|
|
3859
4328
|
// ── American Dream Vacations — the unit's own declarations, verbatim ──
|
|
3860
4329
|
interface AdvLocation {
|
|
@@ -4317,6 +4786,329 @@ interface AosomProduct {
|
|
|
4317
4786
|
}
|
|
4318
4787
|
}
|
|
4319
4788
|
|
|
4789
|
+
declare namespace BowmarkProvider_app_store {
|
|
4790
|
+
// ── Apple App Store — the unit's own declarations, verbatim ──
|
|
4791
|
+
interface AppStoreApp {
|
|
4792
|
+
id: string;
|
|
4793
|
+
name: string;
|
|
4794
|
+
bundleId: string;
|
|
4795
|
+
developer: { id: string; name: string };
|
|
4796
|
+
price: { amount: number; currency: string; formatted: string } | null;
|
|
4797
|
+
rating: { average: number; count: number } | null;
|
|
4798
|
+
category: string;
|
|
4799
|
+
url: string;
|
|
4800
|
+
}
|
|
4801
|
+
type AppStorePlatform = "iphone" | "ipad" | "mac";
|
|
4802
|
+
interface SearchAppsArgs {
|
|
4803
|
+
term: string;
|
|
4804
|
+
platform?: AppStorePlatform;
|
|
4805
|
+
genreId?: string | number;
|
|
4806
|
+
country?: string;
|
|
4807
|
+
limit?: number;
|
|
4808
|
+
}
|
|
4809
|
+
interface AppStoreSearchResult {
|
|
4810
|
+
term: string;
|
|
4811
|
+
platform: AppStorePlatform;
|
|
4812
|
+
country: string;
|
|
4813
|
+
total: number;
|
|
4814
|
+
apps: AppStoreApp[];
|
|
4815
|
+
}
|
|
4816
|
+
interface GetAppArgs {
|
|
4817
|
+
app: string | number;
|
|
4818
|
+
country?: string;
|
|
4819
|
+
}
|
|
4820
|
+
interface GetAppsArgs {
|
|
4821
|
+
apps: (string | number)[];
|
|
4822
|
+
country?: string;
|
|
4823
|
+
}
|
|
4824
|
+
interface GetAppsResult {
|
|
4825
|
+
apps: AppStoreApp[];
|
|
4826
|
+
warnings: string[];
|
|
4827
|
+
}
|
|
4828
|
+
interface GetAppDetailsArgs {
|
|
4829
|
+
app: string | number;
|
|
4830
|
+
country?: string;
|
|
4831
|
+
}
|
|
4832
|
+
interface AppStoreRatingHistogram {
|
|
4833
|
+
average: number;
|
|
4834
|
+
total: number;
|
|
4835
|
+
counts: number[];
|
|
4836
|
+
}
|
|
4837
|
+
interface AppStoreChartPosition {
|
|
4838
|
+
category: string;
|
|
4839
|
+
position: number;
|
|
4840
|
+
}
|
|
4841
|
+
interface AppStoreInAppPurchase {
|
|
4842
|
+
name: string;
|
|
4843
|
+
price: string;
|
|
4844
|
+
}
|
|
4845
|
+
interface AppStorePrivacyCategory {
|
|
4846
|
+
type: string;
|
|
4847
|
+
title: string;
|
|
4848
|
+
categories: string[];
|
|
4849
|
+
}
|
|
4850
|
+
interface AppStoreVersionInfo {
|
|
4851
|
+
version: string | null;
|
|
4852
|
+
releaseDate: string | null;
|
|
4853
|
+
notes: string;
|
|
4854
|
+
}
|
|
4855
|
+
interface AppStoreLink {
|
|
4856
|
+
label: string;
|
|
4857
|
+
url: string;
|
|
4858
|
+
}
|
|
4859
|
+
interface AppStoreFeaturedStory {
|
|
4860
|
+
title: string;
|
|
4861
|
+
url: string;
|
|
4862
|
+
}
|
|
4863
|
+
interface AppStoreAppDetails {
|
|
4864
|
+
id: string;
|
|
4865
|
+
country: string;
|
|
4866
|
+
url: string;
|
|
4867
|
+
ratings: AppStoreRatingHistogram | null;
|
|
4868
|
+
chartPosition: AppStoreChartPosition | null;
|
|
4869
|
+
editorsChoice: boolean;
|
|
4870
|
+
information: Record<string, string>;
|
|
4871
|
+
inAppPurchases: AppStoreInAppPurchase[];
|
|
4872
|
+
privacy: AppStorePrivacyCategory[];
|
|
4873
|
+
mostRecentVersion: AppStoreVersionInfo | null;
|
|
4874
|
+
accessibilityFeatures: string[];
|
|
4875
|
+
links: AppStoreLink[];
|
|
4876
|
+
featuredIn: AppStoreFeaturedStory[];
|
|
4877
|
+
}
|
|
4878
|
+
interface AppStoreCategory {
|
|
4879
|
+
id: string;
|
|
4880
|
+
name: string;
|
|
4881
|
+
parentId: string | null;
|
|
4882
|
+
}
|
|
4883
|
+
interface ListCategoriesResult {
|
|
4884
|
+
categories: AppStoreCategory[];
|
|
4885
|
+
}
|
|
4886
|
+
type AppStoreChartDevice = "iphone" | "ipad" | "mac";
|
|
4887
|
+
type AppStoreChartKind = "free" | "paid";
|
|
4888
|
+
interface ListTopChartsArgs {
|
|
4889
|
+
device?: AppStoreChartDevice;
|
|
4890
|
+
chart?: AppStoreChartKind;
|
|
4891
|
+
genreId?: string | number;
|
|
4892
|
+
country?: string;
|
|
4893
|
+
limit?: number;
|
|
4894
|
+
}
|
|
4895
|
+
interface AppStoreChartApp {
|
|
4896
|
+
position: number;
|
|
4897
|
+
id: string;
|
|
4898
|
+
bundleId: string;
|
|
4899
|
+
name: string;
|
|
4900
|
+
subtitle: string;
|
|
4901
|
+
developer: string;
|
|
4902
|
+
ageRating: string;
|
|
4903
|
+
price: string;
|
|
4904
|
+
rating: { average: number; countLabel: string } | null;
|
|
4905
|
+
url: string;
|
|
4906
|
+
}
|
|
4907
|
+
interface ListTopChartsResult {
|
|
4908
|
+
device: AppStoreChartDevice;
|
|
4909
|
+
chart: AppStoreChartKind;
|
|
4910
|
+
genreId: string;
|
|
4911
|
+
country: string;
|
|
4912
|
+
source: "page" | "feed";
|
|
4913
|
+
apps: AppStoreChartApp[];
|
|
4914
|
+
}
|
|
4915
|
+
interface ListDeveloperAppsArgs {
|
|
4916
|
+
developer?: string | number;
|
|
4917
|
+
app?: string | number;
|
|
4918
|
+
country?: string;
|
|
4919
|
+
limit?: number;
|
|
4920
|
+
}
|
|
4921
|
+
interface ListDeveloperAppsResult {
|
|
4922
|
+
developer: { id: string; name: string };
|
|
4923
|
+
apps: AppStoreApp[];
|
|
4924
|
+
}
|
|
4925
|
+
interface ListSimilarAppsArgs {
|
|
4926
|
+
app: string | number;
|
|
4927
|
+
country?: string;
|
|
4928
|
+
}
|
|
4929
|
+
interface AppStoreSimilarApp {
|
|
4930
|
+
id: string;
|
|
4931
|
+
bundleId: string;
|
|
4932
|
+
name: string;
|
|
4933
|
+
subtitle: string;
|
|
4934
|
+
ageRating: string;
|
|
4935
|
+
price: string;
|
|
4936
|
+
rating: { average: number; countLabel: string } | null;
|
|
4937
|
+
url: string;
|
|
4938
|
+
}
|
|
4939
|
+
interface AppStoreSimilarAppsResult {
|
|
4940
|
+
id: string;
|
|
4941
|
+
country: string;
|
|
4942
|
+
apps: AppStoreSimilarApp[];
|
|
4943
|
+
}
|
|
4944
|
+
interface GetStoryArgs {
|
|
4945
|
+
story: string | number;
|
|
4946
|
+
platform?: AppStoreChartDevice;
|
|
4947
|
+
country?: string;
|
|
4948
|
+
}
|
|
4949
|
+
interface AppStoreStoryApp {
|
|
4950
|
+
id: string;
|
|
4951
|
+
bundleId: string;
|
|
4952
|
+
name: string;
|
|
4953
|
+
subtitle: string;
|
|
4954
|
+
developer: string;
|
|
4955
|
+
ageRating: string;
|
|
4956
|
+
rating: { average: number; countLabel: string } | null;
|
|
4957
|
+
price: string;
|
|
4958
|
+
url: string;
|
|
4959
|
+
}
|
|
4960
|
+
interface AppStoreStory {
|
|
4961
|
+
id: string;
|
|
4962
|
+
country: string;
|
|
4963
|
+
url: string;
|
|
4964
|
+
heading: string;
|
|
4965
|
+
title: string;
|
|
4966
|
+
subtitle: string;
|
|
4967
|
+
body: string;
|
|
4968
|
+
apps: AppStoreStoryApp[];
|
|
4969
|
+
}
|
|
4970
|
+
interface ListTodayStoriesArgs {
|
|
4971
|
+
device?: AppStoreChartDevice;
|
|
4972
|
+
country?: string;
|
|
4973
|
+
}
|
|
4974
|
+
interface AppStoreTodayStory {
|
|
4975
|
+
id: string;
|
|
4976
|
+
title: string;
|
|
4977
|
+
url: string;
|
|
4978
|
+
}
|
|
4979
|
+
interface ListTodayStoriesResult {
|
|
4980
|
+
device: AppStoreChartDevice;
|
|
4981
|
+
country: string;
|
|
4982
|
+
stories: AppStoreTodayStory[];
|
|
4983
|
+
}
|
|
4984
|
+
type AppStoreReviewSort = "mostRecent" | "mostHelpful";
|
|
4985
|
+
interface ListReviewsArgs {
|
|
4986
|
+
app: string | number;
|
|
4987
|
+
page?: number;
|
|
4988
|
+
sortBy?: AppStoreReviewSort;
|
|
4989
|
+
country?: string;
|
|
4990
|
+
}
|
|
4991
|
+
interface AppStoreReview {
|
|
4992
|
+
id: string;
|
|
4993
|
+
author: string;
|
|
4994
|
+
title: string;
|
|
4995
|
+
body: string;
|
|
4996
|
+
rating: number | null;
|
|
4997
|
+
version: string;
|
|
4998
|
+
helpfulVotes: number;
|
|
4999
|
+
totalVotes: number;
|
|
5000
|
+
updated: string;
|
|
5001
|
+
}
|
|
5002
|
+
interface ListReviewsResult {
|
|
5003
|
+
app: string;
|
|
5004
|
+
page: number;
|
|
5005
|
+
sortBy: AppStoreReviewSort;
|
|
5006
|
+
country: string;
|
|
5007
|
+
hasMore: boolean;
|
|
5008
|
+
reviews: AppStoreReview[];
|
|
5009
|
+
}
|
|
5010
|
+
|
|
5011
|
+
/**
|
|
5012
|
+
* Search every iPhone, iPad and Mac app Apple lists, read one app's price, rating, reviews,
|
|
5013
|
+
* in-app purchases and privacy labels, and see what is charting right now — off Apple's own
|
|
5014
|
+
* keyless public API and its server-rendered store pages.
|
|
5015
|
+
*/
|
|
5016
|
+
interface Unit {
|
|
5017
|
+
/**
|
|
5018
|
+
* Search the App Store for what a person would actually type — "budget tracker", "slack",
|
|
5019
|
+
* "photo editor" — and get back the apps Apple's own store search ranks, narrowable by
|
|
5020
|
+
* platform (iPhone/iPad/Mac), category and store country. THE door: every id-taking function
|
|
5021
|
+
* in this provider is fed by an id this returns.
|
|
5022
|
+
*/
|
|
5023
|
+
searchApps(args: SearchAppsArgs): Promise<AppStoreSearchResult>;
|
|
5024
|
+
|
|
5025
|
+
/**
|
|
5026
|
+
* Read one app the way its store listing reads: name, developer, price, average rating and
|
|
5027
|
+
* rating count, category, and the id every other function here takes — from a numeric app id,
|
|
5028
|
+
* its bundle id, or an apps.apple.com URL a person pasted. The core read of the provider, and
|
|
5029
|
+
* the cheapest call in it.
|
|
5030
|
+
*/
|
|
5031
|
+
getApp(args: GetAppArgs): Promise<AppStoreApp>;
|
|
5032
|
+
|
|
5033
|
+
/**
|
|
5034
|
+
* Read up to fifty apps in ONE request, for when an agent already holds a list of ids — the
|
|
5035
|
+
* ranks past the top of a chart, the ids in a "you might also like" shelf, a comparison a
|
|
5036
|
+
* person asked for. Same record as getApp, one round trip instead of fifty; an id that does
|
|
5037
|
+
* not resolve is named in warnings rather than silently dropped.
|
|
5038
|
+
*/
|
|
5039
|
+
getApps(args: GetAppsArgs): Promise<GetAppsResult>;
|
|
5040
|
+
|
|
5041
|
+
/**
|
|
5042
|
+
* Everything the store page shows that the API does not: the five-star rating histogram, the
|
|
5043
|
+
* app's live chart position, every in-app purchase by name and price, Apple's privacy
|
|
5044
|
+
* nutrition labels, the Editors' Choice citation, the latest version's notes, size, seller,
|
|
5045
|
+
* compatibility, languages, copyright, accessibility features, developer-website and
|
|
5046
|
+
* privacy-policy links, and the editorial stories it has been featured in. Every field is
|
|
5047
|
+
* optional — a missing shelf on the app's own page is an absent field here, never a throw.
|
|
5048
|
+
*/
|
|
5049
|
+
getAppDetails(args: GetAppDetailsArgs): Promise<AppStoreAppDetails>;
|
|
5050
|
+
|
|
5051
|
+
/**
|
|
5052
|
+
* Answer "what else is like this one" with the App Store's own You Might Also Like shelf — the
|
|
5053
|
+
* apps Apple itself puts next to this one, each with its name, tagline, developer, age rating,
|
|
5054
|
+
* price and the id every function here takes. What an agent reaches for when the app a person
|
|
5055
|
+
* named is wrong, too expensive, or not on their device. Shares getAppDetails' page cache, so
|
|
5056
|
+
* calling both for one app costs one fetch.
|
|
5057
|
+
*/
|
|
5058
|
+
listSimilarApps(args: ListSimilarAppsArgs): Promise<AppStoreSimilarAppsResult>;
|
|
5059
|
+
|
|
5060
|
+
/**
|
|
5061
|
+
* List every app one developer has on the store — from the developer's numeric artist id,
|
|
5062
|
+
* their apps.apple.com developer URL, or just one of their apps (resolved to its developer
|
|
5063
|
+
* first). The read behind "what else did the people who made this write" and behind checking
|
|
5064
|
+
* whether an app is from who it claims to be.
|
|
5065
|
+
*/
|
|
5066
|
+
listDeveloperApps(args: ListDeveloperAppsArgs): Promise<ListDeveloperAppsResult>;
|
|
5067
|
+
|
|
5068
|
+
/**
|
|
5069
|
+
* List every category and subcategory the App Store sorts apps into — Business, Education,
|
|
5070
|
+
* Games and its nineteen sub-genres, and the rest — each with the numeric id that narrows
|
|
5071
|
+
* searchApps and listTopCharts. The finder that lets an agent holding the word "puzzle" reach
|
|
5072
|
+
* a real listing without being told an id.
|
|
5073
|
+
*/
|
|
5074
|
+
listCategories(): Promise<ListCategoriesResult>;
|
|
5075
|
+
|
|
5076
|
+
/**
|
|
5077
|
+
* What is charting on the App Store right now — top free or top paid, on iPhone, iPad or Mac,
|
|
5078
|
+
* for the whole store or narrowed to any genre id listCategories returns — in rank order, each
|
|
5079
|
+
* entry with its position, name, tagline, developer, age rating, price and the id every other
|
|
5080
|
+
* function here takes. The question this provider exists to answer that no search engine
|
|
5081
|
+
* answers, because the answer changes every day.
|
|
5082
|
+
*/
|
|
5083
|
+
listTopCharts(args?: ListTopChartsArgs): Promise<ListTopChartsResult>;
|
|
5084
|
+
|
|
5085
|
+
/**
|
|
5086
|
+
* Read an App Store editorial story — the Today-tab piece Apple's editors wrote ("Master Your
|
|
5087
|
+
* Major", "About In-App Purchases") — its heading, title, body and the apps it recommends,
|
|
5088
|
+
* each with the id every other function here takes. Takes the story URL
|
|
5089
|
+
* getAppDetails().featuredIn[].url returns, or a bare story id plus the platform it was
|
|
5090
|
+
* featured under. How an agent answers "what does Apple say about this" and finds apps nobody
|
|
5091
|
+
* searches for by name.
|
|
5092
|
+
*/
|
|
5093
|
+
getStory(args: GetStoryArgs): Promise<AppStoreStory>;
|
|
5094
|
+
|
|
5095
|
+
/**
|
|
5096
|
+
* Read what people actually wrote about an app — the review body, its title, the star rating,
|
|
5097
|
+
* the reviewer's name, which app version they were on, and how many others found it helpful —
|
|
5098
|
+
* fifty at a time, newest first or most helpful first. The one read that turns "4.1 stars"
|
|
5099
|
+
* into a reason.
|
|
5100
|
+
*/
|
|
5101
|
+
listReviews(args: ListReviewsArgs): Promise<ListReviewsResult>;
|
|
5102
|
+
|
|
5103
|
+
/**
|
|
5104
|
+
* List the editorial stories Apple is featuring on the Today tab right now — the page a person
|
|
5105
|
+
* actually sees when they open the App Store — each with the id and URL getStory takes. The
|
|
5106
|
+
* door into getStory for an agent that holds no app yet, rather than one that already does.
|
|
5107
|
+
*/
|
|
5108
|
+
listTodayStories(args?: ListTodayStoriesArgs): Promise<ListTodayStoriesResult>;
|
|
5109
|
+
}
|
|
5110
|
+
}
|
|
5111
|
+
|
|
4320
5112
|
declare namespace BowmarkProvider_apple {
|
|
4321
5113
|
// ── Apple — the unit's own declarations, verbatim ──
|
|
4322
5114
|
interface AppleSearchResult {
|
|
@@ -4330,6 +5122,15 @@ interface AppleSearchResponse {
|
|
|
4330
5122
|
query: string;
|
|
4331
5123
|
results: AppleSearchResult[];
|
|
4332
5124
|
}
|
|
5125
|
+
interface AppleSuggestionRow {
|
|
5126
|
+
label: string;
|
|
5127
|
+
url: string;
|
|
5128
|
+
}
|
|
5129
|
+
interface AppleSuggestResponse {
|
|
5130
|
+
query: string;
|
|
5131
|
+
suggestions: AppleSuggestionRow[];
|
|
5132
|
+
quickLinks: AppleSuggestionRow[];
|
|
5133
|
+
}
|
|
4333
5134
|
interface AppleProduct {
|
|
4334
5135
|
name: string;
|
|
4335
5136
|
lowPrice: number | null;
|
|
@@ -4342,11 +5143,204 @@ interface AppleProductPage {
|
|
|
4342
5143
|
url: string;
|
|
4343
5144
|
products: AppleProduct[];
|
|
4344
5145
|
}
|
|
5146
|
+
interface AppleConfigChoice {
|
|
5147
|
+
key: string;
|
|
5148
|
+
label: string;
|
|
5149
|
+
}
|
|
5150
|
+
interface AppleConfigDimension {
|
|
5151
|
+
key: string;
|
|
5152
|
+
label: string;
|
|
5153
|
+
choices: AppleConfigChoice[];
|
|
5154
|
+
}
|
|
5155
|
+
interface AppleConfiguration {
|
|
5156
|
+
dimensions: Record<string, string>;
|
|
5157
|
+
partNumber: string | null;
|
|
5158
|
+
buildToOrder: boolean;
|
|
5159
|
+
price: number | null;
|
|
5160
|
+
priceCurrency: string | null;
|
|
5161
|
+
}
|
|
5162
|
+
interface AppleConfigurationOptions {
|
|
5163
|
+
url: string;
|
|
5164
|
+
dimensions: AppleConfigDimension[];
|
|
5165
|
+
configDimensions: AppleConfigDimension[];
|
|
5166
|
+
configurations: AppleConfiguration[];
|
|
5167
|
+
}
|
|
5168
|
+
interface ApplePurchaseOptionTerm {
|
|
5169
|
+
id: string;
|
|
5170
|
+
name: string;
|
|
5171
|
+
sectionHeader: string;
|
|
5172
|
+
sectionFooter: string;
|
|
5173
|
+
}
|
|
5174
|
+
interface ApplePurchaseOption {
|
|
5175
|
+
id: string;
|
|
5176
|
+
formValue: string;
|
|
5177
|
+
sectionHeader: string;
|
|
5178
|
+
sectionFooter: string;
|
|
5179
|
+
hideCarrier: boolean;
|
|
5180
|
+
terms: ApplePurchaseOptionTerm[];
|
|
5181
|
+
}
|
|
5182
|
+
interface ApplePurchaseOptions {
|
|
5183
|
+
url: string;
|
|
5184
|
+
options: ApplePurchaseOption[];
|
|
5185
|
+
}
|
|
5186
|
+
interface AppleFamilyModel {
|
|
5187
|
+
name: string;
|
|
5188
|
+
startingPrice: number | null;
|
|
5189
|
+
url: string;
|
|
5190
|
+
}
|
|
5191
|
+
interface AppleFamilyModelList {
|
|
5192
|
+
family: "mac" | "iphone" | "ipad" | "watch";
|
|
5193
|
+
models: AppleFamilyModel[];
|
|
5194
|
+
}
|
|
5195
|
+
interface AppleRefurbishedListing {
|
|
5196
|
+
partNumber: string;
|
|
5197
|
+
name: string;
|
|
5198
|
+
price: number | null;
|
|
5199
|
+
priceCurrency: string | null;
|
|
5200
|
+
url: string;
|
|
5201
|
+
image: string | null;
|
|
5202
|
+
}
|
|
5203
|
+
interface AppleRefurbishedCatalog {
|
|
5204
|
+
category: "mac" | "ipad" | "iphone" | "watch" | "appletv" | "homepod" | "airpods" | "accessories";
|
|
5205
|
+
listings: AppleRefurbishedListing[];
|
|
5206
|
+
}
|
|
4345
5207
|
interface AppleTradeInEstimate {
|
|
4346
5208
|
device: string;
|
|
4347
5209
|
upToUsd: number;
|
|
4348
5210
|
sourceUrl: string;
|
|
4349
5211
|
}
|
|
5212
|
+
interface AppleTradeInDeviceValue {
|
|
5213
|
+
modelId: string | null;
|
|
5214
|
+
modelName: string;
|
|
5215
|
+
maxValueUsd: number;
|
|
5216
|
+
}
|
|
5217
|
+
interface AppleTradeInCatalog {
|
|
5218
|
+
category: "smartphone" | "computer" | "watch";
|
|
5219
|
+
devices: AppleTradeInDeviceValue[];
|
|
5220
|
+
}
|
|
5221
|
+
interface AppleSupportResult {
|
|
5222
|
+
docid: string;
|
|
5223
|
+
title: string;
|
|
5224
|
+
url: string;
|
|
5225
|
+
snippet: string;
|
|
5226
|
+
}
|
|
5227
|
+
interface AppleSupportSearchResponse {
|
|
5228
|
+
query: string;
|
|
5229
|
+
results: AppleSupportResult[];
|
|
5230
|
+
totalResults: number;
|
|
5231
|
+
}
|
|
5232
|
+
interface AppleSupportArticle {
|
|
5233
|
+
docid: string;
|
|
5234
|
+
title: string;
|
|
5235
|
+
description: string;
|
|
5236
|
+
url: string;
|
|
5237
|
+
body: string;
|
|
5238
|
+
}
|
|
5239
|
+
interface AppleLocationSuggestion {
|
|
5240
|
+
displayValue: string;
|
|
5241
|
+
city: string;
|
|
5242
|
+
state: string;
|
|
5243
|
+
}
|
|
5244
|
+
interface AppleResolvedLocation {
|
|
5245
|
+
place: string;
|
|
5246
|
+
location: string;
|
|
5247
|
+
city: string;
|
|
5248
|
+
state: string;
|
|
5249
|
+
alternates: AppleLocationSuggestion[];
|
|
5250
|
+
}
|
|
5251
|
+
interface AppleNearbyStore {
|
|
5252
|
+
storeNumber: string;
|
|
5253
|
+
storeName: string;
|
|
5254
|
+
city: string;
|
|
5255
|
+
state: string;
|
|
5256
|
+
address: string;
|
|
5257
|
+
phoneNumber: string;
|
|
5258
|
+
distanceMiles: number | null;
|
|
5259
|
+
}
|
|
5260
|
+
interface AppleStoresNear {
|
|
5261
|
+
location: string;
|
|
5262
|
+
stores: AppleNearbyStore[];
|
|
5263
|
+
}
|
|
5264
|
+
interface ApplePickupStore {
|
|
5265
|
+
storeNumber: string;
|
|
5266
|
+
storeName: string;
|
|
5267
|
+
city: string;
|
|
5268
|
+
state: string;
|
|
5269
|
+
address: string;
|
|
5270
|
+
phoneNumber: string;
|
|
5271
|
+
distanceMiles: number | null;
|
|
5272
|
+
available: boolean;
|
|
5273
|
+
pickupQuote: string | null;
|
|
5274
|
+
}
|
|
5275
|
+
interface ApplePickupAvailability {
|
|
5276
|
+
partNumber: string;
|
|
5277
|
+
location: string;
|
|
5278
|
+
stores: ApplePickupStore[];
|
|
5279
|
+
}
|
|
5280
|
+
interface AppleDeliveryOption {
|
|
5281
|
+
displayName: string;
|
|
5282
|
+
date: string;
|
|
5283
|
+
shippingCost: string;
|
|
5284
|
+
}
|
|
5285
|
+
interface AppleDeliveryEstimate {
|
|
5286
|
+
partNumber: string;
|
|
5287
|
+
postalCode: string;
|
|
5288
|
+
options: AppleDeliveryOption[];
|
|
5289
|
+
}
|
|
5290
|
+
interface AppleStoreListing {
|
|
5291
|
+
storeNumber: string;
|
|
5292
|
+
name: string;
|
|
5293
|
+
url: string;
|
|
5294
|
+
}
|
|
5295
|
+
interface AppleStoreList {
|
|
5296
|
+
stores: AppleStoreListing[];
|
|
5297
|
+
}
|
|
5298
|
+
interface AppleStoreHours {
|
|
5299
|
+
days: string[];
|
|
5300
|
+
opens: string;
|
|
5301
|
+
closes: string;
|
|
5302
|
+
}
|
|
5303
|
+
interface AppleStore {
|
|
5304
|
+
storeNumber: string;
|
|
5305
|
+
name: string;
|
|
5306
|
+
url: string;
|
|
5307
|
+
phoneNumber: string;
|
|
5308
|
+
address: string;
|
|
5309
|
+
city: string;
|
|
5310
|
+
state: string;
|
|
5311
|
+
postalCode: string;
|
|
5312
|
+
latitude: number | null;
|
|
5313
|
+
longitude: number | null;
|
|
5314
|
+
hours: AppleStoreHours[];
|
|
5315
|
+
}
|
|
5316
|
+
interface AppleNewsroomPost {
|
|
5317
|
+
title: string;
|
|
5318
|
+
category: string;
|
|
5319
|
+
date: string;
|
|
5320
|
+
url: string;
|
|
5321
|
+
summary: string;
|
|
5322
|
+
}
|
|
5323
|
+
interface AppleNewsroomPostList {
|
|
5324
|
+
posts: AppleNewsroomPost[];
|
|
5325
|
+
}
|
|
5326
|
+
interface AppleNewsroomArticle {
|
|
5327
|
+
title: string;
|
|
5328
|
+
summary: string;
|
|
5329
|
+
date: string;
|
|
5330
|
+
url: string;
|
|
5331
|
+
body: string;
|
|
5332
|
+
}
|
|
5333
|
+
interface AppleCompareSpec {
|
|
5334
|
+
label: string;
|
|
5335
|
+
value: string;
|
|
5336
|
+
}
|
|
5337
|
+
interface AppleCompareModel {
|
|
5338
|
+
name: string;
|
|
5339
|
+
specs: AppleCompareSpec[];
|
|
5340
|
+
}
|
|
5341
|
+
interface AppleCompareModels {
|
|
5342
|
+
models: AppleCompareModel[];
|
|
5343
|
+
}
|
|
4350
5344
|
|
|
4351
5345
|
/** apple.com's own site search and product pages — no API, no login, no browser. */
|
|
4352
5346
|
interface Unit {
|
|
@@ -4356,12 +5350,85 @@ interface AppleTradeInEstimate {
|
|
|
4356
5350
|
*/
|
|
4357
5351
|
search(query: string): Promise<AppleSearchResponse>;
|
|
4358
5352
|
|
|
5353
|
+
/**
|
|
5354
|
+
* Types a partial query into apple.com's own search box and returns what it suggests:
|
|
5355
|
+
* completed search phrases ("AirPods Pro 3") and quick links straight to a product page
|
|
5356
|
+
* ("AirPods" → apple.com/airpods/). A caller holding only the words somebody said gets a real
|
|
5357
|
+
* product URL with no id to know first.
|
|
5358
|
+
*/
|
|
5359
|
+
suggestSearches(query: string): Promise<AppleSuggestResponse>;
|
|
5360
|
+
|
|
4359
5361
|
/**
|
|
4360
5362
|
* Reads one apple.com product/buy page (a URL or path, e.g. search()'s own rows) and returns
|
|
4361
5363
|
* every schema.org Product block it publishes.
|
|
4362
5364
|
*/
|
|
4363
5365
|
getProduct(urlOrPath: string): Promise<AppleProductPage>;
|
|
4364
5366
|
|
|
5367
|
+
/**
|
|
5368
|
+
* Turns an Apple part number — the "MYAP3LL/A"-shaped code printed on every buy page and
|
|
5369
|
+
* returned by getPickupAvailability/getDeliveryEstimate — into the product it names: real
|
|
5370
|
+
* name, price and currency, straight off the configured buy page apple.com redirects a part
|
|
5371
|
+
* number to. Also accepts a /shop/ path or apple.com URL, resolved the same way getProduct's
|
|
5372
|
+
* argument is.
|
|
5373
|
+
*/
|
|
5374
|
+
getProductByPartNumber(partNumber: string): Promise<AppleProductPage>;
|
|
5375
|
+
|
|
5376
|
+
/**
|
|
5377
|
+
* Reads every choice a Mac/iPhone/iPad buy page actually offers — screen size, colour, chip,
|
|
5378
|
+
* memory, storage, keyboard layout, connectivity — straight off the page's own configurator
|
|
5379
|
+
* data, with the part number and price each fixed combination already resolves to. "Configure
|
|
5380
|
+
* and price it" as one read instead of clicking through the on-page configurator: every part
|
|
5381
|
+
* number this returns is directly usable by getProductByPartNumber, getPickupAvailability and
|
|
5382
|
+
* getDeliveryEstimate. A combination apple.com has not fixed a single part number for yet
|
|
5383
|
+
* (memory/storage still open) comes back with `buildToOrder: true` and a null part number,
|
|
5384
|
+
* listing the further choices rather than guessing a price for combinations apple.com computes
|
|
5385
|
+
* client-side.
|
|
5386
|
+
*/
|
|
5387
|
+
getConfigurationOptions(urlOrPath: string): Promise<AppleConfigurationOptions>;
|
|
5388
|
+
|
|
5389
|
+
/**
|
|
5390
|
+
* Reads the ways apple.com will let you pay for the product a buy page has settled on — buy
|
|
5391
|
+
* outright, Apple Card Monthly Installments, or the Apple Upgrade Program lease (with its 24-
|
|
5392
|
+
* vs 36-month term choice) — with apple.com's own copy for each, straight off the buy page's
|
|
5393
|
+
* own window.PURCHASE_OPTIONS_BOOTSTRAP. Only a page that has resolved to ONE product exposes
|
|
5394
|
+
* this: every Mac family buy page has (e.g. "/shop/buy-mac/macbook-air"), an iPhone/iPad
|
|
5395
|
+
* chooser page has not even at one specific part number, and this throws a caller-fixable
|
|
5396
|
+
* error naming that rather than guessing. Carries no dollar figure — apple.com computes a
|
|
5397
|
+
* monthly amount only after a term and trade-in are picked on the buy page itself; read a
|
|
5398
|
+
* configuration's own price off getConfigurationOptions.
|
|
5399
|
+
*/
|
|
5400
|
+
getPurchaseOptions(urlOrPath: string): Promise<ApplePurchaseOptions>;
|
|
5401
|
+
|
|
5402
|
+
/**
|
|
5403
|
+
* Puts two or more iPhone models side by side on the specs apple.com itself compares them on —
|
|
5404
|
+
* screen size, chip, camera system, battery, capacity, finish, durability rating, connectivity
|
|
5405
|
+
* — straight off apple.com's own /iphone/compare/ grid. Model names must match the page's own
|
|
5406
|
+
* naming exactly (e.g. "iPhone 17 Pro", not "17 Pro" or "iphone17pro"); an unmatched name
|
|
5407
|
+
* throws naming the page's own list. Carries no price: apple.com's own compare page renders
|
|
5408
|
+
* its Price row as an unfilled client-side template with no number in the static HTML, so this
|
|
5409
|
+
* omits it rather than guess — read a price off getConfigurationOptions or getPurchaseOptions
|
|
5410
|
+
* instead. A spec absent for one model (an older phone with no Dynamic Island) is simply
|
|
5411
|
+
* missing from that model's own list, never a false "no".
|
|
5412
|
+
*/
|
|
5413
|
+
compareModels(models: string[]): Promise<AppleCompareModels>;
|
|
5414
|
+
|
|
5415
|
+
/**
|
|
5416
|
+
* Lists every model apple.com currently sells in one product family — the chooser page's own
|
|
5417
|
+
* cards (e.g. "MacBook Air", "iPad mini"), each with its starting price and the buy page that
|
|
5418
|
+
* configures it. Takes "mac", "iphone", "ipad" or "watch" — apple.com publishes no equivalent
|
|
5419
|
+
* chooser page for AirPods or Vision Pro, each sold as a single named model with no lineup to
|
|
5420
|
+
* list.
|
|
5421
|
+
*/
|
|
5422
|
+
listFamilyModels(family: "mac" | "iphone" | "ipad" | "watch"): Promise<AppleFamilyModelList>;
|
|
5423
|
+
|
|
5424
|
+
/**
|
|
5425
|
+
* Apple's own certified refurbished store, read as data: every listing currently in stock in
|
|
5426
|
+
* one category, each with its real name, its current price and the part number that resolves
|
|
5427
|
+
* it straight through getProductByPartNumber. Stock turns over daily and a category can
|
|
5428
|
+
* legitimately be empty when Apple has nothing left in it.
|
|
5429
|
+
*/
|
|
5430
|
+
listRefurbished(category: "mac" | "ipad" | "iphone" | "watch" | "appletv" | "homepod" | "airpods" | "accessories"): Promise<AppleRefurbishedCatalog>;
|
|
5431
|
+
|
|
4365
5432
|
/**
|
|
4366
5433
|
* Reads apple.com's own trade-in value table and returns the CEILING ("up to $X")
|
|
4367
5434
|
* cash-or-credit estimate it publishes for one device — a human name ("iPhone 14 Pro") or the
|
|
@@ -4370,6 +5437,95 @@ interface AppleTradeInEstimate {
|
|
|
4370
5437
|
* best-case figure, not a quote for a specific unit's actual condition.
|
|
4371
5438
|
*/
|
|
4372
5439
|
getTradeInEstimate(model: string): Promise<AppleTradeInEstimate>;
|
|
5440
|
+
|
|
5441
|
+
/**
|
|
5442
|
+
* The whole Apple Trade In price list in one call. "smartphone" is the RICH catalog behind the
|
|
5443
|
+
* estimator — every individual phone model apple.com will take, INCLUDING non-Apple ones
|
|
5444
|
+
* (Samsung, Google, …), each with its own ceiling. "computer" and "watch" are coarser: a
|
|
5445
|
+
* ceiling per product LINE ("MacBook Pro", "Apple Watch Ultra 3"), the same table
|
|
5446
|
+
* getTradeInEstimate reads for iPhone. apple.com has no measured trade-in catalog for "tablet"
|
|
5447
|
+
* at all — neither surface this function uses covers it.
|
|
5448
|
+
*/
|
|
5449
|
+
listTradeInValues(category: "smartphone" | "computer" | "watch"): Promise<AppleTradeInCatalog>;
|
|
5450
|
+
|
|
5451
|
+
/**
|
|
5452
|
+
* Searches Apple's own support library the way a person describes a problem ("iphone battery
|
|
5453
|
+
* draining") and returns the articles Apple ranks for it — HelpKB pages, User Guide pages and
|
|
5454
|
+
* Apple Support Community threads mixed in one list, each with its document id, title, URL and
|
|
5455
|
+
* a plain-text snippet. A DOOR: the way into the support half of this provider before
|
|
5456
|
+
* getSupportArticle reads one page in full.
|
|
5457
|
+
*/
|
|
5458
|
+
searchSupport(query: string): Promise<AppleSupportSearchResponse>;
|
|
5459
|
+
|
|
5460
|
+
/**
|
|
5461
|
+
* Reads one Apple support article end to end — the real instructions under its headline, not a
|
|
5462
|
+
* search snippet — from the docid or URL one of searchSupport()'s own rows carries. The read
|
|
5463
|
+
* an agent reaches for once searchSupport has narrowed the problem to one page.
|
|
5464
|
+
*/
|
|
5465
|
+
getSupportArticle(docidOrUrl: string): Promise<AppleSupportArticle>;
|
|
5466
|
+
|
|
5467
|
+
/**
|
|
5468
|
+
* Turns the place a person said — "cupertino", "san francisco" — into the exact "<city>,
|
|
5469
|
+
* <state>" string apple.com's own store and delivery lookups accept, off apple.com's own
|
|
5470
|
+
* location typeahead. A DOOR HOP: the small step that makes findStoresNear,
|
|
5471
|
+
* getPickupAvailability and getDeliveryEstimate callable from words alone instead of a
|
|
5472
|
+
* pre-resolved location string.
|
|
5473
|
+
*/
|
|
5474
|
+
resolveLocation(place: string): Promise<AppleResolvedLocation>;
|
|
5475
|
+
|
|
5476
|
+
/**
|
|
5477
|
+
* Finds the Apple Stores near a place a person named — "Cupertino", "94108", "San Francisco" —
|
|
5478
|
+
* with each store's name, number, city, state, address, phone and distance, nearest first. The
|
|
5479
|
+
* finder that turns a place into the store records every other retail function here takes, for
|
|
5480
|
+
* a caller who holds no part number and must not have to invent one.
|
|
5481
|
+
*/
|
|
5482
|
+
findStoresNear(place: string): Promise<AppleStoresNear>;
|
|
5483
|
+
|
|
5484
|
+
/**
|
|
5485
|
+
* Answers the one question apple.com is uniquely able to answer: can I walk into a store today
|
|
5486
|
+
* and pick this up. Give it a part number (or a /shop/ path or apple.com URL — resolved the
|
|
5487
|
+
* same way getProduct's argument is) and a place, and it returns every nearby Apple Store with
|
|
5488
|
+
* whether that exact configuration is in stock, the pickup window, and the store's name,
|
|
5489
|
+
* number, address, phone and distance.
|
|
5490
|
+
*/
|
|
5491
|
+
getPickupAvailability(partNumber: string, place: string): Promise<ApplePickupAvailability>;
|
|
5492
|
+
|
|
5493
|
+
/**
|
|
5494
|
+
* When would this actually arrive if ordered now, to a ZIP code — the shipping options and
|
|
5495
|
+
* delivery dates apple.com quotes on the buy page for one exact configuration, without
|
|
5496
|
+
* starting a checkout. Takes a bare 5-digit ZIP, NOT the resolved place string
|
|
5497
|
+
* getPickupAvailability takes: apple.com's own delivery-message endpoint reads a different
|
|
5498
|
+
* parameter and ignores a "<city>, <state>" value entirely.
|
|
5499
|
+
*/
|
|
5500
|
+
getDeliveryEstimate(partNumber: string, postalCode: string): Promise<AppleDeliveryEstimate>;
|
|
5501
|
+
|
|
5502
|
+
/**
|
|
5503
|
+
* Every Apple Store in the US on one call — its name, its store number and its page — off
|
|
5504
|
+
* apple.com's own store-locator directory, so a caller can browse or filter them rather than
|
|
5505
|
+
* guess a slug. The store number is the SAME id findStoresNear and getPickupAvailability's
|
|
5506
|
+
* rows carry, so a listing here joins straight to either.
|
|
5507
|
+
*/
|
|
5508
|
+
listStores(): Promise<AppleStoreList>;
|
|
5509
|
+
|
|
5510
|
+
/**
|
|
5511
|
+
* Read one Apple Store: its full address, phone number, map coordinates, store number and the
|
|
5512
|
+
* hours it is open each day of the week — everything a person needs before driving there.
|
|
5513
|
+
* Takes a URL or /retail/ path, e.g. one of listStores()'s own rows.
|
|
5514
|
+
*/
|
|
5515
|
+
getStore(urlOrPath: string): Promise<AppleStore>;
|
|
5516
|
+
|
|
5517
|
+
/**
|
|
5518
|
+
* Apple's official announcements, newest first, off its own published RSS feed — every product
|
|
5519
|
+
* launch, financial result and press release, with its headline, category, publish date and
|
|
5520
|
+
* link. The primary source for "what did Apple just announce", with no publisher in between.
|
|
5521
|
+
*/
|
|
5522
|
+
listNewsroomPosts(): Promise<AppleNewsroomPostList>;
|
|
5523
|
+
|
|
5524
|
+
/**
|
|
5525
|
+
* Read one Apple press release or announcement in full from its URL — the article text itself,
|
|
5526
|
+
* not the feed's one-line summary. Takes a URL straight off listNewsroomPosts()'s own rows.
|
|
5527
|
+
*/
|
|
5528
|
+
getNewsroomPost(url: string): Promise<AppleNewsroomArticle>;
|
|
4373
5529
|
}
|
|
4374
5530
|
}
|
|
4375
5531
|
|
|
@@ -6073,18 +7229,18 @@ interface bestbuyProduct {
|
|
|
6073
7229
|
}
|
|
6074
7230
|
|
|
6075
7231
|
/**
|
|
6076
|
-
*
|
|
6077
|
-
*
|
|
6078
|
-
* by Best Buy's own SKU
|
|
7232
|
+
* Searches the live bestbuy.com catalog by query and returns price, availability and review
|
|
7233
|
+
* data — off bestbuy.com's own search page with no key, or Best Buy's documented Products API
|
|
7234
|
+
* when a key is available — and looks up one product by Best Buy's own SKU (key required).
|
|
6079
7235
|
*/
|
|
6080
7236
|
interface Unit {
|
|
6081
7237
|
/**
|
|
6082
|
-
* Runs a Best Buy product search the way bestbuy.com's own search box does
|
|
6083
|
-
*
|
|
6084
|
-
*
|
|
6085
|
-
* `
|
|
6086
|
-
*
|
|
6087
|
-
* `
|
|
7238
|
+
* Runs a Best Buy product search the way bestbuy.com's own search box does and returns the
|
|
7239
|
+
* matching products — name, sale/regular price, online and in-store availability and review
|
|
7240
|
+
* stats. With a Best Buy developer key (Bowmark's, charged to your account, or your own on the
|
|
7241
|
+
* `x-bowmark-vendor-key-bestbuy` header) it reads the documented Products API and also fills
|
|
7242
|
+
* manufacturer, model number and UPC. With no key it reads bestbuy.com's own search results
|
|
7243
|
+
* page, where those three fields are null. `pageSize` caps the row count (default 10).
|
|
6088
7244
|
*/
|
|
6089
7245
|
search(args: string | { query: string; pageSize?: number }): Promise<bestbuyProduct[]>;
|
|
6090
7246
|
|
|
@@ -7345,6 +8501,107 @@ interface BrixtonCheckoutLink {
|
|
|
7345
8501
|
}
|
|
7346
8502
|
}
|
|
7347
8503
|
|
|
8504
|
+
declare namespace BowmarkProvider_browser_use {
|
|
8505
|
+
// ── Browser Use — the unit's own declarations, verbatim ──
|
|
8506
|
+
type BrowserUseRunStatus = "queued" | "dispatching" | "running" | "completed" | "failed" | "cancelled";
|
|
8507
|
+
|
|
8508
|
+
interface BrowserUseCreateRunArgs {
|
|
8509
|
+
task: string;
|
|
8510
|
+
model?: string; // e.g. "claude-sonnet-5"; absent = vendor default
|
|
8511
|
+
sessionId?: string; // continue a session
|
|
8512
|
+
maxCostUsd?: number;
|
|
8513
|
+
proxyCountryCode?: string; // e.g. "us"
|
|
8514
|
+
}
|
|
8515
|
+
|
|
8516
|
+
interface BrowserUseRunStatusReading { runId: string; status: BrowserUseRunStatus }
|
|
8517
|
+
interface BrowserUseCreatedRun { id: string; status: BrowserUseRunStatus; model: string; sessionId: string; workspaceId: string }
|
|
8518
|
+
|
|
8519
|
+
interface BrowserUseRun {
|
|
8520
|
+
id: string; sessionId: string; task: string; title: string | null; model: string;
|
|
8521
|
+
status: BrowserUseRunStatus; result: string | null; error: string | null;
|
|
8522
|
+
inputTokens: number; outputTokens: number;
|
|
8523
|
+
costUsd: number; // LLM cost only
|
|
8524
|
+
createdAt: string; updatedAt: string;
|
|
8525
|
+
}
|
|
8526
|
+
|
|
8527
|
+
interface BrowserUseRunList { runs: BrowserUseRun[]; hasMore: boolean }
|
|
8528
|
+
interface BrowserUseEvent { id: number; ts: string; type: string; data: Record<string, unknown> }
|
|
8529
|
+
interface BrowserUseEventsPage { events: BrowserUseEvent[]; nextAfter: number | null; hasMore: boolean }
|
|
8530
|
+
interface BrowserUseEventsArgs { runId: string; after?: number; limit?: number }
|
|
8531
|
+
|
|
8532
|
+
interface BrowserUseSession { sessionId: string; latestRunId: string; status: string; title: string | null; createdAt: string; updatedAt: string }
|
|
8533
|
+
|
|
8534
|
+
interface BrowserUseQueueArgs { sessionId: string; text: string; interrupt?: boolean }
|
|
8535
|
+
interface BrowserUseQueuedMessage { id: number; sessionId: string; status: string; mode: string }
|
|
8536
|
+
|
|
8537
|
+
interface BrowserUseBrowser {
|
|
8538
|
+
id: string; status: string;
|
|
8539
|
+
liveUrl: string | null; // interactive; whoever holds it drives the browser
|
|
8540
|
+
agentSessionId: string | null;
|
|
8541
|
+
timeoutAt: string; startedAt: string; finishedAt: string | null;
|
|
8542
|
+
browserCostUsd: number; proxyCostUsd: number; proxyUsedMb: number;
|
|
8543
|
+
}
|
|
8544
|
+
|
|
8545
|
+
/**
|
|
8546
|
+
* Browser Use Cloud's hosted browser agent. Not callable directly: use
|
|
8547
|
+
* `bowmark.browser_agent`, which runs it for you with a private watch link and bills the
|
|
8548
|
+
* session to your account.
|
|
8549
|
+
*/
|
|
8550
|
+
interface Unit {
|
|
8551
|
+
/**
|
|
8552
|
+
* Starts a Browser Use agent run on a natural-language task, optionally continuing an existing
|
|
8553
|
+
* session. Returns immediately; the run executes on Browser Use's cloud for seconds to
|
|
8554
|
+
* minutes. Spends money.
|
|
8555
|
+
*/
|
|
8556
|
+
createRun(args: BrowserUseCreateRunArgs): Promise<BrowserUseCreatedRun>;
|
|
8557
|
+
|
|
8558
|
+
/** Reads one run: status, final result or error, token totals and LLM cost. */
|
|
8559
|
+
getRun(runId: string): Promise<BrowserUseRun>;
|
|
8560
|
+
|
|
8561
|
+
/** The cheap status poll for one run. */
|
|
8562
|
+
getRunStatus(runId: string): Promise<BrowserUseRunStatusReading>;
|
|
8563
|
+
|
|
8564
|
+
/**
|
|
8565
|
+
* A run's step-by-step event stream after a cursor — the agent's reasoning, tool calls, and
|
|
8566
|
+
* the `browser.ready` event carrying the live view url.
|
|
8567
|
+
*/
|
|
8568
|
+
listRunEvents(args: BrowserUseEventsArgs): Promise<BrowserUseEventsPage>;
|
|
8569
|
+
|
|
8570
|
+
/**
|
|
8571
|
+
* Lists every run (agent turn) in a session, newest first, each with its status and LLM cost —
|
|
8572
|
+
* how a session's whole spend is read.
|
|
8573
|
+
*/
|
|
8574
|
+
listSessionRuns(sessionId: string): Promise<BrowserUseRunList>;
|
|
8575
|
+
|
|
8576
|
+
/**
|
|
8577
|
+
* Cancels an in-flight run; idempotent on a finished one. The browser keeps running — stop it
|
|
8578
|
+
* separately.
|
|
8579
|
+
*/
|
|
8580
|
+
cancelRun(runId: string): Promise<BrowserUseRun>;
|
|
8581
|
+
|
|
8582
|
+
/** Reads a session, including the id of its latest run (a queued message becomes a new run). */
|
|
8583
|
+
getSession(sessionId: string): Promise<BrowserUseSession>;
|
|
8584
|
+
|
|
8585
|
+
/**
|
|
8586
|
+
* Sends a follow-up instruction into a session: it runs as the next turn when the current one
|
|
8587
|
+
* ends, or at once with `interrupt: true`.
|
|
8588
|
+
*/
|
|
8589
|
+
queueMessage(args: BrowserUseQueueArgs): Promise<BrowserUseQueuedMessage>;
|
|
8590
|
+
|
|
8591
|
+
/** The cloud browser attached to a session, with its live view url and running cost, or null. */
|
|
8592
|
+
findSessionBrowser(sessionId: string): Promise<BrowserUseBrowser | null>;
|
|
8593
|
+
|
|
8594
|
+
/** Reads one cloud browser: status, live view url, browser and proxy cost. */
|
|
8595
|
+
getBrowser(browserId: string): Promise<BrowserUseBrowser>;
|
|
8596
|
+
|
|
8597
|
+
/**
|
|
8598
|
+
* Stops a cloud browser (cannot be undone). Its cost is then settled down to the time actually
|
|
8599
|
+
* used.
|
|
8600
|
+
*/
|
|
8601
|
+
stopBrowser(browserId: string): Promise<BrowserUseBrowser>;
|
|
8602
|
+
}
|
|
8603
|
+
}
|
|
8604
|
+
|
|
7348
8605
|
declare namespace BowmarkProvider_builder_strucsure_com {
|
|
7349
8606
|
// ── StrucSure Home Warranty — the unit's own declarations, verbatim ──
|
|
7350
8607
|
interface StrucsureRegistrationState {
|
|
@@ -8132,7 +9389,10 @@ interface CamelPriceHistory {
|
|
|
8132
9389
|
/**
|
|
8133
9390
|
* Runs camelcamelcamel's own Amazon-product search and returns each hit's ASIN, title and
|
|
8134
9391
|
* current price — the locator this provider was missing: `getPriceHistory` takes an ASIN, and
|
|
8135
|
-
* this is how a caller holding only a shopper's words finds one.
|
|
9392
|
+
* this is how a caller holding only a shopper's words finds one. Pass the product's name; if
|
|
9393
|
+
* the full wording matches nothing it retries on its own with measurements ("24000mAh",
|
|
9394
|
+
* "140W") dropped, so there is no need to re-run it with shorter queries, and no need to
|
|
9395
|
+
* search Amazon as well to find the ASIN.
|
|
8136
9396
|
*/
|
|
8137
9397
|
search(query: string): Promise<CamelSearchResult[]>;
|
|
8138
9398
|
|
|
@@ -8140,6 +9400,11 @@ interface CamelPriceHistory {
|
|
|
8140
9400
|
* Reads camelcamelcamel's independently-tracked Amazon price history for one ASIN — the site's
|
|
8141
9401
|
* own lowest-ever/highest-ever/current/average figures, each dated, for the Amazon,
|
|
8142
9402
|
* 3rd-party-new and 3rd-party-used price types, plus the full-history chart image URL.
|
|
9403
|
+
* `amazon.current.price` is Amazon's own price today and is null when Amazon itself is not
|
|
9404
|
+
* selling it, which is an answer rather than a gap. These summary figures are ALL the history
|
|
9405
|
+
* the library has: there is no month-by-month series anywhere (the chart is an image), so
|
|
9406
|
+
* answer 'how has the price moved' from lowest/highest/average/current and do not look for
|
|
9407
|
+
* another source.
|
|
8143
9408
|
*/
|
|
8144
9409
|
getPriceHistory(asinOrUrl: string): Promise<CamelPriceHistory>;
|
|
8145
9410
|
}
|
|
@@ -15363,10 +16628,6 @@ interface GooglePriceGraph {
|
|
|
15363
16628
|
|
|
15364
16629
|
declare namespace BowmarkProvider_google_maps {
|
|
15365
16630
|
// ── Google Maps — the unit's own declarations, verbatim ──
|
|
15366
|
-
interface GoogleMapsPlace {
|
|
15367
|
-
featureId: string;
|
|
15368
|
-
name: string;
|
|
15369
|
-
}
|
|
15370
16631
|
interface SuggestPlacesArgs {
|
|
15371
16632
|
query: string;
|
|
15372
16633
|
}
|
|
@@ -15391,6 +16652,17 @@ interface GeocodeAddressResult {
|
|
|
15391
16652
|
formattedAddress: string;
|
|
15392
16653
|
coordinates: { lat: number; lng: number } | null;
|
|
15393
16654
|
}
|
|
16655
|
+
interface ReverseGeocodeArgs {
|
|
16656
|
+
lat: number;
|
|
16657
|
+
lng: number;
|
|
16658
|
+
}
|
|
16659
|
+
interface ReverseGeocodeResult {
|
|
16660
|
+
formatted: string;
|
|
16661
|
+
plusCode: string;
|
|
16662
|
+
locality: string;
|
|
16663
|
+
dms: string;
|
|
16664
|
+
coordinates: { lat: number; lng: number };
|
|
16665
|
+
}
|
|
15394
16666
|
interface GetPlaceArgs {
|
|
15395
16667
|
query: string;
|
|
15396
16668
|
}
|
|
@@ -15417,12 +16689,58 @@ interface Review {
|
|
|
15417
16689
|
text: string;
|
|
15418
16690
|
relativeDate?: string;
|
|
15419
16691
|
}
|
|
16692
|
+
interface ListRelatedPlacesArgs {
|
|
16693
|
+
query: string;
|
|
16694
|
+
}
|
|
16695
|
+
interface RelatedPlace {
|
|
16696
|
+
featureId: string;
|
|
16697
|
+
name: string;
|
|
16698
|
+
coordinates: { lat: number; lng: number } | null;
|
|
16699
|
+
categories: string[];
|
|
16700
|
+
rating?: number;
|
|
16701
|
+
reviewCount?: number;
|
|
16702
|
+
}
|
|
16703
|
+
interface GetDirectionsArgs {
|
|
16704
|
+
origin: string;
|
|
16705
|
+
destination: string;
|
|
16706
|
+
mode?: "driving" | "walking" | "transit";
|
|
16707
|
+
}
|
|
16708
|
+
interface DirectionsStep {
|
|
16709
|
+
instruction: string;
|
|
16710
|
+
distance: string;
|
|
16711
|
+
duration: string;
|
|
16712
|
+
}
|
|
16713
|
+
interface GetDirectionsResult {
|
|
16714
|
+
distance: string;
|
|
16715
|
+
duration: string;
|
|
16716
|
+
distanceMeters: number;
|
|
16717
|
+
durationSeconds: number;
|
|
16718
|
+
steps: DirectionsStep[];
|
|
16719
|
+
}
|
|
16720
|
+
interface ResolvePlaceUrlArgs {
|
|
16721
|
+
url: string;
|
|
16722
|
+
}
|
|
16723
|
+
interface GoogleMapsPlace {
|
|
16724
|
+
featureId: string;
|
|
16725
|
+
name?: string;
|
|
16726
|
+
}
|
|
16727
|
+
interface ListPhotosArgs {
|
|
16728
|
+
featureId: string;
|
|
16729
|
+
}
|
|
16730
|
+
interface Photo {
|
|
16731
|
+
url: string;
|
|
16732
|
+
width: number;
|
|
16733
|
+
height: number;
|
|
16734
|
+
takenAt?: string;
|
|
16735
|
+
source?: string;
|
|
16736
|
+
}
|
|
15420
16737
|
|
|
15421
16738
|
/**
|
|
15422
16739
|
* Local business search on Google Maps — find places by what a person would say, then read the
|
|
15423
|
-
* address, hours, rating, reviews and route. suggestPlaces
|
|
15424
|
-
* door), geocodeAddress, getPlace
|
|
15425
|
-
*
|
|
16740
|
+
* address, hours, rating, reviews, photos, co-located tenants and route. suggestPlaces
|
|
16741
|
+
* (autocomplete), searchPlaces (the door), geocodeAddress, getPlace, listReviews, listPhotos,
|
|
16742
|
+
* listRelatedPlaces, getDirections, resolvePlaceUrl and reverseGeocode are built; everything
|
|
16743
|
+
* else is still a declared stub.
|
|
15426
16744
|
*/
|
|
15427
16745
|
interface Unit {
|
|
15428
16746
|
/**
|
|
@@ -15448,6 +16766,17 @@ interface Review {
|
|
|
15448
16766
|
*/
|
|
15449
16767
|
geocodeAddress(args: GeocodeAddressArgs): Promise<GeocodeAddressResult>;
|
|
15450
16768
|
|
|
16769
|
+
/**
|
|
16770
|
+
* A point in — the Plus Code and locality Google Maps shows for it out, the same string a
|
|
16771
|
+
* person sees when they drop a pin ("JMC2+57W Seattle, Washington"), never a street address:
|
|
16772
|
+
* that is what the site itself answers for a bare point, verified live against the White
|
|
16773
|
+
* House's own coordinates. Rides the same tbm=map door searchPlaces and geocodeAddress use,
|
|
16774
|
+
* with a different field mask — not the browser rung the survey queued this for; the browser
|
|
16775
|
+
* pass that found the field mask was how the shape was discovered, not what the shipped
|
|
16776
|
+
* function needs.
|
|
16777
|
+
*/
|
|
16778
|
+
reverseGeocode(args: ReverseGeocodeArgs): Promise<ReverseGeocodeResult>;
|
|
16779
|
+
|
|
15451
16780
|
/**
|
|
15452
16781
|
* Everything Google Maps shows on one business's panel — name, full address, coordinates,
|
|
15453
16782
|
* category, neighborhood, phone, website, rating, review count and weekly hours, each present
|
|
@@ -15469,11 +16798,67 @@ interface Review {
|
|
|
15469
16798
|
* place.
|
|
15470
16799
|
*/
|
|
15471
16800
|
listReviews(args: ListReviewsArgs): Promise<Review[]>;
|
|
16801
|
+
|
|
16802
|
+
/**
|
|
16803
|
+
* Other businesses Google Maps lists "At this place" — the site's own label for a shared
|
|
16804
|
+
* address, not the "people also search for" competitor set the survey planned. A FIFTH reading
|
|
16805
|
+
* of searchPlaces' door (the same record getPlace reads, at [204]). Verified 2026-09-15:
|
|
16806
|
+
* `null` for an ordinary standalone business (confirmed against four, including Analog Coffee
|
|
16807
|
+
* and Pike Place Market), populated only for a multi-tenant venue — Space Needle's own gift
|
|
16808
|
+
* shop, café and lounge; a 61-store list for Westlake Center mall. Returns [] for a
|
|
16809
|
+
* single-business query rather than throwing; throws only when the query itself does not
|
|
16810
|
+
* resolve to one place.
|
|
16811
|
+
*/
|
|
16812
|
+
listRelatedPlaces(args: ListRelatedPlacesArgs): Promise<RelatedPlace[]>;
|
|
16813
|
+
|
|
16814
|
+
/**
|
|
16815
|
+
* A DIFFERENT door from searchPlaces' — www.google.com/maps/preview/directions, its own
|
|
16816
|
+
* reusable pb= template (BUILD_QUEUE.md), one per mode. Takes origin and destination as text,
|
|
16817
|
+
* exactly what a person would type ("Space Needle, Seattle, WA") or a
|
|
16818
|
+
* searchPlaces/geocodeAddress result's name plus address — not a feature id, measured live the
|
|
16819
|
+
* same way getPlace measured it. mode defaults to "driving"; "walking" and "transit" are also
|
|
16820
|
+
* built. "bicycling" is not: its response shape diverges enough that a route total cannot be
|
|
16821
|
+
* read off it safely yet. Returns the site's own trip total (distance, duration, traffic-aware
|
|
16822
|
+
* for driving) plus the turn-by-turn instructions, each carrying the site's own distance and
|
|
16823
|
+
* duration text. Throws when either place does not resolve to a route.
|
|
16824
|
+
*/
|
|
16825
|
+
getDirections(args: GetDirectionsArgs): Promise<GetDirectionsResult>;
|
|
16826
|
+
|
|
16827
|
+
/**
|
|
16828
|
+
* A Google Maps link somebody pasted — a maps.app.goo.gl short link, a full /maps/place/ link,
|
|
16829
|
+
* or the older ?ftid=/?cid= link — turned into the feature id and name it points at. Two of
|
|
16830
|
+
* the three shapes need no network call at all: everything returned is already sitting in the
|
|
16831
|
+
* URL string, since fetching a resolved link live only echoes the request back rather than
|
|
16832
|
+
* adding data (measured 2026-09-15). Only a short link costs a request — one redirect-follow,
|
|
16833
|
+
* reading the destination out of the "location" header rather than the (contentless) body. A
|
|
16834
|
+
* bare ?cid= link resolves only the LOW half of the feature id and carries no name, reported
|
|
16835
|
+
* as "0x0:0x<lo>" the same way the site's own echo does. Throws when the link resolves to
|
|
16836
|
+
* something that is not a place — a dropped-pin share or a review share, both measured live.
|
|
16837
|
+
*/
|
|
16838
|
+
resolvePlaceUrl(args: ResolvePlaceUrlArgs): Promise<GoogleMapsPlace>;
|
|
16839
|
+
|
|
16840
|
+
/**
|
|
16841
|
+
* The photos Google Maps shows in a place's gallery panel — up to 20, each with a url, its
|
|
16842
|
+
* real dimensions and the site's own upload-source tag ("photos:gmm_ios_review_post" and
|
|
16843
|
+
* similar — which app and flow it came in through, not a caption; none was found at any
|
|
16844
|
+
* position tried), plus a date when the response carried one. A THIRD door, not searchPlaces'
|
|
16845
|
+
* field mask: opening the place page's own photo panel fires its own batchexecute RPC, which
|
|
16846
|
+
* is not a bootstrap-derived static template the way searchPlaces' and reverseGeocode's are —
|
|
16847
|
+
* a browser genuinely has to run to get the real gallery back, measured 2026-09-16. Takes a
|
|
16848
|
+
* featureId (searchPlaces/geocodeAddress/getPlace/resolvePlaceUrl all hand one back), not a
|
|
16849
|
+
* resolving query.
|
|
16850
|
+
*/
|
|
16851
|
+
listPhotos(args: ListPhotosArgs): Promise<Photo[]>;
|
|
15472
16852
|
}
|
|
15473
16853
|
}
|
|
15474
16854
|
|
|
15475
16855
|
declare namespace BowmarkProvider_google_news {
|
|
15476
16856
|
// ── Google News — the unit's own declarations, verbatim ──
|
|
16857
|
+
interface GoogleNewsLocaleArg {
|
|
16858
|
+
hl?: string;
|
|
16859
|
+
gl?: string;
|
|
16860
|
+
ceid?: string;
|
|
16861
|
+
}
|
|
15477
16862
|
interface GoogleNewsClusterEntry {
|
|
15478
16863
|
title: string;
|
|
15479
16864
|
link: string;
|
|
@@ -15501,12 +16886,55 @@ interface GoogleNewsTopicHeadlines {
|
|
|
15501
16886
|
title: string;
|
|
15502
16887
|
articles: GoogleNewsArticle[];
|
|
15503
16888
|
}
|
|
16889
|
+
interface GoogleNewsPublisherHeadlines {
|
|
16890
|
+
publisher: string;
|
|
16891
|
+
query: string;
|
|
16892
|
+
articles: GoogleNewsArticle[];
|
|
16893
|
+
}
|
|
16894
|
+
interface GoogleNewsLocalHeadlines {
|
|
16895
|
+
place: string;
|
|
16896
|
+
title: string;
|
|
16897
|
+
articles: GoogleNewsArticle[];
|
|
16898
|
+
}
|
|
16899
|
+
interface GoogleNewsArticleResolution {
|
|
16900
|
+
articleId: string;
|
|
16901
|
+
url: string;
|
|
16902
|
+
}
|
|
16903
|
+
interface GoogleNewsTopic {
|
|
16904
|
+
topicId: string;
|
|
16905
|
+
name: string;
|
|
16906
|
+
}
|
|
16907
|
+
interface GoogleNewsTopicFeed {
|
|
16908
|
+
topicId: string;
|
|
16909
|
+
title: string;
|
|
16910
|
+
articles: GoogleNewsArticle[];
|
|
16911
|
+
}
|
|
16912
|
+
interface GoogleNewsStory {
|
|
16913
|
+
storyId: string;
|
|
16914
|
+
title: string;
|
|
16915
|
+
}
|
|
16916
|
+
interface GoogleNewsCoverageArticle {
|
|
16917
|
+
articleId: string;
|
|
16918
|
+
title: string;
|
|
16919
|
+
snippet: string | null;
|
|
16920
|
+
publisher: string;
|
|
16921
|
+
publisherUrl: string | null;
|
|
16922
|
+
url: string;
|
|
16923
|
+
publishedAt: string | null;
|
|
16924
|
+
}
|
|
16925
|
+
interface GoogleNewsFullCoverage {
|
|
16926
|
+
storyId: string;
|
|
16927
|
+
articles: GoogleNewsCoverageArticle[];
|
|
16928
|
+
}
|
|
15504
16929
|
|
|
15505
16930
|
/**
|
|
15506
16931
|
* Headlines from every publisher at once — today's top stories as clusters, a section or a
|
|
15507
|
-
* city's local news, and everything indexed about a subject with
|
|
15508
|
-
* operators. searchNews (the door)
|
|
15509
|
-
*
|
|
16932
|
+
* city's local news, one outlet's own coverage, and everything indexed about a subject with
|
|
16933
|
+
* Google's own when: and site: operators. searchNews (the door), topStories,
|
|
16934
|
+
* listTopicHeadlines, listLocalHeadlines, listPublisherHeadlines, resolveArticleUrl (the
|
|
16935
|
+
* redirector-to-publisher resolver every other function's links need), listTopics (the finder
|
|
16936
|
+
* for getTopicHeadlines), listStories (the finder for getFullCoverage) and getFullCoverage
|
|
16937
|
+
* (every outlet reporting one story) are built; everything else is still a declared stub.
|
|
15510
16938
|
*/
|
|
15511
16939
|
interface Unit {
|
|
15512
16940
|
/**
|
|
@@ -15518,18 +16946,21 @@ interface GoogleNewsTopicHeadlines {
|
|
|
15518
16946
|
* subjects — measured 2026-09-15: `site:reuters.com tesla` returned 100 items of which 100
|
|
15519
16947
|
* carried `<source>Reuters</source>`. This is the provider's main door: a caller holding only
|
|
15520
16948
|
* words gets in here. A query that matches nothing returns an empty `articles` array rather
|
|
15521
|
-
* than throwing.
|
|
16949
|
+
* than throwing. `locale` — `{ hl, gl, ceid }` — asks for another country/language edition,
|
|
16950
|
+
* e.g. `{ hl: "es-419", gl: "MX", ceid: "MX:es" }` for Mexico; omitted, every field defaults
|
|
16951
|
+
* to the US English edition.
|
|
15522
16952
|
*/
|
|
15523
|
-
searchNews(query: string): Promise<GoogleNewsSearchResult>;
|
|
16953
|
+
searchNews(query: string, locale?: GoogleNewsLocaleArg): Promise<GoogleNewsSearchResult>;
|
|
15524
16954
|
|
|
15525
16955
|
/**
|
|
15526
16956
|
* What Google News is leading with right now — the front page, as ranked story CLUSTERS rather
|
|
15527
16957
|
* than a flat list. Each entry carries the lead headline and publisher plus every other outlet
|
|
15528
16958
|
* covering the same story, which is the one thing a single publisher's own feed can never give
|
|
15529
|
-
* a caller asking "what is everyone saying about this today".
|
|
15530
|
-
*
|
|
16959
|
+
* a caller asking "what is everyone saying about this today". `locale` — `{ hl, gl, ceid }` —
|
|
16960
|
+
* asks for another country/language edition, e.g. `{ hl: "es-419", gl: "MX", ceid: "MX:es" }`
|
|
16961
|
+
* for Mexico; omitted, the US English front page.
|
|
15531
16962
|
*/
|
|
15532
|
-
topStories(): Promise<GoogleNewsTopStories>;
|
|
16963
|
+
topStories(locale?: GoogleNewsLocaleArg): Promise<GoogleNewsTopStories>;
|
|
15533
16964
|
|
|
15534
16965
|
/**
|
|
15535
16966
|
* The latest headlines in one of Google News' own eight sections — World, Nation, Business,
|
|
@@ -15538,9 +16969,447 @@ interface GoogleNewsTopicHeadlines {
|
|
|
15538
16969
|
* case-insensitively against the closed list of eight; anything else throws before any request
|
|
15539
16970
|
* is made, because an unrecognized section answers 200 with Google News' own app-shell HTML
|
|
15540
16971
|
* rather than a 404 (measured 2026-09-15) — reading that as an empty section would be silently
|
|
15541
|
-
* wrong rather than refused.
|
|
16972
|
+
* wrong rather than refused. `locale` — `{ hl, gl, ceid }` — asks for another country/language
|
|
16973
|
+
* edition; omitted, the US English one.
|
|
16974
|
+
*/
|
|
16975
|
+
listTopicHeadlines(section: string, locale?: GoogleNewsLocaleArg): Promise<GoogleNewsTopicHeadlines>;
|
|
16976
|
+
|
|
16977
|
+
/**
|
|
16978
|
+
* Everything Google News has indexed from one publisher — `publisher` is a domain like
|
|
16979
|
+
* "reuters.com" or "apnews.com" — newest first, optionally narrowed with `query` the same way
|
|
16980
|
+
* `searchNews` takes one. Built on the search door with a `site:` filter
|
|
16981
|
+
* (`/rss/search?q=site:<publisher> <query>`), NOT on the route that looks like its own:
|
|
16982
|
+
* `/rss/headlines/section/publication/<NAME>` answers 200 with the Top stories feed
|
|
16983
|
+
* byte-for-byte for a name it cannot resolve, so it would look like it worked and be wrong for
|
|
16984
|
+
* every publisher. Measured 2026-09-15: `site:reuters.com tesla` returned 100 items of which
|
|
16985
|
+
* 100 carried a `<source>` domain on `reuters.com`. `locale` — `{ hl, gl, ceid }` — asks for
|
|
16986
|
+
* another country/language edition; omitted, the US English one.
|
|
16987
|
+
*/
|
|
16988
|
+
listPublisherHeadlines(publisher: string, query?: string, locale?: GoogleNewsLocaleArg): Promise<GoogleNewsPublisherHeadlines>;
|
|
16989
|
+
|
|
16990
|
+
/**
|
|
16991
|
+
* What is being reported in one place — the local-news edition for a city or region, by NAME
|
|
16992
|
+
* ("Seattle", "San Francisco"), not a place id. There is no closed list of valid places, so a
|
|
16993
|
+
* place Google News has no edition for is refused only after the request comes back: it
|
|
16994
|
+
* answers 200 with an in-protocol "This feed is not available." sentinel item and a bare
|
|
16995
|
+
* "Google News" channel title rather than the place's own name (measured 2026-09-15 on a
|
|
16996
|
+
* nonsense place; the same sentinel `_client` already drops out of every other feed by guid) —
|
|
16997
|
+
* reading that as an empty result would be silently wrong, so this throws instead. A
|
|
16998
|
+
* recognized place's own channel title is echoed back in `place`, in the site's own spelling,
|
|
16999
|
+
* so `"seattle"` and `"Seattle"` both resolve to `"Seattle"`. `locale` — `{ hl, gl, ceid }` —
|
|
17000
|
+
* asks for another country/language edition; omitted, the US English one.
|
|
17001
|
+
*/
|
|
17002
|
+
listLocalHeadlines(place: string, locale?: GoogleNewsLocaleArg): Promise<GoogleNewsLocalHeadlines>;
|
|
17003
|
+
|
|
17004
|
+
/**
|
|
17005
|
+
* The publisher's real article URL behind a Google News link — every `link` in every feed
|
|
17006
|
+
* above is a `news.google.com/rss/articles/<id>` redirector that does NOT redirect (it 302s to
|
|
17007
|
+
* itself, then serves an interstitial with no publisher URL anywhere in its bytes), so this is
|
|
17008
|
+
* what turns a headline into something a caller can actually read. Takes either the bare
|
|
17009
|
+
* `articleId` (a feed item's own `<guid>`) or a full redirector link someone pasted. Two hops,
|
|
17010
|
+
* both browserless: GET the interstitial for a `data-n-a-id`/`-ts`/`-sg` signature minted for
|
|
17011
|
+
* that article page, then POST it to the site's `batchexecute` RPC for the real URL — the
|
|
17012
|
+
* signature cannot be skipped or reused across articles, so this is always two requests.
|
|
17013
|
+
*/
|
|
17014
|
+
resolveArticleUrl(articleIdOrLink: string): Promise<GoogleNewsArticleResolution>;
|
|
17015
|
+
|
|
17016
|
+
/**
|
|
17017
|
+
* The topics Google News' own home-page nav rail is offering today — the eight standing
|
|
17018
|
+
* sections plus "Your local news" (measured 2026-09-15: nine entries, geo-scoped to whichever
|
|
17019
|
+
* exit made the request) — each with the opaque topic id `getTopicHeadlines` takes. Read off
|
|
17020
|
+
* the home page's own embedded `AF_initDataCallback({key: 'ds:2'…})` state rather than scraped
|
|
17021
|
+
* from the rendered nav, so it needs no browser. The finder that makes a topic id reachable by
|
|
17022
|
+
* somebody who only holds words. `locale` — `{ hl, gl, ceid }` — asks for another
|
|
17023
|
+
* country/language edition's own nav rail; omitted, the US English one.
|
|
17024
|
+
*/
|
|
17025
|
+
listTopics(locale?: GoogleNewsLocaleArg): Promise<GoogleNewsTopic[]>;
|
|
17026
|
+
|
|
17027
|
+
/**
|
|
17028
|
+
* The headlines under any Google News topic id — the opaque key `/rss/topics/<id>` takes,
|
|
17029
|
+
* which the eight named sections `listTopicHeadlines` takes by word are only a subset of.
|
|
17030
|
+
* Identical fetch and parse to `listTopicHeadlines` (`/rss/topics/<topicId>` rather than
|
|
17031
|
+
* `/rss/headlines/section/topic/<NAME>`) — the only difference is the key, since a topic id
|
|
17032
|
+
* has no canonical spelling for the site to correct it to. Measured 2026-09-15: the Technology
|
|
17033
|
+
* section's own topic id answers the identical feed shape as its section-name door, 70 items,
|
|
17034
|
+
* titled "Technology - Latest - Google News". THE ONLY IDS REACHABLE WITHOUT AN ACCOUNT ARE
|
|
17035
|
+
* THE NINE `listTopics` RETURNS. Google News also runs entity and interest topics (a company,
|
|
17036
|
+
* a person, a sports league), but measured 2026-09-16 nothing logged-out hands their ids out —
|
|
17037
|
+
* a topic page, a story page, `/home` and `/publications` each carry only the nav rail's own
|
|
17038
|
+
* nine, and the HTML `/search` page that renders the entity's Follow chip answers 429 through
|
|
17039
|
+
* the proxy. To follow a company or a person today, use `searchNews`. `locale` — `{ hl, gl,
|
|
17040
|
+
* ceid }` — asks for another country/language edition; omitted, the US English one.
|
|
17041
|
+
*/
|
|
17042
|
+
getTopicHeadlines(topicId: string, locale?: GoogleNewsLocaleArg): Promise<GoogleNewsTopicFeed>;
|
|
17043
|
+
|
|
17044
|
+
/**
|
|
17045
|
+
* The story CLUSTERS Google News is running right now, as ids — the finder for
|
|
17046
|
+
* `getFullCoverage`. Pass a `topicId` (from `listTopics`, or one of the eight section names'
|
|
17047
|
+
* own topic id) to read a topic page — measured 2026-09-15: 43 distinct stories on the
|
|
17048
|
+
* Technology topic page, the richer of the two doors — or omit it to read the front page
|
|
17049
|
+
* instead, which surfaces far fewer (2 measured) since most front-page items are
|
|
17050
|
+
* single-outlet. Reads the "Full Coverage" anchor Google News renders on every multi-outlet
|
|
17051
|
+
* story directly off the page's HTML, rather than the page's own embedded state — no RSS feed
|
|
17052
|
+
* on this site emits a story id at all, so this is the only door. `locale` — `{ hl, gl, ceid
|
|
17053
|
+
* }` — asks for another country/language edition of whichever page is read; omitted, the US
|
|
17054
|
+
* English one.
|
|
17055
|
+
*/
|
|
17056
|
+
listStories(topicId?: string, locale?: GoogleNewsLocaleArg): Promise<GoogleNewsStory[]>;
|
|
17057
|
+
|
|
17058
|
+
/**
|
|
17059
|
+
* Every outlet reporting one story — Google News' own Full Coverage, chained off a `storyId`
|
|
17060
|
+
* from `listStories`. Reads the story page's own `AF_initDataCallback({key: 'ds:0'…})` state:
|
|
17061
|
+
* a mix of named groups ("Top news", "Personal perspective", an occasional "Posts on X" of
|
|
17062
|
+
* social posts rather than articles, which are excluded) and ungrouped rows, folded into one
|
|
17063
|
+
* flat list. Unlike every other function here, each article's `url` is the PUBLISHER's own
|
|
17064
|
+
* page directly — no `news.google.com` redirector, so no `resolveArticleUrl` hop is needed. A
|
|
17065
|
+
* story id is as short-lived as a headline; hold one only as long as the `listStories` call
|
|
17066
|
+
* that produced it — a stale id throws, naming that as the likely cause, rather than answering
|
|
17067
|
+
* with 0 articles. `locale` — `{ hl, gl, ceid }` — matters here even though every article
|
|
17068
|
+
* already carries its own publisher URL: the STORY PAGE ITSELF is read in whichever edition is
|
|
17069
|
+
* asked for, and reading it in the wrong one silently truncates or empties the coverage
|
|
17070
|
+
* (measured 2026-09-16: the same story id answered 0 articles under the US default and 53
|
|
17071
|
+
* under `{ hl: "es-419", gl: "MX", ceid: "MX:es" }`). Pass the SAME locale the `listStories`
|
|
17072
|
+
* call that produced this id used; omitted, the US English edition.
|
|
17073
|
+
*/
|
|
17074
|
+
getFullCoverage(storyId: string, locale?: GoogleNewsLocaleArg): Promise<GoogleNewsFullCoverage>;
|
|
17075
|
+
}
|
|
17076
|
+
}
|
|
17077
|
+
|
|
17078
|
+
declare namespace BowmarkProvider_google_translate {
|
|
17079
|
+
// ── Google Translate — the unit's own declarations, verbatim ──
|
|
17080
|
+
interface TranslateArgs {
|
|
17081
|
+
text: string | readonly string[];
|
|
17082
|
+
to: string;
|
|
17083
|
+
from?: string;
|
|
17084
|
+
}
|
|
17085
|
+
interface GoogleTranslateResult {
|
|
17086
|
+
source: string;
|
|
17087
|
+
translated: string;
|
|
17088
|
+
targetLanguage: string;
|
|
17089
|
+
sourceLanguage: string;
|
|
17090
|
+
detected: boolean;
|
|
17091
|
+
}
|
|
17092
|
+
interface DetectLanguageArgs {
|
|
17093
|
+
text: string;
|
|
17094
|
+
}
|
|
17095
|
+
interface GoogleTranslateLanguageCandidate {
|
|
17096
|
+
language: string;
|
|
17097
|
+
confidence: number;
|
|
17098
|
+
}
|
|
17099
|
+
interface GoogleTranslateLanguageDetection {
|
|
17100
|
+
language: string;
|
|
17101
|
+
confidence: number;
|
|
17102
|
+
candidates: GoogleTranslateLanguageCandidate[];
|
|
17103
|
+
}
|
|
17104
|
+
interface ListLanguagesArgs {
|
|
17105
|
+
hl?: string;
|
|
17106
|
+
}
|
|
17107
|
+
interface GoogleTranslateLanguage {
|
|
17108
|
+
code: string;
|
|
17109
|
+
name: string;
|
|
17110
|
+
sourceSupported: boolean;
|
|
17111
|
+
targetSupported: boolean;
|
|
17112
|
+
}
|
|
17113
|
+
interface LookupWordArgs {
|
|
17114
|
+
word: string;
|
|
17115
|
+
to: string;
|
|
17116
|
+
from: string;
|
|
17117
|
+
hl?: string;
|
|
17118
|
+
}
|
|
17119
|
+
interface GoogleTranslateWordCandidate {
|
|
17120
|
+
word: string;
|
|
17121
|
+
reverseTranslations: string[];
|
|
17122
|
+
score: number;
|
|
17123
|
+
}
|
|
17124
|
+
interface GoogleTranslateWordSense {
|
|
17125
|
+
partOfSpeech: string;
|
|
17126
|
+
candidates: GoogleTranslateWordCandidate[];
|
|
17127
|
+
}
|
|
17128
|
+
interface GoogleTranslateWordLookup {
|
|
17129
|
+
word: string;
|
|
17130
|
+
targetLanguage: string;
|
|
17131
|
+
sourceLanguage: string;
|
|
17132
|
+
senses: GoogleTranslateWordSense[];
|
|
17133
|
+
}
|
|
17134
|
+
interface GetDefinitionsArgs {
|
|
17135
|
+
word: string;
|
|
17136
|
+
language: string;
|
|
17137
|
+
}
|
|
17138
|
+
interface GoogleTranslateDefinitionExample {
|
|
17139
|
+
text: string;
|
|
17140
|
+
}
|
|
17141
|
+
interface GoogleTranslateDefinition {
|
|
17142
|
+
definitionId: string;
|
|
17143
|
+
gloss: string;
|
|
17144
|
+
examples: GoogleTranslateDefinitionExample[];
|
|
17145
|
+
subject?: string[];
|
|
17146
|
+
register?: string[];
|
|
17147
|
+
}
|
|
17148
|
+
interface GoogleTranslateDefinitionSense {
|
|
17149
|
+
partOfSpeech: string;
|
|
17150
|
+
definitions: GoogleTranslateDefinition[];
|
|
17151
|
+
}
|
|
17152
|
+
interface GoogleTranslateWordDefinitions {
|
|
17153
|
+
word: string;
|
|
17154
|
+
language: string;
|
|
17155
|
+
senses: GoogleTranslateDefinitionSense[];
|
|
17156
|
+
}
|
|
17157
|
+
interface GetSynonymsArgs {
|
|
17158
|
+
word: string;
|
|
17159
|
+
language: string;
|
|
17160
|
+
}
|
|
17161
|
+
interface GoogleTranslateSynonymGroup {
|
|
17162
|
+
definitionId: string;
|
|
17163
|
+
synonyms: string[];
|
|
17164
|
+
register?: string[];
|
|
17165
|
+
}
|
|
17166
|
+
interface GoogleTranslateSynonymSense {
|
|
17167
|
+
partOfSpeech: string;
|
|
17168
|
+
groups: GoogleTranslateSynonymGroup[];
|
|
17169
|
+
}
|
|
17170
|
+
interface GoogleTranslateWordSynonyms {
|
|
17171
|
+
word: string;
|
|
17172
|
+
language: string;
|
|
17173
|
+
senses: GoogleTranslateSynonymSense[];
|
|
17174
|
+
}
|
|
17175
|
+
interface GetAlternativeTranslationsArgs {
|
|
17176
|
+
text: string;
|
|
17177
|
+
to: string;
|
|
17178
|
+
from?: string;
|
|
17179
|
+
}
|
|
17180
|
+
interface GoogleTranslateAlternative {
|
|
17181
|
+
text: string;
|
|
17182
|
+
backends: number[];
|
|
17183
|
+
}
|
|
17184
|
+
interface GoogleTranslateAlternativeSegment {
|
|
17185
|
+
sourceSegment: string;
|
|
17186
|
+
offsets: { begin: number; end: number };
|
|
17187
|
+
alternatives: GoogleTranslateAlternative[];
|
|
17188
|
+
}
|
|
17189
|
+
interface GoogleTranslateAlternativeTranslations {
|
|
17190
|
+
text: string;
|
|
17191
|
+
targetLanguage: string;
|
|
17192
|
+
sourceLanguage: string;
|
|
17193
|
+
segments: GoogleTranslateAlternativeSegment[];
|
|
17194
|
+
}
|
|
17195
|
+
interface CheckSpellingArgs {
|
|
17196
|
+
text: string;
|
|
17197
|
+
language: string;
|
|
17198
|
+
}
|
|
17199
|
+
interface GoogleTranslateSpellCheck {
|
|
17200
|
+
text: string;
|
|
17201
|
+
language: string;
|
|
17202
|
+
correct: boolean;
|
|
17203
|
+
corrected?: string;
|
|
17204
|
+
correctedHtml?: string;
|
|
17205
|
+
correctionType?: number[];
|
|
17206
|
+
confident?: boolean;
|
|
17207
|
+
}
|
|
17208
|
+
interface RomanizeArgs {
|
|
17209
|
+
text: string;
|
|
17210
|
+
to: string;
|
|
17211
|
+
from?: string;
|
|
17212
|
+
}
|
|
17213
|
+
interface GoogleTranslateRomanization {
|
|
17214
|
+
text: string;
|
|
17215
|
+
targetLanguage: string;
|
|
17216
|
+
sourceLanguage: string;
|
|
17217
|
+
detected: boolean;
|
|
17218
|
+
targetRomanization?: string;
|
|
17219
|
+
sourceRomanization?: string;
|
|
17220
|
+
}
|
|
17221
|
+
interface SpeakArgs {
|
|
17222
|
+
text: string;
|
|
17223
|
+
language: string;
|
|
17224
|
+
}
|
|
17225
|
+
interface GoogleTranslateSpeech {
|
|
17226
|
+
audioBase64: string;
|
|
17227
|
+
contentType: string;
|
|
17228
|
+
chunkCount: number;
|
|
17229
|
+
}
|
|
17230
|
+
interface TranslateWebPageArgs {
|
|
17231
|
+
url: string;
|
|
17232
|
+
to: string;
|
|
17233
|
+
from?: string;
|
|
17234
|
+
}
|
|
17235
|
+
interface GoogleTranslateWebPageSegment {
|
|
17236
|
+
original: string;
|
|
17237
|
+
translated: string;
|
|
17238
|
+
}
|
|
17239
|
+
interface GoogleTranslateWebPage {
|
|
17240
|
+
url: string;
|
|
17241
|
+
title: string;
|
|
17242
|
+
translatedTitle: string;
|
|
17243
|
+
targetLanguage: string;
|
|
17244
|
+
sourceLanguage: string;
|
|
17245
|
+
detected: boolean;
|
|
17246
|
+
segments: GoogleTranslateWebPageSegment[];
|
|
17247
|
+
}
|
|
17248
|
+
interface TranslateDocumentArgs {
|
|
17249
|
+
fileBase64: string;
|
|
17250
|
+
mimeType: string;
|
|
17251
|
+
to: string;
|
|
17252
|
+
from?: string;
|
|
17253
|
+
}
|
|
17254
|
+
interface GoogleTranslateDocumentResult {
|
|
17255
|
+
translatedBase64: string;
|
|
17256
|
+
mimeType: string;
|
|
17257
|
+
}
|
|
17258
|
+
interface TranslateImageArgs {
|
|
17259
|
+
imageBase64: string;
|
|
17260
|
+
mimeType: string;
|
|
17261
|
+
to: string;
|
|
17262
|
+
from?: string;
|
|
17263
|
+
}
|
|
17264
|
+
interface GoogleTranslateImageResult {
|
|
17265
|
+
translatedImageBase64: string;
|
|
17266
|
+
mimeType: string;
|
|
17267
|
+
sourceText: string;
|
|
17268
|
+
translatedText: string;
|
|
17269
|
+
}
|
|
17270
|
+
|
|
17271
|
+
/**
|
|
17272
|
+
* Translate text into any of 249 languages, in a batch if you have a list, and find out what
|
|
17273
|
+
* language something already is — plus the dictionary underneath: senses, definitions,
|
|
17274
|
+
* synonyms, alternative wordings, the romanization and the spoken audio. Thirteen functions
|
|
17275
|
+
* are built; the four account-gated ones (saved phrases, history) are still declared stubs.
|
|
17276
|
+
*/
|
|
17277
|
+
interface Unit {
|
|
17278
|
+
/**
|
|
17279
|
+
* Turn text into another language. `args.text` is one string or a list translated together in
|
|
17280
|
+
* one request, in order; `args.to` names the target language by name ("Spanish") or code
|
|
17281
|
+
* ("es", "pt-BR"); `args.from` is optional and, left out, the source is detected per string,
|
|
17282
|
+
* with `detected: true` and the detected code coming back on each result. Returns one
|
|
17283
|
+
* `GoogleTranslateResult` per input string, aligned by position.
|
|
17284
|
+
*/
|
|
17285
|
+
translate(args: TranslateArgs): Promise<GoogleTranslateResult[]>;
|
|
17286
|
+
|
|
17287
|
+
/**
|
|
17288
|
+
* Work out what language a string is written in. Returns `language` (Google's own code) and
|
|
17289
|
+
* `confidence` (0-1) rather than swallowing it — a single word can come back confidently wrong
|
|
17290
|
+
* (measured 2026-09-15: "Bonjour" alone detects as "en"), so a caller reading only `language`
|
|
17291
|
+
* cannot tell a guess from a sure thing. `candidates` carries every language Google's detector
|
|
17292
|
+
* considered, most confident first.
|
|
17293
|
+
*/
|
|
17294
|
+
detectLanguage(args: DetectLanguageArgs): Promise<GoogleTranslateLanguageDetection>;
|
|
17295
|
+
|
|
17296
|
+
/**
|
|
17297
|
+
* Every language this site supports — the table that turns a caller's "Portuguese" into the
|
|
17298
|
+
* `pt`/`pt-BR` code the rest of this provider takes, and the honest answer to "can Google
|
|
17299
|
+
* Translate do Cherokee". `args.hl` optionally localizes the returned `name`s (`{ hl: "es" }`
|
|
17300
|
+
* returns "abjasio" for `ab`); left out, names come back in English.
|
|
17301
|
+
* `sourceSupported`/`targetSupported` are not both always true — `sl` alone carries `"auto"`
|
|
17302
|
+
* ("Detect language") and `tl` alone carries `"zh-TW"`, measured 2026-09-15.
|
|
17303
|
+
*/
|
|
17304
|
+
listLanguages(args?: ListLanguagesArgs): Promise<GoogleTranslateLanguage[]>;
|
|
17305
|
+
|
|
17306
|
+
/**
|
|
17307
|
+
* The full "translations of <word>" dictionary panel: every part of speech Google has for
|
|
17308
|
+
* `args.word`, the candidate translations under each (ordered by Google's own frequency
|
|
17309
|
+
* `score`), and for each candidate the words it itself translates back to — the difference
|
|
17310
|
+
* between "run means correr" and knowing `ejecutar` is the software sense and `huir` is the
|
|
17311
|
+
* fleeing sense. `args.from` is required, unlike `translate` — there is no "detect it" reading
|
|
17312
|
+
* of a dictionary lookup. `senses` comes back empty when Google has no per-sense breakdown for
|
|
17313
|
+
* the term (a longer phrase, or a string its dictionary does not recognize); the plain
|
|
17314
|
+
* `translate` function still works on those.
|
|
17315
|
+
*/
|
|
17316
|
+
lookupWord(args: LookupWordArgs): Promise<GoogleTranslateWordLookup>;
|
|
17317
|
+
|
|
17318
|
+
/**
|
|
17319
|
+
* What `args.word` MEANS, IN `args.language` — monolingual, unlike `lookupWord`, which
|
|
17320
|
+
* translates between two. Groups every sense by part of speech, each carrying a plain-English
|
|
17321
|
+
* gloss and, where Google has one, a real usage example (its own `<b>`-highlight markup
|
|
17322
|
+
* stripped). `senses` comes back empty when Google's dictionary has nothing for the term.
|
|
17323
|
+
*/
|
|
17324
|
+
getDefinitions(args: GetDefinitionsArgs): Promise<GoogleTranslateWordDefinitions>;
|
|
17325
|
+
|
|
17326
|
+
/**
|
|
17327
|
+
* Other words that mean the same thing as `args.word`, IN `args.language` — grouped by sense
|
|
17328
|
+
* (`definitionId` matches a `GoogleTranslateDefinition.definitionId` from `getDefinitions`)
|
|
17329
|
+
* rather than thrown into one list, and labelled where Google knows the register: "informal"
|
|
17330
|
+
* synonyms for "run" (belt, zip, leg it, hotfoot it) come back in a separate group from the
|
|
17331
|
+
* neutral ones (sprint, race, dart, dash), and a group with no `register` is the neutral case.
|
|
17332
|
+
* `senses` comes back empty when Google has no synonyms for the term.
|
|
17333
|
+
*/
|
|
17334
|
+
getSynonyms(args: GetSynonymsArgs): Promise<GoogleTranslateWordSynonyms>;
|
|
17335
|
+
|
|
17336
|
+
/**
|
|
17337
|
+
* The other ways Google would have translated `args.text` — the list that appears when a
|
|
17338
|
+
* person clicks a translated phrase to see what else it could have said. Works on a whole
|
|
17339
|
+
* sentence, not just a word: `args.text` splits into `segments`, one per sentence Google
|
|
17340
|
+
* recognizes, each carrying its own `alternatives` — the unit of the answer is the SEGMENT,
|
|
17341
|
+
* never the whole input. `args.from` is optional and, left out, the source is detected, same
|
|
17342
|
+
* as `translate`.
|
|
17343
|
+
*/
|
|
17344
|
+
getAlternativeTranslations(args: GetAlternativeTranslationsArgs): Promise<GoogleTranslateAlternativeTranslations>;
|
|
17345
|
+
|
|
17346
|
+
/**
|
|
17347
|
+
* Google Translate's own "Did you mean …" line for `args.text`, written in `args.language` —
|
|
17348
|
+
* `correct: true` when nothing needed fixing, otherwise the corrected text plain and
|
|
17349
|
+
* HTML-marked-up. What a caller runs before trusting a translation of something a human typed
|
|
17350
|
+
* in a hurry.
|
|
17351
|
+
*/
|
|
17352
|
+
checkSpelling(args: CheckSpellingArgs): Promise<GoogleTranslateSpellCheck>;
|
|
17353
|
+
|
|
17354
|
+
/**
|
|
17355
|
+
* A Latin-alphabet (or phonetic) rendering of `args.text` or its translation —
|
|
17356
|
+
* "Ohayōgozaimasu, ogenkidesuka?" under a Japanese translation, "rən" under the English word
|
|
17357
|
+
* "run". `targetRomanization` comes back when the TARGET script is non-Latin,
|
|
17358
|
+
* `sourceRomanization` when the SOURCE is — measured 2026-09-16, that includes a short
|
|
17359
|
+
* Latin-script dictionary lookup, which still carries an English pronunciation guide. Both are
|
|
17360
|
+
* absent on an ordinary sentence between two Latin-script languages, which is a normal answer,
|
|
17361
|
+
* not a failure. `args.from` is optional and, left out, the source is detected, same as
|
|
17362
|
+
* `translate`.
|
|
17363
|
+
*/
|
|
17364
|
+
romanize(args: RomanizeArgs): Promise<GoogleTranslateRomanization>;
|
|
17365
|
+
|
|
17366
|
+
/**
|
|
17367
|
+
* Hear `args.text` spoken in `args.language`, as the MP3 the site's own speaker button plays.
|
|
17368
|
+
* Google's `/translate_tts` refuses anything over 200 characters with a hard 400, so this
|
|
17369
|
+
* function chunks longer text on SENTENCE boundaries (never mid-sentence) and stitches the
|
|
17370
|
+
* resulting MP3s into one file — confirmed 2026-09-16 that concatenating raw `/translate_tts`
|
|
17371
|
+
* bytes decodes as one continuous, correctly-timed clip, since the door answers a bare MPEG
|
|
17372
|
+
* stream with no container. `chunkCount` says how many `/translate_tts` calls the answer is
|
|
17373
|
+
* built from. Throws when a single SENTENCE in `args.text` is itself over 200 characters —
|
|
17374
|
+
* there is no boundary left to chunk on, and truncating it silently is the one thing this
|
|
17375
|
+
* function must not do.
|
|
15542
17376
|
*/
|
|
15543
|
-
|
|
17377
|
+
speak(args: SpeakArgs): Promise<GoogleTranslateSpeech>;
|
|
17378
|
+
|
|
17379
|
+
/**
|
|
17380
|
+
* Read `args.url` in `args.to` — fetches the page with a plain GET (no browser; a page that
|
|
17381
|
+
* renders its text client-side is out of reach), walks its rendered text nodes in reading
|
|
17382
|
+
* order, and translates them through this provider's own `translate` door. Measured 2026-09-16
|
|
17383
|
+
* that `<host>.translate.goog` (the site's own page-translation product) serves the ORIGINAL
|
|
17384
|
+
* page plus a client-side translator script and never returns translated text browserless,
|
|
17385
|
+
* which is why this fetches the caller's url directly instead. `args.from` is optional and,
|
|
17386
|
+
* left out, the source is detected off the page's title. `segments` preserves the page's own
|
|
17387
|
+
* reading order.
|
|
17388
|
+
*/
|
|
17389
|
+
translateWebPage(args: TranslateWebPageArgs): Promise<GoogleTranslateWebPage>;
|
|
17390
|
+
|
|
17391
|
+
/**
|
|
17392
|
+
* Translate a whole PDF, Word or PowerPoint file — the Documents tab. Takes `fileBase64` (the
|
|
17393
|
+
* document, base64-encoded), `mimeType`, `to`, and optional `from` (left out, auto-detects),
|
|
17394
|
+
* and returns `translatedBase64` + `mimeType` for the SAME document translated. Built on a
|
|
17395
|
+
* real browser (rung 15): the RPC answers 200 to a bare browserless replay too, but silently
|
|
17396
|
+
* returns the document UNTRANSLATED without a BotGuard token (`x-goog-batchexecute-bgr`) only
|
|
17397
|
+
* a real browser produces — measured 2026-09-16, two earlier browserless-adjacent attempts
|
|
17398
|
+
* read that 200 as success.
|
|
17399
|
+
*/
|
|
17400
|
+
translateDocument(args: TranslateDocumentArgs): Promise<GoogleTranslateDocumentResult>;
|
|
17401
|
+
|
|
17402
|
+
/**
|
|
17403
|
+
* Read the text in a picture and translate it — the Images tab. Takes `imageBase64` (the
|
|
17404
|
+
* image, base64-encoded), `mimeType`, `to`, and optional `from` (left out, auto-detects), and
|
|
17405
|
+
* returns `translatedImageBase64` + `mimeType` (a copy of the image with the detected text
|
|
17406
|
+
* replaced in place) plus the plain `sourceText`/`translatedText` strings Google's OCR found.
|
|
17407
|
+
* Shares `translateDocument`'s RPC channel and BotGuard gate (rung 15, real browser) but its
|
|
17408
|
+
* own rpcid (`WqWDPb`) and upload shape — measured 2026-09-16 uploading a real PNG with
|
|
17409
|
+
* rendered glyphs, verified "Hola mundo" → "Bonjour le monde" (tl=fr) and → "Hello world"
|
|
17410
|
+
* (tl=en).
|
|
17411
|
+
*/
|
|
17412
|
+
translateImage(args: TranslateImageArgs): Promise<GoogleTranslateImageResult>;
|
|
15544
17413
|
}
|
|
15545
17414
|
}
|
|
15546
17415
|
|
|
@@ -21199,7 +23068,7 @@ interface LululemonColorway {
|
|
|
21199
23068
|
imageAssets: ProductImage[];
|
|
21200
23069
|
sale: SaleEvidence;
|
|
21201
23070
|
coordination: CoordinationMetadata;
|
|
21202
|
-
/** ISO 4217, or null
|
|
23071
|
+
/** ISO 4217 from the colourway url's own locale, or null for an unknown one. */
|
|
21203
23072
|
currency: string | null;
|
|
21204
23073
|
inStock: boolean;
|
|
21205
23074
|
optionGroups: LululemonOptionGroup[];
|
|
@@ -21246,7 +23115,7 @@ interface LululemonProductAttributes {
|
|
|
21246
23115
|
/** The site's own ProductGroup category, e.g. "Leggings". */
|
|
21247
23116
|
category: string | null;
|
|
21248
23117
|
description: string | null;
|
|
21249
|
-
/** Trademarked fabric names off the detail
|
|
23118
|
+
/** Trademarked fabric names off the product-detail region, e.g. ["Nulu"]. */
|
|
21250
23119
|
fabrics: string[];
|
|
21251
23120
|
fit: string | null;
|
|
21252
23121
|
/** "High-Rise" / "Mid-Rise" / "Low-Rise", as the title spells it. */
|
|
@@ -25514,6 +27383,435 @@ interface PremierbuildingsDealer {
|
|
|
25514
27383
|
}
|
|
25515
27384
|
}
|
|
25516
27385
|
|
|
27386
|
+
declare namespace BowmarkProvider_prime_video {
|
|
27387
|
+
// ── Prime Video — the unit's own declarations, verbatim ──
|
|
27388
|
+
interface PrimeVideoTitle {
|
|
27389
|
+
titleId: string;
|
|
27390
|
+
catalogId: string | null;
|
|
27391
|
+
title: string;
|
|
27392
|
+
url: string;
|
|
27393
|
+
entityType: string | null;
|
|
27394
|
+
releaseYear: number | null;
|
|
27395
|
+
maturityRating: string | null;
|
|
27396
|
+
entitled: boolean;
|
|
27397
|
+
watchMessage: string | null;
|
|
27398
|
+
}
|
|
27399
|
+
interface PrimeVideoTitleSuggestion {
|
|
27400
|
+
value: string;
|
|
27401
|
+
}
|
|
27402
|
+
interface PrimeVideoWatchOffer {
|
|
27403
|
+
kind: "rent" | "buy" | "subscribe";
|
|
27404
|
+
label: string;
|
|
27405
|
+
price: { currency: string; value: string } | null;
|
|
27406
|
+
quality: "SD" | "HD" | "UHD" | null;
|
|
27407
|
+
channel: { benefitId: string; link: string } | null;
|
|
27408
|
+
}
|
|
27409
|
+
interface PrimeVideoWatchOptions {
|
|
27410
|
+
titleId: string;
|
|
27411
|
+
entitlementType: "Entitled" | "Unentitled";
|
|
27412
|
+
entitled: boolean;
|
|
27413
|
+
message: string;
|
|
27414
|
+
channel: { name: string; link: string } | null;
|
|
27415
|
+
offers: PrimeVideoWatchOffer[];
|
|
27416
|
+
}
|
|
27417
|
+
interface PrimeVideoSeason {
|
|
27418
|
+
seasonId: string;
|
|
27419
|
+
seasonLink: string;
|
|
27420
|
+
displayName: string;
|
|
27421
|
+
sequenceNumber: number;
|
|
27422
|
+
seasonSelectorIcon: string | null;
|
|
27423
|
+
}
|
|
27424
|
+
interface PrimeVideoCredit {
|
|
27425
|
+
name: string;
|
|
27426
|
+
searchLink: string | null;
|
|
27427
|
+
}
|
|
27428
|
+
interface PrimeVideoRatingBucket {
|
|
27429
|
+
stars: 1 | 2 | 3 | 4 | 5;
|
|
27430
|
+
percentage: number;
|
|
27431
|
+
}
|
|
27432
|
+
interface PrimeVideoTitleDetail {
|
|
27433
|
+
titleId: string;
|
|
27434
|
+
catalogId: string | null;
|
|
27435
|
+
title: string;
|
|
27436
|
+
seriesTitle: string | null;
|
|
27437
|
+
seasonNumber: number | null;
|
|
27438
|
+
titleType: string | null;
|
|
27439
|
+
synopsis: string | null;
|
|
27440
|
+
releaseYear: number | null;
|
|
27441
|
+
releaseDate: string | null;
|
|
27442
|
+
runtime: string | null;
|
|
27443
|
+
durationSeconds: number | null;
|
|
27444
|
+
genres: string[];
|
|
27445
|
+
maturityRating: string | null;
|
|
27446
|
+
cast: PrimeVideoCredit[];
|
|
27447
|
+
directors: PrimeVideoCredit[];
|
|
27448
|
+
studios: string[];
|
|
27449
|
+
amazonRating: { value: number; count: number } | null;
|
|
27450
|
+
ratingsHistogram: PrimeVideoRatingBucket[];
|
|
27451
|
+
imdbScore: number | null;
|
|
27452
|
+
audioTracks: string[];
|
|
27453
|
+
subtitles: string[];
|
|
27454
|
+
isUhd: boolean;
|
|
27455
|
+
isHdr: boolean;
|
|
27456
|
+
isDolbyVision: boolean;
|
|
27457
|
+
isDolbyAtmos: boolean;
|
|
27458
|
+
isXRay: boolean;
|
|
27459
|
+
isClosedCaption: boolean;
|
|
27460
|
+
isPrime: boolean;
|
|
27461
|
+
isAd: boolean;
|
|
27462
|
+
}
|
|
27463
|
+
interface PrimeVideoEpisode {
|
|
27464
|
+
titleId: string | null;
|
|
27465
|
+
episodeNumber: number;
|
|
27466
|
+
title: string;
|
|
27467
|
+
synopsis: string | null;
|
|
27468
|
+
runtime: string | null;
|
|
27469
|
+
durationSeconds: number | null;
|
|
27470
|
+
releaseDate: string | null;
|
|
27471
|
+
releaseYear: number | null;
|
|
27472
|
+
images: { packshot: string | null; covershot: string | null };
|
|
27473
|
+
audioTracks: string[];
|
|
27474
|
+
subtitles: string[];
|
|
27475
|
+
isUhd: boolean;
|
|
27476
|
+
isHdr: boolean;
|
|
27477
|
+
isDolbyVision: boolean;
|
|
27478
|
+
isDolbyAtmos: boolean;
|
|
27479
|
+
isXRay: boolean;
|
|
27480
|
+
isClosedCaption: boolean;
|
|
27481
|
+
isPrime: boolean;
|
|
27482
|
+
isAd: boolean;
|
|
27483
|
+
}
|
|
27484
|
+
interface PrimeVideoPersonCredit {
|
|
27485
|
+
titleId: string | null;
|
|
27486
|
+
catalogId: string;
|
|
27487
|
+
title: string;
|
|
27488
|
+
releaseYear: number | null;
|
|
27489
|
+
runtime: string | null;
|
|
27490
|
+
synopsis: string | null;
|
|
27491
|
+
maturityRating: string | null;
|
|
27492
|
+
}
|
|
27493
|
+
interface PrimeVideoPerson {
|
|
27494
|
+
personId: string;
|
|
27495
|
+
name: string;
|
|
27496
|
+
roles: string[];
|
|
27497
|
+
birthPlace: string | null;
|
|
27498
|
+
dateOfBirth: string | null;
|
|
27499
|
+
bio: string | null;
|
|
27500
|
+
imdbUrl: string | null;
|
|
27501
|
+
filmography: PrimeVideoPersonCredit[];
|
|
27502
|
+
}
|
|
27503
|
+
interface PrimeVideoCategory {
|
|
27504
|
+
name: string;
|
|
27505
|
+
slug: string;
|
|
27506
|
+
kind: "genre" | "collection" | "storefront";
|
|
27507
|
+
path: string;
|
|
27508
|
+
}
|
|
27509
|
+
interface PrimeVideoCategoryRow {
|
|
27510
|
+
heading: string;
|
|
27511
|
+
titles: PrimeVideoTitle[];
|
|
27512
|
+
}
|
|
27513
|
+
interface PrimeVideoTop10Entry extends PrimeVideoTitle {
|
|
27514
|
+
position: number;
|
|
27515
|
+
list: "tv" | "movies" | "channel";
|
|
27516
|
+
}
|
|
27517
|
+
interface PrimeVideoChannel {
|
|
27518
|
+
name: string;
|
|
27519
|
+
channelId: string | null;
|
|
27520
|
+
benefitId: string | null;
|
|
27521
|
+
synopsis: string | null;
|
|
27522
|
+
offerMessage: string | null;
|
|
27523
|
+
}
|
|
27524
|
+
interface PrimeVideoChannelDetail {
|
|
27525
|
+
name: string;
|
|
27526
|
+
rows: PrimeVideoCategoryRow[];
|
|
27527
|
+
}
|
|
27528
|
+
interface PrimeVideoLiveProgram {
|
|
27529
|
+
title: string;
|
|
27530
|
+
seriesTitle: string | null;
|
|
27531
|
+
start: number;
|
|
27532
|
+
end: number;
|
|
27533
|
+
}
|
|
27534
|
+
interface PrimeVideoLiveStation {
|
|
27535
|
+
id: string;
|
|
27536
|
+
name: string;
|
|
27537
|
+
logo: string | null;
|
|
27538
|
+
group: string;
|
|
27539
|
+
nowPlaying: PrimeVideoLiveProgram | null;
|
|
27540
|
+
}
|
|
27541
|
+
interface PrimeVideoLiveScheduleEntry {
|
|
27542
|
+
title: string;
|
|
27543
|
+
seriesTitle: string | null;
|
|
27544
|
+
seasonNumber: number | null;
|
|
27545
|
+
episodeNumber: number | null;
|
|
27546
|
+
synopsis: string | null;
|
|
27547
|
+
maturityRating: string | null;
|
|
27548
|
+
start: number;
|
|
27549
|
+
end: number;
|
|
27550
|
+
}
|
|
27551
|
+
interface PrimeVideoLiveSportsEvent {
|
|
27552
|
+
titleId: string;
|
|
27553
|
+
title: string;
|
|
27554
|
+
group: string;
|
|
27555
|
+
status: "LIVE" | "UPCOMING" | null;
|
|
27556
|
+
timeBadge: string | null;
|
|
27557
|
+
venue: string | null;
|
|
27558
|
+
entitled: boolean;
|
|
27559
|
+
watchMessage: string | null;
|
|
27560
|
+
}
|
|
27561
|
+
|
|
27562
|
+
/**
|
|
27563
|
+
* Search Prime Video's catalogue and read a film or series the way a viewer does — synopsis,
|
|
27564
|
+
* cast, rating, seasons and episodes — and above all say how it can actually be watched:
|
|
27565
|
+
* included with Prime, free with ads, on a named add-on channel, or rentable and buyable with
|
|
27566
|
+
* the real price. Plus the browse surfaces (genres, collections, the top ten, this week's
|
|
27567
|
+
* deals), the add-on channels, and the free live TV, news and sports schedules. searchTitles,
|
|
27568
|
+
* suggestTitles, getTitle, getWatchOptions, listSeasons, listEpisodes, getPerson and
|
|
27569
|
+
* listCategories are built; everything else is still a declared stub.
|
|
27570
|
+
*/
|
|
27571
|
+
interface Unit {
|
|
27572
|
+
/**
|
|
27573
|
+
* Search Prime Video's whole catalogue for what a person would type — "matrix", "the boys" —
|
|
27574
|
+
* and get back the title cards the site itself ranks: display title, the titleId every other
|
|
27575
|
+
* function here takes, whether it is a film or a series, the year, the maturity rating, and
|
|
27576
|
+
* the site's own sentence for how to watch it. THE provider's door: every titleId-taking
|
|
27577
|
+
* function below is fed by this one. Returns the FIRST page only — Prime Video's search page
|
|
27578
|
+
* carries no pagination markers at all (measured 2026-09-15). `options.waysToWatch` narrows by
|
|
27579
|
+
* how you can watch it — "prime" (included with a Prime membership), "channels" (an add-on
|
|
27580
|
+
* subscription) or "rentOrBuy" — the commonest thing a viewer does after typing a query and
|
|
27581
|
+
* the one refinement built so far. The site's other five refinement dimensions (which channel,
|
|
27582
|
+
* HD/UHD, theme, subtitle language, film-or-series) are still not built here: every one of
|
|
27583
|
+
* them rides the same opaque per-page `serviceToken` mechanism (rung 11 — an undocumented
|
|
27584
|
+
* endpoint reached by harvesting the token off the page a search already returned), never a
|
|
27585
|
+
* query parameter, and a hand-constructed query parameter silently returns the unfiltered set
|
|
27586
|
+
* rather than erroring. A query that matches nothing returns an empty array rather than
|
|
27587
|
+
* throwing. A filtered call whose real matches are too few can carry the site's own generic
|
|
27588
|
+
* recommendations under a heading still labelled "Top results" — measured 2026-09-16, not a
|
|
27589
|
+
* defect in this parser: the site does this identically on the unfiltered page's own "More to
|
|
27590
|
+
* explore" row.
|
|
27591
|
+
*/
|
|
27592
|
+
searchTitles(query: string, options?: { waysToWatch?: "prime" | "channels" | "rentOrBuy" }): Promise<PrimeVideoTitle[]>;
|
|
27593
|
+
|
|
27594
|
+
/**
|
|
27595
|
+
* Ask Prime Video's own search box what it would autocomplete a prefix to — "the boy" comes
|
|
27596
|
+
* back as "the boys", "the boy", "the boy and the heron". What an agent holding a
|
|
27597
|
+
* half-remembered title calls before it commits to a search, and the cheapest call in the
|
|
27598
|
+
* provider.
|
|
27599
|
+
*/
|
|
27600
|
+
suggestTitles(prefix: string): Promise<PrimeVideoTitleSuggestion[]>;
|
|
27601
|
+
|
|
27602
|
+
/**
|
|
27603
|
+
* Read one film, series-season or episode the way a viewer reads its page: title, synopsis,
|
|
27604
|
+
* year, release date, runtime (both the display string and durationSeconds), genres, maturity
|
|
27605
|
+
* rating, cast, directors, studio, the Amazon customer rating and its five-star histogram, the
|
|
27606
|
+
* IMDb score, which audio languages and subtitles it ships, and whether it is in UHD, HDR,
|
|
27607
|
+
* Dolby Atmos or X-Ray. The core read of the whole provider. Takes a titleId or a title URL,
|
|
27608
|
+
* e.g. one read off searchTitles(). THE REVIEW TEXT IS NOT HERE — the aggregate rating and
|
|
27609
|
+
* histogram are real and logged out, but review bodies are amazon.com's own surface behind
|
|
27610
|
+
* amazon.com's sign-in wall.
|
|
27611
|
+
*/
|
|
27612
|
+
getTitle(titleId: string): Promise<PrimeVideoTitleDetail>;
|
|
27613
|
+
|
|
27614
|
+
/**
|
|
27615
|
+
* Say how you would actually watch a title: included with your Prime membership, free with
|
|
27616
|
+
* ads, on an add-on channel you would have to subscribe to (and which one), or available to
|
|
27617
|
+
* rent or buy — and when it is rent-or-buy, every offer with its real price and quality. THE
|
|
27618
|
+
* question this provider exists to answer, and the one no general search result answers about
|
|
27619
|
+
* Amazon's catalogue. Takes a titleId or a title URL, e.g. one read off searchTitles() or
|
|
27620
|
+
* getTitle(). Reads the SAME page as getTitle, never fetches it twice. Placing any of these
|
|
27621
|
+
* orders is never a function of this provider — a flow that costs money stops before the
|
|
27622
|
+
* payment step, always.
|
|
27623
|
+
*/
|
|
27624
|
+
getWatchOptions(titleId: string): Promise<PrimeVideoWatchOptions>;
|
|
27625
|
+
|
|
27626
|
+
/**
|
|
27627
|
+
* List every season of a series with the titleId that opens each one, its number, its display
|
|
27628
|
+
* name, and whether it needs paying for beyond what the current season needs. What an agent
|
|
27629
|
+
* needs when the person said "season 4" and the search returned whichever season Prime Video
|
|
27630
|
+
* ranked first. Takes a titleId or a title URL, e.g. one read off searchTitles() or
|
|
27631
|
+
* getTitle(). Reads the SAME cached page as getTitle and getWatchOptions, never fetches it
|
|
27632
|
+
* twice. A film returns an empty array — a real, measured answer, since a film's own /detail/
|
|
27633
|
+
* page carries no seasons at all.
|
|
27634
|
+
*/
|
|
27635
|
+
listSeasons(titleId: string): Promise<PrimeVideoSeason[]>;
|
|
27636
|
+
|
|
27637
|
+
/**
|
|
27638
|
+
* List a season's episodes with number, title, synopsis, runtime, release date, artwork, and
|
|
27639
|
+
* the audio and subtitle languages each one ships. The read behind "what happens in episode 3"
|
|
27640
|
+
* and "how long is the finale". Takes the SEASON's titleId — one read off listSeasons() or
|
|
27641
|
+
* getTitle() — or a title URL. Reads the SAME cached page as getTitle, getWatchOptions and
|
|
27642
|
+
* listSeasons, never fetches it twice; episodes come with whichever season is selected, so
|
|
27643
|
+
* reading another season means calling this on THAT season's own titleId, off listSeasons(). A
|
|
27644
|
+
* film returns an empty array — a real, measured answer, matching listSeasons() on the same
|
|
27645
|
+
* title.
|
|
27646
|
+
*/
|
|
27647
|
+
listEpisodes(titleId: string): Promise<PrimeVideoEpisode[]>;
|
|
27648
|
+
|
|
27649
|
+
/**
|
|
27650
|
+
* Read a cast member's own Prime Video page: their name, what they are credited as, when and
|
|
27651
|
+
* where they were born, their biography, and the titles of theirs the catalogue carries — with
|
|
27652
|
+
* each credit's own synopsis, runtime and maturity rating, not just its title. How an agent
|
|
27653
|
+
* answers "what else is she in" without leaving the site. Takes a personId or a person URL —
|
|
27654
|
+
* read one off getTitle().cast[].searchLink, never .directors[].searchLink, which points at a
|
|
27655
|
+
* search instead: a director gets no page of their own here, only a searchTitles() fallback.
|
|
27656
|
+
*/
|
|
27657
|
+
getPerson(personId: string): Promise<PrimeVideoPerson>;
|
|
27658
|
+
|
|
27659
|
+
/**
|
|
27660
|
+
* List the ways Prime Video lets you browse — its genres (action, comedy, horror, anime,
|
|
27661
|
+
* documentary and more, plus kids), its editorial collections (new and upcoming, award
|
|
27662
|
+
* winners, free to watch) and its storefronts (movies, TV, store, sports, news, live TV,
|
|
27663
|
+
* subscriptions) — each with the token the browse function below this one in the queue takes.
|
|
27664
|
+
* The door for every browse read here: an agent holding the word "horror" can reach a real
|
|
27665
|
+
* listing without being told a URL. Every row carries `name` (the site's own display text),
|
|
27666
|
+
* `slug` (the literal, inconsistently-cased path token — "science-fiction", "mgForYou" — never
|
|
27667
|
+
* guess its casing) and `kind`. Resolve a caller's typed word against `name`, never `slug`.
|
|
27668
|
+
*/
|
|
27669
|
+
listCategories(): Promise<PrimeVideoCategory[]>;
|
|
27670
|
+
|
|
27671
|
+
/**
|
|
27672
|
+
* Browse one genre, collection or storefront and get its rows of titles back — "what horror is
|
|
27673
|
+
* on Prime Video", "what is in the free-with-ads collection" — each row carrying the site's
|
|
27674
|
+
* own heading ("Popular movies", "Free comedy movies") and every title under it in the site's
|
|
27675
|
+
* own order, with the same fields searchTitles() returns. Takes a `path` off listCategories(),
|
|
27676
|
+
* e.g. "/genre/comedy", "/collection/streamfree", "/movie", "/tv" or "/store" — those five are
|
|
27677
|
+
* the only shapes this pass measured. Drops the leading, unheaded hero carousel every
|
|
27678
|
+
* storefront page opens with; every other row is real. Returns the FIRST page only, exactly
|
|
27679
|
+
* like searchTitles() — these pages carry no pagination markers either.
|
|
27680
|
+
*/
|
|
27681
|
+
listCategoryTitles(path: string): Promise<PrimeVideoCategoryRow[]>;
|
|
27682
|
+
|
|
27683
|
+
/**
|
|
27684
|
+
* What has just arrived on Prime Video and what is coming — the read behind "anything new
|
|
27685
|
+
* worth watching", which a genre browse can never answer because a genre ranks by popularity
|
|
27686
|
+
* and this ranks by recency. Same row shape as listCategoryTitles(): a heading ("Premium New
|
|
27687
|
+
* Releases", "Recently added to Prime – Movies") and every title under it. No arguments — this
|
|
27688
|
+
* is a named call over listCategoryTitles' own parser, pointed at the site's own newness
|
|
27689
|
+
* surfaces (`/collection/newandupcoming` plus `/tv`'s "Explore: Latest TV" row) rather than a
|
|
27690
|
+
* caller-supplied path. Prime Video publishes no logged-out "leaving soon" surface — none of
|
|
27691
|
+
* "leaving", "expires", "available until" or "last chance" appear anywhere the survey read —
|
|
27692
|
+
* so there is no sibling function for that half of the question.
|
|
27693
|
+
*/
|
|
27694
|
+
listNewReleases(): Promise<PrimeVideoCategoryRow[]>;
|
|
27695
|
+
|
|
27696
|
+
/**
|
|
27697
|
+
* What you can watch on Prime Video without paying anything at all — the free-with-ads
|
|
27698
|
+
* catalogue, a different answer from "included with Prime" and the honest one for a caller
|
|
27699
|
+
* with no Amazon subscription. No arguments — `GET /collection/streamfree`, filtered
|
|
27700
|
+
* card-by-card to the site's own `freewithads` entitlement marker rather than trusted by row
|
|
27701
|
+
* heading: a "Free popular TV" row on that page mixes titles a visitor with no subscription
|
|
27702
|
+
* can watch with titles that need Prime, and both carry the identical "Watch for free" message
|
|
27703
|
+
* and "Entitled" verdict, so the row heading alone cannot tell them apart (measured
|
|
27704
|
+
* 2026-09-16: 8 of 20 cards on that row are Prime-included, not free-with-ads). A row whose
|
|
27705
|
+
* cards are all Prime-included, not free-with-ads, is dropped rather than returned empty.
|
|
27706
|
+
*/
|
|
27707
|
+
listFreeToWatch(): Promise<PrimeVideoCategoryRow[]>;
|
|
27708
|
+
|
|
27709
|
+
/**
|
|
27710
|
+
* Prime Video's own top ten right now — the most-watched TV shows in the US ("tv", off `/tv`),
|
|
27711
|
+
* the top films to rent or buy ("movies", off `/store`), or the top ten on one add-on channel
|
|
27712
|
+
* ("channel", off that channel's own page — pass its uuid as `channelId`, e.g. one read off
|
|
27713
|
+
* listChannels() or a channel URL). The read behind "what is everyone watching", and one
|
|
27714
|
+
* search can never give you, because search ranks by relevance and this ranks by what is
|
|
27715
|
+
* actually being played. Every row carries `position` (the card's own 1-based rank within that
|
|
27716
|
+
* list — Prime Video never prints a rank number, so this is the card's own order) and `list`
|
|
27717
|
+
* (which of the three it came from) alongside the same fields searchTitles() returns; a merged
|
|
27718
|
+
* top ten that does not say whether it means streaming or renting is a wrong answer wearing a
|
|
27719
|
+
* right one. **The row is intermittent** — measured this build pass, three spaced captures of
|
|
27720
|
+
* `/tv` in one minute carried it on only one — so a request that lands without it returns
|
|
27721
|
+
* `[]`, a real and honest answer, never an error.
|
|
27722
|
+
*/
|
|
27723
|
+
listTop10(list: "tv" | "movies" | "channel", channelId?: string): Promise<PrimeVideoTop10Entry[]>;
|
|
27724
|
+
|
|
27725
|
+
/**
|
|
27726
|
+
* What is discounted to rent or buy on Prime Video this week — "Prime deals this week", "New
|
|
27727
|
+
* release deals", time-boxed sales and film bundles — the read behind "how do I watch this"
|
|
27728
|
+
* when the answer turns out to be "buy it" and the follow-up is "is it cheaper right now". No
|
|
27729
|
+
* arguments — `GET /store/deals`, read with the same listCategoryTitles() parser: same row
|
|
27730
|
+
* shape (a heading and every title under it), same dropped leading hero carousel. **Carries no
|
|
27731
|
+
* price.** Exactly three dollar strings exist on the whole page and all three are a row
|
|
27732
|
+
* heading ("$15.99 or less TV deals"), never a per-title price, so a caller who wants the
|
|
27733
|
+
* number calls getWatchOptions() on a titleId from one of these rows, where the price comes
|
|
27734
|
+
* off a decoded offerToken rather than a scraped string.
|
|
27735
|
+
*/
|
|
27736
|
+
listDeals(): Promise<PrimeVideoCategoryRow[]>;
|
|
27737
|
+
|
|
27738
|
+
/**
|
|
27739
|
+
* List the add-on subscriptions Prime Video sells inside itself — HBO Max, Paramount+,
|
|
27740
|
+
* Britbox, ViX Premium and seventy-odd more — with the two ids each one is addressed by:
|
|
27741
|
+
* `channelId`, which opens the channel's own page (getChannel(), listTop10("channel",
|
|
27742
|
+
* channelId)), and `benefitId`, which `GET /offers?benefitId=<benefitId>` takes to start a
|
|
27743
|
+
* subscription. The door for getChannel() and the thing that turns getWatchOptions' "get an
|
|
27744
|
+
* add-on subscription" into a named service a person can decide about. No arguments — `GET
|
|
27745
|
+
* /addons`, read off the "Subscriptions you might like" row with the shared hydration parser.
|
|
27746
|
+
* **Carries no price.** The two dollar strings on the whole page are a card's own compact
|
|
27747
|
+
* offer wording, never a clean number, so `offerMessage` carries the site's own sentence
|
|
27748
|
+
* instead. Most cards carry both ids; a card with no channel page of its own (CNN All Access)
|
|
27749
|
+
* carries only `benefitId`, and one further outlier (NBA League Pass, a subscription pass
|
|
27750
|
+
* rather than a channel) carries neither — both real, measured gaps, never a guess.
|
|
27751
|
+
*/
|
|
27752
|
+
listChannels(): Promise<PrimeVideoChannel[]>;
|
|
27753
|
+
|
|
27754
|
+
/**
|
|
27755
|
+
* Read one add-on channel: what it is called, its top ten, its originals and series, and the
|
|
27756
|
+
* live events it is carrying — the rest of a channel's catalogue, for answering "is it worth
|
|
27757
|
+
* subscribing to this to watch that" rather than one title. Takes the channel's uuid off
|
|
27758
|
+
* listChannels(), e.g. one read off `channelId` there — NOT the same card's `benefitId`, which
|
|
27759
|
+
* opens a different route. `GET /channel/<uuid>`, read off the same carousel parser
|
|
27760
|
+
* listCategoryTitles() uses: a heading and every title under it, per row, in the site's own
|
|
27761
|
+
* order. `rows` never includes the channel's own hero banner, which carries no title list of
|
|
27762
|
+
* its own.
|
|
27763
|
+
*/
|
|
27764
|
+
getChannel(channelId: string): Promise<PrimeVideoChannelDetail>;
|
|
27765
|
+
|
|
27766
|
+
/**
|
|
27767
|
+
* List the free live TV ("livetv", off `/livetv`) or news ("news", off `/news`) stations Prime
|
|
27768
|
+
* Video streams — their name, their logo, the id that addresses them, which row they are
|
|
27769
|
+
* grouped under (on `/livetv` the channel selling them, "Prime" or "AMC+"; on `/news` a topic
|
|
27770
|
+
* like "National news"), and what is on each one right now. The half of this site that has
|
|
27771
|
+
* nothing to do with the on-demand catalogue. `nowPlaying` is derived by walking the station's
|
|
27772
|
+
* own schedule for the entry covering this moment, never read off a per-entry badge — measured
|
|
27773
|
+
* 2026-09-16, every schedule entry on both pages carries the identical `linearBadge: {label:
|
|
27774
|
+
* "ON NOW"}` whether or not it is actually airing, so that field cannot say which slot is
|
|
27775
|
+
* current. `nowPlaying` is `null`, a real answer, when no entry covers this instant. A station
|
|
27776
|
+
* whose card appears on more than one row on the same page (an unheaded hero container
|
|
27777
|
+
* duplicating a station a headed row below it already carries) is returned once, off the
|
|
27778
|
+
* headed row — an unheaded container is dropped whole.
|
|
27779
|
+
*/
|
|
27780
|
+
listLiveChannels(section: "livetv" | "news"): Promise<PrimeVideoLiveStation[]>;
|
|
27781
|
+
|
|
27782
|
+
/**
|
|
27783
|
+
* Read one live TV or news station's FULL schedule — every program the page carries for it, in
|
|
27784
|
+
* order, never filtered to what is on now (that single entry is `listLiveChannels()`'s own
|
|
27785
|
+
* `nowPlaying`). `start` and `end` are EPOCH MILLISECONDS, never the page's
|
|
27786
|
+
* `localizedTimeRange` ("9 - 9:30 AM EDT"), which is rendered for Amazon's assumed timezone
|
|
27787
|
+
* and useless to a caller in another one. Takes the SAME `section` `listLiveChannels(section)`
|
|
27788
|
+
* was called with and a `stationId` read off one of its rows — `/livetv` and `/news` carry
|
|
27789
|
+
* different stations, so a `livetv` id will not resolve on `/news`. Refuses (caller-fixable)
|
|
27790
|
+
* when the page carries no station with that id.
|
|
27791
|
+
*/
|
|
27792
|
+
getLiveSchedule(section: "livetv" | "news", stationId: string): Promise<PrimeVideoLiveProgram[]>;
|
|
27793
|
+
|
|
27794
|
+
/**
|
|
27795
|
+
* What sport is on Prime Video now and what is coming — live and upcoming EVENTS, off
|
|
27796
|
+
* `/sports`, never a station (that is `listLiveChannels`'s own shape, a `LinearStationCard`,
|
|
27797
|
+
* which this function ignores) and never an on-demand documentary sharing the same page. No
|
|
27798
|
+
* arguments. `group` names the row the event is listed under: "Sports with a subscription" is
|
|
27799
|
+
* entitlement a Prime member already carries some of, "Apple TV: Live and upcoming events" is
|
|
27800
|
+
* a different provider's events entirely, and `entitled`/`watchMessage` carry the site's own
|
|
27801
|
+
* per-event verdict — measured 2026-09-16, a Prime-entitled poker event on the "Sports with a
|
|
27802
|
+
* subscription" row reads `entitled: true, watchMessage: "Watch for free"` beside an
|
|
27803
|
+
* Unentitled squash event on the SAME row reading `entitled: false, watchMessage: "Free trial
|
|
27804
|
+
* of SquashTV"`, so the row heading alone never says whether a given event is free. `status`
|
|
27805
|
+
* and `timeBadge` are the site's own words ("LIVE", "Live at 7 PM EDT", "Fri, Sep 18 6:30 PM
|
|
27806
|
+
* EDT") — no epoch timestamp exists on an event card the way one does on a station's
|
|
27807
|
+
* `schedule[]`, so none is invented. `venue` is `null` for an event with no physical location
|
|
27808
|
+
* (an online poker series, a studio broadcast) — a real and common answer, never a parse
|
|
27809
|
+
* failure.
|
|
27810
|
+
*/
|
|
27811
|
+
listLiveSports(): Promise<PrimeVideoLiveSportsEvent[]>;
|
|
27812
|
+
}
|
|
27813
|
+
}
|
|
27814
|
+
|
|
25517
27815
|
declare namespace BowmarkProvider_progressive {
|
|
25518
27816
|
// ── Progressive — the unit's own declarations, verbatim ──
|
|
25519
27817
|
// Progressive's OWN shapes — not a capability contract.
|
|
@@ -28359,6 +30657,88 @@ interface ScPlaylist {
|
|
|
28359
30657
|
}
|
|
28360
30658
|
}
|
|
28361
30659
|
|
|
30660
|
+
declare namespace BowmarkProvider_speedrun {
|
|
30661
|
+
// ── speedrun.com — the unit's own declarations, verbatim ──
|
|
30662
|
+
interface FindGameArgs {
|
|
30663
|
+
name: string;
|
|
30664
|
+
}
|
|
30665
|
+
|
|
30666
|
+
interface CategoriesArgs {
|
|
30667
|
+
gameId: string;
|
|
30668
|
+
}
|
|
30669
|
+
|
|
30670
|
+
interface PlatformsArgs {
|
|
30671
|
+
gameId?: string;
|
|
30672
|
+
}
|
|
30673
|
+
|
|
30674
|
+
interface Game {
|
|
30675
|
+
id: string;
|
|
30676
|
+
names: { international: string; japanese?: string };
|
|
30677
|
+
abbreviation: string;
|
|
30678
|
+
weblink: string;
|
|
30679
|
+
released: number;
|
|
30680
|
+
"release-date": string;
|
|
30681
|
+
platforms?: string[];
|
|
30682
|
+
ruleset?: { "require-video": boolean; "require-verification": boolean; "show-milliseconds": boolean };
|
|
30683
|
+
}
|
|
30684
|
+
|
|
30685
|
+
interface Category {
|
|
30686
|
+
id: string;
|
|
30687
|
+
name: string;
|
|
30688
|
+
weblink: string;
|
|
30689
|
+
type: string; // "per-game" | "per-level"
|
|
30690
|
+
rules?: string;
|
|
30691
|
+
players?: { type: string; value?: number }
|
|
30692
|
+
miscellaneous?: boolean; // hidden from the default leaderboard view
|
|
30693
|
+
variables?: { data: CategoryVariable[] }
|
|
30694
|
+
}
|
|
30695
|
+
|
|
30696
|
+
interface CategoryVariable {
|
|
30697
|
+
id: string;
|
|
30698
|
+
name: string;
|
|
30699
|
+
mandatory: boolean;
|
|
30700
|
+
"user-defined": boolean;
|
|
30701
|
+
// submitRun takes the KEY of a choice, never its label
|
|
30702
|
+
values?: { choices?: Record<string, { label: string }>; default?: string }
|
|
30703
|
+
}
|
|
30704
|
+
|
|
30705
|
+
interface Platform {
|
|
30706
|
+
id: string;
|
|
30707
|
+
name: string;
|
|
30708
|
+
released?: number;
|
|
30709
|
+
}
|
|
30710
|
+
|
|
30711
|
+
/** Submit speedruns and search game metadata on speedrun.com */
|
|
30712
|
+
interface Unit {
|
|
30713
|
+
/**
|
|
30714
|
+
* Searches games by name and returns the matches with the metadata every other call here needs
|
|
30715
|
+
* — the opaque `id`, the abbreviation, the weblink, the platform ids, and the `ruleset` that
|
|
30716
|
+
* says whether a video is required and whether milliseconds are shown. Start here:
|
|
30717
|
+
* speedrun.com addresses everything by id and nothing by title. The search is fuzzy and
|
|
30718
|
+
* ranked, so read the first row rather than assuming one match, and an unknown title returns
|
|
30719
|
+
* an empty array rather than an error.
|
|
30720
|
+
*/
|
|
30721
|
+
findGame(args: FindGameArgs): Promise<Game[]>;
|
|
30722
|
+
|
|
30723
|
+
/**
|
|
30724
|
+
* Lists every category for one game, with the variables each one carries. The `variables`
|
|
30725
|
+
* block is the part that matters before a submit: a category with a `mandatory` variable
|
|
30726
|
+
* rejects a run that omits it, and the accepted values are the keys of `values.choices`, not
|
|
30727
|
+
* their labels. `type` separates a per-game category from a per-level one, and
|
|
30728
|
+
* `is-miscellaneous` marks the ones the leaderboard hides by default.
|
|
30729
|
+
*/
|
|
30730
|
+
categories(args: CategoriesArgs): Promise<Category[]>;
|
|
30731
|
+
|
|
30732
|
+
/**
|
|
30733
|
+
* Lists platforms as `{ id, name, released }` — called with no argument it returns the whole
|
|
30734
|
+
* speedrun.com platform table, and with a `gameId` only the platforms that game accepts.
|
|
30735
|
+
* Prefer the `gameId` form when you need the platform a specific game accepts — the whole
|
|
30736
|
+
* table is ~140 rows and most of them are not playable for any one game.
|
|
30737
|
+
*/
|
|
30738
|
+
platforms(args?: PlatformsArgs): Promise<Platform[]>;
|
|
30739
|
+
}
|
|
30740
|
+
}
|
|
30741
|
+
|
|
28362
30742
|
declare namespace BowmarkProvider_spirithalloween {
|
|
28363
30743
|
// ── Spirit Halloween — the unit's own declarations, verbatim ──
|
|
28364
30744
|
interface SpiritHalloweenSearchResult {
|
|
@@ -30812,6 +33192,133 @@ type TwiddyQuote =
|
|
|
30812
33192
|
}
|
|
30813
33193
|
}
|
|
30814
33194
|
|
|
33195
|
+
declare namespace BowmarkProvider_twitch {
|
|
33196
|
+
// ── Twitch — the unit's own declarations, verbatim ──
|
|
33197
|
+
interface TwitchVideo {
|
|
33198
|
+
id: string;
|
|
33199
|
+
title: string;
|
|
33200
|
+
/** Seconds. For a live archive this GROWS, trailing real time by a minute or two. */
|
|
33201
|
+
lengthSeconds: number;
|
|
33202
|
+
/** "RECORDING" while the broadcast is live, "RECORDED" after. */
|
|
33203
|
+
status: string;
|
|
33204
|
+
/** "ARCHIVE" (a past broadcast), "HIGHLIGHT" or "UPLOAD". */
|
|
33205
|
+
type: string;
|
|
33206
|
+
createdAt: string;
|
|
33207
|
+
ownerLogin: string;
|
|
33208
|
+
url: string;
|
|
33209
|
+
}
|
|
33210
|
+
interface GetVideoArgs {
|
|
33211
|
+
/** A Twitch video id, or a twitch.tv/videos/<id> link. */
|
|
33212
|
+
vodId: string;
|
|
33213
|
+
}
|
|
33214
|
+
interface CreateHighlightArgs {
|
|
33215
|
+
/** The broadcast to cut from — an id or a twitch.tv/videos/<id> link. Omit it
|
|
33216
|
+
* for the signed-in channel's NEWEST archive, which during a broadcast is the
|
|
33217
|
+
* live one. */
|
|
33218
|
+
vodId?: string;
|
|
33219
|
+
/** Seconds into that video. Rounded outward to whole seconds. */
|
|
33220
|
+
startSeconds: number;
|
|
33221
|
+
endSeconds: number;
|
|
33222
|
+
title: string;
|
|
33223
|
+
description?: string;
|
|
33224
|
+
/** Default "en". */
|
|
33225
|
+
language?: string;
|
|
33226
|
+
tags?: string[];
|
|
33227
|
+
/** Category name, e.g. "Wetrix". */
|
|
33228
|
+
game?: string;
|
|
33229
|
+
}
|
|
33230
|
+
interface TwitchHighlight {
|
|
33231
|
+
/** "created" by this call; "existing" when a highlight with this exact title
|
|
33232
|
+
* was already on the channel (nothing new made); "unknown" when the request
|
|
33233
|
+
* went out and no answer came back — check dashboardUrl before retrying. */
|
|
33234
|
+
status: "created" | "existing" | "unknown";
|
|
33235
|
+
highlightId: string | null;
|
|
33236
|
+
url: string | null;
|
|
33237
|
+
title: string;
|
|
33238
|
+
vodId: string;
|
|
33239
|
+
startSeconds: number;
|
|
33240
|
+
endSeconds: number;
|
|
33241
|
+
channel: string;
|
|
33242
|
+
dashboardUrl: string;
|
|
33243
|
+
}
|
|
33244
|
+
interface SetChannelArgs {
|
|
33245
|
+
/** The channel title shown on the stream page. Twitch's own input field for
|
|
33246
|
+
* this is called "status"; this provider takes the name the UI shows. */
|
|
33247
|
+
title?: string;
|
|
33248
|
+
/** ISO 639-1 language code, e.g. "en". */
|
|
33249
|
+
language?: string;
|
|
33250
|
+
/** Category NAME, e.g. "Wetrix" — not a category id. */
|
|
33251
|
+
game?: string;
|
|
33252
|
+
}
|
|
33253
|
+
interface TwitchChannelSettings {
|
|
33254
|
+
id: string;
|
|
33255
|
+
/** The channel title shown on the stream page. */
|
|
33256
|
+
title: string;
|
|
33257
|
+
/** ISO 639-1 language code, e.g. "en". */
|
|
33258
|
+
language: string;
|
|
33259
|
+
/** The category. Empty strings when the channel has never set one. */
|
|
33260
|
+
gameId: string;
|
|
33261
|
+
gameName: string;
|
|
33262
|
+
}
|
|
33263
|
+
interface RegisterDeveloperAppArgs {
|
|
33264
|
+
/** Application name */
|
|
33265
|
+
name: string;
|
|
33266
|
+
/** OAuth redirect URI(s), comma-separated if multiple */
|
|
33267
|
+
redirectUri: string;
|
|
33268
|
+
/** "Application Integration" or "Website Integration" */
|
|
33269
|
+
category: string;
|
|
33270
|
+
/** "Public" or "Confidential" */
|
|
33271
|
+
clientType?: string;
|
|
33272
|
+
}
|
|
33273
|
+
interface TwitchDeveloperApp {
|
|
33274
|
+
clientId: string;
|
|
33275
|
+
clientSecret?: string;
|
|
33276
|
+
name: string;
|
|
33277
|
+
redirectUri: string;
|
|
33278
|
+
dashboardUrl: string;
|
|
33279
|
+
}
|
|
33280
|
+
|
|
33281
|
+
/**
|
|
33282
|
+
* Twitch — cut a Highlight of your own broadcast, including the one still live, and read any
|
|
33283
|
+
* public video's length and status.
|
|
33284
|
+
*/
|
|
33285
|
+
interface Unit {
|
|
33286
|
+
/**
|
|
33287
|
+
* Reads one public Twitch video by id or twitch.tv/videos link — title, length in seconds,
|
|
33288
|
+
* whether it is still RECORDING (a live broadcast's archive) or RECORDED, its type (ARCHIVE,
|
|
33289
|
+
* HIGHLIGHT, UPLOAD) and its channel. No sign-in. THROWS naming the id when Twitch has no such
|
|
33290
|
+
* video.
|
|
33291
|
+
*/
|
|
33292
|
+
getVideo(args: GetVideoArgs): Promise<TwitchVideo>;
|
|
33293
|
+
|
|
33294
|
+
/**
|
|
33295
|
+
* Cuts a permanent Highlight from the signed-in streamer's own broadcast — including the one
|
|
33296
|
+
* still live — between two offsets in seconds, with a title. Omit vodId to cut from the newest
|
|
33297
|
+
* archive. NEEDS the streamer's Twitch sign-in, which only a capability can hold: call it as
|
|
33298
|
+
* bowmark.stream_highlights.create. Idempotent on the title: a highlight whose title already
|
|
33299
|
+
* exists on the channel is returned with status "existing" rather than made twice. Refuses,
|
|
33300
|
+
* without asking for a sign-in, a vod id Twitch does not have or an end offset past what the
|
|
33301
|
+
* live archive has recorded so far (retry shortly in that case).
|
|
33302
|
+
*/
|
|
33303
|
+
createHighlight(args: CreateHighlightArgs): Promise<TwitchHighlight>;
|
|
33304
|
+
|
|
33305
|
+
/**
|
|
33306
|
+
* Reads the signed-in streamer's channel settings: title, language and current game/category.
|
|
33307
|
+
* Takes no arguments. NEEDS the streamer's Twitch sign-in, which only a capability can hold:
|
|
33308
|
+
* call it as bowmark.stream_channel.get.
|
|
33309
|
+
*/
|
|
33310
|
+
getChannel(): Promise<TwitchChannelSettings>;
|
|
33311
|
+
|
|
33312
|
+
/**
|
|
33313
|
+
* Updates the signed-in streamer's channel settings: title, language and game/category.
|
|
33314
|
+
* Returns the updated settings. It cannot set tags — `tags` is not a field of Twitch's own
|
|
33315
|
+
* UpdateBroadcastSettingsInput. NEEDS the streamer's Twitch sign-in, which only a capability
|
|
33316
|
+
* can hold: call it as bowmark.stream_channel.set.
|
|
33317
|
+
*/
|
|
33318
|
+
setChannel(args: SetChannelArgs): Promise<TwitchChannelSettings>;
|
|
33319
|
+
}
|
|
33320
|
+
}
|
|
33321
|
+
|
|
30815
33322
|
declare namespace BowmarkProvider_uhc_smallbusiness {
|
|
30816
33323
|
// ── UnitedHealthcare Small Business — the unit's own declarations, verbatim ──
|
|
30817
33324
|
interface UhcSmallbusinessPlan {
|
|
@@ -31600,6 +34107,41 @@ interface VisibleGetPlansResult {
|
|
|
31600
34107
|
}
|
|
31601
34108
|
}
|
|
31602
34109
|
|
|
34110
|
+
declare namespace BowmarkProvider_vistaprint {
|
|
34111
|
+
// ── Vistaprint — the unit's own declarations, verbatim ──
|
|
34112
|
+
type ShippingBoxSize = "11x8.5x5.5" | "12x12x5.5" | "13x13x10";
|
|
34113
|
+
type ShippingBoxPrintArea = "inside-and-outside" | "outside-only";
|
|
34114
|
+
|
|
34115
|
+
interface GetShippingBoxPriceArgs {
|
|
34116
|
+
size: ShippingBoxSize;
|
|
34117
|
+
printArea: ShippingBoxPrintArea;
|
|
34118
|
+
quantity: number;
|
|
34119
|
+
}
|
|
34120
|
+
|
|
34121
|
+
interface ShippingBoxPrice {
|
|
34122
|
+
size: ShippingBoxSize;
|
|
34123
|
+
printArea: ShippingBoxPrintArea;
|
|
34124
|
+
quantity: number;
|
|
34125
|
+
price: { amount: number; currency: string }; // real total for `quantity` units
|
|
34126
|
+
unitPrice: { amount: number; currency: string };
|
|
34127
|
+
}
|
|
34128
|
+
|
|
34129
|
+
/**
|
|
34130
|
+
* Prices Vistaprint's Full-Print Shipping Boxes for a real size, print area and quantity — the
|
|
34131
|
+
* live, quantity-tiered price the site's own PDP configurator computes, with no browser,
|
|
34132
|
+
* account or cart. Custom printed boxes, mailer boxes and packaging boxes.
|
|
34133
|
+
*/
|
|
34134
|
+
interface Unit {
|
|
34135
|
+
/**
|
|
34136
|
+
* Reads Vistaprint's own live pricing service for its Full-Print Shipping Boxes — the real,
|
|
34137
|
+
* quantity-tiered total and per-unit price for a chosen box size, print area and quantity, the
|
|
34138
|
+
* same figure the site's PDP configurator computes as a buyer changes those inputs. THROWS a
|
|
34139
|
+
* caller-fixable error for a size/printArea/quantity combination Vistaprint has no price for.
|
|
34140
|
+
*/
|
|
34141
|
+
getShippingBoxPrice(args: GetShippingBoxPriceArgs): Promise<ShippingBoxPrice>;
|
|
34142
|
+
}
|
|
34143
|
+
}
|
|
34144
|
+
|
|
31603
34145
|
declare namespace BowmarkProvider_voluspa {
|
|
31604
34146
|
// ── Voluspa — the unit's own declarations, verbatim ──
|
|
31605
34147
|
interface VoluspaQuizButton {
|
|
@@ -32318,12 +34860,34 @@ interface YoutubeTranscript {
|
|
|
32318
34860
|
fullText: string;
|
|
32319
34861
|
}
|
|
32320
34862
|
|
|
34863
|
+
interface YoutubeSearchVideo {
|
|
34864
|
+
videoId: string;
|
|
34865
|
+
url: string;
|
|
34866
|
+
title: string;
|
|
34867
|
+
channel: string | null;
|
|
34868
|
+
channelId: string | null;
|
|
34869
|
+
published: string | null; // YouTube's own phrase, e.g. "4 weeks ago"
|
|
34870
|
+
publishedAgeSeconds: number | null; // that phrase in seconds, to order newest-first
|
|
34871
|
+
length: string | null; // e.g. "22:28"; null for a live stream
|
|
34872
|
+
views: number | null;
|
|
34873
|
+
thumbnail: string | null;
|
|
34874
|
+
}
|
|
34875
|
+
|
|
32321
34876
|
/**
|
|
32322
34877
|
* A YouTube video's own caption transcript, read off the site's own Transcript panel —
|
|
32323
34878
|
* timestamped lines plus the full text as one string. Language selection is not offered yet;
|
|
32324
34879
|
* this reads whichever track the panel shows by default.
|
|
32325
34880
|
*/
|
|
32326
34881
|
interface Unit {
|
|
34882
|
+
/**
|
|
34883
|
+
* Searches YouTube the way its search box does and returns the videos on the results page —
|
|
34884
|
+
* id, url, title, channel, upload age, length and views. `uploadedWithin` applies YouTube's
|
|
34885
|
+
* own upload-date filter. Rows come back in YouTube's own order either way, which is NOT
|
|
34886
|
+
* newest first, so sort on `publishedAgeSeconds` (smaller is newer) to find the most recent.
|
|
34887
|
+
* Pass a video's `url` or `videoId` straight to `getTranscript`.
|
|
34888
|
+
*/
|
|
34889
|
+
search(input: { query: string; uploadedWithin?: "today" | "week" | "month" | "year" }): Promise<YoutubeSearchVideo[]>;
|
|
34890
|
+
|
|
32327
34891
|
/**
|
|
32328
34892
|
* Returns a YouTube video's own caption transcript. `video` is a bare 11-character video id or
|
|
32329
34893
|
* any watch/shorts/embed/live/youtu.be URL. `segments` is [] — a real, honest answer — when
|
|
@@ -33236,6 +35800,7 @@ interface BowmarkProviders {
|
|
|
33236
35800
|
ajmadison: BowmarkProvider_ajmadison.Unit;
|
|
33237
35801
|
allied: BowmarkProvider_allied.Unit;
|
|
33238
35802
|
alphavantage: BowmarkProvider_alphavantage.Unit;
|
|
35803
|
+
amazon: BowmarkProvider_amazon.Unit;
|
|
33239
35804
|
americandreamvacations: BowmarkProvider_americandreamvacations.Unit;
|
|
33240
35805
|
americanstandard: BowmarkProvider_americanstandard.Unit;
|
|
33241
35806
|
americanvisionwindows: BowmarkProvider_americanvisionwindows.Unit;
|
|
@@ -33246,6 +35811,7 @@ interface BowmarkProviders {
|
|
|
33246
35811
|
anthropic_com: BowmarkProvider_anthropic_com.Unit;
|
|
33247
35812
|
antunes: BowmarkProvider_antunes.Unit;
|
|
33248
35813
|
aosom: BowmarkProvider_aosom.Unit;
|
|
35814
|
+
app_store: BowmarkProvider_app_store.Unit;
|
|
33249
35815
|
apple: BowmarkProvider_apple.Unit;
|
|
33250
35816
|
aquaphoenixsci: BowmarkProvider_aquaphoenixsci.Unit;
|
|
33251
35817
|
arajet: BowmarkProvider_arajet.Unit;
|
|
@@ -33297,6 +35863,7 @@ interface BowmarkProviders {
|
|
|
33297
35863
|
boydsleep: BowmarkProvider_boydsleep.Unit;
|
|
33298
35864
|
brius: BowmarkProvider_brius.Unit;
|
|
33299
35865
|
brixton: BowmarkProvider_brixton.Unit;
|
|
35866
|
+
browser_use: BowmarkProvider_browser_use.Unit;
|
|
33300
35867
|
builder_strucsure_com: BowmarkProvider_builder_strucsure_com.Unit;
|
|
33301
35868
|
bulletproof: BowmarkProvider_bulletproof.Unit;
|
|
33302
35869
|
bungalow: BowmarkProvider_bungalow.Unit;
|
|
@@ -33418,6 +35985,7 @@ interface BowmarkProviders {
|
|
|
33418
35985
|
google_flights: BowmarkProvider_google_flights.Unit;
|
|
33419
35986
|
google_maps: BowmarkProvider_google_maps.Unit;
|
|
33420
35987
|
google_news: BowmarkProvider_google_news.Unit;
|
|
35988
|
+
google_translate: BowmarkProvider_google_translate.Unit;
|
|
33421
35989
|
gostoreit: BowmarkProvider_gostoreit.Unit;
|
|
33422
35990
|
gotchacovered: BowmarkProvider_gotchacovered.Unit;
|
|
33423
35991
|
grainger: BowmarkProvider_grainger.Unit;
|
|
@@ -33540,6 +36108,7 @@ interface BowmarkProviders {
|
|
|
33540
36108
|
positivegrid: BowmarkProvider_positivegrid.Unit;
|
|
33541
36109
|
postiz: BowmarkProvider_postiz.Unit;
|
|
33542
36110
|
premierbuildings: BowmarkProvider_premierbuildings.Unit;
|
|
36111
|
+
prime_video: BowmarkProvider_prime_video.Unit;
|
|
33543
36112
|
progressive: BowmarkProvider_progressive.Unit;
|
|
33544
36113
|
prolook: BowmarkProvider_prolook.Unit;
|
|
33545
36114
|
prose: BowmarkProvider_prose.Unit;
|
|
@@ -33576,6 +36145,7 @@ interface BowmarkProviders {
|
|
|
33576
36145
|
smithery: BowmarkProvider_smithery.Unit;
|
|
33577
36146
|
solostove: BowmarkProvider_solostove.Unit;
|
|
33578
36147
|
soundcloud: BowmarkProvider_soundcloud.Unit;
|
|
36148
|
+
speedrun: BowmarkProvider_speedrun.Unit;
|
|
33579
36149
|
spirithalloween: BowmarkProvider_spirithalloween.Unit;
|
|
33580
36150
|
starlighthomes: BowmarkProvider_starlighthomes.Unit;
|
|
33581
36151
|
statefarm: BowmarkProvider_statefarm.Unit;
|
|
@@ -33607,6 +36177,7 @@ interface BowmarkProviders {
|
|
|
33607
36177
|
tryalma_com: BowmarkProvider_tryalma_com.Unit;
|
|
33608
36178
|
tweethunter: BowmarkProvider_tweethunter.Unit;
|
|
33609
36179
|
twiddy: BowmarkProvider_twiddy.Unit;
|
|
36180
|
+
twitch: BowmarkProvider_twitch.Unit;
|
|
33610
36181
|
uhc_smallbusiness: BowmarkProvider_uhc_smallbusiness.Unit;
|
|
33611
36182
|
ulrichlifestyle: BowmarkProvider_ulrichlifestyle.Unit;
|
|
33612
36183
|
upkeepstl_com: BowmarkProvider_upkeepstl_com.Unit;
|
|
@@ -33618,6 +36189,7 @@ interface BowmarkProviders {
|
|
|
33618
36189
|
viewrail: BowmarkProvider_viewrail.Unit;
|
|
33619
36190
|
villagerealtyobx: BowmarkProvider_villagerealtyobx.Unit;
|
|
33620
36191
|
visible: BowmarkProvider_visible.Unit;
|
|
36192
|
+
vistaprint: BowmarkProvider_vistaprint.Unit;
|
|
33621
36193
|
voluspa: BowmarkProvider_voluspa.Unit;
|
|
33622
36194
|
vscode: BowmarkProvider_vscode.Unit;
|
|
33623
36195
|
walkerhughes: BowmarkProvider_walkerhughes.Unit;
|
|
@@ -85357,6 +87929,7 @@ interface BowmarkProviders {
|
|
|
85357
87929
|
* generated once precisely so those two cannot drift. */
|
|
85358
87930
|
interface BowmarkLibrary {
|
|
85359
87931
|
booking_links: BowmarkCapability_booking_links.Unit;
|
|
87932
|
+
browser_agent: BowmarkCapability_browser_agent.Unit;
|
|
85360
87933
|
bundles: BowmarkCapability_bundles.Unit;
|
|
85361
87934
|
cable_railing_quote: BowmarkCapability_cable_railing_quote.Unit;
|
|
85362
87935
|
cars: BowmarkCapability_cars.Unit;
|
|
@@ -85397,6 +87970,7 @@ interface BowmarkLibrary {
|
|
|
85397
87970
|
search: BowmarkCapability_search.Unit;
|
|
85398
87971
|
sheds: BowmarkCapability_sheds.Unit;
|
|
85399
87972
|
shipping: BowmarkCapability_shipping.Unit;
|
|
87973
|
+
stream_highlights: BowmarkCapability_stream_highlights.Unit;
|
|
85400
87974
|
tariff: BowmarkCapability_tariff.Unit;
|
|
85401
87975
|
text_to_speech: BowmarkCapability_text_to_speech.Unit;
|
|
85402
87976
|
theme_park_tickets: BowmarkCapability_theme_park_tickets.Unit;
|