{"id":"81f7f86b-cb1d-4820-9930-91f64616a11f","entityType":"agent","slug":"clawhub-crawlora-org-shopify-research","name":"shopify-research","canonicalUrl":"https://www.xpersona.co/agent/clawhub-crawlora-org-shopify-research","canonicalPath":"/agent/clawhub-crawlora-org-shopify-research","generatedAt":"2026-10-11T15:15:29.978Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T12:18:41.564Z","emptyReason":null},"description":"Researches independent Shopify-powered storefronts — products, collections, pages, sitemaps, search suggestions, and product recommendations — using the Crawlora API, returning clean JSON for any store by domain, plus 14 pre-wired DTC brand storefronts (Allbirds, Brooklinen, Cole Haan, Everlane, Fashion Nova, Gymshark, J.Crew, Kylie Cosmetics, Oh Polly, Quince, Rothy's, SKIMS, Steve Madden, The Body Shop). Use when the user asks to audit a Shopify store's catalog, crawl its sitemap, look up a product or collection, or pull search/recommendation data — instead of scraping the store's pages directly.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:shopify-research","sourceUrl":"https://clawhub.ai/crawlora-org/shopify-research","homepage":"https://clawhub.ai/crawlora-org/skills/shopify-research","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/crawlora-org/shopify-research","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/crawlora-org/skills/shopify-research","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"shopify-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-11T12:18:41.564Z","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-11T12:18:41.564Z","emptyReason":null},"stars":null,"forks":null,"downloads":1066,"packageName":null,"latestVersion":"1.0.18","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T12:18:41.474Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T12:18:41.564Z","lastCrawledAt":"2026-10-11T12:18:41.474Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T12:18:41.474Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.18","createdAt":"2026-09-26T15:06:55.767Z","changelog":"Declare the scoped API helper and document credential and network handling","fileCount":5,"zipByteSize":17407},{"version":"1.0.17","createdAt":"2026-09-21T01:51:56.246Z","changelog":"Sync skill instructions, references, and helper from GitHub 0cfbceba40b050ba434a0a3f4945ca97b668c805","fileCount":5,"zipByteSize":17252},{"version":"1.0.16","createdAt":"2026-09-17T10:21:04.392Z","changelog":"Security hardening: generated helpers now enforce exact routes, methods, and credential-safe curl behavior.","fileCount":5,"zipByteSize":16741},{"version":"1.0.15","createdAt":"2026-09-14T02:08:45.646Z","changelog":"Sync skill instructions, references, and helper from GitHub 902f58316c643ffbcabc57fc6f15f59d27ec063d","fileCount":5,"zipByteSize":17186},{"version":"1.0.14","createdAt":"2026-09-10T12:36:22.398Z","changelog":"Validate API keys before curl config","fileCount":5,"zipByteSize":16854},{"version":"1.0.13","createdAt":"2026-09-10T12:17:15.064Z","changelog":"Keep API keys out of process arguments","fileCount":5,"zipByteSize":16635},{"version":"1.0.12","createdAt":"2026-09-10T12:07:53.443Z","changelog":"Reject curl local-file query syntax","fileCount":5,"zipByteSize":16726},{"version":"1.0.11","createdAt":"2026-09-10T11:55:35.215Z","changelog":"Stream helper request bodies through curl stdin","fileCount":5,"zipByteSize":16414}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:shopify-research","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17d53nb8nd03gyyfdy32rgde58e574f:shopify-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/shopify-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-shopify-research/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-shopify-research/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-shopify-research/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-shopify-research/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-shopify-research/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-shopify-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-11T15:15:29.974Z"}},"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-shopify-research/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-shopify-research/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-shopify-research/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-crawlora-org-shopify-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-11T12:18:41.564Z","emptyReason":null},"readme":"Skill: shopify-research\n\nOwner: crawlora-org\n\nSummary: Researches independent Shopify-powered storefronts — products, collections, pages, sitemaps, search suggestions, and product recommendations — using the Crawlora API, returning clean JSON for any store by domain, plus 14 pre-wired DTC brand storefronts (Allbirds, Brooklinen, Cole Haan, Everlane, Fashion Nova, Gymshark, J.Crew, Kylie Cosmetics, Oh Polly, Quince, Rothy's, SKIMS, Steve Madden, The Body Shop). Use when the user asks to audit a Shopify store's catalog, crawl its sitemap, look up a product or collection, or pull search/recommendation data — instead of scraping the store's pages directly.\n\nTags: latest:1.0.18\n\nVersion history:\n\nv1.0.18 | 2026-09-26T15:06:55.767Z | user\n\nDeclare the scoped API helper and document credential and network handling\n\nv1.0.17 | 2026-09-21T01:51:56.246Z | user\n\nSync skill instructions, references, and helper from GitHub 0cfbceba40b050ba434a0a3f4945ca97b668c805\n\nv1.0.16 | 2026-09-17T10:21:04.392Z | user\n\nSecurity hardening: generated helpers now enforce exact routes, methods, and credential-safe curl behavior.\n\nv1.0.15 | 2026-09-14T02:08:45.646Z | user\n\nSync skill instructions, references, and helper from GitHub 902f58316c643ffbcabc57fc6f15f59d27ec063d\n\nv1.0.14 | 2026-09-10T12:36:22.398Z | user\n\nValidate API keys before curl config\n\nv1.0.13 | 2026-09-10T12:17:15.064Z | user\n\nKeep API keys out of process arguments\n\nv1.0.12 | 2026-09-10T12:07:53.443Z | user\n\nReject curl local-file query syntax\n\nv1.0.11 | 2026-09-10T11:55:35.215Z | user\n\nStream helper request bodies through curl stdin\n\nv1.0.10 | 2026-09-10T11:43:34.945Z | user\n\nScope helper routes and remove secret-shaped key examples\n\nv1.0.9 | 2026-09-10T07:06:27.829Z | user\n\nMigrate publisher from tonywangcn to crawlora-org for brand consistency with the plugins\n\nv1.0.8 | 2026-09-08T04:36:17.255Z | user\n\nRefresh stale REST examples, endpoint references, and Bash helper from crawlora-skills 1.17.1.\n\nv1.0.7 | 2026-09-07T13:18:15.535Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.6 | 2026-09-07T08:06:26.621Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.5 | 2026-09-07T06:28:59.447Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.4 | 2026-08-24T07:04:29.900Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.3 | 2026-08-24T06:19:32.050Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.2 | 2026-08-24T05:02:20.304Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.1 | 2026-08-14T18:20:36.261Z | user\n\nSync via scripts/sync-directories.sh\n\nv1.0.0 | 2026-08-10T19:05:25.133Z | user\n\nInitial publish\n\nArchive index:\n\nArchive v1.0.18: 5 files, 17407 bytes\n\nFiles: reference/endpoints.md (85334b), scripts/crawlora.sh (10107b), skill-card.md (1758b), SKILL.md (7020b), _meta.json (136b)\n\nFile v1.0.18:SKILL.md\n\n---\nname: shopify-research\ndescription: Researches independent Shopify-powered storefronts — products, collections, pages, sitemaps, search suggestions, and product recommendations — using the Crawlora API, returning clean JSON for any store by domain, plus 14 pre-wired DTC brand storefronts (Allbirds, Brooklinen, Cole Haan, Everlane, Fashion Nova, Gymshark, J.Crew, Kylie Cosmetics, Oh Polly, Quince, Rothy's, SKIMS, Steve Madden, The Body Shop). Use when the user asks to audit a Shopify store's catalog, crawl its sitemap, look up a product or collection, or pull search/recommendation data — instead of scraping the store's pages directly.\nallowed-tools: Bash(scripts/crawlora.sh:*)\n---\n\n# Shopify store research\n\nLook up and crawl independent Shopify-powered storefronts — products,\ncollections, pages, sitemaps, predictive search, and product recommendations\n— all as normalized JSON from the Crawlora API, with no HTML scraping. Works\nagainst any Shopify store by domain (not Shop.app; see the separate\n`shop-app-research` skill for that), plus 14 brand storefronts with their own\npre-wired, no-`url`-needed endpoints: Allbirds, Brooklinen, Cole Haan,\nEverlane, Fashion Nova, Gymshark, J.Crew, Kylie Cosmetics, Oh Polly, Quince,\nRothy's, SKIMS, Steve Madden, and The Body Shop.\n\n## Tool scope and data flow\n\nThe optional shell helper is the only command this skill asks to run. It makes\nGET requests only to the documented, allowlisted Crawlora routes. When invoked,\nit reads `CRAWLORA_API_KEY` and sends it as an `x-api-key` header over HTTPS to\n`api.crawlora.net`; it does not send the key to the Shopify storefront. It\nbriefly writes a mode-600 curl config under `TMPDIR` and removes it when the\ncommand exits. It does not inspect other environment variables, enumerate files,\ninstall software, or run with elevated privileges. Storefront URLs are passed as\nordinary query values; the helper's destination host is fixed. Run it only when\nyou want to make a Crawlora API request; successful requests can consume credits.\n\n## When to use this skill\n\n- \"List the products/collections in this Shopify store.\"\n- \"What's on this Shopify store's `/pages/about` page?\"\n- \"Crawl this Shopify store's sitemap for every product URL.\"\n- \"What does this Shopify store's search suggest for 'running shoes'?\"\n- \"What products does Shopify recommend alongside this product?\"\n- Catalog audits, competitive-assortment research, or full-store crawls of a\n  Shopify-powered site.\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\nEvery call takes the storefront's `url` (the store's public domain, e.g.\n`https://example.myshopify.com` or a custom domain like\n`https://example.com`) plus endpoint-specific params:\n\n1. **Resolve the store** — `/shopify/store` returns normalized storefront\n   metadata; if the vanity domain blocks `/products.json`, it falls back to\n   the store's public `*.myshopify.com` domain.\n2. **Browse the catalog** — `/shopify/collections` and `/shopify/products`\n   (paginated, `limit` up to 250) list collections and products; drill into\n   one collection's products with `/shopify/collections/{handle}/products`.\n3. **Detail** — `/shopify/products/{handle}` for a single product's full\n   detail.\n4. **Recommendations** — `/shopify/products/{handle}/recommendations`\n   (`intent=related|complementary`) for cross-sell/upsell data.\n5. **Static content** — `/shopify/pages` and `/shopify/pages/{handle}` for\n   the store's static pages (body HTML returned as cleaned text).\n6. **Sitemap crawl** — `/shopify/sitemaps` lists the child sitemaps;\n   `/shopify/sitemap/urls` (`type=products|collections|pages|blogs|...`)\n   returns capped URL entries from them, useful for enumerating a whole\n   store without paginating every list endpoint.\n7. **Search** — `/shopify/search/suggest` (`q=`, optional `types=`) returns\n   predictive-search products, collections, and query suggestions.\n8. **Brand-pinned stores** — the same operations exist under a brand prefix\n   with no `url` param needed, e.g. `/allbirds/products`,\n   `/rothys/products/{handle}`, `/skims/sitemap/urls`. Use these instead of\n   `/shopify/...?url=...` when the user names one of the 14 pre-wired\n   brands directly.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Resolve store metadata:\nscripts/crawlora.sh /shopify/store url=\"https://example.myshopify.com\"\n\n# List products / collections (paginated):\nscripts/crawlora.sh /shopify/products url=\"https://example.myshopify.com\" limit=100 page=1\nscripts/crawlora.sh /shopify/collections url=\"https://example.myshopify.com\"\n\n# Crawl the sitemap for every product URL:\nscripts/crawlora.sh /shopify/sitemap/urls url=\"https://example.myshopify.com\" type=products limit=250\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 Shopify\nendpoint this skill uses (method, path, params, description), including\nthe 14 brand-pinned mirrors.\n\n## Examples\n\n- **Catalog audit:** `/shopify/products` (paginate with `page`/`limit`) to\n  list a store's full catalog with prices and variants, then flag gaps or\n  outliers.\n- **Sitemap-driven full crawl:** `/shopify/sitemaps` to find the child\n  sitemaps, then `/shopify/sitemap/urls?type=products` to enumerate every\n  product URL without walking paginated list endpoints.\n- **Search & recommendation research:** `/shopify/search/suggest` for a\n  query to see what a store's predictive search surfaces, then\n  `/shopify/products/{handle}/recommendations` to map cross-sell links\n  between products.\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 storefront pages; respect each store's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **`url` is required on every call** — the store's public domain\n  (`*.myshopify.com` or custom domain); there's no default store.\n- Results are paginated — pass `page` (and `limit` where supported, up to\n  250) to walk collections, products, and pages.\n- Product/collection/page lookups take a `handle`, not a numeric ID —\n  discover handles via the list endpoints or sitemap crawl first.\n- Empty result pages return `200` with an empty array rather than an error —\n  check the array length to know when to stop paginating.\n\nFile v1.0.18:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"shopify-research\",\n  \"version\": \"1.0.18\",\n  \"publishedAt\": 1790435215767\n}\n\nFile v1.0.18:reference/endpoints.md\n\n# shopify-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**159 endpoints across 15 platform group(s).**\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## Allbirds (11)\n\n### `allbirds_collection_products`\n\n- **HTTP:** `GET /allbirds/collections/{handle}/products`\n- **What:** List Allbirds collection products. Returns normalized products from one Allbirds (https://www.allbirds.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `allbirds_collections`\n\n- **HTTP:** `GET /allbirds/collections`\n- **What:** List Allbirds collections. Returns normalized collections from Allbirds (https://www.allbirds.com). The storefront URL is fixed server-side. 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\n\n### `allbirds_page`\n\n- **HTTP:** `GET /allbirds/pages/{handle}`\n- **What:** Get a Allbirds static page. Returns normalized static page detail for one Allbirds (https://www.allbirds.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `allbirds_pages`\n\n- **HTTP:** `GET /allbirds/pages`\n- **What:** List Allbirds static pages. Returns normalized static pages from Allbirds (https://www.allbirds.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `allbirds_product`\n\n- **HTTP:** `GET /allbirds/products/{handle}`\n- **What:** Get a Allbirds product. Returns normalized product detail for one Allbirds (https://www.allbirds.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `allbirds_product_recommendations`\n\n- **HTTP:** `GET /allbirds/products/{handle}/recommendations`\n- **What:** List Allbirds product recommendations. Returns normalized recommended products for one Allbirds (https://www.allbirds.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `allbirds_products`\n\n- **HTTP:** `GET /allbirds/products`\n- **What:** List Allbirds products. Returns normalized products from Allbirds's (https://www.allbirds.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `allbirds_search_suggest`\n\n- **HTTP:** `GET /allbirds/search/suggest`\n- **What:** Get Allbirds search suggestions. Returns products, collections, and query suggestions from Allbirds's (https://www.allbirds.com) credential-free predictive search Ajax endpoint. The storefront URL is fixed server-side.\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\n\n### `allbirds_sitemap_urls`\n\n- **HTTP:** `GET /allbirds/sitemap/urls`\n- **What:** List Allbirds sitemap URLs. Returns capped URL entries from Allbirds's (https://www.allbirds.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.\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\n\n### `allbirds_sitemaps`\n\n- **HTTP:** `GET /allbirds/sitemaps`\n- **What:** List Allbirds sitemaps. Returns child sitemap URLs from Allbirds's (https://www.allbirds.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.\n- **Params:** _none_\n\n### `allbirds_store`\n\n- **HTTP:** `GET /allbirds/store`\n- **What:** Get Allbirds store metadata. Returns normalized storefront metadata for Allbirds (https://www.allbirds.com), sourced from credential-free storefront JSON. This endpoint is a brand-pinned wrapper around the generic Shopify store family: the storefront URL is fixed server-side, so no `url` parameter is accepted. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page, or to the storefront's own embedded page data for storefronts that expose neither.\n- **Params:** _none_\n\n## Brooklinen (11)\n\n### `brooklinen_collection_products`\n\n- **HTTP:** `GET /brooklinen/collections/{handle}/products`\n- **What:** List Brooklinen collection products. Returns normalized products from one Brooklinen (https://www.brooklinen.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `brooklinen_collections`\n\n- **HTTP:** `GET /brooklinen/collections`\n- **What:** List Brooklinen collections. Returns normalized collections from Brooklinen (https://www.brooklinen.com). The storefront URL is fixed server-side. 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\n\n### `brooklinen_page`\n\n- **HTTP:** `GET /brooklinen/pages/{handle}`\n- **What:** Get a Brooklinen static page. Returns normalized static page detail for one Brooklinen (https://www.brooklinen.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `brooklinen_pages`\n\n- **HTTP:** `GET /brooklinen/pages`\n- **What:** List Brooklinen static pages. Returns normalized static pages from Brooklinen (https://www.brooklinen.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `brooklinen_product`\n\n- **HTTP:** `GET /brooklinen/products/{handle}`\n- **What:** Get a Brooklinen product. Returns normalized product detail for one Brooklinen (https://www.brooklinen.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `brooklinen_product_recommendations`\n\n- **HTTP:** `GET /brooklinen/products/{handle}/recommendations`\n- **What:** List Brooklinen product recommendations. Returns normalized recommended products for one Brooklinen (https://www.brooklinen.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `brooklinen_products`\n\n- **HTTP:** `GET /brooklinen/products`\n- **What:** List Brooklinen products. Returns normalized products from Brooklinen's (https://www.brooklinen.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `brooklinen_search_suggest`\n\n- **HTTP:** `GET /brooklinen/search/suggest`\n- **What:** Get Brooklinen search suggestions. Returns products, collections, and query suggestions from Brooklinen's (https://www.brooklinen.com) credential-free predictive search Ajax endpoint. The storefront URL is fixed server-side.\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\n\n### `brooklinen_sitemap_urls`\n\n- **HTTP:** `GET /brooklinen/sitemap/urls`\n- **What:** List Brooklinen sitemap URLs. Returns capped URL entries from Brooklinen's (https://www.brooklinen.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.\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\n\n### `brooklinen_sitemaps`\n\n- **HTTP:** `GET /brooklinen/sitemaps`\n- **What:** List Brooklinen sitemaps. Returns child sitemap URLs from Brooklinen's (https://www.brooklinen.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.\n- **Params:** _none_\n\n### `brooklinen_store`\n\n- **HTTP:** `GET /brooklinen/store`\n- **What:** Get Brooklinen store metadata. Returns normalized storefront metadata for Brooklinen (https://www.brooklinen.com), sourced from credential-free storefront JSON. This endpoint is a brand-pinned wrapper around the generic Shopify store family: the storefront URL is fixed server-side, so no `url` parameter is accepted. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page, or to the storefront's own embedded page data for storefronts that expose neither.\n- **Params:** _none_\n\n## Cole Haan (11)\n\n### `colehaan_collection_products`\n\n- **HTTP:** `GET /colehaan/collections/{handle}/products`\n- **What:** List Cole Haan collection products. Returns normalized products from one Cole Haan (https://www.colehaan.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `colehaan_collections`\n\n- **HTTP:** `GET /colehaan/collections`\n- **What:** List Cole Haan collections. Returns normalized collections from Cole Haan (https://www.colehaan.com). The storefront URL is fixed server-side. 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\n\n### `colehaan_page`\n\n- **HTTP:** `GET /colehaan/pages/{handle}`\n- **What:** Get a Cole Haan static page. Returns normalized static page detail for one Cole Haan (https://www.colehaan.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `colehaan_pages`\n\n- **HTTP:** `GET /colehaan/pages`\n- **What:** List Cole Haan static pages. Returns normalized static pages from Cole Haan (https://www.colehaan.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `colehaan_product`\n\n- **HTTP:** `GET /colehaan/products/{handle}`\n- **What:** Get a Cole Haan product. Returns normalized product detail for one Cole Haan (https://www.colehaan.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `colehaan_product_recommendations`\n\n- **HTTP:** `GET /colehaan/products/{handle}/recommendations`\n- **What:** List Cole Haan product recommendations. Returns normalized recommended products for one Cole Haan (https://www.colehaan.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `colehaan_products`\n\n- **HTTP:** `GET /colehaan/products`\n- **What:** List Cole Haan products. Returns normalized products from Cole Haan's (https://www.colehaan.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `colehaan_search_suggest`\n\n- **HTTP:** `GET /colehaan/search/suggest`\n- **What:** Get Cole Haan search suggestions. Returns products, collections, and query suggestions from Cole Haan's (https://www.colehaan.com) credential-free predictive search Ajax endpoint. The storefront URL is fixed server-side.\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\n\n### `colehaan_sitemap_urls`\n\n- **HTTP:** `GET /colehaan/sitemap/urls`\n- **What:** List Cole Haan sitemap URLs. Returns capped URL entries from Cole Haan's (https://www.colehaan.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.\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\n\n### `colehaan_sitemaps`\n\n- **HTTP:** `GET /colehaan/sitemaps`\n- **What:** List Cole Haan sitemaps. Returns child sitemap URLs from Cole Haan's (https://www.colehaan.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.\n- **Params:** _none_\n\n### `colehaan_store`\n\n- **HTTP:** `GET /colehaan/store`\n- **What:** Get Cole Haan store metadata. Returns normalized storefront metadata for Cole Haan (https://www.colehaan.com), sourced from credential-free storefront JSON. This endpoint is a brand-pinned wrapper around the generic Shopify store family: the storefront URL is fixed server-side, so no `url` parameter is accepted. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page, or to the storefront's own embedded page data for storefronts that expose neither.\n- **Params:** _none_\n\n## Everlane (11)\n\n### `everlane_collection_products`\n\n- **HTTP:** `GET /everlane/collections/{handle}/products`\n- **What:** List Everlane collection products. Returns normalized products from one Everlane (https://www.everlane.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `everlane_collections`\n\n- **HTTP:** `GET /everlane/collections`\n- **What:** List Everlane collections. Returns normalized collections from Everlane (https://www.everlane.com). The storefront URL is fixed server-side. 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\n\n### `everlane_page`\n\n- **HTTP:** `GET /everlane/pages/{handle}`\n- **What:** Get a Everlane static page. Returns normalized static page detail for one Everlane (https://www.everlane.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `everlane_pages`\n\n- **HTTP:** `GET /everlane/pages`\n- **What:** List Everlane static pages. Returns normalized static pages from Everlane (https://www.everlane.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `everlane_product`\n\n- **HTTP:** `GET /everlane/products/{handle}`\n- **What:** Get a Everlane product. Returns normalized product detail for one Everlane (https://www.everlane.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `everlane_product_recommendations`\n\n- **HTTP:** `GET /everlane/products/{handle}/recommendations`\n- **What:** List Everlane product recommendations. Returns normalized recommended products for one Everlane (https://www.everlane.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `everlane_products`\n\n- **HTTP:** `GET /everlane/products`\n- **What:** List Everlane products. Returns normalized products from Everlane's (https://www.everlane.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `everlane_search_suggest`\n\n- **HTTP:** `GET /everlane/search/suggest`\n- **What:** Get Everlane search suggestions. Returns products, collections, and query suggestions from Everlane's (https://www.everlane.com) credential-free predictive search Ajax endpoint. The storefront URL is fixed server-side.\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\n\n### `everlane_sitemap_urls`\n\n- **HTTP:** `GET /everlane/sitemap/urls`\n- **What:** List Everlane sitemap URLs. Returns capped URL entries from Everlane's (https://www.everlane.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.\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\n\n### `everlane_sitemaps`\n\n- **HTTP:** `GET /everlane/sitemaps`\n- **What:** List Everlane sitemaps. Returns child sitemap URLs from Everlane's (https://www.everlane.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.\n- **Params:** _none_\n\n### `everlane_store`\n\n- **HTTP:** `GET /everlane/store`\n- **What:** Get Everlane store metadata. Returns normalized storefront metadata for Everlane (https://www.everlane.com), sourced from credential-free storefront JSON. This endpoint is a brand-pinned wrapper around the generic Shopify store family: the storefront URL is fixed server-side, so no `url` parameter is accepted. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page, or to the storefront's own embedded page data for storefronts that expose neither.\n- **Params:** _none_\n\n## Fashion Nova (11)\n\n### `fashionnova_collection_products`\n\n- **HTTP:** `GET /fashionnova/collections/{handle}/products`\n- **What:** List Fashion Nova collection products. Returns normalized products from one Fashion Nova (https://www.fashionnova.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `fashionnova_collections`\n\n- **HTTP:** `GET /fashionnova/collections`\n- **What:** List Fashion Nova collections. Returns normalized collections from Fashion Nova (https://www.fashionnova.com). The storefront URL is fixed server-side. 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\n\n### `fashionnova_page`\n\n- **HTTP:** `GET /fashionnova/pages/{handle}`\n- **What:** Get a Fashion Nova static page. Returns normalized static page detail for one Fashion Nova (https://www.fashionnova.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `fashionnova_pages`\n\n- **HTTP:** `GET /fashionnova/pages`\n- **What:** List Fashion Nova static pages. Returns normalized static pages from Fashion Nova (https://www.fashionnova.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `fashionnova_product`\n\n- **HTTP:** `GET /fashionnova/products/{handle}`\n- **What:** Get a Fashion Nova product. Returns normalized product detail for one Fashion Nova (https://www.fashionnova.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `fashionnova_product_recommendations`\n\n- **HTTP:** `GET /fashionnova/products/{handle}/recommendations`\n- **What:** List Fashion Nova product recommendations. Returns normalized recommended products for one Fashion Nova (https://www.fashionnova.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `fashionnova_products`\n\n- **HTTP:** `GET /fashionnova/products`\n- **What:** List Fashion Nova products. Returns normalized products from Fashion Nova's (https://www.fashionnova.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `fashionnova_search_suggest`\n\n- **HTTP:** `GET /fashionnova/search/suggest`\n- **What:** Get Fashion Nova search suggestions. Returns products, collections, and query suggestions from Fashion Nova's (https://www.fashionnova.com) credential-free predictive search Ajax endpoint. The storefront URL is fixed server-side.\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\n\n### `fashionnova_sitemap_urls`\n\n- **HTTP:** `GET /fashionnova/sitemap/urls`\n- **What:** List Fashion Nova sitemap URLs. Returns capped URL entries from Fashion Nova's (https://www.fashionnova.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.\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\n\n### `fashionnova_sitemaps`\n\n- **HTTP:** `GET /fashionnova/sitemaps`\n- **What:** List Fashion Nova sitemaps. Returns child sitemap URLs from Fashion Nova's (https://www.fashionnova.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.\n- **Params:** _none_\n\n### `fashionnova_store`\n\n- **HTTP:** `GET /fashionnova/store`\n- **What:** Get Fashion Nova store metadata. Returns normalized storefront metadata for Fashion Nova (https://www.fashionnova.com), sourced from credential-free storefront JSON. This endpoint is a brand-pinned wrapper around the generic Shopify store family: the storefront URL is fixed server-side, so no `url` parameter is accepted. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page, or to the storefront's own embedded page data for storefronts that expose neither.\n- **Params:** _none_\n\n## Gymshark (10)\n\n### `gymshark_collection_products`\n\n- **HTTP:** `GET /gymshark/collections/{handle}/products`\n- **What:** List Gymshark collection products. Returns normalized products from one Gymshark (https://row.gymshark.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `gymshark_collections`\n\n- **HTTP:** `GET /gymshark/collections`\n- **What:** List Gymshark collections. Returns normalized collections from Gymshark (https://row.gymshark.com). The storefront URL is fixed server-side. 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\n\n### `gymshark_page`\n\n- **HTTP:** `GET /gymshark/pages/{handle}`\n- **What:** Get a Gymshark static page. Returns normalized static page detail for one Gymshark (https://row.gymshark.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `gymshark_pages`\n\n- **HTTP:** `GET /gymshark/pages`\n- **What:** List Gymshark static pages. Returns normalized static pages from Gymshark (https://row.gymshark.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `gymshark_product`\n\n- **HTTP:** `GET /gymshark/products/{handle}`\n- **What:** Get a Gymshark product. Returns normalized product detail for one Gymshark (https://row.gymshark.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `gymshark_product_recommendations`\n\n- **HTTP:** `GET /gymshark/products/{handle}/recommendations`\n- **What:** List Gymshark product recommendations. Returns normalized recommended products for one Gymshark (https://row.gymshark.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `gymshark_products`\n\n- **HTTP:** `GET /gymshark/products`\n- **What:** List Gymshark products. Returns normalized products from Gymshark's (https://row.gymshark.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `gymshark_sitemap_urls`\n\n- **HTTP:** `GET /gymshark/sitemap/urls`\n- **What:** List Gymshark sitemap URLs. Returns capped URL entries from Gymshark's (https://row.gymshark.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.\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\n\n### `gymshark_sitemaps`\n\n- **HTTP:** `GET /gymshark/sitemaps`\n- **What:** List Gymshark sitemaps. Returns child sitemap URLs from Gymshark's (https://row.gymshark.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.\n- **Params:** _none_\n\n### `gymshark_store`\n\n- **HTTP:** `GET /gymshark/store`\n- **What:** Get Gymshark store metadata. Returns normalized storefront metadata for Gymshark (https://row.gymshark.com), sourced from credential-free storefront JSON. This endpoint is a brand-pinned wrapper around the generic Shopify store family: the storefront URL is fixed server-side, so no `url` parameter is accepted. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page, or to the storefront's own embedded page data for storefronts that expose neither.\n- **Params:** _none_\n\n## J.Crew (8)\n\n### `jcrew_categories`\n\n- **HTTP:** `GET /jcrew/categories`\n- **What:** List J.Crew or J.Crew Factory categories. Lists every category and subcategory from the storefront's own header navigation, flattened into department/section/category triples -- resolves the category-discovery gap jcrew-category's own category parameter otherwise leaves as \"find one from a storefront URL\". Each entry's category value is exactly what jcrew-category's own category parameter accepts. Filter to one department with department (e.g. women, men); omit for every department. Departments vary slightly by site (jcrew.com has an extra \"home\" department factory.jcrew.com doesn't) -- see the response's own departments field for the live list.\n- **Params:** `department` (string, optional) — Department to filter to, e.g. women, men, boys, girls, accessories, shoes, home (jcrew only) -- omit for every department; `site` (string, optional) — Storefront to list\n\n### `jcrew_category`\n\n- **HTTP:** `GET /jcrew/category`\n- **What:** Browse a J.Crew or J.Crew Factory category. Returns one page (up to 60 products) of a category/browse listing for a category path. category is the slash-separated path segment after the storefront's own /plp/ (e.g. womens/categories/clothing/sweaters) -- use jcrew-categories to discover every valid value instead of guessing from storefront URLs. site selects the storefront (default jcrew). page selects the SFCC-native page (default 1); result_count reports the upstream's true total regardless of page size. A hub-level (non-leaf) category path returns a well-formed empty result rather than an error.\n- **Params:** `category` (string, **required**) — Slash-separated category path -- see jcrew-categories; `page` (integer, optional) — One-based page; `site` (string, optional) — Storefront to browse\n\n### `jcrew_product`\n\n- **HTTP:** `GET /jcrew/product`\n- **What:** Get a J.Crew or J.Crew Factory product. Returns full product detail for one style: name, brand, description, category, list price, aggregate rating, every purchasable color, and every color+size combination as a separate priced/stocked SKU. pid is a style id (e.g. CX415), as returned by jcrew-search's products[].id field. site must match the storefront the pid belongs to (default jcrew). A single call covers every color and size of the style -- no per-color lookup needed.\n- **Params:** `pid` (string, **required**) — Style id, from a search result's id field; `site` (string, optional) — Storefront the pid belongs to\n\n### `jcrew_product_reviews`\n\n- **HTTP:** `GET /jcrew/product/reviews`\n- **What:** Get reviews for a J.Crew or J.Crew Factory product. Returns one page of a product's customer reviews (author, location, date, rating, headline, body, and verified-purchase flag), plus the product's overall rating summary (average rating, rating count, per-star histogram, and recommended ratio). pid is a style id (e.g. CX415), as returned by jcrew-search's products[].id field. site must match the storefront the pid belongs to (default jcrew). A product with no reviews yet, or a well-formed but unrecognized pid, returns a well-formed empty result, not an error.\n- **Params:** `page` (integer, optional) — One-based page, 10 reviews per page; `pid` (string, **required**) — Style id, from a search result's id field; `site` (string, optional) — Storefront the pid belongs to\n\n### `jcrew_search`\n\n- **HTTP:** `GET /jcrew/search`\n- **What:** Search J.Crew or J.Crew Factory products. Searches the product catalog for either storefront (select with site, default jcrew). Returns normalized product summaries with USD pricing, gender, and a description, plus the search index's own facets (gender, fabric, category, size, color, price range, and others) with live per-option counts. sort selects relevance (default), price_asc, or price_desc. filter narrows results by one or more facet name:value pairs (comma-separated, e.g. productGender:Men,styleFabric:Cashmere) taken from a prior response's own facets[].name/facets[].options[].value fields -- not curated against a fixed list, since the facet set is large and can change. This is best-effort relevance, not a guaranteed keyword match: for an obscure alphanumeric keyword the upstream search index falls back to its own semantically-related results instead of an empty list, and there is no reliable field in the response to distinguish a true keyword match from that fallback.\n- **Params:** `filter` (string, optional) — Comma-separated facet name:value pairs, e.g. productGender:Men,styleFabric:Cashmere; `keyword` (string, **required**) — Search keyword; `page` (integer, optional) — One-based page; `per_page` (integer, optional) — Results per page; `site` (string, optional) — Storefront to search; `sort` (string, optional) — Sort order\n\n### `jcrew_size_chart`\n\n- **HTTP:** `GET /jcrew/size-chart`\n- **What:** Get the size chart for a J.Crew or J.Crew Factory product. Returns real body measurements per size (chest, waist, hip, sleeve, length, or a subset depending on the style/category), in both inches and centimeters. pid is a style id, as returned by jcrew-search's products[].id field. site must match the storefront the pid belongs to (default jcrew). A measurement value of 0 means that column doesn't apply to this style (e.g. hip on a top) -- the upstream itself doesn't distinguish that from a genuine zero, so this endpoint passes it through as-is.\n- **Params:** `pid` (string, **required**) — Style id, from a search result's id field; `site` (string, optional) — Storefront the pid belongs to\n\n### `jcrew_stores`\n\n- **HTTP:** `GET /jcrew/stores`\n- **What:** Find J.Crew or J.Crew Factory store locations. Returns one storefront's full open-store directory (address, phone, coordinates, services, weekly hours). site selects the storefront and accepts jcrew or factory; defaults to jcrew. Give lat and lng together to sort by distance from that point (each store's distance_miles is then populated); omit both for the upstream's own order.\n- **Params:** `lat` (number, optional) — Latitude to sort distance from (must be given together with lng); `lng` (number, optional) — Longitude to sort distance from (must be given together with lat); `site` (string, optional) — Storefront whose stores to return\n\n### `jcrew_suggest`\n\n- **HTTP:** `GET /jcrew/suggest`\n- **What:** Get J.Crew or J.Crew Factory search-box suggestions. Returns the storefront's own search-box suggestions (typeahead) for a partial query -- a flat list of suggested search phrases, each with its own live total result count on the search index. Select the storefront with site (default jcrew). Not product data.\n- **Params:** `query` (string, **required**) — Partial search query; `site` (string, optional) — Storefront to search\n\n## Kylie Cosmetics (11)\n\n### `kyliecosmetics_collection_products`\n\n- **HTTP:** `GET /kyliecosmetics/collections/{handle}/products`\n- **What:** List Kylie Cosmetics collection products. Returns normalized products from one Kylie Cosmetics (https://www.kyliecosmetics.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `kyliecosmetics_collections`\n\n- **HTTP:** `GET /kyliecosmetics/collections`\n- **What:** List Kylie Cosmetics collections. Returns normalized collections from Kylie Cosmetics (https://www.kyliecosmetics.com). The storefront URL is fixed server-side. 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\n\n### `kyliecosmetics_page`\n\n- **HTTP:** `GET /kyliecosmetics/pages/{handle}`\n- **What:** Get a Kylie Cosmetics static page. Returns normalized static page detail for one Kylie Cosmetics (https://www.kyliecosmetics.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `kyliecosmetics_pages`\n\n- **HTTP:** `GET /kyliecosmetics/pages`\n- **What:** List Kylie Cosmetics static pages. Returns normalized static pages from Kylie Cosmetics (https://www.kyliecosmetics.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `kyliecosmetics_product`\n\n- **HTTP:** `GET /kyliecosmetics/products/{handle}`\n- **What:** Get a Kylie Cosmetics product. Returns normalized product detail for one Kylie Cosmetics (https://www.kyliecosmetics.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `kyliecosmetics_product_recommendations`\n\n- **HTTP:** `GET /kyliecosmetics/products/{handle}/recommendations`\n- **What:** List Kylie Cosmetics product recommendations. Returns normalized recommended products for one Kylie Cosmetics (https://www.kyliecosmetics.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `kyliecosmetics_products`\n\n- **HTTP:** `GET /kyliecosmetics/products`\n- **What:** List Kylie Cosmetics products. Returns normalized products from Kylie Cosmetics's (https://www.kyliecosmetics.com) public product catalog. The \n\nFile v1.0.18:skill-card.md\n\n## Description:\n\nResearches public Shopify storefront products, collections, pages, sitemaps, search suggestions, and recommendations 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\nDevelopers and commerce researchers use this skill to audit public Shopify catalogs, explore store content, and analyze storefront search and product recommendations.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Storefront URLs, search terms, and the API key are sent to Crawlora when the skill runs.\n\nMitigation: Use the skill only when this data sharing is acceptable; keep the key in CRAWLORA_API_KEY and never paste it into prompts or files.\n\nRisk: Successful API requests may consume Crawlora credits.\n\nMitigation: Confirm the requested scope before making calls, especially for full-store crawls.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/crawlora-org/skills/shopify-research)\n- [Shopify research endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON]\n\n**Output Format:** [JSON storefront results and text summaries]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Public storefront data; list results may require pagination.]\n\n## Skill Version(s):\n\n1.0.18 (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.17: 5 files, 17252 bytes\n\nFiles: reference/endpoints.md (85334b), scripts/crawlora.sh (10107b), skill-card.md (2182b), SKILL.md (6268b), _meta.json (136b)\n\nFile v1.0.17:SKILL.md\n\n---\nname: shopify-research\ndescription: Researches independent Shopify-powered storefronts — products, collections, pages, sitemaps, search suggestions, and product recommendations — using the Crawlora API, returning clean JSON for any store by domain, plus 14 pre-wired DTC brand storefronts (Allbirds, Brooklinen, Cole Haan, Everlane, Fashion Nova, Gymshark, J.Crew, Kylie Cosmetics, Oh Polly, Quince, Rothy's, SKIMS, Steve Madden, The Body Shop). Use when the user asks to audit a Shopify store's catalog, crawl its sitemap, look up a product or collection, or pull search/recommendation data — instead of scraping the store's pages directly.\n---\n\n# Shopify store research\n\nLook up and crawl independent Shopify-powered storefronts — products,\ncollections, pages, sitemaps, predictive search, and product recommendations\n— all as normalized JSON from the Crawlora API, with no HTML scraping. Works\nagainst any Shopify store by domain (not Shop.app; see the separate\n`shop-app-research` skill for that), plus 14 brand storefronts with their own\npre-wired, no-`url`-needed endpoints: Allbirds, Brooklinen, Cole Haan,\nEverlane, Fashion Nova, Gymshark, J.Crew, Kylie Cosmetics, Oh Polly, Quince,\nRothy's, SKIMS, Steve Madden, and The Body Shop.\n\n## When to use this skill\n\n- \"List the products/collections in this Shopify store.\"\n- \"What's on this Shopify store's `/pages/about` page?\"\n- \"Crawl this Shopify store's sitemap for every product URL.\"\n- \"What does this Shopify store's search suggest for 'running shoes'?\"\n- \"What products does Shopify recommend alongside this product?\"\n- Catalog audits, competitive-assortment research, or full-store crawls of a\n  Shopify-powered site.\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\nEvery call takes the storefront's `url` (the store's public domain, e.g.\n`https://example.myshopify.com` or a custom domain like\n`https://example.com`) plus endpoint-specific params:\n\n1. **Resolve the store** — `/shopify/store` returns normalized storefront\n   metadata; if the vanity domain blocks `/products.json`, it falls back to\n   the store's public `*.myshopify.com` domain.\n2. **Browse the catalog** — `/shopify/collections` and `/shopify/products`\n   (paginated, `limit` up to 250) list collections and products; drill into\n   one collection's products with `/shopify/collections/{handle}/products`.\n3. **Detail** — `/shopify/products/{handle}` for a single product's full\n   detail.\n4. **Recommendations** — `/shopify/products/{handle}/recommendations`\n   (`intent=related|complementary`) for cross-sell/upsell data.\n5. **Static content** — `/shopify/pages` and `/shopify/pages/{handle}` for\n   the store's static pages (body HTML returned as cleaned text).\n6. **Sitemap crawl** — `/shopify/sitemaps` lists the child sitemaps;\n   `/shopify/sitemap/urls` (`type=products|collections|pages|blogs|...`)\n   returns capped URL entries from them, useful for enumerating a whole\n   store without paginating every list endpoint.\n7. **Search** — `/shopify/search/suggest` (`q=`, optional `types=`) returns\n   predictive-search products, collections, and query suggestions.\n8. **Brand-pinned stores** — the same operations exist under a brand prefix\n   with no `url` param needed, e.g. `/allbirds/products`,\n   `/rothys/products/{handle}`, `/skims/sitemap/urls`. Use these instead of\n   `/shopify/...?url=...` when the user names one of the 14 pre-wired\n   brands directly.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Resolve store metadata:\nscripts/crawlora.sh /shopify/store url=\"https://example.myshopify.com\" | jq '.'\n\n# List products / collections (paginated):\nscripts/crawlora.sh /shopify/products url=\"https://example.myshopify.com\" limit=100 page=1 | jq '.'\nscripts/crawlora.sh /shopify/collections url=\"https://example.myshopify.com\" | jq '.'\n\n# Crawl the sitemap for every product URL:\nscripts/crawlora.sh /shopify/sitemap/urls url=\"https://example.myshopify.com\" type=products limit=250 | 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 Shopify\nendpoint this skill uses (method, path, params, description), including\nthe 14 brand-pinned mirrors.\n\n## Examples\n\n- **Catalog audit:** `/shopify/products` (paginate with `page`/`limit`) to\n  list a store's full catalog with prices and variants, then flag gaps or\n  outliers.\n- **Sitemap-driven full crawl:** `/shopify/sitemaps` to find the child\n  sitemaps, then `/shopify/sitemap/urls?type=products` to enumerate every\n  product URL without walking paginated list endpoints.\n- **Search & recommendation research:** `/shopify/search/suggest` for a\n  query to see what a store's predictive search surfaces, then\n  `/shopify/products/{handle}/recommendations` to map cross-sell links\n  between products.\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 storefront pages; respect each store's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **`url` is required on every call** — the store's public domain\n  (`*.myshopify.com` or custom domain); there's no default store.\n- Results are paginated — pass `page` (and `limit` where supported, up to\n  250) to walk collections, products, and pages.\n- Product/collection/page lookups take a `handle`, not a numeric ID —\n  discover handles via the list endpoints or sitemap crawl first.\n- Empty result pages return `200` with an empty array rather than an error —\n  check the array length to know when to stop paginating.\n\nFile v1.0.17:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"shopify-research\",\n  \"version\": \"1.0.17\",\n  \"publishedAt\": 1789955516246\n}\n\nFile v1.0.17:reference/endpoints.md\n\n# shopify-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**159 endpoints across 15 platform group(s).**\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## Allbirds (11)\n\n### `allbirds_collection_products`\n\n- **HTTP:** `GET /allbirds/collections/{handle}/products`\n- **What:** List Allbirds collection products. Returns normalized products from one Allbirds (https://www.allbirds.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `allbirds_collections`\n\n- **HTTP:** `GET /allbirds/collections`\n- **What:** List Allbirds collections. Returns normalized collections from Allbirds (https://www.allbirds.com). The storefront URL is fixed server-side. 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\n\n### `allbirds_page`\n\n- **HTTP:** `GET /allbirds/pages/{handle}`\n- **What:** Get a Allbirds static page. Returns normalized static page detail for one Allbirds (https://www.allbirds.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `allbirds_pages`\n\n- **HTTP:** `GET /allbirds/pages`\n- **What:** List Allbirds static pages. Returns normalized static pages from Allbirds (https://www.allbirds.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `allbirds_product`\n\n- **HTTP:** `GET /allbirds/products/{handle}`\n- **What:** Get a Allbirds product. Returns normalized product detail for one Allbirds (https://www.allbirds.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `allbirds_product_recommendations`\n\n- **HTTP:** `GET /allbirds/products/{handle}/recommendations`\n- **What:** List Allbirds product recommendations. Returns normalized recommended products for one Allbirds (https://www.allbirds.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `allbirds_products`\n\n- **HTTP:** `GET /allbirds/products`\n- **What:** List Allbirds products. Returns normalized products from Allbirds's (https://www.allbirds.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `allbirds_search_suggest`\n\n- **HTTP:** `GET /allbirds/search/suggest`\n- **What:** Get Allbirds search suggestions. Returns products, collections, and query suggestions from Allbirds's (https://www.allbirds.com) credential-free predictive search Ajax endpoint. The storefront URL is fixed server-side.\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\n\n### `allbirds_sitemap_urls`\n\n- **HTTP:** `GET /allbirds/sitemap/urls`\n- **What:** List Allbirds sitemap URLs. Returns capped URL entries from Allbirds's (https://www.allbirds.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.\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\n\n### `allbirds_sitemaps`\n\n- **HTTP:** `GET /allbirds/sitemaps`\n- **What:** List Allbirds sitemaps. Returns child sitemap URLs from Allbirds's (https://www.allbirds.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.\n- **Params:** _none_\n\n### `allbirds_store`\n\n- **HTTP:** `GET /allbirds/store`\n- **What:** Get Allbirds store metadata. Returns normalized storefront metadata for Allbirds (https://www.allbirds.com), sourced from credential-free storefront JSON. This endpoint is a brand-pinned wrapper around the generic Shopify store family: the storefront URL is fixed server-side, so no `url` parameter is accepted. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page, or to the storefront's own embedded page data for storefronts that expose neither.\n- **Params:** _none_\n\n## Brooklinen (11)\n\n### `brooklinen_collection_products`\n\n- **HTTP:** `GET /brooklinen/collections/{handle}/products`\n- **What:** List Brooklinen collection products. Returns normalized products from one Brooklinen (https://www.brooklinen.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `brooklinen_collections`\n\n- **HTTP:** `GET /brooklinen/collections`\n- **What:** List Brooklinen collections. Returns normalized collections from Brooklinen (https://www.brooklinen.com). The storefront URL is fixed server-side. 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\n\n### `brooklinen_page`\n\n- **HTTP:** `GET /brooklinen/pages/{handle}`\n- **What:** Get a Brooklinen static page. Returns normalized static page detail for one Brooklinen (https://www.brooklinen.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `brooklinen_pages`\n\n- **HTTP:** `GET /brooklinen/pages`\n- **What:** List Brooklinen static pages. Returns normalized static pages from Brooklinen (https://www.brooklinen.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `brooklinen_product`\n\n- **HTTP:** `GET /brooklinen/products/{handle}`\n- **What:** Get a Brooklinen product. Returns normalized product detail for one Brooklinen (https://www.brooklinen.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `brooklinen_product_recommendations`\n\n- **HTTP:** `GET /brooklinen/products/{handle}/recommendations`\n- **What:** List Brooklinen product recommendations. Returns normalized recommended products for one Brooklinen (https://www.brooklinen.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `brooklinen_products`\n\n- **HTTP:** `GET /brooklinen/products`\n- **What:** List Brooklinen products. Returns normalized products from Brooklinen's (https://www.brooklinen.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `brooklinen_search_suggest`\n\n- **HTTP:** `GET /brooklinen/search/suggest`\n- **What:** Get Brooklinen search suggestions. Returns products, collections, and query suggestions from Brooklinen's (https://www.brooklinen.com) credential-free predictive search Ajax endpoint. The storefront URL is fixed server-side.\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\n\n### `brooklinen_sitemap_urls`\n\n- **HTTP:** `GET /brooklinen/sitemap/urls`\n- **What:** List Brooklinen sitemap URLs. Returns capped URL entries from Brooklinen's (https://www.brooklinen.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.\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\n\n### `brooklinen_sitemaps`\n\n- **HTTP:** `GET /brooklinen/sitemaps`\n- **What:** List Brooklinen sitemaps. Returns child sitemap URLs from Brooklinen's (https://www.brooklinen.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.\n- **Params:** _none_\n\n### `brooklinen_store`\n\n- **HTTP:** `GET /brooklinen/store`\n- **What:** Get Brooklinen store metadata. Returns normalized storefront metadata for Brooklinen (https://www.brooklinen.com), sourced from credential-free storefront JSON. This endpoint is a brand-pinned wrapper around the generic Shopify store family: the storefront URL is fixed server-side, so no `url` parameter is accepted. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page, or to the storefront's own embedded page data for storefronts that expose neither.\n- **Params:** _none_\n\n## Cole Haan (11)\n\n### `colehaan_collection_products`\n\n- **HTTP:** `GET /colehaan/collections/{handle}/products`\n- **What:** List Cole Haan collection products. Returns normalized products from one Cole Haan (https://www.colehaan.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `colehaan_collections`\n\n- **HTTP:** `GET /colehaan/collections`\n- **What:** List Cole Haan collections. Returns normalized collections from Cole Haan (https://www.colehaan.com). The storefront URL is fixed server-side. 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\n\n### `colehaan_page`\n\n- **HTTP:** `GET /colehaan/pages/{handle}`\n- **What:** Get a Cole Haan static page. Returns normalized static page detail for one Cole Haan (https://www.colehaan.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `colehaan_pages`\n\n- **HTTP:** `GET /colehaan/pages`\n- **What:** List Cole Haan static pages. Returns normalized static pages from Cole Haan (https://www.colehaan.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `colehaan_product`\n\n- **HTTP:** `GET /colehaan/products/{handle}`\n- **What:** Get a Cole Haan product. Returns normalized product detail for one Cole Haan (https://www.colehaan.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `colehaan_product_recommendations`\n\n- **HTTP:** `GET /colehaan/products/{handle}/recommendations`\n- **What:** List Cole Haan product recommendations. Returns normalized recommended products for one Cole Haan (https://www.colehaan.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `colehaan_products`\n\n- **HTTP:** `GET /colehaan/products`\n- **What:** List Cole Haan products. Returns normalized products from Cole Haan's (https://www.colehaan.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `colehaan_search_suggest`\n\n- **HTTP:** `GET /colehaan/search/suggest`\n- **What:** Get Cole Haan search suggestions. Returns products, collections, and query suggestions from Cole Haan's (https://www.colehaan.com) credential-free predictive search Ajax endpoint. The storefront URL is fixed server-side.\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\n\n### `colehaan_sitemap_urls`\n\n- **HTTP:** `GET /colehaan/sitemap/urls`\n- **What:** List Cole Haan sitemap URLs. Returns capped URL entries from Cole Haan's (https://www.colehaan.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.\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\n\n### `colehaan_sitemaps`\n\n- **HTTP:** `GET /colehaan/sitemaps`\n- **What:** List Cole Haan sitemaps. Returns child sitemap URLs from Cole Haan's (https://www.colehaan.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.\n- **Params:** _none_\n\n### `colehaan_store`\n\n- **HTTP:** `GET /colehaan/store`\n- **What:** Get Cole Haan store metadata. Returns normalized storefront metadata for Cole Haan (https://www.colehaan.com), sourced from credential-free storefront JSON. This endpoint is a brand-pinned wrapper around the generic Shopify store family: the storefront URL is fixed server-side, so no `url` parameter is accepted. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page, or to the storefront's own embedded page data for storefronts that expose neither.\n- **Params:** _none_\n\n## Everlane (11)\n\n### `everlane_collection_products`\n\n- **HTTP:** `GET /everlane/collections/{handle}/products`\n- **What:** List Everlane collection products. Returns normalized products from one Everlane (https://www.everlane.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `everlane_collections`\n\n- **HTTP:** `GET /everlane/collections`\n- **What:** List Everlane collections. Returns normalized collections from Everlane (https://www.everlane.com). The storefront URL is fixed server-side. 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\n\n### `everlane_page`\n\n- **HTTP:** `GET /everlane/pages/{handle}`\n- **What:** Get a Everlane static page. Returns normalized static page detail for one Everlane (https://www.everlane.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `everlane_pages`\n\n- **HTTP:** `GET /everlane/pages`\n- **What:** List Everlane static pages. Returns normalized static pages from Everlane (https://www.everlane.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `everlane_product`\n\n- **HTTP:** `GET /everlane/products/{handle}`\n- **What:** Get a Everlane product. Returns normalized product detail for one Everlane (https://www.everlane.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `everlane_product_recommendations`\n\n- **HTTP:** `GET /everlane/products/{handle}/recommendations`\n- **What:** List Everlane product recommendations. Returns normalized recommended products for one Everlane (https://www.everlane.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `everlane_products`\n\n- **HTTP:** `GET /everlane/products`\n- **What:** List Everlane products. Returns normalized products from Everlane's (https://www.everlane.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `everlane_search_suggest`\n\n- **HTTP:** `GET /everlane/search/suggest`\n- **What:** Get Everlane search suggestions. Returns products, collections, and query suggestions from Everlane's (https://www.everlane.com) credential-free predictive search Ajax endpoint. The storefront URL is fixed server-side.\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\n\n### `everlane_sitemap_urls`\n\n- **HTTP:** `GET /everlane/sitemap/urls`\n- **What:** List Everlane sitemap URLs. Returns capped URL entries from Everlane's (https://www.everlane.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.\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\n\n### `everlane_sitemaps`\n\n- **HTTP:** `GET /everlane/sitemaps`\n- **What:** List Everlane sitemaps. Returns child sitemap URLs from Everlane's (https://www.everlane.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.\n- **Params:** _none_\n\n### `everlane_store`\n\n- **HTTP:** `GET /everlane/store`\n- **What:** Get Everlane store metadata. Returns normalized storefront metadata for Everlane (https://www.everlane.com), sourced from credential-free storefront JSON. This endpoint is a brand-pinned wrapper around the generic Shopify store family: the storefront URL is fixed server-side, so no `url` parameter is accepted. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page, or to the storefront's own embedded page data for storefronts that expose neither.\n- **Params:** _none_\n\n## Fashion Nova (11)\n\n### `fashionnova_collection_products`\n\n- **HTTP:** `GET /fashionnova/collections/{handle}/products`\n- **What:** List Fashion Nova collection products. Returns normalized products from one Fashion Nova (https://www.fashionnova.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `fashionnova_collections`\n\n- **HTTP:** `GET /fashionnova/collections`\n- **What:** List Fashion Nova collections. Returns normalized collections from Fashion Nova (https://www.fashionnova.com). The storefront URL is fixed server-side. 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\n\n### `fashionnova_page`\n\n- **HTTP:** `GET /fashionnova/pages/{handle}`\n- **What:** Get a Fashion Nova static page. Returns normalized static page detail for one Fashion Nova (https://www.fashionnova.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `fashionnova_pages`\n\n- **HTTP:** `GET /fashionnova/pages`\n- **What:** List Fashion Nova static pages. Returns normalized static pages from Fashion Nova (https://www.fashionnova.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `fashionnova_product`\n\n- **HTTP:** `GET /fashionnova/products/{handle}`\n- **What:** Get a Fashion Nova product. Returns normalized product detail for one Fashion Nova (https://www.fashionnova.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `fashionnova_product_recommendations`\n\n- **HTTP:** `GET /fashionnova/products/{handle}/recommendations`\n- **What:** List Fashion Nova product recommendations. Returns normalized recommended products for one Fashion Nova (https://www.fashionnova.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `fashionnova_products`\n\n- **HTTP:** `GET /fashionnova/products`\n- **What:** List Fashion Nova products. Returns normalized products from Fashion Nova's (https://www.fashionnova.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `fashionnova_search_suggest`\n\n- **HTTP:** `GET /fashionnova/search/suggest`\n- **What:** Get Fashion Nova search suggestions. Returns products, collections, and query suggestions from Fashion Nova's (https://www.fashionnova.com) credential-free predictive search Ajax endpoint. The storefront URL is fixed server-side.\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\n\n### `fashionnova_sitemap_urls`\n\n- **HTTP:** `GET /fashionnova/sitemap/urls`\n- **What:** List Fashion Nova sitemap URLs. Returns capped URL entries from Fashion Nova's (https://www.fashionnova.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.\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\n\n### `fashionnova_sitemaps`\n\n- **HTTP:** `GET /fashionnova/sitemaps`\n- **What:** List Fashion Nova sitemaps. Returns child sitemap URLs from Fashion Nova's (https://www.fashionnova.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.\n- **Params:** _none_\n\n### `fashionnova_store`\n\n- **HTTP:** `GET /fashionnova/store`\n- **What:** Get Fashion Nova store metadata. Returns normalized storefront metadata for Fashion Nova (https://www.fashionnova.com), sourced from credential-free storefront JSON. This endpoint is a brand-pinned wrapper around the generic Shopify store family: the storefront URL is fixed server-side, so no `url` parameter is accepted. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page, or to the storefront's own embedded page data for storefronts that expose neither.\n- **Params:** _none_\n\n## Gymshark (10)\n\n### `gymshark_collection_products`\n\n- **HTTP:** `GET /gymshark/collections/{handle}/products`\n- **What:** List Gymshark collection products. Returns normalized products from one Gymshark (https://row.gymshark.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `gymshark_collections`\n\n- **HTTP:** `GET /gymshark/collections`\n- **What:** List Gymshark collections. Returns normalized collections from Gymshark (https://row.gymshark.com). The storefront URL is fixed server-side. 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\n\n### `gymshark_page`\n\n- **HTTP:** `GET /gymshark/pages/{handle}`\n- **What:** Get a Gymshark static page. Returns normalized static page detail for one Gymshark (https://row.gymshark.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `gymshark_pages`\n\n- **HTTP:** `GET /gymshark/pages`\n- **What:** List Gymshark static pages. Returns normalized static pages from Gymshark (https://row.gymshark.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `gymshark_product`\n\n- **HTTP:** `GET /gymshark/products/{handle}`\n- **What:** Get a Gymshark product. Returns normalized product detail for one Gymshark (https://row.gymshark.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `gymshark_product_recommendations`\n\n- **HTTP:** `GET /gymshark/products/{handle}/recommendations`\n- **What:** List Gymshark product recommendations. Returns normalized recommended products for one Gymshark (https://row.gymshark.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `gymshark_products`\n\n- **HTTP:** `GET /gymshark/products`\n- **What:** List Gymshark products. Returns normalized products from Gymshark's (https://row.gymshark.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `gymshark_sitemap_urls`\n\n- **HTTP:** `GET /gymshark/sitemap/urls`\n- **What:** List Gymshark sitemap URLs. Returns capped URL entries from Gymshark's (https://row.gymshark.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.\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\n\n### `gymshark_sitemaps`\n\n- **HTTP:** `GET /gymshark/sitemaps`\n- **What:** List Gymshark sitemaps. Returns child sitemap URLs from Gymshark's (https://row.gymshark.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.\n- **Params:** _none_\n\n### `gymshark_store`\n\n- **HTTP:** `GET /gymshark/store`\n- **What:** Get Gymshark store metadata. Returns normalized storefront metadata for Gymshark (https://row.gymshark.com), sourced from credential-free storefront JSON. This endpoint is a brand-pinned wrapper around the generic Shopify store family: the storefront URL is fixed server-side, so no `url` parameter is accepted. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page, or to the storefront's own embedded page data for storefronts that expose neither.\n- **Params:** _none_\n\n## J.Crew (8)\n\n### `jcrew_categories`\n\n- **HTTP:** `GET /jcrew/categories`\n- **What:** List J.Crew or J.Crew Factory categories. Lists every category and subcategory from the storefront's own header navigation, flattened into department/section/category triples -- resolves the category-discovery gap jcrew-category's own category parameter otherwise leaves as \"find one from a storefront URL\". Each entry's category value is exactly what jcrew-category's own category parameter accepts. Filter to one department with department (e.g. women, men); omit for every department. Departments vary slightly by site (jcrew.com has an extra \"home\" department factory.jcrew.com doesn't) -- see the response's own departments field for the live list.\n- **Params:** `department` (string, optional) — Department to filter to, e.g. women, men, boys, girls, accessories, shoes, home (jcrew only) -- omit for every department; `site` (string, optional) — Storefront to list\n\n### `jcrew_category`\n\n- **HTTP:** `GET /jcrew/category`\n- **What:** Browse a J.Crew or J.Crew Factory category. Returns one page (up to 60 products) of a category/browse listing for a category path. category is the slash-separated path segment after the storefront's own /plp/ (e.g. womens/categories/clothing/sweaters) -- use jcrew-categories to discover every valid value instead of guessing from storefront URLs. site selects the storefront (default jcrew). page selects the SFCC-native page (default 1); result_count reports the upstream's true total regardless of page size. A hub-level (non-leaf) category path returns a well-formed empty result rather than an error.\n- **Params:** `category` (string, **required**) — Slash-separated category path -- see jcrew-categories; `page` (integer, optional) — One-based page; `site` (string, optional) — Storefront to browse\n\n### `jcrew_product`\n\n- **HTTP:** `GET /jcrew/product`\n- **What:** Get a J.Crew or J.Crew Factory product. Returns full product detail for one style: name, brand, description, category, list price, aggregate rating, every purchasable color, and every color+size combination as a separate priced/stocked SKU. pid is a style id (e.g. CX415), as returned by jcrew-search's products[].id field. site must match the storefront the pid belongs to (default jcrew). A single call covers every color and size of the style -- no per-color lookup needed.\n- **Params:** `pid` (string, **required**) — Style id, from a search result's id field; `site` (string, optional) — Storefront the pid belongs to\n\n### `jcrew_product_reviews`\n\n- **HTTP:** `GET /jcrew/product/reviews`\n- **What:** Get reviews for a J.Crew or J.Crew Factory product. Returns one page of a product's customer reviews (author, location, date, rating, headline, body, and verified-purchase flag), plus the product's overall rating summary (average rating, rating count, per-star histogram, and recommended ratio). pid is a style id (e.g. CX415), as returned by jcrew-search's products[].id field. site must match the storefront the pid belongs to (default jcrew). A product with no reviews yet, or a well-formed but unrecognized pid, returns a well-formed empty result, not an error.\n- **Params:** `page` (integer, optional) — One-based page, 10 reviews per page; `pid` (string, **required**) — Style id, from a search result's id field; `site` (string, optional) — Storefront the pid belongs to\n\n### `jcrew_search`\n\n- **HTTP:** `GET /jcrew/search`\n- **What:** Search J.Crew or J.Crew Factory products. Searches the product catalog for either storefront (select with site, default jcrew). Returns normalized product summaries with USD pricing, gender, and a description, plus the search index's own facets (gender, fabric, category, size, color, price range, and others) with live per-option counts. sort selects relevance (default), price_asc, or price_desc. filter narrows results by one or more facet name:value pairs (comma-separated, e.g. productGender:Men,styleFabric:Cashmere) taken from a prior response's own facets[].name/facets[].options[].value fields -- not curated against a fixed list, since the facet set is large and can change. This is best-effort relevance, not a guaranteed keyword match: for an obscure alphanumeric keyword the upstream search index falls back to its own semantically-related results instead of an empty list, and there is no reliable field in the response to distinguish a true keyword match from that fallback.\n- **Params:** `filter` (string, optional) — Comma-separated facet name:value pairs, e.g. productGender:Men,styleFabric:Cashmere; `keyword` (string, **required**) — Search keyword; `page` (integer, optional) — One-based page; `per_page` (integer, optional) — Results per page; `site` (string, optional) — Storefront to search; `sort` (string, optional) — Sort order\n\n### `jcrew_size_chart`\n\n- **HTTP:** `GET /jcrew/size-chart`\n- **What:** Get the size chart for a J.Crew or J.Crew Factory product. Returns real body measurements per size (chest, waist, hip, sleeve, length, or a subset depending on the style/category), in both inches and centimeters. pid is a style id, as returned by jcrew-search's products[].id field. site must match the storefront the pid belongs to (default jcrew). A measurement value of 0 means that column doesn't apply to this style (e.g. hip on a top) -- the upstream itself doesn't distinguish that from a genuine zero, so this endpoint passes it through as-is.\n- **Params:** `pid` (string, **required**) — Style id, from a search result's id field; `site` (string, optional) — Storefront the pid belongs to\n\n### `jcrew_stores`\n\n- **HTTP:** `GET /jcrew/stores`\n- **What:** Find J.Crew or J.Crew Factory store locations. Returns one storefront's full open-store directory (address, phone, coordinates, services, weekly hours). site selects the storefront and accepts jcrew or factory; defaults to jcrew. Give lat and lng together to sort by distance from that point (each store's distance_miles is then populated); omit both for the upstream's own order.\n- **Params:** `lat` (number, optional) — Latitude to sort distance from (must be given together with lng); `lng` (number, optional) — Longitude to sort distance from (must be given together with lat); `site` (string, optional) — Storefront whose stores to return\n\n### `jcrew_suggest`\n\n- **HTTP:** `GET /jcrew/suggest`\n- **What:** Get J.Crew or J.Crew Factory search-box suggestions. Returns the storefront's own search-box suggestions (typeahead) for a partial query -- a flat list of suggested search phrases, each with its own live total result count on the search index. Select the storefront with site (default jcrew). Not product data.\n- **Params:** `query` (string, **required**) — Partial search query; `site` (string, optional) — Storefront to search\n\n## Kylie Cosmetics (11)\n\n### `kyliecosmetics_collection_products`\n\n- **HTTP:** `GET /kyliecosmetics/collections/{handle}/products`\n- **What:** List Kylie Cosmetics collection products. Returns normalized products from one Kylie Cosmetics (https://www.kyliecosmetics.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `kyliecosmetics_collections`\n\n- **HTTP:** `GET /kyliecosmetics/collections`\n- **What:** List Kylie Cosmetics collections. Returns normalized collections from Kylie Cosmetics (https://www.kyliecosmetics.com). The storefront URL is fixed server-side. 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\n\n### `kyliecosmetics_page`\n\n- **HTTP:** `GET /kyliecosmetics/pages/{handle}`\n- **What:** Get a Kylie Cosmetics static page. Returns normalized static page detail for one Kylie Cosmetics (https://www.kyliecosmetics.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `kyliecosmetics_pages`\n\n- **HTTP:** `GET /kyliecosmetics/pages`\n- **What:** List Kylie Cosmetics static pages. Returns normalized static pages from Kylie Cosmetics (https://www.kyliecosmetics.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `kyliecosmetics_product`\n\n- **HTTP:** `GET /kyliecosmetics/products/{handle}`\n- **What:** Get a Kylie Cosmetics product. Returns normalized product detail for one Kylie Cosmetics (https://www.kyliecosmetics.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `kyliecosmetics_product_recommendations`\n\n- **HTTP:** `GET /kyliecosmetics/products/{handle}/recommendations`\n- **What:** List Kylie Cosmetics product recommendations. Returns normalized recommended products for one Kylie Cosmetics (https://www.kyliecosmetics.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `kyliecosmetics_products`\n\n- **HTTP:** `GET /kyliecosmetics/products`\n- **What:** List Kylie Cosmetics products. Returns normalized products from Kylie Cosmetics's (https://www.kyliecosmetics.com) public product catalog. The \n\nFile v1.0.17:skill-card.md\n\n## Description:\n\nResearches Shopify-powered storefront catalogs, collections, pages, sitemaps, search suggestions, and product recommendations through the Crawlora API and returns normalized JSON.\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\nDevelopers, analysts, and commerce researchers use this skill to audit public Shopify storefront catalogs, crawl sitemap entries, inspect product and collection detail, and gather search or recommendation data without scraping store pages directly.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Retail research inputs, API keys, and optional location-style queries are sent to a third-party Crawlora service.\n\nMitigation: Use only intended public-storefront targets, keep CRAWLORA_API_KEY in the environment, and avoid sending sensitive internal targets or precise coordinates unless that disclosure is acceptable.\n\nRisk: The helper exposes broader retail routes for J.Crew and Quince in addition to Shopify-focused routes.\n\nMitigation: Treat those routes as broader retail research capabilities and verify that their use matches the user's request before calling them.\n\n## Reference(s):\n\n- [Endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n- [Crawlora API base](https://api.crawlora.net/api/v1)\n- [ClawHub skill page](https://clawhub.ai/crawlora-org/skills/shopify-research)\n\n## Skill Output:\n\n**Output Type(s):** [JSON, Shell commands, Guidance]\n\n**Output Format:** [Normalized JSON API responses with Markdown guidance and inline shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires CRAWLORA_API_KEY; public-storefront queries are paginated where supported.]\n\n## Skill Version(s):\n\n1.0.17 (source: server 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.16: 5 files, 16741 bytes\n\nFiles: reference/endpoints.md (81906b), scripts/crawlora.sh (10107b), skill-card.md (2258b), SKILL.md (6268b), _meta.json (136b)\n\nFile v1.0.16:SKILL.md\n\n---\nname: shopify-research\ndescription: Researches independent Shopify-powered storefronts — products, collections, pages, sitemaps, search suggestions, and product recommendations — using the Crawlora API, returning clean JSON for any store by domain, plus 14 pre-wired DTC brand storefronts (Allbirds, Brooklinen, Cole Haan, Everlane, Fashion Nova, Gymshark, J.Crew, Kylie Cosmetics, Oh Polly, Quince, Rothy's, SKIMS, Steve Madden, The Body Shop). Use when the user asks to audit a Shopify store's catalog, crawl its sitemap, look up a product or collection, or pull search/recommendation data — instead of scraping the store's pages directly.\n---\n\n# Shopify store research\n\nLook up and crawl independent Shopify-powered storefronts — products,\ncollections, pages, sitemaps, predictive search, and product recommendations\n— all as normalized JSON from the Crawlora API, with no HTML scraping. Works\nagainst any Shopify store by domain (not Shop.app; see the separate\n`shop-app-research` skill for that), plus 14 brand storefronts with their own\npre-wired, no-`url`-needed endpoints: Allbirds, Brooklinen, Cole Haan,\nEverlane, Fashion Nova, Gymshark, J.Crew, Kylie Cosmetics, Oh Polly, Quince,\nRothy's, SKIMS, Steve Madden, and The Body Shop.\n\n## When to use this skill\n\n- \"List the products/collections in this Shopify store.\"\n- \"What's on this Shopify store's `/pages/about` page?\"\n- \"Crawl this Shopify store's sitemap for every product URL.\"\n- \"What does this Shopify store's search suggest for 'running shoes'?\"\n- \"What products does Shopify recommend alongside this product?\"\n- Catalog audits, competitive-assortment research, or full-store crawls of a\n  Shopify-powered site.\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\nEvery call takes the storefront's `url` (the store's public domain, e.g.\n`https://example.myshopify.com` or a custom domain like\n`https://example.com`) plus endpoint-specific params:\n\n1. **Resolve the store** — `/shopify/store` returns normalized storefront\n   metadata; if the vanity domain blocks `/products.json`, it falls back to\n   the store's public `*.myshopify.com` domain.\n2. **Browse the catalog** — `/shopify/collections` and `/shopify/products`\n   (paginated, `limit` up to 250) list collections and products; drill into\n   one collection's products with `/shopify/collections/{handle}/products`.\n3. **Detail** — `/shopify/products/{handle}` for a single product's full\n   detail.\n4. **Recommendations** — `/shopify/products/{handle}/recommendations`\n   (`intent=related|complementary`) for cross-sell/upsell data.\n5. **Static content** — `/shopify/pages` and `/shopify/pages/{handle}` for\n   the store's static pages (body HTML returned as cleaned text).\n6. **Sitemap crawl** — `/shopify/sitemaps` lists the child sitemaps;\n   `/shopify/sitemap/urls` (`type=products|collections|pages|blogs|...`)\n   returns capped URL entries from them, useful for enumerating a whole\n   store without paginating every list endpoint.\n7. **Search** — `/shopify/search/suggest` (`q=`, optional `types=`) returns\n   predictive-search products, collections, and query suggestions.\n8. **Brand-pinned stores** — the same operations exist under a brand prefix\n   with no `url` param needed, e.g. `/allbirds/products`,\n   `/rothys/products/{handle}`, `/skims/sitemap/urls`. Use these instead of\n   `/shopify/...?url=...` when the user names one of the 14 pre-wired\n   brands directly.\n\nFull endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).\n\n## Calling the API\n\n```sh\n# Resolve store metadata:\nscripts/crawlora.sh /shopify/store url=\"https://example.myshopify.com\" | jq '.'\n\n# List products / collections (paginated):\nscripts/crawlora.sh /shopify/products url=\"https://example.myshopify.com\" limit=100 page=1 | jq '.'\nscripts/crawlora.sh /shopify/collections url=\"https://example.myshopify.com\" | jq '.'\n\n# Crawl the sitemap for every product URL:\nscripts/crawlora.sh /shopify/sitemap/urls url=\"https://example.myshopify.com\" type=products limit=250 | 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 Shopify\nendpoint this skill uses (method, path, params, description), including\nthe 14 brand-pinned mirrors.\n\n## Examples\n\n- **Catalog audit:** `/shopify/products` (paginate with `page`/`limit`) to\n  list a store's full catalog with prices and variants, then flag gaps or\n  outliers.\n- **Sitemap-driven full crawl:** `/shopify/sitemaps` to find the child\n  sitemaps, then `/shopify/sitemap/urls?type=products` to enumerate every\n  product URL without walking paginated list endpoints.\n- **Search & recommendation research:** `/shopify/search/suggest` for a\n  query to see what a store's predictive search surfaces, then\n  `/shopify/products/{handle}/recommendations` to map cross-sell links\n  between products.\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 storefront pages; respect each store's terms.\n- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.\n- **`url` is required on every call** — the store's public domain\n  (`*.myshopify.com` or custom domain); there's no default store.\n- Results are paginated — pass `page` (and `limit` where supported, up to\n  250) to walk collections, products, and pages.\n- Product/collection/page lookups take a `handle`, not a numeric ID —\n  discover handles via the list endpoints or sitemap crawl first.\n- Empty result pages return `200` with an empty array rather than an error —\n  check the array length to know when to stop paginating.\n\nFile v1.0.16:_meta.json\n\n{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"shopify-research\",\n  \"version\": \"1.0.16\",\n  \"publishedAt\": 1789640464392\n}\n\nFile v1.0.16:reference/endpoints.md\n\n# shopify-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**159 endpoints across 15 platform group(s).**\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.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1; `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.; `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.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1; `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.; `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## Allbirds (11)\n\n### `allbirds_collection_products`\n\n- **HTTP:** `GET /allbirds/collections/{handle}/products`\n- **What:** List Allbirds collection products. Returns normalized products from one Allbirds (https://www.allbirds.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `allbirds_collections`\n\n- **HTTP:** `GET /allbirds/collections`\n- **What:** List Allbirds collections. Returns normalized collections from Allbirds (https://www.allbirds.com). The storefront URL is fixed server-side. 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\n\n### `allbirds_page`\n\n- **HTTP:** `GET /allbirds/pages/{handle}`\n- **What:** Get a Allbirds static page. Returns normalized static page detail for one Allbirds (https://www.allbirds.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `allbirds_pages`\n\n- **HTTP:** `GET /allbirds/pages`\n- **What:** List Allbirds static pages. Returns normalized static pages from Allbirds (https://www.allbirds.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `allbirds_product`\n\n- **HTTP:** `GET /allbirds/products/{handle}`\n- **What:** Get a Allbirds product. Returns normalized product detail for one Allbirds (https://www.allbirds.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `allbirds_product_recommendations`\n\n- **HTTP:** `GET /allbirds/products/{handle}/recommendations`\n- **What:** List Allbirds product recommendations. Returns normalized recommended products for one Allbirds (https://www.allbirds.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `allbirds_products`\n\n- **HTTP:** `GET /allbirds/products`\n- **What:** List Allbirds products. Returns normalized products from Allbirds's (https://www.allbirds.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `allbirds_search_suggest`\n\n- **HTTP:** `GET /allbirds/search/suggest`\n- **What:** Get Allbirds search suggestions. Returns products, collections, and query suggestions from Allbirds's (https://www.allbirds.com) credential-free predictive search Ajax endpoint. The storefront URL is fixed server-side.\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\n\n### `allbirds_sitemap_urls`\n\n- **HTTP:** `GET /allbirds/sitemap/urls`\n- **What:** List Allbirds sitemap URLs. Returns capped URL entries from Allbirds's (https://www.allbirds.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.\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\n\n### `allbirds_sitemaps`\n\n- **HTTP:** `GET /allbirds/sitemaps`\n- **What:** List Allbirds sitemaps. Returns child sitemap URLs from Allbirds's (https://www.allbirds.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.\n- **Params:** _none_\n\n### `allbirds_store`\n\n- **HTTP:** `GET /allbirds/store`\n- **What:** Get Allbirds store metadata. Returns normalized storefront metadata for Allbirds (https://www.allbirds.com), sourced from credential-free storefront JSON. This endpoint is a brand-pinned wrapper around the generic Shopify store family: the storefront URL is fixed server-side, so no `url` parameter is accepted. If the vanity domain blocks `/products.json`, the service may fall back to a public `*.myshopify.com` domain discovered from the storefront page, or to the storefront's own embedded page data for storefronts that expose neither.\n- **Params:** _none_\n\n## Brooklinen (11)\n\n### `brooklinen_collection_products`\n\n- **HTTP:** `GET /brooklinen/collections/{handle}/products`\n- **What:** List Brooklinen collection products. Returns normalized products from one Brooklinen (https://www.brooklinen.com) collection. The storefront URL is fixed server-side; `handle` is the collection's URL slug.\n- **Params:** `handle` (string, **required**) — Collection handle; `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `brooklinen_collections`\n\n- **HTTP:** `GET /brooklinen/collections`\n- **What:** List Brooklinen collections. Returns normalized collections from Brooklinen (https://www.brooklinen.com). The storefront URL is fixed server-side. 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\n\n### `brooklinen_page`\n\n- **HTTP:** `GET /brooklinen/pages/{handle}`\n- **What:** Get a Brooklinen static page. Returns normalized static page detail for one Brooklinen (https://www.brooklinen.com) page handle. The storefront URL is fixed server-side.\n- **Params:** `handle` (string, **required**) — Page handle\n\n### `brooklinen_pages`\n\n- **HTTP:** `GET /brooklinen/pages`\n- **What:** List Brooklinen static pages. Returns normalized static pages from Brooklinen (https://www.brooklinen.com). The storefront URL is fixed server-side.\n- **Params:** `limit` (integer, optional) — Maximum static pages, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `brooklinen_product`\n\n- **HTTP:** `GET /brooklinen/products/{handle}`\n- **What:** Get a Brooklinen product. Returns normalized product detail for one Brooklinen (https://www.brooklinen.com) product handle. The storefront URL is fixed server-side; `handle` is the product's URL slug.\n- **Params:** `handle` (string, **required**) — Product handle\n\n### `brooklinen_product_recommendations`\n\n- **HTTP:** `GET /brooklinen/products/{handle}/recommendations`\n- **What:** List Brooklinen product recommendations. Returns normalized recommended products for one Brooklinen (https://www.brooklinen.com) product handle. The route handle is resolved to a Shopify product id before fetching recommendations. The storefront URL is fixed server-side.\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\n\n### `brooklinen_products`\n\n- **HTTP:** `GET /brooklinen/products`\n- **What:** List Brooklinen products. Returns normalized products from Brooklinen's (https://www.brooklinen.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.\n- **Params:** `limit` (integer, optional) — Maximum products, defaults to 50 and supports up to 250; `page` (integer, optional) — 1-based page, defaults to 1\n\n### `brooklinen_search_suggest`\n\n- **HTTP:** `GET /brooklinen/search/suggest`\n- **What:** Get Brooklinen search suggestions. Returns products, collections, and query suggestions from Brooklinen's (https://www.brooklinen.com) credential-free predictive search Ajax endpoint. The storefront URL is fixed server-side.\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\n\n### `brooklinen_sitemap_urls`\n\n- **HTTP:** `GET /brooklinen/sitemap/urls`\n- **What:** List Brooklinen sitemap URLs. Returns capped URL entries from Brooklinen's (https://www.brooklinen.com) child sitemaps matching the requested type. The storefront URL is fixed server-side.\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\n\n### `brooklinen_sitemaps`\n\n- **HTTP:** `GET /brooklinen/sitemaps`\n- **What:** List Brooklinen sitemaps. Returns child sitemap URLs from Brooklinen's (https://www.brooklinen.com) `/sitemap.xml` index with inferred sitemap types. The storefront URL is fixed server-side.\n- **Params:** _no\n\nArchive v1.0.15: 5 files, 17186 bytes\n\nFiles: reference/endpoints.md (81906b), scripts/crawlora.sh (11026b), skill-card.md (2273b), SKILL.md (6268b), _meta.json (136b)\n\nArchive v1.0.14: 5 files, 16854 bytes\n\nFiles: reference/endpoints.md (81906b), scripts/crawlora.sh (8294b), skill-card.md (2254b), SKILL.md (6268b), _meta.json (136b)\n\nArchive v1.0.13: 5 files, 16635 bytes\n\nFiles: reference/endpoints.md (81906b), scripts/crawlora.sh (8037b), skill-card.md (2017b), SKILL.md (6268b), _meta.json (136b)\n\nArchive v1.0.12: 5 files, 16726 bytes\n\nFiles: reference/endpoints.md (81906b), scripts/crawlora.sh (7712b), skill-card.md (2733b), SKILL.md (6321b), _meta.json (136b)\n\nArchive v1.0.11: 5 files, 16414 bytes\n\nFiles: reference/endpoints.md (81906b), scripts/crawlora.sh (7412b), skill-card.md (2182b), SKILL.md (6321b), _meta.json (136b)\n\nArchive v1.0.10: 5 files, 16383 bytes\n\nFiles: reference/endpoints.md (81906b), scripts/crawlora.sh (7364b), skill-card.md (2134b), SKILL.md (6321b), _meta.json (136b)\n\nArchive v1.0.9: 5 files, 15359 bytes\n\nFiles: reference/endpoints.md (81906b), scripts/crawlora.sh (2005b), skill-card.md (2357b), SKILL.md (6295b), _meta.json (135b)","readmeExcerpt":"Skill: shopify-research Owner: crawlora-org Summary: Researches independent Shopify-powered storefronts — products, collections, pages, sitemaps, search suggestions, and product recommendations — using the Crawlora API, returning clean JSON for any store by domain, plus 14 pre-wired DTC brand storefronts (Allbirds, Brooklinen, Cole Haan, Everlane, Fashion Nova, Gymshark, J.Crew, Kylie Cosmetics, Oh Polly, Quince, Rot","codeSnippets":[],"executableExamples":[{"language":"sh","snippet":"# Resolve store metadata:\nscripts/crawlora.sh /shopify/store url=\"https://example.myshopify.com\"\n\n# List products / collections (paginated):\nscripts/crawlora.sh /shopify/products url=\"https://example.myshopify.com\" limit=100 page=1\nscripts/crawlora.sh /shopify/collections url=\"https://example.myshopify.com\"\n\n# Crawl the sitemap for every product URL:\nscripts/crawlora.sh /shopify/sitemap/urls url=\"https://example.myshopify.com\" type=products limit=250"},{"language":"sh","snippet":"# Resolve store metadata:\nscripts/crawlora.sh /shopify/store url=\"https://example.myshopify.com\" | jq '.'\n\n# List products / collections (paginated):\nscripts/crawlora.sh /shopify/products url=\"https://example.myshopify.com\" limit=100 page=1 | jq '.'\nscripts/crawlora.sh /shopify/collections url=\"https://example.myshopify.com\" | jq '.'\n\n# Crawl the sitemap for every product URL:\nscripts/crawlora.sh /shopify/sitemap/urls url=\"https://example.myshopify.com\" type=products limit=250 | jq '.'"},{"language":"sh","snippet":"# Resolve store metadata:\nscripts/crawlora.sh /shopify/store url=\"https://example.myshopify.com\" | jq '.'\n\n# List products / collections (paginated):\nscripts/crawlora.sh /shopify/products url=\"https://example.myshopify.com\" limit=100 page=1 | jq '.'\nscripts/crawlora.sh /shopify/collections url=\"https://example.myshopify.com\" | jq '.'\n\n# Crawl the sitemap for every product URL:\nscripts/crawlora.sh /shopify/sitemap/urls url=\"https://example.myshopify.com\" type=products limit=250 | jq '.'"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: shopify-research\ndescription: Researches independent Shopify-powered storefronts — products, collections, pages, sitemaps, search suggestions, and product recommendations — using the Crawlora API, returning clean JSON for any store by domain, plus 14 pre-wired DTC brand storefronts (Allbirds, Brooklinen, Cole Haan, Everlane, Fashion Nova, Gymshark, J.Crew, Kylie Cosmetics, Oh Polly, Quince, Rothy's, SKIMS, Steve Madden, The Body Shop). Use when the user asks to audit a Shopify store's catalog, crawl its sitemap, look up a product or collection, or pull search/recommendation data — instead of scraping the store's pages directly.\nallowed-tools: Bash(scripts/crawlora.sh:*)\n---\n\n# Shopify store research\n\nLook up and crawl independent Shopify-powered storefronts — products,\ncollections, pages, sitemaps, predictive search, and product recommendations\n— all as normalized JSON from the Crawlora API, with no HTML scraping. Works\nagainst any Shopify store by domain (not Shop.app; see the separate\n`shop-app-research` skill for that), plus 14 brand storefronts with their own\npre-wired, no-`url`-needed endpoints: Allbirds, Brooklinen, Cole Haan,\nEverlane, Fashion Nova, Gymshark, J.Crew, Kylie Cosmetics, Oh Polly, Quince,\nRothy's, SKIMS, Steve Madden, and The Body Shop.\n\n## Tool scope and data flow\n\nThe optional shell helper is the only command this skill asks to run. It makes\nGET requests only to the documented, allowlisted Crawlora routes. When invoked,\nit reads `CRAWLORA_API_KEY` and sends it as an `x-api-key` header over HTTPS to\n`api.crawlora.net`; it does not send the key to the Shopify storefront. It\nbriefly writes a mode-600 curl config under `TMPDIR` and removes it when the\ncommand exits. It does not inspect other environment variables, enumerate files,\ninstall software, or run with elevated privileges. Storefront URLs are passed as\nordinary query values; the helper's destination host is fixed. Run it only when\nyou want to make a Crawlora API request; successful requests can consume credits.\n\n## When to use this skill\n\n- \"List the products/collections in this Shopify store.\"\n- \"What's on this Shopify store's `/pages/about` page?\"\n- \"Crawl this Shopify store's sitemap for every product URL.\"\n- \"What does this Shopify store's search suggest for 'running shoes'?\"\n- \"What products does Shopify recommend alongside this product?\"\n- Catalog audits, competitive-assortment research, or full-store crawls of a\n  Shopify-powered site.\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\nEvery call takes the storefront's `url` (the store's public domain, e.g.\n`https://example.myshopif"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn70shhkf6qpfwgfrbgtep2wkd8c6b4t\",\n  \"slug\": \"shopify-research\",\n  \"version\": \"1.0.18\",\n  \"publishedAt\": 1790435215767\n}"},{"path":"reference/endpoints.md","content":"# shopify-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**159 endpoints across 15 platform group(s).**\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 a"},{"path":"skill-card.md","content":"## Description:\n\nResearches public Shopify storefront products, collections, pages, sitemaps, search suggestions, and recommendations 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\nDevelopers and commerce researchers use this skill to audit public Shopify catalogs, explore store content, and analyze storefront search and product recommendations.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Storefront URLs, search terms, and the API key are sent to Crawlora when the skill runs.\n\nMitigation: Use the skill only when this data sharing is acceptable; keep the key in CRAWLORA_API_KEY and never paste it into prompts or files.\n\nRisk: Successful API requests may consume Crawlora credits.\n\nMitigation: Confirm the requested scope before making calls, especially for full-store crawls.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/crawlora-org/skills/shopify-research)\n- [Shopify research endpoint reference](reference/endpoints.md)\n- [Crawlora](https://crawlora.net)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON]\n\n**Output Format:** [JSON storefront results and text summaries]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Public storefront data; list results may require pagination.]\n\n## Skill Version(s):\n\n1.0.18 (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":1584,"uniquenessScore":43,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T12:18:41.564Z","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-11T12:18:41.564Z","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-11T15:15:29.978Z","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"}]}}}