Core Resource • Digital Catalogue Engine

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

Catalogue (template: restaurant | bakery | retail | services | real_estate) └── Categories / Sections (e.g., "Signature Cakes", "Starters", "Consulting Tiers") └── Items ├── Base Price & Pricing Type (fixed | starting_from | on_request | free) ├── Variants (server-generated canonical IDs: var_<uuid>) ├── Add-Ons (server-generated canonical IDs: add_<uuid>) ├── Real-time Availability (isAvailable: boolean) └── Metadata Attributes (schemaVersion, dietary tags, dimensions, duration)
Server-Generated Canonical IDs Invariant

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 Presentation Context (Untrusted Metadata)

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

restaurantRestaurant & Cafe

Food items, dietary tags (Veg, Non-Veg, Vegan, Jain), portions, spice levels, allergen notes.

bakeryArtisan Bakery & Desserts

Weight variants (500g, 1kg), egg/eggless tags, custom toppers, gold candle add-ons.

retailRetail & Boutiques

Sizes (S, M, L, XL), colors, SKUs, inventory status, gift packaging add-ons.

servicesProfessional Services & Salons

Duration (30m, 60m), service tiers, specialist add-ons, booking CTAs.

real_estateReal Estate & Properties

BHK configs (1 BHK, 2 BHK, Villa), carpet area, floor plans, virtual tour links.

Catalogue REST Endpoints

GET/api/v1/catalogs

List workspace catalogues with template filtering, pagination, and item counts.

Scope: catalogs:read
POST/api/v1/catalogs

Create a new digital catalogue or restaurant menu with vertical template branding.

Scope: catalogs:write
GET/api/v1/catalogs/:id

Retrieve full hierarchical catalogue object with all sections, items, variants, and dynamic QR link.

Scope: catalogs:read
PATCH/api/v1/catalogs/:id

Update catalogue metadata, theme, business details, or settings.

Scope: catalogs:write
DELETE/api/v1/catalogs/:id

Permanently remove a catalogue and its items.

Scope: catalogs:write
POST/api/v1/catalogs/:id/publish

Publish catalogue to live public URL (e.g. /menu/:slug or /catalog/:slug).

Scope: catalogs:write
POST/api/v1/catalogs/:id/unpublish

Revert catalogue to draft status, taking it offline from public access.

Scope: catalogs:write
POST/api/v1/catalogs/:id/duplicate

Deep-clone catalogue, categories, items, variants, and add-ons to a new draft copy.

Scope: catalogs:write
POST/api/v1/catalogs/:id/sections

Create an organizational category or section (e.g. Signature Cakes, Appetizers).

Scope: catalogs:write
POST/api/v1/catalogs/:id/items

Create item with base pricing, multi-variants (var_<uuid>), add-ons (add_<uuid>), and metadata.

Scope: catalogs:write
PATCH/api/v1/catalogs/:id/items/:itemId

Update item pricing, description, badge, variants, or add-ons.

Scope: catalogs:write
POST/api/v1/catalogs/:id/items/:itemId/toggle-availability

1-click atomic toggle for in-stock vs sold-out state without re-sending full item body.

Scope: catalogs:write

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.

QR Codes API