Bearer-token auth on every endpoint. Pass your API key in the Authorization header. Test keys start with sk_test_, live keys with sk_live_. Rotate keys monthly.
curl https://api.hesett.com/v1/dashboard/overview \
-H "Authorization: Bearer sk_test_xxx"
Read aggregate venue metrics: today and week revenue, top dishes, covers, average ticket, tip rate, scan-to-order conversion.
GET/dashboard/overviewToday + week KPIs in one payload.
GET/dashboard/analyticsHistorical analytics (day / week / month).
The same feed your kitchen reads. Subscribe to the webhook for real-time push, or poll if you must.
GET/ordersActive orders, filterable by status.
POST/ordersCreate an order programmatically.
PUT/orders/{id}/statusMove through status flow.
Bookings, walk-ins, table assignments. Trigger SMS reminders, confirm with a tap.
GET/reservationsToday and upcoming.
POST/reservationsCreate a reservation.
Stripe-backed. Refunds, statements, payouts. PCI-DSS Level 1 — your servers never see the card.
POST/payments/processProcess a card payment via Stripe Connect.
GET/payments/statementsDaily, weekly, monthly statements.
Static or dynamic QR codes per table. Scan analytics included.
POST/qr-codes/generateGenerate a QR for a table.
GET/qr-codes/{id}Scan count, last scanned, deeplink.
Stock tracking with reorder alerts and COGS calculation.
GET/inventory/itemsList inventory items with stock levels.
PUT/inventory/items/{id}/stockAdjust stock after delivery.
Subscribe to events instead of polling. We retry with exponential backoff and sign every payload with HMAC-SHA256.
// Express endpoint
app.post('/hesett/webhook', (req, res) => {
const sig = req.headers['hesett-signature'];
if (!verify(sig, req.rawBody, WEBHOOK_SECRET)) return res.status(401).end();
const event = req.body;
if (event.type === 'order.created') {
enqueueKitchen(event.data);
}
res.status(200).end();
});
Official SDKs for JavaScript / TypeScript and Python. Generated from the same OpenAPI spec the dashboard consumes.
import { Hesett } from '@hesett/sdk';
const hesett = new Hesett({ apiKey: process.env.HESETT_KEY });
const overview = await hesett.dashboard.overview();
console.log(overview.todayRevenue);
Every error returns a JSON body with code, message, and request_id. HTTP status codes follow conventions: 4xx for client errors, 5xx for ours.
try {
await hesett.orders.create({ /* ... */ });
} catch (err) {
if (err.code === 'rate_limited') backoff();
else if (err.code === 'invalid_request') logToSentry(err);
else throw err;
}