Kylie Cosmetics API endpoint
Returns products from Kylie Cosmetics's (https://www.kyliecosmetics.com) public product catalog. The storefront URL is fixed server-side. Valid empty result pages return `200` with an empty products array.
/kyliecosmetics/productsThis is a brand-pinned endpoint: the storefront URL (https://www.kyliecosmetics.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.kyliecosmetics.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./products.json endpoint, the response includes 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 JSON.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 | “Cosmic Kylie Jenner 2.0 50ml & Pen Spray Duo Gift Set” and 39 other values |
| url | 40 | kyliecosmetics.com |
| vendor | 40 | kylie-fragrance (18), kylie-cosmetics (15), kylie-samples (7) |
| product_type | 40 | Bundle (13), Set (12), Fragrance (6) and 5 more |
| published_at | 40 | 2026-06-15 to 2026-10-08 |
| created_at | 40 | 2026-01-28 to 2026-09-24 |
| updated_at | 40 | 2026-10-13 |
| price | 40 | 1 to 276.3, median 45 |
| available | 40 | true in 40 of 40 |
| options | 40 | median 1 entry |
| variants | 40 | median 1 entry |
| images | 40 | median 5 entries |
| featured_image | 40 | cdn.shopify.com |
| compare_at_price | 10 | 49 to 307, median 97 |
| 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/kyliecosmetics/products?page=1&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"store_url": "https://www.kyliecosmetics.com",
"source_url": "https://www.kyliecosmetics.com",
"page": 1,
"limit": 2,
"products": [
{
"id": "7188363542608",
"handle": "example-product-handle",
"title": "Example Product",
"url": "https://www.kyliecosmetics.com/products/example-product-handle",
"price": 45,
"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. | |||
| data.products[].available | boolean | No | Whether at least one variant is available to buy. | |||
| data.products[].canonical_colour | string | No | black | Main colour name the storefront groups the product under, for example `black`. | ||
| data.products[].collection_tags | array | No | Collections the product is listed in, as the storefront labels them. | |||
| data.products[].colour | string | No | black | The fields below are only populated when the product was resolved via the embedded-SSR-JSON fallback transport (see ssr_fallback.go) and the source page exposed this data; they are additive and never populated for classic-store responses. | ||
| data.products[].compare_at_price | number | No | 120 | Original price before discount, in the store's currency. The highest compare-at price across variants. | ||
| data.products[].condition | string | No | Excellent | Condition is only populated for resale-marketplace search results (Fashionphile's AlgoliaSearch, Rebag's StorefrontSearch -- see search.go) whose catalog data exposes a condition grade. Never populated for any other brand or endpoint in this family. | ||
| data.products[].created_at | string | No | Time the record was created, as Shopify returns it. | |||
| data.products[].description | string | No | Product description as plain text. | |||
| data.products[].discount_percentage | number | No | 20 | Discount currently applied to the product, as a percentage. | ||
| data.products[].featured_image | string | No | URL of the product's main image. | |||
| data.products[].handle | string | No | mens-wool-runners | URL slug of the product, for example `mens-wool-runners`. | ||
| data.products[].id | string | No | 6616124981328 | Shopify product id. | ||
| data.products[].images | array | No | Images of the product, in the storefront's order. | |||
| data.products[].images[].alt | string | No | Product image | Alternative text of the image. | ||
| data.products[].images[].created_at | string | No | Time the record was created, as Shopify returns it. | |||
| data.products[].images[].height | integer | No | 1600 | Image height in pixels. | ||
| data.products[].images[].id | string | No | 36411373027408 | Shopify image id. | ||
| data.products[].images[].position | integer | No | 1 | Position of the image in the product's image list, starting at 1. | ||
| data.products[].images[].updated_at | string | No | Time the record was last updated, as Shopify returns it. | |||
| data.products[].images[].url | string | No | https://cdn.shopify.com/s/files/1/example.jpg | URL of the image file. | ||
| data.products[].images[].variant_ids | array | No | Ids of the variants this image is attached to. | |||
| data.products[].images[].width | integer | No | 1600 | Image width in pixels. | ||
| data.products[].labels | array | No | new | Badges the storefront shows on the product, for example `new`. | ||
| data.products[].options | array | No | Options the product varies by, such as size or colour. | |||
| data.products[].options[].name | string | No | Size | Option name, for example `Size`. | ||
| data.products[].options[].position | integer | No | 1 | Position of the option on the product, starting at 1. | ||
| data.products[].options[].values | array | No | Values the option can take, for example `S` or `M`. | |||
| data.products[].price | number | No | 98 | Current price in the store's currency. The lowest variant price when variants are listed. | ||
| data.products[].product_type | string | No | Shoes | Product type set by the merchant, for example `Shoes`. | ||
| data.products[].published_at | string | No | Time the record was published, as Shopify returns it. | |||
| data.products[].rating | number | No | 4.2 | Average customer rating shown by the storefront. | ||
| data.products[].rating_count | integer | No | 1549 | Number of customer ratings behind `rating`. | ||
| data.products[].tags | array | No | Tags the merchant attached to the product. | |||
| data.products[].title | string | No | Men's Wool Runners | Product name as shown on the storefront. | ||
| data.products[].updated_at | string | No | Time the record was last updated, as Shopify returns it. | |||
| data.products[].url | string | No | https://www.allbirds.com/products/mens-wool-runners | Storefront page URL of the product. | ||
| data.products[].variants | array | No | Purchasable variants of the product, such as each size and colour. | |||
| data.products[].variants[].available | boolean | No | Whether this variant is currently available to buy. | |||
| data.products[].variants[].barcode | string | No | Barcode of the variant, such as a UPC or EAN. | |||
| data.products[].variants[].compare_at_price | number | No | 120 | Original price before discount, in the store's currency. | ||
| data.products[].variants[].created_at | string | No | Time the record was created, as Shopify returns it. | |||
| data.products[].variants[].featured_image | string | No | URL of the image shown for this variant. | |||
| data.products[].variants[].grams | integer | No | 400 | Weight of the variant in grams. | ||
| data.products[].variants[].id | string | No | 34761278160941 | Shopify variant id. | ||
| data.products[].variants[].inventory_quantity | integer | No | 24 | InventoryQuantity is only populated via the embedded-SSR-JSON fallback transport (see ssr_fallback.go); classic-store responses never set it. | ||
| data.products[].variants[].option1 | string | No | Value of the product's first option for this variant, for example a size. | |||
| data.products[].variants[].option2 | string | No | Value of the product's second option for this variant. | |||
| data.products[].variants[].option3 | string | No | Value of the product's third option for this variant. | |||
| data.products[].variants[].position | integer | No | 1 | Position of the variant in the product's variant list, starting at 1. | ||
| data.products[].variants[].price | number | No | 98 | Current price of the variant in the store's currency. | ||
| data.products[].variants[].product_id | string | No | 6616124981328 | Shopify id of the product the variant belongs to. | ||
| data.products[].variants[].requires_shipping | boolean | No | Whether the variant is a physical item that needs shipping. | |||
| data.products[].variants[].sku | string | No | A123 | Merchant stock keeping unit code of the variant. | ||
| data.products[].variants[].taxable | boolean | No | Whether tax is charged on the variant. | |||
| data.products[].variants[].title | string | No | Natural Black / 10 | Variant name, for example `Natural Black / 10`. | ||
| data.products[].variants[].updated_at | string | No | Time the record was last updated, as Shopify returns it. | |||
| data.products[].vendor | string | No | Allbirds | Brand or vendor name set by the merchant. | ||
| 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/kyliecosmetics/products?page=1&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"