Skip to main content

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

get/restaurants/{ref}/productsrequires menu:readlistProducts

Every product, hidden ones included and flagged. With q, only those whose name or description contains the text.

Parameters

NameInDescription
ref*pathThe restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants
qqueryOnly 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

FieldTypeDescription
products*object[]
id*string
category_id*string
name*string
price*numberMajor units in the restaurant's currency
original_pricenumberPresent while the product is on promotion
descriptionstring
available*booleanfalse renders "Sin stock"
hidden*booleantrue keeps it off the public menu
has_image*boolean
image_urlstring
variants*object[]
id*string
name*string
min_selections*integermin -9007199254740991 · max 9007199254740991
max_selections*integer0 is no limitmin -9007199254740991 · max 9007199254740991
max_per_optionintegermin -9007199254740991 · max 9007199254740991
options*object[]
id*string
name*string
price*numberExtra charge on top of the product price
show*boolean
translationsobjectThe 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`.
translationsobjectThe 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`.
esobject
enobject
ptobject
frobject
deobject
itobject
translationsobjectName 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`.
esobject
namestring
descriptionstring
enobject
namestring
descriptionstring
ptobject
namestring
descriptionstring
frobject
namestring
descriptionstring
deobject
namestring
descriptionstring
itobject
namestring
descriptionstring
count*integermin -9007199254740991 · max 9007199254740991

Errors

  • 400 VALIDATION — a field is missing or malformed; `issues` names it
  • 401 UNAUTHORIZED — the key is missing, unknown or revoked
  • 402 NOT_PREMIUM — the restaurant has no active subscription or trial
  • 403 FORBIDDEN — the key lacks the scope this endpoint needs
  • 404 NOT_FOUND — no such restaurant in this account, or no such item in it
  • 500 INTERNAL — something failed on our side; retry in a moment

Create a product

post/restaurants/{ref}/productsrequires menu:writecreateProduct

Adds 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

NameInDescription
ref*pathThe restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants

Body (JSON)

FieldTypeDescription
category_id*stringThe category the product belongs to (from get_menu)up to 128 characters
name*stringProduct nameup to 50 characters
price*numberPrice in the restaurant's currency, in major units (12500 for COP $12.000, 5.99 for USD $5.99). Never cents.min 0
descriptionstringOptional description. Pass an empty string to remove it.up to 3000 characters
original_pricenumber | nullThe price before a promotion. Must be greater than price; the menu shows it struck through. Pass null to end the promotion.min 0
availablebooleanfalse shows the product as "Sin stock": visible but not orderable. Default true.
hiddenbooleantrue keeps the product off the public menu entirely. Default false.
variantsobject[]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*stringVariant name, e.g. "Tamaño" or "Adiciones"up to 50 characters
translationsobjectThe 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.
esobject
namestringThe name in that languageup to 50 characters
enobject
namestringThe name in that languageup to 50 characters
ptobject
namestringThe name in that languageup to 50 characters
frobject
namestringThe name in that languageup to 50 characters
deobject
namestringThe name in that languageup to 50 characters
itobject
namestringThe name in that languageup to 50 characters
min_selectionsintegerOptions the diner must pick. 0 makes the variant optional.min 0 · max 9007199254740991 · default 0
max_selectionsintegerOptions the diner may pick. 0 is no limit; 1 renders a single choice.min 0 · max 9007199254740991 · default 0
max_per_optionintegerHow many times one option may be repeated. Omit or 0 for no limit.min 0 · max 9007199254740991
options*object[]
name*stringOption name, e.g. "Grande"up to 50 characters
translationsobjectThe 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.
esobject
enobject
ptobject
frobject
deobject
itobject
pricenumberExtra charge for this option on top of the product price. 0 when it costs nothing.min 0 · default 0
showbooleanfalse hides the option from diners without deleting itdefault true
translationsobjectThe 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.
esobject
namestringThe product name in that languageup to 50 characters
descriptionstringThe description in that languageup to 3000 characters
enobject
namestringThe product name in that languageup to 50 characters
descriptionstringThe description in that languageup to 3000 characters
ptobject
namestringThe product name in that languageup to 50 characters
descriptionstringThe description in that languageup to 3000 characters
frobject
namestringThe product name in that languageup to 50 characters
descriptionstringThe description in that languageup to 3000 characters
deobject
namestringThe product name in that languageup to 50 characters
descriptionstringThe description in that languageup to 3000 characters
itobject
namestringThe product name in that languageup to 50 characters
descriptionstringThe 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

FieldTypeDescription
product*object
id*string
category_id*string
name*string
price*numberMajor units in the restaurant's currency
original_pricenumberPresent while the product is on promotion
descriptionstring
available*booleanfalse renders "Sin stock"
hidden*booleantrue keeps it off the public menu
has_image*boolean
image_urlstring
variants*object[]
id*string
name*string
min_selections*integermin -9007199254740991 · max 9007199254740991
max_selections*integer0 is no limitmin -9007199254740991 · max 9007199254740991
max_per_optionintegermin -9007199254740991 · max 9007199254740991
options*object[]
id*string
name*string
price*numberExtra charge on top of the product price
show*boolean
translationsobjectThe 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`.
translationsobjectThe 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`.
esobject
enobject
ptobject
frobject
deobject
itobject
translationsobjectName 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`.
esobject
namestring
descriptionstring
enobject
namestring
descriptionstring
ptobject
namestring
descriptionstring
frobject
namestring
descriptionstring
deobject
namestring
descriptionstring
itobject
namestring
descriptionstring

