Každý požadavek potřebuje API klíč firmy (Integrace → Webhooky a API v administraci) odeslaný jako Authorization: Bearer tt_live_…. Odpovědi i chyby jsou ve formátu JSON.
curl "https://api.tapti.me/v1/company/reservations?status=confirmed&updatedSince=2026-09-01T00:00:00Z" \
-H "Authorization: Bearer tt_live_…"
Ověření
Každý požadavek nese API klíč firmy jako bearer token. Vytvoříte ho v administraci – Integrace → Webhooky a API → Klíče REST API –, kde se zobrazí jen jednou a na serveru se uloží pouze jako hash SHA-256; ztracený klíč se zneplatní a nahradí, neobnovuje se. Firma může mít až 10 aktivních klíčů.
- Klíče jen pro čtení mohou volat všechny endpointy GET a mohou přihlašovat i odhlašovat webhooky – odběr neodešle nic, co by klíč nemohl přečíst i tak.
- Klíče pro čtení i zápis mohou navíc přes POST měnit stav rezervace; klíč jen pro čtení dostane na těchto cestách 403 Forbidden.
- Klíč patří jedné firmě – každý výpis i dotaz je na ni už omezen, parametr companyId neexistuje.
Limity požadavků
50 požadavků za minutu na klíč v klouzavém okně, společně pro všechny endpointy. Při překročení se vrací 429 Too Many Requests; počkejte a zkuste to znovu, místo abyste se dotazovali častěji – nebo si přihlaste webhook a dotazování ukončete.
Endpointy
/v1/company
Jen pro čtení nebo čtení i zápis
Získat aktuální firmu
Firma, ke které klíč patří, a co samotný klíč smí dělat.
/v1/company/reservations
Jen pro čtení nebo čtení i zápis
Vypsat rezervace stolů
Rezervace stolů firmy, od nejstaršího začátku – nebo, je-li nastaveno updatedSince, od nejdříve změněné.
| Parametr | Typ | Význam |
|---|---|---|
status |
string | Oddělené čárkou: pending, confirmed, seated, completed, no_show, cancelled. cancelled odpovídá oběma důvodům zrušení. |
branchId |
integer | Omezit na jednu provozovnu. |
from |
ISO 8601 datetime | Jen rezervace začínající v tento čas nebo později (UTC, pokud není uveden posun). |
to |
ISO 8601 datetime | Jen rezervace začínající před tímto časem. |
updatedSince |
ISO 8601 datetime | Jen rezervace změněné od tohoto času; přepne řazení na updatedAt vzestupně, pro synchronizaci. |
limit |
integer | Velikost stránky, 1–100. Výchozí 50. |
page |
integer | Číslo stránky od 1. Výchozí 1. |
/v1/company/appointments
Jen pro čtení nebo čtení i zápis
Vypsat termíny
Stejný tvar a filtry jako u rezervací stolů, pro modul Objednávky termínů.
| Parametr | Typ | Význam |
|---|---|---|
status |
string | Oddělené čárkou: pending, confirmed, completed, no_show, cancelled. |
branchId |
integer | Omezit na jednu provozovnu. |
from |
ISO 8601 datetime | Jen rezervace začínající v tento čas nebo později. |
to |
ISO 8601 datetime | Jen rezervace začínající před tímto časem. |
updatedSince |
ISO 8601 datetime | Jen rezervace změněné od tohoto času; řadí podle updatedAt vzestupně. |
limit |
integer | Velikost stránky, 1–100. Výchozí 50. |
page |
integer | Číslo stránky od 1. Výchozí 1. |
/v1/company/reservations/{id}
Jen pro čtení nebo čtení i zápis
Získat rezervaci stolu
Jedna rezervace ve stejném tvaru, v jakém ji nesou webhooky, včetně atribuce. 404, pokud id nepatří firmě klíče.
/v1/company/appointments/{id}
Jen pro čtení nebo čtení i zápis
Získat termín
Jeden termín, stejný tvar a pravidla jako u dotazu na rezervaci stolu.
/v1/company/reservations/{id}/status
Jen čtení i zápis
Změnit stav rezervace stolu
Potvrdit, usadit, dokončit, označit nedorazivšího hosta, zrušit nebo znovu otevřít – spustí stejné webhooky a konverze jako změna na přehledu služby. Tělo JSON: {"status": "..."}.
| Parametr | Typ | Význam |
|---|---|---|
status |
string, required | Jedna z hodnot: pending, confirmed, seated, completed, no_show, cancelled (přijímá se i canceled a canceled_by_venue). |
/v1/company/appointments/{id}/status
Jen čtení i zápis
Změnit stav termínu
Stejné jako endpoint pro rezervace stolů, jen bez stavu seated.
| Parametr | Typ | Význam |
|---|---|---|
status |
string, required | Jedna z hodnot: pending, confirmed, completed, no_show, cancelled (přijímá se i canceled a canceled_by_venue). |
/v1/company/events
Jen pro čtení nebo čtení i zápis
Dotaz na proud událostí
Každá událost rezervace, objednávky a věrnosti, od nejstarší – stejný proud, ze kterého vznikají webhooky. Předejte poslední viděný kurzor jako after, abyste dostali jen novinky, a type, abyste dostali jen některé druhy.
| Parametr | Typ | Význam |
|---|---|---|
after |
integer cursor | Kurzor poslední zpracované události. Vynechejte, chcete-li začít od začátku. |
type |
string | Typy nebo rodiny událostí oddělené čárkou: booking.confirmed,order.placed, nebo order, loyalty.*. Vynechejte pro všechny události. |
limit |
integer | Velikost stránky, 1–100. Výchozí 50. |
/v1/company/orders
Jen pro čtení nebo čtení i zápis
Vypsat objednávky
Objednávky hostů ke stolu, s sebou a s rozvozem a každý prodej namarkovaný na pokladně, od nejstarší – nebo, je-li nastaveno paidSince, v pořadí, v jakém byly zaplaceny. Objednávka, která ještě čeká na platbu předem, se nevypisuje.
| Parametr | Typ | Význam |
|---|---|---|
status |
string | Oddělené čárkou: open, paid. |
source |
string | customer (zadal host) nebo staff (namarkoval personál). |
fulfilment |
string | Oddělené čárkou: dine_in, takeaway, delivery. |
branchId |
integer | Omezit na jednu provozovnu. |
from |
ISO 8601 datetime | Jen objednávky vytvořené v tento čas nebo později. |
to |
ISO 8601 datetime | Jen objednávky vytvořené před tímto časem. |
paidSince |
ISO 8601 datetime | Jen objednávky zaplacené od tohoto času; řadí podle paidAt vzestupně, pro synchronizaci tržeb. |
limit |
integer | Velikost stránky, 1–100. Výchozí 50. |
page |
integer | Číslo stránky od 1. Výchozí 1. |
/v1/company/orders/{id}
Jen pro čtení nebo čtení i zápis
Získat objednávku
Jedna objednávka s položkami, součty a atribucí, ve tvaru, v jakém ji nesou webhooky objednávek.
/v1/company/loyalty/programs
Jen pro čtení nebo čtení i zápis
Vypsat věrnostní programy
Každý program razítkových karet: název, stav, potřebný počet razítek, odměna a kde platí.
/v1/company/loyalty/cards
Jen pro čtení nebo čtení i zápis
Vypsat věrnostní karty
Karty členů ve tvaru objektu věrnosti. Člen, který kartu zaplnil, ji má ve stavu completed a vedle ní novou aktivní; customer.id je člen.
| Parametr | Typ | Význam |
|---|---|---|
programId |
integer | Omezit na jeden program. |
customerId |
integer | Omezit na jednoho člena. |
status |
string | Oddělené čárkou: active, completed. |
updatedSince |
ISO 8601 datetime | Jen karty orazítkované nebo dokončené od tohoto času; řadí podle updatedAt vzestupně. |
limit |
integer | Velikost stránky, 1–100. Výchozí 50. |
page |
integer | Číslo stránky od 1. Výchozí 1. |
/v1/company/loyalty/rewards
Jen pro čtení nebo čtení i zápis
Vypsat věrnostní odměny
Odměny získané zaplněním karty, s jejich kódem, platností a informací, zda byly uplatněny.
| Parametr | Typ | Význam |
|---|---|---|
programId |
integer | Omezit na jeden program. |
customerId |
integer | Omezit na jednoho člena. |
status |
string | Oddělené čárkou: issued, redeemed, expired. |
from |
ISO 8601 datetime | Jen odměny vydané v tento čas nebo později. |
to |
ISO 8601 datetime | Jen odměny vydané před tímto časem. |
limit |
integer | Velikost stránky, 1–100. Výchozí 50. |
page |
integer | Číslo stránky od 1. Výchozí 1. |
/v1/company/webhooks
Jen pro čtení nebo čtení i zápis
Vypsat odběry webhooků
Odběry vytvořené tímto klíčem. Webhooky přidané v administraci se zde nevypisují.
/v1/company/webhooks
Jen pro čtení nebo čtení i zápis
Přihlásit webhook
Začne odesílat události na URL – volá ho aplikace automatizační platformy, když uživatel zapne spouštěč. Vrací odběr a jeho podpisový klíč, jen jednou. Tělo JSON: {"url": "…", "events": ["order.placed"]}; přijímá se i zapierovské {"target_url": "…", "event": "…"}.
| Parametr | Typ | Význam |
|---|---|---|
url |
string, required | Adresa https, na kterou se má odesílat (přijímá se i target_url). |
events |
array of strings, required | Typy událostí, rodiny jako order.* nebo loyalty, nebo * pro vše (pro jednu se přijímá i event). |
description |
string | Název zobrazený v administraci. Výchozí je platforma a název klíče. |
/v1/company/webhooks/{id}
Jen pro čtení nebo čtení i zápis
Odhlásit webhook
Zastaví odesílání na odběr vytvořený tímto klíčem. Vrací 204. Zneplatnění klíče odstraní i všechny jeho odběry.
Objekt rezervace
Rezervace stolu i termín mají jeden společný tvar: kind, id, status, source, guestInitiated, startsAt/endsAt/timezone (vlastní pásmo provozovny), currency, company, branch, guest, attribution, conversionId, createdAt/updatedAt – plus partySize a table u rezervace stolu, service a specialist u termínu. Je to přesně to, co doručuje webhook, takže příjemce, který zvládne jedno, zvládne obojí.
{
"data": {
"kind": "reservation",
"id": 4821,
"status": "confirmed",
"source": "online",
"guestInitiated": true,
"startsAt": "2026-09-12T20:00:00+03:00",
"endsAt": "2026-09-12T21:30:00+03:00",
"timezone": "Asia/Baku",
"currency": "AZN",
"company": { "id": 12, "name": "Cafe Aroma", "slug": "cafe-aroma", "country": "AZ" },
"branch": { "id": 3, "name": "Nizami st." },
"partySize": 4,
"table": { "id": 9, "label": "T3" },
"guest": { "name": "Maria K.", "phone": "…", "email": "…" },
"locale": "en",
"note": null,
"conversionId": "tt3f9c…",
"createdAt": "2026-09-10T08:12:04+00:00",
"updatedAt": "2026-09-12T20:00:03+00:00",
"attribution": { "channel": "widget", "utmSource": "instagram", "gclid": null, "fbclid": "IwAR2…" }
}
}
Objekt objednávky
Objednávka má jeden tvar, ať ji potkáte kdekoli – v REST API, ve webhoocích objednávek i v proudu událostí: kind ("order"), id, number (číslo lístku, které personál vyvolává), status (open nebo paid), source (customer nebo staff), guestInitiated, fulfilment, table, label, deliveryAddress, note, currency, timezone, company, branch, customer (člen věrnostního programu, pokud ho personál identifikoval), items (name, variant, quantity, unitPriceCents, subtotalCents), itemCount, subtotalCents, discountCents, deliveryFeeCents, tipCents, totalCents, valueCents (hodnota objednávky bez spropitného – číslo, které hlásí konverze), paymentMethod, servedBy, conversionId, createdAt, paidAt a attribution. Částky jsou vždy v nejmenších jednotkách měny.
{
"data": {
"kind": "order",
"id": 9170,
"number": 42,
"status": "paid",
"source": "customer",
"guestInitiated": true,
"fulfilment": "takeaway",
"table": null,
"label": "Ana",
"currency": "EUR",
"branch": { "id": 3, "name": "Vitosha Blvd" },
"customer": { "id": 311, "name": "Ana", "phone": "…" },
"items": [
{ "menuItemId": 88, "name": "Flat white", "variant": "Large",
"quantity": 2, "unitPriceCents": 450, "subtotalCents": 900 }
],
"itemCount": 2,
"subtotalCents": 900,
"discountCents": 0,
"deliveryFeeCents": 0,
"tipCents": 100,
"totalCents": 1000,
"valueCents": 900,
"paymentMethod": "online",
"conversionId": "tt81ad…",
"createdAt": "2026-09-12T12:04:10+03:00",
"paidAt": "2026-09-12T12:05:02+03:00",
"attribution": { "channel": "web", "utmSource": "google", "gclid": "Cj0K…" }
}
}
Objekt věrnosti
Každá věrnostní událost, karta i odměna sdílí jeden tvar: kind ("loyalty"), id (karta), timezone, company, branch (kde k ní došlo, pokud je známo), program (id, name, stampsRequired, rewardTitle), customer (id, name, phone, locale), card (id, status, stampsCount, stampsRequired, stampsToReward, createdAt), stamp (u razítka: source, issuedBy, createdAt) a reward (u odměny: code, title, status, expiresAt, redeemedAt, redeemedBy), plus conversionId, id, pod kterým se hlásí registrace do věrnostního programu.
{
"kind": "loyalty",
"id": 5120,
"program": { "id": 4, "name": "Coffee card", "stampsRequired": 8, "rewardTitle": "Free coffee" },
"customer": { "id": 311, "name": "Ana", "phone": "…", "locale": "bg" },
"card": { "id": 5120, "status": "active", "stampsCount": 5,
"stampsRequired": 8, "stampsToReward": 3 },
"branch": { "id": 3, "name": "Vitosha Blvd" },
"stamp": { "source": "qr_scan", "issuedBy": "Ivan", "createdAt": "…" },
"reward": null,
"conversionId": "tt5c02…"
}
Proud událostí
Každý řádek je { id, cursor, type, createdAt, previousStatus, data }. data obsahuje předmět pod klíčem, který určuje prefix události: data.booking, data.order nebo data.loyalty. Uložte si nejvyšší zpracovaný cursor a předejte ho zpět jako after – nikdy nepřeskočí ani nezopakuje řádek, takže je bezpečné po pádu pokračovat. Typy, které nezpracováváte, ignorujte: mohou přibývat nové.
| Typ události | Význam |
|---|---|
booking.requested | Host požádal o rezervaci, která čeká na vaše potvrzení. |
booking.confirmed | Rezervace je potvrzena – vytvořena jako potvrzená, nebo později potvrzena personálem. |
booking.cancelled | Zrušeno hostem nebo podnikem; kým, uvádí status. |
booking.no_show | Host nedorazil. |
booking.completed | Návštěva skončila. |
order.placed | Objednávka hosta dorazila do podniku – ze stránky, z QR kódu stolu, s sebou nebo s rozvozem; po zaplacení, pokud podnik vybírá platbu předem. |
order.paid | Jakákoli objednávka byla uhrazena, včetně prodejů namarkovaných na pokladně. |
loyalty.member_joined | Zákazník dostal své první razítko v programu. |
loyalty.stamp_added | Na kartu bylo přidáno razítko. |
loyalty.reward_issued | Karta byla zaplněna a vydána její odměna. |
loyalty.reward_redeemed | Odměna byla předána. |
curl "https://api.tapti.me/v1/company/events?after=998&limit=100" \
-H "Authorization: Bearer tt_live_…"
Webhooky
Vytvořte endpoint v sekci Integrace → Webhooky a API – nebo připojte Zapier, Make, n8n či Pipedream v sekci Integrace → Automatizace – a TapTime odešle podepsanou JSON událost metodou POST ve chvíli, kdy se změní rezervace, objednávka nebo věrnostní karta. Události volíte pro každý endpoint zvlášť. Firma může mít dohromady až 50 webhooků, postbacků, chatů a automatizačních propojení.
| Hlavička | Význam |
|---|---|
TapTime-Event | Typ události, např. booking.confirmed. |
TapTime-Event-Id | Stálé id události – použijte ho k odstranění duplicit při opakovaném doručení. |
TapTime-Delivery | Id tohoto konkrétního pokusu o doručení. |
TapTime-Signature | t=<unix time>,v1=<hex HMAC-SHA256 z "t.rawBody">, podepsáno vlastním tajným klíčem endpointu. |
- Jakákoli odpověď 2xx se považuje za doručení; odpověď mimo 2xx nebo vypršení časového limitu se opakuje s odstupem (1 min, 5 min, 15 min, 1 h, 3 h, 6 h, 12 h) až do 8 pokusů – odpověď 410 opakování zastaví.
- Přesměrování se nenásledují.
- URL musí být v produkci HTTPS a nesmí mířit na privátní ani loopback adresu.
- Doručení je alespoň jednou: vždy ověřte podpis a odstraňujte duplicity podle TapTime-Event-Id.
{
"id": "evt_9f3c2a7e1b",
"type": "booking.confirmed",
"createdAt": "2026-09-12T19:02:11+03:00",
"test": false,
"data": { "booking": { "kind": "reservation", "id": 4821, "status": "confirmed", "…": "…" } }
}
const [t, v1] = req.headers["taptime-signature"]
.split(",").map(part => part.split("=")[1]);
const expected = crypto
.createHmac("sha256", process.env.TAPTIME_WEBHOOK_SECRET)
.update(`${t}.${rawBody}`)
.digest("hex");
const valid = crypto.timingSafeEqual(
Buffer.from(expected), Buffer.from(v1));
Odběry webhooků
Automatizační platformy zapínají a vypínají spouštěče přes API, místo aby uživatele žádaly o vložení URL („REST hooks“): pošlete POST s vlastní URL platformy a požadovanými událostmi, uložte si vrácené id a při vypnutí spouštěče ho smažte přes DELETE. Odběr je běžný podepsaný webhook – zobrazuje se v administraci a je označen klíčem, který ho vytvořil.
- Klíč vidí a odstraňuje jen odběry, které sám vytvořil; zneplatnění klíče odstraní všechny.
- Adresy na hooks.zapier.com, make.com a pipedream.net se rozpoznají a zobrazí s názvem platformy; jakákoli jiná adresa https je běžný webhook.
- Podpisový klíč se vrací jen jednou, v odpovědi na POST; majitel si ho může v administraci znovu zobrazit.
curl -X POST "https://api.tapti.me/v1/company/webhooks" \
-H "Authorization: Bearer tt_live_…" -H "Content-Type: application/json" \
-d '{"url": "https://hooks.zapier.com/hooks/catch/123/abc/", "events": ["order.placed"]}'
Postbacky
Požadavek GET nebo POST na vlastní URL vašeho trackeru s vyplněnými makry, pro platformy, které místo JSON webhooků používají postbacky v query stringu. U objednávky je {value} hodnota objednávky bez spropitného a {order_id} její id.
https://tracker.example/postback
?cid={click_id}&event={event}&status={status}
&payout={value}&cur={currency}
Dostupné zástupné symboly
{event}{event_id}{status}{booking_id}{booking_type}{order_id}{customer_id}{conversion_id}{value}{currency}{party_size}{branch_id}{timestamp}{utm_source}{utm_medium}{utm_campaign}{utm_term}{utm_content}{gclid}{fbclid}{msclkid}{ttclid}{click_id}
Chyby
Každá chyba je JSON: { "error": "<code>", "message": "<human-readable>" }.
| Stav | chyba | Význam |
|---|---|---|
| 401 | unauthorized |
Chybí hlavička Authorization nebo je klíč neplatný či zneplatněný. |
| 403 | forbidden |
Klíč jen pro čtení zavolal zapisovací endpoint (změnu stavu). |
| 404 | not_found |
Firmě klíče nepatří žádná rezervace s tímto id. |
| 409 | conflict |
Změna stavu by stůl nebo termín zarezervovala dvakrát; nic se nezměnilo. |
| 422 | invalid_status |
Hodnota status v těle není jednou z přijímaných hodnot pro daný typ rezervace. |
| 422 | invalid_type |
Parametr type proudu událostí neodpovídá žádnému typu ani rodině událostí. |
| 422 | invalid_url |
URL odběru není veřejná adresa https. |
| 429 | rate_limited |
Více než 50 požadavků za minutu pro tento klíč. Zpomalte a zkuste to znovu. |
Přístup k API, webhooky i automatizační a chatové integrace jsou součástí každého modulu – bez příplatku a bez zvláštního tarifu pro vývojáře.
Vyzkoušet zdarma