Skip to main content
POST
/
api
/
v3
/
admin
/
products
Spree Admin SDK
import { createAdminClient } from '@spree/admin-sdk'

const client = createAdminClient({
  baseUrl: 'https://your-store.com',
  secretKey: 'sk_xxx',
})

const product = await client.products.create({
  name: 'Premium T-Shirt',
  description: 'Soft, organic cotton.',
  status: 'active',
  variants: [
    {
      sku: 'TSHIRT-S-NAVY',
      options: [
        { name: 'size', value: 'Small' },
        { name: 'color', value: 'navy' },
      ],
      prices: [
        { currency: 'USD', amount: '29.99' },
        { currency: 'EUR', amount: '27.99' },
      ],
      stock_items: [{ stock_location_id: 'sloc_UkLWZg9DAJ', count_on_hand: 50 }],
    },
    {
      sku: 'TSHIRT-M-NAVY',
      options: [
        { name: 'size', value: 'Medium' },
        { name: 'color', value: 'navy' },
      ],
      prices: [{ currency: 'USD', amount: '29.99' }],
      stock_items: [{ stock_location_id: 'sloc_UkLWZg9DAJ', count_on_hand: 30 }],
    },
  ],
})
{
  "id": "prod_gbHJdmfrXB",
  "name": "New Product",
  "slug": "new-product",
  "meta_title": null,
  "meta_description": null,
  "meta_keywords": null,
  "variant_count": 0,
  "available_on": null,
  "purchasable": false,
  "in_stock": false,
  "backorderable": false,
  "available": false,
  "description": null,
  "description_html": null,
  "default_variant_id": "variant_gbHJdmfrXB",
  "thumbnail_url": null,
  "tags": [],
  "price": null,
  "original_price": null,
  "status": "draft",
  "metadata": {},
  "deleted_at": null,
  "created_at": "2026-06-17T13:37:41.707Z",
  "updated_at": "2026-06-17T13:37:41.708Z",
  "tax_category_id": null
}

Authorizations

x-spree-api-key
string
header
required

Secret API key for admin access

Authorization
string
header
required

JWT token for admin user authentication

Headers

x-spree-api-key
string
required
Authorization
string
required

Bearer token for admin authentication

Body

application/json
name
string
required
Example:

"Premium T-Shirt"

description
string
slug
string
status
enum<string>
Available options:
draft,
active,
archived
tax_category_id
string

Tax category ID

category_ids
string[]

Array of category IDs

tags
string[]
Example:
["eco", "sale"]
prices
object[]

Shorthand for a simple (no-options) product: per-currency prices that forward to the product's sole variant. For products with options, set prices per variant under variants: instead.

variants
object[]

Array of variant payloads. Variants can declare multiple option pairs via options: and per-currency prices via prices:. Stock counts go in stock_items: (per stock location).

Response

product created

id
string
required
name
string
required
slug
string
required
meta_title
string | null
required
meta_description
string | null
required
meta_keywords
string | null
required
variant_count
number
required
available_on
string | null
required
purchasable
boolean
required
in_stock
boolean
required
backorderable
boolean
required
available
boolean
required
description
string | null
required
description_html
string | null
required
default_variant_id
string
required
thumbnail_url
string | null
required
tags
string[]
required
price
object
required
original_price
object
required
status
string
required
metadata
object
required
deleted_at
string | null
required
created_at
string
required
updated_at
string
required
tax_category_id
string | null
required
primary_media
object
media
object[]
variants
object[]
default_variant
object
option_types
object[]
option_values
object[]
categories
object[]
custom_fields
object[]
prior_price
object
product_publications
object[]
channels
object[]