Skip to main content

Products

Products are the items in your online store and on invoices. Use these endpoints to sync a catalogue from your own system.

  • Your own id: send externalId; POST /v1/products with the same externalId updates that product.
  • Stock: POST /v1/products/{productId}/stock adds or removes stock and records it in the stock history.
  • Delete archives: the product is hidden and inactive, and kept for past orders and invoices.
  • Plan: creating and changing products needs the Sales add-on.
API regionapi.whautomate.com

List products​

GET /v1/products

Lists products (not archived), newest update first. searchText matches name and SKU; active is true or false.

Headers
x-api-keystringrequired
Your Whautomate API key.
Query parameters
locationIdstring
Location (workspace) id. Get ids from GET /v1/locations.
searchTextstring
Text to search for.
skustring
The product with this SKU.
externalIdstring
Your own id for the record.
categoryIdstring
Only products in this category.
activestring
true or false.
pageinteger
Page number, from 1 (default 1).
limitinteger
Results per page (default 10, max 100).
Response 200
idstring
externalIdstring
Your own id for the product (null when not set)
namestring
skustring
descriptionstring
locationobject
categoryobject

null when the product has no category

pricenumber
regularPricenumber
Regular price shown struck through next to price. Returned only when set.
currencystring
Account currency from Business Settings, e.g. USD
taxesobject[]
manageStockboolean
availableQuantitynumber
activeboolean
availableOnlineboolean
createdAtstring
updatedAtstring
createdboolean
POST and PUT responses only: true when the call created the product
Request
curl -X GET "https://api.whautomate.com/v1/products?locationId=Le6dWjQF9K&searchText=oil&limit=2" \
-H "x-api-key: YOUR_API_KEY"
Response 200
[
{
"id": "YgqKG43JUe",
"externalId": null,
"name": "Massage Oil Blend",
"sku": "OIL-MAS-50",
"description": "Massage Oil Blend from our studio shop.",
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"category": {
"id": "nBxlSyQQMw",
"name": "Aromatherapy"
},
"price": 35,
"currency": "SGD",
"taxes": [],
"manageStock": true,
"availableQuantity": 30,
"active": true,
"availableOnline": true,
"createdAt": "2026-10-29T11:42:38.721Z",
"updatedAt": "2026-10-29T11:43:38.543Z"
},
{
"id": "kZm9rbCRx6",
"externalId": null,
"name": "Lavender Essential Oil",
"sku": "OIL-LAV-10",
"description": "Lavender Essential Oil from our studio shop.",
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"category": {
"id": "nBxlSyQQMw",
"name": "Aromatherapy"
},
"price": 28,
"currency": "SGD",
"taxes": [],
"manageStock": true,
"availableQuantity": 38,
"active": true,
"availableOnline": true,
"createdAt": "2026-10-29T11:42:38.618Z",
"updatedAt": "2026-10-29T11:43:38.263Z"
}
]

Get a product​

GET /v1/products/{productId}

Gets a product by id (404 when unknown).

Headers
x-api-keystringrequired
Your Whautomate API key.
Path parameters
productIdstringrequired
Response 200
idstring
externalIdstring
Your own id for the product (null when not set)
namestring
skustring
descriptionstring
locationobject
categoryobject

null when the product has no category

pricenumber
regularPricenumber
Regular price shown struck through next to price. Returned only when set.
currencystring
Account currency from Business Settings, e.g. USD
taxesobject[]
manageStockboolean
availableQuantitynumber
activeboolean
availableOnlineboolean
createdAtstring
updatedAtstring
createdboolean
POST and PUT responses only: true when the call created the product
Request
curl -X GET "https://api.whautomate.com/v1/products/YgqKG43JUe" \
-H "x-api-key: YOUR_API_KEY"
Response 200
{
"id": "YgqKG43JUe",
"externalId": null,
"name": "Massage Oil Blend",
"sku": "OIL-MAS-50",
"description": "Massage Oil Blend from our studio shop.",
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"category": {
"id": "nBxlSyQQMw",
"name": "Aromatherapy"
},
"price": 35,
"currency": "SGD",
"taxes": [],
"manageStock": true,
"availableQuantity": 30,
"active": true,
"availableOnline": true,
"createdAt": "2026-10-29T11:42:38.721Z",
"updatedAt": "2026-10-29T11:43:38.543Z"
}

