{"id":"5391b35e-8855-4560-b177-5d131a2a1e55","entityType":"agent","slug":"clawhub-crawlora-org-product-price-research","name":"product-price-research","canonicalUrl":"https://www.xpersona.co/agent/clawhub-crawlora-org-product-price-research","canonicalPath":"/agent/clawhub-crawlora-org-product-price-research","generatedAt":"2026-10-11T05:35:19.931Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:17:59.156Z","emptyReason":null},"description":"Researches products, prices, sellers, and reviews across major online marketplaces and big-box/specialty retailers (Amazon, eBay, Shopify stores, Shop.app, Target, Costco, Walmart, Nike, Zara, Adidas, Best Buy, Home Depot, Sephora, SHEIN, IKEA, Chewy, and more) using the Crawlora API, returning clean JSON. Use when the user asks to find a product, compare prices or sellers, track listings, or pull marketplace/retailer reviews — instead of scraping store pages.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:product-price-research","sourceUrl":"https://clawhub.ai/crawlora-org/product-price-research","homepage":"https://clawhub.ai/crawlora-org/skills/product-price-research","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/crawlora-org/product-price-research","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/crawlora-org/skills/product-price-research","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"product-price-research technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:17:59.156Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:17:59.156Z","emptyReason":null},"stars":null,"forks":null,"downloads":1175,"packageName":null,"latestVersion":"1.0.21","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:17:59.150Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T03:17:59.156Z","lastCrawledAt":"2026-10-11T03:17:59.150Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T03:17:59.150Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.21","createdAt":"2026-10-05T01:20:26.237Z","changelog":"Sync skill instructions, references, and helper from GitHub 83bb98ef1362f25cecb5ddd4bc1ea0e564555d97","fileCount":5,"zipByteSize":49283},{"version":"1.0.20","createdAt":"2026-09-26T12:47:15.885Z","changelog":"Sync skill instructions, references, and helper from GitHub 8ac7f99e79c37939913706006fca839ef1108182","fileCount":5,"zipByteSize":48243},{"version":"1.0.19","createdAt":"2026-09-21T01:46:23.697Z","changelog":"Sync skill instructions, references, and helper from GitHub 0cfbceba40b050ba434a0a3f4945ca97b668c805","fileCount":5,"zipByteSize":48295},{"version":"1.0.18","createdAt":"2026-09-17T10:21:31.196Z","changelog":"Security hardening: generated helpers now enforce exact routes, methods, and credential-safe curl behavior.","fileCount":5,"zipByteSize":46034},{"version":"1.0.17","createdAt":"2026-09-14T02:03:09.196Z","changelog":"Sync skill instructions, references, and helper from GitHub 902f58316c643ffbcabc57fc6f15f59d27ec063d","fileCount":5,"zipByteSize":44891},{"version":"1.0.16","createdAt":"2026-09-10T12:35:21.250Z","changelog":"Validate API keys before curl config","fileCount":5,"zipByteSize":44369},{"version":"1.0.15","createdAt":"2026-09-10T12:16:31.937Z","changelog":"Keep API keys out of process arguments","fileCount":5,"zipByteSize":44326},{"version":"1.0.14","createdAt":"2026-09-10T12:07:31.476Z","changelog":"Reject curl local-file query syntax","fileCount":5,"zipByteSize":44277}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:product-price-research","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:product-price-research` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/crawlora-org/product-price-research before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-product-price-research/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-product-price-research/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-product-price-research/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-product-price-research/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-product-price-research/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-product-price-research/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T05:35:19.927Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-product-price-research/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-product-price-research/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-product-price-research/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-product-price-research/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:17:59.156Z","emptyReason":null},"readme":"Skill: product-price-research\n\nOwner: crawlora-org\n\nSummary: Researches products, prices, sellers, and reviews across major online marketplaces and big-box/specialty retailers (Amazon, eBay, Shopify stores, Shop.app, Target, Costco, Walmart, Nike, Zara, Adidas, Best Buy, Home Depot, Sephora, SHEIN, IKEA, Chewy, and more) using the Crawlora API, returning clean JSON. Use when the user asks to find a product, compare prices or sellers, track listings, or pull marketplace/retailer reviews — instead of scraping store pages.\n\nTags: latest:1.0.21\n\nVersion history:\n\nv1.0.21 | 2026-10-05T01:20:26.237Z | user\n\nSync skill instructions, references, and helper from GitHub 83bb98ef1362f25cecb5ddd4bc1ea0e564555d97\n\nv1.0.20 | 2026-09-26T12:47:15.885Z | user\n\nSync skill instructions, references, and helper from GitHub 8ac7f99e79c37939913706006fca839ef1108182\n\nv1.0.19 | 2026-09-21T01:46:23.697Z | user\n\nSync skill instructions, references, and helper from GitHub 0cfbceba40b050ba434a0a3f4945ca97b668c805\n\nv1.0.18 | 2026-09-17T10:21:31.196Z | user\n\nSecurity hardening: generated helpers now enforce exact routes, methods, and credential-safe curl behavior.\n\nv1.0.17 | 2026-09-14T02:03:09.196Z | user\n\nSync skill instructions, references, and helper from GitHub 902f58316c643ffbcabc57fc6f15f59d27ec063d\n\nv1.0.16 | 2026-09-10T12:35:21.250Z | user\n\nValidate API keys before curl config\n\nv1.0.15 | 2026-09-10T12:16:31.937Z | user\n\nKeep API keys out of process arguments\n\nv1.0.14 | 2026-09-10T12:07:31.476Z | user\n\nReject curl local-file query syntax\n\nv1.0.13 | 2026-09-10T11:54:48.020Z | user\n\nStream helper request bodies through curl stdin\n\nv1.0.12 | 2026-09-10T11:43:09.005Z | user\n\nScope helper routes and remove secret-shaped key examples\n\nv1.0.11 | 2026-09-10T07:00:34.523Z | user\n\nMigrate publisher from tonywangcn to crawlora-org for brand consistency with the plugins\n\nv1.0.10 | 2026-09-08T05:42:46.543Z | user\n\nAdd comparison workflows and correct retail and restaurant descriptions from crawlora-skills 1.18.0.\n\nv1.0.9 | 2026-09-08T04:35:11.913Z | user\n\nRefresh stale REST examples, endpoint references, and Bash helper from crawlora-skills 1.17.1.\n\nv1.0.8 | 2026-09-07T13:33:30.367Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.7 | 2026-09-07T08:16:45.813Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.6 | 2026-09-07T06:40:42.137Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.5 | 2026-08-24T07:19:03.319Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.4 | 2026-08-24T06:30:32.139Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.3 | 2026-08-24T05:12:38.262Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.2 | 2026-08-14T18:29:56.865Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.1 | 2026-08-10T18:29:23.332Z | user\n\nSet categories\n\nv1.0.0 | 2026-08-10T18:03:24.406Z | auto\n\nInitial release of product-price-research skill.\n\n- Search and compare products, prices, sellers, and reviews across Amazon, eBay, Shopify, Shop.app, Target, Costco, Zalando, and Walmart using the Crawlora API.\n- Returns normalized JSON data; no HTML scraping required.\n- Supports product discovery, details lookup, seller review, and price tracking.\n- Setup uses a single API key; clear instructions provided.\n- Full endpoint reference and example queries included.\n\nArchive index:\n\nArchive v1.0.21: 5 files, 49283 bytes\n\nFiles: reference/endpoints.md (161905b), scripts/crawlora.sh (21717b), skill-card.md (1797b), SKILL.md (12030b), _meta.json (142b)\n\nFile v1.0.21:SKILL.md\n\n---\nname: product-price-research\ndescription: Researches products, prices, sellers, and reviews across major online marketplaces and big-box/specialty retailers (Amazon, eBay, Shopify stores, Shop.app, Target, Costco, Walmart, Nike, Zara, Adidas, Best Buy, Home Depot, Sephora, SHEIN, IKEA, Chewy, and more) using the Crawlora API, returning clean JSON. Use when the user asks to find a product, compare prices or sellers, track listings, or pull marketplace/retailer reviews — instead of scraping store pages.\n---\n\n# Product & price research\n\nLook up and compare products, prices, sellers, and reviews across Amazon,\neBay, Shopify storefronts, Shop.app, Target, Costco, Zalando, Walmart, H&M,\nKohl's, Lululemon, Macy's, Nike, Old Navy (plus Gap, Banana Republic, and\nAthleta under the same endpoints), Sam's Club, Ulta Beauty, Wayfair, Wish,\nZappos, Zara, Adidas, Best Buy, Home Depot, Sephora, SHEIN, IKEA, and\nChewy — all as normalized JSON from the Crawlora API, with no HTML\nscraping. Walgreens is store-locator only (no product catalog).\n\n## When to use this skill\n\n- \"What does X cost on Amazon / eBay / Target / Walmart?\" or \"compare prices\n  for X across sellers/retailers.\"\n- \"Find listings for X\" / \"search this Shopify store\" / \"what's in this collection?\"\n- \"Pull reviews / ratings for this product or seller.\"\n- \"Track this product's price / variants / availability.\"\n- Competitive pricing, catalog, or marketplace-review research.\n- \"Browse category X on Wayfair / Kohl's / Sam's Club\" when the retailer has\n  no keyword search of its own.\n- Apparel/beauty catalog lookups spanning Nike, Zara, H&M, Old Navy/Gap/Banana\n  Republic/Athleta, Lululemon, Ulta Beauty, Adidas, or Sephora.\n- Home-goods/electronics/pet lookups spanning Home Depot, Best Buy, IKEA, or Chewy.\n- \"Find the nearest Walgreens\" (store locator only — no product catalog).\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\nPick the marketplace, then the job:\n\n1. **Search / discover** — `/amazon/search`, `/ebay/search`, `/shopify/products`,\n   `/shop-app/search`, `/target/search`, `/costco/search`, `/walmart/search`,\n   `/hm/search`, `/nike/search`, `/oldnavy/search` (covers Old Navy, Gap,\n   Banana Republic, and Athleta via `brand=on|gap|br|at`, defaults to `on`),\n   `/ulta/search`, `/wish/search`, `/zappos/search`, `/zara/search` (**requires\n   `section`**, a department like `WOMAN`/`MAN`), and `/zalando/search` (this\n   one **requires `market`** — a Zalando country storefront code like `de`,\n   `fr`, `com`; list them via `/zalando/markets`) to find candidate products by\n   keyword. **Kohl's, Lululemon, Macy's, Sam's Club, and Wayfair have no\n   keyword-search endpoint** — browse a category instead:\n   `/kohls/category` (facets give follow-up category strings),\n   `/lululemon/categories` → `/lululemon/category`, `/samsclub/departments` →\n   `/samsclub/category`, and `/wayfair/categories` → `/wayfair/category`.\n   Macy's has neither search nor category browse at all — only direct\n   `productId` lookup (below) plus `/macys/suggest` typeahead.\n   `/adidas/search` (`query` or `category`, exactly one required),\n   `/bestbuy/search` (`q`), `/homedepot/search` (`q`), `/sephora/search`\n   (`query`, plus `brand`/`filter`/`price_min`+`price_max`\n   as a matched pair/`rating_min`/`is_new` facets), `/ikea/search`\n   (`q`, or an IKEA item number resolves directly), and `/chewy/search`\n   (`q` — a strong category match like \"dog food\" transparently redirects\n   to that category listing) round out search. **Walgreens has no product\n   catalog at all** — `/walgreens/stores` (lat/lon or zip) is its only\n   endpoint, for store lookup.\n2. **Detail** — fetch a specific product (`/amazon/product`, `/ebay/item`,\n   `/shopify/products/{handle}`, `/shop-app/products/{id}`,\n   `/target/product` (`tcin`), `/costco/product/{id}`, `/walmart/product/{item_id}`,\n   `/zalando/product` (`sku`+`market`), `/hm/product/{product_id}`,\n   `/nike/product` (`slug`+`style_color`), `/oldnavy/product` (`pid`+`brand`),\n   `/lululemon/product/{product_id}`, `/macys/product/{productId}`,\n   `/samsclub/product/{id}`, `/ulta/product/{productId}`, `/wayfair/product/{id}`,\n   `/wish/product/{id}`, `/zappos/product/{productId}`, `/zara/product/{productId}`,\n   `/adidas/product` (`product_id`), `/bestbuy/product` (`sku`),\n   `/homedepot/product/{id}`, `/sephora/product` (`product_id` — the full\n   product-page slug like `lip-sleeping-mask-P420652`, not just the SKU),\n   `/shein/products/detail` (`goods_id`+`goods_sn`), `/ikea/product`\n   (`item_no`), `/chewy/product` (`id`))\n   for price, variants, specs. **Kohl's has no standalone product-detail\n   endpoint** — product cards (including `web_id`, needed for reviews below)\n   only come back embedded in `/kohls/category`'s listing.\n3. **Sellers** — for eBay/Shop.app, resolve the seller/shop (`/ebay/seller/...`,\n   `/shop-app/shops/{handle}`) to compare offers.\n4. **Reviews** — pull product/seller reviews where available\n   (`/shop-app/products/{id}/reviews`, `/ebay/seller/.../feedback`,\n   `/target/reviews`, `/costco/product/{id}/reviews`, `/walmart/product/{item_id}/reviews`,\n   `/kohls/product/reviews` (`web_id`), `/macys/product/reviews` (`product_id`),\n   `/nike/product/reviews` (`slug`+`style_color`), `/oldnavy/product/reviews`\n   (`pid`+`brand`), `/ulta/product/reviews` (`product_id`), `/wish/product/{id}/reviews`).\n   H&M, Lululemon, Sam's Club, and Zappos surface reviews (when present)\n   embedded in their own product-detail call instead of a separate endpoint;\n   Wayfair and Zara expose no reviews at all — Wayfair's product detail only\n   has an aggregate rating. `/bestbuy/product/reviews` (`sku`),\n   `/sephora/product/reviews` (`product_id`), and `/ikea/reviews`\n   (`item_no`) cover those three separately; Home Depot and Chewy surface\n   reviews embedded in their own product-detail call instead. Adidas reviews and rating summaries are available at\n   `/adidas/product/reviews`, using the search result's `model_number` (not its\n   SKU). Discover per-model review topics via `/adidas/product/review-topics`;\n   locale controls review language and can yield an empty review sample. SHEIN\n   exposes no review endpoint in this catalog.\n5. **Compare** the JSON fields (price, currency, rating, seller) and answer.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search a marketplace (GET, key=value params):\nscripts/crawlora.sh /amazon/search k=\"standing desk\" | jq '.'\nscripts/crawlora.sh -X POST /ebay/search '{\"keyword\":\"mechanical keyboard\"}' | jq '.'\nscripts/crawlora.sh /shop-app/search query=\"running shoes\" | jq '.'\nscripts/crawlora.sh /target/search q=\"standing desk\" | jq '.'\nscripts/crawlora.sh /walmart/search q=\"standing desk\" | jq '.'\nscripts/crawlora.sh /zalando/search q=\"running shoes\" market=de | jq '.'\nscripts/crawlora.sh /nike/search keyword=\"running shoes\" | jq '.'\nscripts/crawlora.sh /ulta/search query=\"retinol serum\" | jq '.'\nscripts/crawlora.sh /bestbuy/search q=\"laptop\" | jq '.'\nscripts/crawlora.sh /sephora/search query=\"retinol serum\" | jq '.'\nscripts/crawlora.sh /chewy/search q=\"salmon dog food\" | jq '.'\n\n# Product detail:\nscripts/crawlora.sh /amazon/product/B0XXXXXXX | jq '.data'\nscripts/crawlora.sh /ikea/product item_no=00263850 | jq '.'\n\n# Category browse (no keyword search on this platform):\nscripts/crawlora.sh /wayfair/category category=478390 | jq '.'\nscripts/crawlora.sh /zara/category/2420463/products | jq '.'\n\n# Store locator only (no product catalog):\nscripts/crawlora.sh /walgreens/stores zip=10001 | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every endpoint\nthis skill uses, including its method, path, parameters, and platform coverage.\n\n## Examples\n\n- **Cross-marketplace price compare:** search `/amazon/search` and `/ebay/search`\n  for the same query, collect `price` from each, and present the spread.\n- **Seller due diligence:** `/ebay/seller/{seller}` + `/ebay/seller/{seller}/feedback`\n  to summarize a seller's rating and recent feedback before buying.\n- **Shopify catalog audit:** `/shopify/products` (paginate) to list a store's\n  catalog with prices, then flag items above/below a threshold.\n- **No-search retailer browse:** for a retailer with no keyword search\n  (Kohl's, Wayfair, Sam's Club), call the category/department-discovery\n  endpoint first (`/kohls/category`'s facets, `/wayfair/categories`,\n  `/samsclub/departments`) to find a category id, then browse it directly\n  instead of trying to search by keyword.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public product/listing pages; respect each marketplace's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Results are paginated — pass `page` (and `count` where supported) to walk listings.\n- **Zalando always needs `market`** (no default storefront) — resolve valid\n  codes via `/zalando/markets` if unsure.\n- **Macy's has no search or category browse** — only `/macys/product/{productId}`\n  (needs a known `productId`) and `/macys/suggest` typeahead.\n- **Wayfair has no search and no reviews endpoint** — only\n  `/wayfair/categories` → `/wayfair/category` and `/wayfair/product/{id}`\n  (which carries an aggregate rating, but no review text).\n- **Kohl's has no search or standalone product-detail endpoint** — browse\n  `/kohls/category` (its `category` param takes a `+`-joined taxonomy string,\n  percent-encode the `+` as `%2B`) and read product cards from the listing;\n  `/kohls/product/reviews` needs the `web_id` from that listing.\n- **Sam's Club has no keyword-search endpoint** — start from\n  `/samsclub/departments` or `/samsclub/category`; there's also no dedicated\n  reviews endpoint (rating/review count only comes from `/samsclub/product/{id}`).\n- **Lululemon has no keyword-search endpoint** — browse via\n  `/lululemon/categories` → `/lululemon/category`; reviews are embedded in\n  `/lululemon/product/{product_id}`, not a separate call.\n- **Zara's `/zara/search` requires `section`** (a department like `WOMAN`),\n  and Zara exposes no reviews endpoint at all.\n- **Old Navy's endpoints are shared across four storefronts** — pass\n  `brand=on|gap|br|at` (Old Navy/Gap/Banana Republic/Athleta; defaults to\n  `on`); a `cid`/`pid` found under one brand only works with that same brand.\n\n## AliExpress product and attribute comparisons\n\nDiscover `aliexpress_search_filters` for the exact query before applying its\nattribute IDs and value IDs to search. Attribute pairs are query-specific, with\nat most one value per group and up to five pairs; do not reuse another search's\nfacet identifiers. Preserve listing variant, currency (search price filters use\nUSD), seller/condition evidence, shipping basis, and returned source identifiers.\nReview samples do not authenticate a seller or establish typical delivery times.\nChoice/free-shipping flags are source labels; quoted shipping and total cost can\nstill depend on destination and checkout conditions. Compare observed offers,\nnot guaranteed landed costs or transaction volume inferred from sort order.\n\n```sh\nscripts/crawlora.sh /aliexpress/search-filters q=\"usb c hub\"\nscripts/crawlora.sh /aliexpress/search q=\"usb c hub\" page=1 sort=best_match\n```\n\nFile v1.0.21:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"product-price-research\",\n  \"version\": \"1.0.21\",\n  \"publishedAt\": 1791163226237\n}\n\nFile v1.0.21:reference/endpoints.md\n\n# product-price-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**233 endpoints across 36 platform group(s).**\n\n## Amazon (5)\n\n### `amazon_charts`\n\n- **HTTP:** `GET /amazon/charts`\n- **What:** Amazon product charts. Returns one page of a ranked Amazon chart (Best Sellers, New Releases, or Most Wished For) for a department or department subcategory on `amazon.com`. Discover valid department/node values with amazon-charts-categories.\n- **Params:** `chart` (string, **required**) — Chart type; `department` (string, **required**) — Amazon department slug; `node` (string, optional) — Numeric browse node id; `page` (integer, optional) — 1-based page number\n\n### `amazon_charts_categories`\n\n- **HTTP:** `GET /amazon/charts/categories`\n- **What:** Amazon chart categories. Returns the department and subcategory values amazon-charts accepts for a given chart. Omit department to list a chart's top-level departments; pass a department (and optionally a node) to get that category's own name plus its immediate child categories.\n- **Params:** `chart` (string, **required**) — Chart type; `department` (string, optional) — Amazon department slug; `node` (string, optional) — Numeric browse node id (requires department)\n\n### `amazon_product`\n\n- **HTTP:** `GET /amazon/product/{asin}`\n- **What:** Retrieve Amazon product details. Returns normalized product details for an Amazon ASIN on `amazon.com`, including pricing, availability, overview data, inline review samples, and descriptive content.\n- **Params:** `asin` (string, **required**) — Amazon ASIN; `currency` (string, optional) — Amazon currency; `language` (string, optional) — Amazon language\n\n### `amazon_search`\n\n- **HTTP:** `GET /amazon/search`\n- **What:** Search Amazon products. Returns normalized Amazon search result cards for `amazon.com`.\n- **Params:** `k` (string, **required**) — Search keyword; `page` (integer, optional) — 1-based page number; `s` (string, optional) — Sort order\n\n### `amazon_suggest`\n\n- **HTTP:** `GET /amazon/suggest/{keyword}`\n- **What:** Retrieve Amazon search suggestions. Returns typeahead keyword suggestions from Amazon's public suggestion API for `amazon.com`.\n- **Params:** `keyword` (string, **required**) — Suggestion prefix\n\n## eBay (10)\n\n### `ebay_item`\n\n- **HTTP:** `GET /ebay/item/{item_id}`\n- **What:** Get eBay item details. Returns normalized details for a public eBay item listing.\n- **Params:** `item_id` (string, **required**) — eBay item ID\n\n### `ebay_live_stream`\n\n- **HTTP:** `GET /ebay/live/streams/{id}`\n- **What:** Get an eBay Live stream. Returns normalized detail for a single eBay Live stream/event, including each host's feedback summary for the last 365 days.\n- **Params:** `id` (string, **required**) — eBay Live stream/event id\n\n### `ebay_live_stream_items`\n\n- **HTTP:** `GET /ebay/live/streams/{id}/items`\n- **What:** List an eBay Live stream's featured items. Returns the currently featured/auction items for an eBay Live stream, including live bidding state.\n- **Params:** `id` (string, **required**) — eBay Live stream/event id\n\n### `ebay_live_streams`\n\n- **HTTP:** `GET /ebay/live/streams`\n- **What:** List eBay Live streams. Returns currently live and upcoming eBay Live streams for a category channel.\n- **Params:** `category` (string, optional) — eBay Live category channel, defaults to explore; `request_number` (integer, optional) — Pagination cursor from a previous response's next_request_number, defaults to 0; `session_id` (string, optional) — Pagination session id from a previous response's session_id\n\n### `ebay_live_streams_batch`\n\n- **HTTP:** `GET /ebay/live/streams/batch`\n- **What:** Get multiple eBay Live streams. Returns normalized summaries for multiple eBay Live streams/events in one call, up to 9 ids per request.\n- **Params:** `ids` (string, **required**) — One or more eBay Live stream/event ids, up to 9. Comma-separated or repeated query values are both accepted.\n\n### `ebay_search`\n\n- **HTTP:** `POST /ebay/search`\n- **What:** Search eBay listings. Returns normalized eBay search results.\n- **Params:** `option` (object, **required**) — eBay search payload\n- **REST body:** Send the value of the MCP argument `option` directly as the JSON body; do not wrap it in a `option` property.\n\n### `ebay_seller`\n\n- **HTTP:** `GET /ebay/seller/{seller}`\n- **What:** Get eBay seller profile. Returns normalized details for a public eBay seller profile.\n- **Params:** `seller` (string, **required**) — eBay seller username\n\n### `ebay_seller_about`\n\n- **HTTP:** `GET /ebay/seller/{seller}/about`\n- **What:** Get eBay seller about details. Returns normalized seller about information from the public eBay store about tab, including seller stats, top-rated status, optional location/member-since fields, and cleaned store categories.\n- **Params:** `seller` (string, **required**) — eBay seller username\n\n### `ebay_seller_feedback`\n\n- **HTTP:** `GET /ebay/seller/{seller}/feedback`\n- **What:** Get eBay seller feedback. Returns normalized seller feedback summary, detailed ratings, and recent review cards from the public eBay seller feedback tab.\n- **Params:** `page` (integer, optional) — Feedback page number; `per_page` (integer, optional) — Reviews per page; `seller` (string, **required**) — eBay seller username\n\n### `ebay_seller_shop`\n\n- **HTTP:** `GET /ebay/seller/{seller}/shop`\n- **What:** Get eBay seller shop listings. Returns normalized listings from the public eBay seller shop tab, with pagination backed by the store odtRefresh response.\n- **Params:** `page` (integer, optional) — Shop page number; `seller` (string, **required**) — eBay seller username\n\n## Shopify (11)\n\n### `shopify_collection_products`\n\n- **HTTP:** `GET /shopify/collections/{handle}/products`\n- **What:** List Shopify collection products. Returns normalized products from a public Shopify collection `/products.json` endpoint. `sortBy` and dynamic facet-filter query params (e.g. `fit`, `canonicalColour`) only take effect for headless storefronts served via the embedded-SSR-JSON fallback transport (`transport_mode: \"ssr_embedded\"`) and return an invalid-param error if supplied against a classic-transport store, since Shopify's classic public catalog JSON has no server-side sort or filter support. `sort_by`, `min_price`, `max_price`, `product_type`, `in_stock_only`, and `option_`-prefixed params (e.g. `option_size=Small,Medium`) drive a separate, independent mechanism -- Shopify's own native Storefront Filtering collection-page feature (`transport_mode: \"storefront_filtered\"`) -- which works for both classic- and SSR-fallback-transport stores; supplying any of these takes precedence over sortBy/dynamic facet filters.\n- **Params:** `handle` (string, **required**) — Collection handle; `in_stock_only` (boolean, optional) — Storefront-filtering transport. true restricts to currently in-stock items only.; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `max_price` (number, optional) — Storefront-filtering transport. Maximum price (inclusive), in the storefront's display currency's major unit.; `min_price` (number, optional) — Storefront-filtering transport. Minimum price (inclusive), in the storefront's display currency's major unit.; `option_size` (string, optional) — Storefront-filtering transport. Example dynamic variant-option filter: comma-separated exact display values for the storefront's own size option (e.g. option_size=Small,Medium). Any variant option name is accepted the same way (option_color, ...) -- see facets in an unfiltered response for the live option names/values per store.; `page` (integer, optional) — 1-based page, defaults to 1; `product_type` (string, optional) — Storefront-filtering transport, comma-separated. Exact product-type display strings from the storefront's own Product Type facet -- see facets.product_type in an unfiltered response for the live value set.; `sortBy` (string, optional) — SSR-fallback transport only (transport_mode ssr_embedded). Allowed values: sortLTH, sortHTL, newest. Omit for the storefront's default relevancy order. Rejected as an invalid param for classic-transport stores.; `sort_by` (string, optional) — Storefront-filtering transport. Allowed values: manual, best-selling, title-ascending, title-descending, price-ascending, price-descending, created-ascending, created-descending. Omit for the collection's own default order.; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_collections`\n\n- **HTTP:** `GET /shopify/collections`\n- **What:** List Shopify collections. Returns normalized collections from a public Shopify `/collections.json` endpoint. Valid empty result pages return `200` with an empty collections array.\n- **Params:** `limit` (integer, optional) — Maximum collections, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_page`\n\n- **HTTP:** `GET /shopify/pages/{handle}`\n- **What:** Get Shopify page. Returns normalized page detail from Shopify's credential-free `/pages/{handle}.json` endpoint. Page body HTML is returned as cleaned text only.\n- **Params:** `handle` (string, **required**) — Page handle; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_pages`\n\n- **HTTP:** `GET /shopify/pages`\n- **What:** List Shopify pages. Returns normalized static pages from a public Shopify `/pages.json` endpoint. Page body HTML is returned as cleaned text only.\n- **Params:** `limit` (integer, optional) — Maximum pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_product`\n\n- **HTTP:** `GET /shopify/products/{handle}`\n- **What:** Get Shopify product. Returns normalized product detail from Shopify's credential-free product handle `.js` endpoint.\n- **Params:** `handle` (string, **required**) — Product handle; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_product_recommendations`\n\n- **HTTP:** `GET /shopify/products/{handle}/recommendations`\n- **What:** List Shopify product recommendations. Returns normalized recommended products from Shopify's credential-free recommendations Ajax endpoint. The route handle is resolved to a Shopify product id before fetching recommendations.\n- **Params:** `handle` (string, **required**) — Product handle; `intent` (string, optional) — Recommendation intent. Allowed values: related, complementary; `limit` (integer, optional) — Maximum products, defaults to 10 and supports up to 20; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_products`\n\n- **HTTP:** `GET /shopify/products`\n- **What:** List Shopify products. Returns normalized products from a public Shopify `/products.json` endpoint. Valid empty result pages return `200` with an empty products array. `sortBy` and dynamic facet-filter query params (e.g. `fit`, `canonicalColour`) only take effect for headless storefronts served via the embedded-SSR-JSON fallback transport (`transport_mode: \"ssr_embedded\"`) and return an invalid-param error if supplied against a classic-transport store, since Shopify's classic public catalog JSON has no server-side sort or filter support. `sort_by`, `min_price`, `max_price`, `product_type`, `in_stock_only`, and `option_`-prefixed params (e.g. `option_size=Small,Medium`) drive a separate, independent mechanism -- Shopify's own native Storefront Filtering collection-page feature (`transport_mode: \"storefront_filtered\"`) -- which works for both classic- and SSR-fallback-transport stores; supplying any of these takes precedence over sortBy/dynamic facet filters.\n- **Params:** `in_stock_only` (boolean, optional) — Storefront-filtering transport. true restricts to currently in-stock items only.; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `max_price` (number, optional) — Storefront-filtering transport. Maximum price (inclusive), in the storefront's display currency's major unit.; `min_price` (number, optional) — Storefront-filtering transport. Minimum price (inclusive), in the storefront's display currency's major unit.; `option_size` (string, optional) — Storefront-filtering transport. Example dynamic variant-option filter: comma-separated exact display values for the storefront's own size option (e.g. option_size=Small,Medium). Any variant option name is accepted the same way (option_color, ...) -- see facets in an unfiltered response for the live option names/values per store.; `page` (integer, optional) — 1-based page, defaults to 1; `product_type` (string, optional) — Storefront-filtering transport, comma-separated. Exact product-type display strings from the storefront's own Product Type facet -- see facets.product_type in an unfiltered response for the live value set.; `sortBy` (string, optional) — SSR-fallback transport only (transport_mode ssr_embedded). Allowed values: sortLTH, sortHTL, newest. Omit for the storefront's default relevancy order. Rejected as an invalid param for classic-transport stores.; `sort_by` (string, optional) — Storefront-filtering transport. Allowed values: manual, best-selling, title-ascending, title-descending, price-ascending, price-descending, created-ascending, created-descending. Omit for the collection's own default order.; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_search_suggest`\n\n- **HTTP:** `GET /shopify/search/suggest`\n- **What:** Get Shopify search suggestions. Returns products, collections, and query suggestions from Shopify's credential-free predictive search Ajax endpoint.\n- **Params:** `limit` (integer, optional) — Maximum results per type, defaults to 10 and supports up to 20; `q` (string, **required**) — Search query; `types` (string, optional) — Comma-separated suggestion types. Allowed values: product, collection, query; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_sitemap_urls`\n\n- **HTTP:** `GET /shopify/sitemap/urls`\n- **What:** List Shopify sitemap URLs. Fetches capped URL entries from Shopify child sitemaps matching the requested type.\n- **Params:** `limit` (integer, optional) — Maximum URL entries, defaults to 50 and supports up to 250; `type` (string, optional) — Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_sitemaps`\n\n- **HTTP:** `GET /shopify/sitemaps`\n- **What:** List Shopify sitemaps. Returns child sitemap URLs from a public Shopify `/sitemap.xml` index with inferred sitemap types.\n- **Params:** `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_store`\n\n- **HTTP:** `GET /shopify/store`\n- **What:** Get Shopify store metadata. Resolves a public Shopify storefront and returns normalized metadata from credential-free storefront JSON. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page.\n- **Params:** `url` (string, **required**) — Shopify storefront URL\n\n## Shop.app (16)\n\n### `shop_app_analysis`\n\n- **HTTP:** `GET /shop-app/analysis`\n- **What:** Analyze Shop.app query results. Returns a market snapshot derived from Shop.app search results, including price ranges, currencies, sale counts, discounts, and top shops. Limit defaults to 20 and accepts values up to 50.\n- **Params:** `deep_search` (boolean, optional) — Enable Shop.app deep search mode; `in_stock` (boolean, optional) — Request in-stock products; `limit` (integer, optional) — Maximum products to analyze, defaults to 20 and supports up to 50; `on_sale` (boolean, optional) — Request sale products; `query` (string, **required**) — Search query\n\n### `shop_app_categories`\n\n- **HTTP:** `GET /shop-app/categories`\n- **What:** List Shop.app categories. Returns public Shop.app product categories.\n- **Params:** _none_\n\n### `shop_app_collection_products`\n\n- **HTTP:** `GET /shop-app/shops/{handle}/collections/{collection_id}/products`\n- **What:** List Shop.app collection products. Returns public product cards from a Shop.app merchant collection. sort_by allowed values: MOST_SALES, PRICE_LOW_TO_HIGH, PRICE_HIGH_TO_LOW, RELEVANCE.\n- **Params:** `collection_id` (string, **required**) — Collection id; `handle` (string, **required**) — Shop handle; `in_stock` (boolean, optional) — Request in-stock products; `limit` (integer, optional) — Maximum products, defaults to 30 and supports up to 60; `sort_by` (string, optional) — Sort mode\n\n### `shop_app_product`\n\n- **HTTP:** `GET /shop-app/products/{id}`\n- **What:** Get Shop.app product. Returns normalized public product details from Shop.app.\n- **Params:** `id` (string, **required**) — Product id; `variant_id` (string, optional) — Variant id\n\n### `shop_app_product_related`\n\n- **HTTP:** `GET /shop-app/products/{id}/related`\n- **What:** List Shop.app related products. Returns related product cards from a public Shop.app product page.\n- **Params:** `id` (string, **required**) — Product id; `limit` (integer, optional) — Maximum products, defaults to 20 and supports up to 50\n\n### `shop_app_product_reviews`\n\n- **HTTP:** `GET /shop-app/products/{id}/reviews`\n- **What:** List Shop.app product reviews. Returns public product reviews from a Shop.app product page.\n- **Params:** `id` (string, **required**) — Product id; `limit` (integer, optional) — Maximum reviews, defaults to 20 and supports up to 50\n\n### `shop_app_product_shop`\n\n- **HTTP:** `GET /shop-app/products/{id}/shop`\n- **What:** Get the Shop.app shop for a product. Resolves the public Shop.app merchant profile for a product id.\n- **Params:** `id` (string, **required**) — Product id\n\n### `shop_app_product_variant`\n\n- **HTTP:** `GET /shop-app/products/{id}/variant`\n- **What:** Get a Shop.app product variant by selected options. Returns the exact public product variant matching selected options. selected_options must be a JSON object when provided. Repeated option filters may also be sent as option.Name=value or option[Name]=value.\n- **Params:** `id` (string, **required**) — Product id; `selected_options` (string, optional) — Selected options JSON object\n\n### `shop_app_product_variants`\n\n- **HTTP:** `GET /shop-app/products/{id}/variants`\n- **What:** List Shop.app product variants. Returns adjacent variants for a Shop.app product. selected_options must be a JSON object when provided. Repeated option filters may also be sent as option.Name=value or option[Name]=value.\n- **Params:** `id` (string, **required**) — Product id; `limit` (integer, optional) — Maximum variants, defaults to 50 and supports up to 100; `selected_options` (string, optional) — Selected options JSON object\n\n### `shop_app_search`\n\n- **HTTP:** `GET /shop-app/search`\n- **What:** Search Shop.app products. Searches Shop.app product results using the credential-free public web search flow. Limit defaults to 20 and accepts values up to 50.\n- **Params:** `deep_search` (boolean, optional) — Enable Shop.app deep search mode; `in_stock` (boolean, optional) — Request in-stock products; `limit` (integer, optional) — Maximum products, defaults to 20 and supports up to 50; `on_sale` (boolean, optional) — Request sale products; `query` (string, **required**) — Search query\n\n### `shop_app_shop`\n\n- **HTTP:** `GET /shop-app/shops/{handle}`\n- **What:** Get Shop.app shop. Returns public Shop.app merchant profile details.\n- **Params:** `handle` (string, **required**) — Shop handle\n\n### `shop_app_shop_locations`\n\n- **HTTP:** `GET /shop-app/shops/{handle}/locations`\n- **What:** List Shop.app shop locations. Returns public retail locations for a Shop.app merchant profile.\n- **Params:** `handle` (string, **required**) — Shop handle; `limit` (integer, optional) — Maximum locations, defaults to 10 and supports up to 50\n\n### `shop_app_shop_products`\n\n- **HTTP:** `GET /shop-app/shops/{handle}/products`\n- **What:** List Shop.app shop products. Returns public product cards from a Shop.app merchant profile. sort_by allowed values: MOST_SALES, PRICE_LOW_TO_HIGH, PRICE_HIGH_TO_LOW, RELEVANCE.\n- **Params:** `handle` (string, **required**) — Shop handle; `in_stock` (boolean, optional) — Request in-stock products; `limit` (integer, optional) — Maximum products, defaults to 30 and supports up to 60; `sort_by` (string, optional) — Sort mode\n\n### `shop_app_shop_reviews`\n\n- **HTTP:** `GET /shop-app/shops/{handle}/reviews`\n- **What:** List Shop.app shop reviews. Returns public reviews for a Shop.app merchant profile.\n- **Params:** `handle` (string, **required**) — Shop handle; `limit` (integer, optional) — Maximum reviews, defaults to 20 and supports up to 50\n\n### `shop_app_shop_typeahead`\n\n- **HTTP:** `GET /shop-app/shops/{handle}/typeahead`\n- **What:** Suggest products and collections inside a Shop.app shop. Returns public store typeahead suggestions for a Shop.app merchant profile.\n- **Params:** `handle` (string, **required**) — Shop handle; `limit` (integer, optional) — Maximum suggestions, defaults to 20 and supports up to 20; `query` (string, **required**) — Typeahead query\n\n### `shop_app_suggestions`\n\n- **HTTP:** `GET /shop-app/suggestions`\n- **What:** Suggest Shop.app searches. Returns Shop.app autocomplete suggestions. Limit defaults to 10 and supports up to 20.\n- **Params:** `limit` (integer, optional) — Maximum suggestions, defaults to 10 and supports up to 20; `query` (string, **required**) — Search query\n\n## Target (8)\n\n### `target_categories`\n\n- **HTTP:** `GET /target/categories`\n- **What:** List all Target categories. Returns Target's current top-level category menu and the complete grouped shop-all directory, including category ids and canonical URLs.\n- **Params:** _none_\n\n### `target_category_products`\n\n- **HTTP:** `GET /target/category-products`\n- **What:** Browse Target category products. Returns paginated products for any category id from target-categories. Each response also contains every available dynamic filter group and option. Pass selected option ids through filter_ids as a comma-separated list. The sort enum accepts `relevance`, `featured`, `price-low`, `price-high`, `rating`, `bestselling`, and `newest`.\n- **Params:** `category_id` (string, **required**) — Target category id; `filter_ids` (string, optional) — Comma-separated Target filter option ids; `page` (integer, optional) — One-based page (1-50); `sort` (string, optional) — Result order; `store_id` (integer, optional) — Target store id used for pricing\n\n### `target_filter_options`\n\n- **HTTP:** `GET /target/filter-options`\n- **What:** List Target filter options. Returns every dynamic filter group and option for either a product query or category. Provide exactly one of q or category_id. Pass currently selected option ids through filter_ids to obtain the remaining context-aware options.\n- **Params:** `category_id` (string, optional) — Target category id; mutually exclusive with q; `filter_ids` (string, optional) — Comma-separated selected Target filter option ids; `q` (string, optional) — Product search query; mutually exclusive with category_id; `store_id` (integer, optional) — Target store id used for pricing\n\n### `target_product`\n\n- **HTTP:** `GET /target/product`\n- **What:** Get a Target product. Returns normalized product details for one Target item, including product content, images, price, rating, category, and availability flags for the selected store.\n- **Params:** `store_id` (integer, optional) — Target store id used for pricing and availability; `tcin` (string, **required**) — Numeric Target item id (TCIN)\n\n### `target_questions`\n\n- **HTTP:** `GET /target/questions`\n- **What:** List Target product questions and answers. Returns paginated product questions with their nested answers.\n- **Params:** `page` (integer, optional) — Zero-based page; `per_page` (integer, optional) — Questions per page; `tcin` (string, **required**) — Numeric Target item id\n\n### `target_reviews`\n\n- **HTTP:** `GET /target/reviews`\n- **What:** List Target product reviews. Returns paginated written reviews for a Target item. Pagination is zero-based and page 50 is the upstream maximum.\n- **Params:** `page` (integer, optional) — Zero-based page; `per_page` (integer, optional) — Reviews per page; `tcin` (string, **required**) — Numeric Target item id\n\n### `target_search`\n\n- **HTTP:** `GET /target/search`\n- **What:** Search Target products. Searches Target products and returns normalized products plus every filter group and option available for the current result set. Pass option ids back through filter_ids as a comma-separated list. A zero total with an empty products list is a valid no-results response. The sort enum accepts `relevance`, `featured`, `price-low`, `price-high`, `rating`, `bestselling`, and `newest`.\n- **Params:** `filter_ids` (string, optional) — Comma-separated Target filter option ids; `page` (integer, optional) — One-based page (1-50); `q` (string, **required**) — Product search query; `sort` (string, optional) — Result order; `store_id` (integer, optional) — Target store id used for pricing\n\n### `target_stores`\n\n- **HTTP:** `GET /target/stores`\n- **What:** Find Target stores near a location. Returns Target's physical stores near a ZIP code, a free-text \"city, state\", or a \"latitude,longitude\" pair, including each store's store_id, status, distance, phone, address, service list, time zone, and two weeks of daily opening hours. Use the returned store_id values with the store_id parameter on target-search, target-category-products, target-filter-options, and target-product.\n- **Params:** `limit` (integer, optional) — Maximum stores to return (1-20); `place` (string, **required**) — ZIP code, city/state, or latitude,longitude; `within` (integer, optional) — Search radius in miles (1-5000)\n\n## Costco (6)\n\n### `costco_categories`\n\n- **HTTP:** `GET /costco/categories`\n- **What:** Get Costco category facets. Returns Costco category slugs and product counts relevant to an optional search term, each slug usable directly with GET /costco/search's category filter. Public data sourced from Costco's own search backend.\n- **Params:** `query` (string, optional) — Search text to scope the returned categories to, e.g. \\\n\n### `costco_product`\n\n- **HTTP:** `GET /costco/product/{id}`\n- **What:** Get a Costco product's detail. Returns a Costco product's detail: title, description, manufacturer, image, price, stock status, and rating. Public data sourced from Costco's own product backend.\n- **Params:** `id` (string, **required**) — Costco product id, e.g. from a search result's id field or a product page URL's \\\n\n### `costco_product_availability`\n\n- **HTTP:** `GET /costco/product/{id}/availability`\n- **What:** Get a Costco product's delivery estimate. Returns a Costco product's stock and estimated-delivery status for a delivery destination. Public data sourced from Costco's own fulfillment backend.\n- **Params:** `id` (string, **required**) — Costco product id; `postal_code` (string, **required**) — US destination ZIP code; `state` (string, **required**) — US destination two-letter state code\n\n### `costco_product_reviews`\n\n- **HTTP:** `GET /costco/product/{id}/reviews`\n- **What:** Get a Costco product's reviews. Returns a page of a Costco product's reviews: title, text, rating, author, and recommendation for each. Public data sourced from Costco's own review platform.\n- **Params:** `id` (string, **required**) — Costco product id, e.g. from a search result's id field\n\n### `costco_search`\n\n- **HTTP:** `GET /costco/search`\n- **What:** Search Costco products. Returns public Costco products matching a text query and/or a category slug: title, brand, model, image, and rating for each result. Public data sourced from Costco's own search backend.\n- **Params:** `category` (string, optional) — Costco category slug, e.g. the last path segment of a category page URL; `query` (string, optional) — Search text\n\n### `costco_warehouses`\n\n- **HTTP:** `GET /costco/warehouses`\n- **What:** Find nearby Costco warehouses. Returns Costco warehouses near a latitude/longitude, sorted by distance: name, address, and distance for each. Public data sourced from Costco's own warehouse locator backend.\n- **Params:** `latitude` (number, **required**) — Latitude; `longitude` (number, **required**) — Longitude\n\n## Zalando (6)\n\n### `zalando_categories`\n\n- **HTTP:** `GET /zalando/categories`\n- **What:** List a Zalando market's top-level category navigation. Returns a Zalando country storefront's live top-level category navigation, department by department, scraped directly from that department's own storefront nav tab bar. This is the discovery source for zalando-category's category parameter — category slugs are market-specific (each storefront uses its own local-language slug), so there is no fixed value space to hardcode; this endpoint asks the upstream live instead. market is required (there is no default storefront) and accepts 25 country storefronts — see zalando-markets for the full current list with domains. department optionally restricts the response to one of women, men, or kids; omitting it returns all three. Scope note: only the top-level nav tabs (e.g. Clothing, Shoes, Sports) are returned, not each tab's own hover-revealed mega-menu of sub-categories — that panel is not present in the page's initial HTML and cannot be reached without executing JavaScript, which this endpoint's transport does not do.\n- **Params:** `department` (string, optional) — Restrict to one Zalando shopping department. Omit to return all three.; `market` (string, **required**) — Zalando country storefront\n\n### `zalando_category`\n\n- **HTTP:** `GET /zalando/category`\n- **What:** Browse a Zalando category or brand. Browses a Zalando category or brand listing by URL slug (e.g. shoes, womens-dresses, on-running) and returns the same normalized result cards as zalando-search, plus the category's upstream total_count. Category slugs are market-specific (each storefront uses its own local-language slug, e.g. \"shoes\" on de/gb, \"chaussures\" on fr, \"scarpe\" on it) — use zalando-categories to discover a market's live top-level slugs, or take one from a product's url field. market is required (there is no default storefront) and accepts 25 country storefronts — see zalando-markets for the full current list with domains.\n- **Params:** `category` (string, **required**) — Zalando category or brand URL slug, in the target market's own language; `market` (string, **required**) — Zalando country storefront\n\n### `zalando_markets`\n\n- **HTTP:** `GET /zalando/markets`\n- **What:** List supported Zalando country storefronts. Returns the Zalando country storefronts currently supported by the required market parameter on zalando-search, zalando-category, and zalando-product, with each market's domain. Static, credential-free metadata with no upstream request.\n- **Params:** _none_\n\n### `zalando_product`\n\n- **HTTP:** `GET /zalando/product`\n- **What:** Get a Zalando product. Returns normalized product details for one Zalando product, including brand, description, images, and per-size price/availability/GTIN. Pass the sku returned by zalando-search or zalando-category; Zalando's own site search resolves the sku to its canonical product page. market is required and must match the storefront the sku was found in (there is no default, and a sku is generally only listed for sale on the market(s) that carry it) — see zalando-markets for the full reference list.\n- **Params:** `market` (string, **required**) — Zalando country storefront the sku was found in; `sku` (string, **required**) — Zalando product SKU (article number) from zalando-search or zalando-category\n\n### `zalando_search`\n\n- **HTTP:** `GET /zalando/search`\n- **What:** Search Zalando products. Searches a Zalando country storefront by keyword and returns normalized result cards with price, brand, and image. Returns the first page of results as rendered by Zalando plus the upstream total_count; deeper pagination is not yet supported. market is required (there is no default storefront) and accepts 25 country storefronts — see zalando-markets for the full current list with domains.\n- **Params:** `market` (string, **required**) — Zalando country storefront; `q` (string, **required**) — Product search keyword\n\n### `zalando_suggest`\n\n- **HTTP:** `GET /zalando/suggest`\n- **What:** Autocomplete a Zalando search query. Returns Zalando's own search-box query completions for a partial keyword, e.g. \"running sho\" -> \"running shoes\", \"running shoes nike\". market is required (there is no default storefront) and accepts 25 country storefronts — see zalando-markets for the full current list with domains.\n- **Params:** `market` (string, **required**) — Zalando country storefront; `q` (string, **required**) — Partial search text to complete\n\n## Walmart (3)\n\n### `walmart_product`\n\n- **HTTP:** `GET /walmart/product/{item_id}`\n- **What:** Get a Walmart product. Returns a normalized Walmart product: price, availability, brand, images, rating, seller, description, highlights, specifications, and variants. Credential-free public Walmart data, rendered from the product page through proxied browser renderers.\n- **Params:** `item_id` (string, **required**) — Walmart item id (the numeric id in a /ip/{id} URL)\n\n### `walmart_product_reviews`\n\n- **HTTP:** `GET /walmart/product/{item_id}/reviews`\n- **What:** Get Walmart product reviews. Returns the reviews snapshot embedded in a Walmart product page: average rating, total review count, the per-star rating breakdown, the recommended percentage, the top positive and top negative review, and a sample of recent reviews. This is a single on-page snapshot, not a full paginated feed. A product that exists but has no reviews returns zero counts and an empty reviews list. Credential-free public Walmart data, rendered from the product page through proxied browser renderers.\n- **Params:** `item_id` (string, **required**) — Walmart item id (the numeric id in a /ip/{id} URL)\n\n### `walmart_search`\n\n- **HTTP:** `GET /walmart/search`\n- **What:** Search Walmart products. Returns Walmart search results: item id, title, brand, price, image, availability, seller, and rating per product. Credential-free public Walmart data, rendered from the search page through proxied browser renderers.\n- **Params:** `page` (integer, optional) — 1-based page number (default 1); `q` (string, **required**) — Search query; `sort` (string, optional) — Sort order\n\n## H&M (7)\n\n### `hm_categories`\n\n- **HTTP:** `GET /hm/categories`\n- **What:** Browse H&M's storefront category navigation. Returns H&M's own storefront category navigation, department by department: every direct nav item and subcategory currently shown in the site's own menu, with its display name and storefront URL. Where this build has separately verified the value against hm-listing's own category_id parameter, that id is included too; category_id is omitted for entries not yet verified rather than guessed, since the visible category label is confirmed NOT a reliable way to derive H&M's real listing category ids for every category. department, when given, filters the result to one department.\n- **Params:** `department` (string, optional) — Filter to one storefront department\n\n### `hm_listing`\n\n- **HTTP:** `GET /hm/listing`\n- **What:** Browse an H&M category's product listing. Returns one H&M category's product listing page: normalized products with pricing, images, colors, and per-size stock, sourced from H&M's own app-backend listing data. category_id is an H&M category slug (e.g. ladies_newarrivals_all, men_newarrivals_all, ladies_jeans) -- this build does not expose a category/nav-tree discovery endpoint, so category_id values are currently sourced from known H&M storefront paths rather than a lookup call. Pagination is page-based and real: requesting a page beyond the category's real last page returns a normal response with an empty products array rather than an error.\n- **Params:** `category_id` (string, **required**) — H&M category slug; `is_new` (boolean, optional) — Optional filter for newly added items only; `page` (integer, optional) — Page number, one-based, defaults to 1; `page_size` (integer, optional) — Results per page, 1 to 72, defaults to 36; `sort` (string, optional) — Sort order, defaults to RELEVANCE\n\n### `hm_product`\n\n- **HTTP:** `GET /hm/product/{product_id}`\n- **What:** Get an H&M product's full detail. Returns one H&M product's full detail: every purchasable color grouped with its own per-size price and live availability, plus an aggregate rating and real customer reviews (author label, date, body, rating, and any fit-feedback tags the reviewer left, such as \"True to Size\") when the product has any. This data is not available from hm-listing or hm-search, which only carry one representative price and a per-color stock count. product_id is the numeric id from a listing/search result's id field or its url field's productpage.<id>.html segment. An unrecognized product_id returns 404.\n- **Params:** `product_id` (string, **required**) — Numeric H&M product id, from a listing/search result's id field\n\n### `hm_product_related`\n\n- **HTTP:** `GET /hm/product/{product_id}/related`\n- **What:** Get an H&M product's related items. Returns every product-detail recommendation list H&M's own app shows for one product (which lists are present genuinely varies by product -- for example \"more from series\" and \"style with\" appear only when the product has one, while \"alternatives\" and \"upsell\" are more consistently present). An unrecognized product_id returns a well-formed empty result rather than an error.\n- **Params:** `product_id` (string, **required**) — Numeric H&M product id, from a listing/search result's id field\n\n### `hm_search`\n\n- **HTTP:** `GET /hm/search`\n- **What:** Search H&M product listings by free-text keyword. Runs a free-text keyword search against H&M's own app-backend search data and returns normalized products with pricing, images, colors, and per-size stock, plus search-quality metadata (a spelling-correction suggestion, related searches, and a content-filter flag). Unlike category browsing, an obscure or nonsense keyword returns a genuine empty result (zero products) rather than a fallback set. Pagination is page-based and real: requesting a page beyond the real last page returns a normal response with an empty products array rather than an error.\n- **Params:** `page` (integer, optional) — Page number, one-based, defaults to 1; `page_size` (integer, optional) — Results per page, 1 to 72, defaults to 36; `query` (string, **required**) — Free-text search keyword\n\n### `hm_search_suggestions`\n\n- **HTTP:** `GET /hm/search/suggestions`\n- **What:** Get H&M search-box suggestions. Returns H&M's own search-box typeahead suggestions, sourced from the same credential-free app-backend host as hm-listing/hm-search. When query is given, returns spelling-complete phrase suggestions and merchandised content results. When query is omitted or empty, instead returns trending searches and popular-search shortcuts (phrase/content suggestions are both empty in that mode). search_history is part of the real upstream response but confirmed NOT session-scoped -- it returned the identical list across separate cookie-free requests, so treat it as fixed default content rather than a real per-caller history.\n- **Params:** `query` (string, optional) — Free-text search-box input; omit or leave empty for trending/popular searches instead\n\n### `hm_stores`\n\n- **HTTP:** `GET /hm/stores`\n- **What:** Find nearby H&M physical stores. Returns H&M physical retail store locations near a point: name, phone, full address, and coordinates. Either search, or both lat and lng, is required. search is a free-text zip code or place name that is first resolved to coordinates; if it does not resolve to any location, a well-formed empty result is returned rather than an error. lat and lng, when given directly, skip that resolution step. radius_meters is optional (1000 to 50000, defaults to 10000). A location with no stores within the radius returns a well-formed empty result rather than an error.\n- **Params:** `lat` (number, optional) — Latitude, requires lng; `lng` (number, optional) — Longitude, requires lat; `radius_meters` (integer, optional) — Search radius in meters, 1000 to 50000, defaults to 10000; `search` (string, optional) — Free-text zip code or place name to resolve to coordinates\n\n## Kohl's (4)\n\n### `kohls_category`\n\n- **HTTP:** `GET /kohls/category`\n- **What:** Browse a Kohl's category or curated campaign page. Returns a Kohl's category or curated campaign page's product grid (page 1 only), with normalized products (title, image, colors, pricing, rating, availability) and facets for discovering further category values. category is Kohl's own catalog taxonomy string, e.g. \"Room:Dorm\" or \"Department:Kitchen & Dining\" -- combine multiple dimensions with a literal \"+\", percent-encoded as \"%2B\" so it survives as \"+\" rather than being decoded to a space (e.g. \"Room%3ADorm%2BDepartment%3ABedding\"). Every facets[].options[].category value in a response is a ready-to-use category string for a follow-up call, so a caller can discover the full taxonomy by starting from a known category (e.g. \"Room:Dorm\") and following facets. A category value Kohl's does not recognize returns a 404 rather than an unfiltered listing; a recognized dimension with no matching products returns a genuine zero-result response instead.\n- **Params:** `category` (string, **required**) — Kohl's catalog taxonomy string, e.g. \\\n\n### `kohls_product_reviews`\n\n- **HTTP:** `GET /kohls/product/reviews`\n- **What:** Browse a Kohl's product's customer reviews. Returns one page of a Kohl's product's normalized customer reviews (title, text, rating, secondary ratings such as quality/durability/value/style, reviewer name and location, submission date, and photo URLs). web_id is the same identifier a GET /kohls/category response's products[].web_id field carries. A web_id with zero reviews returns a genuine zero-result response rather than an error.\n- **Params:** `page` (integer, optional) — Page number, 10 reviews per page (default 1); `web_id` (string, **required**) — Kohl's product web id, e.g. from a GET /kohls/category response's products[].web_id\n\n### `kohls_stores`\n\n- **HTTP:** `GET /kohls/stores`\n- **What:** Find nearby Kohl's store locations. Returns physical Kohl's store locations near a free-text location (city/state, zip code, or address): address, phone, weekly hours, distance, and store badges/services. A search with no results returns a genuine empty list rather than an error.\n- **Params:** `search` (string, **required**) — Free-text location: city/state, zip code, or address\n\n### `kohls_suggest`\n\n- **HTTP:** `GET /kohls/suggest`\n- **What:** Kohl's search-box typeahead suggestions. Returns Kohl's own search-box typeahead result for a partial query: a flat list of suggested search phrases (no product data). A nonsense query returns a genuine, well-formed empty list rather than an error.\n- **Params:** `query` (string, **required**) — Partial search text, e.g. \\\n\n## Lululemon (5)\n\n### `lululemon_categories`\n\n- **HTTP:** `GET /lululemon/categories`\n- **What:** Browse lululemon's storefront category navigation. Returns lululemon's own storefront category navigation, flattened out of the site's shared header nav: every navigable category with its display name, breadcrumb path, and the exact category/cdp_hash pair lululemon-category's own parameters expect (read directly from the nav's own URL, not guessed from the display label). section, when given, filters the result to one top-level nav section.\n- **Params:** `section` (string, optional) — Filter to one top-level storefront nav section\n\n### `lululemon_category`\n\n- **HTTP:** `GET /lululemon/category`\n- **What:** Browse a lululemon category's product listing. Returns one lululemon category's product listing page: normalized products with pricing, sale detection, sizes, colors, and style numbers, sourced from lululemon's own app-backend category data. category and cdp_hash are the two path segments of a lululemon category URL (https://shop.lululemon.com/c/{category}/{cdp_hash}), e.g. women-new-styles and n14f1wz6o10 -- both are also available from lululemon-categories's own category and cdp_hash fields. Pagination is page-based and real: requesting a page beyond the category's real last page returns a normal response with an empty products array rather than an error. An unrecognized category/cdp_hash pair returns 404.\n- **Params:** `category` (string, **required**) — lululemon category slug, from a category URL's first path segment; `cdp_hash` (string, **required**) — lululemon category id, from a category URL's second path segment; `page` (integer, optional) — Page number, one-based, defaults to 1; `page_size` (integer, optional) — Results per page, 1 to 100, defaults to 24\n\n### `lululemon_outfit`\n\n- **HTTP:** `GET /lululemon/outfit`\n- **What:** Get lululemon's outfit/style recommendations for a product color. Returns lululemon's own curated outfit/style recommendations for one product color: every complementary item in each styled look, plus the anchor product itself. unified_id and color_code are lululemon-product's own unified_id response field and a color's code field (from lululemon-product's colors[] or lululemon-category's style_numbers-paired colors[]) -- not lululemon-product's own product_id, which is a different id space. Recommended items' own id is a separate, third-party catalog id (not lululemon-product's product_id) -- use each item's url to reach its product page. An unrecognized unified_id/color_code pair returns 404.\n- **Params:** `color_code` (string, **required**) — lululemon color code, from a lululemon-product result's colors[].code field; `unified_id` (string, **required**) — lululemon product unified id, from a lululemon-product result's unified_id field\n\n### `lululemon_product`\n\n- **HTTP:** `GET /lululemon/product/{product_id}`\n- **What:** Get a lululemon product's full detail. Returns one lululemon product's full detail: every purchasable color/size SKU with its own price, sale status, and live availability, plus an aggregate rating and real customer reviews when the product has any -- none of which lululemon-category exposes (it only carries one representative color/price per product). product_id is the id from a lululemon-category result's id field or a lululemon product URL's trailing path segment (https://shop.lululemon.com/p/{slug}/{product_id}) -- the slug itself is not needed. An unrecognized product_id returns 404.\n- **Params:** `product_id` (string, **required**) — lululemon product id, from a lululemon-category result's id field\n\n### `lululemon_stores`\n\n- **HTTP:** `GET /lululemon/stores`\n- **What:** Browse lululemon's physical store directory. Returns lululemon's own complete physical store directory (480 US and 86 Canada locations as of this endpoint's own research), including regular weekly hours and in-store amenities. All filters are optional and applied locally after fetching the full directory -- there is no live geo-search API on a credential-free host for this platform. country and state are free-text equality filters against the values this directory actually carries (2-letter codes, e.g. US/CA, NY/CA), not an enforced enum. lat and lng (both required together) filter to stores within radius_miles (1 to 500, defaults to 50), sorted nearest-first.\n- **Params:** `country` (string, optional) — Filter to one country by its 2-letter code; `lat` (number, optional) — Latitude, requires lng; `lng` (number, optional) — Longitude, requires lat; `radius_miles` (number, optional) — Search radius in miles, 1 to 500, defaults to 50; `state` (string, optional) — Filter to one state/province by its 2-letter code\n\n## Macy's (3)\n\n### `macys_product`\n\n- **HTTP:** `GET /macys/product/{productId}`\n- **What:** Get a Macy's product's full detail. Returns one Macy's product's full detail: name, brand, description, department/division, category breadcrumb, pricing (with sale detection), availability, images, aggregate rating, and every purchasable color variant with its own price. productId is a numeric id, taken from a Macy's product page's ?ID= query parameter.\n- **Params:** `productId` (string, **required**) — Numeric Macy's product id, from a product page's ?ID= query parameter\n\n### `macys_product_reviews`\n\n- **HTTP:** `GET /macys/product/reviews`\n- **What:** Get a Macy's product's customer reviews. Returns one page of a Macy's product's normalized customer reviews, plus a site-wide rating summary (rating count, average rating, recommended ratio, rating histogram) for the product. Sourced from a separate review platform Macy's own product pages embed, distinct from the product catalog itself. product_id is a numeric id, the same one used by GET /macys/product/{productId}. A product with zero reviews, or a well-formed but unrecognized product_id, returns a normal, empty result rather than an error.\n- **Params:** `page` (integer, optional) — Result page, 1-based, defaults to 1; `product_id` (string, **required**) — Numeric Macy's product id, from a product page's ?ID= query parameter\n\n### `macys_suggest`\n\n- **HTTP:** `GET /macys/suggest`\n- **What:** Get Macy's search-box suggestions. Returns Macy's own search-box suggestions (typeahead) for a partial query: a flat list of suggested search phrases, no product data. A partial query with no real matches returns a normal, empty result rather \n\nFile v1.0.21:skill-card.md\n\n## Description:\n\nResearches product listings, prices, sellers, and reviews across online marketplaces and retailers through the Crawlora API to support comparison and monitoring.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nShoppers, researchers, and commerce teams use this skill to find products and compare retailer prices, seller details, availability, and reviews without scraping storefront pages directly.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product queries and request parameters are sent to Crawlora with an API key.\n\nMitigation: Keep the key secret and avoid including personal or sensitive data in lookup queries.\n\nRisk: Competitive monitoring, live inventory figures, and regulated-product attributes can require extra care.\n\nMitigation: Review the endpoint reference and verify source data before using results for consequential decisions.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [ClawHub skill release](https://clawhub.ai/crawlora-org/skills/product-price-research)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON]\n\n**Output Format:** [Markdown summaries and JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Results depend on retailer coverage and may be paginated.]\n\n## Skill Version(s):\n\n1.0.21 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.20: 5 files, 48243 bytes\n\nFiles: reference/endpoints.md (159599b), scripts/crawlora.sh (21480b), skill-card.md (1838b), SKILL.md (11117b), _meta.json (142b)\n\nFile v1.0.20:SKILL.md\n\n---\nname: product-price-research\ndescription: Researches products, prices, sellers, and reviews across major online marketplaces and big-box/specialty retailers (Amazon, eBay, Shopify stores, Shop.app, Target, Costco, Walmart, Nike, Zara, Adidas, Best Buy, Home Depot, Sephora, SHEIN, IKEA, Chewy, and more) using the Crawlora API, returning clean JSON. Use when the user asks to find a product, compare prices or sellers, track listings, or pull marketplace/retailer reviews — instead of scraping store pages.\n---\n\n# Product & price research\n\nLook up and compare products, prices, sellers, and reviews across Amazon,\neBay, Shopify storefronts, Shop.app, Target, Costco, Zalando, Walmart, H&M,\nKohl's, Lululemon, Macy's, Nike, Old Navy (plus Gap, Banana Republic, and\nAthleta under the same endpoints), Sam's Club, Ulta Beauty, Wayfair, Wish,\nZappos, Zara, Adidas, Best Buy, Home Depot, Sephora, SHEIN, IKEA, and\nChewy — all as normalized JSON from the Crawlora API, with no HTML\nscraping. Walgreens is store-locator only (no product catalog).\n\n## When to use this skill\n\n- \"What does X cost on Amazon / eBay / Target / Walmart?\" or \"compare prices\n  for X across sellers/retailers.\"\n- \"Find listings for X\" / \"search this Shopify store\" / \"what's in this collection?\"\n- \"Pull reviews / ratings for this product or seller.\"\n- \"Track this product's price / variants / availability.\"\n- Competitive pricing, catalog, or marketplace-review research.\n- \"Browse category X on Wayfair / Kohl's / Sam's Club\" when the retailer has\n  no keyword search of its own.\n- Apparel/beauty catalog lookups spanning Nike, Zara, H&M, Old Navy/Gap/Banana\n  Republic/Athleta, Lululemon, Ulta Beauty, Adidas, or Sephora.\n- Home-goods/electronics/pet lookups spanning Home Depot, Best Buy, IKEA, or Chewy.\n- \"Find the nearest Walgreens\" (store locator only — no product catalog).\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\nPick the marketplace, then the job:\n\n1. **Search / discover** — `/amazon/search`, `/ebay/search`, `/shopify/products`,\n   `/shop-app/search`, `/target/search`, `/costco/search`, `/walmart/search`,\n   `/hm/search`, `/nike/search`, `/oldnavy/search` (covers Old Navy, Gap,\n   Banana Republic, and Athleta via `brand=on|gap|br|at`, defaults to `on`),\n   `/ulta/search`, `/wish/search`, `/zappos/search`, `/zara/search` (**requires\n   `section`**, a department like `WOMAN`/`MAN`), and `/zalando/search` (this\n   one **requires `market`** — a Zalando country storefront code like `de`,\n   `fr`, `com`; list them via `/zalando/markets`) to find candidate products by\n   keyword. **Kohl's, Lululemon, Macy's, Sam's Club, and Wayfair have no\n   keyword-search endpoint** — browse a category instead:\n   `/kohls/category` (facets give follow-up category strings),\n   `/lululemon/categories` → `/lululemon/category`, `/samsclub/departments` →\n   `/samsclub/category`, and `/wayfair/categories` → `/wayfair/category`.\n   Macy's has neither search nor category browse at all — only direct\n   `productId` lookup (below) plus `/macys/suggest` typeahead.\n   `/adidas/search` (`query` or `category`, exactly one required),\n   `/bestbuy/search` (`q`), `/homedepot/search` (`q`), `/sephora/search`\n   (`query`, plus `brand`/`filter`/`price_min`+`price_max`\n   as a matched pair/`rating_min`/`is_new` facets), `/ikea/search`\n   (`q`, or an IKEA item number resolves directly), and `/chewy/search`\n   (`q` — a strong category match like \"dog food\" transparently redirects\n   to that category listing) round out search. **Walgreens has no product\n   catalog at all** — `/walgreens/stores` (lat/lon or zip) is its only\n   endpoint, for store lookup.\n2. **Detail** — fetch a specific product (`/amazon/product`, `/ebay/item`,\n   `/shopify/products/{handle}`, `/shop-app/products/{id}`,\n   `/target/product` (`tcin`), `/costco/product/{id}`, `/walmart/product/{item_id}`,\n   `/zalando/product` (`sku`+`market`), `/hm/product/{product_id}`,\n   `/nike/product` (`slug`+`style_color`), `/oldnavy/product` (`pid`+`brand`),\n   `/lululemon/product/{product_id}`, `/macys/product/{productId}`,\n   `/samsclub/product/{id}`, `/ulta/product/{productId}`, `/wayfair/product/{id}`,\n   `/wish/product/{id}`, `/zappos/product/{productId}`, `/zara/product/{productId}`,\n   `/adidas/product` (`product_id`), `/bestbuy/product` (`sku`),\n   `/homedepot/product/{id}`, `/sephora/product` (`product_id` — the full\n   product-page slug like `lip-sleeping-mask-P420652`, not just the SKU),\n   `/shein/products/detail` (`goods_id`+`goods_sn`), `/ikea/product`\n   (`item_no`), `/chewy/product` (`id`))\n   for price, variants, specs. **Kohl's has no standalone product-detail\n   endpoint** — product cards (including `web_id`, needed for reviews below)\n   only come back embedded in `/kohls/category`'s listing.\n3. **Sellers** — for eBay/Shop.app, resolve the seller/shop (`/ebay/seller/...`,\n   `/shop-app/shops/{handle}`) to compare offers.\n4. **Reviews** — pull product/seller reviews where available\n   (`/shop-app/products/{id}/reviews`, `/ebay/seller/.../feedback`,\n   `/target/reviews`, `/costco/product/{id}/reviews`, `/walmart/product/{item_id}/reviews`,\n   `/kohls/product/reviews` (`web_id`), `/macys/product/reviews` (`product_id`),\n   `/nike/product/reviews` (`slug`+`style_color`), `/oldnavy/product/reviews`\n   (`pid`+`brand`), `/ulta/product/reviews` (`product_id`), `/wish/product/{id}/reviews`).\n   H&M, Lululemon, Sam's Club, and Zappos surface reviews (when present)\n   embedded in their own product-detail call instead of a separate endpoint;\n   Wayfair and Zara expose no reviews at all — Wayfair's product detail only\n   has an aggregate rating. `/bestbuy/product/reviews` (`sku`),\n   `/sephora/product/reviews` (`product_id`), and `/ikea/reviews`\n   (`item_no`) cover those three separately; Home Depot and Chewy surface\n   reviews embedded in their own product-detail call instead. Adidas reviews and rating summaries are available at\n   `/adidas/product/reviews`, using the search result's `model_number` (not its\n   SKU). Discover per-model review topics via `/adidas/product/review-topics`;\n   locale controls review language and can yield an empty review sample. SHEIN\n   exposes no review endpoint in this catalog.\n5. **Compare** the JSON fields (price, currency, rating, seller) and answer.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search a marketplace (GET, key=value params):\nscripts/crawlora.sh /amazon/search k=\"standing desk\" | jq '.'\nscripts/crawlora.sh -X POST /ebay/search '{\"keyword\":\"mechanical keyboard\"}' | jq '.'\nscripts/crawlora.sh /shop-app/search query=\"running shoes\" | jq '.'\nscripts/crawlora.sh /target/search q=\"standing desk\" | jq '.'\nscripts/crawlora.sh /walmart/search q=\"standing desk\" | jq '.'\nscripts/crawlora.sh /zalando/search q=\"running shoes\" market=de | jq '.'\nscripts/crawlora.sh /nike/search keyword=\"running shoes\" | jq '.'\nscripts/crawlora.sh /ulta/search query=\"retinol serum\" | jq '.'\nscripts/crawlora.sh /bestbuy/search q=\"laptop\" | jq '.'\nscripts/crawlora.sh /sephora/search query=\"retinol serum\" | jq '.'\nscripts/crawlora.sh /chewy/search q=\"salmon dog food\" | jq '.'\n\n# Product detail:\nscripts/crawlora.sh /amazon/product/B0XXXXXXX | jq '.data'\nscripts/crawlora.sh /ikea/product item_no=00263850 | jq '.'\n\n# Category browse (no keyword search on this platform):\nscripts/crawlora.sh /wayfair/category category=478390 | jq '.'\nscripts/crawlora.sh /zara/category/2420463/products | jq '.'\n\n# Store locator only (no product catalog):\nscripts/crawlora.sh /walgreens/stores zip=10001 | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every endpoint\nthis skill uses, including its method, path, parameters, and platform coverage.\n\n## Examples\n\n- **Cross-marketplace price compare:** search `/amazon/search` and `/ebay/search`\n  for the same query, collect `price` from each, and present the spread.\n- **Seller due diligence:** `/ebay/seller/{seller}` + `/ebay/seller/{seller}/feedback`\n  to summarize a seller's rating and recent feedback before buying.\n- **Shopify catalog audit:** `/shopify/products` (paginate) to list a store's\n  catalog with prices, then flag items above/below a threshold.\n- **No-search retailer browse:** for a retailer with no keyword search\n  (Kohl's, Wayfair, Sam's Club), call the category/department-discovery\n  endpoint first (`/kohls/category`'s facets, `/wayfair/categories`,\n  `/samsclub/departments`) to find a category id, then browse it directly\n  instead of trying to search by keyword.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public product/listing pages; respect each marketplace's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Results are paginated — pass `page` (and `count` where supported) to walk listings.\n- **Zalando always needs `market`** (no default storefront) — resolve valid\n  codes via `/zalando/markets` if unsure.\n- **Macy's has no search or category browse** — only `/macys/product/{productId}`\n  (needs a known `productId`) and `/macys/suggest` typeahead.\n- **Wayfair has no search and no reviews endpoint** — only\n  `/wayfair/categories` → `/wayfair/category` and `/wayfair/product/{id}`\n  (which carries an aggregate rating, but no review text).\n- **Kohl's has no search or standalone product-detail endpoint** — browse\n  `/kohls/category` (its `category` param takes a `+`-joined taxonomy string,\n  percent-encode the `+` as `%2B`) and read product cards from the listing;\n  `/kohls/product/reviews` needs the `web_id` from that listing.\n- **Sam's Club has no keyword-search endpoint** — start from\n  `/samsclub/departments` or `/samsclub/category`; there's also no dedicated\n  reviews endpoint (rating/review count only comes from `/samsclub/product/{id}`).\n- **Lululemon has no keyword-search endpoint** — browse via\n  `/lululemon/categories` → `/lululemon/category`; reviews are embedded in\n  `/lululemon/product/{product_id}`, not a separate call.\n- **Zara's `/zara/search` requires `section`** (a department like `WOMAN`),\n  and Zara exposes no reviews endpoint at all.\n- **Old Navy's endpoints are shared across four storefronts** — pass\n  `brand=on|gap|br|at` (Old Navy/Gap/Banana Republic/Athleta; defaults to\n  `on`); a `cid`/`pid` found under one brand only works with that same brand.\n\nFile v1.0.20:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"product-price-research\",\n  \"version\": \"1.0.20\",\n  \"publishedAt\": 1790426835885\n}\n\nFile v1.0.20:reference/endpoints.md\n\n# product-price-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**230 endpoints across 35 platform group(s).**\n\n## Amazon (5)\n\n### `amazon_charts`\n\n- **HTTP:** `GET /amazon/charts`\n- **What:** Amazon product charts. Returns one page of a ranked Amazon chart (Best Sellers, New Releases, or Most Wished For) for a department or department subcategory on `amazon.com`. Discover valid department/node values with amazon-charts-categories.\n- **Params:** `chart` (string, **required**) — Chart type; `department` (string, **required**) — Amazon department slug; `node` (string, optional) — Numeric browse node id; `page` (integer, optional) — 1-based page number\n\n### `amazon_charts_categories`\n\n- **HTTP:** `GET /amazon/charts/categories`\n- **What:** Amazon chart categories. Returns the department and subcategory values amazon-charts accepts for a given chart. Omit department to list a chart's top-level departments; pass a department (and optionally a node) to get that category's own name plus its immediate child categories.\n- **Params:** `chart` (string, **required**) — Chart type; `department` (string, optional) — Amazon department slug; `node` (string, optional) — Numeric browse node id (requires department)\n\n### `amazon_product`\n\n- **HTTP:** `GET /amazon/product/{asin}`\n- **What:** Retrieve Amazon product details. Returns normalized product details for an Amazon ASIN on `amazon.com`, including pricing, availability, overview data, inline review samples, and descriptive content.\n- **Params:** `asin` (string, **required**) — Amazon ASIN; `currency` (string, optional) — Amazon currency; `language` (string, optional) — Amazon language\n\n### `amazon_search`\n\n- **HTTP:** `GET /amazon/search`\n- **What:** Search Amazon products. Returns normalized Amazon search result cards for `amazon.com`.\n- **Params:** `k` (string, **required**) — Search keyword; `page` (integer, optional) — 1-based page number; `s` (string, optional) — Sort order\n\n### `amazon_suggest`\n\n- **HTTP:** `GET /amazon/suggest/{keyword}`\n- **What:** Retrieve Amazon search suggestions. Returns typeahead keyword suggestions from Amazon's public suggestion API for `amazon.com`.\n- **Params:** `keyword` (string, **required**) — Suggestion prefix\n\n## eBay (10)\n\n### `ebay_item`\n\n- **HTTP:** `GET /ebay/item/{item_id}`\n- **What:** Get eBay item details. Returns normalized details for a public eBay item listing.\n- **Params:** `item_id` (string, **required**) — eBay item ID\n\n### `ebay_live_stream`\n\n- **HTTP:** `GET /ebay/live/streams/{id}`\n- **What:** Get an eBay Live stream. Returns normalized detail for a single eBay Live stream/event, including each host's feedback summary for the last 365 days.\n- **Params:** `id` (string, **required**) — eBay Live stream/event id\n\n### `ebay_live_stream_items`\n\n- **HTTP:** `GET /ebay/live/streams/{id}/items`\n- **What:** List an eBay Live stream's featured items. Returns the currently featured/auction items for an eBay Live stream, including live bidding state.\n- **Params:** `id` (string, **required**) — eBay Live stream/event id\n\n### `ebay_live_streams`\n\n- **HTTP:** `GET /ebay/live/streams`\n- **What:** List eBay Live streams. Returns currently live and upcoming eBay Live streams for a category channel.\n- **Params:** `category` (string, optional) — eBay Live category channel, defaults to explore; `request_number` (integer, optional) — Pagination cursor from a previous response's next_request_number, defaults to 0; `session_id` (string, optional) — Pagination session id from a previous response's session_id\n\n### `ebay_live_streams_batch`\n\n- **HTTP:** `GET /ebay/live/streams/batch`\n- **What:** Get multiple eBay Live streams. Returns normalized summaries for multiple eBay Live streams/events in one call, up to 9 ids per request.\n- **Params:** `ids` (string, **required**) — One or more eBay Live stream/event ids, up to 9. Comma-separated or repeated query values are both accepted.\n\n### `ebay_search`\n\n- **HTTP:** `POST /ebay/search`\n- **What:** Search eBay listings. Returns normalized eBay search results.\n- **Params:** `option` (object, **required**) — eBay search payload\n- **REST body:** Send the value of the MCP argument `option` directly as the JSON body; do not wrap it in a `option` property.\n\n### `ebay_seller`\n\n- **HTTP:** `GET /ebay/seller/{seller}`\n- **What:** Get eBay seller profile. Returns normalized details for a public eBay seller profile.\n- **Params:** `seller` (string, **required**) — eBay seller username\n\n### `ebay_seller_about`\n\n- **HTTP:** `GET /ebay/seller/{seller}/about`\n- **What:** Get eBay seller about details. Returns normalized seller about information from the public eBay store about tab, including seller stats, top-rated status, optional location/member-since fields, and cleaned store categories.\n- **Params:** `seller` (string, **required**) — eBay seller username\n\n### `ebay_seller_feedback`\n\n- **HTTP:** `GET /ebay/seller/{seller}/feedback`\n- **What:** Get eBay seller feedback. Returns normalized seller feedback summary, detailed ratings, and recent review cards from the public eBay seller feedback tab.\n- **Params:** `page` (integer, optional) — Feedback page number; `per_page` (integer, optional) — Reviews per page; `seller` (string, **required**) — eBay seller username\n\n### `ebay_seller_shop`\n\n- **HTTP:** `GET /ebay/seller/{seller}/shop`\n- **What:** Get eBay seller shop listings. Returns normalized listings from the public eBay seller shop tab, with pagination backed by the store odtRefresh response.\n- **Params:** `page` (integer, optional) — Shop page number; `seller` (string, **required**) — eBay seller username\n\n## Shopify (11)\n\n### `shopify_collection_products`\n\n- **HTTP:** `GET /shopify/collections/{handle}/products`\n- **What:** List Shopify collection products. Returns normalized products from a public Shopify collection `/products.json` endpoint. `sortBy` and dynamic facet-filter query params (e.g. `fit`, `canonicalColour`) only take effect for headless storefronts served via the embedded-SSR-JSON fallback transport (`transport_mode: \"ssr_embedded\"`) and return an invalid-param error if supplied against a classic-transport store, since Shopify's classic public catalog JSON has no server-side sort or filter support. `sort_by`, `min_price`, `max_price`, `product_type`, `in_stock_only`, and `option_`-prefixed params (e.g. `option_size=Small,Medium`) drive a separate, independent mechanism -- Shopify's own native Storefront Filtering collection-page feature (`transport_mode: \"storefront_filtered\"`) -- which works for both classic- and SSR-fallback-transport stores; supplying any of these takes precedence over sortBy/dynamic facet filters.\n- **Params:** `handle` (string, **required**) — Collection handle; `in_stock_only` (boolean, optional) — Storefront-filtering transport. true restricts to currently in-stock items only.; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `max_price` (number, optional) — Storefront-filtering transport. Maximum price (inclusive), in the storefront's display currency's major unit.; `min_price` (number, optional) — Storefront-filtering transport. Minimum price (inclusive), in the storefront's display currency's major unit.; `option_size` (string, optional) — Storefront-filtering transport. Example dynamic variant-option filter: comma-separated exact display values for the storefront's own size option (e.g. option_size=Small,Medium). Any variant option name is accepted the same way (option_color, ...) -- see facets in an unfiltered response for the live option names/values per store.; `page` (integer, optional) — 1-based page, defaults to 1; `product_type` (string, optional) — Storefront-filtering transport, comma-separated. Exact product-type display strings from the storefront's own Product Type facet -- see facets.product_type in an unfiltered response for the live value set.; `sortBy` (string, optional) — SSR-fallback transport only (transport_mode ssr_embedded). Allowed values: sortLTH, sortHTL, newest. Omit for the storefront's default relevancy order. Rejected as an invalid param for classic-transport stores.; `sort_by` (string, optional) — Storefront-filtering transport. Allowed values: manual, best-selling, title-ascending, title-descending, price-ascending, price-descending, created-ascending, created-descending. Omit for the collection's own default order.; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_collections`\n\n- **HTTP:** `GET /shopify/collections`\n- **What:** List Shopify collections. Returns normalized collections from a public Shopify `/collections.json` endpoint. Valid empty result pages return `200` with an empty collections array.\n- **Params:** `limit` (integer, optional) — Maximum collections, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_page`\n\n- **HTTP:** `GET /shopify/pages/{handle}`\n- **What:** Get Shopify page. Returns normalized page detail from Shopify's credential-free `/pages/{handle}.json` endpoint. Page body HTML is returned as cleaned text only.\n- **Params:** `handle` (string, **required**) — Page handle; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_pages`\n\n- **HTTP:** `GET /shopify/pages`\n- **What:** List Shopify pages. Returns normalized static pages from a public Shopify `/pages.json` endpoint. Page body HTML is returned as cleaned text only.\n- **Params:** `limit` (integer, optional) — Maximum pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_product`\n\n- **HTTP:** `GET /shopify/products/{handle}`\n- **What:** Get Shopify product. Returns normalized product detail from Shopify's credential-free product handle `.js` endpoint.\n- **Params:** `handle` (string, **required**) — Product handle; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_product_recommendations`\n\n- **HTTP:** `GET /shopify/products/{handle}/recommendations`\n- **What:** List Shopify product recommendations. Returns normalized recommended products from Shopify's credential-free recommendations Ajax endpoint. The route handle is resolved to a Shopify product id before fetching recommendations.\n- **Params:** `handle` (string, **required**) — Product handle; `intent` (string, optional) — Recommendation intent. Allowed values: related, complementary; `limit` (integer, optional) — Maximum products, defaults to 10 and supports up to 20; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_products`\n\n- **HTTP:** `GET /shopify/products`\n- **What:** List Shopify products. Returns normalized products from a public Shopify `/products.json` endpoint. Valid empty result pages return `200` with an empty products array. `sortBy` and dynamic facet-filter query params (e.g. `fit`, `canonicalColour`) only take effect for headless storefronts served via the embedded-SSR-JSON fallback transport (`transport_mode: \"ssr_embedded\"`) and return an invalid-param error if supplied against a classic-transport store, since Shopify's classic public catalog JSON has no server-side sort or filter support. `sort_by`, `min_price`, `max_price`, `product_type`, `in_stock_only`, and `option_`-prefixed params (e.g. `option_size=Small,Medium`) drive a separate, independent mechanism -- Shopify's own native Storefront Filtering collection-page feature (`transport_mode: \"storefront_filtered\"`) -- which works for both classic- and SSR-fallback-transport stores; supplying any of these takes precedence over sortBy/dynamic facet filters.\n- **Params:** `in_stock_only` (boolean, optional) — Storefront-filtering transport. true restricts to currently in-stock items only.; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `max_price` (number, optional) — Storefront-filtering transport. Maximum price (inclusive), in the storefront's display currency's major unit.; `min_price` (number, optional) — Storefront-filtering transport. Minimum price (inclusive), in the storefront's display currency's major unit.; `option_size` (string, optional) — Storefront-filtering transport. Example dynamic variant-option filter: comma-separated exact display values for the storefront's own size option (e.g. option_size=Small,Medium). Any variant option name is accepted the same way (option_color, ...) -- see facets in an unfiltered response for the live option names/values per store.; `page` (integer, optional) — 1-based page, defaults to 1; `product_type` (string, optional) — Storefront-filtering transport, comma-separated. Exact product-type display strings from the storefront's own Product Type facet -- see facets.product_type in an unfiltered response for the live value set.; `sortBy` (string, optional) — SSR-fallback transport only (transport_mode ssr_embedded). Allowed values: sortLTH, sortHTL, newest. Omit for the storefront's default relevancy order. Rejected as an invalid param for classic-transport stores.; `sort_by` (string, optional) — Storefront-filtering transport. Allowed values: manual, best-selling, title-ascending, title-descending, price-ascending, price-descending, created-ascending, created-descending. Omit for the collection's own default order.; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_search_suggest`\n\n- **HTTP:** `GET /shopify/search/suggest`\n- **What:** Get Shopify search suggestions. Returns products, collections, and query suggestions from Shopify's credential-free predictive search Ajax endpoint.\n- **Params:** `limit` (integer, optional) — Maximum results per type, defaults to 10 and supports up to 20; `q` (string, **required**) — Search query; `types` (string, optional) — Comma-separated suggestion types. Allowed values: product, collection, query; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_sitemap_urls`\n\n- **HTTP:** `GET /shopify/sitemap/urls`\n- **What:** List Shopify sitemap URLs. Fetches capped URL entries from Shopify child sitemaps matching the requested type.\n- **Params:** `limit` (integer, optional) — Maximum URL entries, defaults to 50 and supports up to 250; `type` (string, optional) — Sitemap type. Allowed values: all, products, collections, pages, blogs, agentic_discovery, other; `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_sitemaps`\n\n- **HTTP:** `GET /shopify/sitemaps`\n- **What:** List Shopify sitemaps. Returns child sitemap URLs from a public Shopify `/sitemap.xml` index with inferred sitemap types.\n- **Params:** `url` (string, **required**) — Shopify storefront URL\n\n### `shopify_store`\n\n- **HTTP:** `GET /shopify/store`\n- **What:** Get Shopify store metadata. Resolves a public Shopify storefront and returns normalized metadata from credential-free storefront JSON. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page.\n- **Params:** `url` (string, **required**) — Shopify storefront URL\n\n## Shop.app (16)\n\n### `shop_app_analysis`\n\n- **HTTP:** `GET /shop-app/analysis`\n- **What:** Analyze Shop.app query results. Returns a market snapshot derived from Shop.app search results, including price ranges, currencies, sale counts, discounts, and top shops. Limit defaults to 20 and accepts values up to 50.\n- **Params:** `deep_search` (boolean, optional) — Enable Shop.app deep search mode; `in_stock` (boolean, optional) — Request in-stock products; `limit` (integer, optional) — Maximum products to analyze, defaults to 20 and supports up to 50; `on_sale` (boolean, optional) — Request sale products; `query` (string, **required**) — Search query\n\n### `shop_app_categories`\n\n- **HTTP:** `GET /shop-app/categories`\n- **What:** List Shop.app categories. Returns public Shop.app product categories.\n- **Params:** _none_\n\n### `shop_app_collection_products`\n\n- **HTTP:** `GET /shop-app/shops/{handle}/collections/{collection_id}/products`\n- **What:** List Shop.app collection products. Returns public product cards from a Shop.app merchant collection. sort_by allowed values: MOST_SALES, PRICE_LOW_TO_HIGH, PRICE_HIGH_TO_LOW, RELEVANCE.\n- **Params:** `collection_id` (string, **required**) — Collection id; `handle` (string, **required**) — Shop handle; `in_stock` (boolean, optional) — Request in-stock products; `limit` (integer, optional) — Maximum products, defaults to 30 and supports up to 60; `sort_by` (string, optional) — Sort mode\n\n### `shop_app_product`\n\n- **HTTP:** `GET /shop-app/products/{id}`\n- **What:** Get Shop.app product. Returns normalized public product details from Shop.app.\n- **Params:** `id` (string, **required**) — Product id; `variant_id` (string, optional) — Variant id\n\n### `shop_app_product_related`\n\n- **HTTP:** `GET /shop-app/products/{id}/related`\n- **What:** List Shop.app related products. Returns related product cards from a public Shop.app product page.\n- **Params:** `id` (string, **required**) — Product id; `limit` (integer, optional) — Maximum products, defaults to 20 and supports up to 50\n\n### `shop_app_product_reviews`\n\n- **HTTP:** `GET /shop-app/products/{id}/reviews`\n- **What:** List Shop.app product reviews. Returns public product reviews from a Shop.app product page.\n- **Params:** `id` (string, **required**) — Product id; `limit` (integer, optional) — Maximum reviews, defaults to 20 and supports up to 50\n\n### `shop_app_product_shop`\n\n- **HTTP:** `GET /shop-app/products/{id}/shop`\n- **What:** Get the Shop.app shop for a product. Resolves the public Shop.app merchant profile for a product id.\n- **Params:** `id` (string, **required**) — Product id\n\n### `shop_app_product_variant`\n\n- **HTTP:** `GET /shop-app/products/{id}/variant`\n- **What:** Get a Shop.app product variant by selected options. Returns the exact public product variant matching selected options. selected_options must be a JSON object when provided. Repeated option filters may also be sent as option.Name=value or option[Name]=value.\n- **Params:** `id` (string, **required**) — Product id; `selected_options` (string, optional) — Selected options JSON object\n\n### `shop_app_product_variants`\n\n- **HTTP:** `GET /shop-app/products/{id}/variants`\n- **What:** List Shop.app product variants. Returns adjacent variants for a Shop.app product. selected_options must be a JSON object when provided. Repeated option filters may also be sent as option.Name=value or option[Name]=value.\n- **Params:** `id` (string, **required**) — Product id; `limit` (integer, optional) — Maximum variants, defaults to 50 and supports up to 100; `selected_options` (string, optional) — Selected options JSON object\n\n### `shop_app_search`\n\n- **HTTP:** `GET /shop-app/search`\n- **What:** Search Shop.app products. Searches Shop.app product results using the credential-free public web search flow. Limit defaults to 20 and accepts values up to 50.\n- **Params:** `deep_search` (boolean, optional) — Enable Shop.app deep search mode; `in_stock` (boolean, optional) — Request in-stock products; `limit` (integer, optional) — Maximum products, defaults to 20 and supports up to 50; `on_sale` (boolean, optional) — Request sale products; `query` (string, **required**) — Search query\n\n### `shop_app_shop`\n\n- **HTTP:** `GET /shop-app/shops/{handle}`\n- **What:** Get Shop.app shop. Returns public Shop.app merchant profile details.\n- **Params:** `handle` (string, **required**) — Shop handle\n\n### `shop_app_shop_locations`\n\n- **HTTP:** `GET /shop-app/shops/{handle}/locations`\n- **What:** List Shop.app shop locations. Returns public retail locations for a Shop.app merchant profile.\n- **Params:** `handle` (string, **required**) — Shop handle; `limit` (integer, optional) — Maximum locations, defaults to 10 and supports up to 50\n\n### `shop_app_shop_products`\n\n- **HTTP:** `GET /shop-app/shops/{handle}/products`\n- **What:** List Shop.app shop products. Returns public product cards from a Shop.app merchant profile. sort_by allowed values: MOST_SALES, PRICE_LOW_TO_HIGH, PRICE_HIGH_TO_LOW, RELEVANCE.\n- **Params:** `handle` (string, **required**) — Shop handle; `in_stock` (boolean, optional) — Request in-stock products; `limit` (integer, optional) — Maximum products, defaults to 30 and supports up to 60; `sort_by` (string, optional) — Sort mode\n\n### `shop_app_shop_reviews`\n\n- **HTTP:** `GET /shop-app/shops/{handle}/reviews`\n- **What:** List Shop.app shop reviews. Returns public reviews for a Shop.app merchant profile.\n- **Params:** `handle` (string, **required**) — Shop handle; `limit` (integer, optional) — Maximum reviews, defaults to 20 and supports up to 50\n\n### `shop_app_shop_typeahead`\n\n- **HTTP:** `GET /shop-app/shops/{handle}/typeahead`\n- **What:** Suggest products and collections inside a Shop.app shop. Returns public store typeahead suggestions for a Shop.app merchant profile.\n- **Params:** `handle` (string, **required**) — Shop handle; `limit` (integer, optional) — Maximum suggestions, defaults to 20 and supports up to 20; `query` (string, **required**) — Typeahead query\n\n### `shop_app_suggestions`\n\n- **HTTP:** `GET /shop-app/suggestions`\n- **What:** Suggest Shop.app searches. Returns Shop.app autocomplete suggestions. Limit defaults to 10 and supports up to 20.\n- **Params:** `limit` (integer, optional) — Maximum suggestions, defaults to 10 and supports up to 20; `query` (string, **required**) — Search query\n\n## Target (8)\n\n### `target_categories`\n\n- **HTTP:** `GET /target/categories`\n- **What:** List all Target categories. Returns Target's current top-level category menu and the complete grouped shop-all directory, including category ids and canonical URLs.\n- **Params:** _none_\n\n### `target_category_products`\n\n- **HTTP:** `GET /target/category-products`\n- **What:** Browse Target category products. Returns paginated products for any category id from target-categories. Each response also contains every available dynamic filter group and option. Pass selected option ids through filter_ids as a comma-separated list. The sort enum accepts `relevance`, `featured`, `price-low`, `price-high`, `rating`, `bestselling`, and `newest`.\n- **Params:** `category_id` (string, **required**) — Target category id; `filter_ids` (string, optional) — Comma-separated Target filter option ids; `page` (integer, optional) — One-based page (1-50); `sort` (string, optional) — Result order; `store_id` (integer, optional) — Target store id used for pricing\n\n### `target_filter_options`\n\n- **HTTP:** `GET /target/filter-options`\n- **What:** List Target filter options. Returns every dynamic filter group and option for either a product query or category. Provide exactly one of q or category_id. Pass currently selected option ids through filter_ids to obtain the remaining context-aware options.\n- **Params:** `category_id` (string, optional) — Target category id; mutually exclusive with q; `filter_ids` (string, optional) — Comma-separated selected Target filter option ids; `q` (string, optional) — Product search query; mutually exclusive with category_id; `store_id` (integer, optional) — Target store id used for pricing\n\n### `target_product`\n\n- **HTTP:** `GET /target/product`\n- **What:** Get a Target product. Returns normalized product details for one Target item, including product content, images, price, rating, category, and availability flags for the selected store.\n- **Params:** `store_id` (integer, optional) — Target store id used for pricing and availability; `tcin` (string, **required**) — Numeric Target item id (TCIN)\n\n### `target_questions`\n\n- **HTTP:** `GET /target/questions`\n- **What:** List Target product questions and answers. Returns paginated product questions with their nested answers.\n- **Params:** `page` (integer, optional) — Zero-based page; `per_page` (integer, optional) — Questions per page; `tcin` (string, **required**) — Numeric Target item id\n\n### `target_reviews`\n\n- **HTTP:** `GET /target/reviews`\n- **What:** List Target product reviews. Returns paginated written reviews for a Target item. Pagination is zero-based and page 50 is the upstream maximum.\n- **Params:** `page` (integer, optional) — Zero-based page; `per_page` (integer, optional) — Reviews per page; `tcin` (string, **required**) — Numeric Target item id\n\n### `target_search`\n\n- **HTTP:** `GET /target/search`\n- **What:** Search Target products. Searches Target products and returns normalized products plus every filter group and option available for the current result set. Pass option ids back through filter_ids as a comma-separated list. A zero total with an empty products list is a valid no-results response. The sort enum accepts `relevance`, `featured`, `price-low`, `price-high`, `rating`, `bestselling`, and `newest`.\n- **Params:** `filter_ids` (string, optional) — Comma-separated Target filter option ids; `page` (integer, optional) — One-based page (1-50); `q` (string, **required**) — Product search query; `sort` (string, optional) — Result order; `store_id` (integer, optional) — Target store id used for pricing\n\n### `target_stores`\n\n- **HTTP:** `GET /target/stores`\n- **What:** Find Target stores near a location. Returns Target's physical stores near a ZIP code, a free-text \"city, state\", or a \"latitude,longitude\" pair, including each store's store_id, status, distance, phone, address, service list, time zone, and two weeks of daily opening hours. Use the returned store_id values with the store_id parameter on target-search, target-category-products, target-filter-options, and target-product.\n- **Params:** `limit` (integer, optional) — Maximum stores to return (1-20); `place` (string, **required**) — ZIP code, city/state, or latitude,longitude; `within` (integer, optional) — Search radius in miles (1-5000)\n\n## Costco (6)\n\n### `costco_categories`\n\n- **HTTP:** `GET /costco/categories`\n- **What:** Get Costco category facets. Returns Costco category slugs and product counts relevant to an optional search term, each slug usable directly with GET /costco/search's category filter. Public data sourced from Costco's own search backend.\n- **Params:** `query` (string, optional) — Search text to scope the returned categories to, e.g. \\\n\n### `costco_product`\n\n- **HTTP:** `GET /costco/product/{id}`\n- **What:** Get a Costco product's detail. Returns a Costco product's detail: title, description, manufacturer, image, price, stock status, and rating. Public data sourced from Costco's own product backend.\n- **Params:** `id` (string, **required**) — Costco product id, e.g. from a search result's id field or a product page URL's \\\n\n### `costco_product_availability`\n\n- **HTTP:** `GET /costco/product/{id}/availability`\n- **What:** Get a Costco product's delivery estimate. Returns a Costco product's stock and estimated-delivery status for a delivery destination. Public data sourced from Costco's own fulfillment backend.\n- **Params:** `id` (string, **required**) — Costco product id; `postal_code` (string, **required**) — US destination ZIP code; `state` (string, **required**) — US destination two-letter state code\n\n### `costco_product_reviews`\n\n- **HTTP:** `GET /costco/product/{id}/reviews`\n- **What:** Get a Costco product's reviews. Returns a page of a Costco product's reviews: title, text, rating, author, and recommendation for each. Public data sourced from Costco's own review platform.\n- **Params:** `id` (string, **required**) — Costco product id, e.g. from a search result's id field\n\n### `costco_search`\n\n- **HTTP:** `GET /costco/search`\n- **What:** Search Costco products. Returns public Costco products matching a text query and/or a category slug: title, brand, model, image, and rating for each result. Public data sourced from Costco's own search backend.\n- **Params:** `category` (string, optional) — Costco category slug, e.g. the last path segment of a category page URL; `query` (string, optional) — Search text\n\n### `costco_warehouses`\n\n- **HTTP:** `GET /costco/warehouses`\n- **What:** Find nearby Costco warehouses. Returns Costco warehouses near a latitude/longitude, sorted by distance: name, address, and distance for each. Public data sourced from Costco's own warehouse locator backend.\n- **Params:** `latitude` (number, **required**) — Latitude; `longitude` (number, **required**) — Longitude\n\n## Zalando (6)\n\n### `zalando_categories`\n\n- **HTTP:** `GET /zalando/categories`\n- **What:** List a Zalando market's top-level category navigation. Returns a Zalando country storefront's live top-level category navigation, department by department, scraped directly from that department's own storefront nav tab bar. This is the discovery source for zalando-category's category parameter — category slugs are market-specific (each storefront uses its own local-language slug), so there is no fixed value space to hardcode; this endpoint asks the upstream live instead. market is required (there is no default storefront) and accepts 25 country storefronts — see zalando-markets for the full current list with domains. department optionally restricts the response to one of women, men, or kids; omitting it returns all three. Scope note: only the top-level nav tabs (e.g. Clothing, Shoes, Sports) are returned, not each tab's own hover-revealed mega-menu of sub-categories — that panel is not present in the page's initial HTML and cannot be reached without executing JavaScript, which this endpoint's transport does not do.\n- **Params:** `department` (string, optional) — Restrict to one Zalando shopping department. Omit to return all three.; `market` (string, **required**) — Zalando country storefront\n\n### `zalando_category`\n\n- **HTTP:** `GET /zalando/category`\n- **What:** Browse a Zalando category or brand. Browses a Zalando category or brand listing by URL slug (e.g. shoes, womens-dresses, on-running) and returns the same normalized result cards as zalando-search, plus the category's upstream total_count. Category slugs are market-specific (each storefront uses its own local-language slug, e.g. \"shoes\" on de/gb, \"chaussures\" on fr, \"scarpe\" on it) — use zalando-categories to discover a market's live top-level slugs, or take one from a product's url field. market is required (there is no default storefront) and accepts 25 country storefronts — see zalando-markets for the full current list with domains.\n- **Params:** `category` (string, **required**) — Zalando category or brand URL slug, in the target market's own language; `market` (string, **required**) — Zalando country storefront\n\n### `zalando_markets`\n\n- **HTTP:** `GET /zalando/markets`\n- **What:** List supported Zalando country storefronts. Returns the Zalando country storefronts currently supported by the required market parameter on zalando-search, zalando-category, and zalando-product, with each market's domain. Static, credential-free metadata with no upstream request.\n- **Params:** _none_\n\n### `zalando_product`\n\n- **HTTP:** `GET /zalando/product`\n- **What:** Get a Zalando product. Returns normalized product details for one Zalando product, including brand, description, images, and per-size price/availability/GTIN. Pass the sku returned by zalando-search or zalando-category; Zalando's own site search resolves the sku to its canonical product page. market is required and must match the storefront the sku was found in (there is no default, and a sku is generally only listed for sale on the market(s) that carry it) — see zalando-markets for the full reference list.\n- **Params:** `market` (string, **required**) — Zalando country storefront the sku was found in; `sku` (string, **required**) — Zalando product SKU (article number) from zalando-search or zalando-category\n\n### `zalando_search`\n\n- **HTTP:** `GET /zalando/search`\n- **What:** Search Zalando products. Searches a Zalando country storefront by keyword and returns normalized result cards with price, brand, and image. Returns the first page of results as rendered by Zalando plus the upstream total_count; deeper pagination is not yet supported. market is required (there is no default storefront) and accepts 25 country storefronts — see zalando-markets for the full current list with domains.\n- **Params:** `market` (string, **required**) — Zalando country storefront; `q` (string, **required**) — Product search keyword\n\n### `zalando_suggest`\n\n- **HTTP:** `GET /zalando/suggest`\n- **What:** Autocomplete a Zalando search query. Returns Zalando's own search-box query completions for a partial keyword, e.g. \"running sho\" -> \"running shoes\", \"running shoes nike\". market is required (there is no default storefront) and accepts 25 country storefronts — see zalando-markets for the full current list with domains.\n- **Params:** `market` (string, **required**) — Zalando country storefront; `q` (string, **required**) — Partial search text to complete\n\n## Walmart (3)\n\n### `walmart_product`\n\n- **HTTP:** `GET /walmart/product/{item_id}`\n- **What:** Get a Walmart product. Returns a normalized Walmart product: price, availability, brand, images, rating, seller, description, highlights, specifications, and variants. Credential-free public Walmart data, rendered from the product page through proxied browser renderers.\n- **Params:** `item_id` (string, **required**) — Walmart item id (the numeric id in a /ip/{id} URL)\n\n### `walmart_product_reviews`\n\n- **HTTP:** `GET /walmart/product/{item_id}/reviews`\n- **What:** Get Walmart product reviews. Returns the reviews snapshot embedded in a Walmart product page: average rating, total review count, the per-star rating breakdown, the recommended percentage, the top positive and top negative review, and a sample of recent reviews. This is a single on-page snapshot, not a full paginated feed. A product that exists but has no reviews returns zero counts and an empty reviews list. Credential-free public Walmart data, rendered from the product page through proxied browser renderers.\n- **Params:** `item_id` (string, **required**) — Walmart item id (the numeric id in a /ip/{id} URL)\n\n### `walmart_search`\n\n- **HTTP:** `GET /walmart/search`\n- **What:** Search Walmart products. Returns Walmart search results: item id, title, brand, price, image, availability, seller, and rating per product. Credential-free public Walmart data, rendered from the search page through proxied browser renderers.\n- **Params:** `page` (integer, optional) — 1-based page number (default 1); `q` (string, **required**) — Search query; `sort` (string, optional) — Sort order\n\n## H&M (7)\n\n### `hm_categories`\n\n- **HTTP:** `GET /hm/categories`\n- **What:** Browse H&M's storefront category navigation. Returns H&M's own storefront category navigation, department by department: every direct nav item and subcategory currently shown in the site's own menu, with its display name and storefront URL. Where this build has separately verified the value against hm-listing's own category_id parameter, that id is included too; category_id is omitted for entries not yet verified rather than guessed, since the visible category label is confirmed NOT a reliable way to derive H&M's real listing category ids for every category. department, when given, filters the result to one department.\n- **Params:** `department` (string, optional) — Filter to one storefront department\n\n### `hm_listing`\n\n- **HTTP:** `GET /hm/listing`\n- **What:** Browse an H&M category's product listing. Returns one H&M category's product listing page: normalized products with pricing, images, colors, and per-size stock, sourced from H&M's own app-backend listing data. category_id is an H&M category slug (e.g. ladies_newarrivals_all, men_newarrivals_all, ladies_jeans) -- this build does not expose a category/nav-tree discovery endpoint, so category_id values are currently sourced from known H&M storefront paths rather than a lookup call. Pagination is page-based and real: requesting a page beyond the category's real last page returns a normal response with an empty products array rather than an error.\n- **Params:** `category_id` (string, **required**) — H&M category slug; `is_new` (boolean, optional) — Optional filter for newly added items only; `page` (integer, optional) — Page number, one-based, defaults to 1; `page_size` (integer, optional) — Results per page, 1 to 72, defaults to 36; `sort` (string, optional) — Sort order, defaults to RELEVANCE\n\n### `hm_product`\n\n- **HTTP:** `GET /hm/product/{product_id}`\n- **What:** Get an H&M product's full detail. Returns one H&M product's full detail: every purchasable color grouped with its own per-size price and live availability, plus an aggregate rating and real customer reviews (author label, date, body, rating, and any fit-feedback tags the reviewer left, such as \"True to Size\") when the product has any. This data is not available from hm-listing or hm-search, which only carry one representative price and a per-color stock count. product_id is the numeric id from a listing/search result's id field or its url field's productpage.<id>.html segment. An unrecognized product_id returns 404.\n- **Params:** `product_id` (string, **required**) — Numeric H&M product id, from a listing/search result's id field\n\n### `hm_product_related`\n\n- **HTTP:** `GET /hm/product/{product_id}/related`\n- **What:** Get an H&M product's related items. Returns every product-detail recommendation list H&M's own app shows for one product (which lists are present genuinely varies by product -- for example \"more from series\" and \"style with\" appear only when the product has one, while \"alternatives\" and \"upsell\" are more consistently present). An unrecognized product_id returns a well-formed empty result rather than an error.\n- **Params:** `product_id` (string, **required**) — Numeric H&M product id, from a listing/search result's id field\n\n### `hm_search`\n\n- **HTTP:** `GET /hm/search`\n- **What:** Search H&M product listings by free-text keyword. Runs a free-text keyword search against H&M's own app-backend search data and returns normalized products with pricing, images, colors, and per-size stock, plus search-quality metadata (a spelling-correction suggestion, related searches, and a content-filter flag). Unlike category browsing, an obscure or nonsense keyword returns a genuine empty result (zero products) rather than a fallback set. Pagination is page-based and real: requesting a page beyond the real last page returns a normal response with an empty products array rather than an error.\n- **Params:** `page` (integer, optional) — Page number, one-based, defaults to 1; `page_size` (integer, optional) — Results per page, 1 to 72, defaults to 36; `query` (string, **required**) — Free-text search keyword\n\n### `hm_search_suggestions`\n\n- **HTTP:** `GET /hm/search/suggestions`\n- **What:** Get H&M search-box suggestions. Returns H&M's own search-box typeahead suggestions, sourced from the same credential-free app-backend host as hm-listing/hm-search. When query is given, returns spelling-complete phrase suggestions and merchandised content results. When query is omitted or empty, instead returns trending searches and popular-search shortcuts (phrase/content suggestions are both empty in that mode). search_history is part of the real upstream response but confirmed NOT session-scoped -- it returned the identical list across separate cookie-free requests, so treat it as fixed default content rather than a real per-caller history.\n- **Params:** `query` (string, optional) — Free-text search-box input; omit or leave empty for trending/popular searches instead\n\n### `hm_stores`\n\n- **HTTP:** `GET /hm/stores`\n- **What:** Find nearby H&M physical stores. Returns H&M physical retail store locations near a point: name, phone, full address, and coordinates. Either search, or both lat and lng, is required. search is a free-text zip code or place name that is first resolved to coordinates; if it does not resolve to any location, a well-formed empty result is returned rather than an error. lat and lng, when given directly, skip that resolution step. radius_meters is optional (1000 to 50000, defaults to 10000). A location with no stores within the radius returns a well-formed empty result rather than an error.\n- **Params:** `lat` (number, optional) — Latitude, requires lng; `lng` (number, optional) — Longitude, requires lat; `radius_meters` (integer, optional) — Search radius in meters, 1000 to 50000, defaults to 10000; `search` (string, optional) — Free-text zip code or place name to resolve to coordinates\n\n## Kohl's (4)\n\n### `kohls_category`\n\n- **HTTP:** `GET /kohls/category`\n- **What:** Browse a Kohl's category or curated campaign page. Returns a Kohl's category or curated campaign page's product grid (page 1 only), with normalized products (title, image, colors, pricing, rating, availability) and facets for discovering further category values. category is Kohl's own catalog taxonomy string, e.g. \"Room:Dorm\" or \"Department:Kitchen & Dining\" -- combine multiple dimensions with a literal \"+\", percent-encoded as \"%2B\" so it survives as \"+\" rather than being decoded to a space (e.g. \"Room%3ADorm%2BDepartment%3ABedding\"). Every facets[].options[].category value in a response is a ready-to-use category string for a follow-up call, so a caller can discover the full taxonomy by starting from a known category (e.g. \"Room:Dorm\") and following facets. A category value Kohl's does not recognize returns a 404 rather than an unfiltered listing; a recognized dimension with no matching products returns a genuine zero-result response instead.\n- **Params:** `category` (string, **required**) — Kohl's catalog taxonomy string, e.g. \\\n\n### `kohls_product_reviews`\n\n- **HTTP:** `GET /kohls/product/reviews`\n- **What:** Browse a Kohl's product's customer reviews. Returns one page of a Kohl's product's normalized customer reviews (title, text, rating, secondary ratings such as quality/durability/value/style, reviewer name and location, submission date, and photo URLs). web_id is the same identifier a GET /kohls/category response's products[].web_id field carries. A web_id with zero reviews returns a genuine zero-result response rather than an error.\n- **Params:** `page` (integer, optional) — Page number, 10 reviews per page (default 1); `web_id` (string, **required**) — Kohl's product web id, e.g. from a GET /kohls/category response's products[].web_id\n\n### `kohls_stores`\n\n- **HTTP:** `GET /kohls/stores`\n- **What:** Find nearby Kohl's store locations. Returns physical Kohl's store locations near a free-text location (city/state, zip code, or address): address, phone, weekly hours, distance, and store badges/services. A search with no results returns a genuine empty list rather than an error.\n- **Params:** `search` (string, **required**) — Free-text location: city/state, zip code, or address\n\n### `kohls_suggest`\n\n- **HTTP:** `GET /kohls/suggest`\n- **What:** Kohl's search-box typeahead suggestions. Returns Kohl's own search-box typeahead result for a partial query: a flat list of suggested search phrases (no product data). A nonsense query returns a genuine, well-formed empty list rather than an error.\n- **Params:** `query` (string, **required**) — Partial search text, e.g. \\\n\n## Lululemon (5)\n\n### `lululemon_categories`\n\n- **HTTP:** `GET /lululemon/categories`\n- **What:** Browse lululemon's storefront category navigation. Returns lululemon's own storefront category navigation, flattened out of the site's shared header nav: every navigable category with its display name, breadcrumb path, and the exact category/cdp_hash pair lululemon-category's own parameters expect (read directly from the nav's own URL, not guessed from the display label). section, when given, filters the result to one top-level nav section.\n- **Params:** `section` (string, optional) — Filter to one top-level storefront nav section\n\n### `lululemon_category`\n\n- **HTTP:** `GET /lululemon/category`\n- **What:** Browse a lululemon category's product listing. Returns one lululemon category's product listing page: normalized products with pricing, sale detection, sizes, colors, and style numbers, sourced from lululemon's own app-backend category data. category and cdp_hash are the two path segments of a lululemon category URL (https://shop.lululemon.com/c/{category}/{cdp_hash}), e.g. women-new-styles and n14f1wz6o10 -- both are also available from lululemon-categories's own category and cdp_hash fields. Pagination is page-based and real: requesting a page beyond the category's real last page returns a normal response with an empty products array rather than an error. An unrecognized category/cdp_hash pair returns 404.\n- **Params:** `category` (string, **required**) — lululemon category slug, from a category URL's first path segment; `cdp_hash` (string, **required**) — lululemon category id, from a category URL's second path segment; `page` (integer, optional) — Page number, one-based, defaults to 1; `page_size` (integer, optional) — Results per page, 1 to 100, defaults to 24\n\n### `lululemon_outfit`\n\n- **HTTP:** `GET /lululemon/outfit`\n- **What:** Get lululemon's outfit/style recommendations for a product color. Returns lululemon's own curated outfit/style recommendations for one product color: every complementary item in each styled look, plus the anchor product itself. unified_id and color_code are lululemon-product's own unified_id response field and a color's code field (from lululemon-product's colors[] or lululemon-category's style_numbers-paired colors[]) -- not lululemon-product's own product_id, which is a different id space. Recommended items' own id is a separate, third-party catalog id (not lululemon-product's product_id) -- use each item's url to reach its product page. An unrecognized unified_id/color_code pair returns 404.\n- **Params:** `color_code` (string, **required**) — lululemon color code, from a lululemon-product result's colors[].code field; `unified_id` (string, **required**) — lululemon product unified id, from a lululemon-product result's unified_id field\n\n### `lululemon_product`\n\n- **HTTP:** `GET /lululemon/product/{product_id}`\n- **What:** Get a lululemon product's full detail. Returns one lululemon product's full detail: every purchasable color/size SKU with its own price, sale status, and live availability, plus an aggregate rating and real customer reviews when the product has any -- none of which lululemon-category exposes (it only carries one representative color/price per product). product_id is the id from a lululemon-category result's id field or a lululemon product URL's trailing path segment (https://shop.lululemon.com/p/{slug}/{product_id}) -- the slug itself is not needed. An unrecognized product_id returns 404.\n- **Params:** `product_id` (string, **required**) — lululemon product id, from a lululemon-category result's id field\n\n### `lululemon_stores`\n\n- **HTTP:** `GET /lululemon/stores`\n- **What:** Browse lululemon's physical store directory. Returns lululemon's own complete physical store directory (480 US and 86 Canada locations as of this endpoint's own research), including regular weekly hours and in-store amenities. All filters are optional and applied locally after fetching the full directory -- there is no live geo-search API on a credential-free host for this platform. country and state are free-text equality filters against the values this directory actually carries (2-letter codes, e.g. US/CA, NY/CA), not an enforced enum. lat and lng (both required together) filter to stores within radius_miles (1 to 500, defaults to 50), sorted nearest-first.\n- **Params:** `country` (string, optional) — Filter to one country by its 2-letter code; `lat` (number, optional) — Latitude, requires lng; `lng` (number, optional) — Longitude, requires lat; `radius_miles` (number, optional) — Search radius in miles, 1 to 500, defaults to 50; `state` (string, optional) — Filter to one state/province by its 2-letter code\n\n## Macy's (3)\n\n### `macys_product`\n\n- **HTTP:** `GET /macys/product/{productId}`\n- **What:** Get a Macy's product's full detail. Returns one Macy's product's full detail: name, brand, description, department/division, category breadcrumb, pricing (with sale detection), availability, images, aggregate rating, and every purchasable color variant with its own price. productId is a numeric id, taken from a Macy's product page's ?ID= query parameter.\n- **Params:** `productId` (string, **required**) — Numeric Macy's product id, from a product page's ?ID= query parameter\n\n### `macys_product_reviews`\n\n- **HTTP:** `GET /macys/product/reviews`\n- **What:** Get a Macy's product's customer reviews. Returns one page of a Macy's product's normalized customer reviews, plus a site-wide rating summary (rating count, average rating, recommended ratio, rating histogram) for the product. Sourced from a separate review platform Macy's own product pages embed, distinct from the product catalog itself. product_id is a numeric id, the same one used by GET /macys/product/{productId}. A product with zero reviews, or a well-formed but unrecognized product_id, returns a normal, empty result rather than an error.\n- **Params:** `page` (integer, optional) — Result page, 1-based, defaults to 1; `product_id` (string, **required**) — Numeric Macy's product id, from a product page's ?ID= query parameter\n\n### `macys_suggest`\n\n- **HTTP:** `GET /macys/suggest`\n- **What:** Get Macy's search-box suggestions. Returns Macy's own search-box suggestions (typeahead) for a partial query: a flat list of suggested search phrases, no product data. A partial query with no real matches returns a normal, empty result rather \n\nFile v1.0.20:skill-card.md\n\n## Description:\n\nResearches product listings, prices, sellers, and reviews across online marketplaces and retailers through the Crawlora API.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nShoppers, analysts, and developers use this skill to find products, compare retailer prices and sellers, and review public listings and customer feedback.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product searches, retailer URLs or IDs, review lookups, and store-locator inputs are sent to Crawlora.\n\nMitigation: Share only inputs appropriate for the service and review Crawlora and retailer terms for the intended use.\n\nRisk: A disclosed API key could enable unauthorized use of the Crawlora account.\n\nMitigation: Keep CRAWLORA_API_KEY in the environment and avoid sharing logs or transcripts that expose it.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/crawlora-org/skills/product-price-research)\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora API and account setup](https://crawlora.net)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON, Shell commands, Guidance]\n\n**Output Format:** [Markdown responses with structured product data and optional shell examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Product results depend on retailer coverage, available fields, and pagination.]\n\n## Skill Version(s):\n\n1.0.20 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.19: 5 files, 48295 bytes\n\nFiles: reference/endpoints.md (159599b), scripts/crawlora.sh (21480b), skill-card.md (1982b), SKILL.md (11117b), _meta.json (142b)\n\nFile v1.0.19:SKILL.md\n\n---\nname: product-price-research\ndescription: Researches products, prices, sellers, and reviews across major online marketplaces and big-box/specialty retailers (Amazon, eBay, Shopify stores, Shop.app, Target, Costco, Walmart, Nike, Zara, Adidas, Best Buy, Home Depot, Sephora, SHEIN, IKEA, Chewy, and more) using the Crawlora API, returning clean JSON. Use when the user asks to find a product, compare prices or sellers, track listings, or pull marketplace/retailer reviews — instead of scraping store pages.\n---\n\n# Product & price research\n\nLook up and compare products, prices, sellers, and reviews across Amazon,\neBay, Shopify storefronts, Shop.app, Target, Costco, Zalando, Walmart, H&M,\nKohl's, Lululemon, Macy's, Nike, Old Navy (plus Gap, Banana Republic, and\nAthleta under the same endpoints), Sam's Club, Ulta Beauty, Wayfair, Wish,\nZappos, Zara, Adidas, Best Buy, Home Depot, Sephora, SHEIN, IKEA, and\nChewy — all as normalized JSON from the Crawlora API, with no HTML\nscraping. Walgreens is store-locator only (no product catalog).\n\n## When to use this skill\n\n- \"What does X cost on Amazon / eBay / Target / Walmart?\" or \"compare prices\n  for X across sellers/retailers.\"\n- \"Find listings for X\" / \"search this Shopify store\" / \"what's in this collection?\"\n- \"Pull reviews / ratings for this product or seller.\"\n- \"Track this product's price / variants / availability.\"\n- Competitive pricing, catalog, or marketplace-review research.\n- \"Browse category X on Wayfair / Kohl's / Sam's Club\" when the retailer has\n  no keyword search of its own.\n- Apparel/beauty catalog lookups spanning Nike, Zara, H&M, Old Navy/Gap/Banana\n  Republic/Athleta, Lululemon, Ulta Beauty, Adidas, or Sephora.\n- Home-goods/electronics/pet lookups spanning Home Depot, Best Buy, IKEA, or Chewy.\n- \"Find the nearest Walgreens\" (store locator only — no product catalog).\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\nPick the marketplace, then the job:\n\n1. **Search / discover** — `/amazon/search`, `/ebay/search`, `/shopify/products`,\n   `/shop-app/search`, `/target/search`, `/costco/search`, `/walmart/search`,\n   `/hm/search`, `/nike/search`, `/oldnavy/search` (covers Old Navy, Gap,\n   Banana Republic, and Athleta via `brand=on|gap|br|at`, defaults to `on`),\n   `/ulta/search`, `/wish/search`, `/zappos/search`, `/zara/search` (**requires\n   `section`**, a department like `WOMAN`/`MAN`), and `/zalando/search` (this\n   one **requires `market`** — a Zalando country storefront code like `de`,\n   `fr`, `com`; list them via `/zalando/markets`) to find candidate products by\n   keyword. **Kohl's, Lululemon, Macy's, Sam's Club, and Wayfair have no\n   keyword-search endpoint** — browse a category instead:\n   `/kohls/category` (facets give follow-up category strings),\n   `/lululemon/categories` → `/lululemon/category`, `/samsclub/departments` →\n   `/samsclub/category`, and `/wayfair/categories` → `/wayfair/category`.\n   Macy's has neither search nor category browse at all — only direct\n   `productId` lookup (below) plus `/macys/suggest` typeahead.\n   `/adidas/search` (`query` or `category`, exactly one required),\n   `/bestbuy/search` (`q`), `/homedepot/search` (`q`), `/sephora/search`\n   (`query`, plus `brand`/`filter`/`price_min`+`price_max`\n   as a matched pair/`rating_min`/`is_new` facets), `/ikea/search`\n   (`q`, or an IKEA item number resolves directly), and `/chewy/search`\n   (`q` — a strong category match like \"dog food\" transparently redirects\n   to that category listing) round out search. **Walgreens has no product\n   catalog at all** — `/walgreens/stores` (lat/lon or zip) is its only\n   endpoint, for store lookup.\n2. **Detail** — fetch a specific product (`/amazon/product`, `/ebay/item`,\n   `/shopify/products/{handle}`, `/shop-app/products/{id}`,\n   `/target/product` (`tcin`), `/costco/product/{id}`, `/walmart/product/{item_id}`,\n   `/zalando/product` (`sku`+`market`), `/hm/product/{product_id}`,\n   `/nike/product` (`slug`+`style_color`), `/oldnavy/product` (`pid`+`brand`),\n   `/lululemon/product/{product_id}`, `/macys/product/{productId}`,\n   `/samsclub/product/{id}`, `/ulta/product/{productId}`, `/wayfair/product/{id}`,\n   `/wish/product/{id}`, `/zappos/product/{productId}`, `/zara/product/{productId}`,\n   `/adidas/product` (`product_id`), `/bestbuy/product` (`sku`),\n   `/homedepot/product/{id}`, `/sephora/product` (`product_id` — the full\n   product-page slug like `lip-sleeping-mask-P420652`, not just the SKU),\n   `/shein/products/detail` (`goods_id`+`goods_sn`), `/ikea/product`\n   (`item_no`), `/chewy/product` (`id`))\n   for price, variants, specs. **Kohl's has no standalone product-detail\n   endpoint** — product cards (including `web_id`, needed for reviews below)\n   only come back embedded in `/kohls/category`'s listing.\n3. **Sellers** — for eBay/Shop.app, resolve the seller/shop (`/ebay/seller/...`,\n   `/shop-app/shops/{handle}`) to compare offers.\n4. **Reviews** — pull product/seller reviews where available\n   (`/shop-app/products/{id}/reviews`, `/ebay/seller/.../feedback`,\n   `/target/reviews`, `/costco/product/{id}/reviews`, `/walmart/product/{item_id}/reviews`,\n   `/kohls/product/reviews` (`web_id`), `/macys/product/reviews` (`product_id`),\n   `/nike/product/reviews` (`slug`+`style_color`), `/oldnavy/product/reviews`\n   (`pid`+`brand`), `/ulta/product/reviews` (`product_id`), `/wish/product/{id}/reviews`).\n   H&M, Lululemon, Sam's Club, and Zappos surface reviews (when present)\n   embedded in their own product-detail call instead of a separate endpoint;\n   Wayfair and Zara expose no reviews at all — Wayfair's product detail only\n   has an aggregate rating. `/bestbuy/product/reviews` (`sku`),\n   `/sephora/product/reviews` (`product_id`), and `/ikea/reviews`\n   (`item_no`) cover those three separately; Home Depot and Chewy surface\n   reviews embedded in their own product-detail call instead. Adidas reviews and rating summaries are available at\n   `/adidas/product/reviews`, using the search result's `model_number` (not its\n   SKU). Discover per-model review topics via `/adidas/product/review-topics`;\n   locale controls review language and can yield an empty review sample. SHEIN\n   exposes no review endpoint in this catalog.\n5. **Compare** the JSON fields (price, currency, rating, seller) and answer.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Search a marketplace (GET, key=value params):\nscripts/crawlora.sh /amazon/search k=\"standing desk\" | jq '.'\nscripts/crawlora.sh -X POST /ebay/search '{\"keyword\":\"mechanical keyboard\"}' | jq '.'\nscripts/crawlora.sh /shop-app/search query=\"running shoes\" | jq '.'\nscripts/crawlora.sh /target/search q=\"standing desk\" | jq '.'\nscripts/crawlora.sh /walmart/search q=\"standing desk\" | jq '.'\nscripts/crawlora.sh /zalando/search q=\"running shoes\" market=de | jq '.'\nscripts/crawlora.sh /nike/search keyword=\"running shoes\" | jq '.'\nscripts/crawlora.sh /ulta/search query=\"retinol serum\" | jq '.'\nscripts/crawlora.sh /bestbuy/search q=\"laptop\" | jq '.'\nscripts/crawlora.sh /sephora/search query=\"retinol serum\" | jq '.'\nscripts/crawlora.sh /chewy/search q=\"salmon dog food\" | jq '.'\n\n# Product detail:\nscripts/crawlora.sh /amazon/product/B0XXXXXXX | jq '.data'\nscripts/crawlora.sh /ikea/product item_no=00263850 | jq '.'\n\n# Category browse (no keyword search on this platform):\nscripts/crawlora.sh /wayfair/category category=478390 | jq '.'\nscripts/crawlora.sh /zara/category/2420463/products | jq '.'\n\n# Store locator only (no product catalog):\nscripts/crawlora.sh /walgreens/stores zip=10001 | jq '.'\n```\n\nUse `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.\n\n\n## Endpoint reference\n\nSee [`reference/endpoints.md`](reference/endpoints.md) for every endpoint\nthis skill uses, including its method, path, parameters, and platform coverage.\n\n## Examples\n\n- **Cross-marketplace price compare:** search `/amazon/search` and `/ebay/search`\n  for the same query, collect `price` from each, and present the spread.\n- **Seller due diligence:** `/ebay/seller/{seller}` + `/ebay/seller/{seller}/feedback`\n  to summarize a seller's rating and recent feedback before buying.\n- **Shopify catalog audit:** `/shopify/products` (paginate) to list a store's\n  catalog with prices, then flag items above/below a threshold.\n- **No-search retailer browse:** for a retailer with no keyword search\n  (Kohl's, Wayfair, Sam's Club), call the category/department-discovery\n  endpoint first (`/kohls/category`'s facets, `/wayfair/categories`,\n  `/samsclub/departments`) to find a category id, then browse it directly\n  instead of trying to search by keyword.\n\n## Notes & limits\n\n- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.\n  Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- **Public data only** — public product/listing pages; respect each marketplace's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- Results are paginated — pass `page` (and `count` where supported) to walk listings.\n- **Zalando always needs `market`** (no default storefront) — resolve valid\n  codes via `/zalando/markets` if unsure.\n- **Macy's has no search or category browse** — only `/macys/product/{productId}`\n  (needs a known `productId`) and `/macys/suggest` typeahead.\n- **Wayfair has no search and no reviews endpoint** — only\n  `/wayfair/categories` → `/wayfair/category` and `/wayfair/product/{id}`\n  (which carries an aggregate rating, but no review text).\n- **Kohl's has no search or standalone product-detail endpoint** — browse\n  `/kohls/category` (its `category` param takes a `+`-joined taxonomy string,\n  percent-encode the `+` as `%2B`) and read product cards from the listing;\n  `/kohls/product/reviews` needs the `web_id` from that listing.\n- **Sam's Club has no keyword-search endpoint** — start from\n  `/samsclub/departments` or `/samsclub/category`; there's also no dedicated\n  reviews endpoint (rating/review count only comes from `/samsclub/product/{id}`).\n- **Lululemon has no keyword-search endpoint** — browse via\n  `/lululemon/categories` → `/lululemon/category`; reviews are embedded in\n  `/lululemon/product/{product_id}`, not a separate call.\n- **Zara's `/zara/search` requires `section`** (a department like `WOMAN`),\n  and Zara exposes no reviews endpoint at all.\n- **Old Navy's endpoints are shared across four storefronts** — pass\n  `brand=on|gap|br|at` (Old Navy/Gap/Banana Republic/Athleta; defaults to\n  `on`); a `cid`/`pid` found under one brand only works with that same brand.\n\nFile v1.0.19:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"product-price-research\",\n  \"version\": \"1.0.19\",\n  \"publishedAt\": 1789955183697\n}\n\nFile v1.0.19:reference/endpoints.md\n\n# product-price-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**230 endpoints across 35 platform group(s).**\n\n## Amazon (5)\n\n### `amazon_charts`\n\n- **HTTP:** `GET /amazon/charts`\n- **What:** Amazon product charts. Returns one page of a ranked Amazon chart (Best Sellers, New Releases, or Most Wished For) for a department or department subcategory on `amazon.com`. Discover valid department/node values with amazon-charts-categories.\n- **Params:** `chart` (string, **required**) — Chart type; `department` (string, **required**) — Amazon department slug; `node` (string, optional) — Numeric browse node id; `page` (integer, optional) — 1-based page number\n\n### `amazon_charts_categories`\n\n- **HTTP:** `GET /amazon/charts/categories`\n- **What:** Amazon chart categories. Returns the department and subcategory values amazon-charts accepts for a given chart. Omit department to list a chart's top-level departments; pass a department (and optionally a node) to get that category's own name plus its immediate child categories.\n- **Params:** `chart` (string, **required**) — Chart type; `department` (string, optional) — Amazon department slug; `node` (string, optional) — Numeric browse node id (requires department)\n\n### `amazon_product`\n\n- **HTTP:** `GET /amazon/product/{asin}`\n- **What:** Retrieve Amazon product details. Returns normalized product details for an Amazon ASIN on `amazon.com`, including pricing, availability, overview da\n\nArchive v1.0.18: 5 files, 46034 bytes\n\nFiles: reference/endpoints.md (150607b), scripts/crawlora.sh (20977b), skill-card.md (2453b), SKILL.md (11117b), _meta.json (142b)\n\nArchive v1.0.17: 5 files, 44891 bytes\n\nFiles: reference/endpoints.md (150607b), scripts/crawlora.sh (13412b), skill-card.md (2536b), SKILL.md (11117b), _meta.json (142b)\n\nArchive v1.0.16: 5 files, 44369 bytes\n\nFiles: reference/endpoints.md (150607b), scripts/crawlora.sh (9415b), skill-card.md (1986b), SKILL.md (11117b), _meta.json (142b)\n\nArchive v1.0.15: 5 files, 44326 bytes\n\nFiles: reference/endpoints.md (150607b), scripts/crawlora.sh (9158b), skill-card.md (2346b), SKILL.md (11117b), _meta.json (142b)\n\nArchive v1.0.14: 5 files, 44277 bytes\n\nFiles: reference/endpoints.md (150607b), scripts/crawlora.sh (8833b), skill-card.md (2478b), SKILL.md (11142b), _meta.json (142b)\n\nArchive v1.0.13: 5 files, 44163 bytes\n\nFiles: reference/endpoints.md (150607b), scripts/crawlora.sh (8533b), skill-card.md (2531b), SKILL.md (11142b), _meta.json (142b)\n\nArchive v1.0.12: 5 files, 44097 bytes\n\nFiles: reference/endpoints.md (150607b), scripts/crawlora.sh (8485b), skill-card.md (2439b), SKILL.md (11142b), _meta.json (142b)","readmeExcerpt":"Skill: product-price-research Owner: crawlora-org Summary: Researches products, prices, sellers, and reviews across major online marketplaces and big-box/specialty retailers (Amazon, eBay, Shopify stores, Shop.app, Target, Costco, Walmart, Nike, Zara, Adidas, Best Buy, Home Depot, Sephora, SHEIN, IKEA, Chewy, and more) using the Crawlora API, returning clean JSON. Use when the user asks to find a product, compare pri","codeSnippets":[],"executableExamples":[{"language":"sh","snippet":"# Search a marketplace (GET, key=value params):\nscripts/crawlora.sh /amazon/search k=\"standing desk\" | jq '.'\nscripts/crawlora.sh -X POST /ebay/search '{\"keyword\":\"mechanical keyboard\"}' | jq '.'\nscripts/crawlora.sh /shop-app/search query=\"running shoes\" | jq '.'\nscripts/crawlora.sh /target/search q=\"standing desk\" | jq '.'\nscripts/crawlora.sh /walmart/search q=\"standing desk\" | jq '.'\nscripts/crawlora.sh /zalando/search q=\"running shoes\" market=de | jq '.'\nscripts/crawlora.sh /nike/search keyword=\"running shoes\" | jq '.'\nscripts/crawlora.sh /ulta/search query=\"retinol serum\" | jq '.'\nscripts/crawlora.sh /bestbuy/search q=\"laptop\" | jq '.'\nscripts/crawlora.sh /sephora/search query=\"retinol serum\" | jq '.'\nscripts/crawlora.sh /chewy/search q=\"salmon dog food\" | jq '.'\n\n# Product detail:\nscripts/crawlora.sh /amazon/product/B0XXXXXXX | jq '.data'\nscripts/crawlora.sh /ikea/product item_no=00263850 | jq '.'\n\n# Category browse (no keyword search on this platform):\nscripts/crawlora.sh /wayfair/category category=478390 | jq '.'\nscripts/crawlora.sh /zara/category/2420463/products | jq '.'\n\n# Store locator only (no product catalog):\nscripts/crawlora.sh /walgreens/stores zip=10001 | jq '.'"},{"language":"sh","snippet":"scripts/crawlora.sh /aliexpress/search-filters q=\"usb c hub\"\nscripts/crawlora.sh /aliexpress/search q=\"usb c hub\" page=1 sort=best_match"},{"language":"sh","snippet":"# Search a marketplace (GET, key=value params):\nscripts/crawlora.sh /amazon/search k=\"standing desk\" | jq '.'\nscripts/crawlora.sh -X POST /ebay/search '{\"keyword\":\"mechanical keyboard\"}' | jq '.'\nscripts/crawlora.sh /shop-app/search query=\"running shoes\" | jq '.'\nscripts/crawlora.sh /target/search q=\"standing desk\" | jq '.'\nscripts/crawlora.sh /walmart/search q=\"standing desk\" | jq '.'\nscripts/crawlora.sh /zalando/search q=\"running shoes\" market=de | jq '.'\nscripts/crawlora.sh /nike/search keyword=\"running shoes\" | jq '.'\nscripts/crawlora.sh /ulta/search query=\"retinol serum\" | jq '.'\nscripts/crawlora.sh /bestbuy/search q=\"laptop\" | jq '.'\nscripts/crawlora.sh /sephora/search query=\"retinol serum\" | jq '.'\nscripts/crawlora.sh /chewy/search q=\"salmon dog food\" | jq '.'\n\n# Product detail:\nscripts/crawlora.sh /amazon/product/B0XXXXXXX | jq '.data'\nscripts/crawlora.sh /ikea/product item_no=00263850 | jq '.'\n\n# Category browse (no keyword search on this platform):\nscripts/crawlora.sh /wayfair/category category=478390 | jq '.'\nscripts/crawlora.sh /zara/category/2420463/products | jq '.'\n\n# Store locator only (no product catalog):\nscripts/crawlora.sh /walgreens/stores zip=10001 | jq '.'"},{"language":"sh","snippet":"# Search a marketplace (GET, key=value params):\nscripts/crawlora.sh /amazon/search k=\"standing desk\" | jq '.'\nscripts/crawlora.sh -X POST /ebay/search '{\"keyword\":\"mechanical keyboard\"}' | jq '.'\nscripts/crawlora.sh /shop-app/search query=\"running shoes\" | jq '.'\nscripts/crawlora.sh /target/search q=\"standing desk\" | jq '.'\nscripts/crawlora.sh /walmart/search q=\"standing desk\" | jq '.'\nscripts/crawlora.sh /zalando/search q=\"running shoes\" market=de | jq '.'\nscripts/crawlora.sh /nike/search keyword=\"running shoes\" | jq '.'\nscripts/crawlora.sh /ulta/search query=\"retinol serum\" | jq '.'\nscripts/crawlora.sh /bestbuy/search q=\"laptop\" | jq '.'\nscripts/crawlora.sh /sephora/search query=\"retinol serum\" | jq '.'\nscripts/crawlora.sh /chewy/search q=\"salmon dog food\" | jq '.'\n\n# Product detail:\nscripts/crawlora.sh /amazon/product/B0XXXXXXX | jq '.data'\nscripts/crawlora.sh /ikea/product item_no=00263850 | jq '.'\n\n# Category browse (no keyword search on this platform):\nscripts/crawlora.sh /wayfair/category category=478390 | jq '.'\nscripts/crawlora.sh /zara/category/2420463/products | jq '.'\n\n# Store locator only (no product catalog):\nscripts/crawlora.sh /walgreens/stores zip=10001 | jq '.'"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: product-price-research\ndescription: Researches products, prices, sellers, and reviews across major online marketplaces and big-box/specialty retailers (Amazon, eBay, Shopify stores, Shop.app, Target, Costco, Walmart, Nike, Zara, Adidas, Best Buy, Home Depot, Sephora, SHEIN, IKEA, Chewy, and more) using the Crawlora API, returning clean JSON. Use when the user asks to find a product, compare prices or sellers, track listings, or pull marketplace/retailer reviews — instead of scraping store pages.\n---\n\n# Product & price research\n\nLook up and compare products, prices, sellers, and reviews across Amazon,\neBay, Shopify storefronts, Shop.app, Target, Costco, Zalando, Walmart, H&M,\nKohl's, Lululemon, Macy's, Nike, Old Navy (plus Gap, Banana Republic, and\nAthleta under the same endpoints), Sam's Club, Ulta Beauty, Wayfair, Wish,\nZappos, Zara, Adidas, Best Buy, Home Depot, Sephora, SHEIN, IKEA, and\nChewy — all as normalized JSON from the Crawlora API, with no HTML\nscraping. Walgreens is store-locator only (no product catalog).\n\n## When to use this skill\n\n- \"What does X cost on Amazon / eBay / Target / Walmart?\" or \"compare prices\n  for X across sellers/retailers.\"\n- \"Find listings for X\" / \"search this Shopify store\" / \"what's in this collection?\"\n- \"Pull reviews / ratings for this product or seller.\"\n- \"Track this product's price / variants / availability.\"\n- Competitive pricing, catalog, or marketplace-review research.\n- \"Browse category X on Wayfair / Kohl's / Sam's Club\" when the retailer has\n  no keyword search of its own.\n- Apparel/beauty catalog lookups spanning Nike, Zara, H&M, Old Navy/Gap/Banana\n  Republic/Athleta, Lululemon, Ulta Beauty, Adidas, or Sephora.\n- Home-goods/electronics/pet lookups spanning Home Depot, Best Buy, IKEA, or Chewy.\n- \"Find the nearest Walgreens\" (store locator only — no product catalog).\n\n## Setup (one-time)\n\n- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).\n- Set `CRAWLORA_API_KEY` in the environment before running the helper.\n- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.\n\n## How it works\n\nPick the marketplace, then the job:\n\n1. **Search / discover** — `/amazon/search`, `/ebay/search`, `/shopify/products`,\n   `/shop-app/search`, `/target/search`, `/costco/search`, `/walmart/search`,\n   `/hm/search`, `/nike/search`, `/oldnavy/search` (covers Old Navy, Gap,\n   Banana Republic, and Athleta via `brand=on|gap|br|at`, defaults to `on`),\n   `/ulta/search`, `/wish/search`, `/zappos/search`, `/zara/search` (**requires\n   `section`**, a department like `WOMAN`/`MAN`), and `/zalando/search` (this\n   one **requires `market`** — a Zalando country storefront code like `de`,\n   `fr`, `com`; list them via `/zalando/markets`) to find candidate products by\n   keyword. **Kohl's, Lululemon, Macy's, Sam's Club,"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"product-price-research\",\n  \"version\": \"1.0.21\",\n  \"publishedAt\": 1791163226237\n}"},{"path":"reference/endpoints.md","content":"# product-price-research — endpoint reference\n\n> Generated from `scripts/tools.json` by `scripts/generate.mjs` — do not edit by hand.\n\nEndpoints this skill uses, grouped by platform. Call them via `scripts/crawlora.sh` (see SKILL.md).\n\nAll paths are relative to the API base `https://api.crawlora.net/api/v1` and require the header `x-api-key: $CRAWLORA_API_KEY`. Path params like `{id}` are substituted into the URL; `GET` params go in the query string; `POST` params go in a JSON body.\n\n**233 endpoints across 36 platform group(s).**\n\n## Amazon (5)\n\n### `amazon_charts`\n\n- **HTTP:** `GET /amazon/charts`\n- **What:** Amazon product charts. Returns one page of a ranked Amazon chart (Best Sellers, New Releases, or Most Wished For) for a department or department subcategory on `amazon.com`. Discover valid department/node values with amazon-charts-categories.\n- **Params:** `chart` (string, **required**) — Chart type; `department` (string, **required**) — Amazon department slug; `node` (string, optional) — Numeric browse node id; `page` (integer, optional) — 1-based page number\n\n### `amazon_charts_categories`\n\n- **HTTP:** `GET /amazon/charts/categories`\n- **What:** Amazon chart categories. Returns the department and subcategory values amazon-charts accepts for a given chart. Omit department to list a chart's top-level departments; pass a department (and optionally a node) to get that category's own name plus its immediate child categories.\n- **Params:** `chart` (string, **required**) — Chart type; `department` (string, optional) — Amazon department slug; `node` (string, optional) — Numeric browse node id (requires department)\n\n### `amazon_product`\n\n- **HTTP:** `GET /amazon/product/{asin}`\n- **What:** Retrieve Amazon product details. Returns normalized product details for an Amazon ASIN on `amazon.com`, including pricing, availability, overview data, inline review samples, and descriptive content.\n- **Params:** `asin` (string, **required**) — Amazon ASIN; `currency` (string, optional) — Amazon currency; `language` (string, optional) — Amazon language\n\n### `amazon_search`\n\n- **HTTP:** `GET /amazon/search`\n- **What:** Search Amazon products. Returns normalized Amazon search result cards for `amazon.com`.\n- **Params:** `k` (string, **required**) — Search keyword; `page` (integer, optional) — 1-based page number; `s` (string, optional) — Sort order\n\n### `amazon_suggest`\n\n- **HTTP:** `GET /amazon/suggest/{keyword}`\n- **What:** Retrieve Amazon search suggestions. Returns typeahead keyword suggestions from Amazon's public suggestion API for `amazon.com`.\n- **Params:** `keyword` (string, **required**) — Suggestion prefix\n\n## eBay (10)\n\n### `ebay_item`\n\n- **HTTP:** `GET /ebay/item/{item_id}`\n- **What:** Get eBay item details. Returns normalized details for a public eBay item listing.\n- **Params:** `item_id` (string, **required**) — eBay item ID\n\n### `ebay_live_stream`\n\n- **HTTP:** `GET /ebay/live/streams/{id}`\n- **What:** Get an eBay Live stream. Returns normalized de"},{"path":"skill-card.md","content":"## Description:\n\nResearches product listings, prices, sellers, and reviews across online marketplaces and retailers through the Crawlora API to support comparison and monitoring.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[crawlora-org](https://clawhub.ai/user/crawlora-org)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nShoppers, researchers, and commerce teams use this skill to find products and compare retailer prices, seller details, availability, and reviews without scraping storefront pages directly.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product queries and request parameters are sent to Crawlora with an API key.\n\nMitigation: Keep the key secret and avoid including personal or sensitive data in lookup queries.\n\nRisk: Competitive monitoring, live inventory figures, and regulated-product attributes can require extra care.\n\nMitigation: Review the endpoint reference and verify source data before using results for consequential decisions.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [ClawHub skill release](https://clawhub.ai/crawlora-org/skills/product-price-research)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON]\n\n**Output Format:** [Markdown summaries and JSON API responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Results depend on retailer coverage and may be paginated.]\n\n## Skill Version(s):\n\n1.0.21 (source: ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1544,"uniquenessScore":42,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T03:17:59.156Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T03:17:59.156Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T05:35:19.931Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}