Fejlesztői dokumentáció

TapTime REST API

Olvassa és módosítsa az asztal- és időpontfoglalásokat, kérje le a rendeléseket és a hűségkártyákat, kérdezze le a sorba rendezett eseményfolyamot, és fogadjon aláírt webhookokat — saját CRM-jéből, kasszarendszeréből, adattárházából vagy egy automatizálási platformról. Ez az oldal a teljes referencia; a konverziókövetési útmutató azt mutatja be, miért érdemes használni.

Alap-URLhttps://api.tapti.me HitelesítésBearer token FormátumJSON Miért használja

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.

Egy dátum óta módosított, visszaigazolt asztalfoglalások
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

GET /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.

GET /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éterTípusJelenté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.
GET /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éterTípusJelenté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.
GET /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.

GET /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.

POST /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éterTípusJelenté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).
POST /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éterTípusJelentés
status string, kötelező Az alábbiak egyike: pending, confirmed, completed, no_show, cancelled (a canceled és a canceled_by_venue is elfogadott).
GET /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éterTípusJelenté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.
GET /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éterTípusJelenté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.
GET /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.

GET /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.

GET /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éterTípusJelenté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.
GET /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éterTípusJelenté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.
GET /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.

POST /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éterTípusJelenté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.
DELETE /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.

GET /v1/company/reservations/4821 → data
{
  "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.

GET /v1/company/orders/9170 → data
{
  "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.

GET /v1/company/loyalty/cards → data[0]
{
  "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ípusJelentés
booking.requestedEgy vendég olyan foglalást kért, amely az Ön visszaigazolására vár.
booking.confirmedA foglalás visszaigazolva — eleve visszaigazoltként jött létre, vagy később a személyzet igazolta vissza.
booking.cancelledA vendég vagy az üzlet lemondta; a status mutatja, melyikük.
booking.no_showA vendég nem jelent meg.
booking.completedA látogatás véget ért.
order.placedEgy 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.paidBármely rendelés kiegyenlítve, a kasszán beütött eladásokat is beleértve.
loyalty.member_joinedEgy ügyfél megkapta az első pecsétjét egy programban.
loyalty.stamp_addedEgy kártyára pecsét került.
loyalty.reward_issuedEgy kártya megtelt, és kiadták a jutalmát.
loyalty.reward_redeemedEgy jutalmat átadtak.
Szinkronban maradás az eseményfolyammal
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écJelentés
TapTime-EventAz eseménytípus, pl. booking.confirmed.
TapTime-Event-IdAz esemény állandó azonosítója — ezzel szűrheti ki az újrapróbált kézbesítések duplikátumait.
TapTime-DeliveryEnnek a konkrét kézbesítési kísérletnek az azonosítója.
TapTime-Signaturet=<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.
POST · application/json · booking.confirmed
{
  "id": "evt_9f3c2a7e1b",
  "type": "booking.confirmed",
  "createdAt": "2026-09-12T19:02:11+03:00",
  "test": false,
  "data": { "booking": { "kind": "reservation", "id": 4821, "status": "confirmed", "…": "…" } }
}
Az aláírás ellenőrzése (Node.js)
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.
URL feliratkoztatása az új rendelésekre
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.

Postback URL helyőrzőkkel · GET vagy POST
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>" }.

ÁllapothibaJelenté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.
Kulcsra van szüksége?

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