- Desarrolladores
- Referencia de la API
- Restaurantes
Restaurantes
Los restaurantes de la cuenta de la clave: listarlos, leer su menú completo y editar sus datos.
The restaurants of the account the key belongs to.
Cada operación trae su curl y su respuesta de ejemplo; las claves y los ids de los ejemplos son ficticios. Los campos marcados con * son obligatorios.
List the restaurants of the account
/restaurantsrequiere menu:readlistRestaurantsCall this first; every other endpoint takes one of these by identifier or id.
Ejemplo
curl -X GET "https://delimenu.co/api/v1/restaurants" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Respuesta 200
{
"restaurants": [
{
"id": "aR3kX9pLm2QzT7vN4bYc",
"identifier": "pizzeria-roma",
"name": "Pizzería Roma",
"currency": "COP",
"type": "whatsapp",
"phone": "+573001234567",
"address": "Calle 10 # 5-20, Bogotá",
"menu_url": "https://delimenu.co/pizzeria-roma",
"logo_url": "https://firebasestorage.googleapis.com/v0/b/example/o/logo_512x512.png?alt=media",
"banner_url": null,
"language": "es",
"languages": [
"en"
],
"trial_active": false
}
]
}Campos de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
restaurants* | object[] | |
id* | string | |
identifier* | string | |
name* | string | |
currency* | string | ISO 4217 code every price is in |
type* | "whatsapp" | "read_only" | "whatsapp" takes orders by WhatsApp; "read_only" only shows the menu |
phone* | string | null | WhatsApp number in E.164, when ordering is enabled |
address* | string | null | |
menu_url* | string | |
logo_url* | string | null | |
banner_url* | string | null | |
language* | "es" | "en" | "pt" | "fr" | "de" | "it" | The primary language: the one name, description and every untranslated field are written in |
languages* | "es" | "en" | "pt" | "fr" | "de" | "it"[] | The additional languages diners can read the menu in, translated through `translations`. Empty for a menu in one language. |
trial_active* | boolean |
Errores
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
Get a restaurant
/restaurants/{ref}requiere menu:readgetRestaurantParámetros
| Nombre | Dónde | Descripción |
|---|---|---|
ref* | ruta | The restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants |
Ejemplo
curl -X GET "https://delimenu.co/api/v1/restaurants/pizzeria-roma" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Respuesta 200
{
"restaurant": {
"id": "aR3kX9pLm2QzT7vN4bYc",
"identifier": "pizzeria-roma",
"name": "Pizzería Roma",
"currency": "COP",
"type": "whatsapp",
"phone": "+573001234567",
"address": "Calle 10 # 5-20, Bogotá",
"menu_url": "https://delimenu.co/pizzeria-roma",
"logo_url": "https://firebasestorage.googleapis.com/v0/b/example/o/logo_512x512.png?alt=media",
"banner_url": null,
"language": "es",
"languages": [
"en"
],
"trial_active": false
}
}Campos de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
restaurant* | object | |
id* | string | |
identifier* | string | |
name* | string | |
currency* | string | ISO 4217 code every price is in |
type* | "whatsapp" | "read_only" | "whatsapp" takes orders by WhatsApp; "read_only" only shows the menu |
phone* | string | null | WhatsApp number in E.164, when ordering is enabled |
address* | string | null | |
menu_url* | string | |
logo_url* | string | null | |
banner_url* | string | null | |
language* | "es" | "en" | "pt" | "fr" | "de" | "it" | The primary language: the one name, description and every untranslated field are written in |
languages* | "es" | "en" | "pt" | "fr" | "de" | "it"[] | The additional languages diners can read the menu in, translated through `translations`. Empty for a menu in one language. |
trial_active* | boolean |
Errores
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 restaurant
/restaurants/{ref}requiere menu:writeupdateRestaurantChanges only the fields given: name, WhatsApp phone, address, currency, type, language (the primary one) or languages (the additional ones, never the primary). Changing the currency converts no prices and changing a language translates nothing. The identifier has its own endpoint.
Parámetros
| Nombre | Dónde | Descripción |
|---|---|---|
ref* | ruta | The restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants |
Cuerpo (JSON)
| Campo | Tipo | Descripción |
|---|---|---|
name | string | hasta 50 caracteres |
phone | string | WhatsApp number that receives orders, in E.164 format (+573001234567) |
address | string | Street address shown on the menu. Empty string removes it.hasta 65 caracteres |
currency | string | ISO 4217 code every price is shown in. Changing it converts nothing. |
type | "whatsapp" | "read_only" | "whatsapp" takes orders by WhatsApp; "read_only" only shows the menu |
language | "es" | "en" | "pt" | "fr" | "de" | "it" | The primary language of the menu: the one its names and descriptions are written in, and the one WhatsApp orders are composed in. Changing it translates nothing. If the new one was among `languages`, it is taken out of that list. |
languages | "es" | "en" | "pt" | "fr" | "de" | "it"[] | Up to 3 additional languages diners can read the menu in, translated by hand through `translations`. Never the primary language. Replaces the whole list; [] leaves the menu in one language. |
Ejemplo
curl -X PATCH "https://delimenu.co/api/v1/restaurants/pizzeria-roma" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"phone":"+573009876543","address":"Carrera 7 # 45-10, Bogotá"}'Respuesta 200
{
"restaurant": {
"id": "aR3kX9pLm2QzT7vN4bYc",
"identifier": "pizzeria-roma",
"name": "Pizzería Roma",
"currency": "COP",
"type": "whatsapp",
"phone": "+573009876543",
"address": "Carrera 7 # 45-10, Bogotá",
"menu_url": "https://delimenu.co/pizzeria-roma",
"logo_url": "https://firebasestorage.googleapis.com/v0/b/example/o/logo_512x512.png?alt=media",
"banner_url": null,
"language": "es",
"languages": [
"en"
],
"trial_active": false
}
}Campos de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
restaurant* | object | |
id* | string | |
identifier* | string | |
name* | string | |
currency* | string | ISO 4217 code every price is in |
type* | "whatsapp" | "read_only" | "whatsapp" takes orders by WhatsApp; "read_only" only shows the menu |
phone* | string | null | WhatsApp number in E.164, when ordering is enabled |
address* | string | null | |
menu_url* | string | |
logo_url* | string | null | |
banner_url* | string | null | |
language* | "es" | "en" | "pt" | "fr" | "de" | "it" | The primary language: the one name, description and every untranslated field are written in |
languages* | "es" | "en" | "pt" | "fr" | "de" | "it"[] | The additional languages diners can read the menu in, translated through `translations`. Empty for a menu in one language. |
trial_active* | boolean |
Errores
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
Change the public URL
/restaurants/{ref}/identifierrequiere menu:writeupdateRestaurantIdentifierChanges the slug of the menu (delimenu.co/{identifier}). The old URL stops working immediately; printed QR codes keep working because they point at the restaurant id.
Parámetros
| Nombre | Dónde | Descripción |
|---|---|---|
ref* | ruta | The restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants |
Cuerpo (JSON)
| Campo | Tipo | Descripción |
|---|---|---|
identifier* | string | The new public slug: lowercase letters, digits, dots, hyphens and underscores, e.g. "pizzeria-roma"hasta 50 caracteres |
Ejemplo
curl -X PUT "https://delimenu.co/api/v1/restaurants/pizzeria-roma/identifier" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"identifier":"pizzeria-roma-chapinero"}'Respuesta 200
{
"restaurant": {
"id": "aR3kX9pLm2QzT7vN4bYc",
"identifier": "pizzeria-roma-chapinero",
"name": "Pizzería Roma",
"currency": "COP",
"type": "whatsapp",
"phone": "+573001234567",
"address": "Calle 10 # 5-20, Bogotá",
"menu_url": "https://delimenu.co/pizzeria-roma-chapinero",
"logo_url": "https://firebasestorage.googleapis.com/v0/b/example/o/logo_512x512.png?alt=media",
"banner_url": null,
"language": "es",
"languages": [
"en"
],
"trial_active": false
}
}Campos de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
restaurant* | object | |
id* | string | |
identifier* | string | |
name* | string | |
currency* | string | ISO 4217 code every price is in |
type* | "whatsapp" | "read_only" | "whatsapp" takes orders by WhatsApp; "read_only" only shows the menu |
phone* | string | null | WhatsApp number in E.164, when ordering is enabled |
address* | string | null | |
menu_url* | string | |
logo_url* | string | null | |
banner_url* | string | null | |
language* | "es" | "en" | "pt" | "fr" | "de" | "it" | The primary language: the one name, description and every untranslated field are written in |
languages* | "es" | "en" | "pt" | "fr" | "de" | "it"[] | The additional languages diners can read the menu in, translated through `translations`. Empty for a menu in one language. |
trial_active* | boolean |
Errores
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 it409CONFLICT — the identifier is already taken500INTERNAL — something failed on our side; retry in a moment
Get the whole menu
/restaurants/{ref}/menurequiere menu:readgetMenuEvery category in display order, each with its products in display order, prices, availability and variants. Hidden products are omitted unless include_hidden is true. Uncategorized products are listed apart.
Parámetros
| Nombre | Dónde | Descripción |
|---|---|---|
ref* | ruta | The restaurant identifier (the slug in its public URL, e.g. "pizzeria-roma") or its id, as returned by GET /restaurants |
include_hidden | query | Also return the products hidden from the public menu |
Ejemplo
curl -X GET "https://delimenu.co/api/v1/restaurants/pizzeria-roma/menu?include_hidden=true" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Respuesta 200
{
"restaurant": {
"id": "aR3kX9pLm2QzT7vN4bYc",
"identifier": "pizzeria-roma",
"name": "Pizzería Roma",
"currency": "COP",
"type": "whatsapp",
"phone": "+573001234567",
"address": "Calle 10 # 5-20, Bogotá",
"menu_url": "https://delimenu.co/pizzeria-roma",
"logo_url": "https://firebasestorage.googleapis.com/v0/b/example/o/logo_512x512.png?alt=media",
"banner_url": null,
"language": "es",
"languages": [
"en"
],
"trial_active": false
},
"categories": [
{
"id": "k3Qm8vXb2LpN7wRt1YaZ",
"name": "Pizzas",
"position": 1,
"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
}
]
}
]
}
]
}
],
"uncategorized_products": [],
"hidden_products_omitted": 2,
"note": "Prices are in COP, major units."
}Campos de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
restaurant* | object | |
id* | string | |
identifier* | string | |
name* | string | |
currency* | string | ISO 4217 code every price is in |
type* | "whatsapp" | "read_only" | "whatsapp" takes orders by WhatsApp; "read_only" only shows the menu |
phone* | string | null | WhatsApp number in E.164, when ordering is enabled |
address* | string | null | |
menu_url* | string | |
logo_url* | string | null | |
banner_url* | string | null | |
language* | "es" | "en" | "pt" | "fr" | "de" | "it" | The primary language: the one name, description and every untranslated field are written in |
languages* | "es" | "en" | "pt" | "fr" | "de" | "it"[] | The additional languages diners can read the menu in, translated through `translations`. Empty for a menu in one language. |
trial_active* | boolean | |
categories* | object[] | |
id* | string | |
name* | string | |
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 | |
name | string | |
en | object | |
name | string | |
pt | object | |
name | string | |
fr | object | |
name | string | |
de | object | |
name | string | |
it | object | |
name | string | |
position* | integer | 1-based display positionmin -9007199254740991 · max 9007199254740991 |
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[] | |
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 | 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 | |
en | object | |
pt | object | |
fr | object | |
de | object | |
it | object | |
uncategorized_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 | |
hidden_products_omitted* | integer | min -9007199254740991 · max 9007199254740991 |
note* | string |
Errores
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