import { createClient } from '@spree/sdk'
const client = createClient({
baseUrl: 'https://your-store.com',
publishableKey: '<api-key>',
})
const products = await client.products.list({
page: 1,
limit: 25,
sort: 'price',
name_cont: 'shirt',
price_gte: 20,
price_lte: 100,
with_option_value_ids: ['optval_abc', 'optval_def'],
expand: ['variants', 'media'],
})curl --request GET \
--url http://{defaultHost}/api/v3/store/products \
--header 'x-spree-api-key: <api-key>'{
"data": [
{
"id": "prod_UkLWZg9DAJ",
"name": "Product 2989085",
"slug": "product-2989085",
"meta_title": null,
"meta_description": null,
"meta_keywords": null,
"variant_count": 2,
"available_on": null,
"preorder_ships_at": null,
"purchasable": true,
"preorder": false,
"in_stock": false,
"backorderable": true,
"available": true,
"description": "A comfortable cotton t-shirt.",
"description_html": "<p>A <strong>comfortable</strong> cotton t-shirt.</p>",
"default_variant_id": "variant_UkLWZg9DAJ",
"buy_box_variant_id": "variant_UkLWZg9DAJ",
"thumbnail_url": null,
"tags": [],
"price": {
"id": "price_UkLWZg9DAJ",
"amount": "19.99",
"amount_in_cents": 1999,
"compare_at_amount": null,
"compare_at_amount_in_cents": null,
"currency": "USD",
"display_amount": "$19.99",
"display_compare_at_amount": null,
"price_list_id": null
},
"original_price": null,
"seller_id": null
},
{
"id": "prod_gbHJdmfrXB",
"name": "Product 2998209",
"slug": "product-2998209",
"meta_title": null,
"meta_description": null,
"meta_keywords": null,
"variant_count": 1,
"available_on": null,
"preorder_ships_at": null,
"purchasable": true,
"preorder": false,
"in_stock": false,
"backorderable": true,
"available": true,
"description": "Quasi nostrum error iste autem recusandae consequuntur consectetur. Dolorem ea officia rerum a. Asperiores et occaecati laudantium deserunt modi reiciendis rem. Iste soluta tempora odit voluptate cupiditate. Architecto nostrum aliquid est odit minima repudiandae. Doloribus quos est in illum. Occaecati vero soluta asperiores aliquam odio accusamus incidunt. Officia magnam fugiat sint optio ipsa. Deserunt reiciendis aliquid architecto occaecati rem maxime vero doloremque. Recusandae ipsum natus eius assumenda.",
"description_html": "Quasi nostrum error iste autem recusandae consequuntur consectetur. Dolorem ea officia rerum a. Asperiores et occaecati laudantium deserunt modi reiciendis rem. Iste soluta tempora odit voluptate cupiditate. Architecto nostrum aliquid est odit minima repudiandae.\nDoloribus quos est in illum. Occaecati vero soluta asperiores aliquam odio accusamus incidunt. Officia magnam fugiat sint optio ipsa. Deserunt reiciendis aliquid architecto occaecati rem maxime vero doloremque. Recusandae ipsum natus eius assumenda.",
"default_variant_id": "variant_EfhxLZ9ck8",
"buy_box_variant_id": "variant_EfhxLZ9ck8",
"thumbnail_url": null,
"tags": [],
"price": {
"id": "price_EfhxLZ9ck8",
"amount": "19.99",
"amount_in_cents": 1999,
"compare_at_amount": null,
"compare_at_amount_in_cents": null,
"currency": "USD",
"display_amount": "$19.99",
"display_compare_at_amount": null,
"price_list_id": null
},
"original_price": null,
"seller_id": null
}
],
"meta": {
"page": 1,
"limit": 25,
"count": 2,
"pages": 1,
"from": 1,
"to": 2,
"in": 2,
"previous": null,
"next": null
}
}{
"error": {
"code": "invalid_token",
"message": "Valid API key required"
}
}List products
Returns a paginated list of active products for the current store
import { createClient } from '@spree/sdk'
const client = createClient({
baseUrl: 'https://your-store.com',
publishableKey: '<api-key>',
})
const products = await client.products.list({
page: 1,
limit: 25,
sort: 'price',
name_cont: 'shirt',
price_gte: 20,
price_lte: 100,
with_option_value_ids: ['optval_abc', 'optval_def'],
expand: ['variants', 'media'],
})curl --request GET \
--url http://{defaultHost}/api/v3/store/products \
--header 'x-spree-api-key: <api-key>'{
"data": [
{
"id": "prod_UkLWZg9DAJ",
"name": "Product 2989085",
"slug": "product-2989085",
"meta_title": null,
"meta_description": null,
"meta_keywords": null,
"variant_count": 2,
"available_on": null,
"preorder_ships_at": null,
"purchasable": true,
"preorder": false,
"in_stock": false,
"backorderable": true,
"available": true,
"description": "A comfortable cotton t-shirt.",
"description_html": "<p>A <strong>comfortable</strong> cotton t-shirt.</p>",
"default_variant_id": "variant_UkLWZg9DAJ",
"buy_box_variant_id": "variant_UkLWZg9DAJ",
"thumbnail_url": null,
"tags": [],
"price": {
"id": "price_UkLWZg9DAJ",
"amount": "19.99",
"amount_in_cents": 1999,
"compare_at_amount": null,
"compare_at_amount_in_cents": null,
"currency": "USD",
"display_amount": "$19.99",
"display_compare_at_amount": null,
"price_list_id": null
},
"original_price": null,
"seller_id": null
},
{
"id": "prod_gbHJdmfrXB",
"name": "Product 2998209",
"slug": "product-2998209",
"meta_title": null,
"meta_description": null,
"meta_keywords": null,
"variant_count": 1,
"available_on": null,
"preorder_ships_at": null,
"purchasable": true,
"preorder": false,
"in_stock": false,
"backorderable": true,
"available": true,
"description": "Quasi nostrum error iste autem recusandae consequuntur consectetur. Dolorem ea officia rerum a. Asperiores et occaecati laudantium deserunt modi reiciendis rem. Iste soluta tempora odit voluptate cupiditate. Architecto nostrum aliquid est odit minima repudiandae. Doloribus quos est in illum. Occaecati vero soluta asperiores aliquam odio accusamus incidunt. Officia magnam fugiat sint optio ipsa. Deserunt reiciendis aliquid architecto occaecati rem maxime vero doloremque. Recusandae ipsum natus eius assumenda.",
"description_html": "Quasi nostrum error iste autem recusandae consequuntur consectetur. Dolorem ea officia rerum a. Asperiores et occaecati laudantium deserunt modi reiciendis rem. Iste soluta tempora odit voluptate cupiditate. Architecto nostrum aliquid est odit minima repudiandae.\nDoloribus quos est in illum. Occaecati vero soluta asperiores aliquam odio accusamus incidunt. Officia magnam fugiat sint optio ipsa. Deserunt reiciendis aliquid architecto occaecati rem maxime vero doloremque. Recusandae ipsum natus eius assumenda.",
"default_variant_id": "variant_EfhxLZ9ck8",
"buy_box_variant_id": "variant_EfhxLZ9ck8",
"thumbnail_url": null,
"tags": [],
"price": {
"id": "price_EfhxLZ9ck8",
"amount": "19.99",
"amount_in_cents": 1999,
"compare_at_amount": null,
"compare_at_amount_in_cents": null,
"currency": "USD",
"display_amount": "$19.99",
"display_compare_at_amount": null,
"price_list_id": null
},
"original_price": null,
"seller_id": null
}
],
"meta": {
"page": 1,
"limit": 25,
"count": 2,
"pages": 1,
"from": 1,
"to": 2,
"in": 2,
"previous": null,
"next": null
}
}{
"error": {
"code": "invalid_token",
"message": "Valid API key required"
}
}Authorizations
Publishable API key for store access
Headers
Publishable API key
Query Parameters
Page number (default: 1)
Number of items per page (default: 25, max: 100)
Sort order. Prefix with - for descending. Values: price, -price, best_selling, name, -name, -available_on, available_on
Filter by name containing string
Filter by category prefixed ID (includes descendants)
Filter by multiple category prefixed IDs (OR logic, includes descendants)
Filter by minimum price
Filter by maximum price
Filter by option value prefix IDs (e.g., optval_abc). Pass multiple values for OR logic.
Filter to only in-stock products
Comma-separated associations to expand (variants, media, categories, option_types, seller, seller.policies)
Comma-separated list of fields to include (e.g., name,slug,price). id is always included.
Was this page helpful?