Errors

  • 400 VALIDATION — a field is missing or malformed; `issues` names it
  • 401 UNAUTHORIZED — the key is missing, unknown or revoked
  • 402 NOT_PREMIUM — the restaurant has no active subscription or trial
  • 403 FORBIDDEN — the key lacks the scope this endpoint needs
  • 404 NOT_FOUND — no such restaurant in this account, or no such item in it
  • 500 INTERNAL — something failed on our side; retry in a moment

Update many products

patch/restaurants/{ref}/productsrequires menu:writebulkUpdateProducts

Applies 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

NameInDescription
ref*pathThe restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants

Body (JSON)

FieldTypeDescription
updates*object[]Up to 50 products, each with only the fields to change
product_id*stringup to 128 characters
changes*object
category_idstringMove the product to another categoryup to 128 characters
namestringProduct nameup to 50 characters
pricenumberPrice in the restaurant's currency, in major units (12500 for COP $12.000, 5.99 for USD $5.99). Never cents.min 0
descriptionstringOptional description. Pass an empty string to remove it.up to 3000 characters
original_pricenumber | nullThe price before a promotion. Must be greater than price; the menu shows it struck through. Pass null to end the promotion.min 0
availablebooleanfalse shows the product as "Sin stock": visible but not orderable. Default true.
hiddenbooleantrue keeps the product off the public menu entirely. Default false.
variantsobject[]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*stringVariant name, e.g. "Tamaño" or "Adiciones"up to 50 characters
translationsobjectThe 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_selectionsintegerOptions the diner must pick. 0 makes the variant optional.min 0 · max 9007199254740991 · default 0
max_selectionsintegerOptions the diner may pick. 0 is no limit; 1 renders a single choice.min 0 · max 9007199254740991 · default 0
max_per_optionintegerHow many times one option may be repeated. Omit or 0 for no limit.min 0 · max 9007199254740991
options*object[]
translationsobjectThe 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.
esobject
enobject
ptobject
frobject
deobject
itobject

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

FieldTypeDescription
updated*integermin -9007199254740991 · max 9007199254740991

Errors

  • 400 VALIDATION — a field is missing or malformed; `issues` names it
  • 401 UNAUTHORIZED — the key is missing, unknown or revoked
  • 402 NOT_PREMIUM — the restaurant has no active subscription or trial
  • 403 FORBIDDEN — the key lacks the scope this endpoint needs
  • 404 NOT_FOUND — no such restaurant in this account, or no such item in it
  • 500 INTERNAL — something failed on our side; retry in a moment

Get a product

get/restaurants/{ref}/products/{id}requires menu:readgetProduct

translations is present only where something is translated: on the product (name, description) and inside each variant and option (name).

Parameters

NameInDescription
ref*pathThe restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants
id*pathThe 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

