DRAFT → PUBLISHED → ARCHIVED lifecycle.
Base Path
Creator product endpoints use/api/v1/creator/id/{creatorId}/product. Public listing uses /api/v1/products.
Create a Product
Create Product Schema
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Product name |
slug | string | Yes | URL-friendly identifier (unique per creator) |
description | string | Yes | Product description |
price | integer | Yes | Price in cents (e.g., 2500 = $25.00) |
maxDiscount | integer | Yes | Maximum discount in cents (0–10000) |
allowedPointSources | string[]? | No | Point source types allowed for discounts |
media | array | Yes | 1–5 media items (see Media below) |
Update a Product
PATCH merges the provided fields into the existing product. This endpoint also handles attributes, media, supply, shipping config, and point eligibility.
Update Schema (all fields optional)
| Field | Type | Description |
|---|---|---|
name | string | Product name |
description | string | Product description |
price | integer | Base price in cents |
supply | integer | Total inventory (null for unlimited) |
logo | string | Product logo/thumbnail URL |
pointEligibility | enum | ELIGIBLE or INELIGIBLE |
shippingType | enum | Shipping method |
subcategoryId | integer | Category assignment |
attributes | array | Attribute variants (replaces existing) |
media | array | Media items (replaces existing) |
Media
Each product requires 1–5 media items. The first item (order0) is the hero image.
| Field | Type | Required | Description |
|---|---|---|---|
url | string | Yes | Media URL |
type | enum | Yes | IMAGE or VIDEO |
order | integer | Yes | Display order (0-indexed, must be unique) |
Attribute Variants
Products support configurable attributes for variant selection. Each attribute has a name, type, and array of variants with independent pricing and inventory.price (in cents, replaces the base price when selected) and independent supply tracking. When a user selects variants at checkout, the selectedAttributes are stored on the order item.
Variant Schema
| Field | Type | Required | Description |
|---|---|---|---|
value | string | Yes | Display value (e.g., “30ml”, “Red”) |
price | integer | Yes | Price in cents when this variant is selected |
supply | integer | No | Inventory for this variant |
order | integer | Yes | Display order |
Product Lifecycle
Products move through three statuses:Publish a Product
Transitions aDRAFT product to PUBLISHED, making it visible in public listings.
Restore an Archived Product
Returns anARCHIVED product to DRAFT status.
Purge a Product
Permanently deletes anARCHIVED product. This is irreversible.
Get and List Products
Get a Single Product
DRAFT, PUBLISHED, ARCHIVED).
Get Product by Slug
List Creator Products
List Published Products (Public)
PUBLISHED products. Supports cursor-based pagination and category filtering.
Delete (Archive) a Product
ARCHIVED status. Use /restore to bring it back, or /purge to permanently delete.
Buy Now
A shortcut endpoint that creates an order and optionally initiates Stripe checkout in a single request:| Field | Type | Default | Description |
|---|---|---|---|
quantity | integer | — | Number of items (min 1) |
variantIds | string[] | [] | Selected variant IDs |
shouldUseStripe | boolean | true | If true, creates Stripe PaymentIntent |
Analytics
Product Analytics
Aggregate Product Analytics
Sales Data
Categories
Product Model
| Field | Type | Description |
|---|---|---|
id | string | CUID2 identifier |
name | string | Product name |
description | string | Product description |
price | integer | Base price in cents |
supply | integer? | Inventory count (null for unlimited) |
maxDiscount | integer | Maximum applicable discount in cents |
status | enum | DRAFT, PUBLISHED, ARCHIVED |
slug | string | URL-friendly identifier |
pointEligibility | enum | ELIGIBLE or INELIGIBLE |
shippingType | enum? | Shipping method |
logo | string? | Product thumbnail URL |
subcategoryId | integer? | Category reference |
shopifyProductId | string? | Linked Shopify product (if synced) |
media | array | Attached media items |
attributes | array | Configurable attribute variants |
createdAt | datetime | Creation timestamp |
updatedAt | datetime | Last update timestamp |
Endpoint Summary
| Method | Path | Description |
|---|---|---|
POST | /creator/id/{creatorId}/product | Create a product |
GET | /creator/id/{creatorId}/product/{productId} | Get product by ID |
PATCH | /creator/id/{creatorId}/product/{productId} | Update product |
DELETE | /creator/id/{creatorId}/product/{productId} | Archive product |
POST | /creator/id/{creatorId}/product/{productId}/publish | Publish product |
POST | /creator/id/{creatorId}/product/{productId}/restore | Restore archived |
POST | /creator/id/{creatorId}/product/{productId}/purge | Permanently delete |
GET | /creator/id/{creatorId}/product/slug/{slug} | Get by slug |
GET | /creator/id/{creatorId}/products | List creator products |
GET | /creator/id/{creatorId}/product/{productId}/analytics | Product analytics |
GET | /creator/id/{creatorId}/products/analytics | Aggregate analytics |
GET | /creator/id/{creatorId}/products/sales | Sales data |
GET | /products | List published products (public) |
POST | /product/{productId}/buy-now | Buy now shortcut |
GET | /categories | List all categories |

