Digital Catalogue & Menu API
Create, synchronize, and dynamically distribute rich interactive digital menus, bakery catalogues, retail lookbooks, and service price lists with real-time stock toggling and WhatsApp order formatting.
Engine Architecture & Hierarchy
Variants (var_...) and Add-Ons (add_...) use server-generated canonical IDs. When updating an existing item, the API preserves valid canonical IDs across edits so that cart selections and analytics stay persistent. Missing, invalid, or client-temporary placeholders (var_temp_...) are replaced with freshly generated canonical IDs automatically.
Dynamic QR codes linked to catalogues can pass optional presentation parameters such as ?table=4, ?seat=A12, ?room=204, or ?source=qr. The engine strictly validates these parameters against safe character allowlists. They serve strictly as presentation context for client-side order convenience (e.g. pre-filling table numbers in customer WhatsApp messages) and must never be used as an authorization boundary.
Supported Vertical Templates
Food items, dietary tags (Veg, Non-Veg, Vegan, Jain), portions, spice levels, allergen notes.
Weight variants (500g, 1kg), egg/eggless tags, custom toppers, gold candle add-ons.
Sizes (S, M, L, XL), colors, SKUs, inventory status, gift packaging add-ons.
Duration (30m, 60m), service tiers, specialist add-ons, booking CTAs.
BHK configs (1 BHK, 2 BHK, Villa), carpet area, floor plans, virtual tour links.
Catalogue REST Endpoints
List workspace catalogues with template filtering, pagination, and item counts.
Create a new digital catalogue or restaurant menu with vertical template branding.
Retrieve full hierarchical catalogue object with all sections, items, variants, and dynamic QR link.
Update catalogue metadata, theme, business details, or settings.
Permanently remove a catalogue and its items.
Publish catalogue to live public URL (e.g. /menu/:slug or /catalog/:slug).
Revert catalogue to draft status, taking it offline from public access.
Deep-clone catalogue, categories, items, variants, and add-ons to a new draft copy.
Create an organizational category or section (e.g. Signature Cakes, Appetizers).
Create item with base pricing, multi-variants (var_<uuid>), add-ons (add_<uuid>), and metadata.
Update item pricing, description, badge, variants, or add-ons.
1-click atomic toggle for in-stock vs sold-out state without re-sending full item body.
Implementation Examples
1. Create Item with Variants & Add-ons (cURL)
curl -X POST https://qrnaly.com/api/v1/catalogs/cat_01j8m4/items \
-H "Authorization: Bearer qrs_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"sectionId": "sec_cakes_01",
"name": "Belgian Chocolate Truffle Cake",
"description": "Rich 55% dark chocolate ganache layered with moist chocolate sponge.",
"pricingType": "starting_from",
"price": 450,
"badge": "Bestseller",
"isAvailable": true,
"metadata": {
"schemaVersion": 1,
"dietary": ["Eggless"],
"variants": [
{ "name": "500g (Serves 4-6)", "price": 450, "isDefault": true, "isAvailable": true },
{ "name": "1kg (Serves 8-10)", "price": 850, "isDefault": false, "isAvailable": true }
],
"addOns": [
{ "name": "Happy Birthday Acrylic Topper", "price": 120, "maxQuantity": 1, "isAvailable": true },
{ "name": "Gold Metallic Sparkle Candle", "price": 80, "maxQuantity": 4, "isAvailable": true }
]
}
}'2. Real-Time Stock Availability Toggle (TypeScript / Node.js)
import axios from 'axios';
// Mark an item as Sold Out instantly from a POS or kitchen terminal
async function markItemSoldOut(catalogId: string, itemId: string) {
const response = await axios.post(
`https://qrnaly.com/api/v1/catalogs/${catalogId}/items/${itemId}/toggle-availability`,
{ isAvailable: false },
{
headers: {
Authorization: `Bearer ${process.env.QRNALY_API_KEY}`,
'Content-Type': 'application/json',
},
}
);
console.log('Item updated:', response.data.item.isAvailable); // false
return response.data;
}Explore More Developer APIs
Combine digital catalogues with dynamic shortlinks, scan telemetry, and webhooks.