FieldTypeDescription
product*object
id*string
category_id*string
name*string
price*numberMajor units in the restaurant's currency
original_pricenumberPresent while the product is on promotion
descriptionstring
available*booleanfalse renders "Sin stock"
hidden*booleantrue keeps it off the public menu
has_image*boolean
image_urlstring
variants*object[]
id*string
name*string
min_selections*integermin -9007199254740991 · max 9007199254740991
max_selections*integer0 is no limitmin -9007199254740991 · max 9007199254740991
max_per_optionintegermin -9007199254740991 · max 9007199254740991
options*object[]
id*string
name*string
price*numberExtra charge on top of the product price
show*boolean
translationsobjectThe 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`.
translationsobjectThe 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`.
esobject
enobject
ptobject
frobject
deobject
itobject
translationsobjectName 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`.
esobject
namestring
descriptionstring
enobject
namestring
descriptionstring
ptobject
namestring
descriptionstring
frobject
namestring
descriptionstring
deobject
namestring
descriptionstring
itobject
namestring
descriptionstring

Errors

  • 401 UNAUTHORIZED — the key is missing, unknown or revoked
  • 402 NOT_PREMIUM — the restaurant has no active subscription or trial
  • 403 FORBIDDEN — the key lacks the scope this endpoint needs
  • 404 NOT_FOUND — no such restaurant in this account, or no such item in it
  • 500 INTERNAL — something failed on our side; retry in a moment

Update a product

patch/restaurants/{ref}/products/{id}requires menu:writeupdateProduct

Changes 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

NameInDescription
ref*pathThe restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants
id*pathThe product id, from GET /restaurants/{ref}/products

Body (JSON)

FieldTypeDescription
category_idstringMove the product to another categoryup to 128 characters
namestringProduct nameup to 50 characters
pricenumberPrice in the restaurant's currency, in major units (12500 for COP $12.000, 5.99 for USD $5.99). Never cents.min 0
descriptionstringOptional description. Pass an empty string to remove it.up to 3000 characters
original_pricenumber | nullThe price before a promotion. Must be greater than price; the menu shows it struck through. Pass null to end the promotion.min 0
availablebooleanfalse shows the product as "Sin stock": visible but not orderable. Default true.
hiddenbooleantrue keeps the product off the public menu entirely. Default false.
variantsobject[]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*stringVariant name, e.g. "Tamaño" or "Adiciones"up to 50 characters
translationsobjectThe 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.
esobject
namestringThe name in that languageup to 50 characters
enobject
namestringThe name in that languageup to 50 characters
ptobject
namestringThe name in that languageup to 50 characters
frobject
namestringThe name in that languageup to 50 characters
deobject
namestringThe name in that languageup to 50 characters
itobject
namestringThe name in that languageup to 50 characters
min_selectionsintegerOptions the diner must pick. 0 makes the variant optional.min 0 · max 9007199254740991 · default 0
max_selectionsintegerOptions the diner may pick. 0 is no limit; 1 renders a single choice.min 0 · max 9007199254740991 · default 0
max_per_optionintegerHow many times one option may be repeated. Omit or 0 for no limit.min 0 · max 9007199254740991
options*object[]
name*stringOption name, e.g. "Grande"up to 50 characters
translationsobjectThe 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.
esobject
enobject
ptobject
frobject
deobject
itobject
pricenumberExtra charge for this option on top of the product price. 0 when it costs nothing.min 0 · default 0
showbooleanfalse hides the option from diners without deleting itdefault true
translationsobjectThe 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.
esobject
namestringThe product name in that languageup to 50 characters
descriptionstringThe description in that languageup to 3000 characters
enobject
namestringThe product name in that languageup to 50 characters
descriptionstringThe description in that languageup to 3000 characters
ptobject
namestringThe product name in that languageup to 50 characters
descriptionstringThe description in that languageup to 3000 characters
frobject
namestringThe product name in that languageup to 50 characters
descriptionstringThe description in that languageup to 3000 characters
deobject
namestringThe product name in that languageup to 50 characters
descriptionstringThe description in that languageup to 3000 characters
itobject
namestringThe product name in that languageup to 50 characters
descriptionstringThe 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

FieldTypeDescription
product*object
id*string
category_id*string
name*string
price*numberMajor units in the restaurant's currency
original_pricenumberPresent while the product is on promotion
descriptionstring
available*booleanfalse renders "Sin stock"
hidden*booleantrue keeps it off the public menu
has_image*boolean
image_urlstring
variants*object[]
id*string
name*string
min_selections*integermin -9007199254740991 · max 9007199254740991
max_selections*integer0 is no limitmin -9007199254740991 · max 9007199254740991
max_per_optionintegermin -9007199254740991 · max 9007199254740991
options*object[]
id*string
name*string
price*numberExtra charge on top of the product price
show*boolean
translationsobjectThe 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`.
translationsobjectThe 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`.
esobject
enobject
ptobject
frobject
deobject
itobject
translationsobjectName 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`.
esobject
namestring
descriptionstring
enobject
namestring
descriptionstring
ptobject
namestring
descriptionstring
frobject
namestring
descriptionstring
deobject
namestring
descriptionstring
itobject
namestring
descriptionstring

Errors

  • 400 VALIDATION — a field is missing or malformed; `issues` names it
  • 401 UNAUTHORIZED — the key is missing, unknown or revoked
  • 402 NOT_PREMIUM — the restaurant has no active subscription or trial
  • 403 FORBIDDEN — the key lacks the scope this endpoint needs
  • 404 NOT_FOUND — no such restaurant in this account, or no such item in it
  • 500 INTERNAL — something failed on our side; retry in a moment

Delete a product

delete/restaurants/{ref}/products/{id}requires menu:writedeleteProduct

Permanent, photo included. Prefer hidden: true when the owner may want it back.

Parameters

NameInDescription
ref*pathThe restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants
id*pathThe 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

FieldTypeDescription
deleted*string

Errors

  • 401 UNAUTHORIZED — the key is missing, unknown or revoked
  • 402 NOT_PREMIUM — the restaurant has no active subscription or trial
  • 403 FORBIDDEN — the key lacks the scope this endpoint needs
  • 404 NOT_FOUND — no such restaurant in this account, or no such item in it
  • 500 INTERNAL — something failed on our side; retry in a moment

Developers