Minden kéréshez céges API-kulcs szükséges (a kezelőfelületen: Integrációk → Webhookok és API), Authorization: Bearer tt_live_… formában elküldve. A válaszok és a hibák JSON formátumúak.
curl "https://api.tapti.me/v1/company/reservations?status=confirmed&updatedSince=2026-09-01T00:00:00Z" \
-H "Authorization: Bearer tt_live_…"
Hitelesítés
Minden kérés bearer tokenként egy céges API-kulcsot tartalmaz. Kulcsot a kezelőfelületen hozhat létre — Integrációk → Webhookok és API → REST API-kulcsok —, ahol egyszer jelenik meg, és a szerveren csak SHA-256 hashként tároljuk; az elveszett kulcsot visszavonjuk és lecseréljük, nem állítjuk helyre. Egy cégnek legfeljebb 10 aktív kulcsa lehet.
- A csak olvasási jogú kulcsok minden GET végpontot meghívhatnak, és webhookokra fel- és leiratkozhatnak — egy feliratkozás semmi olyat nem küld, amit a kulcs ne tudna amúgy is olvasni.
- Az olvasási-írási jogú kulcsok POST kéréssel foglalási állapotot is módosíthatnak; egy csak olvasási jogú kulcs ezeken az útvonalakon 403 Forbidden választ kap.
- Egy kulcs egyetlen céghez tartozik — minden lista és lekérdezés eleve erre a cégre szűkül, nincs companyId paraméter.
Kéréskorlátok
Kulcsonként percenként 50 kérés, csúszó időablakkal, minden végpontra közösen. Túllépés esetén 429 Too Many Requests a válasz; várjon, és próbálja újra ahelyett, hogy gyakrabban kérdezne le — vagy iratkozzon fel egy webhookra, és hagyja abba a lekérdezést.
Végpontok
/v1/company
Csak olvasás vagy olvasás-írás
Az aktuális cég lekérése
A cég, amelyhez a kulcs tartozik, és hogy maga a kulcs mire jogosult.
/v1/company/reservations
Csak olvasás vagy olvasás-írás
Asztalfoglalások listázása
A cég asztalfoglalásai, a legkorábbi kezdési időponttal kezdve — vagy ha az updatedSince be van állítva, a legrégebben módosítottal kezdve.
| Paraméter | Típus | Jelentés |
|---|---|---|
status |
string | Vesszővel elválasztva: pending, confirmed, seated, completed, no_show, cancelled. A cancelled mindkét lemondási okra illeszkedik. |
branchId |
integer | Szűkítés egy telephelyre. |
from |
ISO 8601 dátum-idő | Csak az ezen időpontban vagy utána kezdődő foglalások (UTC, ha nincs megadva eltolás). |
to |
ISO 8601 dátum-idő | Csak az ezen időpont előtt kezdődő foglalások. |
updatedSince |
ISO 8601 dátum-idő | Csak az ezen időpont óta módosított foglalások; a rendezést updatedAt szerinti növekvőre állítja, szinkronizáláshoz. |
limit |
integer | Oldalméret, 1–100. Alapértelmezés: 50. |
page |
integer | Oldalszám, 1-től számozva. Alapértelmezés: 1. |
/v1/company/appointments
Csak olvasás vagy olvasás-írás
Időpontfoglalások listázása
Ugyanaz a forma és ugyanazok a szűrők, mint az asztalfoglalásoknál, az Időpontfoglalás modulhoz.
| Paraméter | Típus | Jelentés |
|---|---|---|
status |
string | Vesszővel elválasztva: pending, confirmed, completed, no_show, cancelled. |
branchId |
integer | Szűkítés egy telephelyre. |
from |
ISO 8601 dátum-idő | Csak az ezen időpontban vagy utána kezdődő foglalások. |
to |
ISO 8601 dátum-idő | Csak az ezen időpont előtt kezdődő foglalások. |
updatedSince |
ISO 8601 dátum-idő | Csak az ezen időpont óta módosított foglalások; updatedAt szerint növekvő sorrendben. |
limit |
integer | Oldalméret, 1–100. Alapértelmezés: 50. |
page |
integer | Oldalszám, 1-től számozva. Alapértelmezés: 1. |
/v1/company/reservations/{id}
Csak olvasás vagy olvasás-írás
Egy asztalfoglalás lekérése
Egy asztalfoglalás, ugyanabban a formában, ahogy a webhookok szállítják, az attribúciójával együtt. 404, ha az azonosító nem a kulcs cégéhez tartozik.
/v1/company/appointments/{id}
Csak olvasás vagy olvasás-írás
Egy időpontfoglalás lekérése
Egy időpontfoglalás, ugyanazzal a formával és szabályokkal, mint egy asztalfoglalás lekérése.
/v1/company/reservations/{id}/status
Csak olvasás-írás
Asztalfoglalás állapotának módosítása
Visszaigazolás, leültetés, lezárás, meg nem jelenés jelölése, lemondás vagy újranyitás — ugyanazokat a webhookokat és konverziókat indítja, mint a táblán végzett módosítás. JSON törzs: {"status": "..."}.
| Paraméter | Típus | Jelentés |
|---|---|---|
status |
string, kötelező | Az alábbiak egyike: pending, confirmed, seated, completed, no_show, cancelled (a canceled és a canceled_by_venue is elfogadott). |
/v1/company/appointments/{id}/status
Csak olvasás-írás
Időpontfoglalás állapotának módosítása
Ugyanaz, mint az asztalfoglalás végpontja, a seated állapot nélkül.
| Paraméter | Típus | Jelentés |
|---|---|---|
status |
string, kötelező | Az alábbiak egyike: pending, confirmed, completed, no_show, cancelled (a canceled és a canceled_by_venue is elfogadott). |
/v1/company/events
Csak olvasás vagy olvasás-írás
Az eseményfolyam lekérdezése
Minden foglalási, rendelési és hűségprogram-esemény, a legrégebbivel kezdve — ugyanaz a folyam, amelyből a webhookok készülnek. Adja meg az utoljára látott kurzort az after paraméterben, hogy csak az újakat kapja meg, és a type paraméterrel csak bizonyos fajtákat kérjen le.
| Paraméter | Típus | Jelentés |
|---|---|---|
after |
integer kurzor | Az utoljára feldolgozott esemény kurzora. Hagyja el, ha az elejétől akarja kezdeni. |
type |
string | Vesszővel elválasztott eseménytípusok vagy -családok: booking.confirmed,order.placed, vagy order, loyalty.*. Hagyja el az összes eseményhez. |
limit |
integer | Oldalméret, 1–100. Alapértelmezés: 50. |
/v1/company/orders
Csak olvasás vagy olvasás-írás
Rendelések listázása
A vendégek asztali, elviteles és kiszállításos rendelései, valamint minden, a kasszán beütött eladás, a legrégebbivel kezdve — vagy ha a paidSince be van állítva, a kifizetés sorrendjében. Az előre fizetésre még váró rendelések nem szerepelnek benne.
| Paraméter | Típus | Jelentés |
|---|---|---|
status |
string | Vesszővel elválasztva: open, paid. |
source |
string | customer (a vendég adta le) vagy staff (a személyzet ütötte be). |
fulfilment |
string | Vesszővel elválasztva: dine_in, takeaway, delivery. |
branchId |
integer | Szűkítés egy telephelyre. |
from |
ISO 8601 dátum-idő | Csak az ezen időpontban vagy utána létrehozott rendelések. |
to |
ISO 8601 dátum-idő | Csak az ezen időpont előtt létrehozott rendelések. |
paidSince |
ISO 8601 dátum-idő | Csak az ezen időpont óta kifizetett rendelések; paidAt szerint növekvő sorrendben, az eladások szinkronizálásához. |
limit |
integer | Oldalméret, 1–100. Alapértelmezés: 50. |
page |
integer | Oldalszám, 1-től számozva. Alapértelmezés: 1. |
/v1/company/orders/{id}
Csak olvasás vagy olvasás-írás
Egy rendelés lekérése
Egy rendelés a tételeivel, végösszegeivel és attribúciójával, abban a formában, ahogy a rendelési webhookok szállítják.
/v1/company/loyalty/programs
Csak olvasás vagy olvasás-írás
Hűségprogramok listázása
Minden pecsétkártya-program: név, állapot, szükséges pecsétek száma, a jutalom és hogy hol érvényes.
/v1/company/loyalty/cards
Csak olvasás vagy olvasás-írás
Hűségkártyák listázása
A tagok kártyái, a hűségprogram objektum formájában. Annak a tagnak, aki megtöltött egy kártyát, az lezárt (completed) állapotú, mellette pedig egy új, aktív kártya van; a customer.id a tag.
| Paraméter | Típus | Jelentés |
|---|---|---|
programId |
integer | Szűkítés egy programra. |
customerId |
integer | Szűkítés egy tagra. |
status |
string | Vesszővel elválasztva: active, completed. |
updatedSince |
ISO 8601 dátum-idő | Csak az ezen időpont óta pecsételt vagy lezárt kártyák; updatedAt szerint növekvő sorrendben. |
limit |
integer | Oldalméret, 1–100. Alapértelmezés: 50. |
page |
integer | Oldalszám, 1-től számozva. Alapértelmezés: 1. |
/v1/company/loyalty/rewards
Csak olvasás vagy olvasás-írás
Hűségjutalmak listázása
A kártyák megtöltésével megszerzett jutalmak, a kódjukkal, lejáratukkal, és azzal, hogy beváltották-e őket.
| Paraméter | Típus | Jelentés |
|---|---|---|
programId |
integer | Szűkítés egy programra. |
customerId |
integer | Szűkítés egy tagra. |
status |
string | Vesszővel elválasztva: issued, redeemed, expired. |
from |
ISO 8601 dátum-idő | Csak az ezen időpontban vagy utána kiadott jutalmak. |
to |
ISO 8601 dátum-idő | Csak az ezen időpont előtt kiadott jutalmak. |
limit |
integer | Oldalméret, 1–100. Alapértelmezés: 50. |
page |
integer | Oldalszám, 1-től számozva. Alapértelmezés: 1. |
/v1/company/webhooks
Csak olvasás vagy olvasás-írás
Webhook-feliratkozások listázása
Az e kulccsal létrehozott feliratkozások. A kezelőfelületen hozzáadott webhookok itt nem szerepelnek.
/v1/company/webhooks
Csak olvasás vagy olvasás-írás
Feliratkozás webhookra
Elkezdi az események küldését egy URL-re — ezt hívja meg egy automatizálási platform alkalmazása, amikor a felhasználó bekapcsol egy triggert. Visszaadja a feliratkozást és annak aláíró titkos kulcsát, egyszer. JSON törzs: {"url": "…", "events": ["order.placed"]}; a Zapier {"target_url": "…", "event": "…"} formátuma is elfogadott.
| Paraméter | Típus | Jelentés |
|---|---|---|
url |
string, kötelező | A https-cím, ahová küldünk (a target_url is elfogadott). |
events |
stringek tömbje, kötelező | Eseménytípusok, családok, például order.* vagy loyalty, vagy * mindenhez (egyetlen eseményhez az event is elfogadott). |
description |
string | A kezelőfelületen megjelenő név. Alapértelmezés szerint a platform és a kulcs neve. |
/v1/company/webhooks/{id}
Csak olvasás vagy olvasás-írás
Leiratkozás webhookról
Leállítja a küldést egy e kulccsal létrehozott feliratkozásra. 204-et ad vissza. A kulcs visszavonása az összes feliratkozását is eltávolítja.
A foglalás objektum
Az asztalfoglalás és az időpontfoglalás egyetlen közös formában érkezik: kind, id, status, source, guestInitiated, startsAt/endsAt/timezone (a telephely saját időzónája), currency, company, branch, guest, attribution, conversionId, createdAt/updatedAt — valamint asztalfoglalásnál partySize és table, időpontfoglalásnál service és specialist. Pontosan ezt kézbesíti egy webhook is, így egy fogadó, amely az egyiket kezeli, a másikat is kezeli.
{
"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…" }
}
}
A rendelés objektum
A rendelés mindenhol ugyanabban a formában érkezik — a REST API-ban, a rendelési webhookokban és az eseményfolyamban: kind ("order"), id, number (a sorszám, amelyet a személyzet kiszól), status (open vagy paid), source (customer vagy staff), guestInitiated, fulfilment, table, label, deliveryAddress, note, currency, timezone, company, branch, customer (a hűségprogram tagja, ha a személyzet azonosította), items (name, variant, quantity, unitPriceCents, subtotalCents), itemCount, subtotalCents, discountCents, deliveryFeeCents, tipCents, totalCents, valueCents (a rendelés értéke borravaló nélkül — ezt az összeget jelentik a konverziók), paymentMethod, servedBy, conversionId, createdAt, paidAt és attribution. Az összegek mindig a pénznem legkisebb egységében szerepelnek.
{
"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…" }
}
}
A hűségprogram objektum
Minden hűségprogram-esemény, kártya és jutalom ugyanazt a formát használja: kind ("loyalty"), id (a kártya), timezone, company, branch (ahol történt, ha van ilyen), program (id, name, stampsRequired, rewardTitle), customer (id, name, phone, locale), card (id, status, stampsCount, stampsRequired, stampsToReward, createdAt), stamp (pecsétnél: source, issuedBy, createdAt) és reward (jutalomnál: code, title, status, expiresAt, redeemedAt, redeemedBy), valamint conversionId, az azonosító, amelyen egy hűségprogram-csatlakozást jelentünk.
{
"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…"
}
Eseményfolyam
Minden sor { id, cursor, type, createdAt, previousStatus, data } formájú. A data az esemény előtagja által megnevezett kulcs alatt tartalmazza a tárgyat: data.booking, data.order vagy data.loyalty. Tárolja el a legmagasabb feldolgozott kurzort, és adja vissza after paraméterként — sosem hagy ki és sosem ismétel sort, így összeomlás után is biztonságosan folytatható. Hagyja figyelmen kívül azokat a típusokat, amelyeket nem kezel: újak is megjelenhetnek.
| Eseménytípus | Jelentés |
|---|---|
booking.requested | Egy vendég olyan foglalást kért, amely az Ön visszaigazolására vár. |
booking.confirmed | A foglalás visszaigazolva — eleve visszaigazoltként jött létre, vagy később a személyzet igazolta vissza. |
booking.cancelled | A vendég vagy az üzlet lemondta; a status mutatja, melyikük. |
booking.no_show | A vendég nem jelent meg. |
booking.completed | A látogatás véget ért. |
order.placed | Egy vendég rendelése megérkezett az üzlethez — az oldalról, egy asztal QR-kódjáról, elvitelre vagy kiszállításra; ha az üzlet előre fizetést kér, akkor a fizetés után. |
order.paid | Bármely rendelés kiegyenlítve, a kasszán beütött eladásokat is beleértve. |
loyalty.member_joined | Egy ügyfél megkapta az első pecsétjét egy programban. |
loyalty.stamp_added | Egy kártyára pecsét került. |
loyalty.reward_issued | Egy kártya megtelt, és kiadták a jutalmát. |
loyalty.reward_redeemed | Egy jutalmat átadtak. |
curl "https://api.tapti.me/v1/company/events?after=998&limit=100" \
-H "Authorization: Bearer tt_live_…"
Webhookok
Hozzon létre egy végpontot az Integrációk → Webhookok és API menüpontban — vagy csatlakoztassa a Zapiert, a Make-et, az n8n-t vagy a Pipedreamet az Integrációk → Automatizálás menüpontban —, és a TapTime abban a pillanatban aláírt JSON-eseményt küld POST kéréssel, amikor egy foglalás, rendelés vagy hűségkártya megváltozik. Az eseményeket végpontonként választja ki. Egy cégnek összesen legfeljebb 50 webhookja, postbackje, chatje és automatizálási kapcsolata lehet.
| Fejléc | Jelentés |
|---|---|
TapTime-Event | Az eseménytípus, pl. booking.confirmed. |
TapTime-Event-Id | Az esemény állandó azonosítója — ezzel szűrheti ki az újrapróbált kézbesítések duplikátumait. |
TapTime-Delivery | Ennek a konkrét kézbesítési kísérletnek az azonosítója. |
TapTime-Signature | t=<unix time>,v1=<a "t.rawBody" hexadecimális HMAC-SHA256 értéke>, a végpont saját titkos kulcsával aláírva. |
- Bármely 2xx válasz kézbesítettnek számít; a nem 2xx válasz vagy az időtúllépés esetén fokozatosan növekvő várakozással újrapróbáljuk (1 perc, 5 perc, 15 perc, 1 óra, 3 óra, 6 óra, 12 óra), legfeljebb 8 kísérletig — a 410 leállítja az újrapróbálást.
- Az átirányításokat nem követjük.
- Éles környezetben az URL-nek HTTPS-nek kell lennie, és nem mutathat privát vagy loopback címre.
- A kézbesítés legalább egyszeri: mindig ellenőrizze az aláírást, és szűrje a duplikátumokat a TapTime-Event-Id alapján.
{
"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));
Webhook-feliratkozások
Az automatizálási platformok az API-n keresztül kapcsolják be és ki a triggereket, ahelyett, hogy a felhasználót URL beillesztésére kérnék („REST hookok”): küldje el POST kéréssel a platform saját URL-jét a kívánt eseményekkel, őrizze meg a visszakapott azonosítót, és törölje DELETE kéréssel, amikor a triggert kikapcsolják. A feliratkozás egy szokásos aláírt webhook — megjelenik a kezelőfelületen, a létrehozó kulccsal megjelölve.
- Egy kulcs csak az általa létrehozott feliratkozásokat látja és távolíthatja el; a kulcs visszavonása mindegyiket eltávolítja.
- A hooks.zapier.com, a make.com és a pipedream.net címeit felismerjük, és a platform nevével jelenítjük meg; minden más https-cím egyszerű webhook.
- Az aláíró titkos kulcsot egyszer adjuk vissza, a POST kérésre adott válaszban; a tulajdonos a kezelőfelületen újra megjelenítheti.
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"]}'
Postbackek
GET vagy POST kérés a követőrendszere saját URL-jére, kitöltött makrókkal, azoknak a platformoknak, amelyek JSON-webhookok helyett lekérdezési karakterláncos postbacket használnak. Rendelésnél a {value} a rendelés értéke borravaló nélkül, az {order_id} pedig az azonosítója.
https://tracker.example/postback
?cid={click_id}&event={event}&status={status}
&payout={value}&cur={currency}
Elérhető helyőrzők
{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}
Hibák
Minden hiba JSON formátumú: { "error": "<code>", "message": "<human-readable>" }.
| Állapot | hiba | Jelentés |
|---|---|---|
| 401 | unauthorized |
Hiányzik az Authorization fejléc, vagy a kulcs érvénytelen, illetve vissza lett vonva. |
| 403 | forbidden |
Egy csak olvasási jogú kulcs írási végpontot hívott meg (állapotmódosítást). |
| 404 | not_found |
Ezzel az azonosítóval nem tartozik foglalás a kulcs cégéhez. |
| 409 | conflict |
Az állapotmódosítás kettős foglalást okozna az asztalon vagy az időponton; semmi sem változott. |
| 422 | invalid_status |
A törzsben megadott status érték nem tartozik az adott foglalástípusnál elfogadott értékek közé. |
| 422 | invalid_type |
Az eseményfolyam type paramétere nem nevez meg eseménytípust vagy -családot. |
| 422 | invalid_url |
A feliratkozás URL-je nem nyilvános https-cím. |
| 429 | rate_limited |
Több mint 50 kérés egy perc alatt ezzel a kulccsal. Lassítson, és próbálja újra. |
Az API-hozzáférés, a webhookok, valamint az automatizálási és chatintegrációk minden modulban benne vannak — felár és külön fejlesztői csomag nélkül.
Ingyenes próba indítása