Create or update a product​

POST /v1/products

Creates a product, or updates the product with the same externalId (only the fields sent change). Response includes created. Needs the Sales module.

Headers
x-api-keystringrequired
Your Whautomate API key.
Body
productIdstring
Bulk items only: the product to update (ignored by POST and PUT /v1/products)
externalIdstring
Your own id (1 to 200 characters, unique in the account). POST with a known externalId updates that product. Send an empty string to clear it.
locationIdstring
Required to create. A product cannot move to another location.
namestring
Required to create
skustring
Required to create; unique per location
descriptionstring
pricenumber
Required to create
regularPricenumber
Sale anchor, kept only when above price. Send 0 to remove it.
categoryIdstring
Product category id. Send an empty string to clear it.
taxIdsstring[]
Tax ids; replaces the list
activeboolean
Defaults to true on create
availableOnlineboolean
manageStockboolean
availableQuantitynumber
Absolute stock count; the difference is recorded in the stock history
stockReasonstring
Stock adjustment reason name used for an availableQuantity change
Response 200
idstring
externalIdstring
Your own id for the product (null when not set)
namestring
skustring
descriptionstring
locationobject
categoryobject

null when the product has no category

pricenumber
regularPricenumber
Regular price shown struck through next to price. Returned only when set.
currencystring
Account currency from Business Settings, e.g. USD
taxesobject[]
manageStockboolean
availableQuantitynumber
activeboolean
availableOnlineboolean
createdAtstring
updatedAtstring
createdboolean
POST and PUT responses only: true when the call created the product
Request
curl -X POST "https://api.whautomate.com/v1/products" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Eucalyptus Bath Salts",
"sku": "SALT-EUC-20",
"price": 22,
"regularPrice": 26,
"locationId": "Le6dWjQF9K",
"externalId": "shop-prod-2201",
"manageStock": true,
"availableQuantity": 30,
"active": true,
"availableOnline": true
}'
Response 200
{
"created": true,
"id": "3yNbb3VGB6",
"externalId": "shop-prod-2201",
"name": "Eucalyptus Bath Salts",
"sku": "SALT-EUC-20",
"description": "",
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"category": null,
"price": 22,
"regularPrice": 26,
"currency": "SGD",
"taxes": [],
"manageStock": true,
"availableQuantity": 30,
"active": true,
"availableOnline": true,
"createdAt": "2026-10-29T12:40:09.766Z",
"updatedAt": "2026-10-29T12:40:09.781Z"
}

Update a product​

PUT /v1/products/{productId}

Updates a product; only the fields sent change. Needs the Sales module.

Headers
x-api-keystringrequired
Your Whautomate API key.
Path parameters
productIdstringrequired
Body
productIdstring
Bulk items only: the product to update (ignored by POST and PUT /v1/products)
externalIdstring
Your own id (1 to 200 characters, unique in the account). POST with a known externalId updates that product. Send an empty string to clear it.
locationIdstring
Required to create. A product cannot move to another location.
namestring
Required to create
skustring
Required to create; unique per location
descriptionstring
pricenumber
Required to create
regularPricenumber
Sale anchor, kept only when above price. Send 0 to remove it.
categoryIdstring
Product category id. Send an empty string to clear it.
taxIdsstring[]
Tax ids; replaces the list
activeboolean
Defaults to true on create
availableOnlineboolean
manageStockboolean
availableQuantitynumber
Absolute stock count; the difference is recorded in the stock history
stockReasonstring
Stock adjustment reason name used for an availableQuantity change
Response 200
idstring
externalIdstring
Your own id for the product (null when not set)
namestring
skustring
descriptionstring
locationobject
categoryobject

null when the product has no category

pricenumber
regularPricenumber
Regular price shown struck through next to price. Returned only when set.
currencystring
Account currency from Business Settings, e.g. USD
taxesobject[]
manageStockboolean
availableQuantitynumber
activeboolean
availableOnlineboolean
createdAtstring
updatedAtstring
createdboolean
POST and PUT responses only: true when the call created the product
Request
curl -X PUT "https://api.whautomate.com/v1/products/3yNbb3VGB6" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"price": 24,
"regularPrice": 28
}'
Response 200
{
"created": false,
"id": "3yNbb3VGB6",
"externalId": "shop-prod-2201",
"name": "Eucalyptus Bath Salts",
"sku": "SALT-EUC-20",
"description": "",
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"category": null,
"price": 24,
"regularPrice": 28,
"currency": "SGD",
"taxes": [],
"manageStock": true,
"availableQuantity": 30,
"active": true,
"availableOnline": true,
"createdAt": "2026-10-29T12:40:09.766Z",
"updatedAt": "2026-10-29T12:40:09.840Z"
}

