Plan limits
Each DuckHub plan caps how many menu items a venue can hold. Syncs that would create more items than your plan allows are rejected before anything is written.
Plan availability
API keys and the Menu API are available on every plan, including the free Egg plan. Only the Orders API requires a paid plan.
Limits per venue#
| Egg (free) | Duckling | Golden Duck | |
|---|---|---|---|
| Products | 70 | 2000 | 2000 |
| Categories | 10 | 200 | 200 |
| Ingredients | 300 | 300 | 300 |
The counts are per venue and include everything already in the menu — a
sync fails if existing items + new items in the request would exceed the
cap. Updating existing items (matched by externalId) never counts against
the limit; only new items do.
Per-request array caps#
Independent of plan limits, one POST /v1/sync request accepts at most:
| Array | Max per request |
|---|---|
categories | 200 |
ingredients | 200 |
products | 500 |
Larger catalogs should be split into several sequential sync requests
(mind the rate limits). Exceeding an array cap is a
400 validation error.
When a limit is exceeded#
The sync fails with 400 Bad Request and no changes are applied — the
request is checked up-front, so a rejected sync never leaves the menu
half-updated.
Distinguishing limit errors
Plan-limit rejections currently return a generic 400 body (no
machine-readable code). If a sync that creates many new items fails with
a 400 that is not Validation failed, compare your item
counts against the table above. See Errors.
To free up capacity, remove stale items with
POST /v1/cleanup or upgrade the plan in the DuckHub
app.