Skip to main content

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

get/restaurants/{ref}/appearancerequires menu:readgetAppearance

Colours, 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

NameInDescription
ref*pathThe 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

FieldTypeDescription
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*booleanfalse: 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*stringA 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

  • 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

Change the menu appearance

patch/restaurants/{ref}/appearancerequires menu:writeupdateAppearance

Changes 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

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
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_colorstringButtons, prices, the active category and the add-to-cart bar
primary_foreground_colorstringText drawn on top of primary_color; keep it readable against it
background_colorstringThe page behind everything
surface_colorstringProduct cards and sheets
text_colorstringNames and headings
muted_text_colorstringDescriptions and secondary text
font_familystringA 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
resettrueBack 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

FieldTypeDescription
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*booleanfalse: 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*stringA 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

  • 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 the QR code

get/restaurants/{ref}/qrrequires menu:readgetQrCode

The 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

NameInDescription
ref*pathThe 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

FieldTypeDescription
qr*object
customized*booleanfalse: 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*stringThe call to action printed in the frame (when frame is "text")
frame_text_is_default*booleantrue: frame_text is the default one, in the menu language
frame_show_name*boolean
qr_url*stringWhat the code encodes: it follows the restaurant even if its identifier changes
download_page_url*stringThe dashboard page where the owner downloads it as PNG, JPG, SVG or PDF
svg*stringThe code as a standalone SVG document, exactly as the dashboard draws it

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

Change the QR design

patch/restaurants/{ref}/qrrequires menu:writeupdateQrDesign

Changes 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

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
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_colorstringColour of the modules
corner_colorstringColour of the corner eyes, and of the frame when there is one
background"transparent" | stringHex 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_textstring | nullThe 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_namebooleanAlso print the restaurant name above the code, inside the frame
resettrueBack 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

FieldTypeDescription
qr*object
customized*booleanfalse: 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*stringThe call to action printed in the frame (when frame is "text")
frame_text_is_default*booleantrue: frame_text is the default one, in the menu language
frame_show_name*boolean
qr_url*stringWhat the code encodes: it follows the restaurant even if its identifier changes
download_page_url*stringThe dashboard page where the owner downloads it as PNG, JPG, SVG or PDF
svg*stringThe code as a standalone SVG document, exactly as the dashboard draws it

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

Developers