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/:productId

The product object

FieldTypeDescription
idstring (read-only)Unique identifier, assigned by VenueRun.
createdAtstring (read-only)When it was created (ISO 8601).
updatedAtstring (read-only)When it last changed (ISO 8601).
titlestring
priceMinorintegerThe price in cents (integer minor units): 450 is $4.50. Every amount an order quotes is in the same unit.
descriptionstringDefaults to "".
imagesstring[]Defaults to [].
visiblebooleanDefaults to true.
taxRateIdsstring[]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 [].
caloriesnumberDefaults to 0.
modifiersstring[]Modifier document ids attached to this product. Defaults to [].
manageStockbooleanDefaults to false.
stockQuantitynumberDefaults to 0.
type"SIMPLE"Defaults to "SIMPLE".
upcstringDefaults to "".
skustringDefaults to "".
metadataobject[]Defaults to [].
searchHelpersobject
↳ titlestring
↳ priceMinorintegerThe price in cents (integer minor units): 450 is $4.50. Every amount an order quotes is in the same unit.
testModebooleanDefaults 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

FieldTypeDescription
titlestring
priceMinorintegerThe price in cents (integer minor units): 450 is $4.50. Every amount an order quotes is in the same unit.

Optional attributes

FieldTypeDescription
descriptionstringDefaults to "".
imagesstring[]Defaults to [].
visiblebooleanDefaults to true.
taxRateIdsstring[]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 [].
caloriesnumber
modifiersstring[]Modifier document ids attached to this product. Defaults to [].
manageStockbooleanDefaults to false.
stockQuantitynumber
type"SIMPLE"Defaults to "SIMPLE".
upcstringDefaults to "".
skustringDefaults to "".
metadataobject[]Defaults to [].
testModebooleanDefaults 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."
}