J.Crew API endpoint
Searches the product catalog for either storefront (select with site, default jcrew). Returns 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 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.
/jcrew/searchSearches the product catalog for either storefront. keyword is required. site selects the storefront and accepts jcrew or factory; defaults to jcrew. page is one-based from 1 to 500 and defaults to 1. per_page is 1 to 100 and defaults to 24.
sort selects the result order and accepts relevance (default), price_asc, or price_desc.
filter narrows results by one or more of the search index's own facet name/value pairs, comma-separated as name:value (e.g. productGender:Men,styleFabric:Cashmere). Facet names and values are exactly what a prior response's own facets[].name / facets[].options[].value fields report -- this endpoint does not curate or validate against a fixed facet list, since the facet set is large and can change; an unrecognized name/value simply narrows to zero results rather than erroring.
Notable response behavior:
total_products and total_pages reflect the upstream's own result count for the current keyword/site/filter combination.id is the value to pass as pid to jcrew-product-reviews, jcrew-product, or jcrew-size-chart (with the same site).price_min/price_max and sale_price_min/sale_price_max are USD, aggregated across every fit the style is offered in.facets lists the search index's own available filters (gender, fabric, category, size, color, price range, and others) with live per-option result counts. A range facet (only price observed) sets is_range true and carries range_min/range_max instead of options.site=factory uses J.Crew Factory's own independent search index (Constructor.io key, separate from the flagship site) -- results, facets, and product ids are entirely separate from site=jcrew.| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| id | 40 | |
| family_id | 21 | |
| name | 40 | “2025 Rollneck™ sweater” and 39 other values |
| description | 40 | median 348 characters |
| gender | 40 | |
| image_url | 40 | jcrew.com |
| orderable | 40 | true in 40 of 40 |
| price_min | 40 | 0 to 198, median 89.5 |
| price_max | 40 | 0 to 248, median 98 |
| sale_price_min | 21 | 89.5 to 198, median 98 |
| sale_price_max | 21 | 89.5 to 198, median 98 |
| url | 40 | jcrew.com |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| keyword | string | Yes | Search keyword | sweater | |
| site | string | No | Storefront to search Allowed values: jcrew, factory. | ||
| page | integer | No | One-based page Minimum: 1. Maximum: 500. | ||
| per_page | integer | No | Results per page Minimum: 1. Maximum: 100. | ||
| sort | string | No | Sort order Allowed values: relevance, price_asc, price_desc. | ||
| filter | string | No | Comma-separated facet name:value pairs, e.g. productGender:Men,styleFabric:Cashmere | productGender:Men | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/jcrew/search?keyword=sweater&site=jcrew&page=1&sort=relevance" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"keyword": "sweater",
"site": "jcrew",
"sort": "relevance",
"page": 1,
"per_page": 24,
"total_pages": 15,
"total_products": 338,
"count": 1,
"products": [
{
"id": "CX415",
"family_id": "ME617",
"name": "2025 Rollneck sweater",
"description": "A J.Crew icon since the '80s, refreshed for right now...",
"gender": "Women",
"image_url": "http://www.jcrew.com/s7-img-facade/CX415_NA6434?fmt=jpeg&qlt=90,0",
"orderable": true,
"price_min": 98,
"price_max": 128,
"sale_price_min": 98,
"sale_price_max": 98,
"url": "https://www.jcrew.com/p/CX415"
}
],
"facets": [
{
"name": "productGender",
"label": "Gender",
"type": "multiple",
"options": [
{
"label": "Women",
"value": "Women",
"count": 208
}
]
},
{
"name": "price",
"label": "Price",
"type": "range",
"is_range": true,
"range_min": 28,
"range_max": 429.99
}
]
}
}Request schema
No body schema
Response schema
#/definitions/jcrew.searchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | jcrew.SearchResponse | No | ||||
| data.count | integer | No | ||||
| data.facets | array | No | ||||
| data.facets[].is_range | boolean | No | ||||
| data.facets[].label | string | No | ||||
| data.facets[].name | string | No | ||||
| data.facets[].options | array | No | ||||
| data.facets[].options[].count | integer | No | ||||
| data.facets[].options[].label | string | No | ||||
| data.facets[].options[].value | string | No | ||||
| data.facets[].range_max | number | No | ||||
| data.facets[].range_min | number | No | ||||
| data.facets[].type | string | No | ||||
| data.fetched_at | string | No | ||||
| data.filter | string | No | ||||
| data.keyword | string | No | ||||
| data.page | integer | No | ||||
| data.per_page | integer | No | ||||
| data.products | array | No | ||||
| data.products[].description | string | No | ||||
| data.products[].family_id | string | No | ||||
| data.products[].gender | string | No | ||||
| data.products[].id | string | No | ||||
| data.products[].image_url | string | No | ||||
| data.products[].name | string | No | ||||
| data.products[].orderable | boolean | No | ||||
| data.products[].price_max | number | No | ||||
| data.products[].price_min | number | No | ||||
| data.products[].sale_price_max | number | No | ||||
| data.products[].sale_price_min | number | No | ||||
| data.products[].url | string | No | ||||
| data.site | string | No | ||||
| data.sort | string | No | ||||
| data.source_url | string | No | ||||
| data.total_pages | integer | No | ||||
| data.total_products | integer | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/jcrew/search?keyword=sweater&site=jcrew&page=1&sort=relevance" \
-H "x-api-key: $CRAWLORA_API_KEY"