- Developers
- API reference
- Design
Design
How the public menu looks and the QR code that leads to it: colours, font, preset styles and the QR design.
How the public menu looks, and the QR code that leads to it.
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.
Get the menu appearance
/restaurants/{ref}/appearancerequires menu:readgetAppearanceColours, font, corners, card and category bar style and product layout, as the public menu renders them. preset names the ready-made look they match, or is null when customised.
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 |
Example
curl -X GET "https://delimenu.co/api/v1/restaurants/pizzeria-roma/appearance" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Response 200
{
"appearance": {
"preset": null,
"customized": true,
"primary_color": "#16a34a",
"primary_foreground_color": "#ffffff",
"background_color": "#09090b",
"surface_color": "#18181b",
"text_color": "#fafafa",
"muted_text_color": "#a1a1aa",
"font_family": "Poppins",
"border_radius": "sm",
"product_card_style": "flat",
"nav_style": "underline",
"product_layout": "grid"
}
}Response fields
| Field | Type | Description |
|---|---|---|
appearance* | object | |
preset* | "classic" | "cafe" | "night" | "fresh" | "ocean" | "pizzeria" | "elegant" | "sweet" | The ready-made look these values match (product_layout aside), or null when customised |
customized* | boolean | false: the restaurant never changed the default look |
primary_color* | string | |
primary_foreground_color* | string | |
background_color* | string | |
surface_color* | string | |
text_color* | string | |
muted_text_color* | string | |
font_family* | string | A Google Fonts family, or "default" |
border_radius* | "none" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" | |
product_card_style* | "shadow" | "bordered" | "flat" | |
nav_style* | "pills" | "underline" | "chips" | |
product_layout* | "grid" | "list" |
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
Change the menu appearance
/restaurants/{ref}/appearancerequires menu:writeupdateAppearanceChanges only the fields given. A preset is applied first and the other fields on top of it; a preset does not change product_layout. Colours are #rrggbb and font_family a Google Fonts family or "default". { "reset": true }, alone, restores the default look. The public menu shows the change within seconds.
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 |
|---|---|---|
preset | "classic" | "cafe" | "night" | "fresh" | "ocean" | "pizzeria" | "elegant" | "sweet" | A ready-made look, applied before any other field in this call: classic (orange on white, the default), cafe (brown on cream, Lora), night (red on black, Poppins), fresh (green on mint, Nunito), ocean (blue on pale sky, Montserrat), pizzeria (red on blush, Playfair Display), elegant (gold on near-black, Cormorant Garamond, square corners), sweet (pink on lilac, Quicksand). It sets every colour, the font, the corners, the cards and the navigation, but not product_layout. |
primary_color | string | Buttons, prices, the active category and the add-to-cart bar |
primary_foreground_color | string | Text drawn on top of primary_color; keep it readable against it |
background_color | string | The page behind everything |
surface_color | string | Product cards and sheets |
text_color | string | Names and headings |
muted_text_color | string | Descriptions and secondary text |
font_family | string | A Google Fonts family exactly as Google lists it (e.g. "Poppins", "Playfair Display"), or "default" for the app fontup to 80 characters |
border_radius | "none" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" | Roundness of cards, images and buttons, from none (square) to 3xl (very round) |
product_card_style | "shadow" | "bordered" | "flat" | shadow: floating cards; bordered: an outline; flat: no edge |
nav_style | "pills" | "underline" | "chips" | The category bar: pills, underline or chips |
product_layout | "grid" | "list" | grid: photo cards; list: one column of text rows, best for menus with few or no photos |
reset | true | Back to the default look. Send it alone. |
Example
curl -X PATCH "https://delimenu.co/api/v1/restaurants/pizzeria-roma/appearance" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"preset":"night","primary_color":"#16a34a"}'Response 200
{
"appearance": {
"preset": null,
"customized": true,
"primary_color": "#16a34a",
"primary_foreground_color": "#ffffff",
"background_color": "#09090b",
"surface_color": "#18181b",
"text_color": "#fafafa",
"muted_text_color": "#a1a1aa",
"font_family": "Poppins",
"border_radius": "sm",
"product_card_style": "flat",
"nav_style": "underline",
"product_layout": "grid"
}
}Response fields
| Field | Type | Description |
|---|---|---|
appearance* | object | |
preset* | "classic" | "cafe" | "night" | "fresh" | "ocean" | "pizzeria" | "elegant" | "sweet" | The ready-made look these values match (product_layout aside), or null when customised |
customized* | boolean | false: the restaurant never changed the default look |
primary_color* | string | |
primary_foreground_color* | string | |
background_color* | string | |
surface_color* | string | |
text_color* | string | |
muted_text_color* | string | |
font_family* | string | A Google Fonts family, or "default" |
border_radius* | "none" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl" | |
product_card_style* | "shadow" | "bordered" | "flat" | |
nav_style* | "pills" | "underline" | "chips" | |
product_layout* | "grid" | "list" |
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 the QR code
/restaurants/{ref}/qrrequires menu:readgetQrCodeThe design and the code itself as a standalone SVG, the same drawing the dashboard prints. The code encodes qr_url, which follows the restaurant even if its identifier changes. For PNG, JPG or PDF, download_page_url is the dashboard page that exports 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 |
Example
curl -X GET "https://delimenu.co/api/v1/restaurants/pizzeria-roma/qr" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Response 200
{
"qr": {
"customized": true,
"dot_style": "rounded",
"corner_frame_style": "rounded",
"corner_dot_style": "rounded",
"dot_color": "#1e3a8a",
"corner_color": "#1e3a8a",
"background": "#ffffff",
"frame": "text",
"frame_text": "Escanea y pide",
"frame_text_is_default": false,
"frame_show_name": true,
"qr_url": "https://delimenu.co/qr/menu/aR3kX9pLm2QzT7vN4bYc",
"download_page_url": "https://delimenu.co/dashboard/pizzeria-roma/qr",
"svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 35 43\" role=\"img\" aria-label=\"Código QR del menú de Pizzería Roma\">…</svg>"
}
}Response fields
| Field | Type | Description |
|---|---|---|
qr* | object | |
customized* | boolean | false: the default design |
dot_style* | "square" | "rounded" | "dots" | |
corner_frame_style* | "square" | "rounded" | "circle" | |
corner_dot_style* | "square" | "rounded" | "dot" | |
dot_color* | string | |
corner_color* | string | |
background* | string | #rrggbb or "transparent" |
frame* | "none" | "text" | |
frame_text* | string | The call to action printed in the frame (when frame is "text") |
frame_text_is_default* | boolean | true: frame_text is the default one, in the menu language |
frame_show_name* | boolean | |
qr_url* | string | What the code encodes: it follows the restaurant even if its identifier changes |
download_page_url* | string | The dashboard page where the owner downloads it as PNG, JPG, SVG or PDF |
svg* | string | The code as a standalone SVG document, exactly as the dashboard draws it |
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
Change the QR design
/restaurants/{ref}/qrrequires menu:writeupdateQrDesignChanges only the fields given. Printed codes keep working: this changes the drawing, not what it encodes. A design phones could not read — too little contrast, or a code lighter than its background — is refused with 400. frame_text: null goes back to the default call to action in the menu language. { "reset": true }, alone, restores the default design.
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 |
|---|---|---|
dot_style | "square" | "rounded" | "dots" | Shape of the small modules: square, rounded or dots |
corner_frame_style | "square" | "rounded" | "circle" | Shape of the outer ring of the three corner "eyes" |
corner_dot_style | "square" | "rounded" | "dot" | Shape of the centre of the three corner "eyes" |
dot_color | string | Colour of the modules |
corner_color | string | Colour of the corner eyes, and of the frame when there is one |
background | "transparent" | string | Hex colour behind the code, or "transparent" |
frame | "none" | "text" | "text" draws a frame in corner_color with a call to action under the code; "none" is the bare code |
frame_text | string | null | The call to action in the frame, e.g. "Escanea y pide". null goes back to the default text in the menu language; an empty string leaves the band without text.up to 40 characters |
frame_show_name | boolean | Also print the restaurant name above the code, inside the frame |
reset | true | Back to the default design (black squares on white, no frame). Send it alone. |
Example
curl -X PATCH "https://delimenu.co/api/v1/restaurants/pizzeria-roma/qr" \
-H "Authorization: Bearer dmk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"dot_style":"rounded","dot_color":"#1e3a8a","corner_color":"#1e3a8a","frame":"text","frame_text":"Escanea y pide","frame_show_name":true}'Response 200
{
"qr": {
"customized": true,
"dot_style": "rounded",
"corner_frame_style": "rounded",
"corner_dot_style": "rounded",
"dot_color": "#1e3a8a",
"corner_color": "#1e3a8a",
"background": "#ffffff",
"frame": "text",
"frame_text": "Escanea y pide",
"frame_text_is_default": false,
"frame_show_name": true,
"qr_url": "https://delimenu.co/qr/menu/aR3kX9pLm2QzT7vN4bYc",
"download_page_url": "https://delimenu.co/dashboard/pizzeria-roma/qr",
"svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 35 43\" role=\"img\" aria-label=\"Código QR del menú de Pizzería Roma\">…</svg>"
}
}Response fields
| Field | Type | Description |
|---|---|---|
qr* | object | |
customized* | boolean | false: the default design |
dot_style* | "square" | "rounded" | "dots" | |
corner_frame_style* | "square" | "rounded" | "circle" | |
corner_dot_style* | "square" | "rounded" | "dot" | |
dot_color* | string | |
corner_color* | string | |
background* | string | #rrggbb or "transparent" |
frame* | "none" | "text" | |
frame_text* | string | The call to action printed in the frame (when frame is "text") |
frame_text_is_default* | boolean | true: frame_text is the default one, in the menu language |
frame_show_name* | boolean | |
qr_url* | string | What the code encodes: it follows the restaurant even if its identifier changes |
download_page_url* | string | The dashboard page where the owner downloads it as PNG, JPG, SVG or PDF |
svg* | string | The code as a standalone SVG document, exactly as the dashboard draws it |
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