@bowmark/web 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/generated/library.d.ts +1039 -24
- package/src/generated/validators.ts +673 -11
|
@@ -5,9 +5,9 @@
|
|
|
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 capabilities,
|
|
10
|
-
// 51,
|
|
8
|
+
// Manifest version: 6368edcbec9d9ee7ceb3fd590c7054ade0542a93e43a39f4f88dc6167c0e36da
|
|
9
|
+
// 8 capabilities, 74 providers, 233 typed functions, 20 refused.
|
|
10
|
+
// 51,712 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
|
|
13
13
|
// carry no types, so no honest signature exists. Each one is commented in place
|
|
@@ -232,6 +232,71 @@ type BookingOptionsResult = {
|
|
|
232
232
|
// sellers are not in here. Empty means nothing dropped.
|
|
233
233
|
}
|
|
234
234
|
|
|
235
|
+
// Give EITHER flightNumber OR both origin and destination, plus date and airline.
|
|
236
|
+
type FlightStatusQuery = {
|
|
237
|
+
airline: string // IATA carrier code, e.g. "AA" — routes to the airline
|
|
238
|
+
// that flies it; there is no default to guess
|
|
239
|
+
date: string // the flight's ORIGIN date, ISO "2026-08-04"
|
|
240
|
+
flightNumber?: string // "100", "2005", or "AA2005"
|
|
241
|
+
origin?: string // IATA code — with destination, returns every NONSTOP
|
|
242
|
+
destination?: string // that airline flies on the route that day
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// One leg's status, at one end of the flight.
|
|
246
|
+
type FlightStatusAirport = {
|
|
247
|
+
airportCode: string
|
|
248
|
+
cityName: string | null
|
|
249
|
+
gate: string | null // null is UNKNOWN, not "no gate" — normal for a flight
|
|
250
|
+
// weeks out
|
|
251
|
+
terminal: string | null
|
|
252
|
+
state: string | null
|
|
253
|
+
country: string | null
|
|
254
|
+
baggageClaim: string | null // arrival end only
|
|
255
|
+
scheduledTime: string | null // ISO 8601 WITH the airport's own UTC offset
|
|
256
|
+
estimatedTime: string | null
|
|
257
|
+
actualTime: string | null // what happened, once it has; null before the event
|
|
258
|
+
scheduledBoardingTime: string | null // departure end only
|
|
259
|
+
estimatedBoardingTime: string | null
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
type FlightStatusLeg = {
|
|
263
|
+
flightNumber: string
|
|
264
|
+
airlineCode: string
|
|
265
|
+
flightStatus: string | null // the airline's own wording, verbatim
|
|
266
|
+
flightStatusKey: string | null // a stable key behind the wording — branch on
|
|
267
|
+
// this, not the display string
|
|
268
|
+
flightStatusColor: string | null // the airline's own severity colour, where
|
|
269
|
+
// it publishes one (GREEN, ORANGE, RED, ...)
|
|
270
|
+
canceled: boolean
|
|
271
|
+
diverted: boolean
|
|
272
|
+
inFlight: boolean
|
|
273
|
+
landed: boolean
|
|
274
|
+
departure: FlightStatusAirport
|
|
275
|
+
arrival: FlightStatusAirport
|
|
276
|
+
equipment: {
|
|
277
|
+
tailNumber: string | null
|
|
278
|
+
equipmentCode: string | null
|
|
279
|
+
iataName: string | null
|
|
280
|
+
displayName: string | null // e.g. "Airbus A321neo"
|
|
281
|
+
}
|
|
282
|
+
disruptionMessage: string | null // the airline's own passenger-facing prose
|
|
283
|
+
codeShare: boolean
|
|
284
|
+
operatedBy: string | null
|
|
285
|
+
marketingCarrier: string | null
|
|
286
|
+
wifiAvailable: boolean | null
|
|
287
|
+
powerPortAvailable: boolean | null
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
type FlightStatusResult = {
|
|
291
|
+
date: string // echoed back, "YYYY-MM-DD"
|
|
292
|
+
flightNumber: string | null // null in route mode
|
|
293
|
+
origin: string | null
|
|
294
|
+
destination: string | null
|
|
295
|
+
flights: FlightStatusLeg[] // EMPTY IS AN ANSWER: no such flight that day
|
|
296
|
+
warnings: string[] // always present, same contract as every other
|
|
297
|
+
// function on this capability
|
|
298
|
+
}
|
|
299
|
+
|
|
235
300
|
/**
|
|
236
301
|
* Search flights with one call and get back normalized, price-sorted results (the same
|
|
237
302
|
* physical flight appears once). Each result carries the site it came from (`site`) and every
|
|
@@ -270,6 +335,24 @@ type BookingOptionsResult = {
|
|
|
270
335
|
* on, whose sellers are not included.
|
|
271
336
|
*/
|
|
272
337
|
getBookingOptions(flight: FlightResult, options?: CallOptions): Promise<BookingOptionsResult>;
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* A flight's live status, checked directly with the airline that flies it. Pass `airline` (an
|
|
341
|
+
* IATA carrier code, e.g. "AA") plus `date` (the flight's ORIGIN date, ISO "2026-08-04") and
|
|
342
|
+
* EITHER `flightNumber` OR both `origin` and `destination` (IATA airport codes) to get every
|
|
343
|
+
* nonstop that airline flies on that route that day. Each returned leg carries the airline's
|
|
344
|
+
* own status wording and a stable status key to branch on, the
|
|
345
|
+
* canceled/diverted/inFlight/landed booleans, scheduled/estimated/actual times at both ends as
|
|
346
|
+
* ISO strings with each airport's own UTC offset, gate, terminal and baggage claim, the
|
|
347
|
+
* aircraft, codeshare and operating carrier, and the airline's passenger-facing disruption
|
|
348
|
+
* message. THROWS for an `airline` no provider behind this capability implements, naming which
|
|
349
|
+
* ones can answer — there is no default carrier to guess, unlike `search`, which has no
|
|
350
|
+
* caller-supplied identity to route on in the first place. An empty `flights` array is a real
|
|
351
|
+
* answer: that airline flies no such flight that day, not a failure. `warnings` is always
|
|
352
|
+
* present, same contract as every other function here, though today it can only ever report a
|
|
353
|
+
* clamped `timeoutMs` — a single-carrier route has no fan-out to go thin.
|
|
354
|
+
*/
|
|
355
|
+
getFlightStatus(query: FlightStatusQuery, options?: CallOptions): Promise<FlightStatusResult>;
|
|
273
356
|
}
|
|
274
357
|
}
|
|
275
358
|
|
|
@@ -446,6 +529,29 @@ type CarrierLicensing = {
|
|
|
446
529
|
warnings: string[] // always present; a timeoutMs clamp notice today
|
|
447
530
|
}
|
|
448
531
|
|
|
532
|
+
// listReferralCarriers: whose paper a referral/marketplace program's quote
|
|
533
|
+
// actually places — a fact the quote row itself never states.
|
|
534
|
+
type ReferralCarrierQuery = {
|
|
535
|
+
line?: string // narrow to one property line, e.g. "homeowners" — NOT a closed
|
|
536
|
+
// enum; an unmatched value throws, naming the lines the
|
|
537
|
+
// directory actually publishes. Omit for the whole directory.
|
|
538
|
+
}
|
|
539
|
+
type ReferralCarrier = {
|
|
540
|
+
source: string // which referral program this came from
|
|
541
|
+
name: string // as the directory writes it
|
|
542
|
+
lines: string[] // every property line this carrier is listed under
|
|
543
|
+
url: string | null // the directory's own link for this carrier
|
|
544
|
+
ownedBySource: boolean | null // true only for the referral program's OWN
|
|
545
|
+
// paper; null when the directory linked
|
|
546
|
+
// nothing for this row, so it said nothing
|
|
547
|
+
// to derive an answer from
|
|
548
|
+
}
|
|
549
|
+
type ReferralCarrierListResult = {
|
|
550
|
+
carriers: ReferralCarrier[] // alphabetical by name
|
|
551
|
+
warnings: string[] // always present; names a source that timed
|
|
552
|
+
// out or failed
|
|
553
|
+
}
|
|
554
|
+
|
|
449
555
|
type CallOptions = {
|
|
450
556
|
timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
|
|
451
557
|
// A provider slower than this is DROPPED from the results and
|
|
@@ -516,6 +622,25 @@ type CallOptions = {
|
|
|
516
622
|
* result to hand back. `options.timeoutMs` sets the budget (default 30000).
|
|
517
623
|
*/
|
|
518
624
|
getLicensing(naicCode: string, options?: CallOptions): Promise<CarrierLicensing>;
|
|
625
|
+
|
|
626
|
+
/**
|
|
627
|
+
* Lists the carriers a referral/marketplace program actually places business with — the fact a
|
|
628
|
+
* quote row never states on its face. Reads Progressive's own published directory of outside
|
|
629
|
+
* property carriers (homeowners, renters, condo, dwelling-fire, manufactured-home) today. Call
|
|
630
|
+
* with no argument for the whole directory (16 carriers currently) or `{ line: "homeowners" }`
|
|
631
|
+
* to narrow to one line — `line` is NOT a closed enum; an unrecognized value THROWS naming the
|
|
632
|
+
* lines the directory actually publishes, because inventing a fixed list here would silently
|
|
633
|
+
* drop a line the site adds later. Each row carries every line that carrier is listed under
|
|
634
|
+
* (`lines`) and `ownedBySource` — true ONLY when the row is the referral program's own paper,
|
|
635
|
+
* derived from the directory's own linking rather than from name matching, and null when the
|
|
636
|
+
* directory linked nothing for that row. NEVER returns an empty list from a source that
|
|
637
|
+
* answered: this is a published directory with no legitimate empty case, so a missing section
|
|
638
|
+
* or a changed page throws at the provider rather than under-reporting who underwrites the
|
|
639
|
+
* policy. `warnings` is always present and names a source that timed out or failed — with one
|
|
640
|
+
* source today, read it before trusting a short list is the whole directory.
|
|
641
|
+
* `options.timeoutMs` sets the per-source budget (default 30000).
|
|
642
|
+
*/
|
|
643
|
+
listReferralCarriers(query?: ReferralCarrierQuery, options?: CallOptions): Promise<ReferralCarrierListResult>;
|
|
519
644
|
}
|
|
520
645
|
}
|
|
521
646
|
|
|
@@ -789,18 +914,78 @@ interface aaFlightStatusResult {
|
|
|
789
914
|
flights: aaFlight[];
|
|
790
915
|
}
|
|
791
916
|
|
|
917
|
+
interface aaReservation {
|
|
918
|
+
recordLocator: string;
|
|
919
|
+
status: string | null;
|
|
920
|
+
bookingTime: string | null;
|
|
921
|
+
passengers: aaReservationPassenger[];
|
|
922
|
+
itinerary: aaReservationSlice[];
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
interface aaReservationPassenger {
|
|
926
|
+
firstName: string | null;
|
|
927
|
+
lastName: string | null;
|
|
928
|
+
passengerID: string | null;
|
|
929
|
+
paxType: string | null;
|
|
930
|
+
loyaltyNumber: string | null;
|
|
931
|
+
ticketNumbers: string[];
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
interface aaReservationSlice {
|
|
935
|
+
segments: aaReservationSegment[];
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
interface aaReservationSegment {
|
|
939
|
+
flightNumber: string | null;
|
|
940
|
+
marketingCarrierCode: string | null;
|
|
941
|
+
operatingCarrierCode: string | null;
|
|
942
|
+
cabinType: string | null;
|
|
943
|
+
bookingCode: string | null;
|
|
944
|
+
departureDateTime: string | null;
|
|
945
|
+
legs: aaReservationLeg[];
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
interface aaReservationLeg {
|
|
949
|
+
originAirportCode: string | null;
|
|
950
|
+
originCity: string | null;
|
|
951
|
+
destinationAirportCode: string | null;
|
|
952
|
+
destinationCity: string | null;
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
interface aaRetrieveBookingArgs {
|
|
956
|
+
/** Exactly six letters — American's own record-locator format. */
|
|
957
|
+
recordLocator: string;
|
|
958
|
+
/** The passenger's last name, exactly as it appears on the reservation. */
|
|
959
|
+
lastName: string;
|
|
960
|
+
}
|
|
961
|
+
|
|
792
962
|
/**
|
|
793
963
|
* American Airlines' own site — its published fares and award availability, flight status,
|
|
794
|
-
* reservation lookup, seat maps, baggage allowance and fee schedules. Flight status
|
|
795
|
-
* and browserless; the rest are declared stubs.
|
|
964
|
+
* reservation lookup, seat maps, baggage allowance and fee schedules. Flight status and
|
|
965
|
+
* reservation lookup are live and browserless; the rest are declared stubs.
|
|
796
966
|
*/
|
|
797
967
|
interface Unit {
|
|
798
|
-
// NO TYPED SURFACE — every function this unit declares is refused above.
|
|
799
|
-
// The unit is real and callable at runtime; nothing here can say so in types.
|
|
800
968
|
// UNTYPED, DELIBERATELY OMITTED — `getFlightStatus({ date, flightNumber, origin, destination })` declares no types for
|
|
801
969
|
// its argument, so there is no honest signature to emit.
|
|
802
970
|
// It is CALLABLE at runtime; `bowmark.providers.aa.getFlightStatus` is a compile error here on purpose.
|
|
803
971
|
// A `(...args: unknown[])` stand-in would compile and tell you nothing.
|
|
972
|
+
|
|
973
|
+
/**
|
|
974
|
+
* Reads an existing American Airlines reservation by its six-letter record locator (PNR) and
|
|
975
|
+
* the passenger's last name — nothing is signed into, and both are the caller's own details,
|
|
976
|
+
* passed at call time. Returns the record locator, American's own status string, when the
|
|
977
|
+
* booking was made, every passenger (name, passenger id, fare type, loyalty number, ticket
|
|
978
|
+
* numbers), and the itinerary as slices of flown segments (flight number, marketing and
|
|
979
|
+
* operating carrier codes, cabin, booking class, departure time, and each leg's
|
|
980
|
+
* origin/destination airport and city). Throws when the locator and last name do not both
|
|
981
|
+
* match a real reservation — American validates the pair together, so a real locator paired
|
|
982
|
+
* with the wrong last name answers exactly like one that does not exist at all; there is no
|
|
983
|
+
* way to tell those two cases apart from the outside. HONEST LIMIT: the not-found path is
|
|
984
|
+
* live-verified; the success shape above is reconstructed from American's own client code and
|
|
985
|
+
* has not been observed on the wire, since no consenting real booking was available to test it
|
|
986
|
+
* — see `retrieve-booking.ts` for what that means for field accuracy.
|
|
987
|
+
*/
|
|
988
|
+
retrieveBooking(arg0: aaRetrieveBookingArgs): Promise<aaReservation>;
|
|
804
989
|
}
|
|
805
990
|
}
|
|
806
991
|
|
|
@@ -902,6 +1087,54 @@ interface abercrombieSearchQuery {
|
|
|
902
1087
|
maxItems?: number;
|
|
903
1088
|
}
|
|
904
1089
|
|
|
1090
|
+
interface abercrombieStoreStock {
|
|
1091
|
+
store: abercrombieStore;
|
|
1092
|
+
inventoryStatus: string;
|
|
1093
|
+
availableQuantity: number;
|
|
1094
|
+
inStock: boolean;
|
|
1095
|
+
availableFrom: string | null;
|
|
1096
|
+
availableFromLabel: string | null;
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
interface abercrombieStock {
|
|
1100
|
+
productId: string;
|
|
1101
|
+
sku: string;
|
|
1102
|
+
productName: string | null;
|
|
1103
|
+
color: string | null;
|
|
1104
|
+
url: string;
|
|
1105
|
+
sizeLabel: string;
|
|
1106
|
+
sizePrimary: string | null;
|
|
1107
|
+
sizeSecondary: string | null;
|
|
1108
|
+
primaryDimension: string | null;
|
|
1109
|
+
secondaryDimension: string | null;
|
|
1110
|
+
inStockOnline: boolean;
|
|
1111
|
+
onlineQuantity: number;
|
|
1112
|
+
onlineStatus: string;
|
|
1113
|
+
preorderEligible: boolean;
|
|
1114
|
+
price: number | null;
|
|
1115
|
+
listPrice: number | null;
|
|
1116
|
+
onSale: boolean;
|
|
1117
|
+
currency: string;
|
|
1118
|
+
findInStoreEligible: boolean;
|
|
1119
|
+
pickupEligible: boolean;
|
|
1120
|
+
stores: abercrombieStoreStock[] | null;
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
interface abercrombieStockQuery {
|
|
1124
|
+
url?: string;
|
|
1125
|
+
id?: string;
|
|
1126
|
+
size?: string;
|
|
1127
|
+
sizePrimary?: string;
|
|
1128
|
+
sizeSecondary?: string;
|
|
1129
|
+
sku?: string;
|
|
1130
|
+
zip?: string;
|
|
1131
|
+
city?: string;
|
|
1132
|
+
state?: string;
|
|
1133
|
+
radiusMiles?: number;
|
|
1134
|
+
maxStores?: number;
|
|
1135
|
+
brand?: "adult" | "kids" | "both";
|
|
1136
|
+
}
|
|
1137
|
+
|
|
905
1138
|
/**
|
|
906
1139
|
* Abercrombie & Fitch's own storefront — product search, product detail, size/store stock,
|
|
907
1140
|
* store locator, current deals and gift card balance.
|
|
@@ -943,6 +1176,29 @@ interface abercrombieSearchQuery {
|
|
|
943
1176
|
*/
|
|
944
1177
|
findStores(query: abercrombieStoreQuery): Promise<abercrombieStore[]>;
|
|
945
1178
|
|
|
1179
|
+
/**
|
|
1180
|
+
* Answers whether ONE size of ONE colourway is buyable RIGHT NOW — online, and at the stores
|
|
1181
|
+
* near a place you name. Identify the product with `url` or `id`, then the size with either
|
|
1182
|
+
* `size` (the site's own label, e.g. "32 X Regular" or "M"), or `sizePrimary`+`sizeSecondary`,
|
|
1183
|
+
* or a `sku` you already hold. Add `zip` OR `city`+`state` to also get per-store stock; omit
|
|
1184
|
+
* all three and `stores` comes back `null` — "you did not ask", which is deliberately distinct
|
|
1185
|
+
* from `[]`, "asked, and no store nearby carries it". Returns the resolved `sku`, the size and
|
|
1186
|
+
* its dimension names, the online answer (`inStockOnline`, a real `onlineQuantity` — the site
|
|
1187
|
+
* publishes counts like 305, not a flag — the site's own `onlineStatus` word,
|
|
1188
|
+
* `preorderEligible`, price/listPrice/onSale), whether the colourway is eligible for the
|
|
1189
|
+
* site's find-in-store and pick-up-in-store journeys at all, and one row per nearby store
|
|
1190
|
+
* carrying that store's full record plus its `inventoryStatus`, `availableQuantity`, `inStock`
|
|
1191
|
+
* and the date it expects the item. **`inStock` is the strict question and is NOT `status !==
|
|
1192
|
+
* "Unavailable"`**: the site's commonest store answer is `Backorderable` with quantity 0,
|
|
1193
|
+
* which means "we will order it for you", not "it is on the shelf" — so `inStock` is true only
|
|
1194
|
+
* for `Available` WITH a quantity above zero. **An ambiguous size THROWS rather than
|
|
1195
|
+
* guessing**: "26" names three lengths on a jean, and answering for one of them would be a
|
|
1196
|
+
* wrong answer on a 200. A `sku` is looked up across the whole style and answers for the
|
|
1197
|
+
* colourway it really belongs to, not the one in the url. This is the per-SIZE, per-STORE
|
|
1198
|
+
* question; `getProduct` answers the different one of what sizes and colours a style comes in.
|
|
1199
|
+
*/
|
|
1200
|
+
checkStock(query: abercrombieStockQuery): Promise<abercrombieStock>;
|
|
1201
|
+
|
|
946
1202
|
/**
|
|
947
1203
|
* Searches or browses Abercrombie's live catalog the way the site's own search bar and
|
|
948
1204
|
* category navigation do. Pass EITHER `query` (free text, e.g. "wide leg jeans") OR `category`
|
|
@@ -1513,6 +1769,64 @@ interface BmwusaCpoSearchOptions {
|
|
|
1513
1769
|
}
|
|
1514
1770
|
}
|
|
1515
1771
|
|
|
1772
|
+
declare namespace BowmarkProvider_cancer {
|
|
1773
|
+
// ── National Cancer Institute (cancer.gov) — the unit's own declarations, verbatim ──
|
|
1774
|
+
type cancerCenterDesignation =
|
|
1775
|
+
| "Comprehensive Cancer Center"
|
|
1776
|
+
| "Clinical Cancer Center"
|
|
1777
|
+
| "Basic Laboratory Cancer Center";
|
|
1778
|
+
|
|
1779
|
+
interface cancerCenterRow {
|
|
1780
|
+
name: string;
|
|
1781
|
+
/** The center's own detail page on cancer.gov. */
|
|
1782
|
+
url: string;
|
|
1783
|
+
/** NCI's own state grouping — the authoritative field to filter on. */
|
|
1784
|
+
state: string;
|
|
1785
|
+
/** The "City, State" line the page publishes, verbatim. */
|
|
1786
|
+
location: string;
|
|
1787
|
+
/** A second location aside the page publishes for a few centers, e.g.
|
|
1788
|
+
* "(in addition to facilities in Florida and Minnesota)" — present on a
|
|
1789
|
+
* center that operates comprehensive facilities in more than one state and
|
|
1790
|
+
* is cross-listed under each. */
|
|
1791
|
+
locationNote?: string;
|
|
1792
|
+
/** The parent university or health system, when distinct from the center's
|
|
1793
|
+
* own name. Absent for freestanding centers (their own name IS the
|
|
1794
|
+
* institution). */
|
|
1795
|
+
hostInstitution?: string;
|
|
1796
|
+
designation: cancerCenterDesignation;
|
|
1797
|
+
}
|
|
1798
|
+
|
|
1799
|
+
interface cancerCentersResult {
|
|
1800
|
+
/** Every center when no `state` filter is given; only the matching ones
|
|
1801
|
+
* otherwise. */
|
|
1802
|
+
total: number;
|
|
1803
|
+
centers: cancerCenterRow[];
|
|
1804
|
+
}
|
|
1805
|
+
|
|
1806
|
+
/**
|
|
1807
|
+
* The US National Cancer Institute: PDQ cancer information, the clinical-trial register,
|
|
1808
|
+
* cancer drugs, NCI-designated cancer centers and the cancer dictionaries. The NCI-Designated
|
|
1809
|
+
* Cancer Center directory (`findCancerCenters`) is callable now — every center's name,
|
|
1810
|
+
* designation type, location and host institution, optionally filtered by state; the other
|
|
1811
|
+
* twelve declared functions are still stubs.
|
|
1812
|
+
*/
|
|
1813
|
+
interface Unit {
|
|
1814
|
+
/**
|
|
1815
|
+
* The NCI-Designated Cancer Centers — the institutions NCI itself certifies as meeting its
|
|
1816
|
+
* standards for cancer research and care — each with its name, its designation type
|
|
1817
|
+
* (Comprehensive, Clinical, or Basic Laboratory), its city and state, its parent university or
|
|
1818
|
+
* health system when it has one, and the link to its own cancer.gov detail page. `state`
|
|
1819
|
+
* (NCI's own state name, e.g. "California", "Hawai'i", "District of Columbia", matched
|
|
1820
|
+
* case-insensitively but exactly — no fuzzy matching) filters to that state; omitted, every
|
|
1821
|
+
* center is returned. A center that operates comprehensive facilities in more than one state
|
|
1822
|
+
* (Mayo Clinic Cancer Center) is cross-listed under each, with `locationNote` naming its other
|
|
1823
|
+
* locations. This is the whole directory in one document — NCI does not filter it server-side
|
|
1824
|
+
* — so `total` and `centers.length` are always equal.
|
|
1825
|
+
*/
|
|
1826
|
+
findCancerCenters(args?: { state?: string }): Promise<cancerCentersResult>;
|
|
1827
|
+
}
|
|
1828
|
+
}
|
|
1829
|
+
|
|
1516
1830
|
declare namespace BowmarkProvider_cars {
|
|
1517
1831
|
// ── Cars.com — the unit's own declarations, verbatim ──
|
|
1518
1832
|
interface carsListing {
|
|
@@ -1616,6 +1930,34 @@ interface KayakBookingOption {
|
|
|
1616
1930
|
seatsRemaining: number | null;
|
|
1617
1931
|
}
|
|
1618
1932
|
|
|
1933
|
+
interface KayakHotelQuery {
|
|
1934
|
+
location: string; // IATA airport code, e.g. "SFO", or a resolvable city
|
|
1935
|
+
checkIn: string; // YYYY-MM-DD
|
|
1936
|
+
checkOut: string; // YYYY-MM-DD
|
|
1937
|
+
adults?: number; // default 2
|
|
1938
|
+
rooms?: number; // default 1
|
|
1939
|
+
}
|
|
1940
|
+
|
|
1941
|
+
// Cheapflights's OWN row shape for stays.
|
|
1942
|
+
interface KayakHotel {
|
|
1943
|
+
id: string;
|
|
1944
|
+
name: string;
|
|
1945
|
+
price: number | null; // per NIGHT, cheapest seller (normalized, see below)
|
|
1946
|
+
totalPrice: number | null; // the WHOLE stay — what rows are sorted on
|
|
1947
|
+
currency: string;
|
|
1948
|
+
seller: string; // who sells that rate ("Priceline")
|
|
1949
|
+
sellerCount: number | null; // how many sellers quoted this property
|
|
1950
|
+
stars: number | null; // property stars, 1-5
|
|
1951
|
+
score: number | null; // guest score out of 10
|
|
1952
|
+
reviewCount: number | null;
|
|
1953
|
+
propertyType: string; // "Hotel", "Motel", "Apartment"
|
|
1954
|
+
neighborhood: string | null;
|
|
1955
|
+
city: string | null;
|
|
1956
|
+
distance: string | null; // "11.7 mi", as the site renders it
|
|
1957
|
+
distanceFrom: string | null; // what that distance is measured from
|
|
1958
|
+
url: string; // deep link to the property
|
|
1959
|
+
}
|
|
1960
|
+
|
|
1619
1961
|
interface KayakCarQuery {
|
|
1620
1962
|
pickup: string; // IATA airport code, e.g. "SFO"
|
|
1621
1963
|
dropoff?: string; // defaults to pickup
|
|
@@ -1672,6 +2014,13 @@ interface KayakCar {
|
|
|
1672
2014
|
*/
|
|
1673
2015
|
getBookingOptions(flight: KayakFlight): Promise<KayakBookingOption[]>;
|
|
1674
2016
|
|
|
2017
|
+
/**
|
|
2018
|
+
* Runs the stays search on cheapflights.com and returns priced properties for a destination
|
|
2019
|
+
* and date range, cheapest TOTAL first. Interaction-gated: the prices only exist after the
|
|
2020
|
+
* site's own multi-phase supplier poll completes.
|
|
2021
|
+
*/
|
|
2022
|
+
searchHotels(query: KayakHotelQuery): Promise<KayakHotel[]>;
|
|
2023
|
+
|
|
1675
2024
|
/**
|
|
1676
2025
|
* Runs the car-hire search on cheapflights.com and returns priced vehicles for a pickup
|
|
1677
2026
|
* location and date range, cheapest-first. Interaction-gated: the prices only exist after the
|
|
@@ -1777,6 +2126,49 @@ interface ChriscraftPriceResult {
|
|
|
1777
2126
|
|
|
1778
2127
|
declare namespace BowmarkProvider_classpass {
|
|
1779
2128
|
// ── ClassPass — the unit's own declarations, verbatim ──
|
|
2129
|
+
/** Everything /v2/venues publishes about one studio — a superset of
|
|
2130
|
+
* ClasspassVenue, so anything holding one can hold the other. */
|
|
2131
|
+
interface ClasspassStudio extends ClasspassVenue {
|
|
2132
|
+
/** What the studio does. On THIS function it comes from the venue record's own
|
|
2133
|
+
* tag block, so it is correct even on a day the studio publishes no classes. */
|
|
2134
|
+
activities: string[];
|
|
2135
|
+
/** ISO-3166 alpha-2, e.g. "US", "GB". */
|
|
2136
|
+
country: string | null;
|
|
2137
|
+
/** The site's neighbourhood label ("South Charlotte"). Null where it publishes none. */
|
|
2138
|
+
neighborhood: string | null;
|
|
2139
|
+
/** The metro area the studio is sold in ("Charlotte Metro", "London Metro"). */
|
|
2140
|
+
metroArea: string | null;
|
|
2141
|
+
description: string | null;
|
|
2142
|
+
/** The studio's OWN site, not its ClassPass page. Null where it publishes none. */
|
|
2143
|
+
website: string | null;
|
|
2144
|
+
phone: string | null;
|
|
2145
|
+
instagram: string | null;
|
|
2146
|
+
facebook: string | null;
|
|
2147
|
+
twitter: string | null;
|
|
2148
|
+
/** Real photographs, largest first. ClassPass's generic fallback placeholders are
|
|
2149
|
+
* dropped — a placeholder passed off as the studio is worse than nothing. */
|
|
2150
|
+
photos: string[];
|
|
2151
|
+
logo: string | null;
|
|
2152
|
+
/** Only the attributes the studio asserts, e.g. ["lgbtq_friendly",
|
|
2153
|
+
* "wheelchair_accessible"]. A false flag means "not claimed" and is dropped. */
|
|
2154
|
+
inclusivity: string[];
|
|
2155
|
+
bookingWindow: string | null;
|
|
2156
|
+
whenToArrive: string | null;
|
|
2157
|
+
whatToBring: string | null;
|
|
2158
|
+
howToGetThere: string | null;
|
|
2159
|
+
proTip: string | null;
|
|
2160
|
+
cancellationPolicy: string | null;
|
|
2161
|
+
/** null where the site holds no policy (it sends the sentinel "UNKNOWN"). */
|
|
2162
|
+
lateCancellation: string | null;
|
|
2163
|
+
demandSignals: string[];
|
|
2164
|
+
/** ClassPass's own published fraction (0-1). Returned under the site's own name
|
|
2165
|
+
* and NOT relabelled a saving — the site does not document its basis. There is
|
|
2166
|
+
* no credit price on this record; per-class cost is getSchedule's `credits`. */
|
|
2167
|
+
averageDiscount: number | null;
|
|
2168
|
+
outOfNetwork: boolean;
|
|
2169
|
+
spots: number | null;
|
|
2170
|
+
}
|
|
2171
|
+
|
|
1780
2172
|
interface ClasspassSchedule {
|
|
1781
2173
|
venue: ClasspassVenue;
|
|
1782
2174
|
/** Dates covered, YYYY-MM-DD in the venue's zone, ascending. A day with no
|
|
@@ -1842,12 +2234,33 @@ interface ClasspassScheduleOptions {
|
|
|
1842
2234
|
|
|
1843
2235
|
/**
|
|
1844
2236
|
* ClassPass — fitness, wellness and beauty classes across gyms, studios, spas and salons.
|
|
1845
|
-
* `
|
|
1846
|
-
* its
|
|
1847
|
-
*
|
|
1848
|
-
*
|
|
2237
|
+
* `getStudio` reads one studio's whole profile in a single request: what it does, where it is,
|
|
2238
|
+
* its rating, amenities, photos, contact routes and the practical booking prose. `getSchedule`
|
|
2239
|
+
* reads that studio's bookable timetable for a day or a week: every session with its start
|
|
2240
|
+
* time, instructor, duration, credit price and whether it is still open. Studio and class
|
|
2241
|
+
* search, per-slot availability and membership pricing are declared but not built yet.
|
|
1849
2242
|
*/
|
|
1850
2243
|
interface Unit {
|
|
2244
|
+
/**
|
|
2245
|
+
* Reads ONE ClassPass studio's whole profile in a single request — the page a person reads to
|
|
2246
|
+
* decide whether a result is worth booking. `studio` is a ClassPass venue id (74359), the
|
|
2247
|
+
* alias in its public URL ("barrys-charlotte"), or the studio URL itself; all three are
|
|
2248
|
+
* accepted. Returns identity and branch (a chain's locations differ only by `subtitle`), the
|
|
2249
|
+
* full address with coordinates, IANA time zone, neighbourhood and metro area, the studio's
|
|
2250
|
+
* own description, what it actually does (`activities`), amenities and the inclusivity
|
|
2251
|
+
* attributes it asserts, its rating and how many reviews back it, real photographs
|
|
2252
|
+
* (ClassPass's generic `fallback.jpg` placeholders are dropped rather than passed off as the
|
|
2253
|
+
* studio), its own website, phone and socials, and the practical prose a booker needs —
|
|
2254
|
+
* booking window, when to arrive, what to bring, how to get there, and the cancellation
|
|
2255
|
+
* policies. NOTE ON PRICE: this record carries NO credit figure, measured across four venues —
|
|
2256
|
+
* the only price-ish field ClassPass publishes here is `averageDiscount`, its own undocumented
|
|
2257
|
+
* fraction, returned under its own name rather than relabelled as a saving. What a class COSTS
|
|
2258
|
+
* is per-session and comes from `getSchedule`'s `credits`, which is both exact and free of a
|
|
2259
|
+
* second request. A studio that has left ClassPass throws a caller-fixable error quoting the
|
|
2260
|
+
* site's own reason ("Venue disabled") rather than returning a hollow profile.
|
|
2261
|
+
*/
|
|
2262
|
+
getStudio(studio: number | string): Promise<ClasspassStudio>;
|
|
2263
|
+
|
|
1851
2264
|
/**
|
|
1852
2265
|
* Reads ONE ClassPass studio's bookable timetable — what a person can actually book there, and
|
|
1853
2266
|
* when. `studio` is a ClassPass venue id (74359), the alias in its public URL
|
|
@@ -2212,6 +2625,36 @@ interface dillardsRegistry {
|
|
|
2212
2625
|
items: dillardsRegistryItem[];
|
|
2213
2626
|
}
|
|
2214
2627
|
|
|
2628
|
+
interface dillardsGetProductQuery {
|
|
2629
|
+
url: string;
|
|
2630
|
+
}
|
|
2631
|
+
|
|
2632
|
+
interface dillardsProductVariant {
|
|
2633
|
+
sku: string;
|
|
2634
|
+
color: string;
|
|
2635
|
+
size: string | null;
|
|
2636
|
+
shipsOnline: boolean;
|
|
2637
|
+
}
|
|
2638
|
+
|
|
2639
|
+
interface dillardsProduct {
|
|
2640
|
+
id: string;
|
|
2641
|
+
catentryId: string;
|
|
2642
|
+
name: string;
|
|
2643
|
+
brand: string | null;
|
|
2644
|
+
url: string;
|
|
2645
|
+
description: string | null;
|
|
2646
|
+
image: string | null;
|
|
2647
|
+
images: string[];
|
|
2648
|
+
priceLow: number | null;
|
|
2649
|
+
priceHigh: number | null;
|
|
2650
|
+
listPrice: number | null;
|
|
2651
|
+
onSale: boolean;
|
|
2652
|
+
rating: number | null;
|
|
2653
|
+
reviewCount: number;
|
|
2654
|
+
colorCount: number;
|
|
2655
|
+
variants: dillardsProductVariant[];
|
|
2656
|
+
}
|
|
2657
|
+
|
|
2215
2658
|
/**
|
|
2216
2659
|
* Dillard's department store catalog, store-level stock, store locator and wedding/gift
|
|
2217
2660
|
* registry search.
|
|
@@ -2257,6 +2700,19 @@ interface dillardsRegistry {
|
|
|
2257
2700
|
*/
|
|
2258
2701
|
checkStock(query: dillardsCheckStockQuery): Promise<dillardsStockResult>;
|
|
2259
2702
|
|
|
2703
|
+
/**
|
|
2704
|
+
* Reads one product's own page — full name, brand, description, primary image plus every
|
|
2705
|
+
* gallery shot, current price range, pre-markdown `listPrice` and the site's own `onSale`
|
|
2706
|
+
* flag, star rating and review count (both null/0 when the product has no reviews yet — the
|
|
2707
|
+
* site omits the field entirely rather than publishing a zero), `colorCount` (distinct
|
|
2708
|
+
* colourways), and `variants[]`, every size/color combination the page lists with its own sku
|
|
2709
|
+
* and `shipsOnline` flag. Pass `url` exactly as `search` returns it in a row's own `url`.
|
|
2710
|
+
* **This is a summary, not a store check** — `variants[].shipsOnline` is the product's own
|
|
2711
|
+
* online-availability flag, independent of any physical store; whether ONE exact size/color is
|
|
2712
|
+
* in stock at a named store is `checkStock`'s job, not this one's.
|
|
2713
|
+
*/
|
|
2714
|
+
getProduct(query: dillardsGetProductQuery): Promise<dillardsProduct>;
|
|
2715
|
+
|
|
2260
2716
|
/**
|
|
2261
2717
|
* Searches Dillard's wedding/gift registry (dillards.com/registry) — a distinctive Dillard's
|
|
2262
2718
|
* feature, not a generic department-store search — and returns the matching registry's own
|
|
@@ -6161,6 +6617,132 @@ interface LufthansaBaggageAllowance {
|
|
|
6161
6617
|
}
|
|
6162
6618
|
}
|
|
6163
6619
|
|
|
6620
|
+
declare namespace BowmarkProvider_lululemon {
|
|
6621
|
+
// ── lululemon — the unit's own declarations, verbatim ──
|
|
6622
|
+
interface LululemonVariant {
|
|
6623
|
+
/** The identifier lululemon's own checkout uses, e.g. "us_117376359". */
|
|
6624
|
+
sku: string;
|
|
6625
|
+
/** Which option each dimension is set to, e.g. { size: "4" }. */
|
|
6626
|
+
options: Record<string, string>;
|
|
6627
|
+
/** The store's own availability flag for this exact SKU. */
|
|
6628
|
+
available: boolean;
|
|
6629
|
+
price: number | null;
|
|
6630
|
+
salePrice: number | null;
|
|
6631
|
+
}
|
|
6632
|
+
interface LululemonOptionGroup {
|
|
6633
|
+
/** The machine name. "size" on every lululemon product measured. */
|
|
6634
|
+
type: string;
|
|
6635
|
+
/** The site's own label for the picker, e.g. "Size". */
|
|
6636
|
+
label: string;
|
|
6637
|
+
options: { value: string; label: string }[];
|
|
6638
|
+
}
|
|
6639
|
+
interface LululemonColorway {
|
|
6640
|
+
/** lululemon's own colour code, e.g. "TRUE-NAVY". */
|
|
6641
|
+
colorId: string;
|
|
6642
|
+
color: string;
|
|
6643
|
+
colorFamily: string | null;
|
|
6644
|
+
price: number | null;
|
|
6645
|
+
/** Set only when this colourway is marked down. */
|
|
6646
|
+
salePrice: number | null;
|
|
6647
|
+
promoMessage: string | null;
|
|
6648
|
+
/** The product URL pinned to this colour, as the store publishes it. */
|
|
6649
|
+
url: string;
|
|
6650
|
+
swatchImage: string | null;
|
|
6651
|
+
images: string[];
|
|
6652
|
+
inStock: boolean;
|
|
6653
|
+
optionGroups: LululemonOptionGroup[];
|
|
6654
|
+
/** What can be BOUGHT in this colour right now — not the full size run. */
|
|
6655
|
+
variants: LululemonVariant[];
|
|
6656
|
+
}
|
|
6657
|
+
interface LululemonSizeType {
|
|
6658
|
+
/** A sibling product that is the same style in another length. */
|
|
6659
|
+
productId: string;
|
|
6660
|
+
size: string;
|
|
6661
|
+
selected: boolean;
|
|
6662
|
+
}
|
|
6663
|
+
interface LululemonProduct {
|
|
6664
|
+
id: string;
|
|
6665
|
+
title: string;
|
|
6666
|
+
brand: string;
|
|
6667
|
+
url: string;
|
|
6668
|
+
/** The store's own audience attribute, e.g. "women". */
|
|
6669
|
+
gender: string | null;
|
|
6670
|
+
rating: number | null;
|
|
6671
|
+
reviewCount: number | null;
|
|
6672
|
+
inStock: boolean;
|
|
6673
|
+
priceLow: number | null;
|
|
6674
|
+
priceHigh: number | null;
|
|
6675
|
+
colorways: LululemonColorway[];
|
|
6676
|
+
/** Other lengths of the same style. Empty on every product measured — on this
|
|
6677
|
+
* site an inseam is its OWN product, not an option. */
|
|
6678
|
+
sizeTypes: LululemonSizeType[];
|
|
6679
|
+
}
|
|
6680
|
+
interface LululemonRow {
|
|
6681
|
+
id: string;
|
|
6682
|
+
title: string;
|
|
6683
|
+
url: string;
|
|
6684
|
+
priceLow: number | null;
|
|
6685
|
+
priceHigh: number | null;
|
|
6686
|
+
colorCount: number | null;
|
|
6687
|
+
inStock: boolean | null;
|
|
6688
|
+
/** False when the row came from the site's product index and the catalogue
|
|
6689
|
+
* behind the prices does not carry it. id and url still work. */
|
|
6690
|
+
priced: boolean;
|
|
6691
|
+
}
|
|
6692
|
+
interface LululemonSearch {
|
|
6693
|
+
query: string;
|
|
6694
|
+
products: LululemonRow[];
|
|
6695
|
+
/** How many entries matched before the row cap. */
|
|
6696
|
+
matched: number;
|
|
6697
|
+
warnings: string[];
|
|
6698
|
+
}
|
|
6699
|
+
interface LululemonSimilarProducts {
|
|
6700
|
+
seedProductId: string;
|
|
6701
|
+
products: LululemonRow[];
|
|
6702
|
+
totalRanked: number | null;
|
|
6703
|
+
warnings: string[];
|
|
6704
|
+
}
|
|
6705
|
+
|
|
6706
|
+
/**
|
|
6707
|
+
* lululemon's athletic apparel catalogue — search it, and read one product's full
|
|
6708
|
+
* configurator: every colourway with its own price and images, the size options, and which
|
|
6709
|
+
* exact SKUs are buyable right now.
|
|
6710
|
+
*/
|
|
6711
|
+
interface Unit {
|
|
6712
|
+
/**
|
|
6713
|
+
* Searches lululemon's catalogue by free text and returns matching product rows, closest match
|
|
6714
|
+
* first — id, title, URL, price range, how many colours the style comes in, and whether it is
|
|
6715
|
+
* in stock. Ranks over the site's own published product index, then reads the price and colour
|
|
6716
|
+
* count per row. A match the pricing catalogue does not carry still comes back, with `priced:
|
|
6717
|
+
* false` and null prices; `matched` says how many matched before the row cap so a caller can
|
|
6718
|
+
* raise `limit` (default 8, max 24).
|
|
6719
|
+
*/
|
|
6720
|
+
search(query: { query: string; limit?: number }): Promise<LululemonSearch>;
|
|
6721
|
+
|
|
6722
|
+
/**
|
|
6723
|
+
* Reads one product's full configurator the way its product page presents it — every colourway
|
|
6724
|
+
* with its own price, sale price, promo message, swatch, image set and URL; the size picker
|
|
6725
|
+
* listing the sizes that colourway can CURRENTLY SELL; and one entry per sellable SKU with the
|
|
6726
|
+
* store's own id, so a caller can answer 'which colours can I get in a 6 right now'. This feed
|
|
6727
|
+
* expresses sold-out by OMISSION rather than by a flag — measured across all three captured
|
|
6728
|
+
* fixtures, the picker and the SKU list are the same set in all 61 colourways and `available`
|
|
6729
|
+
* is true on 363 of 363 SKUs — so presence is the stock signal and `available` is passed
|
|
6730
|
+
* through rather than relied on.
|
|
6731
|
+
*/
|
|
6732
|
+
getProduct(query: { productId: string }): Promise<LululemonProduct>;
|
|
6733
|
+
|
|
6734
|
+
/**
|
|
6735
|
+
* Returns the products lululemon's own product pages recommend alongside one product — the
|
|
6736
|
+
* 'You may also like' rail — as priced rows in the store's own ranked order, de-duplicated to
|
|
6737
|
+
* one row per style. It is the store's ranking, not ours, and it does NOT reliably surface the
|
|
6738
|
+
* same garment in another length: measured on the Align 25" pant, none of the six recommended
|
|
6739
|
+
* rows was a sibling inseam even though the sitemap carries them, so reaching another length
|
|
6740
|
+
* is a `search`.
|
|
6741
|
+
*/
|
|
6742
|
+
getSimilarProducts(query: { productId: string; limit?: number }): Promise<LululemonSimilarProducts>;
|
|
6743
|
+
}
|
|
6744
|
+
}
|
|
6745
|
+
|
|
6164
6746
|
declare namespace BowmarkProvider_mailchimp {
|
|
6165
6747
|
// ── Mailchimp — the unit's own declarations, verbatim ──
|
|
6166
6748
|
interface mailchimpPlanTier {
|
|
@@ -6206,6 +6788,29 @@ interface mailchimpPlanPricing {
|
|
|
6206
6788
|
}
|
|
6207
6789
|
}
|
|
6208
6790
|
|
|
6791
|
+
declare namespace BowmarkProvider_marriott {
|
|
6792
|
+
// ── Marriott — the unit's own declarations, verbatim ──
|
|
6793
|
+
interface MarriottHotelListing {
|
|
6794
|
+
id: string; // marsha code
|
|
6795
|
+
name: string;
|
|
6796
|
+
brand: string;
|
|
6797
|
+
url: string;
|
|
6798
|
+
place: string; // the resolved place slug, e.g. "usa-maryland"
|
|
6799
|
+
}
|
|
6800
|
+
|
|
6801
|
+
/** Marriott Bonvoy hotel search, award availability, reservations and property details. */
|
|
6802
|
+
interface Unit {
|
|
6803
|
+
/**
|
|
6804
|
+
* Lists Marriott-family properties published on the site's own hotel-sitemap directory for one
|
|
6805
|
+
* US state or country (`place`, e.g. "Maryland", "France" — never a bare city or landmark,
|
|
6806
|
+
* which this directory does not index per property). `query` (optional) narrows the list by a
|
|
6807
|
+
* case-insensitive substring match against each property's own display name, which often but
|
|
6808
|
+
* not always carries a city. Returns each property's marsha id, name, brand and overview URL.
|
|
6809
|
+
*/
|
|
6810
|
+
findHotels(args: { place: string; query?: string }): Promise<MarriottHotelListing[]>;
|
|
6811
|
+
}
|
|
6812
|
+
}
|
|
6813
|
+
|
|
6209
6814
|
declare namespace BowmarkProvider_mcdonalds {
|
|
6210
6815
|
// ── McDonald's — the unit's own declarations, verbatim ──
|
|
6211
6816
|
interface mcdonaldsMenuItem {
|
|
@@ -6538,6 +7143,101 @@ interface medicareNursingHomeSearch {
|
|
|
6538
7143
|
homes: medicareNursingHome[];
|
|
6539
7144
|
}
|
|
6540
7145
|
|
|
7146
|
+
interface medicareHospitalMeasureGroup {
|
|
7147
|
+
/** How many measures CMS defines for this group nationally. */
|
|
7148
|
+
measuresInGroup: number | null;
|
|
7149
|
+
/** How many of them THIS hospital actually reported — can be fewer than
|
|
7150
|
+
* `measuresInGroup`; the gap is itself informative. */
|
|
7151
|
+
measuresReported: number | null;
|
|
7152
|
+
/** Null for `patientExperience`/`timelyAndEffectiveCare` — CMS publishes no
|
|
7153
|
+
* national-average comparison for those two groups, only a rate. */
|
|
7154
|
+
better: number | null;
|
|
7155
|
+
noDifferent: number | null;
|
|
7156
|
+
worse: number | null;
|
|
7157
|
+
/** CMS's own footnote code(s), verbatim — occasionally more than one,
|
|
7158
|
+
* comma-separated. */
|
|
7159
|
+
footnote: string | null;
|
|
7160
|
+
}
|
|
7161
|
+
|
|
7162
|
+
interface medicareHospital {
|
|
7163
|
+
/** CMS Certification Number — the same id `findNursingHomes` and
|
|
7164
|
+
* `findDoctors`'s hospital affiliations key on. */
|
|
7165
|
+
ccn: string;
|
|
7166
|
+
name: string;
|
|
7167
|
+
address: string;
|
|
7168
|
+
city: string;
|
|
7169
|
+
state: string;
|
|
7170
|
+
zip: string;
|
|
7171
|
+
phone: string | null;
|
|
7172
|
+
county: string | null;
|
|
7173
|
+
/** Straight-line miles to the CENTROID OF THIS HOSPITAL'S OWN ZIP, not its
|
|
7174
|
+
* street address — this dataset carries no coordinates at all, the same gap
|
|
7175
|
+
* `findDoctors`'s clinician file has. Everyone sharing a ZIP shares a
|
|
7176
|
+
* distance, and a large rural ZIP carries real slack. */
|
|
7177
|
+
distanceMiles: number;
|
|
7178
|
+
/** e.g. "Acute Care Hospitals", "Critical Access Hospitals", "Psychiatric",
|
|
7179
|
+
* "Childrens", "Rural Emergency Hospital". Never "Long-term" — that type
|
|
7180
|
+
* belongs to `findRehabAndLongTermCareFacilities`. */
|
|
7181
|
+
hospitalType: string;
|
|
7182
|
+
ownershipType: string | null;
|
|
7183
|
+
emergencyServices: boolean;
|
|
7184
|
+
birthingFriendly: boolean;
|
|
7185
|
+
/** 1-5, or null when CMS publishes none — about 40% of hospitals nationally
|
|
7186
|
+
* carry no overall rating, mostly because they don't participate in the
|
|
7187
|
+
* reporting programs this rating requires, not because they scored poorly.
|
|
7188
|
+
* A null is NOT a bad rating; read it with `overallRatingFootnote`. */
|
|
7189
|
+
overallRating: number | null;
|
|
7190
|
+
/** Can be present even alongside a real star rating — always surface it. */
|
|
7191
|
+
overallRatingFootnote: string | null;
|
|
7192
|
+
/** The measure GROUPS behind the star, not just the rollup. */
|
|
7193
|
+
measureGroups: {
|
|
7194
|
+
mortality: medicareHospitalMeasureGroup;
|
|
7195
|
+
safety: medicareHospitalMeasureGroup;
|
|
7196
|
+
readmission: medicareHospitalMeasureGroup;
|
|
7197
|
+
patientExperience: medicareHospitalMeasureGroup;
|
|
7198
|
+
timelyAndEffectiveCare: medicareHospitalMeasureGroup;
|
|
7199
|
+
};
|
|
7200
|
+
}
|
|
7201
|
+
|
|
7202
|
+
interface medicareHospitalQuery {
|
|
7203
|
+
/** 5-digit US ZIP, placed via the Census Bureau's ZCTA centroid. Either this
|
|
7204
|
+
* or a `latitude`/`longitude` pair is required. */
|
|
7205
|
+
zip?: string;
|
|
7206
|
+
latitude?: number;
|
|
7207
|
+
longitude?: number;
|
|
7208
|
+
/** Straight-line miles, default 25, max 100. */
|
|
7209
|
+
radiusMiles?: number;
|
|
7210
|
+
/** Max hospitals returned, default 20. `matchesInSearchedZips` reports the
|
|
7211
|
+
* unlimited-by-`limit` count for the ZIPs actually searched. */
|
|
7212
|
+
limit?: number;
|
|
7213
|
+
}
|
|
7214
|
+
|
|
7215
|
+
interface medicareHospitalSearch {
|
|
7216
|
+
origin: {
|
|
7217
|
+
zip: string | null;
|
|
7218
|
+
latitude: number;
|
|
7219
|
+
longitude: number;
|
|
7220
|
+
source: "zcta-centroid" | "caller";
|
|
7221
|
+
};
|
|
7222
|
+
radiusMiles: number;
|
|
7223
|
+
/** ZIP Code Tabulation Areas the Census Bureau places inside the radius. */
|
|
7224
|
+
zipsInRadius: number;
|
|
7225
|
+
/** How many of them this call actually queried, nearest-batch-first. */
|
|
7226
|
+
zipsSearched: number;
|
|
7227
|
+
/** FALSE when the walk stopped before every ranked ZIP was queried —
|
|
7228
|
+
* normally because `limit` was already satisfied. Read it before describing
|
|
7229
|
+
* the result as "every hospital in the radius". */
|
|
7230
|
+
radiusFullyScanned: boolean;
|
|
7231
|
+
/** Hospitals found in the ZIPs actually searched, before `limit` — NOT a
|
|
7232
|
+
* radius-wide total when `radiusFullyScanned` is false. */
|
|
7233
|
+
matchesInSearchedZips: number;
|
|
7234
|
+
/** CMS's own publication date for this extract. Not "today" — CMS refreshes
|
|
7235
|
+
* quarterly. */
|
|
7236
|
+
dataAsOf: string | null;
|
|
7237
|
+
/** Nearest first. */
|
|
7238
|
+
hospitals: medicareHospital[];
|
|
7239
|
+
}
|
|
7240
|
+
|
|
6541
7241
|
/** Whether a clinician takes Medicare's approved amount as payment in full.
|
|
6542
7242
|
* NOT a boolean, and that is load-bearing: CMS's `ind_assgn` is only ever "Y"
|
|
6543
7243
|
* or "M" — never "N" — so "does not take Medicare" is not a state this data can
|
|
@@ -6663,17 +7363,98 @@ interface medicareClinicianSearch {
|
|
|
6663
7363
|
clinicians: medicareClinician[];
|
|
6664
7364
|
}
|
|
6665
7365
|
|
|
7366
|
+
interface medicareMedigapDiscountRange {
|
|
7367
|
+
min: number;
|
|
7368
|
+
max: number;
|
|
7369
|
+
}
|
|
7370
|
+
|
|
7371
|
+
/** How the premium changes with the buyer's age. Attained-age premiums RISE with
|
|
7372
|
+
* age; issue-age and community-rated do not (community additionally moves with
|
|
7373
|
+
* inflation for everyone at once, regardless of age). "unknown" is a real,
|
|
7374
|
+
* intended value — see `ratingMethodRaw` on the policy it appears on — never a
|
|
7375
|
+
* parse failure. */
|
|
7376
|
+
type medicareMedigapRatingMethod = "attainedAge" | "issueAge" | "communityRated" | "unknown";
|
|
7377
|
+
|
|
7378
|
+
interface medicareMedigapPolicy {
|
|
7379
|
+
/** The insurer, exactly as CMS lists it. A parenthetical suffix like
|
|
7380
|
+
* "(Standard I)" is the SAME company selling this plan type under more than one
|
|
7381
|
+
* underwriting tier, each priced separately — do not dedupe by a company name
|
|
7382
|
+
* with the parenthetical stripped. */
|
|
7383
|
+
company: string;
|
|
7384
|
+
ratingMethod: medicareMedigapRatingMethod;
|
|
7385
|
+
/** CMS's raw rate-type string, kept ONLY when `ratingMethod` is "unknown" — a
|
|
7386
|
+
* value CMS started publishing after this mapping was written. Null whenever
|
|
7387
|
+
* `ratingMethod` is one of the three known values. */
|
|
7388
|
+
ratingMethodRaw: string | null;
|
|
7389
|
+
monthlyRateMin: number;
|
|
7390
|
+
monthlyRateMax: number;
|
|
7391
|
+
address: string;
|
|
7392
|
+
phoneNumber: string;
|
|
7393
|
+
website: string | null;
|
|
7394
|
+
/** A married/related-household discount, when this insurer offers one. Priced
|
|
7395
|
+
* SEPARATELY from `householdDiscountRoommate` — one existing does not imply
|
|
7396
|
+
* the other does. */
|
|
7397
|
+
householdDiscountStandard: medicareMedigapDiscountRange | null;
|
|
7398
|
+
/** An unrelated-adults-sharing-a-residence discount, priced separately from
|
|
7399
|
+
* `householdDiscountStandard` and frequently absent when that one is present. */
|
|
7400
|
+
householdDiscountRoommate: medicareMedigapDiscountRange | null;
|
|
7401
|
+
}
|
|
7402
|
+
|
|
7403
|
+
interface medicareMedigapPlanType {
|
|
7404
|
+
/** CMS's discriminator minus its "MEDIGAP_PLAN_TYPE_" prefix — "A", "HIGH_F", or
|
|
7405
|
+
* a Minnesota/Wisconsin waiver type ("MN_BASIC", "WI_HIGH_DEDUCTIBLE", …). Pass
|
|
7406
|
+
* this back as `searchMedigapPlans`'s `planType` argument to re-fetch just
|
|
7407
|
+
* this one type. */
|
|
7408
|
+
planType: string;
|
|
7409
|
+
/** The range Medicare.gov reports ACROSS every insurer selling this plan type
|
|
7410
|
+
* here, before picking one. Null means the `planType` filter named a type the
|
|
7411
|
+
* overview did not list as offered here — `policies` is then reliably empty
|
|
7412
|
+
* too, and null is the honest value rather than a fabricated 0. */
|
|
7413
|
+
monthlyRateMin: number | null;
|
|
7414
|
+
monthlyRateMax: number | null;
|
|
7415
|
+
householdDiscountStandard: medicareMedigapDiscountRange | null;
|
|
7416
|
+
householdDiscountRoommate: medicareMedigapDiscountRange | null;
|
|
7417
|
+
/** Every insurer selling this plan type here. */
|
|
7418
|
+
policies: medicareMedigapPolicy[];
|
|
7419
|
+
}
|
|
7420
|
+
|
|
7421
|
+
interface medicareMedigapQuery {
|
|
7422
|
+
/** 5-digit US ZIP. */
|
|
7423
|
+
zip: string;
|
|
7424
|
+
/** Omit to fetch every plan type the state offers. A result's own `planType`
|
|
7425
|
+
* (`'G'`, `'HIGH_F'`, or a waiver state's `'MN_BASIC'`) fetches just that one. */
|
|
7426
|
+
planType?: string;
|
|
7427
|
+
/** Only needed for the rare ZIP that crosses a STATE line — Medigap is priced
|
|
7428
|
+
* by state, so the wrong side returns a different market, not an error. */
|
|
7429
|
+
county?: string;
|
|
7430
|
+
}
|
|
7431
|
+
|
|
7432
|
+
interface medicareMedigapSearch {
|
|
7433
|
+
zip: string;
|
|
7434
|
+
/** Resolved from the ZIP, never taken from the caller — Medigap is priced by
|
|
7435
|
+
* state and a wrong one silently returns an empty result rather than an error. */
|
|
7436
|
+
state: string;
|
|
7437
|
+
county: medicareCounty;
|
|
7438
|
+
countiesConsidered: medicareCounty[];
|
|
7439
|
+
/** Empty is a real, honest answer for a state/ZIP CMS reports no Medigap market
|
|
7440
|
+
* data for — never a sign this call failed. */
|
|
7441
|
+
planTypes: medicareMedigapPlanType[];
|
|
7442
|
+
}
|
|
7443
|
+
|
|
6666
7444
|
/**
|
|
6667
7445
|
* The US government's own Medicare site — Medicare Advantage, Part D and Medigap plan search
|
|
6668
7446
|
* with real drug-cost estimates, the Care Compare directory of doctors, hospitals, nursing
|
|
6669
7447
|
* homes, home health, hospice and dialysis providers with CMS quality ratings, the A-to-Z
|
|
6670
|
-
* coverage database, and what Medicare itself costs this year. Part D drug-plan search,
|
|
6671
|
-
*
|
|
6672
|
-
*
|
|
6673
|
-
*
|
|
6674
|
-
*
|
|
6675
|
-
*
|
|
6676
|
-
*
|
|
7448
|
+
* coverage database, and what Medicare itself costs this year. Part D drug-plan search,
|
|
7449
|
+
* Medigap plan search (every insurer selling each plan type, with its rating method and any
|
|
7450
|
+
* household discount), the doctor-and-clinician directory (specialties, group practice,
|
|
7451
|
+
* hospital affiliations by name, and whether they accept Medicare assignment), the
|
|
7452
|
+
* nursing-home directory with CMS's full Five-Star record (component ratings, staffing hours,
|
|
7453
|
+
* fines, payment denials and Special Focus status), the hospital directory with CMS's overall
|
|
7454
|
+
* rating AND the five measure groups behind it (mortality, safety, readmission, patient
|
|
7455
|
+
* experience, timely and effective care), and the Medicare cost reference (premiums,
|
|
7456
|
+
* deductibles, coinsurance tiers and the Part B/Part D income brackets) are callable now; the
|
|
7457
|
+
* other thirteen declared functions are still stubs.
|
|
6677
7458
|
*/
|
|
6678
7459
|
interface Unit {
|
|
6679
7460
|
// UNTYPED, DELIBERATELY OMITTED — `searchDrugPlans({ zip, year, county, limit })` declares no types for
|
|
@@ -6730,6 +7511,43 @@ interface medicareClinicianSearch {
|
|
|
6730
7511
|
* `dataAsOf` carries CMS's own publication date — this is a periodic extract, not a live read.
|
|
6731
7512
|
*/
|
|
6732
7513
|
findDoctors(query: medicareClinicianQuery): Promise<medicareClinicianSearch>;
|
|
7514
|
+
|
|
7515
|
+
/**
|
|
7516
|
+
* The Medigap (Medicare Supplement) plan types sold in a ZIP's state, each with the insurers
|
|
7517
|
+
* selling it, their premium range, their RATING METHOD (attained-age — rises with age;
|
|
7518
|
+
* issue-age or community-rated — does not) and any household discount. `zip` is a 5-digit US
|
|
7519
|
+
* ZIP; `county` disambiguates the rare ZIP that crosses a STATE line (Medigap is priced by
|
|
7520
|
+
* state, not region), the same shape as `searchDrugPlans`'s own `county`. Omit `planType` to
|
|
7521
|
+
* fetch every plan type the state offers (Minnesota and Wisconsin price under their own
|
|
7522
|
+
* federal waiver — `MN_BASIC`, `WI_HIGH_DEDUCTIBLE`, etc. — rather than the national letters,
|
|
7523
|
+
* and this function returns exactly what the state offers); pass a result's own `planType`
|
|
7524
|
+
* (e.g. `'G'`, `'HIGH_F'`) to fetch just that one, one call instead of every letter's. NOTE
|
|
7525
|
+
* the field the manifest exists for: two policies can share the same letter (which by law
|
|
7526
|
+
* means identical coverage) and today's premium, and still diverge by hundreds of dollars a
|
|
7527
|
+
* year within a decade purely because one is `attainedAge` and the other is not — never rank
|
|
7528
|
+
* or recommend a Medigap policy on premium alone without surfacing `ratingMethod`.
|
|
7529
|
+
*/
|
|
7530
|
+
searchMedigapPlans(arg0: medicareMedigapQuery): Promise<medicareMedigapSearch>;
|
|
7531
|
+
|
|
7532
|
+
/**
|
|
7533
|
+
* The Medicare-registered hospitals near a place, nearest first, each with CMS's overall star
|
|
7534
|
+
* rating AND the five measure groups behind it (mortality, safety, readmission, patient
|
|
7535
|
+
* experience, timely and effective care — each with how many measures the hospital reported
|
|
7536
|
+
* and, for the first three, how many beat/matched/trailed the national average), the hospital
|
|
7537
|
+
* type (acute care, critical access, psychiatric, children's, rural emergency, VA, DoD — never
|
|
7538
|
+
* the long-term/rehab types `findRehabAndLongTermCareFacilities` covers), ownership, whether
|
|
7539
|
+
* it offers emergency services, and CMS's birthing-friendly designation. Pass a 5-digit `zip`
|
|
7540
|
+
* (placed via the Census Bureau's ZCTA centroid) or a `latitude`/`longitude` pair;
|
|
7541
|
+
* `radiusMiles` defaults to 25 (max 100) and `limit` to 20. NOTE the two things that make this
|
|
7542
|
+
* answer honest. (1) `overallRating` is null for roughly 40% of hospitals nationally — mostly
|
|
7543
|
+
* small or non-reporting facilities, not poor performers — and is never the whole story: read
|
|
7544
|
+
* it alongside `measureGroups`, since a hospital can report zero of a group's measures and
|
|
7545
|
+
* still carry an overall star from the groups it does report. (2) `distanceMiles` is to the
|
|
7546
|
+
* centroid of the hospital's own ZIP, not its street address — this dataset carries no
|
|
7547
|
+
* coordinates — so `radiusFullyScanned` and `matchesInSearchedZips` carry the same
|
|
7548
|
+
* walked-radius honesty split `findDoctors` uses, for the identical reason.
|
|
7549
|
+
*/
|
|
7550
|
+
findHospitals(query: medicareHospitalQuery): Promise<medicareHospitalSearch>;
|
|
6733
7551
|
}
|
|
6734
7552
|
}
|
|
6735
7553
|
|
|
@@ -7598,6 +8416,34 @@ interface ottoProduct {
|
|
|
7598
8416
|
sizes: { label: string; selected: boolean; available: boolean }[];
|
|
7599
8417
|
colors: { label: string; selected: boolean; available: boolean; image: string | null }[];
|
|
7600
8418
|
}
|
|
8419
|
+
interface ottoSearchPrice {
|
|
8420
|
+
currentAmount: number;
|
|
8421
|
+
currentDisplay: string;
|
|
8422
|
+
suggestedRetailAmount: number | null;
|
|
8423
|
+
suggestedRetailDisplay: string | null;
|
|
8424
|
+
comparativeAmount: number | null;
|
|
8425
|
+
comparativeDisplay: string | null;
|
|
8426
|
+
onSale: boolean;
|
|
8427
|
+
isStartingPrice: boolean;
|
|
8428
|
+
}
|
|
8429
|
+
interface ottoSearchResult {
|
|
8430
|
+
productId: string;
|
|
8431
|
+
variationId: string;
|
|
8432
|
+
articleNumber: string;
|
|
8433
|
+
url: string;
|
|
8434
|
+
name: string;
|
|
8435
|
+
brand: string;
|
|
8436
|
+
price: ottoSearchPrice;
|
|
8437
|
+
availability: { state: string; detail: string };
|
|
8438
|
+
thumbnail: string | null;
|
|
8439
|
+
rating: { value: number; count: number } | null;
|
|
8440
|
+
matchType: string;
|
|
8441
|
+
totalCount: number;
|
|
8442
|
+
}
|
|
8443
|
+
interface ottoSearchQuery {
|
|
8444
|
+
query: string;
|
|
8445
|
+
limit?: number;
|
|
8446
|
+
}
|
|
7601
8447
|
|
|
7602
8448
|
/** German online marketplace — fashion, furniture, electronics and more. */
|
|
7603
8449
|
interface Unit {
|
|
@@ -7609,6 +8455,20 @@ interface ottoProduct {
|
|
|
7609
8455
|
* retired listing).
|
|
7610
8456
|
*/
|
|
7611
8457
|
getProduct(url: string): Promise<ottoProduct>;
|
|
8458
|
+
|
|
8459
|
+
/**
|
|
8460
|
+
* Searches OTTO's catalog for a free-text keyword the way the site's own search bar does,
|
|
8461
|
+
* across its whole marketplace (OTTO's own catalog and third-party sellers) and returns
|
|
8462
|
+
* matching rows: price (current + UVP + the site's own comparison price when it publishes
|
|
8463
|
+
* one), availability, brand, rating and a thumbnail. `matchType` on each row is the site's own
|
|
8464
|
+
* retrieval-type token ("hybrid" for a real keyword match, "semantic" when nothing matched
|
|
8465
|
+
* literally and the site is showing similar items instead — OTTO's engine almost never returns
|
|
8466
|
+
* a hard empty result). Returns one page (up to ~150 rows); `totalCount` on each row is the
|
|
8467
|
+
* site's own total match count across every page. `url` feeds `getProduct` directly for OTTO's
|
|
8468
|
+
* own catalog rows; a third-party marketplace row's URL does not match `getProduct`'s current
|
|
8469
|
+
* `-C<id>/` pattern.
|
|
8470
|
+
*/
|
|
8471
|
+
search(query: ottoSearchQuery): Promise<ottoSearchResult[]>;
|
|
7612
8472
|
}
|
|
7613
8473
|
}
|
|
7614
8474
|
|
|
@@ -7751,13 +8611,56 @@ interface PizzahutPricedLineItem {
|
|
|
7751
8611
|
specialInstructions: string | null;
|
|
7752
8612
|
}
|
|
7753
8613
|
|
|
8614
|
+
// ── getMenuItem ───────────────────────────────────────────────────────────
|
|
8615
|
+
interface PizzahutMenuItem {
|
|
8616
|
+
storeNumber: string;
|
|
8617
|
+
productCode: string; // pass this + a variantCode below to priceOrder
|
|
8618
|
+
name: string | null;
|
|
8619
|
+
description: string | null;
|
|
8620
|
+
category: string | null;
|
|
8621
|
+
currency: string;
|
|
8622
|
+
variants: PizzahutMenuItemVariant[];
|
|
8623
|
+
}
|
|
8624
|
+
|
|
8625
|
+
interface PizzahutMenuItemVariant {
|
|
8626
|
+
variantCode: string; // the priced configuration — size and crust are IN this code
|
|
8627
|
+
name: string | null;
|
|
8628
|
+
priceCents: number; // this variant's OWN starting price
|
|
8629
|
+
attributes: string[]; // e.g. ["Original Pan® Pizza", "Personal Pan"]
|
|
8630
|
+
slots: PizzahutMenuItemSlot[];
|
|
8631
|
+
servingSize: { quantity: number; unit: string } | null;
|
|
8632
|
+
allergens: { allergen: string; presence: string }[];
|
|
8633
|
+
}
|
|
8634
|
+
|
|
8635
|
+
interface PizzahutMenuItemSlot {
|
|
8636
|
+
slotCode: string; // e.g. "slot_pizza_cheese", "slot_toppings"
|
|
8637
|
+
name: string | null;
|
|
8638
|
+
minAllowedSelections: number;
|
|
8639
|
+
maxAllowedSelections: number | null; // null = no cap the site publishes
|
|
8640
|
+
modifiers: PizzahutMenuItemModifier[];
|
|
8641
|
+
}
|
|
8642
|
+
|
|
8643
|
+
interface PizzahutMenuItemModifier {
|
|
8644
|
+
modifierCode: string;
|
|
8645
|
+
name: string | null;
|
|
8646
|
+
weights: PizzahutMenuItemWeight[]; // portion/intensity choices for this modifier
|
|
8647
|
+
}
|
|
8648
|
+
|
|
8649
|
+
interface PizzahutMenuItemWeight {
|
|
8650
|
+
modifierWeightCode: string; // pass slotCode + modifierCode + this to priceOrder's modifiers
|
|
8651
|
+
name: string | null; // e.g. "Light", "Regular", "Extra"
|
|
8652
|
+
priceCents: number; // what THIS option costs on THIS variant — varies by size
|
|
8653
|
+
}
|
|
8654
|
+
|
|
7754
8655
|
/**
|
|
7755
8656
|
* Pizza Hut's US ordering site. `findStores` returns the stores serving any US address or ZIP,
|
|
7756
8657
|
* nearest first, with each one's number, hours, distance, phone and the terms of the carryout
|
|
7757
|
-
* and delivery it offers. `
|
|
8658
|
+
* and delivery it offers. `getMenuItem` reads one item's full store-level configuration by
|
|
8659
|
+
* name — every size/crust, and every optional topping/sauce/cheese slot with what each choice
|
|
8660
|
+
* costs on THAT variant. `priceOrder` then prices a basket at one of those stores WITHOUT
|
|
7758
8661
|
* placing it — line items, subtotal, sales tax, delivery fee and the real total Pizza Hut
|
|
7759
|
-
* would charge, for carryout or to a delivery address, anonymously.
|
|
7760
|
-
* the current deals are
|
|
8662
|
+
* would charge, for carryout or to a delivery address, anonymously. Browsing the full menu
|
|
8663
|
+
* list and reading the current deals are still stubs.
|
|
7761
8664
|
*/
|
|
7762
8665
|
interface Unit {
|
|
7763
8666
|
/**
|
|
@@ -7806,6 +8709,27 @@ interface PizzahutPricedLineItem {
|
|
|
7806
8709
|
* cart so totals never accumulate across calls.
|
|
7807
8710
|
*/
|
|
7808
8711
|
priceOrder(order: { storeNumber: string; items: { productCode: string; variantCode: string; quantity?: number; modifiers?: { slotCode: string; modifierCode: string; modifierWeightCode: string }[]; specialInstructions?: string }[]; fulfillment?: "carryout" | "delivery"; deliveryAddress?: { address: string; address2?: string; city: string; state: string; zip: string; deliveryInstructions?: string; phone?: string }; requestedTime?: string; promoCode?: string }): Promise<PizzahutPricedOrder>;
|
|
8712
|
+
|
|
8713
|
+
/**
|
|
8714
|
+
* Reads one menu item in full for a store — every size/crust it comes in, each one's own
|
|
8715
|
+
* starting price, and every optional slot (sauce, cheese, toppings, seasoning, cut) with what
|
|
8716
|
+
* each choice costs ON THAT VARIANT, plus nutrition serving size and allergens where the site
|
|
8717
|
+
* publishes them. `storeNumber` comes from `findStores`. `getMenu` (the sibling function that
|
|
8718
|
+
* would normally hand out a `productCode` to browse by) is still a stub, so `item` is a NAME
|
|
8719
|
+
* instead — "Pepperoni Pizza" — matched first as an exact `productCode` if you already have
|
|
8720
|
+
* one, then an exact case-insensitive name, then a substring; `category` (a code like "pizza"
|
|
8721
|
+
* or a display name like "Pizza") narrows the search when a name alone is ambiguous. Zero
|
|
8722
|
+
* matches or more than one both throw as caller-fixable, the second one listing every
|
|
8723
|
+
* candidate's name, category and `productCode` so a retry can pick one exactly.
|
|
8724
|
+
* **Configuration prices are per VARIANT, not per product** — measured 2026-08-06 on the same
|
|
8725
|
+
* Pepperoni Pizza, Extra Cheese is +$0.50 on a Personal Pan, +$2.89 on a Medium, +$3.39 on a
|
|
8726
|
+
* Large, so this returns each variant's own priced slot tree rather than one flat add-on price
|
|
8727
|
+
* for the whole item. A `variantCode` plus a `slotCode`/`modifierCode`/`modifierWeightCode`
|
|
8728
|
+
* triple read here is exactly what `priceOrder` takes to price a configured basket. Wholly
|
|
8729
|
+
* anonymous, same guest-token read `priceOrder` uses — no account, no session, nothing
|
|
8730
|
+
* identifying.
|
|
8731
|
+
*/
|
|
8732
|
+
getMenuItem(args: { storeNumber: string; item: string; category?: string }): Promise<PizzahutMenuItem>;
|
|
7809
8733
|
}
|
|
7810
8734
|
}
|
|
7811
8735
|
|
|
@@ -9029,6 +9953,28 @@ interface SearsSearchQuery {
|
|
|
9029
9953
|
zipCode?: string;
|
|
9030
9954
|
limit?: number;
|
|
9031
9955
|
}
|
|
9956
|
+
interface SearsProductPrice {
|
|
9957
|
+
currentAmount: number;
|
|
9958
|
+
currentDisplay: string;
|
|
9959
|
+
regularAmount: number | null;
|
|
9960
|
+
regularDisplay: string | null;
|
|
9961
|
+
onSale: boolean;
|
|
9962
|
+
}
|
|
9963
|
+
interface SearsProductSpecification {
|
|
9964
|
+
label: string;
|
|
9965
|
+
attributes: string[];
|
|
9966
|
+
}
|
|
9967
|
+
interface SearsProduct {
|
|
9968
|
+
productId: string;
|
|
9969
|
+
url: string;
|
|
9970
|
+
name: string;
|
|
9971
|
+
brand: string | null;
|
|
9972
|
+
price: SearsProductPrice;
|
|
9973
|
+
inStock: boolean;
|
|
9974
|
+
images: string[];
|
|
9975
|
+
description: string | null;
|
|
9976
|
+
specifications: SearsProductSpecification[];
|
|
9977
|
+
}
|
|
9032
9978
|
|
|
9033
9979
|
/** Sears' own storefront — product search, product detail, fulfillment/stock and store locator. */
|
|
9034
9980
|
interface Unit {
|
|
@@ -9042,6 +9988,16 @@ interface SearsSearchQuery {
|
|
|
9042
9988
|
* further paging parameter this function reaches.
|
|
9043
9989
|
*/
|
|
9044
9990
|
search(query: SearsSearchQuery): Promise<SearsSearchResult[]>;
|
|
9991
|
+
|
|
9992
|
+
/**
|
|
9993
|
+
* Reads one Sears product in full: name, brand, current and regular price, whether it's in
|
|
9994
|
+
* stock, every image and the site's own full labelled spec sheet (dimensions, features,
|
|
9995
|
+
* overview). Takes the product id or full URL from Sears's own "/p-<id>" pattern — `search`
|
|
9996
|
+
* returns both, so the ordinary path is a `search` row's `id` or `url`. `zipCode` narrows
|
|
9997
|
+
* price/availability the way the site's own zip cookie does; omit it for the site's own
|
|
9998
|
+
* default (New York, 10101). THROWS on an id the site does not recognise.
|
|
9999
|
+
*/
|
|
10000
|
+
getProduct(idOrUrl: string, opts?: { zipCode?: string }): Promise<SearsProduct>;
|
|
9045
10001
|
}
|
|
9046
10002
|
}
|
|
9047
10003
|
|
|
@@ -10480,12 +11436,38 @@ interface walmartStore {
|
|
|
10480
11436
|
services: Array<{ name: string; displayName: string; phone: string | null }>;
|
|
10481
11437
|
}
|
|
10482
11438
|
|
|
11439
|
+
interface walmartSearchResult {
|
|
11440
|
+
itemId: string;
|
|
11441
|
+
name: string;
|
|
11442
|
+
brand: string | null;
|
|
11443
|
+
url: string;
|
|
11444
|
+
image: string | null;
|
|
11445
|
+
price: number | null;
|
|
11446
|
+
wasPrice: number | null;
|
|
11447
|
+
priceRangeMin: number | null;
|
|
11448
|
+
inStock: boolean;
|
|
11449
|
+
rating: number | null;
|
|
11450
|
+
reviewCount: number;
|
|
11451
|
+
sponsored: boolean;
|
|
11452
|
+
totalMatches: number;
|
|
11453
|
+
}
|
|
11454
|
+
|
|
10483
11455
|
/**
|
|
10484
|
-
* Walmart.com — product search, product detail, store-level stock, store locator and more.
|
|
10485
|
-
*
|
|
10486
|
-
* availability.
|
|
11456
|
+
* Walmart.com — product search, product detail, store-level stock, store locator and more. Two
|
|
11457
|
+
* functions built: keyword search across the catalog, and finding nearby stores by ZIP with
|
|
11458
|
+
* address, hours, phone and department availability.
|
|
10487
11459
|
*/
|
|
10488
11460
|
interface Unit {
|
|
11461
|
+
/**
|
|
11462
|
+
* Searches walmart.com's catalog for a keyword and returns matching products — item id, name,
|
|
11463
|
+
* brand, price (plus the pre-markdown price and the cheapest OTHER purchase option's price
|
|
11464
|
+
* when the site names a range), image, in-stock flag, rating, review count and whether the row
|
|
11465
|
+
* is a sponsored placement — the way the site's own search bar does. Returns the site's own
|
|
11466
|
+
* first results page (organic rows only, its own trending/related carousels excluded) in the
|
|
11467
|
+
* site's own default relevance order.
|
|
11468
|
+
*/
|
|
11469
|
+
search(args: { query: string; limit?: number }): Promise<walmartSearchResult[]>;
|
|
11470
|
+
|
|
10489
11471
|
/**
|
|
10490
11472
|
* Finds nearby Walmart stores for a 5-digit US ZIP code — address, phone, hours,
|
|
10491
11473
|
* geo-coordinates, distance, which fulfilment methods each store supports (curbside pickup,
|
|
@@ -10516,6 +11498,26 @@ interface wellfoundRow {
|
|
|
10516
11498
|
equityMax: number | null;
|
|
10517
11499
|
}
|
|
10518
11500
|
|
|
11501
|
+
interface wellfoundJobDetail {
|
|
11502
|
+
id: string;
|
|
11503
|
+
title: string;
|
|
11504
|
+
url: string;
|
|
11505
|
+
descriptionHtml: string;
|
|
11506
|
+
employmentType: string | null;
|
|
11507
|
+
experienceLevel: string | null;
|
|
11508
|
+
remote: boolean;
|
|
11509
|
+
locations: string[];
|
|
11510
|
+
remoteLocations: string[];
|
|
11511
|
+
compensationRaw: string | null;
|
|
11512
|
+
salaryMin: number | null;
|
|
11513
|
+
salaryMax: number | null;
|
|
11514
|
+
salaryCurrency: "USD" | null;
|
|
11515
|
+
equityMin: number | null;
|
|
11516
|
+
equityMax: number | null;
|
|
11517
|
+
datePosted: string | null;
|
|
11518
|
+
company: { name: string; slug: string | null; url: string | null; website: string | null; logoUrl: string | null };
|
|
11519
|
+
}
|
|
11520
|
+
|
|
10519
11521
|
interface wellfoundCompanyRow {
|
|
10520
11522
|
id: string;
|
|
10521
11523
|
name: string;
|
|
@@ -10556,6 +11558,15 @@ interface wellfoundCompanyRow {
|
|
|
10556
11558
|
* filters over the fields the search itself returns.
|
|
10557
11559
|
*/
|
|
10558
11560
|
searchCompanies(args: object): Promise<wellfoundCompanyRow[]>;
|
|
11561
|
+
|
|
11562
|
+
/**
|
|
11563
|
+
* Reads one job posting in full the way its own detail page does — takes the `url` a
|
|
11564
|
+
* `searchJobs`/`searchCompanies` row already carries (a bare id 404s, measured 2026-08-06) —
|
|
11565
|
+
* returning the full description, salary band, equity range (both parsed off the header chip;
|
|
11566
|
+
* equity has no structured-data field on this site), location, remote policy, the site's own
|
|
11567
|
+
* experience-requirement text and the hiring startup.
|
|
11568
|
+
*/
|
|
11569
|
+
getJob(args: { url: string }): Promise<wellfoundJobDetail>;
|
|
10559
11570
|
}
|
|
10560
11571
|
}
|
|
10561
11572
|
|
|
@@ -10734,6 +11745,7 @@ interface BowmarkProviders {
|
|
|
10734
11745
|
bhphoto: BowmarkProvider_bhphoto.Unit;
|
|
10735
11746
|
blenderseyewear: BowmarkProvider_blenderseyewear.Unit;
|
|
10736
11747
|
bmwusa: BowmarkProvider_bmwusa.Unit;
|
|
11748
|
+
cancer: BowmarkProvider_cancer.Unit;
|
|
10737
11749
|
cars: BowmarkProvider_cars.Unit;
|
|
10738
11750
|
cheapflights: BowmarkProvider_cheapflights.Unit;
|
|
10739
11751
|
chriscraft: BowmarkProvider_chriscraft.Unit;
|
|
@@ -10765,7 +11777,9 @@ interface BowmarkProviders {
|
|
|
10765
11777
|
liquiddeath: BowmarkProvider_liquiddeath.Unit;
|
|
10766
11778
|
lonelyplanet: BowmarkProvider_lonelyplanet.Unit;
|
|
10767
11779
|
lufthansa: BowmarkProvider_lufthansa.Unit;
|
|
11780
|
+
lululemon: BowmarkProvider_lululemon.Unit;
|
|
10768
11781
|
mailchimp: BowmarkProvider_mailchimp.Unit;
|
|
11782
|
+
marriott: BowmarkProvider_marriott.Unit;
|
|
10769
11783
|
mcdonalds: BowmarkProvider_mcdonalds.Unit;
|
|
10770
11784
|
medicare: BowmarkProvider_medicare.Unit;
|
|
10771
11785
|
microcenter: BowmarkProvider_microcenter.Unit;
|
|
@@ -17598,6 +18612,7 @@ interface BowmarkProviders {
|
|
|
17598
18612
|
beyondthemeatsuit: BowmarkFamily_shopify_store.Unit;
|
|
17599
18613
|
beyondthenotes: BowmarkFamily_shopify_store.Unit;
|
|
17600
18614
|
beyondtheshimmer: BowmarkFamily_shopify_store.Unit;
|
|
18615
|
+
beyondyoga: BowmarkFamily_shopify_store.Unit;
|
|
17601
18616
|
beyourstheme: BowmarkFamily_shopify_store.Unit;
|
|
17602
18617
|
beyoursthemeclothing: BowmarkFamily_shopify_store.Unit;
|
|
17603
18618
|
beyoursthemefashion: BowmarkFamily_shopify_store.Unit;
|