Dokumentace pro vývojáře

REST API TapTime

Čtěte a upravujte rezervace stolů a termínů, čtěte objednávky a věrnostní karty, dotazujte se na seřazený proud událostí a přijímejte podepsané webhooky – z vlastního CRM, pokladny, datového skladu nebo automatizační platformy. Tato stránka je úplná reference; průvodce měřením konverzí vysvětluje, proč ho používat.

Základní URLhttps://api.tapti.me OprávněníBearer token FormátJSON Proč ho používat

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.

Potvrzené rezervace změněné od určitého data
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

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

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

ParametrTypVý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.
GET /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ů.

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

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

POST /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": "..."}.

ParametrTypVýznam
status string, required Jedna z hodnot: pending, confirmed, seated, completed, no_show, cancelled (přijímá se i canceled a canceled_by_venue).
POST /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.

ParametrTypVýznam
status string, required Jedna z hodnot: pending, confirmed, completed, no_show, cancelled (přijímá se i canceled a canceled_by_venue).
GET /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.

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

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

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

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

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

ParametrTypVý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.
GET /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í.

POST /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": "…"}.

ParametrTypVý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.
DELETE /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í.

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…" }
  }
}

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.

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…" }
  }
}

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.

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…"
}

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álostiVýznam
booking.requestedHost požádal o rezervaci, která čeká na vaše potvrzení.
booking.confirmedRezervace je potvrzena – vytvořena jako potvrzená, nebo později potvrzena personálem.
booking.cancelledZrušeno hostem nebo podnikem; kým, uvádí status.
booking.no_showHost nedorazil.
booking.completedNávštěva skončila.
order.placedObjedná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.paidJakákoli objednávka byla uhrazena, včetně prodejů namarkovaných na pokladně.
loyalty.member_joinedZákazník dostal své první razítko v programu.
loyalty.stamp_addedNa kartu bylo přidáno razítko.
loyalty.reward_issuedKarta byla zaplněna a vydána její odměna.
loyalty.reward_redeemedOdměna byla předána.
Zůstaňte v synchronizaci s proudem událostí
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čkaVýznam
TapTime-EventTyp události, např. booking.confirmed.
TapTime-Event-IdStálé id události – použijte ho k odstranění duplicit při opakovaném doručení.
TapTime-DeliveryId tohoto konkrétního pokusu o doručení.
TapTime-Signaturet=<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.
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", "…": "…" } }
}
Ověření podpisu (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));

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.
Přihlásit URL k odběru nových objednávek
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.

URL postbacku se zástupnými symboly · GET nebo POST
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>" }.

StavchybaVý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.
Potřebujete klíč?

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