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#
https://api.duck-hub.com/v1All 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:
curl https://api.duck-hub.com/v1/menu \
-H "Authorization: Bearer dk_live_your_api_key"const response = await fetch('https://api.duck-hub.com/v1/menu', {
headers: { Authorization: 'Bearer dk_live_your_api_key' },
})
const menu = await response.json()
console.log(`Menu has ${menu.products.length} products`)A successful response:
{
"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#
- Authentication — API keys and headers
- Errors — response envelope and error catalog
- Rate limits and Plan limits
- Menu API — sync, publish, cleanup, read
- Orders API — list, fetch, update status, polling
Key concepts#
externalId— every category, ingredient and product you sync is identified by your ID. Repeated syncs upsert byexternalId, 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 ≠ live —
POST /v1/syncupdates the draft menu;POST /v1/publishmakes it visible to guests.