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",
  "make_active_at": null,
  "discontinue_on": null,
  "metadata": {},
  "deleted_at": null,
  "created_at": "2026-05-21T18:11:35.401Z",
  "updated_at": "2026-05-21T18:11:35.404Z",
  "tax_category_id": null
}

Documentation Index

Fetch the complete documentation index at: https://spreecommerce.org/docs/llms.txt

Use this file to discover all available pages before exploring further.

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"]
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
make_active_at
string | null
required
discontinue_on
string | null
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[]
categories
object[]
custom_fields
object[]
prior_price
object