API Documentation

Read-only JSON APIs for connecting DuesterTap menus to your POS, website, or mobile app. All data is live — 86’d (out-of-stock) items are already filtered out.

Two ways in

1. Credentialed POS API (/v1) — key + secret per venue, for point-of-sale and back-office integrations. Requires the plan tier with mobile-app integration; access is requested from the DuesterTap admin (Integration → API) and approved by our team.

2. Public endpoints — keyless, identified by the venue’s public slug. Meant for the venue’s own website embeds and mobile apps.

Base URL for everything: https://api.duestertap.com. All endpoints are GET and return JSON. There is no write access via these APIs.

Credentialed POS API (/v1)

Authentication

Send your venue’s credentials as headers on every request. Get them in the DuesterTap admin under Integration → API (request access → approval → key issued → generate your secret; the secret is shown once and can be regenerated anytime).

curl https://api.duestertap.com/v1/menu \ -H "X-API-Key: dtk_your_api_key" \ -H "X-API-Secret: dts_your_api_secret"

Invalid, revoked, or plan-lapsed credentials return 401. Unknown ids return 404. Poll as often as you need — responses are uncached and always current.

GET/v1/menu

The venue’s published menu — boards and items exactly as their screens display them.

{ "venue": { "id": "…", "name": "…", "slug": "…" }, "menu": { "id": "…", "name": "Main Menu", "boards": [ { "id": "…", "name": "On Tap", "board_type": "menu", "items": [ { "id": "…", "name": "Item Name", "description": "…", "style": "IPA", "abv": 6.5, "ibu": 55, "price": 7.00, "size_oz": 16, "tap_number": 1, "image_url": "…" } ] } ] } }

GET/v1/locations/{locationId}/menu

The published menu for one physical location (multi-location venues). Same response shape as /v1/menu, with that location’s 86 list applied. Location ids are listed on the venue’s Integration → API page.

GET/v1/categories

Every item list (category) in the venue’s Item Library.

{ "venue": { "id": "…", "name": "…", "slug": "…" }, "categories": [ { "id": "…", "name": "All Beers", "category_type": "beer" }, { "id": "…", "name": "Food", "category_type": "food" } ] }

GET/v1/categories/{categoryId}/items

Live items in one list, with out-of-stock items already removed.

{ "venue": { "id": "…", "name": "…", "slug": "…" }, "category": { "id": "…", "name": "All Beers" }, "items": [ { "id": "…", "name": "Item Name", "description": "…", "style": "IPA", "abv": 6.5, "ibu": 55, "price": 7.00, "size_oz": 16, "tap_number": 1, "image_url": "…" } ] }

Public endpoints (keyless)

For a venue’s own website and mobile app. Identified by the venue’s public slug — no credentials required.

GET/public/venues/{slug}/menu

The published menu (same shape as /v1/menu). Add /public/venues/{slug}/locations/{locationId}/menu for a specific location.

GET/public/venues/{slug}/catalog

All item lists (same shape as /v1/categories).

GET/public/venues/{slug}/catalog/{categoryId}

Live items in one list (same shape as /v1/categories/{id}/items).

GET/public/venues/{slug}/catalog/{categoryId}/widget.js

A drop-in JavaScript widget that renders the list on any website. Configuration options are generated in the admin under Integration → Website Embed.

Freshness & stability

Getting access

POS API access is included with the DuesterTap plan tier that has mobile-app integration. In the admin console, go to Integration → API, tell us what you’re connecting, and you’ll get your credentials after a quick review — usually within a business day. Questions: support@duestertap.com.