PristineMarketplace API endpoint
Returns products from Pristine Marketplace's (https://www.pristinemarketplace.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.
/pristine-marketplace/productsThis is a brand-pinned endpoint: the storefront URL (https://www.pristinemarketplace.com) is fixed server-side, so unlike the generic /shopify/* family this wraps, there is no url request parameter. The same storefront is reachable through the generic family by passing url=https://www.pristinemarketplace.com directly.
Query parameters:
page: optional integer. 1-based page number. Default: 1.limit: optional integer. Maximum products to return. Default: 50; maximum: 250.Notable response behavior:
200 with an empty products array.products roots return upstream errors.transport_mode: "ssr_embedded", total_items, and total_pages, plus additive per-product fields (colour, canonical_colour, discount_percentage, rating, rating_count, collection_tags, labels, per-variant inventory_quantity). limit is honored as an upper bound; the underlying page size is fixed by the storefront and cannot be requested larger in this mode. All of the above are omitted entirely for stores served by the classic catalog.ssr_embedded fallback was used, the response may also include facets and facets_stats, mirroring the storefront's own filter sidebar for that listing.sortBy or facet-filter query parameters (out of scope -- use the generic /shopify/products endpoint with url set to this brand's storefront for sort/filter support). The response reuses the same shared DTO as the generic family, which carries sort/filters fields for that feature; they are always omitted here since this endpoint never populates them. sort allowed values (never actually returned by this endpoint, listed for schema completeness): sortLTH, sortHTL, newest. This brand-pinned endpoint also does not accept the generic family's sort_by/min_price/max_price/product_type/in_stock_only/option_* Storefront Filtering params (same out-of-scope reasoning -- use the generic /shopify/products endpoint with url set to this brand's storefront). The response DTO carries the matching sort_by/min_price/max_price/product_type/in_stock_only/variant_options fields for that feature; they are always omitted here since this endpoint never populates them. sort_by allowed values (never actually returned by this endpoint, listed for schema completeness): manual, best-selling, title-ascending, title-descending, price-ascending, price-descending, created-ascending, created-descending.transport_mode allowed values: ssr_embedded, storefront_filtered (only ever these two values; omitted for the classic transport).
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| id | 40 | |
| handle | 40 | |
| title | 40 | “Washington Commanders OFA26 Speed F/S Authentic Football He…” and 39 other values |
| url | 40 | pristinemarketplace.com |
| description | 40 | median 1,023 characters |
| vendor | 40 | Creative Sports (28), RIDDELL, INC. (11), Riddell (1) |
| product_type | 40 | “Helmets” and 8 other values |
| published_at | 40 | 2026-10-13 |
| created_at | 40 | 2025-03-01 to 2026-09-12 |
| updated_at | 40 | 2026-10-13 |
| price | 40 | 59 to 1,019, median 239 |
| available | 40 | true in 40 of 40 |
| options | 40 | median 1 entry |
| variants | 40 | median 1 entry |
| images | 40 | median 1 entry |
| featured_image | 40 | cdn.shopify.com |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| page | integer | No | 1 | 1-based page, defaults to 1 | 1 |
| limit | integer | No | 50 and supports up to 250 | Maximum products, defaults to 50 and supports up to 250 | 50 |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/pristine-marketplace/products?page=1&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"store_url": "https://www.pristinemarketplace.com",
"source_url": "https://www.pristinemarketplace.com",
"page": 1,
"limit": 2,
"products": [
{
"id": "8463815540780",
"handle": "washington-commanders-sts22-f-s-authentic-football-helmet",
"title": "Washington Commanders STS22 F/S Authentic Football Helmet",
"url": "https://www.pristinemarketplace.com/products/washington-commanders-sts22-f-s-authentic-football-helmet",
"price": 509,
"available": true
}
]
}
}Request schema
No body schema
Response schema
#/definitions/shopifybrands.productsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | shopify.ProductsResponse | No | ||||
| data.facets | object | No | Facets and FacetsStats are populated when TransportMode is ssr_embedded (from the storefront's own embedded search-index facet buckets) or storefront_filtered (from the storefront's own Storefront Filtering sidebar -- Size/Color/etc. option facets, Product Type, and a "price" FacetsStats entry for the price-range slider's own min/max bounds). | |||
| data.facets_stats | object | No | Lowest, highest and average value per numeric facet such as `price`. Present only when `transport_mode` is set. | |||
| data.filters | object | No | Facet filters applied, mapping each facet name to the values requested. Present only for headless storefronts. | |||
| data.in_stock_only | boolean | No | Whether only in-stock products were requested. Present only when `transport_mode` is `storefront_filtered`. | |||
| data.limit | integer | No | 50 | Maximum number of products returned per page. | ||
| data.max_price | number | No | Maximum price filter applied. Present only when `transport_mode` is `storefront_filtered`. | |||
| data.min_price | number | No | Minimum price filter applied. Present only when `transport_mode` is `storefront_filtered`. | |||
| data.page | integer | No | 1 | Page number returned. | ||
| data.product_type | array | No | Product types the results were filtered to. Present only when `transport_mode` is `storefront_filtered`. | |||
| data.products | array | No | Products on this page, one item per product. ProductItem record, 57 fields: available, canonical_colour, collection_tags, colour, compare_at_price, condition, created_at, description, discount_percentage, featured_image, handle, id and 14 more. Described under Pristine Marketplace Search API. | |||
| data.sort | string | No | sortLTH, sortHTL, newest | sortLTH | Sort and Filters echo back the effective sortBy/facet-filter query params that were applied, present only when transport_mode is ssr_embedded and the caller supplied at least one. Always omitted for the classic transport (which rejects them as invalid params instead). | |
| data.sort_by | string | No | manual, best-selling, title-ascending, title-descending, price-ascending, price-descending, created-ascending, created-descending | price-ascending | SortBy, MinPrice, MaxPrice, ProductType, InStockOnly, and VariantOptions echo back the effective storefront-filtering params that were applied, present only when transport_mode is storefront_filtered. | |
| data.source_url | string | No | https://www.allbirds.com | URL the data was read from. | ||
| data.store_url | string | No | https://www.allbirds.com | Base URL of the Shopify storefront that was queried. | ||
| data.total_items | integer | No | 184 | TotalItems and TotalPages are populated only when TransportMode is ssr_embedded, from the storefront's own embedded search-result pagination metadata. | ||
| data.total_pages | integer | No | 4 | Total number of result pages. Present only for headless storefronts. | ||
| data.transport_mode | string | No | ssr_embedded, storefront_filtered | ssr_embedded | Set to `ssr_embedded` for headless storefronts, or `storefront_filtered` when sort, price, product type, in-stock or variant filters were applied. Omitted otherwise. | |
| data.variant_options | object | No | Variant option filters applied, mapping an option name such as `size` to the values requested. Present only when `transport_mode` is `storefront_filtered`. | |||
| 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/pristine-marketplace/products?page=1&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"