DuckHub API

The DuckHub API lets your POS or back-office system work with your DuckHub venue programmatically:

  • Menu — upsert categories, ingredients and products by your own IDs (Sync), push a live snapshot to guests (Publish), remove stale items (Cleanup) and read the full menu back (Get menu).
  • Orders — pull incoming orders (List orders), fetch one (Get order) and move them through the fulfilment flow (Update status).

The API is pull-based: there are no webhooks. Poll GET /v1/orders?updatedSince=... to pick up new and changed orders — see Polling.

Plan availability

API keys and the Menu API are available on every plan, including the free Egg plan. The Orders API requires a paid plan (Duckling or Golden Duck) — on a free plan its endpoints return 403 Forbidden.

Base URL#

http
https://api.duck-hub.com/v1

All endpoints are versioned under /v1 — see Versioning. Requests and responses use JSON (Content-Type: application/json).

Quickstart#

1. Get your API key#

In the DuckHub app, open Integrations and generate an API key. The full key is shown once — store it securely. See Authentication for details.

2. Make your first request#

Fetch your current menu:

bash
curl https://api.duck-hub.com/v1/menu \
  -H "Authorization: Bearer dk_live_your_api_key"

A successful response:

json
{
  "generatedAt": "2026-07-05T12:00:00.000Z",
  "categories": [
    { "externalId": "cat-mains", "name": "Mains", "sortOrder": 0 }
  ],
  "ingredients": [
    { "externalId": "ing-cheese", "name": "Cheese", "sortOrder": 0 }
  ],
  "products": [
    {
      "externalId": "prod-burger",
      "name": "Burger",
      "description": "House classic",
      "priceMinor": 24500,
      "categoryExternalId": "cat-mains",
      "sortOrder": 0,
      "menuVisible": true,
      "ingredients": [],
      "modifierGroups": []
    }
  ]
}

3. Explore the API#

Key concepts#

  • externalId — every category, ingredient and product you sync is identified by your ID. Repeated syncs upsert by externalId, so your POS stays the source of truth.
  • Minor currency units — all money values (priceMinor, order amounts) are integers in the smallest currency unit (kopecks, cents).
  • Sync ≠ livePOST /v1/sync updates the draft menu; POST /v1/publish makes it visible to guests.