- Developers
- API reference
- Products
Products
List, create, edit and delete products, one at a time or many at once.
Every operation comes with its curl and an example response; the keys and ids in the examples are made up. Fields marked with * are required.
List or search the products
/restaurants/{ref}/productsrequires menu:readlistProductsEvery product, hidden ones included and flagged. With q, only those whose name or description contains the text.
Parameters
| Name | In | Description |
|---|---|---|
ref* | path | The restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants |
q | query | Only products whose name or description contains this text (accent- and case-insensitive)up to 100 characters |
Example
curl -X GET "https://delimenu.co/api/v1/restaurants/pizzeria-roma/products?q=margarita" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Response 200
{
"products": [
{
"id": "p9Hs4TqL2mNc8VbX6Rdy",
"category_id": "k3Qm8vXb2LpN7wRt1YaZ",
"name": "Pizza Margarita",
"price": 32000,
"original_price": 38000,
"description": "Tomate, mozzarella y albahaca fresca",
"available": true,
"hidden": false,
"has_image": true,
"image_url": "https://firebasestorage.googleapis.com/v0/b/example/o/margarita_1080x1080.jpg?alt=media",
"variants": [
{
"id": "26fed9f6-2e3b-4310-b899-5641bf98e2f0",
"name": "Tamaño",
"min_selections": 1,
"max_selections": 1,
"options": [
{
"id": "5c4f8896-06a3-4482-99d1-185a909d0415",
"name": "Personal",
"price": 0,
"show": true
},
{
"id": "b1e0c4d2-7f3a-4c8e-9d21-0a5f6e7b8c9d",
"name": "Familiar",
"price": 12000,
"show": true
}
]
}
]
}
],
"count": 1
}Response fields
| Field | Type | Description |
|---|---|---|
products* | object[] | |
id* | string | |
category_id* | string | |
name* | string | |
price* | number | Major units in the restaurant's currency |
original_price | number | Present while the product is on promotion |
description | string | |
available* | boolean | false renders "Sin stock" |
hidden* | boolean | true keeps it off the public menu |
has_image* | boolean | |
image_url | string | |
variants* | object[] | |
id* | string | |
name* | string | |
min_selections* | integer | min -9007199254740991 · max 9007199254740991 |
max_selections* | integer | 0 is no limitmin -9007199254740991 · max 9007199254740991 |
max_per_option | integer | min -9007199254740991 · max 9007199254740991 |
options* | object[] | |
id* | string | |
name* | string | |
price* | number | Extra charge on top of the product price |
show* | boolean | |
translations | object | The name in other languages, keyed by language code, e.g. { "en": { "name": "Large" } }. Absent when nothing is translated; a language missing here falls back to `name`. |
translations | object | The name in other languages, keyed by language code, e.g. { "en": { "name": "Large" } }. Absent when nothing is translated; a language missing here falls back to `name`. |
es | object | |
en | object | |
pt | object | |
fr | object | |
de | object | |
it | object | |
translations | object | Name and description in other languages, keyed by language code. Absent when nothing is translated; a language or field missing here falls back to `name` / `description`. |
es | object | |
name | string | |
description | string | |
en | object | |
name | string | |
description | string | |
pt | object | |
name | string | |
description | string | |
fr | object | |
name | string | |
description | string | |
de | object | |
name | string | |
description | string | |
it | object | |
name | string | |
description | string | |
count* | integer | min -9007199254740991 · max 9007199254740991 |
Errors
400VALIDATION — a field is missing or malformed; `issues` names it401UNAUTHORIZED — the key is missing, unknown or revoked402NOT_PREMIUM — the restaurant has no active subscription or trial403FORBIDDEN — the key lacks the scope this endpoint needs404NOT_FOUND — no such restaurant in this account, or no such item in it500INTERNAL — something failed on our side; retry in a moment
Create a product
/restaurants/{ref}/productsrequires menu:writecreateProductAdds a product to a category, at the end. Price is in the restaurant's currency, major units. Variants are optional choices (sizes, extras) with their own option prices.
Parameters
| Name | In | Description |
|---|---|---|
ref* | path | The restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants |
Body (JSON)
| Field | Type | Description |
|---|---|---|
category_id* | string | The category the product belongs to (from get_menu)up to 128 characters |
name* | string | Product nameup to 50 characters |
price* | number | Price in the restaurant's currency, in major units (12500 for COP $12.000, 5.99 for USD $5.99). Never cents.min 0 |
description | string | Optional description. Pass an empty string to remove it.up to 3000 characters |
original_price | number | null | The price before a promotion. Must be greater than price; the menu shows it struck through. Pass null to end the promotion.min 0 |
available | boolean | false shows the product as "Sin stock": visible but not orderable. Default true. |
hidden | boolean | true keeps the product off the public menu entirely. Default false. |
variants | object[] | Choices the diner makes (sizes, extras). Replaces the whole list when provided; a variant or option sent without translations keeps the ones stored under the same name. |
name* | string | Variant name, e.g. "Tamaño" or "Adiciones"up to 50 characters |
translations | object | The variant name in the menu's other languages, e.g. { "en": { "name": "Size" } }. Omit it to keep the translations of the stored variant with the same name; {} removes them. |
es | object | |
name | string | The name in that languageup to 50 characters |
en | object | |
name | string | The name in that languageup to 50 characters |
pt | object | |
name | string | The name in that languageup to 50 characters |
fr | object | |
name | string | The name in that languageup to 50 characters |
de | object | |
name | string | The name in that languageup to 50 characters |
it | object | |
name | string | The name in that languageup to 50 characters |
min_selections | integer | Options the diner must pick. 0 makes the variant optional.min 0 · max 9007199254740991 · default 0 |
max_selections | integer | Options the diner may pick. 0 is no limit; 1 renders a single choice.min 0 · max 9007199254740991 · default 0 |
max_per_option | integer | How many times one option may be repeated. Omit or 0 for no limit.min 0 · max 9007199254740991 |
options* | object[] | |
name* | string | Option name, e.g. "Grande"up to 50 characters |
translations | object | The option name in the menu's other languages, e.g. { "en": { "name": "Large" } }. Omit it to keep the translations of the stored option with the same name; {} removes them. |
es | object | |
en | object | |
pt | object | |
fr | object | |
de | object | |
it | object | |
price | number | Extra charge for this option on top of the product price. 0 when it costs nothing.min 0 · default 0 |
show | boolean | false hides the option from diners without deleting itdefault true |
translations | object | The product name and description in the menu's other languages, e.g. { "en": { "name": "Lemonade", "description": "Freshly squeezed" } }. Keyed by language code (es, en, pt, fr, de, it). Shown to diners who read the menu in that language; a language without a translation falls back to the original text, and an entry in the menu's primary language is ignored. Replaces the whole map when provided; {} removes every translation. Variant and option names are translated inside each variant and option. |
es | object | |
name | string | The product name in that languageup to 50 characters |
description | string | The description in that languageup to 3000 characters |
en | object | |
name | string | The product name in that languageup to 50 characters |
description | string | The description in that languageup to 3000 characters |
pt | object | |
name | string | The product name in that languageup to 50 characters |
description | string | The description in that languageup to 3000 characters |
fr | object | |
name | string | The product name in that languageup to 50 characters |
description | string | The description in that languageup to 3000 characters |
de | object | |
name | string | The product name in that languageup to 50 characters |
description | string | The description in that languageup to 3000 characters |
it | object | |
name | string | The product name in that languageup to 50 characters |
description | string | The description in that languageup to 3000 characters |
Example
curl -X POST "https://delimenu.co/api/v1/restaurants/pizzeria-roma/products" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"category_id":"k3Qm8vXb2LpN7wRt1YaZ","name":"Pizza Margarita","price":32000,"description":"Tomate, mozzarella y albahaca fresca","variants":[{"name":"Tamaño","min_selections":1,"max_selections":1,"options":[{"name":"Personal","price":0},{"name":"Familiar","price":12000}]}]}'Response 201
{
"product": {
"id": "p9Hs4TqL2mNc8VbX6Rdy",
"category_id": "k3Qm8vXb2LpN7wRt1YaZ",
"name": "Pizza Margarita",
"price": 32000,
"description": "Tomate, mozzarella y albahaca fresca",
"available": true,
"hidden": false,
"has_image": true,
"image_url": "https://firebasestorage.googleapis.com/v0/b/example/o/margarita_1080x1080.jpg?alt=media",
"variants": [
{
"id": "26fed9f6-2e3b-4310-b899-5641bf98e2f0",
"name": "Tamaño",
"min_selections": 1,
"max_selections": 1,
"options": [
{
"id": "5c4f8896-06a3-4482-99d1-185a909d0415",
"name": "Personal",
"price": 0,
"show": true
},
{
"id": "b1e0c4d2-7f3a-4c8e-9d21-0a5f6e7b8c9d",
"name": "Familiar",
"price": 12000,
"show": true
}
]
}
]
}
}Response fields
| Field | Type | Description |
|---|---|---|
product* | object | |
id* | string | |
category_id* | string | |
name* | string | |
price* | number | Major units in the restaurant's currency |
original_price | number | Present while the product is on promotion |
description | string | |
available* | boolean | false renders "Sin stock" |
hidden* | boolean | true keeps it off the public menu |
has_image* | boolean | |
image_url | string | |
variants* | object[] | |
id* | string | |
name* | string | |
min_selections* | integer | min -9007199254740991 · max 9007199254740991 |
max_selections* | integer | 0 is no limitmin -9007199254740991 · max 9007199254740991 |
max_per_option | integer | min -9007199254740991 · max 9007199254740991 |
options* | object[] | |
id* | string | |
name* | string | |
price* | number | Extra charge on top of the product price |
show* | boolean | |
translations | object | The name in other languages, keyed by language code, e.g. { "en": { "name": "Large" } }. Absent when nothing is translated; a language missing here falls back to `name`. |
translations | object | The name in other languages, keyed by language code, e.g. { "en": { "name": "Large" } }. Absent when nothing is translated; a language missing here falls back to `name`. |
es | object | |
en | object | |
pt | object | |
fr | object | |
de | object | |
it | object | |
translations | object | Name and description in other languages, keyed by language code. Absent when nothing is translated; a language or field missing here falls back to `name` / `description`. |
es | object | |
name | string | |
description | string | |
en | object | |
name | string | |
description | string | |
pt | object | |
name | string | |
description | string | |
fr | object | |
name | string | |
description | string | |
de | object | |
name | string | |
description | string | |
it | object | |
name | string | |
description | string |
Errors
400VALIDATION — a field is missing or malformed; `issues` names it401UNAUTHORIZED — the key is missing, unknown or revoked402NOT_PREMIUM — the restaurant has no active subscription or trial403FORBIDDEN — the key lacks the scope this endpoint needs404NOT_FOUND — no such restaurant in this account, or no such item in it500INTERNAL — something failed on our side; retry in a moment
Update many products
/restaurants/{ref}/productsrequires menu:writebulkUpdateProductsApplies a patch to up to 50 products in one write — for "raise every price 10%" or "mark these as out of stock". Same fields as updating one product.
Parameters
| Name | In | Description |
|---|---|---|
ref* | path | The restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants |
Body (JSON)
| Field | Type | Description |
|---|---|---|
updates* | object[] | Up to 50 products, each with only the fields to change |
product_id* | string | up to 128 characters |
changes* | object | |
category_id | string | Move the product to another categoryup to 128 characters |
name | string | Product nameup to 50 characters |
price | number | Price in the restaurant's currency, in major units (12500 for COP $12.000, 5.99 for USD $5.99). Never cents.min 0 |
description | string | Optional description. Pass an empty string to remove it.up to 3000 characters |
original_price | number | null | The price before a promotion. Must be greater than price; the menu shows it struck through. Pass null to end the promotion.min 0 |
available | boolean | false shows the product as "Sin stock": visible but not orderable. Default true. |
hidden | boolean | true keeps the product off the public menu entirely. Default false. |
variants | object[] | Choices the diner makes (sizes, extras). Replaces the whole list when provided; a variant or option sent without translations keeps the ones stored under the same name. |
name* | string | Variant name, e.g. "Tamaño" or "Adiciones"up to 50 characters |
translations | object | The variant name in the menu's other languages, e.g. { "en": { "name": "Size" } }. Omit it to keep the translations of the stored variant with the same name; {} removes them. |
min_selections | integer | Options the diner must pick. 0 makes the variant optional.min 0 · max 9007199254740991 · default 0 |
max_selections | integer | Options the diner may pick. 0 is no limit; 1 renders a single choice.min 0 · max 9007199254740991 · default 0 |
max_per_option | integer | How many times one option may be repeated. Omit or 0 for no limit.min 0 · max 9007199254740991 |
options* | object[] | |
translations | object | The product name and description in the menu's other languages, e.g. { "en": { "name": "Lemonade", "description": "Freshly squeezed" } }. Keyed by language code (es, en, pt, fr, de, it). Shown to diners who read the menu in that language; a language without a translation falls back to the original text, and an entry in the menu's primary language is ignored. Replaces the whole map when provided; {} removes every translation. Variant and option names are translated inside each variant and option. |
es | object | |
en | object | |
pt | object | |
fr | object | |
de | object | |
it | object |
Example
curl -X PATCH "https://delimenu.co/api/v1/restaurants/pizzeria-roma/products" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"updates":[{"product_id":"p9Hs4TqL2mNc8VbX6Rdy","changes":{"price":35000}},{"product_id":"q2Jk5Lm8Np1Qr4St7Uv0","changes":{"available":false}}]}'Response 200
{
"updated": 2
}Response fields
| Field | Type | Description |
|---|---|---|
updated* | integer | min -9007199254740991 · max 9007199254740991 |
Errors
400VALIDATION — a field is missing or malformed; `issues` names it401UNAUTHORIZED — the key is missing, unknown or revoked402NOT_PREMIUM — the restaurant has no active subscription or trial403FORBIDDEN — the key lacks the scope this endpoint needs404NOT_FOUND — no such restaurant in this account, or no such item in it500INTERNAL — something failed on our side; retry in a moment
Get a product
/restaurants/{ref}/products/{id}requires menu:readgetProducttranslations is present only where something is translated: on the product (name, description) and inside each variant and option (name).
Parameters
| Name | In | Description |
|---|---|---|
ref* | path | The restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants |
id* | path | The product id, from GET /restaurants/{ref}/products |
Example
curl -X GET "https://delimenu.co/api/v1/restaurants/pizzeria-roma/products/p9Hs4TqL2mNc8VbX6Rdy" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Response 200
{
"product": {
"id": "p9Hs4TqL2mNc8VbX6Rdy",
"category_id": "k3Qm8vXb2LpN7wRt1YaZ",
"name": "Pizza Margarita",
"price": 32000,
"original_price": 38000,
"description": "Tomate, mozzarella y albahaca fresca",
"available": true,
"hidden": false,
"has_image": true,
"image_url": "https://firebasestorage.googleapis.com/v0/b/example/o/margarita_1080x1080.jpg?alt=media",
"variants": [
{
"id": "26fed9f6-2e3b-4310-b899-5641bf98e2f0",
"name": "Tamaño",
"min_selections": 1,
"max_selections": 1,
"options": [
{
"id": "5c4f8896-06a3-4482-99d1-185a909d0415",
"name": "Personal",
"price": 0,
"show": true
},
{
"id": "b1e0c4d2-7f3a-4c8e-9d21-0a5f6e7b8c9d",
"name": "Familiar",
"price": 12000,
"show": true,
"translations": {
"en": {
"name": "Family"
}
}
}
],
"translations": {
"en": {
"name": "Size"
}
}
}
],
"translations": {
"en": {
"name": "Margherita Pizza",
"description": "Tomato, mozzarella and fresh basil"
}
}
}
}Response fields
| Field | Type | Description |
|---|---|---|
product* | object | |
id* | string | |
category_id* | string | |
name* | string | |
price* | number | Major units in the restaurant's currency |
original_price | number | Present while the product is on promotion |
description | string | |
available* | boolean | false renders "Sin stock" |
hidden* | boolean | true keeps it off the public menu |
has_image* | boolean | |
image_url | string | |
variants* | object[] | |
id* | string | |
name* | string | |
min_selections* | integer | min -9007199254740991 · max 9007199254740991 |
max_selections* | integer | 0 is no limitmin -9007199254740991 · max 9007199254740991 |
max_per_option | integer | min -9007199254740991 · max 9007199254740991 |
options* | object[] | |
id* | string | |
name* | string | |
price* | number | Extra charge on top of the product price |
show* | boolean | |
translations | object | The name in other languages, keyed by language code, e.g. { "en": { "name": "Large" } }. Absent when nothing is translated; a language missing here falls back to `name`. |
translations | object | The name in other languages, keyed by language code, e.g. { "en": { "name": "Large" } }. Absent when nothing is translated; a language missing here falls back to `name`. |
es | object | |
en | object | |
pt | object | |
fr | object | |
de | object | |
it | object | |
translations | object | Name and description in other languages, keyed by language code. Absent when nothing is translated; a language or field missing here falls back to `name` / `description`. |
es | object | |
name | string | |
description | string | |
en | object | |
name | string | |
description | string | |
pt | object | |
name | string | |
description | string | |
fr | object | |
name | string | |
description | string | |
de | object | |
name | string | |
description | string | |
it | object | |
name | string | |
description | string |
Errors
401UNAUTHORIZED — the key is missing, unknown or revoked402NOT_PREMIUM — the restaurant has no active subscription or trial403FORBIDDEN — the key lacks the scope this endpoint needs404NOT_FOUND — no such restaurant in this account, or no such item in it500INTERNAL — something failed on our side; retry in a moment
Update a product
/restaurants/{ref}/products/{id}requires menu:writeupdateProductChanges only the fields given: name, price, description, original_price (promotion), available, hidden, variants (replaces all), translations (replaces all) or category_id (moves it). Raising price above an existing original_price ends the promotion. A variant or option sent without translations keeps the ones stored under the same name, so repricing an option does not erase them; send translations: {} on it to remove them.
Parameters
| Name | In | Description |
|---|---|---|
ref* | path | The restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants |
id* | path | The product id, from GET /restaurants/{ref}/products |
Body (JSON)
| Field | Type | Description |
|---|---|---|
category_id | string | Move the product to another categoryup to 128 characters |
name | string | Product nameup to 50 characters |
price | number | Price in the restaurant's currency, in major units (12500 for COP $12.000, 5.99 for USD $5.99). Never cents.min 0 |
description | string | Optional description. Pass an empty string to remove it.up to 3000 characters |
original_price | number | null | The price before a promotion. Must be greater than price; the menu shows it struck through. Pass null to end the promotion.min 0 |
available | boolean | false shows the product as "Sin stock": visible but not orderable. Default true. |
hidden | boolean | true keeps the product off the public menu entirely. Default false. |
variants | object[] | Choices the diner makes (sizes, extras). Replaces the whole list when provided; a variant or option sent without translations keeps the ones stored under the same name. |
name* | string | Variant name, e.g. "Tamaño" or "Adiciones"up to 50 characters |
translations | object | The variant name in the menu's other languages, e.g. { "en": { "name": "Size" } }. Omit it to keep the translations of the stored variant with the same name; {} removes them. |
es | object | |
name | string | The name in that languageup to 50 characters |
en | object | |
name | string | The name in that languageup to 50 characters |
pt | object | |
name | string | The name in that languageup to 50 characters |
fr | object | |
name | string | The name in that languageup to 50 characters |
de | object | |
name | string | The name in that languageup to 50 characters |
it | object | |
name | string | The name in that languageup to 50 characters |
min_selections | integer | Options the diner must pick. 0 makes the variant optional.min 0 · max 9007199254740991 · default 0 |
max_selections | integer | Options the diner may pick. 0 is no limit; 1 renders a single choice.min 0 · max 9007199254740991 · default 0 |
max_per_option | integer | How many times one option may be repeated. Omit or 0 for no limit.min 0 · max 9007199254740991 |
options* | object[] | |
name* | string | Option name, e.g. "Grande"up to 50 characters |
translations | object | The option name in the menu's other languages, e.g. { "en": { "name": "Large" } }. Omit it to keep the translations of the stored option with the same name; {} removes them. |
es | object | |
en | object | |
pt | object | |
fr | object | |
de | object | |
it | object | |
price | number | Extra charge for this option on top of the product price. 0 when it costs nothing.min 0 · default 0 |
show | boolean | false hides the option from diners without deleting itdefault true |
translations | object | The product name and description in the menu's other languages, e.g. { "en": { "name": "Lemonade", "description": "Freshly squeezed" } }. Keyed by language code (es, en, pt, fr, de, it). Shown to diners who read the menu in that language; a language without a translation falls back to the original text, and an entry in the menu's primary language is ignored. Replaces the whole map when provided; {} removes every translation. Variant and option names are translated inside each variant and option. |
es | object | |
name | string | The product name in that languageup to 50 characters |
description | string | The description in that languageup to 3000 characters |
en | object | |
name | string | The product name in that languageup to 50 characters |
description | string | The description in that languageup to 3000 characters |
pt | object | |
name | string | The product name in that languageup to 50 characters |
description | string | The description in that languageup to 3000 characters |
fr | object | |
name | string | The product name in that languageup to 50 characters |
description | string | The description in that languageup to 3000 characters |
de | object | |
name | string | The product name in that languageup to 50 characters |
description | string | The description in that languageup to 3000 characters |
it | object | |
name | string | The product name in that languageup to 50 characters |
description | string | The description in that languageup to 3000 characters |
Example
curl -X PATCH "https://delimenu.co/api/v1/restaurants/pizzeria-roma/products/p9Hs4TqL2mNc8VbX6Rdy" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"price":30000,"original_price":38000,"translations":{"en":{"name":"Margherita Pizza","description":"Tomato, mozzarella and fresh basil"}}}'Response 200
{
"product": {
"id": "p9Hs4TqL2mNc8VbX6Rdy",
"category_id": "k3Qm8vXb2LpN7wRt1YaZ",
"name": "Pizza Margarita",
"price": 30000,
"original_price": 38000,
"description": "Tomate, mozzarella y albahaca fresca",
"available": true,
"hidden": false,
"has_image": true,
"image_url": "https://firebasestorage.googleapis.com/v0/b/example/o/margarita_1080x1080.jpg?alt=media",
"variants": [
{
"id": "26fed9f6-2e3b-4310-b899-5641bf98e2f0",
"name": "Tamaño",
"min_selections": 1,
"max_selections": 1,
"options": [
{
"id": "5c4f8896-06a3-4482-99d1-185a909d0415",
"name": "Personal",
"price": 0,
"show": true
},
{
"id": "b1e0c4d2-7f3a-4c8e-9d21-0a5f6e7b8c9d",
"name": "Familiar",
"price": 12000,
"show": true,
"translations": {
"en": {
"name": "Family"
}
}
}
],
"translations": {
"en": {
"name": "Size"
}
}
}
],
"translations": {
"en": {
"name": "Margherita Pizza",
"description": "Tomato, mozzarella and fresh basil"
}
}
}
}Response fields
| Field | Type | Description |
|---|---|---|
product* | object | |
id* | string | |
category_id* | string | |
name* | string | |
price* | number | Major units in the restaurant's currency |
original_price | number | Present while the product is on promotion |
description | string | |
available* | boolean | false renders "Sin stock" |
hidden* | boolean | true keeps it off the public menu |
has_image* | boolean | |
image_url | string | |
variants* | object[] | |
id* | string | |
name* | string | |
min_selections* | integer | min -9007199254740991 · max 9007199254740991 |
max_selections* | integer | 0 is no limitmin -9007199254740991 · max 9007199254740991 |
max_per_option | integer | min -9007199254740991 · max 9007199254740991 |
options* | object[] | |
id* | string | |
name* | string | |
price* | number | Extra charge on top of the product price |
show* | boolean | |
translations | object | The name in other languages, keyed by language code, e.g. { "en": { "name": "Large" } }. Absent when nothing is translated; a language missing here falls back to `name`. |
translations | object | The name in other languages, keyed by language code, e.g. { "en": { "name": "Large" } }. Absent when nothing is translated; a language missing here falls back to `name`. |
es | object | |
en | object | |
pt | object | |
fr | object | |
de | object | |
it | object | |
translations | object | Name and description in other languages, keyed by language code. Absent when nothing is translated; a language or field missing here falls back to `name` / `description`. |
es | object | |
name | string | |
description | string | |
en | object | |
name | string | |
description | string | |
pt | object | |
name | string | |
description | string | |
fr | object | |
name | string | |
description | string | |
de | object | |
name | string | |
description | string | |
it | object | |
name | string | |
description | string |
Errors
400VALIDATION — a field is missing or malformed; `issues` names it401UNAUTHORIZED — the key is missing, unknown or revoked402NOT_PREMIUM — the restaurant has no active subscription or trial403FORBIDDEN — the key lacks the scope this endpoint needs404NOT_FOUND — no such restaurant in this account, or no such item in it500INTERNAL — something failed on our side; retry in a moment
Delete a product
/restaurants/{ref}/products/{id}requires menu:writedeleteProductPermanent, photo included. Prefer hidden: true when the owner may want it back.
Parameters
| Name | In | Description |
|---|---|---|
ref* | path | The restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants |
id* | path | The product id, from GET /restaurants/{ref}/products |
Example
curl -X DELETE "https://delimenu.co/api/v1/restaurants/pizzeria-roma/products/p9Hs4TqL2mNc8VbX6Rdy" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Response 200
{
"deleted": "p9Hs4TqL2mNc8VbX6Rdy"
}Response fields
| Field | Type | Description |
|---|---|---|
deleted* | string |
Errors
401UNAUTHORIZED — the key is missing, unknown or revoked402NOT_PREMIUM — the restaurant has no active subscription or trial403FORBIDDEN — the key lacks the scope this endpoint needs404NOT_FOUND — no such restaurant in this account, or no such item in it500INTERNAL — something failed on our side; retry in a moment