Archive a product​

DEL /v1/products/{productId}

Archives a product: hidden and inactive, kept for past orders and invoices.

Headers
x-api-keystringrequired
Your Whautomate API key.
Path parameters
productIdstringrequired
Response 200
idstring
archivedboolean
Request
curl -X DELETE "https://api.whautomate.com/v1/products/3yNbb3VGB6" \
-H "x-api-key: YOUR_API_KEY"
Response 200
{
"id": "3yNbb3VGB6",
"archived": true
}

Adjust stock​

POST /v1/products/{productId}/stock

Adds (positive quantity) or removes (negative) stock, recorded in the stock history; turns on manageStock.

Headers
x-api-keystringrequired
Your Whautomate API key.
Path parameters
productIdstringrequired
Body
quantitynumberrequired
Non-zero change: positive adds stock, negative removes it
reasonstring
Stock adjustment reason name (defaults to New Stock or Other)
Response 200
idstring
externalIdstring
Your own id for the product (null when not set)
namestring
skustring
descriptionstring
locationobject
categoryobject

null when the product has no category

pricenumber
regularPricenumber
Regular price shown struck through next to price. Returned only when set.
currencystring
Account currency from Business Settings, e.g. USD
taxesobject[]
manageStockboolean
availableQuantitynumber
activeboolean
availableOnlineboolean
createdAtstring
updatedAtstring
createdboolean
POST and PUT responses only: true when the call created the product
Request
curl -X POST "https://api.whautomate.com/v1/products/3yNbb3VGB6/stock" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"quantity": 12,
"reason": "New delivery from supplier"
}'
Response 200
{
"id": "3yNbb3VGB6",
"externalId": "shop-prod-2201",
"name": "Eucalyptus Bath Salts",
"sku": "SALT-EUC-20",
"description": "",
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"category": null,
"price": 24,
"regularPrice": 28,
"currency": "SGD",
"taxes": [],
"manageStock": true,
"availableQuantity": 42,
"active": true,
"availableOnline": true,
"createdAt": "2026-10-29T12:40:09.766Z",
"updatedAt": "2026-10-29T12:40:09.905Z"
}

Bulk​

Each item runs on its own, so check every result.

Create or update products in bulk​

POST /v1/products/bulk

Creates or updates up to 100 products; items with productId or a known externalId update. Each item runs on its own. Needs the Sales module.

Headers
x-api-keystringrequired
Your Whautomate API key.
Body
itemsobject[]required

Up to 100. Items with productId or a known externalId update, others create.

Response 200
createdinteger
Items created
updatedinteger
Items updated
failedinteger
Items that failed
resultsobject[]
Request
curl -X POST "https://api.whautomate.com/v1/products/bulk" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"productId": "3yNbb3VGB6",
"price": 23
},
{
"productId": "doesNotExist1",
"price": 18
}
]
}'
Response 200
{
"created": 0,
"updated": 1,
"failed": 1,
"results": [
{
"index": 0,
"ok": true,
"created": false,
"id": "3yNbb3VGB6",
"externalId": "shop-prod-2201"
},
{
"index": 1,
"ok": false,
"error": "Product not found in the account."
}
]
}

Archive products in bulk​

POST /v1/products/bulk/archive

Archives up to 100 products by productIds and/or externalIds.

Headers
x-api-keystringrequired
Your Whautomate API key.
Body
productIdsstring[]
externalIdsstring[]
Response 200
succeededinteger
failedinteger
resultsobject[]
Request
curl -X POST "https://api.whautomate.com/v1/products/bulk/archive" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"productIds": [
"esvaqfvsJ7"
]
}'
Response 200
{
"succeeded": 1,
"failed": 0,
"results": [
{
"id": "esvaqfvsJ7",
"ok": true,
"archived": true
}
]
}