API docs
Products, categories, vendors
Permission: products (read / write).
The product object
{
"object": "product",
"id": 617,
"sku": "CDL-SSD-08",
"upc": "850012345617",
"name": "Sea Salt & Driftwood Soy Candle 8oz",
"brand": "Wick & Ember",
"manufacturer": "Wick & Ember Studio",
"model": null,
"description": "Hand-poured soy wax, cotton wick, 45-hour burn.",
"product_type": "general",
"category_id": 142,
"vendor_id": 33,
"vendor_sku": "WES-SSD-08",
"is_active": true,
"is_serialized": false,
"tracks_lots": false,
"track_inventory": true,
"min_age": null,
"tax_class": "standard",
"price_cents": 2400,
"cost_cents": 650,
"map_price_cents": null,
"compare_at_cents": null,
"sale_price_cents": null,
"sale_starts_at": null,
"sale_ends_at": null,
"sale_scope": "store",
"effective_price_cents": 2400,
"weight_grams": 310,
"image_url": "https://cdn11.bigcommerce.com/…/ssd-8oz.jpg",
"reorder_point": 12,
"bigcommerce": { "product_id": 212, "variant_id": 305 },
"flxpoint_product_id": null,
"inventory": [ { "object": "inventory_level", "product_id": 617, "location_id": 18, "qty_on_hand": 22, "qty_reserved": 0, "qty_available": 22, "reorder_point": null, "bin_location": "Wall A", "updated_at": "2026-09-24T06:22:22Z" } ],
"created_at": "2026-09-03T15:10:00Z",
"updated_at": "2026-09-24T06:22:22Z"
}
| Field | Notes |
|---|---|
product_type |
general, service, fee, gift_card |
is_serialized |
Stocked as individual units with serial numbers (see Inventory) |
tracks_lots |
Stocked in lots with lot numbers and expiry dates (see Inventory). A product is serialized or lot-tracked, never both. |
tax_class |
standard, exempt, service |
effective_price_cents |
sale_price_cents while a sale window is open, otherwise price_cents |
sale_scope |
store (counter only) or store_online (also pushed to BigCommerce) |
inventory |
Levels at the locations the key can see. Always on single-product responses; on lists with include=inventory |
List products
GET /v1/products
| Filter | |
|---|---|
sku, upc, vendor_sku |
Exact match |
product_type, category_id, vendor_id, bigcommerce_product_id |
Exact match |
is_active |
true / false |
q |
Name, SKU prefix, model, or exact UPC |
include=inventory |
Embed levels |
updated_since, limit, cursor |
See Conventions |
curl "https://app.blackbeachpos.com/api/v1/products?category_id=142&include=inventory&limit=100" \
-H "Authorization: Bearer $KEY"
Get a product
GET /v1/products/{id}: the product with its inventory levels.
Create a product
POST /v1/products (write). Requires name and price_cents. Everything else is optional:
skuis generated if you leave it out.- Send the read shape;
reorder_pointis accepted (and the internaldefault_reorder_point). is_serializedandtracks_lotscan't both betrue.
curl -X POST https://app.blackbeachpos.com/api/v1/products \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: 7d3f0c1e-2b8a-4c55-9d1e-0f6a2c1b9e44" \
-d '{
"sku": "CDL-FIG-08",
"name": "Fig & Black Currant Soy Candle 8oz",
"brand": "Wick & Ember",
"product_type": "general",
"tax_class": "standard",
"price_cents": 2400,
"cost_cents": 650,
"category_id": 142,
"vendor_id": 33,
"vendor_sku": "WES-FIG-08",
"reorder_point": 12
}'
Returns 201 with the product.
Possible errors:
409 SKU_TAKEN400 VALIDATION_ERRORfor an unknowncategory_idorvendor_id, oris_serializedandtracks_lotsboth set
Update a product
PATCH /v1/products/{id} (write). Send only the fields you're changing.
- Prices, descriptions and the rest are ordinary edits.
- How it's stocked.
is_serializedandtracks_lotscan change only while no location has stock on hand: otherwise409 HAS_STOCK. Sending the current value is fine. - Sale prices online. Changing
sale_price_cents,sale_starts_atorsale_ends_aton a product withsale_scope: "store_online"also queues the sale price to BigCommerce.
curl -X PATCH https://app.blackbeachpos.com/api/v1/products/617 \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{ "price_cents": 2600, "sale_price_cents": 2200, "sale_starts_at": "2026-10-01T04:00:00Z", "sale_ends_at": "2026-10-08T04:00:00Z" }'
Delete a product
DELETE /v1/products/{id} (write). Refused with 409 HAS_STOCK while any location has stock on hand. To take a product out of use, set is_active: false instead.
{ "status": "ok", "data": { "object": "product", "id": 617, "deleted": true } }
Categories
GET /v1/categories (products:read). Paginated, with updated_since.
{ "object": "category", "id": 142, "name": "Candles", "parent_id": null, "sort_order": 1, "bigcommerce_category_id": 24, "updated_at": "2026-09-03T15:10:00Z" }
Vendors
GET /v1/vendors (products:read). Paginated, with updated_since.
{ "object": "vendor", "id": 34, "name": "Aromatique Supply Co.", "code": "ASC", "contact_name": "Rep Desk", "email": "orders@example.com", "phone": "800-555-0100", "website": "https://example.com", "is_distributor": true, "flxpoint_source_id": "src_8812", "status": "active", "updated_at": "2026-09-03T15:10:00Z" }
