@bowmark/web 1.5.0 → 1.7.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 +2197 -15
- package/src/generated/validators.ts +1319 -32
|
@@ -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
|
-
//
|
|
10
|
-
// 51,
|
|
8
|
+
// Manifest version: a400421498212bf60bfaab4808ff698bd8edb4febae1ba86fda5cb9ebc232c1b
|
|
9
|
+
// 9 capabilities, 109 providers, 356 typed functions, 20 refused.
|
|
10
|
+
// 51,714 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
|
|
@@ -861,6 +861,126 @@ type ReadResult = {
|
|
|
861
861
|
}
|
|
862
862
|
}
|
|
863
863
|
|
|
864
|
+
declare namespace BowmarkCapability_sheds {
|
|
865
|
+
// ── Sheds and portable buildings (configure and price) — the unit's own declarations, verbatim ──
|
|
866
|
+
type ShedSize = {
|
|
867
|
+
sizeKey: string // the maker's own key; opaque, meaningful only to source
|
|
868
|
+
widthFt: number // FEET, always — the maker's own units are converted away
|
|
869
|
+
lengthFt: number
|
|
870
|
+
}
|
|
871
|
+
type ShedStyle = {
|
|
872
|
+
source: string // which maker — a provider id
|
|
873
|
+
brand: string // the maker's brand name, for an answer that names who builds it
|
|
874
|
+
key: string // the maker's own style key
|
|
875
|
+
label: string // the style as a customer sees it ("Lofted Barn")
|
|
876
|
+
sidingOptions: string[] // siding keys; the first is the maker's standard
|
|
877
|
+
sizes: ShedSize[]
|
|
878
|
+
imageUrl: string | null // a real product image from the maker's own catalogue
|
|
879
|
+
roofStyle: string | null // "gable", "gambrel", ...
|
|
880
|
+
roofing: string | null // "metal", ...
|
|
881
|
+
wallHeight: string | null // the maker's own spec, verbatim, e.g. "left-78-right-78-eave-72"
|
|
882
|
+
}
|
|
883
|
+
type ShedStylesResult = {
|
|
884
|
+
styles: ShedStyle[]
|
|
885
|
+
warnings: string[] // always present; a maker named here returned NOTHING
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
type ShedQuoteRequest = {
|
|
889
|
+
widthFt: number // in feet, as a person says it — "a 12 by 20"
|
|
890
|
+
lengthFt: number
|
|
891
|
+
zip: string // required; every maker prices regionally
|
|
892
|
+
style?: string // style key OR its customer-facing name, matched loosely.
|
|
893
|
+
// Omit to price EVERY style that builds the size
|
|
894
|
+
siding?: string // omit for the maker's standard siding
|
|
895
|
+
}
|
|
896
|
+
type ShedQuote = {
|
|
897
|
+
source: string
|
|
898
|
+
brand: string
|
|
899
|
+
styleKey: string
|
|
900
|
+
style: string // "Lofted Barn"
|
|
901
|
+
model: string | null // the maker's model name, where it has one
|
|
902
|
+
widthFt: number
|
|
903
|
+
lengthFt: number
|
|
904
|
+
siding: string // the siding key this was priced in
|
|
905
|
+
zip: string
|
|
906
|
+
region: string // the maker's own pricing region that zip fell under
|
|
907
|
+
basePrice: number
|
|
908
|
+
sidingSurcharge: number // what the siding added, by the maker's rules; 0 for standard
|
|
909
|
+
total: number // basePrice + sidingSurcharge, the maker's own arithmetic
|
|
910
|
+
currency: string
|
|
911
|
+
imageUrl: string | null // what the building looks like, from the maker's catalogue
|
|
912
|
+
roofStyle: string | null // "gable", "gambrel", ...
|
|
913
|
+
roofing: string | null // "metal", ...
|
|
914
|
+
wallHeight: string | null // the maker's own spec, verbatim
|
|
915
|
+
orderUrl: string // where to go order THIS build, always present
|
|
916
|
+
}
|
|
917
|
+
type ShedQuoteResult = {
|
|
918
|
+
quotes: ShedQuote[] // cheapest first, across every maker that builds the size
|
|
919
|
+
warnings: string[] // always present; names a dropped maker, a style that does
|
|
920
|
+
// not build the size, and a capped fan
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
type ShedDealer = {
|
|
924
|
+
source: string
|
|
925
|
+
brand: string
|
|
926
|
+
name: string
|
|
927
|
+
city: string
|
|
928
|
+
state: string
|
|
929
|
+
zip: string
|
|
930
|
+
phone: string | null // null when the directory lists none (never "")
|
|
931
|
+
url: string
|
|
932
|
+
}
|
|
933
|
+
type ShedDealerResult = {
|
|
934
|
+
dealers: ShedDealer[]
|
|
935
|
+
warnings: string[]
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
type CallOptions = {
|
|
939
|
+
timeoutMs?: number // per-provider budget in ms, default 30000, clamped to 1000-55000.
|
|
940
|
+
// A provider slower than this is DROPPED from the results and
|
|
941
|
+
// NAMED in warnings — never silently absent
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
/**
|
|
945
|
+
* Price a portable building the way its maker's own 3D configurator does — give a size in feet
|
|
946
|
+
* and a zip and get the real regional price for every style that builds it, the exact siding
|
|
947
|
+
* surcharge rather than a guessed range, a real product image and spec for each one, and the
|
|
948
|
+
* link to go order it. Plus the maker's real dealer locations by state.
|
|
949
|
+
*/
|
|
950
|
+
interface Unit {
|
|
951
|
+
/**
|
|
952
|
+
* Prices a building at a real size for a real zip, exactly the way the maker's own
|
|
953
|
+
* configurator does — the regional base price plus the EXACT siding surcharge its rules apply
|
|
954
|
+
* at that width and region, never a national range or a guessed upcharge. Sizes are in FEET ({
|
|
955
|
+
* widthFt: 12, lengthFt: 20 }), and both orientations count. Omit `style` to price every style
|
|
956
|
+
* that builds the size, cheapest first; name it loosely ("lofted barn") when you want one.
|
|
957
|
+
* `zip` is required because every maker prices regionally. Each quote DESCRIBES the building
|
|
958
|
+
* as well as costing it — a real product image, the roof line and roofing material, the
|
|
959
|
+
* maker's own wall-height spec — and carries `orderUrl`, their own page to go order that
|
|
960
|
+
* build. `warnings` is always present and names a maker that failed, styles that do not build
|
|
961
|
+
* the size, and a capped fan. `options.timeoutMs` sets the per-maker budget (default 30000).
|
|
962
|
+
*/
|
|
963
|
+
quote(request: ShedQuoteRequest, options?: CallOptions): Promise<ShedQuoteResult>;
|
|
964
|
+
|
|
965
|
+
/**
|
|
966
|
+
* Lists every building style each maker actually offers — its customer-facing name, the siding
|
|
967
|
+
* it can be built in, every real buildable size in FEET, and what the building IS (a real
|
|
968
|
+
* product image, the roof line and roofing material, the maker's own wall-height spec). Use it
|
|
969
|
+
* to see what exists before pricing, or to answer "what sizes do they even make". `warnings`
|
|
970
|
+
* names any maker that returned nothing, which is not the same as a maker with no styles.
|
|
971
|
+
*/
|
|
972
|
+
listStyles(options?: CallOptions): Promise<ShedStylesResult>;
|
|
973
|
+
|
|
974
|
+
/**
|
|
975
|
+
* Looks up the real places that sell a maker's buildings in one US state or Canadian province
|
|
976
|
+
* — full name ("Tennessee") or abbreviation ("TN") — with name, city, phone and the dealer's
|
|
977
|
+
* own page, for handing a priced configuration to somebody who can actually build it. `phone`
|
|
978
|
+
* is null when the directory lists none, never an empty string.
|
|
979
|
+
*/
|
|
980
|
+
findDealers(state: string, options?: CallOptions): Promise<ShedDealerResult>;
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
|
|
864
984
|
declare namespace BowmarkProvider_aa {
|
|
865
985
|
// ── American Airlines — the unit's own declarations, verbatim ──
|
|
866
986
|
interface aaFlight {
|
|
@@ -1318,6 +1438,94 @@ interface abercrombieStockQuery {
|
|
|
1318
1438
|
}
|
|
1319
1439
|
}
|
|
1320
1440
|
|
|
1441
|
+
declare namespace BowmarkProvider_aiper {
|
|
1442
|
+
// ── Aiper — the unit's own declarations, verbatim ──
|
|
1443
|
+
interface AiperPoolOption {
|
|
1444
|
+
id: string;
|
|
1445
|
+
label: string;
|
|
1446
|
+
}
|
|
1447
|
+
interface AiperPoolQuestion {
|
|
1448
|
+
id: string;
|
|
1449
|
+
problemName: string;
|
|
1450
|
+
multiSelect: boolean;
|
|
1451
|
+
options: AiperPoolOption[];
|
|
1452
|
+
}
|
|
1453
|
+
interface AiperPoolAnswerInput {
|
|
1454
|
+
question: string;
|
|
1455
|
+
choice: string | string[];
|
|
1456
|
+
}
|
|
1457
|
+
interface AiperRecommendedProduct {
|
|
1458
|
+
productId: string;
|
|
1459
|
+
slug: string;
|
|
1460
|
+
name: string;
|
|
1461
|
+
sku: string;
|
|
1462
|
+
price: number;
|
|
1463
|
+
regularPrice: number;
|
|
1464
|
+
url: string;
|
|
1465
|
+
image: string | null;
|
|
1466
|
+
}
|
|
1467
|
+
interface AiperPoolRecommendation {
|
|
1468
|
+
products: AiperRecommendedProduct[];
|
|
1469
|
+
answers: AiperPoolAnswerInput[];
|
|
1470
|
+
warnings: string[];
|
|
1471
|
+
}
|
|
1472
|
+
|
|
1473
|
+
/**
|
|
1474
|
+
* Aiper's Help Me Choose robotic-pool-cleaner finder, run for real — the quiz's own computed
|
|
1475
|
+
* recommendation (model, SKU, real current price, PDP link) for a buyer's pool answers, off
|
|
1476
|
+
* the site's own undocumented API.
|
|
1477
|
+
*/
|
|
1478
|
+
interface Unit {
|
|
1479
|
+
/**
|
|
1480
|
+
* Reads the Help Me Choose quiz's live question list — every question in order, with its
|
|
1481
|
+
* option ids and labels. The entry point: recommendPoolCleaner takes answers keyed off these
|
|
1482
|
+
* labels, so a caller normally reads this first (or already knows the labels from a prior
|
|
1483
|
+
* call).
|
|
1484
|
+
*/
|
|
1485
|
+
listPoolChooserQuestions(): Promise<AiperPoolQuestion[]>;
|
|
1486
|
+
|
|
1487
|
+
/**
|
|
1488
|
+
* Runs the Help Me Choose quiz's real backend computation for a buyer's answers (given as
|
|
1489
|
+
* question/choice LABELS, matched case-insensitively against listPoolChooserQuestions) and
|
|
1490
|
+
* returns the same computed recommendation the quiz's own terminal page renders: model name,
|
|
1491
|
+
* SKU, real current price, list price, and a PDP URL. THROWS if a question or choice label
|
|
1492
|
+
* doesn't match, or if the site's computed result carries no product list.
|
|
1493
|
+
*/
|
|
1494
|
+
recommendPoolCleaner(answers: AiperPoolAnswerInput[]): Promise<AiperPoolRecommendation>;
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
|
|
1498
|
+
declare namespace BowmarkProvider_ajmadison {
|
|
1499
|
+
// ── AJ Madison — the unit's own declarations, verbatim ──
|
|
1500
|
+
interface AjmadisonSearchArgs {
|
|
1501
|
+
category: string; // the site's own category slug, e.g. "refrigerators"
|
|
1502
|
+
filters?: Record<string, string>; // the site's own facet query params, verbatim
|
|
1503
|
+
limit?: number; // default 25, clamped to [1, 60]
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1506
|
+
interface AjmadisonSearchResult {
|
|
1507
|
+
sku: string;
|
|
1508
|
+
name: string;
|
|
1509
|
+
price: number; // real, current selling price
|
|
1510
|
+
wasPrice: number | null; // the crossed-out "was" price, when shown
|
|
1511
|
+
url: string; // this product's own AJ Madison URL
|
|
1512
|
+
}
|
|
1513
|
+
|
|
1514
|
+
/**
|
|
1515
|
+
* AJ Madison's real appliance catalog — search runs the site's own category + facet filter
|
|
1516
|
+
* (brand, size/capacity, price band, style, availability) and returns real, currently-listed
|
|
1517
|
+
* products with their live selling price and the product's own AJ Madison URL.
|
|
1518
|
+
*/
|
|
1519
|
+
interface Unit {
|
|
1520
|
+
/**
|
|
1521
|
+
* Runs AJ Madison's own category + facet filter and returns real, currently-listed products
|
|
1522
|
+
* (name, real current price, the crossed-out 'was' price when shown, the product's own AJ
|
|
1523
|
+
* Madison URL). Read-only — never adds to cart or checks out.
|
|
1524
|
+
*/
|
|
1525
|
+
search(args: AjmadisonSearchArgs): Promise<AjmadisonSearchResult[]>;
|
|
1526
|
+
}
|
|
1527
|
+
}
|
|
1528
|
+
|
|
1321
1529
|
declare namespace BowmarkProvider_ashleyfurniture {
|
|
1322
1530
|
// ── Ashley Furniture — the unit's own declarations, verbatim ──
|
|
1323
1531
|
interface AshleyFurnitureSearchArgs {
|
|
@@ -1438,6 +1646,47 @@ interface AshleyFurnitureStore {
|
|
|
1438
1646
|
}
|
|
1439
1647
|
}
|
|
1440
1648
|
|
|
1649
|
+
declare namespace BowmarkProvider_atlasseniorliving {
|
|
1650
|
+
// ── Atlas Senior Living — the unit's own declarations, verbatim ──
|
|
1651
|
+
type AtlasCareType = "assisted_living" | "independent_living" | "memory_care" | "respite_care";
|
|
1652
|
+
|
|
1653
|
+
interface AtlasCommunity {
|
|
1654
|
+
id: string;
|
|
1655
|
+
name: string;
|
|
1656
|
+
address: string;
|
|
1657
|
+
city: string;
|
|
1658
|
+
state: string;
|
|
1659
|
+
zip: string;
|
|
1660
|
+
phone: string;
|
|
1661
|
+
distanceMiles: number;
|
|
1662
|
+
lat: number;
|
|
1663
|
+
lng: number;
|
|
1664
|
+
url: string;
|
|
1665
|
+
}
|
|
1666
|
+
|
|
1667
|
+
interface AtlasSearchCommunitiesResult {
|
|
1668
|
+
location: string;
|
|
1669
|
+
geocodedLat: number;
|
|
1670
|
+
geocodedLng: number;
|
|
1671
|
+
careTypes: AtlasCareType[];
|
|
1672
|
+
radiusMiles: number;
|
|
1673
|
+
communities: AtlasCommunity[];
|
|
1674
|
+
}
|
|
1675
|
+
|
|
1676
|
+
/**
|
|
1677
|
+
* Atlas Senior Living's own community search (atlasseniorliving.com/our-communities/) — given
|
|
1678
|
+
* a US city/state or ZIP, plus optional care type(s) and radius, returns the real,
|
|
1679
|
+
* distance-sorted set of matching Atlas communities.
|
|
1680
|
+
*/
|
|
1681
|
+
interface Unit {
|
|
1682
|
+
/**
|
|
1683
|
+
* Runs the site's own community search: a US location + optional care type(s) and radius,
|
|
1684
|
+
* returns the real, distance-sorted matching Atlas communities.
|
|
1685
|
+
*/
|
|
1686
|
+
searchCommunities(arg: { location: string, careTypes?: AtlasCareType[], radiusMiles?: number, maxResults?: number }): Promise<AtlasSearchCommunitiesResult>;
|
|
1687
|
+
}
|
|
1688
|
+
}
|
|
1689
|
+
|
|
1441
1690
|
declare namespace BowmarkProvider_avis {
|
|
1442
1691
|
// ── Avis — the unit's own declarations, verbatim ──
|
|
1443
1692
|
interface avisRow {
|
|
@@ -2103,6 +2352,71 @@ interface BmwusaModelListing {
|
|
|
2103
2352
|
}
|
|
2104
2353
|
}
|
|
2105
2354
|
|
|
2355
|
+
declare namespace BowmarkProvider_bykoket {
|
|
2356
|
+
// ── KOKET — the unit's own declarations, verbatim ──
|
|
2357
|
+
interface KoketProductSummary {
|
|
2358
|
+
id: string;
|
|
2359
|
+
name: string;
|
|
2360
|
+
url: string;
|
|
2361
|
+
price: number;
|
|
2362
|
+
currency: string;
|
|
2363
|
+
inStock: boolean;
|
|
2364
|
+
}
|
|
2365
|
+
|
|
2366
|
+
interface KoketProduct {
|
|
2367
|
+
id: string;
|
|
2368
|
+
name: string;
|
|
2369
|
+
url: string;
|
|
2370
|
+
reference: string;
|
|
2371
|
+
price: number;
|
|
2372
|
+
priceFormatted: string;
|
|
2373
|
+
listPrice: number;
|
|
2374
|
+
onSale: boolean;
|
|
2375
|
+
currency: string;
|
|
2376
|
+
inStock: boolean;
|
|
2377
|
+
quantityLeft: number | null;
|
|
2378
|
+
availabilityMessage: string;
|
|
2379
|
+
description: string;
|
|
2380
|
+
images: string[];
|
|
2381
|
+
}
|
|
2382
|
+
|
|
2383
|
+
interface KoketAddToCartHandoff {
|
|
2384
|
+
id: string;
|
|
2385
|
+
name: string;
|
|
2386
|
+
url: string;
|
|
2387
|
+
price: number;
|
|
2388
|
+
currency: string;
|
|
2389
|
+
inStock: boolean;
|
|
2390
|
+
note: string;
|
|
2391
|
+
}
|
|
2392
|
+
|
|
2393
|
+
/**
|
|
2394
|
+
* Reads KOKET's public furniture, lighting and textiles storefront (bykoket.com/shop) — search
|
|
2395
|
+
* the catalog, read a product's live price, stock and description, and get the handoff to add
|
|
2396
|
+
* it to cart on the real site.
|
|
2397
|
+
*/
|
|
2398
|
+
interface Unit {
|
|
2399
|
+
/**
|
|
2400
|
+
* Searches KOKET's live public catalog (furniture, lighting, textiles) and returns each
|
|
2401
|
+
* match's id, name, product URL, price and stock status.
|
|
2402
|
+
*/
|
|
2403
|
+
searchProducts(query: string): Promise<KoketProductSummary[]>;
|
|
2404
|
+
|
|
2405
|
+
/**
|
|
2406
|
+
* Reads one KOKET product's live page — price (list and current, since KOKET runs promotions),
|
|
2407
|
+
* stock count, availability message, description and images.
|
|
2408
|
+
*/
|
|
2409
|
+
getProduct(idOrUrl: string): Promise<KoketProduct>;
|
|
2410
|
+
|
|
2411
|
+
/**
|
|
2412
|
+
* Hands back the shopper's own KOKET product page — the exact Add to cart button for this
|
|
2413
|
+
* product — since the site's cart requires a per-session token nobody but the shopper can
|
|
2414
|
+
* supply. Writes nothing.
|
|
2415
|
+
*/
|
|
2416
|
+
addToCart(idOrUrl: string): Promise<KoketAddToCartHandoff>;
|
|
2417
|
+
}
|
|
2418
|
+
}
|
|
2419
|
+
|
|
2106
2420
|
declare namespace BowmarkProvider_cancer {
|
|
2107
2421
|
// ── National Cancer Institute (cancer.gov) — the unit's own declarations, verbatim ──
|
|
2108
2422
|
type cancerCenterDesignation =
|
|
@@ -2646,6 +2960,75 @@ interface ChriscraftPriceResult {
|
|
|
2646
2960
|
}
|
|
2647
2961
|
}
|
|
2648
2962
|
|
|
2963
|
+
declare namespace BowmarkProvider_classichome {
|
|
2964
|
+
// ── Classic Home — the unit's own declarations, verbatim ──
|
|
2965
|
+
// Classic Home's OWN shapes — not a capability contract.
|
|
2966
|
+
|
|
2967
|
+
interface ClassicHomeProduct {
|
|
2968
|
+
handle: string; // the key getProduct/addToCart take
|
|
2969
|
+
title: string;
|
|
2970
|
+
url: string;
|
|
2971
|
+
priceMin: number; // dollars — the cheapest real fabric/leather choice
|
|
2972
|
+
priceMax: number; // dollars — the most expensive (usually top-grain leather)
|
|
2973
|
+
variantCount: number; // >1 means a real fabric/leather choice exists
|
|
2974
|
+
}
|
|
2975
|
+
|
|
2976
|
+
interface ClassicHomeVariant {
|
|
2977
|
+
optionValue: string; // e.g. "Soft Olive", "Dawn-Flax", "ElPaso-Saddle"
|
|
2978
|
+
sku: string;
|
|
2979
|
+
price: number; // dollars — this exact fabric/leather's own real price
|
|
2980
|
+
available: boolean;
|
|
2981
|
+
}
|
|
2982
|
+
|
|
2983
|
+
interface ClassicHomeProductDetail {
|
|
2984
|
+
handle: string;
|
|
2985
|
+
title: string;
|
|
2986
|
+
url: string;
|
|
2987
|
+
optionName: string; // usually "Color" (fabric/leather); "Title" if no real picker
|
|
2988
|
+
variants: ClassicHomeVariant[];
|
|
2989
|
+
}
|
|
2990
|
+
|
|
2991
|
+
interface ClassicHomeCartHandoff {
|
|
2992
|
+
handle: string;
|
|
2993
|
+
optionValue: string;
|
|
2994
|
+
sku: string;
|
|
2995
|
+
price: number; // dollars — the real price for this exact fabric/leather
|
|
2996
|
+
available: boolean;
|
|
2997
|
+
productUrl: string; // finish add-to-cart/checkout on the real product page
|
|
2998
|
+
}
|
|
2999
|
+
|
|
3000
|
+
/**
|
|
3001
|
+
* Classic Home's real Made-to-Order fabric/leather catalog and its real, material-specific
|
|
3002
|
+
* Shopify pricing — search real MTO products (sofas, chairs, ottomans), read one product's
|
|
3003
|
+
* real fabric/leather picker, and resolve one exact fabric or leather choice to its real SKU,
|
|
3004
|
+
* price and availability.
|
|
3005
|
+
*/
|
|
3006
|
+
interface Unit {
|
|
3007
|
+
/**
|
|
3008
|
+
* Searches Classic Home's real Made-to-Order catalog (sofas, chairs, ottomans) via the site's
|
|
3009
|
+
* own Shopify collection JSON, optionally filtered by a free-text query against the product
|
|
3010
|
+
* title. Returns real products with a real price range read off their own fabric/leather
|
|
3011
|
+
* variants.
|
|
3012
|
+
*/
|
|
3013
|
+
searchProducts(query?: string): Promise<ClassicHomeProduct[]>;
|
|
3014
|
+
|
|
3015
|
+
/**
|
|
3016
|
+
* Reads one product's real live fabric/leather picker: every real color/material choice with
|
|
3017
|
+
* its own real price and availability, keyed by the site's own option name. THROWS on an
|
|
3018
|
+
* unknown handle, naming searchProducts() as the way to find current ones.
|
|
3019
|
+
*/
|
|
3020
|
+
getProduct(handle: string): Promise<ClassicHomeProductDetail>;
|
|
3021
|
+
|
|
3022
|
+
/**
|
|
3023
|
+
* Resolves ONE exact fabric/leather choice (optionValue from getProduct's own variant list,
|
|
3024
|
+
* e.g. "Soft Olive") to Classic Home's own real price, availability and SKU, plus the product
|
|
3025
|
+
* page to finish add-to-cart/checkout on the site itself. Writes nothing — classichome.com's
|
|
3026
|
+
* robots.txt disallows automated /cart access.
|
|
3027
|
+
*/
|
|
3028
|
+
addToCart(handle: string, optionValue: string): Promise<ClassicHomeCartHandoff>;
|
|
3029
|
+
}
|
|
3030
|
+
}
|
|
3031
|
+
|
|
2649
3032
|
declare namespace BowmarkProvider_classpass {
|
|
2650
3033
|
// ── ClassPass — the unit's own declarations, verbatim ──
|
|
2651
3034
|
/** Everything /v2/venues publishes about one studio — a superset of
|
|
@@ -3621,6 +4004,36 @@ interface DiscounttireTireSizeSearch {
|
|
|
3621
4004
|
}
|
|
3622
4005
|
}
|
|
3623
4006
|
|
|
4007
|
+
declare namespace BowmarkProvider_embroker {
|
|
4008
|
+
// ── Embroker — the unit's own declarations, verbatim ──
|
|
4009
|
+
interface EmbrokerCoverageCatalog {
|
|
4010
|
+
coverageLines: string[];
|
|
4011
|
+
productTypes: string[];
|
|
4012
|
+
}
|
|
4013
|
+
|
|
4014
|
+
interface EmbrokerQuoteEntryPoint {
|
|
4015
|
+
product: string;
|
|
4016
|
+
productLabel: string;
|
|
4017
|
+
url: string;
|
|
4018
|
+
reachable: boolean;
|
|
4019
|
+
}
|
|
4020
|
+
|
|
4021
|
+
/**
|
|
4022
|
+
* Embroker's own coverage catalog and live self-serve quote-wizard entry points for
|
|
4023
|
+
* tech/startup, law firm, cyber, BOP, crime and professional-liability business insurance.
|
|
4024
|
+
*/
|
|
4025
|
+
interface Unit {
|
|
4026
|
+
/** Returns Embroker's real coverage-line and policy-product-type catalog. */
|
|
4027
|
+
listCoverageLines(): Promise<EmbrokerCoverageCatalog>;
|
|
4028
|
+
|
|
4029
|
+
/**
|
|
4030
|
+
* Returns the live, confirmed-reachable entry URL for one of Embroker's self-serve
|
|
4031
|
+
* quote-wizard products.
|
|
4032
|
+
*/
|
|
4033
|
+
getQuoteEntryPoint(args: { product: string }): Promise<EmbrokerQuoteEntryPoint>;
|
|
4034
|
+
}
|
|
4035
|
+
}
|
|
4036
|
+
|
|
3624
4037
|
declare namespace BowmarkProvider_erieinsurance {
|
|
3625
4038
|
// ── ERIE Insurance — the unit's own declarations, verbatim ──
|
|
3626
4039
|
interface ErieAgentQuery {
|
|
@@ -3957,6 +4370,50 @@ interface ExtraspaceUnitAvailability {
|
|
|
3957
4370
|
}
|
|
3958
4371
|
}
|
|
3959
4372
|
|
|
4373
|
+
declare namespace BowmarkProvider_firstdibs {
|
|
4374
|
+
// ── 1stDibs — the unit's own declarations, verbatim ──
|
|
4375
|
+
interface FirstdibsSearchResult {
|
|
4376
|
+
name: string;
|
|
4377
|
+
url: string;
|
|
4378
|
+
price: number;
|
|
4379
|
+
priceCurrency: string;
|
|
4380
|
+
availability: string;
|
|
4381
|
+
image: string | null;
|
|
4382
|
+
}
|
|
4383
|
+
interface FirstdibsCompletingAction {
|
|
4384
|
+
makeOffer: boolean;
|
|
4385
|
+
contactSeller: boolean;
|
|
4386
|
+
purchase: false;
|
|
4387
|
+
}
|
|
4388
|
+
interface FirstdibsListing {
|
|
4389
|
+
name: string;
|
|
4390
|
+
url: string;
|
|
4391
|
+
description: string;
|
|
4392
|
+
brand: string | null;
|
|
4393
|
+
price: number;
|
|
4394
|
+
priceCurrency: string;
|
|
4395
|
+
completingAction: FirstdibsCompletingAction;
|
|
4396
|
+
}
|
|
4397
|
+
|
|
4398
|
+
/**
|
|
4399
|
+
* Search 1stDibs' luxury/vintage marketplace and read a listing's real price plus its concrete
|
|
4400
|
+
* completing action (Make an Offer / Contact Seller) — no login.
|
|
4401
|
+
*/
|
|
4402
|
+
interface Unit {
|
|
4403
|
+
/**
|
|
4404
|
+
* Runs 1stDibs' keyword search (or a category-facet URL) and returns real listings with real
|
|
4405
|
+
* price, currency, availability and url.
|
|
4406
|
+
*/
|
|
4407
|
+
search(query: string): Promise<FirstdibsSearchResult[]>;
|
|
4408
|
+
|
|
4409
|
+
/**
|
|
4410
|
+
* Reads one listing's real price and its concrete completing action(s) — Make an Offer and/or
|
|
4411
|
+
* Contact Seller, whichever this seller has enabled.
|
|
4412
|
+
*/
|
|
4413
|
+
getListing(url: string): Promise<FirstdibsListing>;
|
|
4414
|
+
}
|
|
4415
|
+
}
|
|
4416
|
+
|
|
3960
4417
|
declare namespace BowmarkProvider_flightradar24 {
|
|
3961
4418
|
// ── Flightradar24 — the unit's own declarations, verbatim ──
|
|
3962
4419
|
interface flightradar24Airline {
|
|
@@ -5004,6 +5461,53 @@ interface GooglePriceGraph {
|
|
|
5004
5461
|
}
|
|
5005
5462
|
}
|
|
5006
5463
|
|
|
5464
|
+
declare namespace BowmarkProvider_gotchacovered {
|
|
5465
|
+
// ── Gotcha Covered — the unit's own declarations, verbatim ──
|
|
5466
|
+
interface GotchaCoveredQuizOption {
|
|
5467
|
+
label: string;
|
|
5468
|
+
imageUrl: string | null;
|
|
5469
|
+
}
|
|
5470
|
+
interface GotchaCoveredQuizQuestion {
|
|
5471
|
+
step: number;
|
|
5472
|
+
prompt: string;
|
|
5473
|
+
options: GotchaCoveredQuizOption[];
|
|
5474
|
+
}
|
|
5475
|
+
interface GotchaCoveredQuizQuestions {
|
|
5476
|
+
questions: GotchaCoveredQuizQuestion[];
|
|
5477
|
+
}
|
|
5478
|
+
interface GotchaCoveredQuizAnswers {
|
|
5479
|
+
colorScheme: string;
|
|
5480
|
+
pattern: string;
|
|
5481
|
+
imageChoice: number | string;
|
|
5482
|
+
destination: string;
|
|
5483
|
+
material: string;
|
|
5484
|
+
item: string;
|
|
5485
|
+
}
|
|
5486
|
+
interface GotchaCoveredQuizResult {
|
|
5487
|
+
styleName: string;
|
|
5488
|
+
description: string;
|
|
5489
|
+
recommendedProducts: string | null;
|
|
5490
|
+
url: string;
|
|
5491
|
+
}
|
|
5492
|
+
|
|
5493
|
+
/**
|
|
5494
|
+
* Reads and answers Gotcha Covered's own 'What Design Style Am I?' window-treatment style
|
|
5495
|
+
* quiz, returning the site's real computed match.
|
|
5496
|
+
*/
|
|
5497
|
+
interface Unit {
|
|
5498
|
+
/** Reads the live 'What Design Style Am I?' quiz's real 6 questions and option lists. */
|
|
5499
|
+
getDesignStyleQuizQuestions(): Promise<GotchaCoveredQuizQuestions>;
|
|
5500
|
+
|
|
5501
|
+
/**
|
|
5502
|
+
* Answers all 6 questions of Gotcha Covered's Design Style Quiz (e.g. { colorScheme:
|
|
5503
|
+
* "Metallics Color Scheme", pattern: "Eclectic Pattern", imageChoice: 1, destination: "Spain
|
|
5504
|
+
* Destination", material: "Wood Material", item: "Graphic Rug Item" }) and returns the site's
|
|
5505
|
+
* real computed style match.
|
|
5506
|
+
*/
|
|
5507
|
+
takeDesignStyleQuiz(answers: GotchaCoveredQuizAnswers): Promise<GotchaCoveredQuizResult>;
|
|
5508
|
+
}
|
|
5509
|
+
}
|
|
5510
|
+
|
|
5007
5511
|
declare namespace BowmarkProvider_grainger {
|
|
5008
5512
|
// ── Grainger — the unit's own declarations, verbatim ──
|
|
5009
5513
|
interface graingerRow {
|
|
@@ -5110,6 +5614,206 @@ interface graingerStockRow {
|
|
|
5110
5614
|
}
|
|
5111
5615
|
}
|
|
5112
5616
|
|
|
5617
|
+
declare namespace BowmarkProvider_handypro {
|
|
5618
|
+
// ── HandyPro — the unit's own declarations, verbatim ──
|
|
5619
|
+
// HandyPro's OWN shapes — not a capability contract.
|
|
5620
|
+
|
|
5621
|
+
interface HandyproHourlyRate { fromHours: number; toHours: number; pricePerHour: number }
|
|
5622
|
+
|
|
5623
|
+
interface HandyproServiceArea {
|
|
5624
|
+
covered: boolean;
|
|
5625
|
+
message?: string; // present only when covered is false
|
|
5626
|
+
franchiseeName?: string;
|
|
5627
|
+
phone?: string;
|
|
5628
|
+
city?: string;
|
|
5629
|
+
state?: string;
|
|
5630
|
+
formattedAddress?: string;
|
|
5631
|
+
hourlyRates?: HandyproHourlyRate[];
|
|
5632
|
+
}
|
|
5633
|
+
|
|
5634
|
+
interface HandyproCategoryPrice {
|
|
5635
|
+
categoryId: string;
|
|
5636
|
+
categoryName: string;
|
|
5637
|
+
parentCategoryName: string;
|
|
5638
|
+
pricingKind: "estimate" | "fixedJob" | "unpriced";
|
|
5639
|
+
price: number | null; // dollars
|
|
5640
|
+
whatsIncluded: string;
|
|
5641
|
+
}
|
|
5642
|
+
|
|
5643
|
+
interface HandyproCategorySearch {
|
|
5644
|
+
zipcode: string;
|
|
5645
|
+
covered: boolean;
|
|
5646
|
+
message?: string; // present only when covered is false
|
|
5647
|
+
categories: HandyproCategoryPrice[];
|
|
5648
|
+
}
|
|
5649
|
+
|
|
5650
|
+
/**
|
|
5651
|
+
* HandyPro's real service-area coverage and per-category job pricing — checks whether a ZIP is
|
|
5652
|
+
* served by a real local franchisee (with its own live hourly rate table) and prices
|
|
5653
|
+
* HandyPro's actual handyman/home-modification categories (grab bars, appliance install, TV
|
|
5654
|
+
* mounting, painting, and more) for that ZIP, rather than a researched nationwide estimate.
|
|
5655
|
+
*/
|
|
5656
|
+
interface Unit {
|
|
5657
|
+
/**
|
|
5658
|
+
* Checks whether a ZIP is served by a real local HandyPro franchisee and returns that
|
|
5659
|
+
* franchisee's own real hourly rate table. covered is false with a message for a ZIP outside
|
|
5660
|
+
* HandyPro's online booking area — an honest, ordinary answer, not an error.
|
|
5661
|
+
*/
|
|
5662
|
+
checkServiceArea(zipcode: string): Promise<HandyproServiceArea>;
|
|
5663
|
+
|
|
5664
|
+
/**
|
|
5665
|
+
* Lists HandyPro's real service categories priced for one ZIP's franchisee (a free estimate or
|
|
5666
|
+
* a real fixed job price, and what's included), optionally narrowed by a free-text query (e.g.
|
|
5667
|
+
* "grab bar"). covered is false with a message for a ZIP outside the service area.
|
|
5668
|
+
*/
|
|
5669
|
+
searchServiceCategories(zipcode: string, query?: string): Promise<HandyproCategorySearch>;
|
|
5670
|
+
}
|
|
5671
|
+
}
|
|
5672
|
+
|
|
5673
|
+
declare namespace BowmarkProvider_harmar {
|
|
5674
|
+
// ── Harmar Mobility — the unit's own declarations, verbatim ──
|
|
5675
|
+
interface HarmarVehicleModel {
|
|
5676
|
+
make: string;
|
|
5677
|
+
modelId: string;
|
|
5678
|
+
model: string;
|
|
5679
|
+
}
|
|
5680
|
+
|
|
5681
|
+
interface HarmarChairModel {
|
|
5682
|
+
chairId: string;
|
|
5683
|
+
model: string;
|
|
5684
|
+
}
|
|
5685
|
+
|
|
5686
|
+
interface HarmarLiftOption {
|
|
5687
|
+
code: string;
|
|
5688
|
+
name: string;
|
|
5689
|
+
description: string;
|
|
5690
|
+
required: boolean;
|
|
5691
|
+
}
|
|
5692
|
+
|
|
5693
|
+
interface HarmarCompatibleLift {
|
|
5694
|
+
liftId: string;
|
|
5695
|
+
productCode: string;
|
|
5696
|
+
name: string;
|
|
5697
|
+
requiredAccessories: HarmarLiftOption[];
|
|
5698
|
+
optionalAccessories: HarmarLiftOption[];
|
|
5699
|
+
}
|
|
5700
|
+
|
|
5701
|
+
interface HarmarCompatibleLiftsResult {
|
|
5702
|
+
year: string;
|
|
5703
|
+
vehicleId: string;
|
|
5704
|
+
chairId: string;
|
|
5705
|
+
lifts: HarmarCompatibleLift[];
|
|
5706
|
+
}
|
|
5707
|
+
|
|
5708
|
+
interface HarmarFindCompatibleLiftsResult extends HarmarCompatibleLiftsResult {
|
|
5709
|
+
vehicleMake: string;
|
|
5710
|
+
vehicleModel: string;
|
|
5711
|
+
chairMake: string;
|
|
5712
|
+
chairModel: string;
|
|
5713
|
+
}
|
|
5714
|
+
|
|
5715
|
+
/**
|
|
5716
|
+
* Harmar's Vehicle Compatibility Calculator (calculator.harmar.com) — given a vehicle and a
|
|
5717
|
+
* wheelchair/scooter, returns the real Harmar vehicle lifts that fit that combination.
|
|
5718
|
+
*/
|
|
5719
|
+
interface Unit {
|
|
5720
|
+
/**
|
|
5721
|
+
* Every vehicle (make + calculator's own model id) the compatibility calculator has data for
|
|
5722
|
+
* in a given model year.
|
|
5723
|
+
*/
|
|
5724
|
+
searchVehicleModels(arg: { year: string }): Promise<HarmarVehicleModel[]>;
|
|
5725
|
+
|
|
5726
|
+
/** Every wheelchair/scooter model the calculator has data for under a given manufacturer make. */
|
|
5727
|
+
searchChairModels(arg: { make: string }): Promise<HarmarChairModel[]>;
|
|
5728
|
+
|
|
5729
|
+
/**
|
|
5730
|
+
* Runs the calculator's own 'Lift Lookup' against its internal vehicle/chair ids and returns
|
|
5731
|
+
* the compatible Harmar lifts.
|
|
5732
|
+
*/
|
|
5733
|
+
getCompatibleLifts(arg: { year: string, vehicleId: string, chairId: string }): Promise<HarmarCompatibleLiftsResult>;
|
|
5734
|
+
|
|
5735
|
+
/**
|
|
5736
|
+
* The whole goal-flow in one call: plain vehicle year/make/model + chair make/model, resolved
|
|
5737
|
+
* to the calculator's own ids and run through the real Lift Lookup.
|
|
5738
|
+
*/
|
|
5739
|
+
findCompatibleLifts(arg: { year: string, vehicleMake: string, vehicleModel: string, chairMake: string, chairModel: string }): Promise<HarmarFindCompatibleLiftsResult>;
|
|
5740
|
+
}
|
|
5741
|
+
}
|
|
5742
|
+
|
|
5743
|
+
declare namespace BowmarkProvider_hauslabs {
|
|
5744
|
+
// ── Haus Labs by Lady Gaga — the unit's own declarations, verbatim ──
|
|
5745
|
+
interface HauslabsVariant {
|
|
5746
|
+
id: string;
|
|
5747
|
+
title: string;
|
|
5748
|
+
price: string;
|
|
5749
|
+
compareAtPrice: string | null;
|
|
5750
|
+
sku: string | null;
|
|
5751
|
+
available: boolean;
|
|
5752
|
+
options: string[];
|
|
5753
|
+
}
|
|
5754
|
+
interface HauslabsProduct {
|
|
5755
|
+
handle: string;
|
|
5756
|
+
title: string;
|
|
5757
|
+
vendor: string;
|
|
5758
|
+
productType: string;
|
|
5759
|
+
url: string;
|
|
5760
|
+
descriptionHtml: string | null;
|
|
5761
|
+
optionNames: string[];
|
|
5762
|
+
variants: HauslabsVariant[];
|
|
5763
|
+
priceRange: { min: string; max: string } | null;
|
|
5764
|
+
inStock: boolean;
|
|
5765
|
+
tags: string[];
|
|
5766
|
+
images: string[];
|
|
5767
|
+
}
|
|
5768
|
+
interface HauslabsShadeMatch {
|
|
5769
|
+
quiz: { family: string; depth: string; undertone: string; hasAddOne: boolean };
|
|
5770
|
+
variant: {
|
|
5771
|
+
number: number;
|
|
5772
|
+
family: string;
|
|
5773
|
+
id: string;
|
|
5774
|
+
sku: string | null;
|
|
5775
|
+
price: string;
|
|
5776
|
+
available: boolean;
|
|
5777
|
+
};
|
|
5778
|
+
product: HauslabsProduct;
|
|
5779
|
+
warnings: string[];
|
|
5780
|
+
}
|
|
5781
|
+
|
|
5782
|
+
/**
|
|
5783
|
+
* Haus Labs by Lady Gaga product catalogue — every clean-beauty SKU, its variants, its prices
|
|
5784
|
+
* and what is in stock — read off the live Shopify Plus storefront. The Foundation Shade
|
|
5785
|
+
* Finder is the broadcast wedge: a multi-step quiz ChatGPT cannot operate, mapped locally to
|
|
5786
|
+
* one specific priced shade with the buy-page handoff.
|
|
5787
|
+
*/
|
|
5788
|
+
interface Unit {
|
|
5789
|
+
/**
|
|
5790
|
+
* Reads the live Haus Labs catalogue as the storefront publishes it — every product, its
|
|
5791
|
+
* handle, title, vendor, description, tags, images and the per-variant price the storefront is
|
|
5792
|
+
* quoting right now. Optional productType narrows to FACE / LIPS / EYES / SETS / etc. before
|
|
5793
|
+
* the limit. Returns [] on a transport failure (warnings would be on an object envelope; this
|
|
5794
|
+
* is a list). The catalog page is the line and the parse is the unit of work.
|
|
5795
|
+
*/
|
|
5796
|
+
listHauslabsProducts(opts?: { limit?: number; productType?: string }): Promise<HauslabsProduct[]>;
|
|
5797
|
+
|
|
5798
|
+
/**
|
|
5799
|
+
* Reads one product by its handle — every variant, its exact price, the image the storefront
|
|
5800
|
+
* is showing and whether that specific variant is purchasable right now. Takes the handle
|
|
5801
|
+
* listHauslabsProducts returns. THROWS on an unknown handle (the store answers a real 404).
|
|
5802
|
+
*/
|
|
5803
|
+
getHauslabsProduct(handle: string): Promise<HauslabsProduct>;
|
|
5804
|
+
|
|
5805
|
+
/**
|
|
5806
|
+
* Resolves a buyer's Foundation Lab quiz answers to ONE specific shade: the variant title, the
|
|
5807
|
+
* SKU, the real price, the availability, the buy-page URL. Mirrors the quiz's `shadeLogic`
|
|
5808
|
+
* decision tree natively against Cartful Solutions' published `pd.json` (keyless, browserless)
|
|
5809
|
+
* and resolves the matching variant through /products/<handle>.js for live price and stock.
|
|
5810
|
+
* The quiz is a 5-step Shopify section ChatGPT cannot operate on the buyer's behalf; this
|
|
5811
|
+
* function returns the single shade the quiz's terminal page renders for the same inputs.
|
|
5812
|
+
*/
|
|
5813
|
+
runFoundationShadeFinder(input: { family: 'Deep' | 'Medium Deep' | 'Medium' | 'Light Medium' | 'Light' | 'Fair'; depth: 'deeper' | 'medium' | 'lighter'; undertone: 'warm' | 'cool' | 'neutral' | 'rosy' | 'golden'; hasAddOne?: boolean }): Promise<HauslabsShadeMatch>;
|
|
5814
|
+
}
|
|
5815
|
+
}
|
|
5816
|
+
|
|
5113
5817
|
declare namespace BowmarkProvider_healthcare_gov {
|
|
5114
5818
|
// ── HealthCare.gov — the unit's own declarations, verbatim ──
|
|
5115
5819
|
interface healthcare_govPlan {
|
|
@@ -5999,6 +6703,78 @@ interface hiltonRoomOffer {
|
|
|
5999
6703
|
}
|
|
6000
6704
|
}
|
|
6001
6705
|
|
|
6706
|
+
declare namespace BowmarkProvider_hobie {
|
|
6707
|
+
// ── Hobie Cat Company — the unit's own declarations, verbatim ──
|
|
6708
|
+
interface HobieModelSummary {
|
|
6709
|
+
slug: string;
|
|
6710
|
+
name: string;
|
|
6711
|
+
url: string;
|
|
6712
|
+
}
|
|
6713
|
+
interface HobieModelColor {
|
|
6714
|
+
color: string;
|
|
6715
|
+
upc: string;
|
|
6716
|
+
}
|
|
6717
|
+
interface HobieModelColors {
|
|
6718
|
+
slug: string;
|
|
6719
|
+
name: string;
|
|
6720
|
+
defaultColor: string;
|
|
6721
|
+
colors: HobieModelColor[];
|
|
6722
|
+
}
|
|
6723
|
+
interface HobieDealer {
|
|
6724
|
+
storeId: number;
|
|
6725
|
+
name: string;
|
|
6726
|
+
address: string;
|
|
6727
|
+
city: string;
|
|
6728
|
+
state: string;
|
|
6729
|
+
zip: string;
|
|
6730
|
+
phoneNumber: string;
|
|
6731
|
+
latitude: number;
|
|
6732
|
+
longitude: number;
|
|
6733
|
+
distanceMiles: number;
|
|
6734
|
+
carriesExactColor: boolean;
|
|
6735
|
+
carriesModel: boolean;
|
|
6736
|
+
carriesBrand: boolean;
|
|
6737
|
+
stockStatus: string;
|
|
6738
|
+
stockDisclaimer: string;
|
|
6739
|
+
}
|
|
6740
|
+
interface HobieLocalAvailability {
|
|
6741
|
+
slug: string;
|
|
6742
|
+
modelName: string;
|
|
6743
|
+
color: string;
|
|
6744
|
+
upc: string;
|
|
6745
|
+
zip: string;
|
|
6746
|
+
dealers: HobieDealer[];
|
|
6747
|
+
dealersCarryingExactColor: number;
|
|
6748
|
+
dealersCarryingModel: number;
|
|
6749
|
+
}
|
|
6750
|
+
|
|
6751
|
+
/**
|
|
6752
|
+
* Reads Hobie Cat Company's own real-time 'Find it Locally' dealer-inventory widget directly —
|
|
6753
|
+
* which real dealer near a zip has a specific kayak model, IN A SPECIFIC COLOR, in stock right
|
|
6754
|
+
* now. Kayaks are dealer-distribution only; there is no first-party checkout.
|
|
6755
|
+
*/
|
|
6756
|
+
interface Unit {
|
|
6757
|
+
/**
|
|
6758
|
+
* Lists every real kayak model Hobie currently sells (slug, display name, its own hobie.com
|
|
6759
|
+
* URL), read straight from the live /kayaks/ index.
|
|
6760
|
+
*/
|
|
6761
|
+
listModels(): Promise<HobieModelSummary[]>;
|
|
6762
|
+
|
|
6763
|
+
/**
|
|
6764
|
+
* Reads one model's real buildable colors, each paired with the exact UPC the local-inventory
|
|
6765
|
+
* widget is keyed on, plus the site's own default color.
|
|
6766
|
+
*/
|
|
6767
|
+
listModelColors(slug: string): Promise<HobieModelColors>;
|
|
6768
|
+
|
|
6769
|
+
/**
|
|
6770
|
+
* Runs Hobie's own real-time 'Find it Locally' widget for one model + color near a US zip and
|
|
6771
|
+
* returns real nearby dealers with Hobie's own exact-color / model / brand carrying flags.
|
|
6772
|
+
* `color` defaults to the site's own default color when omitted.
|
|
6773
|
+
*/
|
|
6774
|
+
checkLocalAvailability(slug: string, color: string | undefined, zip: string): Promise<HobieLocalAvailability>;
|
|
6775
|
+
}
|
|
6776
|
+
}
|
|
6777
|
+
|
|
6002
6778
|
declare namespace BowmarkProvider_hunter {
|
|
6003
6779
|
// ── Hunter — the unit's own declarations, verbatim ──
|
|
6004
6780
|
interface hunterDomainCandidate {
|
|
@@ -7215,6 +7991,47 @@ interface InteriorDefineCartHandoff {
|
|
|
7215
7991
|
}
|
|
7216
7992
|
}
|
|
7217
7993
|
|
|
7994
|
+
declare namespace BowmarkProvider_islllc {
|
|
7995
|
+
// ── Integral Senior Living — the unit's own declarations, verbatim ──
|
|
7996
|
+
type IsllcCareType = "assisted_living" | "independent_living" | "memory_care" | "respite_care";
|
|
7997
|
+
|
|
7998
|
+
interface IsllcCommunity {
|
|
7999
|
+
id: string;
|
|
8000
|
+
name: string;
|
|
8001
|
+
address: string;
|
|
8002
|
+
city: string;
|
|
8003
|
+
state: string;
|
|
8004
|
+
zip: string;
|
|
8005
|
+
phone: string;
|
|
8006
|
+
careTypes: string;
|
|
8007
|
+
lat: number;
|
|
8008
|
+
lng: number;
|
|
8009
|
+
url: string;
|
|
8010
|
+
}
|
|
8011
|
+
|
|
8012
|
+
interface IsllcSearchCommunitiesResult {
|
|
8013
|
+
location: string;
|
|
8014
|
+
geocodedLat: number;
|
|
8015
|
+
geocodedLng: number;
|
|
8016
|
+
careTypes: IsllcCareType[];
|
|
8017
|
+
radiusMiles: number;
|
|
8018
|
+
communities: IsllcCommunity[];
|
|
8019
|
+
}
|
|
8020
|
+
|
|
8021
|
+
/**
|
|
8022
|
+
* Integral Senior Living's own community locator (islllc.com/communities/) — given a US
|
|
8023
|
+
* city/state or ZIP, plus optional care type(s) and radius, returns the real, nearest-first
|
|
8024
|
+
* set of matching ISL communities.
|
|
8025
|
+
*/
|
|
8026
|
+
interface Unit {
|
|
8027
|
+
/**
|
|
8028
|
+
* Runs the site's own community locator: a US location + optional care type(s) and radius,
|
|
8029
|
+
* returns the real, nearest-first matching ISL communities.
|
|
8030
|
+
*/
|
|
8031
|
+
searchCommunities(arg: { location: string, careTypes?: IsllcCareType[], radiusMiles?: number, maxResults?: number }): Promise<IsllcSearchCommunitiesResult>;
|
|
8032
|
+
}
|
|
8033
|
+
}
|
|
8034
|
+
|
|
7218
8035
|
declare namespace BowmarkProvider_joybird {
|
|
7219
8036
|
// ── Joybird — the unit's own declarations, verbatim ──
|
|
7220
8037
|
interface JoybirdConfigurator {
|
|
@@ -7451,6 +8268,106 @@ interface KayakCar {
|
|
|
7451
8268
|
}
|
|
7452
8269
|
}
|
|
7453
8270
|
|
|
8271
|
+
declare namespace BowmarkProvider_kitchentuneup {
|
|
8272
|
+
// ── Kitchen Tune-Up — the unit's own declarations, verbatim ──
|
|
8273
|
+
interface KitchentuneupCabinetStyle {
|
|
8274
|
+
featureDefinitionId: number;
|
|
8275
|
+
name: string;
|
|
8276
|
+
group: string | null;
|
|
8277
|
+
thumbnailUrl: string | null;
|
|
8278
|
+
}
|
|
8279
|
+
|
|
8280
|
+
interface KitchentuneupVisualization {
|
|
8281
|
+
resultImageUrl: string;
|
|
8282
|
+
appliedFeatureIds: number[];
|
|
8283
|
+
}
|
|
8284
|
+
|
|
8285
|
+
/**
|
|
8286
|
+
* Kitchen Tune-Up's own AI Design Tool — the live cabinet door/color/finish catalog, and
|
|
8287
|
+
* photo-in/AI-visualization-out generation, run the way kitchentuneup.com/design-tool/ does.
|
|
8288
|
+
*/
|
|
8289
|
+
interface Unit {
|
|
8290
|
+
/**
|
|
8291
|
+
* Reads Kitchen Tune-Up's own AI Design Tool catalog off its visualizer vendor's API — every
|
|
8292
|
+
* cabinet door style / color / finish feature currently enabled for the kitchen visualizer,
|
|
8293
|
+
* with the featureDefinitionId visualizeKitchen needs to apply it. Real catalog data, not a
|
|
8294
|
+
* marketing page scrape.
|
|
8295
|
+
*/
|
|
8296
|
+
listCabinetStyles(): Promise<KitchentuneupCabinetStyle[]>;
|
|
8297
|
+
|
|
8298
|
+
/**
|
|
8299
|
+
* Runs a photo through Kitchen Tune-Up's own AI Design Tool the way
|
|
8300
|
+
* kitchentuneup.com/design-tool/ does — uploads the photo plus one or more chosen cabinet
|
|
8301
|
+
* features (from listCabinetStyles) to their visualizer vendor's AI image pipeline and returns
|
|
8302
|
+
* the generated visualization image URL. This is the exact functional gap this packet's ANGLE
|
|
8303
|
+
* fit-check recorded: ChatGPT knows the AI Design Tool exists but explicitly refuses to
|
|
8304
|
+
* operate it ('I can't operate Kitchen Tune-Up's website on your behalf') and bounces the user
|
|
8305
|
+
* back to the site.
|
|
8306
|
+
*/
|
|
8307
|
+
visualizeKitchen(args: { photoBase64: string, photoFileName?: string, featureDefinitionIds: number[] }): Promise<KitchentuneupVisualization>;
|
|
8308
|
+
}
|
|
8309
|
+
}
|
|
8310
|
+
|
|
8311
|
+
declare namespace BowmarkProvider_kompan {
|
|
8312
|
+
// ── KOMPAN Master — the unit's own declarations, verbatim ──
|
|
8313
|
+
// KOMPAN Master's OWN shapes — not a capability contract.
|
|
8314
|
+
|
|
8315
|
+
type KompanRegion = "region_america" | "region_europe_middleeast" | "region_asia_newzealand" | "region_australia";
|
|
8316
|
+
|
|
8317
|
+
interface KompanVariant {
|
|
8318
|
+
id: string; // pass to getSparePartsDocuments()
|
|
8319
|
+
title: string; // e.g. "PCM157-0205 | UNIVERSAL CAROUSEL"
|
|
8320
|
+
}
|
|
8321
|
+
|
|
8322
|
+
interface KompanSearchResult {
|
|
8323
|
+
productNo: string;
|
|
8324
|
+
region: KompanRegion;
|
|
8325
|
+
found: boolean; // false is a real "no such product number in this region" answer
|
|
8326
|
+
image: string | null;
|
|
8327
|
+
variants: KompanVariant[];
|
|
8328
|
+
}
|
|
8329
|
+
|
|
8330
|
+
interface KompanDocument {
|
|
8331
|
+
section: string; // the site's own heading, e.g. "Layout Drawing", "Installation Instruction"
|
|
8332
|
+
label: string;
|
|
8333
|
+
url: string;
|
|
8334
|
+
}
|
|
8335
|
+
|
|
8336
|
+
interface KompanSparePartsDocuments {
|
|
8337
|
+
variantId: string;
|
|
8338
|
+
purchaseDate: string;
|
|
8339
|
+
title: string | null;
|
|
8340
|
+
documents: KompanDocument[];
|
|
8341
|
+
fullPackageUrl: string | null; // generated on fetch by the site — the URL to fetch, not a static file
|
|
8342
|
+
}
|
|
8343
|
+
|
|
8344
|
+
/**
|
|
8345
|
+
* KOMPAN's own spare-parts / TÜV-certificate / maintenance-manual lookup (KOMPAN Master) —
|
|
8346
|
+
* search a KOMPAN playground product number for its real installed variants, then read the
|
|
8347
|
+
* exact layout drawing, installation instruction, general instruction, on-demand full-package
|
|
8348
|
+
* PDF and language-specific inspection checklists / maintenance manuals for one variant +
|
|
8349
|
+
* purchase date, off the site's own live tool rather than a researched guess.
|
|
8350
|
+
*/
|
|
8351
|
+
interface Unit {
|
|
8352
|
+
/**
|
|
8353
|
+
* Searches KOMPAN Master for a product number (e.g. "PCM157") in one region (default
|
|
8354
|
+
* "region_america") and lists every real installed variant of it — each with the internal item
|
|
8355
|
+
* id getSparePartsDocuments() takes. `found: false` is a real, expected answer for a product
|
|
8356
|
+
* number with no record in that region, not an error.
|
|
8357
|
+
*/
|
|
8358
|
+
searchProduct(productNo: string, region?: KompanRegion): Promise<KompanSearchResult>;
|
|
8359
|
+
|
|
8360
|
+
/**
|
|
8361
|
+
* Reads the real spare-parts / TÜV-certificate / maintenance-manual documents KOMPAN Master
|
|
8362
|
+
* publishes for one variant (an id from searchProduct()) at one purchase date ("YYYY-MM-DD",
|
|
8363
|
+
* since the site keys the applicable document revision off it) — layout drawing, installation
|
|
8364
|
+
* instruction, general instruction, additional checklists/manuals, and the on-demand "full
|
|
8365
|
+
* package" PDF URL.
|
|
8366
|
+
*/
|
|
8367
|
+
getSparePartsDocuments(variantId: string, purchaseDate: string): Promise<KompanSparePartsDocuments>;
|
|
8368
|
+
}
|
|
8369
|
+
}
|
|
8370
|
+
|
|
7454
8371
|
declare namespace BowmarkProvider_labcorp {
|
|
7455
8372
|
// ── Labcorp — the unit's own declarations, verbatim ──
|
|
7456
8373
|
interface LabcorpTestSummary {
|
|
@@ -7877,6 +8794,61 @@ interface LonelyPlanetSearchResult {
|
|
|
7877
8794
|
}
|
|
7878
8795
|
}
|
|
7879
8796
|
|
|
8797
|
+
declare namespace BowmarkProvider_louvershop {
|
|
8798
|
+
// ── Louver Shop Shutters — the unit's own declarations, verbatim ──
|
|
8799
|
+
interface LouvershopBranch {
|
|
8800
|
+
id: number;
|
|
8801
|
+
name: string;
|
|
8802
|
+
link: string;
|
|
8803
|
+
tel: string;
|
|
8804
|
+
}
|
|
8805
|
+
|
|
8806
|
+
interface LouvershopLocalArea {
|
|
8807
|
+
zip: string;
|
|
8808
|
+
city: string;
|
|
8809
|
+
state: string;
|
|
8810
|
+
stateCode: string;
|
|
8811
|
+
}
|
|
8812
|
+
|
|
8813
|
+
interface LouvershopConsultant {
|
|
8814
|
+
id: number;
|
|
8815
|
+
name: string;
|
|
8816
|
+
link: string;
|
|
8817
|
+
}
|
|
8818
|
+
|
|
8819
|
+
interface LouvershopAvailability {
|
|
8820
|
+
exteriorDecorative: boolean;
|
|
8821
|
+
exteriorSecurity: boolean;
|
|
8822
|
+
}
|
|
8823
|
+
|
|
8824
|
+
interface FindLocalDealerResult {
|
|
8825
|
+
zip: string;
|
|
8826
|
+
inServiceArea: boolean;
|
|
8827
|
+
branch: LouvershopBranch | null;
|
|
8828
|
+
area: LouvershopLocalArea | null;
|
|
8829
|
+
consultants: LouvershopConsultant[];
|
|
8830
|
+
availability: LouvershopAvailability | null;
|
|
8831
|
+
}
|
|
8832
|
+
|
|
8833
|
+
/**
|
|
8834
|
+
* Window treatments (interior/exterior shutters, blinds, shades) dealer network.
|
|
8835
|
+
* findLocalDealer is live — the same lookup the site's own free-quote/consultant-locator forms
|
|
8836
|
+
* run before showing a booking path, given a ZIP. requestConsultation (submitting the actual
|
|
8837
|
+
* in-home consultation request) is a stub — see its notImplemented reason.
|
|
8838
|
+
*/
|
|
8839
|
+
interface Unit {
|
|
8840
|
+
/**
|
|
8841
|
+
* Looks up the Louver Shop dealer/branch that covers a US ZIP (`zip`, a 4-5 digit string, e.g.
|
|
8842
|
+
* "30301") — the same lookup the site's own "Free In-Home Design Consultation" form and "Find
|
|
8843
|
+
* a Consultant" locator both run before offering a booking path. Returns whether the ZIP is in
|
|
8844
|
+
* the dealer network, the matched branch (name, phone, page slug), the normalized local area,
|
|
8845
|
+
* the branch's assigned consultants (deduplicated), and per-branch exterior-shutter
|
|
8846
|
+
* availability flags. Recovered from the locator widget's own backend, not guessed at.
|
|
8847
|
+
*/
|
|
8848
|
+
findLocalDealer(args: object): Promise<FindLocalDealerResult>;
|
|
8849
|
+
}
|
|
8850
|
+
}
|
|
8851
|
+
|
|
7880
8852
|
declare namespace BowmarkProvider_lufthansa {
|
|
7881
8853
|
// ── Lufthansa — the unit's own declarations, verbatim ──
|
|
7882
8854
|
interface LufthansaFlightLeg {
|
|
@@ -7976,6 +8948,80 @@ interface LululemonVariant {
|
|
|
7976
8948
|
available: boolean;
|
|
7977
8949
|
price: number | null;
|
|
7978
8950
|
salePrice: number | null;
|
|
8951
|
+
/** Why this SKU's price is, or is not, a markdown. Derived from price and
|
|
8952
|
+
* salePrice, so it can never disagree with them. */
|
|
8953
|
+
sale: SaleEvidence;
|
|
8954
|
+
}
|
|
8955
|
+
interface SaleEvidence {
|
|
8956
|
+
/** True only with retailer evidence. NEVER from a low price or a title. */
|
|
8957
|
+
onSale: boolean;
|
|
8958
|
+
currentPrice: number | null;
|
|
8959
|
+
/** The list price, when the markdown is against one. */
|
|
8960
|
+
originalPrice: number | null;
|
|
8961
|
+
/** ISO 4217, or null. ALWAYS null here: this feed publishes bare numbers with
|
|
8962
|
+
* no currency code anywhere in the payload. */
|
|
8963
|
+
currency: string | null;
|
|
8964
|
+
promotionMessage: string | null;
|
|
8965
|
+
evidenceType: "compare_at_price" | "sale_price" | "retailer_sale_badge" | "published_promotion" | "none";
|
|
8966
|
+
/** The retailer text or field the classification rests on, verbatim. */
|
|
8967
|
+
evidenceText: string | null;
|
|
8968
|
+
}
|
|
8969
|
+
interface ProductImage {
|
|
8970
|
+
/** Absolute HTTPS url. */
|
|
8971
|
+
url: string;
|
|
8972
|
+
altText: string | null;
|
|
8973
|
+
/** The colourway's own colour — sound because lululemon publishes its image
|
|
8974
|
+
* list PER COLOURWAY, so every picture in it is that colour by construction. */
|
|
8975
|
+
color: string | null;
|
|
8976
|
+
colorId: string | null;
|
|
8977
|
+
/** Always [] here: this feed links a picture to a COLOUR, never to a size. */
|
|
8978
|
+
variantIds: string[];
|
|
8979
|
+
}
|
|
8980
|
+
/** The retailer's own labels. On this door that is audience and nothing else —
|
|
8981
|
+
* the HPDP feed publishes no description, tags, fabric, collection or category.
|
|
8982
|
+
* Every other field is null or [], honestly. */
|
|
8983
|
+
interface PublishedProductAttributes {
|
|
8984
|
+
audience: string | null;
|
|
8985
|
+
garmentType: "sports_bra" | "tank" | "crop_top" | "leggings" | "shorts" | "other" | null;
|
|
8986
|
+
categories: string[];
|
|
8987
|
+
collections: string[];
|
|
8988
|
+
fabrics: string[];
|
|
8989
|
+
materials: string[];
|
|
8990
|
+
color: string | null;
|
|
8991
|
+
colorFamily: string | null;
|
|
8992
|
+
pattern: string | null;
|
|
8993
|
+
styleTags: string[];
|
|
8994
|
+
neckline: string | null;
|
|
8995
|
+
strapWidth: string | null;
|
|
8996
|
+
backDesign: string | null;
|
|
8997
|
+
sleeveLength: string | null;
|
|
8998
|
+
rise: string | null;
|
|
8999
|
+
waistband: string | null;
|
|
9000
|
+
inseam: string | null;
|
|
9001
|
+
legShape: string | null;
|
|
9002
|
+
fit: string | null;
|
|
9003
|
+
coverage: string | null;
|
|
9004
|
+
}
|
|
9005
|
+
/** Shared colour and family — what makes two pieces PLAUSIBLY coordinate. None
|
|
9006
|
+
* of it establishes a set. */
|
|
9007
|
+
interface CoordinationMetadata {
|
|
9008
|
+
collectionNames: string[];
|
|
9009
|
+
fabricNames: string[];
|
|
9010
|
+
colorName: string | null;
|
|
9011
|
+
colorId: string | null;
|
|
9012
|
+
colorFamily: string | null;
|
|
9013
|
+
productFamily: string | null;
|
|
9014
|
+
}
|
|
9015
|
+
/** An EXPLICIT retailer-published relationship. ALWAYS [] on this door: the feed's
|
|
9016
|
+
* only product-to-product relation is the ALGORITHMIC similarity rail, which is
|
|
9017
|
+
* getSimilarProducts. Reading that as a set would turn "the recommender put these
|
|
9018
|
+
* near each other" into "lululemon sells these together". */
|
|
9019
|
+
interface RetailerSetEvidence {
|
|
9020
|
+
evidenceType: "official_set" | "shop_the_set" | "complete_the_look" | "matching_piece";
|
|
9021
|
+
evidenceText: string | null;
|
|
9022
|
+
sourceUrl: string | null;
|
|
9023
|
+
setId: string | null;
|
|
9024
|
+
relatedProducts: Array<{ productId: string | null; handle: string | null; title: string | null; url: string | null }>;
|
|
7979
9025
|
}
|
|
7980
9026
|
interface LululemonOptionGroup {
|
|
7981
9027
|
/** The machine name. "size" on every lululemon product measured. */
|
|
@@ -7997,6 +9043,13 @@ interface LululemonColorway {
|
|
|
7997
9043
|
url: string;
|
|
7998
9044
|
swatchImage: string | null;
|
|
7999
9045
|
images: string[];
|
|
9046
|
+
/** The SAME pictures as images, carrying this colourway's colour and colorId.
|
|
9047
|
+
* images stays a bare string[] for existing callers; this is the additive half. */
|
|
9048
|
+
imageAssets: ProductImage[];
|
|
9049
|
+
sale: SaleEvidence;
|
|
9050
|
+
coordination: CoordinationMetadata;
|
|
9051
|
+
/** ISO 4217, or null. Always null — see SaleEvidence.currency. */
|
|
9052
|
+
currency: string | null;
|
|
8000
9053
|
inStock: boolean;
|
|
8001
9054
|
optionGroups: LululemonOptionGroup[];
|
|
8002
9055
|
/** What can be BOUGHT in this colour right now — not the full size run. */
|
|
@@ -8024,6 +9077,82 @@ interface LululemonProduct {
|
|
|
8024
9077
|
/** Other lengths of the same style. Empty on every product measured — on this
|
|
8025
9078
|
* site an inseam is its OWN product, not an option. */
|
|
8026
9079
|
sizeTypes: LululemonSizeType[];
|
|
9080
|
+
attributes: PublishedProductAttributes;
|
|
9081
|
+
coordination: CoordinationMetadata;
|
|
9082
|
+
retailerSetEvidence: RetailerSetEvidence[];
|
|
9083
|
+
}
|
|
9084
|
+
/** One published product-detail block from the page, verbatim. */
|
|
9085
|
+
interface LululemonFeature {
|
|
9086
|
+
heading: string;
|
|
9087
|
+
body: string;
|
|
9088
|
+
}
|
|
9089
|
+
/** What lululemon's OWN product page publishes about a garment, which the
|
|
9090
|
+
* third-party pricing door does not carry at all. */
|
|
9091
|
+
interface LululemonProductAttributes {
|
|
9092
|
+
productId: string;
|
|
9093
|
+
url: string;
|
|
9094
|
+
title: string;
|
|
9095
|
+
/** The site's own ProductGroup category, e.g. "Leggings". */
|
|
9096
|
+
category: string | null;
|
|
9097
|
+
description: string | null;
|
|
9098
|
+
/** Trademarked fabric names off the detail accordion, e.g. ["Nulu"]. */
|
|
9099
|
+
fabrics: string[];
|
|
9100
|
+
fit: string | null;
|
|
9101
|
+
/** "High-Rise" / "Mid-Rise" / "Low-Rise", as the title spells it. */
|
|
9102
|
+
rise: string | null;
|
|
9103
|
+
/** Every detail block, unmapped and in page order. */
|
|
9104
|
+
features: LululemonFeature[];
|
|
9105
|
+
/** The site's own aggregate — the honest one. The pricing door reports 0
|
|
9106
|
+
* reviews on products whose live page shows 22,748. */
|
|
9107
|
+
ratingValue: number | null;
|
|
9108
|
+
reviewCount: number | null;
|
|
9109
|
+
/** Per-FIELD origin for the eight facts above, keyed by the same names. THIS
|
|
9110
|
+
* is how a refused read is told apart from a garment with nothing published:
|
|
9111
|
+
* fabrics [] beside status "absent" is lululemon saying it names no fabric,
|
|
9112
|
+
* and fabrics [] beside status "unreachable" is the page refusing us. Ranking
|
|
9113
|
+
* that treats the two alike silently prefers whichever candidates loaded. */
|
|
9114
|
+
provenance: Record<string, FieldProvenance>;
|
|
9115
|
+
/** The roll-up. On a refused page ratio is 0 and unreachableFields names all
|
|
9116
|
+
* eight — the machine-readable form of the sentence in warnings. */
|
|
9117
|
+
completeness: Completeness;
|
|
9118
|
+
/** What could not be reached. Non-empty means the page refused. */
|
|
9119
|
+
warnings: string[];
|
|
9120
|
+
}
|
|
9121
|
+
/** Where one field's value came from, and the retailer text behind it. */
|
|
9122
|
+
interface FieldProvenance {
|
|
9123
|
+
/** "published" — lululemon stated it. "absent" — the page rendered and said
|
|
9124
|
+
* nothing about this field. "unreachable" — the page refused, so UNKNOWN. */
|
|
9125
|
+
status: "published" | "absent" | "unreachable";
|
|
9126
|
+
/** Which door: "lululemon_pdp_ldjson", "lululemon_pdp_accordion" or
|
|
9127
|
+
* "lululemon_pdp_title". Null when nothing filled it. */
|
|
9128
|
+
source: string | null;
|
|
9129
|
+
/** The retailer's own words the value rests on, for a field derived from
|
|
9130
|
+
* prose. Null for a field the site published as a typed value. */
|
|
9131
|
+
evidence: string | null;
|
|
9132
|
+
/** On "unreachable" only: what was refused. */
|
|
9133
|
+
detail?: string;
|
|
9134
|
+
}
|
|
9135
|
+
interface Completeness {
|
|
9136
|
+
fields: number;
|
|
9137
|
+
published: number;
|
|
9138
|
+
absent: number;
|
|
9139
|
+
unreachable: number;
|
|
9140
|
+
/** published / fields, to 3dp. */
|
|
9141
|
+
ratio: number;
|
|
9142
|
+
/** The fields that are UNKNOWN rather than known-empty. */
|
|
9143
|
+
unreachableFields: string[];
|
|
9144
|
+
sourcesUsed: string[];
|
|
9145
|
+
}
|
|
9146
|
+
/** What getProducts returns. PARTIAL by construction — the pricing catalogue
|
|
9147
|
+
* holds ~39% of the ids in lululemon's own sitemap, so ids it does not carry are
|
|
9148
|
+
* NAMED rather than silently dropped or thrown over. */
|
|
9149
|
+
interface LululemonProductBatch {
|
|
9150
|
+
/** In the order the ids were passed, not the order they finished. */
|
|
9151
|
+
products: LululemonProduct[];
|
|
9152
|
+
/** Every id that did not read, with the catalogue's own sentence. */
|
|
9153
|
+
missing: Array<{ productId: string; detail: string }>;
|
|
9154
|
+
requested: number;
|
|
9155
|
+
warnings: string[];
|
|
8027
9156
|
}
|
|
8028
9157
|
interface LululemonRow {
|
|
8029
9158
|
id: string;
|
|
@@ -8079,6 +9208,30 @@ interface LululemonSimilarProducts {
|
|
|
8079
9208
|
*/
|
|
8080
9209
|
getProduct(query: { productId: string }): Promise<LululemonProduct>;
|
|
8081
9210
|
|
|
9211
|
+
/**
|
|
9212
|
+
* Reads the full configurator for MANY products in one call — the shape to use when ranking a
|
|
9213
|
+
* candidate set, because a `search` row carries a price range and a colour count but not the
|
|
9214
|
+
* per-colourway sizes, markdown evidence or images a ranking turns on. Returns `products` in
|
|
9215
|
+
* the order the ids were passed. PARTIAL is the normal answer: the pricing catalogue holds
|
|
9216
|
+
* roughly 39% of the ids in lululemon's own sitemap, so ids it does not carry come back in
|
|
9217
|
+
* `missing` with the catalogue's own sentence, and one of them never costs the other rows. At
|
|
9218
|
+
* most 24 ids — the same cap `search` returns — so one full search page is always one batch.
|
|
9219
|
+
*/
|
|
9220
|
+
getProducts(query: { productIds: string[] }): Promise<LululemonProductBatch>;
|
|
9221
|
+
|
|
9222
|
+
/**
|
|
9223
|
+
* Reads what lululemon's OWN product page publishes about a garment and the third-party
|
|
9224
|
+
* pricing door does not carry at all: the category the site files it under, the collection
|
|
9225
|
+
* description, the trademarked fabric it is cut from, the fit and the rise, its real review
|
|
9226
|
+
* aggregate, and every product-detail block verbatim. This is the expensive door on this
|
|
9227
|
+
* provider — a headed Google Chrome, ~10-20x the latency of `getProduct` — so call it when the
|
|
9228
|
+
* ATTRIBUTES are the answer and `getProduct` when the price, colourways and sizes are. It
|
|
9229
|
+
* never throws on a refused page: a page that will not render comes back with every field
|
|
9230
|
+
* empty and a `warnings` entry naming it, so an empty `fabrics` is distinguishable from an
|
|
9231
|
+
* unread one.
|
|
9232
|
+
*/
|
|
9233
|
+
getProductAttributes(query: { productId: string }): Promise<LululemonProductAttributes>;
|
|
9234
|
+
|
|
8082
9235
|
/**
|
|
8083
9236
|
* Returns the products lululemon's own product pages recommend alongside one product — the
|
|
8084
9237
|
* 'You may also like' rail — as priced rows in the store's own ranked order, de-duplicated to
|
|
@@ -8091,6 +9244,82 @@ interface LululemonSimilarProducts {
|
|
|
8091
9244
|
}
|
|
8092
9245
|
}
|
|
8093
9246
|
|
|
9247
|
+
declare namespace BowmarkProvider_maidenhome {
|
|
9248
|
+
// ── Maiden Home — the unit's own declarations, verbatim ──
|
|
9249
|
+
// Maiden Home's OWN shapes — not a capability contract.
|
|
9250
|
+
|
|
9251
|
+
interface MaidenHomeVariant {
|
|
9252
|
+
productHandle: string;
|
|
9253
|
+
productTitle: string;
|
|
9254
|
+
productType: string; // e.g. "Sofa", "Modular Component", "Dining Table"
|
|
9255
|
+
size: string; // e.g. "85\" Width", or a non-numeric value like "Right-Facing Chaise"
|
|
9256
|
+
woodFinish: string; // e.g. "Driftwood Ash"
|
|
9257
|
+
sku: string;
|
|
9258
|
+
price: number;
|
|
9259
|
+
priceFormatted: string;
|
|
9260
|
+
available: boolean;
|
|
9261
|
+
url: string; // the product page, preselecting this exact variant
|
|
9262
|
+
}
|
|
9263
|
+
|
|
9264
|
+
interface MaidenHomeConfiguratorProduct {
|
|
9265
|
+
handle: string;
|
|
9266
|
+
title: string;
|
|
9267
|
+
productType: string;
|
|
9268
|
+
url: string;
|
|
9269
|
+
sizeOptions: string[];
|
|
9270
|
+
woodFinishOptions: string[];
|
|
9271
|
+
priceRange: { min: number; max: number };
|
|
9272
|
+
variants: MaidenHomeVariant[];
|
|
9273
|
+
}
|
|
9274
|
+
|
|
9275
|
+
interface MaidenHomeVariantResolution {
|
|
9276
|
+
productQuery: string;
|
|
9277
|
+
size: string;
|
|
9278
|
+
woodFinish: string;
|
|
9279
|
+
matched: boolean;
|
|
9280
|
+
variant: MaidenHomeVariant | null;
|
|
9281
|
+
candidates: MaidenHomeVariant[]; // populated when not narrowed to exactly one real variant
|
|
9282
|
+
message: string;
|
|
9283
|
+
}
|
|
9284
|
+
|
|
9285
|
+
/**
|
|
9286
|
+
* Maiden Home's Size x Wood Finish product configurator (sofas, sectionals/modular components,
|
|
9287
|
+
* tables) — list every configurable product, read one product's complete priced variant grid,
|
|
9288
|
+
* and resolve a free-text product + size + wood finish to the exact live price and SKU, off
|
|
9289
|
+
* the storefront's own live catalog rather than a researched estimate or a hedged price range.
|
|
9290
|
+
*/
|
|
9291
|
+
interface Unit {
|
|
9292
|
+
/**
|
|
9293
|
+
* Lists every Maiden Home product configurable by Size x Wood Finish (sofas,
|
|
9294
|
+
* sectionals/modular components, tables) from the storefront's own live catalog — every size
|
|
9295
|
+
* and wood-finish option, its live price range and variant count. `query` (optional) narrows
|
|
9296
|
+
* the list by a fuzzy match on the product title or product type, e.g. "chelsea" or "dining
|
|
9297
|
+
* table".
|
|
9298
|
+
*/
|
|
9299
|
+
searchConfigurations(query?: string): Promise<MaidenHomeConfiguratorProduct[]>;
|
|
9300
|
+
|
|
9301
|
+
/**
|
|
9302
|
+
* Reads one configurator product's complete Size x Wood Finish variant grid — a handle, e.g.
|
|
9303
|
+
* "the-chelsea-sofa-heritage-belgian-linen-lake" — every size x finish combination, each with
|
|
9304
|
+
* its own exact live price, SKU and availability. THROWS on an unrecognized handle, naming
|
|
9305
|
+
* searchConfigurations() as the way to find current ones.
|
|
9306
|
+
*/
|
|
9307
|
+
getProduct(handle: string): Promise<MaidenHomeConfiguratorProduct>;
|
|
9308
|
+
|
|
9309
|
+
/**
|
|
9310
|
+
* Resolves a free-text product (e.g. "Chelsea Sofa Heritage Belgian Linen Lake"), size (e.g.
|
|
9311
|
+
* "85\"") and wood finish (e.g. "Driftwood Ash") to the exact priced variant and its product
|
|
9312
|
+
* URL, mirroring the on-page configurator's own selection flow. `matched: true` with a
|
|
9313
|
+
* populated `variant` means exactly one real variant narrowed to; otherwise `candidates` lists
|
|
9314
|
+
* every real variant the product query DID match, so a caller can narrow with an exact
|
|
9315
|
+
* size/finish rather than guessing again. Never throws for an ambiguous or zero match — an
|
|
9316
|
+
* unmatched product name is the one case this DOES treat as a caller error (throws, naming
|
|
9317
|
+
* searchConfigurations()).
|
|
9318
|
+
*/
|
|
9319
|
+
resolveVariant(productQuery: string, size: string, woodFinish: string): Promise<MaidenHomeVariantResolution>;
|
|
9320
|
+
}
|
|
9321
|
+
}
|
|
9322
|
+
|
|
8094
9323
|
declare namespace BowmarkProvider_mailchimp {
|
|
8095
9324
|
// ── Mailchimp — the unit's own declarations, verbatim ──
|
|
8096
9325
|
interface mailchimpPlanTier {
|
|
@@ -9980,13 +11209,30 @@ interface PaypalFeeSchedule {
|
|
|
9980
11209
|
sourceUrl: string;
|
|
9981
11210
|
tables: PaypalFeeTable[];
|
|
9982
11211
|
}
|
|
11212
|
+
type PaypalConversionKind = "goodsOrServices" | "personal" | "payouts" | "other";
|
|
11213
|
+
interface PaypalCurrencyConversionCitation {
|
|
11214
|
+
documentId: string; // the CMS table id this figure came from, e.g. "FEETB26"
|
|
11215
|
+
feeDataKey: string; // the exact published value used, e.g. "4.00%"
|
|
11216
|
+
internalName: string;
|
|
11217
|
+
}
|
|
11218
|
+
interface PaypalGetCurrencyConversionQuoteArgs {
|
|
11219
|
+
kind?: PaypalConversionKind; // "goodsOrServices" | "personal" | "payouts" | "other"
|
|
11220
|
+
audience?: "consumer"; // defaults to "consumer"; merchant is a separate, unverified page
|
|
11221
|
+
country?: string; // ISO 3166-1 alpha-2, defaults to "us"; only "us" is verified end-to-end
|
|
11222
|
+
}
|
|
11223
|
+
interface PaypalCurrencyConversionQuote {
|
|
11224
|
+
kind: PaypalConversionKind; // which PayPal-conversion context the spread applies to
|
|
11225
|
+
paypalSpread: number; // 0.04 for goodsOrServices/personal/payouts; 0.03 for "other"
|
|
11226
|
+
citations: { paypal: PaypalCurrencyConversionCitation };
|
|
11227
|
+
}
|
|
9983
11228
|
|
|
9984
11229
|
/**
|
|
9985
11230
|
* PayPal's public, signed-out surfaces: the published consumer and merchant fee schedules, the
|
|
9986
|
-
* fee on one concrete personal (friends-and-family) transaction,
|
|
9987
|
-
*
|
|
9988
|
-
*
|
|
9989
|
-
*
|
|
11231
|
+
* fee on one concrete personal (friends-and-family) transaction, the spread PayPal adds on a
|
|
11232
|
+
* currency conversion, Pay Later instalment plans, PayPal.Me handle lookup, Help Center search
|
|
11233
|
+
* and articles, the binding policy documents, PayPal Shopping cashback offers, crypto prices,
|
|
11234
|
+
* and invoice payer-view reads. Three functions callable today — estimateFee, getFees,
|
|
11235
|
+
* getCurrencyConversionQuote.
|
|
9990
11236
|
*/
|
|
9991
11237
|
interface Unit {
|
|
9992
11238
|
/**
|
|
@@ -10006,6 +11252,18 @@ interface PaypalFeeSchedule {
|
|
|
10006
11252
|
* been fetched.
|
|
10007
11253
|
*/
|
|
10008
11254
|
getFees(args: PaypalGetFeesArgs): Promise<PaypalFeeSchedule>;
|
|
11255
|
+
|
|
11256
|
+
/**
|
|
11257
|
+
* Reads PayPal's published currency-conversion spread — the half of its fee it DOES disclose —
|
|
11258
|
+
* off the same fees page (FEETB26, 4.00% for goodsOrServices/personal/payouts, 3.00% for
|
|
11259
|
+
* "other"), e.g. getCurrencyConversionQuote({ kind: "goodsOrServices" }) -> { kind:
|
|
11260
|
+
* "goodsOrServices", paypalSpread: 0.04, citations: { paypal: { documentId: "FEETB26",
|
|
11261
|
+
* feeDataKey: "4.00%", internalName: "..." } } }. PayPal does NOT publish the wholesale base
|
|
11262
|
+
* rate, so this function returns only the spread; combining it with a base rate from another
|
|
11263
|
+
* provider (e.g. bowmark.providers.oanda.convertCurrency) is the capability tier's job, not a
|
|
11264
|
+
* single provider's. consumer / us only today.
|
|
11265
|
+
*/
|
|
11266
|
+
getCurrencyConversionQuote(args: PaypalGetCurrencyConversionQuoteArgs): Promise<PaypalCurrencyConversionQuote>;
|
|
10009
11267
|
}
|
|
10010
11268
|
}
|
|
10011
11269
|
|
|
@@ -10373,6 +11631,77 @@ interface PizzahutDealsForRender {
|
|
|
10373
11631
|
}
|
|
10374
11632
|
}
|
|
10375
11633
|
|
|
11634
|
+
declare namespace BowmarkProvider_premierbuildings {
|
|
11635
|
+
// ── Premier Portable Buildings — the unit's own declarations, verbatim ──
|
|
11636
|
+
interface PremierbuildingsStyle {
|
|
11637
|
+
key: string;
|
|
11638
|
+
label: string;
|
|
11639
|
+
sidingOptions: string[];
|
|
11640
|
+
sizes: { sizeKey: string; width: number; length: number }[];
|
|
11641
|
+
imageUrl: string | null; // a real product image from Premier's own catalogue
|
|
11642
|
+
roofStyle: string | null; // "gable", "gambrel", ...
|
|
11643
|
+
roofing: string | null; // "metal", ...
|
|
11644
|
+
wallHeight: string | null; // Premier's own encoding in inches, e.g. "left-78-right-78-eave-72"
|
|
11645
|
+
}
|
|
11646
|
+
interface PremierbuildingsPrice {
|
|
11647
|
+
styleKey: string;
|
|
11648
|
+
model: string;
|
|
11649
|
+
sizeKey: string;
|
|
11650
|
+
width: number;
|
|
11651
|
+
length: number;
|
|
11652
|
+
sidingKey: string;
|
|
11653
|
+
zip: string;
|
|
11654
|
+
region: string;
|
|
11655
|
+
basePrice: number;
|
|
11656
|
+
sidingSurcharge: number;
|
|
11657
|
+
total: number;
|
|
11658
|
+
currency: "USD";
|
|
11659
|
+
}
|
|
11660
|
+
interface PremierbuildingsDealer {
|
|
11661
|
+
key: string;
|
|
11662
|
+
name: string;
|
|
11663
|
+
city: string;
|
|
11664
|
+
state: string;
|
|
11665
|
+
zip: string;
|
|
11666
|
+
phoneNumber: string;
|
|
11667
|
+
dealerURL: string;
|
|
11668
|
+
}
|
|
11669
|
+
|
|
11670
|
+
/**
|
|
11671
|
+
* Reads Premier Portable Buildings' own ShedView 3D configurator pricing catalogue — building
|
|
11672
|
+
* styles, real available sizes, and region-exact siding surcharges — plus its real dealer
|
|
11673
|
+
* directory.
|
|
11674
|
+
*/
|
|
11675
|
+
interface Unit {
|
|
11676
|
+
/**
|
|
11677
|
+
* Lists every real building style Premier's ShedView configurator offers (Lofted Barn,
|
|
11678
|
+
* Utility, Cabin, Garage, ...) with its real siding options, every real buildable size (width
|
|
11679
|
+
* x length), and what the building actually IS — a real product image, the roof line and
|
|
11680
|
+
* roofing material, and Premier's own wall-height spec — read straight from the configurator's
|
|
11681
|
+
* own live catalogue.
|
|
11682
|
+
*/
|
|
11683
|
+
listBuildingStyles(): Promise<PremierbuildingsStyle[]>;
|
|
11684
|
+
|
|
11685
|
+
/**
|
|
11686
|
+
* Prices one real Premier building configuration exactly the way ShedView itself does: the
|
|
11687
|
+
* base price for `styleKey` + `sizeKey` in the pricing region `zip` falls under, plus the
|
|
11688
|
+
* EXACT siding surcharge Premier's own rules add for `sidingKey` at that width and region (0
|
|
11689
|
+
* for the default "urethane-siding"; a real dollar amount, never a guess, for an alternative
|
|
11690
|
+
* like "metal" — the surcharge genuinely varies by both region and building width).
|
|
11691
|
+
* `sidingKey` defaults to "urethane-siding" (Premier's standard siding) when omitted.
|
|
11692
|
+
*/
|
|
11693
|
+
priceBuilding(styleKey: string, sizeKey: string, sidingKey: string | undefined, zip: string): Promise<PremierbuildingsPrice>;
|
|
11694
|
+
|
|
11695
|
+
/**
|
|
11696
|
+
* Looks up Premier's real dealer locations in one US state or Canadian province (accepts
|
|
11697
|
+
* either a full name like "Tennessee" or an abbreviation like "TN") — name, city, phone, and
|
|
11698
|
+
* the dealer's own ShedView URL, straight from Premier's live dealer directory, for handing a
|
|
11699
|
+
* priced configuration off to order.
|
|
11700
|
+
*/
|
|
11701
|
+
findDealers(state: string): Promise<PremierbuildingsDealer[]>;
|
|
11702
|
+
}
|
|
11703
|
+
}
|
|
11704
|
+
|
|
10376
11705
|
declare namespace BowmarkProvider_progressive {
|
|
10377
11706
|
// ── Progressive — the unit's own declarations, verbatim ──
|
|
10378
11707
|
// Progressive's OWN shapes — not a capability contract.
|
|
@@ -11685,6 +13014,55 @@ interface SearsStock {
|
|
|
11685
13014
|
}
|
|
11686
13015
|
}
|
|
11687
13016
|
|
|
13017
|
+
declare namespace BowmarkProvider_seegarsfence {
|
|
13018
|
+
// ── Seegars Fence Company — the unit's own declarations, verbatim ──
|
|
13019
|
+
interface SeegarsBranch {
|
|
13020
|
+
id: number;
|
|
13021
|
+
name: string;
|
|
13022
|
+
address1: string;
|
|
13023
|
+
city: string;
|
|
13024
|
+
state: string;
|
|
13025
|
+
zip: string;
|
|
13026
|
+
salesEmail: string;
|
|
13027
|
+
salesPhone: string;
|
|
13028
|
+
webSite: string;
|
|
13029
|
+
outsideServiceAreaText: string;
|
|
13030
|
+
serviceArea: string;
|
|
13031
|
+
}
|
|
13032
|
+
|
|
13033
|
+
interface SeegarsGeocodedAddress {
|
|
13034
|
+
address1: string;
|
|
13035
|
+
city: string;
|
|
13036
|
+
state: string;
|
|
13037
|
+
zip: string;
|
|
13038
|
+
displayName: string;
|
|
13039
|
+
latitude: number;
|
|
13040
|
+
longitude: number;
|
|
13041
|
+
}
|
|
13042
|
+
|
|
13043
|
+
interface CheckServiceAreaResult {
|
|
13044
|
+
address: SeegarsGeocodedAddress;
|
|
13045
|
+
inServiceArea: boolean;
|
|
13046
|
+
branch: SeegarsBranch;
|
|
13047
|
+
}
|
|
13048
|
+
|
|
13049
|
+
/**
|
|
13050
|
+
* Fence/gate installer (Carolinas). checkServiceArea is live — geocodes an address and reports
|
|
13051
|
+
* whether it's inside Seegars' service area, plus the branch that would handle it.
|
|
13052
|
+
* estimateFencePrice (the actual priced estimate) is a stub — see its notImplemented reason.
|
|
13053
|
+
*/
|
|
13054
|
+
interface Unit {
|
|
13055
|
+
/**
|
|
13056
|
+
* Geocodes a free-text address (`address`, e.g. "301 Fayetteville St, Raleigh, NC 27601")
|
|
13057
|
+
* against Seegars Fence's own address-lookup API, then checks it against the branch's
|
|
13058
|
+
* published service-area polygon — the same check the site's own Fence Price Estimator Tool
|
|
13059
|
+
* performs before it will show any pricing. Returns the normalized address, whether it falls
|
|
13060
|
+
* inside the service area, and the branch (name, phone, email, address) that would handle it.
|
|
13061
|
+
*/
|
|
13062
|
+
checkServiceArea(args: object): Promise<CheckServiceAreaResult>;
|
|
13063
|
+
}
|
|
13064
|
+
}
|
|
13065
|
+
|
|
11688
13066
|
declare namespace BowmarkProvider_selectblinds {
|
|
11689
13067
|
// ── SelectBlinds — the unit's own declarations, verbatim ──
|
|
11690
13068
|
// SelectBlinds' OWN shapes — not a capability contract.
|
|
@@ -12414,6 +13792,60 @@ interface SunHomeSaunasCartResult {
|
|
|
12414
13792
|
}
|
|
12415
13793
|
}
|
|
12416
13794
|
|
|
13795
|
+
declare namespace BowmarkProvider_target {
|
|
13796
|
+
// ── Target — the unit's own declarations, verbatim ──
|
|
13797
|
+
interface targetRow {
|
|
13798
|
+
id: string;
|
|
13799
|
+
}
|
|
13800
|
+
|
|
13801
|
+
interface TargetStoreHoursInterval {
|
|
13802
|
+
begin_time: string;
|
|
13803
|
+
end_date: string;
|
|
13804
|
+
end_time: string;
|
|
13805
|
+
}
|
|
13806
|
+
|
|
13807
|
+
interface TargetStoreHoursDay {
|
|
13808
|
+
is_open: boolean;
|
|
13809
|
+
date: string;
|
|
13810
|
+
day_name: string;
|
|
13811
|
+
hours: TargetStoreHoursInterval[];
|
|
13812
|
+
}
|
|
13813
|
+
|
|
13814
|
+
interface TargetStoreGeoSpec {
|
|
13815
|
+
iso_time_zone_code: string;
|
|
13816
|
+
time_zone_code: string;
|
|
13817
|
+
time_zone_utc_offset_name: string;
|
|
13818
|
+
}
|
|
13819
|
+
|
|
13820
|
+
interface TargetStore {
|
|
13821
|
+
id: string;
|
|
13822
|
+
slug: string;
|
|
13823
|
+
name: string;
|
|
13824
|
+
address: string;
|
|
13825
|
+
phone: string | null;
|
|
13826
|
+
geoSpec: TargetStoreGeoSpec | null;
|
|
13827
|
+
weeklyHours: TargetStoreHoursDay[];
|
|
13828
|
+
}
|
|
13829
|
+
|
|
13830
|
+
interface TargetStoreSearch {
|
|
13831
|
+
query: string;
|
|
13832
|
+
stores: TargetStore[];
|
|
13833
|
+
warnings: string[];
|
|
13834
|
+
}
|
|
13835
|
+
|
|
13836
|
+
/**
|
|
13837
|
+
* Big-box general merchandise — search, product detail, store stock and store lookup on
|
|
13838
|
+
* target.com.
|
|
13839
|
+
*/
|
|
13840
|
+
interface Unit {
|
|
13841
|
+
/**
|
|
13842
|
+
* Searches the store-locator for nearby Targets by ZIP, partial ZIP, city, or street+city, and
|
|
13843
|
+
* returns each store's id, slug, name, address, phone, time-zone and 14-day weekly hours.
|
|
13844
|
+
*/
|
|
13845
|
+
findStore(args: { query: string }): Promise<TargetStoreSearch>;
|
|
13846
|
+
}
|
|
13847
|
+
}
|
|
13848
|
+
|
|
12417
13849
|
declare namespace BowmarkProvider_teladoc {
|
|
12418
13850
|
// ── Teladoc Health — the unit's own declarations, verbatim ──
|
|
12419
13851
|
interface teladocRow {
|
|
@@ -13145,6 +14577,40 @@ interface thezebraAutoQuotes {
|
|
|
13145
14577
|
}
|
|
13146
14578
|
}
|
|
13147
14579
|
|
|
14580
|
+
declare namespace BowmarkProvider_topviewtix {
|
|
14581
|
+
// ── TopView Sightseeing — the unit's own declarations, verbatim ──
|
|
14582
|
+
interface topviewtixPackageDetails {
|
|
14583
|
+
id: number;
|
|
14584
|
+
slug: string;
|
|
14585
|
+
name: string;
|
|
14586
|
+
description: string;
|
|
14587
|
+
url: string;
|
|
14588
|
+
adultsPrice: number | null;
|
|
14589
|
+
kidsPrice: number | null;
|
|
14590
|
+
isAdultOnly: boolean;
|
|
14591
|
+
availableDates: string[];
|
|
14592
|
+
blockedDates: string[];
|
|
14593
|
+
soldOutDates: string[];
|
|
14594
|
+
availableUntil: string | null;
|
|
14595
|
+
}
|
|
14596
|
+
|
|
14597
|
+
/**
|
|
14598
|
+
* TopView's NYC hop-on-hop-off bus, Statue of Liberty cruise and bike/walking tour packages —
|
|
14599
|
+
* getPackageDetails reads one package's live price and its own real-time booking calendar
|
|
14600
|
+
* (available/blocked/sold-out dates) off topviewtix.com/new-york/<slug>.
|
|
14601
|
+
*/
|
|
14602
|
+
interface Unit {
|
|
14603
|
+
/**
|
|
14604
|
+
* Reads one TopView tour package in full — name, description, adult/kid price, and the site's
|
|
14605
|
+
* OWN live booking calendar (which dates are open, blocked, or sold out, and how far out the
|
|
14606
|
+
* calendar reaches). Takes `slug`, the package's own URL slug off
|
|
14607
|
+
* topviewtix.com/new-york/<slug> (e.g. "hop-on-hop-off-pass"). Throws if the slug doesn't
|
|
14608
|
+
* resolve to a real package (a clean 404) rather than returning an empty row.
|
|
14609
|
+
*/
|
|
14610
|
+
getPackageDetails(args: object): Promise<topviewtixPackageDetails>;
|
|
14611
|
+
}
|
|
14612
|
+
}
|
|
14613
|
+
|
|
13148
14614
|
declare namespace BowmarkProvider_trektravel {
|
|
13149
14615
|
// ── Trek Travel — the unit's own declarations, verbatim ──
|
|
13150
14616
|
// Trek Travel's OWN shapes — not a capability contract.
|
|
@@ -13767,15 +15233,57 @@ interface wellfoundCompanyDetail {
|
|
|
13767
15233
|
* experience-requirement text and the hiring startup.
|
|
13768
15234
|
*/
|
|
13769
15235
|
getJob(args: { url: string }): Promise<wellfoundJobDetail>;
|
|
15236
|
+
}
|
|
15237
|
+
}
|
|
13770
15238
|
|
|
15239
|
+
declare namespace BowmarkProvider_yourarborhome {
|
|
15240
|
+
// ── Arbor Homes — the unit's own declarations, verbatim ──
|
|
15241
|
+
interface ArborHome {
|
|
15242
|
+
uniqueName: string;
|
|
15243
|
+
headline: string;
|
|
15244
|
+
status: string;
|
|
15245
|
+
price: number | null;
|
|
15246
|
+
beds: number | null;
|
|
15247
|
+
bathsFull: number | null;
|
|
15248
|
+
bathsHalf: number | null;
|
|
15249
|
+
sqft: number | null;
|
|
15250
|
+
stories: number | null;
|
|
15251
|
+
moveInDate: string | null;
|
|
15252
|
+
address: { street: string; city: string; state: string; postalCode: string };
|
|
15253
|
+
detailUrl: string | null;
|
|
15254
|
+
selfTourUrl: string | null;
|
|
15255
|
+
}
|
|
15256
|
+
interface SearchHomesFilters {
|
|
15257
|
+
city?: string;
|
|
15258
|
+
minPrice?: number;
|
|
15259
|
+
maxPrice?: number;
|
|
15260
|
+
minBeds?: number;
|
|
15261
|
+
minBaths?: number;
|
|
15262
|
+
minSqft?: number;
|
|
15263
|
+
status?: string;
|
|
15264
|
+
}
|
|
15265
|
+
|
|
15266
|
+
/**
|
|
15267
|
+
* Arbor Homes — Indiana/Ohio/Kentucky new-construction homebuilder (Clayton Properties Group).
|
|
15268
|
+
* searchHomes reads its live quick-move-in inventory (price, beds/baths/sqft, status,
|
|
15269
|
+
* availability); getHome reads one listing by id. Both return the site's own NterNow
|
|
15270
|
+
* self-guided-tour booking link where the listing has it enabled.
|
|
15271
|
+
*/
|
|
15272
|
+
interface Unit {
|
|
13771
15273
|
/**
|
|
13772
|
-
* Reads
|
|
13773
|
-
*
|
|
13774
|
-
*
|
|
13775
|
-
*
|
|
13776
|
-
* applying to it. Takes the `slug` a `searchCompanies` row already carries.
|
|
15274
|
+
* Reads Arbor Homes' live quick move-in inventory off yourarborhome.com/homes and returns rows
|
|
15275
|
+
* matching the optional filters (city, price range, min beds/baths/sqft, status) — real price,
|
|
15276
|
+
* beds/baths, square footage, an availability date and, where the listing has it enabled,
|
|
15277
|
+
* Arbor's own NterNow self-guided-tour booking link.
|
|
13777
15278
|
*/
|
|
13778
|
-
|
|
15279
|
+
searchHomes(filters?: SearchHomesFilters): Promise<ArborHome[]>;
|
|
15280
|
+
|
|
15281
|
+
/**
|
|
15282
|
+
* Reads one Arbor Homes listing by the `uniqueName` id `searchHomes` returns — the same row,
|
|
15283
|
+
* for a caller that already picked a home and wants its detail-page URL and self-tour link
|
|
15284
|
+
* without re-filtering the whole search.
|
|
15285
|
+
*/
|
|
15286
|
+
getHome(uniqueName: string): Promise<ArborHome>;
|
|
13779
15287
|
}
|
|
13780
15288
|
}
|
|
13781
15289
|
|
|
@@ -13793,6 +15301,148 @@ interface ShopifyVariant {
|
|
|
13793
15301
|
/** The store's own per-variant stock flag. */
|
|
13794
15302
|
available: boolean;
|
|
13795
15303
|
options: string[];
|
|
15304
|
+
/** The same values keyed by the option's own NAME — { Color: "Black", Size: "S" }.
|
|
15305
|
+
* Read THIS to filter by size; options[1] is only the size on a store that
|
|
15306
|
+
* happens to order it second. {} when the two lists cannot be reconciled. */
|
|
15307
|
+
selectedOptions: Record<string, string>;
|
|
15308
|
+
/** The image the STORE linked to this variant. Usually NULL — most storefronts
|
|
15309
|
+
* publish no image-to-variant link at all, and null says so rather than
|
|
15310
|
+
* handing back the first product picture. */
|
|
15311
|
+
image: ProductImage | null;
|
|
15312
|
+
/** Why this price is, or is not, a markdown. */
|
|
15313
|
+
sale: SaleEvidence;
|
|
15314
|
+
}
|
|
15315
|
+
interface ProductImage {
|
|
15316
|
+
/** Absolute HTTPS url, at the largest rendition the CDN serves. */
|
|
15317
|
+
url: string;
|
|
15318
|
+
/** The retailer's own alt text, or null. */
|
|
15319
|
+
altText: string | null;
|
|
15320
|
+
/** The retailer's colour name for this picture. Set when the store links it,
|
|
15321
|
+
* or when the whole product is ONE colourway (which is how both yoga
|
|
15322
|
+
* retailers publish: one colour per product). Null otherwise. */
|
|
15323
|
+
color: string | null;
|
|
15324
|
+
colorId: string | null;
|
|
15325
|
+
/** Variant ids the STORE linked. [] means it published no link — NOT that the
|
|
15326
|
+
* image belongs to every variant. */
|
|
15327
|
+
variantIds: string[];
|
|
15328
|
+
}
|
|
15329
|
+
interface SaleEvidence {
|
|
15330
|
+
/** True only with retailer evidence. NEVER set from a low price or from the
|
|
15331
|
+
* word "sale" in a title. */
|
|
15332
|
+
onSale: boolean;
|
|
15333
|
+
currentPrice: string | null;
|
|
15334
|
+
/** The published "was" price. Strictly greater than currentPrice when
|
|
15335
|
+
* evidenceType is "compare_at_price". Null when nothing published one. */
|
|
15336
|
+
originalPrice: string | null;
|
|
15337
|
+
/** ISO 4217, from the storefront's own /meta.json. Null only when that read
|
|
15338
|
+
* failed — never defaulted to "USD", which is wrong on every non-US store. */
|
|
15339
|
+
currency: string | null;
|
|
15340
|
+
promotionMessage: string | null;
|
|
15341
|
+
/** How it was decided. "compare_at_price" is a struck-through price;
|
|
15342
|
+
* "retailer_sale_badge" is a published sale tag; "none" is not on sale. */
|
|
15343
|
+
evidenceType: "compare_at_price" | "sale_price" | "retailer_sale_badge" | "published_promotion" | "none";
|
|
15344
|
+
/** The retailer text or field the classification rests on, verbatim. */
|
|
15345
|
+
evidenceText: string | null;
|
|
15346
|
+
}
|
|
15347
|
+
/** The retailer's own labels, read off its published tags, category and options.
|
|
15348
|
+
* NEVER inferred from the title or from an image. Null or [] when unpublished,
|
|
15349
|
+
* which is common and is an honest answer. */
|
|
15350
|
+
interface PublishedProductAttributes {
|
|
15351
|
+
audience: string | null;
|
|
15352
|
+
garmentType: "sports_bra" | "tank" | "crop_top" | "leggings" | "shorts" | "other" | null;
|
|
15353
|
+
categories: string[];
|
|
15354
|
+
collections: string[];
|
|
15355
|
+
fabrics: string[];
|
|
15356
|
+
materials: string[];
|
|
15357
|
+
color: string | null;
|
|
15358
|
+
colorFamily: string | null;
|
|
15359
|
+
pattern: string | null;
|
|
15360
|
+
styleTags: string[];
|
|
15361
|
+
neckline: string | null;
|
|
15362
|
+
strapWidth: string | null;
|
|
15363
|
+
backDesign: string | null;
|
|
15364
|
+
sleeveLength: string | null;
|
|
15365
|
+
rise: string | null;
|
|
15366
|
+
waistband: string | null;
|
|
15367
|
+
/** How long the GARMENT is — "Cropped", "Midi". What every store's own
|
|
15368
|
+
* `length::` tag fills, on a top exactly as on a bottom. */
|
|
15369
|
+
garmentLength: string | null;
|
|
15370
|
+
/** The inside leg seam and only that. NULL on a top — a tank has no inseam,
|
|
15371
|
+
* and its length is `garmentLength`. */
|
|
15372
|
+
inseam: string | null;
|
|
15373
|
+
legShape: string | null;
|
|
15374
|
+
fit: string | null;
|
|
15375
|
+
coverage: string | null;
|
|
15376
|
+
}
|
|
15377
|
+
/** Shared colour, fabric, collection and style family — what makes two garments
|
|
15378
|
+
* PLAUSIBLY coordinate. None of it establishes a set. */
|
|
15379
|
+
interface CoordinationMetadata {
|
|
15380
|
+
collectionNames: string[];
|
|
15381
|
+
fabricNames: string[];
|
|
15382
|
+
colorName: string | null;
|
|
15383
|
+
colorId: string | null;
|
|
15384
|
+
colorFamily: string | null;
|
|
15385
|
+
/** The store's own grouping key for one style across its colourways. Two
|
|
15386
|
+
* products sharing it are the same garment in two colours. */
|
|
15387
|
+
productFamily: string | null;
|
|
15388
|
+
}
|
|
15389
|
+
/** An EXPLICIT retailer-published relationship. Shared colour, fabric,
|
|
15390
|
+
* collection or family is NOT this — that is CoordinationMetadata. Usually [].
|
|
15391
|
+
*
|
|
15392
|
+
* Two doors fill it. On a PRODUCT row it comes from the store's tags, and no
|
|
15393
|
+
* store measured publishes a set tag, so it is [] there. getSetEvidence() reads
|
|
15394
|
+
* the other one: the complementary products a MERCHANDISER pinned by hand,
|
|
15395
|
+
* admitted only for rows the store marks pr_prod_strat=pinned. The algorithmic
|
|
15396
|
+
* "related products" feed is never read into this — that is a recommendation
|
|
15397
|
+
* engine's output, not the retailer stating a pairing. */
|
|
15398
|
+
interface RetailerSetEvidence {
|
|
15399
|
+
evidenceType: "official_set" | "shop_the_set" | "complete_the_look" | "matching_piece";
|
|
15400
|
+
evidenceText: string | null;
|
|
15401
|
+
sourceUrl: string | null;
|
|
15402
|
+
setId: string | null;
|
|
15403
|
+
relatedProducts: Array<{ productId: string | null; handle: string | null; title: string | null; url: string | null }>;
|
|
15404
|
+
}
|
|
15405
|
+
/** What getSetEvidence returns. An OBJECT rather than a bare array so the
|
|
15406
|
+
* healthy EMPTY answer is still probeable: productId and sourceUrl exist only
|
|
15407
|
+
* when BOTH hops answered, where an empty evidence list is the ordinary case. */
|
|
15408
|
+
interface ShopifySetEvidence {
|
|
15409
|
+
handle: string;
|
|
15410
|
+
/** Shopify's numeric PRODUCT id — the only key the recommendations door takes,
|
|
15411
|
+
* and published by no other function here. */
|
|
15412
|
+
productId: string;
|
|
15413
|
+
/** The product page the pairing is published on. */
|
|
15414
|
+
sourceUrl: string;
|
|
15415
|
+
/** ONLY the rows a merchandiser pinned by hand. [] when they pinned nothing,
|
|
15416
|
+
* which is the common case and is the STORE's answer. At most one entry — one
|
|
15417
|
+
* statement, N related products. Read this for "what did the retailer SAY". */
|
|
15418
|
+
evidence: RetailerSetEvidence[];
|
|
15419
|
+
/** EVERY row the store recommends, pinned AND algorithmic, deduplicated, each
|
|
15420
|
+
* labelled. Read source.by before treating one as the retailer's decision —
|
|
15421
|
+
* the algorithmic rows are usually SUBSTITUTES rather than companions, since
|
|
15422
|
+
* similarity returns the nearest product and the nearest thing to a baby
|
|
15423
|
+
* monitor is another baby monitor. [] when includeAlgorithmic was false. */
|
|
15424
|
+
recommendations: RecommendedProduct[];
|
|
15425
|
+
/** Non-empty when the store returned a FULL page for an intent, which cannot be
|
|
15426
|
+
* told apart from a longer list cut off at the cap. A merchandiser's pairing is
|
|
15427
|
+
* a statement, so a partial one must not read as the whole. */
|
|
15428
|
+
warnings: string[];
|
|
15429
|
+
}
|
|
15430
|
+
/** One recommended product, with the store's own label for who chose it. */
|
|
15431
|
+
interface RecommendedProduct {
|
|
15432
|
+
productId: string | null;
|
|
15433
|
+
handle: string | null;
|
|
15434
|
+
title: string | null;
|
|
15435
|
+
url: string | null;
|
|
15436
|
+
source: RecommendationSource;
|
|
15437
|
+
}
|
|
15438
|
+
interface RecommendationSource {
|
|
15439
|
+
/** "retailer" when a merchandiser pinned it; "algorithm" otherwise, INCLUDING
|
|
15440
|
+
* a row the store labelled with nothing — an unknown provenance must never
|
|
15441
|
+
* read as a person's decision. */
|
|
15442
|
+
by: "retailer" | "algorithm";
|
|
15443
|
+
/** The store's own token, verbatim and unmapped — "pinned", "jac" (Jaccard),
|
|
15444
|
+
* "e" (embedding), "collection_fallback". Null when the row carried none. */
|
|
15445
|
+
strategy: string | null;
|
|
13796
15446
|
}
|
|
13797
15447
|
interface ShopifyProduct {
|
|
13798
15448
|
handle: string;
|
|
@@ -13806,6 +15456,65 @@ interface ShopifyProduct {
|
|
|
13806
15456
|
inStock: boolean;
|
|
13807
15457
|
tags: string[];
|
|
13808
15458
|
descriptionHtml: string | null;
|
|
15459
|
+
/** The same copy with its markup removed. */
|
|
15460
|
+
descriptionText: string | null;
|
|
15461
|
+
/** ISO 4217, read once per store from its own /meta.json. */
|
|
15462
|
+
currency: string | null;
|
|
15463
|
+
/** When the store's door ANSWERED this row, ISO 8601 UTC. Every field here is
|
|
15464
|
+
* a live fact with a shelf life — the price, the markdown, the per-variant
|
|
15465
|
+
* stock flag — so read it before treating a cached row as current. Stamped per
|
|
15466
|
+
* REQUEST: a getProducts batch carries one stamp per handle, not one per call. */
|
|
15467
|
+
fetchedAt: string;
|
|
15468
|
+
/** Every image the door published, deduplicated, in the store's own order. */
|
|
15469
|
+
images: ProductImage[];
|
|
15470
|
+
attributes: PublishedProductAttributes;
|
|
15471
|
+
/** Per-FIELD origin for `attributes` — keyed by the same field names. Read it
|
|
15472
|
+
* before ranking on a null: "absent" is the store publishing nothing, and is
|
|
15473
|
+
* the store's own answer; "unreachable" is a door we could not read, and means
|
|
15474
|
+
* UNKNOWN. On this store both doors are one request that either answered or
|
|
15475
|
+
* threw, so nothing here is ever "unreachable" — the status exists because the
|
|
15476
|
+
* same vocabulary is used by providers whose page can refuse mid-answer. */
|
|
15477
|
+
attributeProvenance: Record<string, FieldProvenance>;
|
|
15478
|
+
attributeCompleteness: Completeness;
|
|
15479
|
+
coordination: CoordinationMetadata;
|
|
15480
|
+
retailerSetEvidence: RetailerSetEvidence[];
|
|
15481
|
+
}
|
|
15482
|
+
/** Where one attribute value came from, and the retailer text behind it. */
|
|
15483
|
+
interface FieldProvenance {
|
|
15484
|
+
/** "published" — the retailer stated it. "absent" — every door was silent.
|
|
15485
|
+
* "unreachable" — a door that would carry it was refused, so it is UNKNOWN. */
|
|
15486
|
+
status: "published" | "absent" | "unreachable";
|
|
15487
|
+
/** Which door: "shopify_tags", "shopify_product_type", "shopify_color_option"
|
|
15488
|
+
* or "shopify_product_copy". Null when nothing filled it. */
|
|
15489
|
+
source: string | null;
|
|
15490
|
+
/** The retailer's own words the value rests on, verbatim — the tag, or the
|
|
15491
|
+
* sentence out of the description. Null when nothing filled it. */
|
|
15492
|
+
evidence: string | null;
|
|
15493
|
+
/** On "unreachable" only: what was refused. */
|
|
15494
|
+
detail?: string;
|
|
15495
|
+
}
|
|
15496
|
+
/** The roll-up over one product's attributeProvenance. */
|
|
15497
|
+
interface Completeness {
|
|
15498
|
+
fields: number;
|
|
15499
|
+
published: number;
|
|
15500
|
+
absent: number;
|
|
15501
|
+
unreachable: number;
|
|
15502
|
+
/** published / fields, to 3dp. */
|
|
15503
|
+
ratio: number;
|
|
15504
|
+
/** The fields whose value is UNKNOWN rather than known-empty. Read this before
|
|
15505
|
+
* comparing two rows: a row with entries here was not fully looked at. */
|
|
15506
|
+
unreachableFields: string[];
|
|
15507
|
+
sourcesUsed: string[];
|
|
15508
|
+
}
|
|
15509
|
+
/** What getProducts returns. PARTIAL by design: one handle the store will not
|
|
15510
|
+
* serve costs that row and nothing else, where getProduct throws. */
|
|
15511
|
+
interface ShopifyProductBatch {
|
|
15512
|
+
/** In the order the handles were passed, not the order they finished. */
|
|
15513
|
+
products: ShopifyProduct[];
|
|
15514
|
+
/** Every handle the store did not serve, with what it said. */
|
|
15515
|
+
missing: Array<{ handle: string; detail: string }>;
|
|
15516
|
+
requested: number;
|
|
15517
|
+
warnings: string[];
|
|
13809
15518
|
}
|
|
13810
15519
|
interface ShopifyCartLine {
|
|
13811
15520
|
/** Shopify's own line key, which its cart-change endpoints address a line by. */
|
|
@@ -13819,6 +15528,70 @@ interface ShopifyCartLine {
|
|
|
13819
15528
|
lineTotal: string;
|
|
13820
15529
|
url: string;
|
|
13821
15530
|
}
|
|
15531
|
+
/** One collection the store publishes — its own merchandised grouping, and the
|
|
15532
|
+
* ONE place either yoga retailer states a set. Membership in a collection the
|
|
15533
|
+
* retailer NAMED "Matching Sets" is a published fact and is admissible as set
|
|
15534
|
+
* evidence; two products being adjacent inside it is NOT, because a position in
|
|
15535
|
+
* a list is not a statement. */
|
|
15536
|
+
interface ShopifyCollection {
|
|
15537
|
+
handle: string;
|
|
15538
|
+
title: string;
|
|
15539
|
+
url: string;
|
|
15540
|
+
descriptionHtml: string | null;
|
|
15541
|
+
/** True when the retailer's OWN title or handle names this a set, a matching
|
|
15542
|
+
* piece or a look. Never inferred from what is inside it. */
|
|
15543
|
+
setLike: boolean;
|
|
15544
|
+
productCount: number | null;
|
|
15545
|
+
updatedAt: string | null;
|
|
15546
|
+
}
|
|
15547
|
+
interface ShopifyCollectionProducts {
|
|
15548
|
+
handle: string;
|
|
15549
|
+
url: string;
|
|
15550
|
+
/** In the RETAILER's own order. Curated collections are merchandised
|
|
15551
|
+
* top-then-bottom; reading a pairing out of that order is the caller's
|
|
15552
|
+
* inference, never this provider's claim. [] is an ordinary answer. */
|
|
15553
|
+
products: ShopifyProduct[];
|
|
15554
|
+
/** Pass back as opts.cursor for the next page, or NULL when this is the last
|
|
15555
|
+
* one. A collection bigger than one page is reachable only through this. */
|
|
15556
|
+
cursor: string | null;
|
|
15557
|
+
/** Empty on an ordinary page. One entry when the walk hit the store platform's
|
|
15558
|
+
* 25,000-row ceiling with the collection unfinished — a TRUNCATION, which a
|
|
15559
|
+
* null cursor on its own would read as the end of the list. */
|
|
15560
|
+
warnings: string[];
|
|
15561
|
+
}
|
|
15562
|
+
/** One page of a whole-catalogue walk. Advance it with the cursor; there is
|
|
15563
|
+
* deliberately no "fetch everything" call, because every row is a request
|
|
15564
|
+
* against the store and only the caller knows how many candidates it needs. */
|
|
15565
|
+
interface ShopifyProductPage {
|
|
15566
|
+
/** In the store's own MERCHANDISED order — not id, not date. The store may
|
|
15567
|
+
* re-merchandise mid-walk, so key on handle rather than assuming pages are
|
|
15568
|
+
* disjoint. */
|
|
15569
|
+
products: ShopifyProduct[];
|
|
15570
|
+
/** Pass back as opts.cursor for the next page. NULL when the store answered a
|
|
15571
|
+
* short page, which is what the end of the catalogue looks like. */
|
|
15572
|
+
cursor: string | null;
|
|
15573
|
+
/** How many rows this page asked the store for. */
|
|
15574
|
+
limit: number;
|
|
15575
|
+
/** Empty on an ordinary page. One entry when the walk stopped at the 25,000-row
|
|
15576
|
+
* ceiling with the catalogue unfinished. */
|
|
15577
|
+
warnings: string[];
|
|
15578
|
+
}
|
|
15579
|
+
/** What resolveProductUrl hands back — the product a url names, and the variant
|
|
15580
|
+
* its own ?variant= selected. */
|
|
15581
|
+
interface ShopifyProductFromUrl {
|
|
15582
|
+
product: ShopifyProduct;
|
|
15583
|
+
/** The variant ?variant= named, or NULL when the url named none — the ordinary
|
|
15584
|
+
* case for a link off a collection page. Also null when it named one the store
|
|
15585
|
+
* no longer publishes, which warnings says. NEVER the first variant instead:
|
|
15586
|
+
* that answers "is my size in stock" about a different size. */
|
|
15587
|
+
variant: ShopifyVariant | null;
|
|
15588
|
+
/** The ?variant= value exactly as the url carried it, kept even when it
|
|
15589
|
+
* matched nothing — a stale link is a fact about the link. */
|
|
15590
|
+
variantIdInUrl: string | null;
|
|
15591
|
+
/** Empty on a clean resolve. One entry when the url named a variant the store
|
|
15592
|
+
* no longer publishes. */
|
|
15593
|
+
warnings: string[];
|
|
15594
|
+
}
|
|
13822
15595
|
interface ShopifyCart {
|
|
13823
15596
|
/** The store's own cart token — a bearer credential, so treat it like one. */
|
|
13824
15597
|
token: string;
|
|
@@ -13846,10 +15619,70 @@ interface ShopifyCart {
|
|
|
13846
15619
|
|
|
13847
15620
|
/**
|
|
13848
15621
|
* Reads one product by handle — every variant, its exact price, its SKU and whether that
|
|
13849
|
-
* specific size or colour is purchasable right now.
|
|
15622
|
+
* specific size or colour is purchasable right now. Pass { withReviews: true } to ALSO get the
|
|
15623
|
+
* star rating and review count from whichever review app the merchant installed; it is off by
|
|
15624
|
+
* default because it costs a second origin and usually the rendered product page too.
|
|
13850
15625
|
*/
|
|
13851
15626
|
getProduct(handle: string): Promise<ShopifyProduct>;
|
|
13852
15627
|
|
|
15628
|
+
/**
|
|
15629
|
+
* Turns a product URL into the product, which is the address a caller actually holds when a
|
|
15630
|
+
* link arrives from a search result, a page or a person. Takes the whole url — origin, market
|
|
15631
|
+
* prefix, ?variant= and #fragment — so nothing has to be stripped down to a bare handle first,
|
|
15632
|
+
* and the variant the url named comes back beside the product instead of being lost. THROWS,
|
|
15633
|
+
* naming the domain, on a url belonging to another storefront. Takes the same { withReviews:
|
|
15634
|
+
* true } option as getProduct, on the same default: a url is another way of naming one
|
|
15635
|
+
* product, so holding a link rather than a handle must not cost a caller the rating.
|
|
15636
|
+
*/
|
|
15637
|
+
resolveProductUrl(url: string): Promise<ShopifyProductFromUrl>;
|
|
15638
|
+
|
|
15639
|
+
/**
|
|
15640
|
+
* Reads FULL detail for many products in one call — the shape for ranking a candidate set,
|
|
15641
|
+
* since a search row carries neither the description copy nor the per-variant stock a ranking
|
|
15642
|
+
* turns on. PARTIAL by construction: a search row's handle may 404 on the Ajax product door
|
|
15643
|
+
* (measured 2026-08-05, 2 of 10 sampled members), so one bad handle is named in `missing` and
|
|
15644
|
+
* costs that row alone, where `getProduct` throws and takes the whole set with it. Capped at
|
|
15645
|
+
* 50 handles because each one is a request to the store. Takes the same { withReviews: true }
|
|
15646
|
+
* option, and is the shape to use for it: the review app's key is learned from the first pages
|
|
15647
|
+
* and reused, so ratings for twenty handles cost a handful of page fetches rather than twenty.
|
|
15648
|
+
*/
|
|
15649
|
+
getProducts(handles: string[]): Promise<ShopifyProductBatch>;
|
|
15650
|
+
|
|
15651
|
+
/**
|
|
15652
|
+
* Walks the store's WHOLE catalogue a page at a time, in its own merchandised order — the
|
|
15653
|
+
* shape that makes a realistic candidate set reachable at all, since search ranks against a
|
|
15654
|
+
* query and returns one slice. The caller advances a cursor and stops on its own budget or on
|
|
15655
|
+
* a null cursor. There is deliberately no fetch-everything call: every row is a request
|
|
15656
|
+
* against a stranger's storefront, and how many candidates a ranking needs is the caller's
|
|
15657
|
+
* decision rather than one taken once, inside the library, on behalf of every member.
|
|
15658
|
+
*/
|
|
15659
|
+
listProducts(opts?: { limit?: number; cursor?: string | null }): Promise<ShopifyProductPage>;
|
|
15660
|
+
|
|
15661
|
+
/**
|
|
15662
|
+
* Lists the store's own merchandised collections. THIS is where a retailer states a SET: a
|
|
15663
|
+
* collection the store itself named "Matching Sets" or "Activewear Sets" carries setLike:
|
|
15664
|
+
* true, and membership in one is published evidence that two garments are sold together.
|
|
15665
|
+
*/
|
|
15666
|
+
listCollections(opts?: { limit?: number }): Promise<ShopifyCollection[]>;
|
|
15667
|
+
|
|
15668
|
+
/**
|
|
15669
|
+
* Reads one collection's products in the retailer's own merchandised order, as full product
|
|
15670
|
+
* rows. An empty list is an ordinary answer — several named 'look' collections publish no
|
|
15671
|
+
* products through this door.
|
|
15672
|
+
*/
|
|
15673
|
+
getCollection(handle: string, opts?: { limit?: number; cursor?: string | null }): Promise<ShopifyCollectionProducts>;
|
|
15674
|
+
|
|
15675
|
+
/**
|
|
15676
|
+
* Two answers in one call. `evidence` is ONLY what a MERCHANDISER pinned by hand, in the order
|
|
15677
|
+
* they typed it — an explicit retailer statement, and [] on most products, which is the
|
|
15678
|
+
* retailer's own answer. `recommendations` is EVERY row the store returns including the
|
|
15679
|
+
* algorithmic ones, each carrying source.by (retailer | algorithm) and the store's own
|
|
15680
|
+
* strategy token, so a caller can use them without either field lying. The algorithmic rows
|
|
15681
|
+
* are usually SUBSTITUTES rather than companions. Pass includeAlgorithmic: false to skip the
|
|
15682
|
+
* second request.
|
|
15683
|
+
*/
|
|
15684
|
+
getSetEvidence(handle: string, opts?: { includeAlgorithmic?: boolean }): Promise<ShopifySetEvidence>;
|
|
15685
|
+
|
|
13853
15686
|
/**
|
|
13854
15687
|
* Puts variants into THIS run's own cart on the store and returns the cart the store reports
|
|
13855
15688
|
* back. A real write: the cart exists on the store from the first call and belongs to this
|
|
@@ -13881,6 +15714,148 @@ interface ShopifyVariant {
|
|
|
13881
15714
|
/** The store's own per-variant stock flag. */
|
|
13882
15715
|
available: boolean;
|
|
13883
15716
|
options: string[];
|
|
15717
|
+
/** The same values keyed by the option's own NAME — { Color: "Black", Size: "S" }.
|
|
15718
|
+
* Read THIS to filter by size; options[1] is only the size on a store that
|
|
15719
|
+
* happens to order it second. {} when the two lists cannot be reconciled. */
|
|
15720
|
+
selectedOptions: Record<string, string>;
|
|
15721
|
+
/** The image the STORE linked to this variant. Usually NULL — most storefronts
|
|
15722
|
+
* publish no image-to-variant link at all, and null says so rather than
|
|
15723
|
+
* handing back the first product picture. */
|
|
15724
|
+
image: ProductImage | null;
|
|
15725
|
+
/** Why this price is, or is not, a markdown. */
|
|
15726
|
+
sale: SaleEvidence;
|
|
15727
|
+
}
|
|
15728
|
+
interface ProductImage {
|
|
15729
|
+
/** Absolute HTTPS url, at the largest rendition the CDN serves. */
|
|
15730
|
+
url: string;
|
|
15731
|
+
/** The retailer's own alt text, or null. */
|
|
15732
|
+
altText: string | null;
|
|
15733
|
+
/** The retailer's colour name for this picture. Set when the store links it,
|
|
15734
|
+
* or when the whole product is ONE colourway (which is how both yoga
|
|
15735
|
+
* retailers publish: one colour per product). Null otherwise. */
|
|
15736
|
+
color: string | null;
|
|
15737
|
+
colorId: string | null;
|
|
15738
|
+
/** Variant ids the STORE linked. [] means it published no link — NOT that the
|
|
15739
|
+
* image belongs to every variant. */
|
|
15740
|
+
variantIds: string[];
|
|
15741
|
+
}
|
|
15742
|
+
interface SaleEvidence {
|
|
15743
|
+
/** True only with retailer evidence. NEVER set from a low price or from the
|
|
15744
|
+
* word "sale" in a title. */
|
|
15745
|
+
onSale: boolean;
|
|
15746
|
+
currentPrice: string | null;
|
|
15747
|
+
/** The published "was" price. Strictly greater than currentPrice when
|
|
15748
|
+
* evidenceType is "compare_at_price". Null when nothing published one. */
|
|
15749
|
+
originalPrice: string | null;
|
|
15750
|
+
/** ISO 4217, from the storefront's own /meta.json. Null only when that read
|
|
15751
|
+
* failed — never defaulted to "USD", which is wrong on every non-US store. */
|
|
15752
|
+
currency: string | null;
|
|
15753
|
+
promotionMessage: string | null;
|
|
15754
|
+
/** How it was decided. "compare_at_price" is a struck-through price;
|
|
15755
|
+
* "retailer_sale_badge" is a published sale tag; "none" is not on sale. */
|
|
15756
|
+
evidenceType: "compare_at_price" | "sale_price" | "retailer_sale_badge" | "published_promotion" | "none";
|
|
15757
|
+
/** The retailer text or field the classification rests on, verbatim. */
|
|
15758
|
+
evidenceText: string | null;
|
|
15759
|
+
}
|
|
15760
|
+
/** The retailer's own labels, read off its published tags, category and options.
|
|
15761
|
+
* NEVER inferred from the title or from an image. Null or [] when unpublished,
|
|
15762
|
+
* which is common and is an honest answer. */
|
|
15763
|
+
interface PublishedProductAttributes {
|
|
15764
|
+
audience: string | null;
|
|
15765
|
+
garmentType: "sports_bra" | "tank" | "crop_top" | "leggings" | "shorts" | "other" | null;
|
|
15766
|
+
categories: string[];
|
|
15767
|
+
collections: string[];
|
|
15768
|
+
fabrics: string[];
|
|
15769
|
+
materials: string[];
|
|
15770
|
+
color: string | null;
|
|
15771
|
+
colorFamily: string | null;
|
|
15772
|
+
pattern: string | null;
|
|
15773
|
+
styleTags: string[];
|
|
15774
|
+
neckline: string | null;
|
|
15775
|
+
strapWidth: string | null;
|
|
15776
|
+
backDesign: string | null;
|
|
15777
|
+
sleeveLength: string | null;
|
|
15778
|
+
rise: string | null;
|
|
15779
|
+
waistband: string | null;
|
|
15780
|
+
/** How long the GARMENT is — "Cropped", "Midi". What every store's own
|
|
15781
|
+
* `length::` tag fills, on a top exactly as on a bottom. */
|
|
15782
|
+
garmentLength: string | null;
|
|
15783
|
+
/** The inside leg seam and only that. NULL on a top — a tank has no inseam,
|
|
15784
|
+
* and its length is `garmentLength`. */
|
|
15785
|
+
inseam: string | null;
|
|
15786
|
+
legShape: string | null;
|
|
15787
|
+
fit: string | null;
|
|
15788
|
+
coverage: string | null;
|
|
15789
|
+
}
|
|
15790
|
+
/** Shared colour, fabric, collection and style family — what makes two garments
|
|
15791
|
+
* PLAUSIBLY coordinate. None of it establishes a set. */
|
|
15792
|
+
interface CoordinationMetadata {
|
|
15793
|
+
collectionNames: string[];
|
|
15794
|
+
fabricNames: string[];
|
|
15795
|
+
colorName: string | null;
|
|
15796
|
+
colorId: string | null;
|
|
15797
|
+
colorFamily: string | null;
|
|
15798
|
+
/** The store's own grouping key for one style across its colourways. Two
|
|
15799
|
+
* products sharing it are the same garment in two colours. */
|
|
15800
|
+
productFamily: string | null;
|
|
15801
|
+
}
|
|
15802
|
+
/** An EXPLICIT retailer-published relationship. Shared colour, fabric,
|
|
15803
|
+
* collection or family is NOT this — that is CoordinationMetadata. Usually [].
|
|
15804
|
+
*
|
|
15805
|
+
* Two doors fill it. On a PRODUCT row it comes from the store's tags, and no
|
|
15806
|
+
* store measured publishes a set tag, so it is [] there. getSetEvidence() reads
|
|
15807
|
+
* the other one: the complementary products a MERCHANDISER pinned by hand,
|
|
15808
|
+
* admitted only for rows the store marks pr_prod_strat=pinned. The algorithmic
|
|
15809
|
+
* "related products" feed is never read into this — that is a recommendation
|
|
15810
|
+
* engine's output, not the retailer stating a pairing. */
|
|
15811
|
+
interface RetailerSetEvidence {
|
|
15812
|
+
evidenceType: "official_set" | "shop_the_set" | "complete_the_look" | "matching_piece";
|
|
15813
|
+
evidenceText: string | null;
|
|
15814
|
+
sourceUrl: string | null;
|
|
15815
|
+
setId: string | null;
|
|
15816
|
+
relatedProducts: Array<{ productId: string | null; handle: string | null; title: string | null; url: string | null }>;
|
|
15817
|
+
}
|
|
15818
|
+
/** What getSetEvidence returns. An OBJECT rather than a bare array so the
|
|
15819
|
+
* healthy EMPTY answer is still probeable: productId and sourceUrl exist only
|
|
15820
|
+
* when BOTH hops answered, where an empty evidence list is the ordinary case. */
|
|
15821
|
+
interface ShopifySetEvidence {
|
|
15822
|
+
handle: string;
|
|
15823
|
+
/** Shopify's numeric PRODUCT id — the only key the recommendations door takes,
|
|
15824
|
+
* and published by no other function here. */
|
|
15825
|
+
productId: string;
|
|
15826
|
+
/** The product page the pairing is published on. */
|
|
15827
|
+
sourceUrl: string;
|
|
15828
|
+
/** ONLY the rows a merchandiser pinned by hand. [] when they pinned nothing,
|
|
15829
|
+
* which is the common case and is the STORE's answer. At most one entry — one
|
|
15830
|
+
* statement, N related products. Read this for "what did the retailer SAY". */
|
|
15831
|
+
evidence: RetailerSetEvidence[];
|
|
15832
|
+
/** EVERY row the store recommends, pinned AND algorithmic, deduplicated, each
|
|
15833
|
+
* labelled. Read source.by before treating one as the retailer's decision —
|
|
15834
|
+
* the algorithmic rows are usually SUBSTITUTES rather than companions, since
|
|
15835
|
+
* similarity returns the nearest product and the nearest thing to a baby
|
|
15836
|
+
* monitor is another baby monitor. [] when includeAlgorithmic was false. */
|
|
15837
|
+
recommendations: RecommendedProduct[];
|
|
15838
|
+
/** Non-empty when the store returned a FULL page for an intent, which cannot be
|
|
15839
|
+
* told apart from a longer list cut off at the cap. A merchandiser's pairing is
|
|
15840
|
+
* a statement, so a partial one must not read as the whole. */
|
|
15841
|
+
warnings: string[];
|
|
15842
|
+
}
|
|
15843
|
+
/** One recommended product, with the store's own label for who chose it. */
|
|
15844
|
+
interface RecommendedProduct {
|
|
15845
|
+
productId: string | null;
|
|
15846
|
+
handle: string | null;
|
|
15847
|
+
title: string | null;
|
|
15848
|
+
url: string | null;
|
|
15849
|
+
source: RecommendationSource;
|
|
15850
|
+
}
|
|
15851
|
+
interface RecommendationSource {
|
|
15852
|
+
/** "retailer" when a merchandiser pinned it; "algorithm" otherwise, INCLUDING
|
|
15853
|
+
* a row the store labelled with nothing — an unknown provenance must never
|
|
15854
|
+
* read as a person's decision. */
|
|
15855
|
+
by: "retailer" | "algorithm";
|
|
15856
|
+
/** The store's own token, verbatim and unmapped — "pinned", "jac" (Jaccard),
|
|
15857
|
+
* "e" (embedding), "collection_fallback". Null when the row carried none. */
|
|
15858
|
+
strategy: string | null;
|
|
13884
15859
|
}
|
|
13885
15860
|
interface ShopifyProduct {
|
|
13886
15861
|
handle: string;
|
|
@@ -13894,6 +15869,65 @@ interface ShopifyProduct {
|
|
|
13894
15869
|
inStock: boolean;
|
|
13895
15870
|
tags: string[];
|
|
13896
15871
|
descriptionHtml: string | null;
|
|
15872
|
+
/** The same copy with its markup removed. */
|
|
15873
|
+
descriptionText: string | null;
|
|
15874
|
+
/** ISO 4217, read once per store from its own /meta.json. */
|
|
15875
|
+
currency: string | null;
|
|
15876
|
+
/** When the store's door ANSWERED this row, ISO 8601 UTC. Every field here is
|
|
15877
|
+
* a live fact with a shelf life — the price, the markdown, the per-variant
|
|
15878
|
+
* stock flag — so read it before treating a cached row as current. Stamped per
|
|
15879
|
+
* REQUEST: a getProducts batch carries one stamp per handle, not one per call. */
|
|
15880
|
+
fetchedAt: string;
|
|
15881
|
+
/** Every image the door published, deduplicated, in the store's own order. */
|
|
15882
|
+
images: ProductImage[];
|
|
15883
|
+
attributes: PublishedProductAttributes;
|
|
15884
|
+
/** Per-FIELD origin for `attributes` — keyed by the same field names. Read it
|
|
15885
|
+
* before ranking on a null: "absent" is the store publishing nothing, and is
|
|
15886
|
+
* the store's own answer; "unreachable" is a door we could not read, and means
|
|
15887
|
+
* UNKNOWN. On this store both doors are one request that either answered or
|
|
15888
|
+
* threw, so nothing here is ever "unreachable" — the status exists because the
|
|
15889
|
+
* same vocabulary is used by providers whose page can refuse mid-answer. */
|
|
15890
|
+
attributeProvenance: Record<string, FieldProvenance>;
|
|
15891
|
+
attributeCompleteness: Completeness;
|
|
15892
|
+
coordination: CoordinationMetadata;
|
|
15893
|
+
retailerSetEvidence: RetailerSetEvidence[];
|
|
15894
|
+
}
|
|
15895
|
+
/** Where one attribute value came from, and the retailer text behind it. */
|
|
15896
|
+
interface FieldProvenance {
|
|
15897
|
+
/** "published" — the retailer stated it. "absent" — every door was silent.
|
|
15898
|
+
* "unreachable" — a door that would carry it was refused, so it is UNKNOWN. */
|
|
15899
|
+
status: "published" | "absent" | "unreachable";
|
|
15900
|
+
/** Which door: "shopify_tags", "shopify_product_type", "shopify_color_option"
|
|
15901
|
+
* or "shopify_product_copy". Null when nothing filled it. */
|
|
15902
|
+
source: string | null;
|
|
15903
|
+
/** The retailer's own words the value rests on, verbatim — the tag, or the
|
|
15904
|
+
* sentence out of the description. Null when nothing filled it. */
|
|
15905
|
+
evidence: string | null;
|
|
15906
|
+
/** On "unreachable" only: what was refused. */
|
|
15907
|
+
detail?: string;
|
|
15908
|
+
}
|
|
15909
|
+
/** The roll-up over one product's attributeProvenance. */
|
|
15910
|
+
interface Completeness {
|
|
15911
|
+
fields: number;
|
|
15912
|
+
published: number;
|
|
15913
|
+
absent: number;
|
|
15914
|
+
unreachable: number;
|
|
15915
|
+
/** published / fields, to 3dp. */
|
|
15916
|
+
ratio: number;
|
|
15917
|
+
/** The fields whose value is UNKNOWN rather than known-empty. Read this before
|
|
15918
|
+
* comparing two rows: a row with entries here was not fully looked at. */
|
|
15919
|
+
unreachableFields: string[];
|
|
15920
|
+
sourcesUsed: string[];
|
|
15921
|
+
}
|
|
15922
|
+
/** What getProducts returns. PARTIAL by design: one handle the store will not
|
|
15923
|
+
* serve costs that row and nothing else, where getProduct throws. */
|
|
15924
|
+
interface ShopifyProductBatch {
|
|
15925
|
+
/** In the order the handles were passed, not the order they finished. */
|
|
15926
|
+
products: ShopifyProduct[];
|
|
15927
|
+
/** Every handle the store did not serve, with what it said. */
|
|
15928
|
+
missing: Array<{ handle: string; detail: string }>;
|
|
15929
|
+
requested: number;
|
|
15930
|
+
warnings: string[];
|
|
13897
15931
|
}
|
|
13898
15932
|
interface ShopifyCartLine {
|
|
13899
15933
|
/** Shopify's own line key, which its cart-change endpoints address a line by. */
|
|
@@ -13907,6 +15941,70 @@ interface ShopifyCartLine {
|
|
|
13907
15941
|
lineTotal: string;
|
|
13908
15942
|
url: string;
|
|
13909
15943
|
}
|
|
15944
|
+
/** One collection the store publishes — its own merchandised grouping, and the
|
|
15945
|
+
* ONE place either yoga retailer states a set. Membership in a collection the
|
|
15946
|
+
* retailer NAMED "Matching Sets" is a published fact and is admissible as set
|
|
15947
|
+
* evidence; two products being adjacent inside it is NOT, because a position in
|
|
15948
|
+
* a list is not a statement. */
|
|
15949
|
+
interface ShopifyCollection {
|
|
15950
|
+
handle: string;
|
|
15951
|
+
title: string;
|
|
15952
|
+
url: string;
|
|
15953
|
+
descriptionHtml: string | null;
|
|
15954
|
+
/** True when the retailer's OWN title or handle names this a set, a matching
|
|
15955
|
+
* piece or a look. Never inferred from what is inside it. */
|
|
15956
|
+
setLike: boolean;
|
|
15957
|
+
productCount: number | null;
|
|
15958
|
+
updatedAt: string | null;
|
|
15959
|
+
}
|
|
15960
|
+
interface ShopifyCollectionProducts {
|
|
15961
|
+
handle: string;
|
|
15962
|
+
url: string;
|
|
15963
|
+
/** In the RETAILER's own order. Curated collections are merchandised
|
|
15964
|
+
* top-then-bottom; reading a pairing out of that order is the caller's
|
|
15965
|
+
* inference, never this provider's claim. [] is an ordinary answer. */
|
|
15966
|
+
products: ShopifyProduct[];
|
|
15967
|
+
/** Pass back as opts.cursor for the next page, or NULL when this is the last
|
|
15968
|
+
* one. A collection bigger than one page is reachable only through this. */
|
|
15969
|
+
cursor: string | null;
|
|
15970
|
+
/** Empty on an ordinary page. One entry when the walk hit the store platform's
|
|
15971
|
+
* 25,000-row ceiling with the collection unfinished — a TRUNCATION, which a
|
|
15972
|
+
* null cursor on its own would read as the end of the list. */
|
|
15973
|
+
warnings: string[];
|
|
15974
|
+
}
|
|
15975
|
+
/** One page of a whole-catalogue walk. Advance it with the cursor; there is
|
|
15976
|
+
* deliberately no "fetch everything" call, because every row is a request
|
|
15977
|
+
* against the store and only the caller knows how many candidates it needs. */
|
|
15978
|
+
interface ShopifyProductPage {
|
|
15979
|
+
/** In the store's own MERCHANDISED order — not id, not date. The store may
|
|
15980
|
+
* re-merchandise mid-walk, so key on handle rather than assuming pages are
|
|
15981
|
+
* disjoint. */
|
|
15982
|
+
products: ShopifyProduct[];
|
|
15983
|
+
/** Pass back as opts.cursor for the next page. NULL when the store answered a
|
|
15984
|
+
* short page, which is what the end of the catalogue looks like. */
|
|
15985
|
+
cursor: string | null;
|
|
15986
|
+
/** How many rows this page asked the store for. */
|
|
15987
|
+
limit: number;
|
|
15988
|
+
/** Empty on an ordinary page. One entry when the walk stopped at the 25,000-row
|
|
15989
|
+
* ceiling with the catalogue unfinished. */
|
|
15990
|
+
warnings: string[];
|
|
15991
|
+
}
|
|
15992
|
+
/** What resolveProductUrl hands back — the product a url names, and the variant
|
|
15993
|
+
* its own ?variant= selected. */
|
|
15994
|
+
interface ShopifyProductFromUrl {
|
|
15995
|
+
product: ShopifyProduct;
|
|
15996
|
+
/** The variant ?variant= named, or NULL when the url named none — the ordinary
|
|
15997
|
+
* case for a link off a collection page. Also null when it named one the store
|
|
15998
|
+
* no longer publishes, which warnings says. NEVER the first variant instead:
|
|
15999
|
+
* that answers "is my size in stock" about a different size. */
|
|
16000
|
+
variant: ShopifyVariant | null;
|
|
16001
|
+
/** The ?variant= value exactly as the url carried it, kept even when it
|
|
16002
|
+
* matched nothing — a stale link is a fact about the link. */
|
|
16003
|
+
variantIdInUrl: string | null;
|
|
16004
|
+
/** Empty on a clean resolve. One entry when the url named a variant the store
|
|
16005
|
+
* no longer publishes. */
|
|
16006
|
+
warnings: string[];
|
|
16007
|
+
}
|
|
13910
16008
|
interface ShopifyCart {
|
|
13911
16009
|
/** The store's own cart token — a bearer credential, so treat it like one. */
|
|
13912
16010
|
token: string;
|
|
@@ -13934,9 +16032,69 @@ interface ShopifyCart {
|
|
|
13934
16032
|
|
|
13935
16033
|
/**
|
|
13936
16034
|
* Reads one product by handle — every variant, its exact price, its SKU and whether that
|
|
13937
|
-
* specific size or colour is purchasable right now.
|
|
16035
|
+
* specific size or colour is purchasable right now. Pass { withReviews: true } to ALSO get the
|
|
16036
|
+
* star rating and review count from whichever review app the merchant installed; it is off by
|
|
16037
|
+
* default because it costs a second origin and usually the rendered product page too.
|
|
13938
16038
|
*/
|
|
13939
16039
|
getProduct(handle: string): Promise<ShopifyProduct>;
|
|
16040
|
+
|
|
16041
|
+
/**
|
|
16042
|
+
* Turns a product URL into the product, which is the address a caller actually holds when a
|
|
16043
|
+
* link arrives from a search result, a page or a person. Takes the whole url — origin, market
|
|
16044
|
+
* prefix, ?variant= and #fragment — so nothing has to be stripped down to a bare handle first,
|
|
16045
|
+
* and the variant the url named comes back beside the product instead of being lost. THROWS,
|
|
16046
|
+
* naming the domain, on a url belonging to another storefront. Takes the same { withReviews:
|
|
16047
|
+
* true } option as getProduct, on the same default: a url is another way of naming one
|
|
16048
|
+
* product, so holding a link rather than a handle must not cost a caller the rating.
|
|
16049
|
+
*/
|
|
16050
|
+
resolveProductUrl(url: string): Promise<ShopifyProductFromUrl>;
|
|
16051
|
+
|
|
16052
|
+
/**
|
|
16053
|
+
* Reads FULL detail for many products in one call — the shape for ranking a candidate set,
|
|
16054
|
+
* since a search row carries neither the description copy nor the per-variant stock a ranking
|
|
16055
|
+
* turns on. PARTIAL by construction: a search row's handle may 404 on the Ajax product door
|
|
16056
|
+
* (measured 2026-08-05, 2 of 10 sampled members), so one bad handle is named in `missing` and
|
|
16057
|
+
* costs that row alone, where `getProduct` throws and takes the whole set with it. Capped at
|
|
16058
|
+
* 50 handles because each one is a request to the store. Takes the same { withReviews: true }
|
|
16059
|
+
* option, and is the shape to use for it: the review app's key is learned from the first pages
|
|
16060
|
+
* and reused, so ratings for twenty handles cost a handful of page fetches rather than twenty.
|
|
16061
|
+
*/
|
|
16062
|
+
getProducts(handles: string[]): Promise<ShopifyProductBatch>;
|
|
16063
|
+
|
|
16064
|
+
/**
|
|
16065
|
+
* Walks the store's WHOLE catalogue a page at a time, in its own merchandised order — the
|
|
16066
|
+
* shape that makes a realistic candidate set reachable at all, since search ranks against a
|
|
16067
|
+
* query and returns one slice. The caller advances a cursor and stops on its own budget or on
|
|
16068
|
+
* a null cursor. There is deliberately no fetch-everything call: every row is a request
|
|
16069
|
+
* against a stranger's storefront, and how many candidates a ranking needs is the caller's
|
|
16070
|
+
* decision rather than one taken once, inside the library, on behalf of every member.
|
|
16071
|
+
*/
|
|
16072
|
+
listProducts(opts?: { limit?: number; cursor?: string | null }): Promise<ShopifyProductPage>;
|
|
16073
|
+
|
|
16074
|
+
/**
|
|
16075
|
+
* Lists the store's own merchandised collections. THIS is where a retailer states a SET: a
|
|
16076
|
+
* collection the store itself named "Matching Sets" or "Activewear Sets" carries setLike:
|
|
16077
|
+
* true, and membership in one is published evidence that two garments are sold together.
|
|
16078
|
+
*/
|
|
16079
|
+
listCollections(opts?: { limit?: number }): Promise<ShopifyCollection[]>;
|
|
16080
|
+
|
|
16081
|
+
/**
|
|
16082
|
+
* Reads one collection's products in the retailer's own merchandised order, as full product
|
|
16083
|
+
* rows. An empty list is an ordinary answer — several named 'look' collections publish no
|
|
16084
|
+
* products through this door.
|
|
16085
|
+
*/
|
|
16086
|
+
getCollection(handle: string, opts?: { limit?: number; cursor?: string | null }): Promise<ShopifyCollectionProducts>;
|
|
16087
|
+
|
|
16088
|
+
/**
|
|
16089
|
+
* Two answers in one call. `evidence` is ONLY what a MERCHANDISER pinned by hand, in the order
|
|
16090
|
+
* they typed it — an explicit retailer statement, and [] on most products, which is the
|
|
16091
|
+
* retailer's own answer. `recommendations` is EVERY row the store returns including the
|
|
16092
|
+
* algorithmic ones, each carrying source.by (retailer | algorithm) and the store's own
|
|
16093
|
+
* strategy token, so a caller can use them without either field lying. The algorithmic rows
|
|
16094
|
+
* are usually SUBSTITUTES rather than companions. Pass includeAlgorithmic: false to skip the
|
|
16095
|
+
* second request.
|
|
16096
|
+
*/
|
|
16097
|
+
getSetEvidence(handle: string, opts?: { includeAlgorithmic?: boolean }): Promise<ShopifySetEvidence>;
|
|
13940
16098
|
}
|
|
13941
16099
|
}
|
|
13942
16100
|
|
|
@@ -13948,7 +16106,10 @@ interface ShopifyCart {
|
|
|
13948
16106
|
interface BowmarkProviders {
|
|
13949
16107
|
aa: BowmarkProvider_aa.Unit;
|
|
13950
16108
|
abercrombie: BowmarkProvider_abercrombie.Unit;
|
|
16109
|
+
aiper: BowmarkProvider_aiper.Unit;
|
|
16110
|
+
ajmadison: BowmarkProvider_ajmadison.Unit;
|
|
13951
16111
|
ashleyfurniture: BowmarkProvider_ashleyfurniture.Unit;
|
|
16112
|
+
atlasseniorliving: BowmarkProvider_atlasseniorliving.Unit;
|
|
13952
16113
|
avis: BowmarkProvider_avis.Unit;
|
|
13953
16114
|
azure: BowmarkProvider_azure.Unit;
|
|
13954
16115
|
barletta: BowmarkProvider_barletta.Unit;
|
|
@@ -13956,11 +16117,13 @@ interface BowmarkProviders {
|
|
|
13956
16117
|
blenderseyewear: BowmarkProvider_blenderseyewear.Unit;
|
|
13957
16118
|
bluehaven: BowmarkProvider_bluehaven.Unit;
|
|
13958
16119
|
bmwusa: BowmarkProvider_bmwusa.Unit;
|
|
16120
|
+
bykoket: BowmarkProvider_bykoket.Unit;
|
|
13959
16121
|
cancer: BowmarkProvider_cancer.Unit;
|
|
13960
16122
|
caraway: BowmarkProvider_caraway.Unit;
|
|
13961
16123
|
cars: BowmarkProvider_cars.Unit;
|
|
13962
16124
|
cheapflights: BowmarkProvider_cheapflights.Unit;
|
|
13963
16125
|
chriscraft: BowmarkProvider_chriscraft.Unit;
|
|
16126
|
+
classichome: BowmarkProvider_classichome.Unit;
|
|
13964
16127
|
classpass: BowmarkProvider_classpass.Unit;
|
|
13965
16128
|
cloudflare: BowmarkProvider_cloudflare.Unit;
|
|
13966
16129
|
cyberpowerpc: BowmarkProvider_cyberpowerpc.Unit;
|
|
@@ -13969,31 +16132,43 @@ interface BowmarkProviders {
|
|
|
13969
16132
|
dickssportinggoods: BowmarkProvider_dickssportinggoods.Unit;
|
|
13970
16133
|
dillards: BowmarkProvider_dillards.Unit;
|
|
13971
16134
|
discounttire: BowmarkProvider_discounttire.Unit;
|
|
16135
|
+
embroker: BowmarkProvider_embroker.Unit;
|
|
13972
16136
|
erieinsurance: BowmarkProvider_erieinsurance.Unit;
|
|
13973
16137
|
extraspace: BowmarkProvider_extraspace.Unit;
|
|
16138
|
+
firstdibs: BowmarkProvider_firstdibs.Unit;
|
|
13974
16139
|
flightradar24: BowmarkProvider_flightradar24.Unit;
|
|
13975
16140
|
ford: BowmarkProvider_ford.Unit;
|
|
13976
16141
|
framebridge: BowmarkProvider_framebridge.Unit;
|
|
13977
16142
|
fred: BowmarkProvider_fred.Unit;
|
|
13978
16143
|
geico: BowmarkProvider_geico.Unit;
|
|
13979
16144
|
google_flights: BowmarkProvider_google_flights.Unit;
|
|
16145
|
+
gotchacovered: BowmarkProvider_gotchacovered.Unit;
|
|
13980
16146
|
grainger: BowmarkProvider_grainger.Unit;
|
|
16147
|
+
handypro: BowmarkProvider_handypro.Unit;
|
|
16148
|
+
harmar: BowmarkProvider_harmar.Unit;
|
|
16149
|
+
hauslabs: BowmarkProvider_hauslabs.Unit;
|
|
13981
16150
|
healthcare_gov: BowmarkProvider_healthcare_gov.Unit;
|
|
13982
16151
|
hellofresh: BowmarkProvider_hellofresh.Unit;
|
|
13983
16152
|
hellotend: BowmarkProvider_hellotend.Unit;
|
|
13984
16153
|
hilton: BowmarkProvider_hilton.Unit;
|
|
16154
|
+
hobie: BowmarkProvider_hobie.Unit;
|
|
13985
16155
|
hunter: BowmarkProvider_hunter.Unit;
|
|
13986
16156
|
ibuypower: BowmarkProvider_ibuypower.Unit;
|
|
13987
16157
|
insurify: BowmarkProvider_insurify.Unit;
|
|
13988
16158
|
interiordefine: BowmarkProvider_interiordefine.Unit;
|
|
16159
|
+
islllc: BowmarkProvider_islllc.Unit;
|
|
13989
16160
|
joybird: BowmarkProvider_joybird.Unit;
|
|
13990
16161
|
kayak: BowmarkProvider_kayak.Unit;
|
|
16162
|
+
kitchentuneup: BowmarkProvider_kitchentuneup.Unit;
|
|
16163
|
+
kompan: BowmarkProvider_kompan.Unit;
|
|
13991
16164
|
labcorp: BowmarkProvider_labcorp.Unit;
|
|
13992
16165
|
linkedin: BowmarkProvider_linkedin.Unit;
|
|
13993
16166
|
liquiddeath: BowmarkProvider_liquiddeath.Unit;
|
|
13994
16167
|
lonelyplanet: BowmarkProvider_lonelyplanet.Unit;
|
|
16168
|
+
louvershop: BowmarkProvider_louvershop.Unit;
|
|
13995
16169
|
lufthansa: BowmarkProvider_lufthansa.Unit;
|
|
13996
16170
|
lululemon: BowmarkProvider_lululemon.Unit;
|
|
16171
|
+
maidenhome: BowmarkProvider_maidenhome.Unit;
|
|
13997
16172
|
mailchimp: BowmarkProvider_mailchimp.Unit;
|
|
13998
16173
|
marriott: BowmarkProvider_marriott.Unit;
|
|
13999
16174
|
mcdonalds: BowmarkProvider_mcdonalds.Unit;
|
|
@@ -14011,28 +16186,33 @@ interface BowmarkProviders {
|
|
|
14011
16186
|
paypal: BowmarkProvider_paypal.Unit;
|
|
14012
16187
|
pirateship: BowmarkProvider_pirateship.Unit;
|
|
14013
16188
|
pizzahut: BowmarkProvider_pizzahut.Unit;
|
|
16189
|
+
premierbuildings: BowmarkProvider_premierbuildings.Unit;
|
|
14014
16190
|
progressive: BowmarkProvider_progressive.Unit;
|
|
14015
16191
|
prose: BowmarkProvider_prose.Unit;
|
|
14016
16192
|
reddit: BowmarkProvider_reddit.Unit;
|
|
14017
16193
|
ritani: BowmarkProvider_ritani.Unit;
|
|
14018
16194
|
samsclub: BowmarkProvider_samsclub.Unit;
|
|
14019
16195
|
sears: BowmarkProvider_sears.Unit;
|
|
16196
|
+
seegarsfence: BowmarkProvider_seegarsfence.Unit;
|
|
14020
16197
|
selectblinds: BowmarkProvider_selectblinds.Unit;
|
|
14021
16198
|
semihandmade: BowmarkProvider_semihandmade.Unit;
|
|
14022
16199
|
soundcloud: BowmarkProvider_soundcloud.Unit;
|
|
14023
16200
|
statefarm: BowmarkProvider_statefarm.Unit;
|
|
14024
16201
|
stickergiant: BowmarkProvider_stickergiant.Unit;
|
|
14025
16202
|
sunhomesaunas: BowmarkProvider_sunhomesaunas.Unit;
|
|
16203
|
+
target: BowmarkProvider_target.Unit;
|
|
14026
16204
|
teladoc: BowmarkProvider_teladoc.Unit;
|
|
14027
16205
|
tentree: BowmarkProvider_tentree.Unit;
|
|
14028
16206
|
therabody: BowmarkProvider_therabody.Unit;
|
|
14029
16207
|
thezebra: BowmarkProvider_thezebra.Unit;
|
|
16208
|
+
topviewtix: BowmarkProvider_topviewtix.Unit;
|
|
14030
16209
|
trektravel: BowmarkProvider_trektravel.Unit;
|
|
14031
16210
|
ulrichlifestyle: BowmarkProvider_ulrichlifestyle.Unit;
|
|
14032
16211
|
viewrail: BowmarkProvider_viewrail.Unit;
|
|
14033
16212
|
visible: BowmarkProvider_visible.Unit;
|
|
14034
16213
|
walmart: BowmarkProvider_walmart.Unit;
|
|
14035
16214
|
wellfound: BowmarkProvider_wellfound.Unit;
|
|
16215
|
+
yourarborhome: BowmarkProvider_yourarborhome.Unit;
|
|
14036
16216
|
"000de82": BowmarkFamily_shopify_store.Unit;
|
|
14037
16217
|
"001r3iv0": BowmarkFamily_shopify_store.Unit;
|
|
14038
16218
|
"00246d8e": BowmarkFamily_shopify_store.Unit;
|
|
@@ -51063,6 +53243,7 @@ interface BowmarkProviders {
|
|
|
51063
53243
|
santabarbaraforgeandiron: BowmarkFamily_shopify_store.Unit;
|
|
51064
53244
|
santabarbaranutrients: BowmarkFamily_shopify_store.Unit;
|
|
51065
53245
|
santaclararealtorstore: BowmarkFamily_shopify_store.Unit;
|
|
53246
|
+
santacruzbicycles: BowmarkFamily_shopify_store.Unit;
|
|
51066
53247
|
santacruzmountainsclothing: BowmarkFamily_shopify_store.Unit;
|
|
51067
53248
|
santafesoapranch: BowmarkFamily_shopify_store.Unit;
|
|
51068
53249
|
santafewineandchilefiesta: BowmarkFamily_shopify_store.Unit;
|
|
@@ -65762,5 +67943,6 @@ interface BowmarkLibrary {
|
|
|
65762
67943
|
music: BowmarkCapability_music.Unit;
|
|
65763
67944
|
pcparts: BowmarkCapability_pcparts.Unit;
|
|
65764
67945
|
read: BowmarkCapability_read.Unit;
|
|
67946
|
+
sheds: BowmarkCapability_sheds.Unit;
|
|
65765
67947
|
providers: BowmarkProviders;
|
|
65766
67948
|
}
|