Documentation
API reference
Products
Products are the items on your menus: price, images, modifiers and the tax rates they collect.
Base URL: https://apiv2.venuerun.com/merchants/:merchantId/products
text
GET /merchants/:merchantId/products
POST /merchants/:merchantId/products
GET /merchants/:merchantId/products/:productId
POST /merchants/:merchantId/products/:productId
PATCH /merchants/:merchantId/products/:productId
DELETE /merchants/:merchantId/products/:productIdThe product object
| Field | Type | Description |
|---|---|---|
id | string (read-only) | Unique identifier, assigned by VenueRun. |
createdAt | string (read-only) | When it was created (ISO 8601). |
updatedAt | string (read-only) | When it last changed (ISO 8601). |
title | string | |
priceMinor | integer | The price in cents (integer minor units): 450 is $4.50. Every amount an order quotes is in the same unit. |
description | string | Defaults to "". |
images | string[] | Defaults to []. |
visible | boolean | Defaults to true. |
taxRateIds | string[] | Ids of the tax rates this product collects. Empty means untaxed; several stack. They are resolved when the product is added to an order and frozen onto that line, so editing a rate later never reprices it. Defaults to []. |
calories | number | Defaults to 0. |
modifiers | string[] | Modifier document ids attached to this product. Defaults to []. |
manageStock | boolean | Defaults to false. |
stockQuantity | number | Defaults to 0. |
type | "SIMPLE" | Defaults to "SIMPLE". |
upc | string | Defaults to "". |
sku | string | Defaults to "". |
metadata | object[] | Defaults to []. |
searchHelpers | object | |
↳ title | string | |
↳ priceMinor | integer | The price in cents (integer minor units): 450 is $4.50. Every amount an order quotes is in the same unit. |
testMode | boolean | Defaults to false. |
json
{
"id": "sS8TFtwi3YOoQujvDP3r",
"title": "Tax rate host A1B2C3",
"priceMinor": 500,
"description": "",
"images": [],
"visible": true,
"taxRateIds": [
"nMS5btBySHzJPm1AnGod"
],
"calories": 0,
"modifiers": [],
"manageStock": false,
"stockQuantity": 0,
"type": "SIMPLE",
"upc": "",
"sku": "",
"metadata": [],
"testMode": true,
"createdAt": "2026-01-15T12:00:00.000Z",
"updatedAt": "2026-01-15T12:00:00.000Z"
}List products
GET /merchants/:merchantId/products
javascript
const merchantId = process.env.VENUERUN_MERCHANT_ID;
const response = await fetch(`https://apiv2.venuerun.com/merchants/${merchantId}/products`, {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.VENUERUN_API_KEY}`,
},
});Response:
json
{
"testMode": true,
"length": 1,
"data": [
{
"id": "sS8TFtwi3YOoQujvDP3r",
"title": "Tax rate host A1B2C3",
"priceMinor": 500,
"description": "",
"images": [],
"visible": true,
"taxRateIds": [
"nMS5btBySHzJPm1AnGod"
],
"calories": 0,
"modifiers": [],
"manageStock": false,
"stockQuantity": 0,
"type": "SIMPLE",
"upc": "",
"sku": "",
"metadata": [],
"testMode": true,
"createdAt": "2026-01-15T12:00:00.000Z",
"updatedAt": "2026-01-15T12:00:00.000Z"
}
]
}Create a product
POST /merchants/:merchantId/products
Required attributes
| Field | Type | Description |
|---|---|---|
title | string | |
priceMinor | integer | The price in cents (integer minor units): 450 is $4.50. Every amount an order quotes is in the same unit. |
Optional attributes
| Field | Type | Description |
|---|---|---|
description | string | Defaults to "". |
images | string[] | Defaults to []. |
visible | boolean | Defaults to true. |
taxRateIds | string[] | Ids of the tax rates this product collects. Empty means untaxed; several stack. They are resolved when the product is added to an order and frozen onto that line, so editing a rate later never reprices it. Defaults to []. |
calories | number | |
modifiers | string[] | Modifier document ids attached to this product. Defaults to []. |
manageStock | boolean | Defaults to false. |
stockQuantity | number | |
type | "SIMPLE" | Defaults to "SIMPLE". |
upc | string | Defaults to "". |
sku | string | Defaults to "". |
metadata | object[] | Defaults to []. |
testMode | boolean | Defaults to false. |
javascript
const merchantId = process.env.VENUERUN_MERCHANT_ID;
const response = await fetch(`https://apiv2.venuerun.com/merchants/${merchantId}/products`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VENUERUN_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"title": "Tax rate host A1B2C3",
"priceMinor": 500,
"taxRateIds": [
"1cOodNs0bVJfGW9hT7uT",
"ujlkmYVH78TOMN2C7OGz"
],
"testMode": true
}),
});Response:
json
{
"id": "tn4mSfWhgRHoBrPpdtKe",
"title": "Tax rate host A1B2C3",
"priceMinor": 500,
"description": "",
"images": [],
"visible": true,
"taxRateIds": [
"1cOodNs0bVJfGW9hT7uT",
"ujlkmYVH78TOMN2C7OGz"
],
"calories": 0,
"modifiers": [],
"manageStock": false,
"stockQuantity": 0,
"type": "SIMPLE",
"upc": "",
"sku": "",
"metadata": [],
"testMode": true,
"createdAt": "2026-01-15T12:00:00.000Z",
"updatedAt": "2026-01-15T12:00:00.000Z"
}Retrieve a product
GET /merchants/:merchantId/products/:productId
javascript
const merchantId = process.env.VENUERUN_MERCHANT_ID;
const response = await fetch(`https://apiv2.venuerun.com/merchants/${merchantId}/products/fSKB8MfULvO4WHgirX19`, {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.VENUERUN_API_KEY}`,
},
});Response:
json
{
"id": "fSKB8MfULvO4WHgirX19",
"title": "Tax rate host A1B2C3",
"priceMinor": 500,
"description": "",
"images": [],
"visible": true,
"taxRateIds": [
"9by7gv6lVuyH19ZDwRaO"
],
"calories": 0,
"modifiers": [],
"manageStock": false,
"stockQuantity": 0,
"type": "SIMPLE",
"upc": "",
"sku": "",
"metadata": [],
"testMode": true,
"createdAt": "2026-01-15T12:00:00.000Z",
"updatedAt": "2026-01-15T12:00:00.000Z"
}Update a product (POST alias)
POST /merchants/:merchantId/products/:productId
Send only the fields you are changing — every attribute is optional.
javascript
const merchantId = process.env.VENUERUN_MERCHANT_ID;
const response = await fetch(`https://apiv2.venuerun.com/merchants/${merchantId}/products/L8UbZ4G4Z2HHWX1qXOXu`, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VENUERUN_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"priceMinor": 125
}),
});Response:
json
{
"id": "L8UbZ4G4Z2HHWX1qXOXu",
"title": "Test product A1B2C3",
"priceMinor": 125,
"description": "",
"images": [],
"visible": true,
"taxRateIds": [],
"calories": 0,
"modifiers": [],
"manageStock": false,
"stockQuantity": 0,
"type": "SIMPLE",
"upc": "",
"sku": "",
"metadata": [],
"testMode": true,
"createdAt": "2026-01-15T12:00:00.000Z",
"updatedAt": "2026-01-15T12:00:00.000Z"
}Update a product
PATCH /merchants/:merchantId/products/:productId
Send only the fields you are changing — every attribute is optional.
javascript
const merchantId = process.env.VENUERUN_MERCHANT_ID;
const response = await fetch(`https://apiv2.venuerun.com/merchants/${merchantId}/products/VhV3fuaB8Vz6KGbj6puu`, {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.VENUERUN_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"title": "Renamed"
}),
});Response:
json
{
"id": "VhV3fuaB8Vz6KGbj6puu",
"title": "Renamed",
"priceMinor": 999,
"description": "",
"images": [],
"visible": true,
"taxRateIds": [],
"calories": 0,
"modifiers": [],
"manageStock": false,
"stockQuantity": 0,
"type": "SIMPLE",
"upc": "",
"sku": "PATCH-A1B2C3",
"metadata": [],
"testMode": true,
"createdAt": "2026-01-15T12:00:00.000Z",
"updatedAt": "2026-01-15T12:00:00.000Z"
}Delete a product
DELETE /merchants/:merchantId/products/:productId
javascript
const merchantId = process.env.VENUERUN_MERCHANT_ID;
const response = await fetch(`https://apiv2.venuerun.com/merchants/${merchantId}/products/zFjK5tMRpyAy20Z3O7HG`, {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.VENUERUN_API_KEY}`,
},
});Response:
json
{
"id": "zFjK5tMRpyAy20Z3O7HG",
"object": {
"id": "zFjK5tMRpyAy20Z3O7HG",
"title": "Tax rate host A1B2C3",
"priceMinor": 500,
"description": "",
"images": [],
"visible": true,
"taxRateIds": [
"4WOJH0ZXYmdO3I0S09Rj",
"HYoJxQzPrHnxfmimGy2T"
],
"calories": 0,
"modifiers": [],
"manageStock": false,
"stockQuantity": 0,
"type": "SIMPLE",
"upc": "",
"sku": "",
"metadata": [],
"testMode": true,
"createdAt": "2026-01-15T12:00:00.000Z",
"updatedAt": "2026-01-15T12:00:00.000Z"
},
"message": "Product deleted",
"deleted": true
}Errors
Every error answers with a message. A request that fails validation is a 400:
json
{
"message": "An API key in test mode cannot create a live mode product."
}
