Svaki zahtev zahteva API ključ kompanije (Integracije → Vebhukovi i API u panelu) poslat kao Authorization: Bearer tt_live_….. Odgovori i greške su u JSON formatu.
curl "https://api.tapti.me/v1/company/reservations?status=confirmed&updatedSince=2026-09-01T00:00:00Z" \
-H "Authorization: Bearer tt_live_…"
Autentifikacija
Svaki zahtev nosi kompanijski API ključ kao token nosioca. Napravite ga na panelu — Integracije → Vebhukovi i API → REST API ključevi — gde se prikazuje samo jednom i čuva se samo na strani servera kao SHA-256 haš; izgubljeni ključ se poništava i zamenjuje, a ne vraća. Kompanija može imati najviše 10 aktivnih ključeva.
- Ključevi samo za čitanje mogu da pozivaju svaku GET krajnju tačku, kao i da pretplate i odjave vebhukove — pretplata ne šalje ništa što ključ ionako ne bi mogao da pročita.
- Ključevi za čitanje i pisanje mogu i da POST zahtevom promene status rezervacije; ključ samo za čitanje na tim rutama dobija 403 Forbidden.
- Ključ pripada jednoj kompaniji — svaka lista i pretraga već su ograničene na nju, parametar companyId ne postoji.
Ograničenja broja zahteva
50 zahteva u minuti po ključu, u kliznom prozoru, zajednički za sve krajnje tačke. Prekoračenje vraća 429 Too Many Requests; sačekajte i pokušajte ponovo umesto da češće šaljete upite — ili pretplatite vebhuk i prestanite da proveravate.
Krajnje tačke
/v1/company
Samo za čitanje ili za čitanje i pisanje
Dobijte trenutnu kompaniju
Kompanija kojoj pripada ključ i šta sam ključ može da uradi.
/v1/company/reservations
Samo za čitanje ili za čitanje i pisanje
Spisak rezervacija
Rezervacije stolova za kompaniju, prvo po najstarijem vremenu početka — ili, kada je podešeno updatedSince, prvo se ažurira najstarije.
| Parametar | Type | Značenje |
|---|---|---|
status |
string | Razdeljeno zarezom: u čekanju, potvrđeno, zauzeto, završeno, nepojavljivanje, otkazano. otkazano obuhvata oba razloga za otkazivanje. |
branchId |
integer | Ograniči na jednu granu. |
from |
ISO 8601 datetime | Samo rezervacije koje počinju u ili posle ovog vremena (UTC ako nije navedeno odstupanje). |
to |
ISO 8601 datetime | Samo rezervacije koje počinju pre ovog vremena. |
updatedSince |
ISO 8601 datetime | Samo su rezervacije promenjene od tada; menja sortiranje na updatedAt u porast, za sinhronizaciju. |
limit |
integer | Veličina stranice, 1–100. Podrazumjevano 50. |
page |
integer | Brojanje stranica počinje od 1. Podrazumjevana vrednost 1. |
/v1/company/appointments
Samo za čitanje ili za čitanje i pisanje
Spisak termina
Isti oblik i filteri kao kod rezervacija, za modul termina.
| Parametar | Type | Značenje |
|---|---|---|
status |
string | Razdeljeno zarezom: u čekanju, potvrđeno, završeno, nije se pojavio, otkazano. |
branchId |
integer | Ograniči na jednu granu. |
from |
ISO 8601 datetime | Rezervacije se primaju samo za termine koji počinju u ili posle ovog vremena. |
to |
ISO 8601 datetime | Samo rezervacije koje počinju pre ovog vremena. |
updatedSince |
ISO 8601 datetime | Samo rezervacije su promenjene od tada; sortirano po updatedAt u rastućem redosledu. |
limit |
integer | Veličina stranice, 1–100. Podrazumjevano 50. |
page |
integer | Brojanje stranica počinje od 1. Zvanična vrednost: 1. |
/v1/company/reservations/{id}
Samo za čitanje ili za čitanje i pisanje
Napravite rezervaciju
Jedna rezerva, u istom obliku u kojem je prenose vebhukovi, sa naznakom. 404 kada ID ne pripada kompaniji ključa.
/v1/company/appointments/{id}
Samo za čitanje ili za čitanje i pisanje
Zakažite sastanak
Jedan termin, isti oblik i pravila kao pretraga rezervacija.
/v1/company/reservations/{id}/status
Samo za čitanje i pisanje
Promeni status rezervacije
Potvrdi, zauzmi, završi, obeleži kao nejavljanje, otkaži ili ponovo otvori — pokreće iste vebhukove i konverzije kao i pri promeni na tabli. JSON telo: {"status": "..."}.
| Parametar | Type | Značenje |
|---|---|---|
status |
string, required | Jedan od: u čekanju, potvrđeno, u toku, završeno, nije se pojavio, otkazano (canceled i canceled_by_venue takođe prihvaćeni). |
/v1/company/appointments/{id}/status
Samo za čitanje i pisanje
Promeni status sastanka
Isto kao i rezervacioni endpoint, bez stanja sedećeg stanja.
| Parametar | Type | Značenje |
|---|---|---|
status |
string, required | Jedan od: u čekanju, potvrđeno, završeno, nejavljanje, otkazano (canceled i canceled_by_venue takođe prihvaćeni). |
/v1/company/events
Samo za čitanje ili za čitanje i pisanje
Preuzimanje fida događaja
Svaki događaj rezervacije, porudžbine i lojalnosti, od najstarijeg — isti fid iz kog nastaju vebhukovi. Prosledite poslednji kursor koji ste videli kao after da biste dobili samo novo, i type da biste dobili samo neke vrste događaja.
| Parametar | Type | Značenje |
|---|---|---|
after |
integer cursor | Kursor poslednjeg događaja koji ste obradili. Izostavite ga da biste krenuli od početka. |
type |
string | Tipovi ili porodice događaja, razdvojeni zarezom: booking.confirmed,order.placed, ili order, loyalty.*. Izostavite za sve događaje. |
limit |
integer | Veličina stranice, 1–100. Podrazumevano 50. |
/v1/company/orders
Samo za čitanje ili za čitanje i pisanje
Spisak porudžbina
Porudžbine gostiju za stolom, za poneti i za dostavu, kao i svaka prodaja otkucana na kasi, od najstarije — ili, kada je zadat paidSince, redosledom plaćanja. Porudžbina koja još čeka plaćanje unapred se izostavlja.
| Parametar | Type | Značenje |
|---|---|---|
status |
string | Razdvojeno zarezom: open, paid. |
source |
string | customer (poručio gost) ili staff (otkucalo osoblje). |
fulfilment |
string | Razdvojeno zarezom: dine_in, takeaway, delivery. |
branchId |
integer | Ograničite na jednu filijalu. |
from |
ISO 8601 datetime | Samo porudžbine napravljene u ovo vreme ili kasnije. |
to |
ISO 8601 datetime | Samo porudžbine napravljene pre ovog vremena. |
paidSince |
ISO 8601 datetime | Samo porudžbine plaćene od ovog trenutka; sortira po paidAt rastuće, za sinhronizaciju prodaje. |
limit |
integer | Veličina stranice, 1–100. Podrazumevano 50. |
page |
integer | Broj stranice, počevši od 1. Podrazumevano 1. |
/v1/company/orders/{id}
Samo za čitanje ili za čitanje i pisanje
Preuzimanje porudžbine
Jedna porudžbina sa stavkama, iznosima i atribucijom, u obliku u kom je nose vebhukovi porudžbina.
/v1/company/loyalty/programs
Samo za čitanje ili za čitanje i pisanje
Spisak programa lojalnosti
Svaki program sa karticom pečata: naziv, status, potreban broj pečata, nagrada i gde važi.
/v1/company/loyalty/cards
Samo za čitanje ili za čitanje i pisanje
Spisak kartica lojalnosti
Kartice članova, u obliku objekta lojalnosti. Član koji je popunio karticu ima nju sa statusom completed i pored nje novu aktivnu; customer.id je član.
| Parametar | Type | Značenje |
|---|---|---|
programId |
integer | Ograničite na jedan program. |
customerId |
integer | Ograničite na jednog člana. |
status |
string | Razdvojeno zarezom: active, completed. |
updatedSince |
ISO 8601 datetime | Samo kartice koje su dobile pečat ili su popunjene od ovog trenutka; sortira po updatedAt rastuće. |
limit |
integer | Veličina stranice, 1–100. Podrazumevano 50. |
page |
integer | Broj stranice, počevši od 1. Podrazumevano 1. |
/v1/company/loyalty/rewards
Samo za čitanje ili za čitanje i pisanje
Spisak nagrada lojalnosti
Nagrade osvojene popunjavanjem kartice, sa kodom, rokom važenja i podatkom da li su iskorišćene.
| Parametar | Type | Značenje |
|---|---|---|
programId |
integer | Ograničite na jedan program. |
customerId |
integer | Ograničite na jednog člana. |
status |
string | Razdvojeno zarezom: issued, redeemed, expired. |
from |
ISO 8601 datetime | Samo nagrade izdate u ovo vreme ili kasnije. |
to |
ISO 8601 datetime | Samo nagrade izdate pre ovog vremena. |
limit |
integer | Veličina stranice, 1–100. Podrazumevano 50. |
page |
integer | Broj stranice, počevši od 1. Podrazumevano 1. |
/v1/company/webhooks
Samo za čitanje ili za čitanje i pisanje
Spisak pretplata na vebhukove
Pretplate koje je napravio ovaj ključ. Vebhukovi dodati u panelu ovde se ne prikazuju.
/v1/company/webhooks
Samo za čitanje ili za čitanje i pisanje
Pretplata vebhuka
Pokreće slanje događaja na URL — to poziva aplikacija platforme za automatizaciju kada korisnik uključi okidač. Vraća pretplatu i njen tajni ključ za potpis, samo jednom. JSON telo: {"url": "…", "events": ["order.placed"]}; prihvata se i Zapierov oblik {"target_url": "…", "event": "…"}.
| Parametar | Type | Značenje |
|---|---|---|
url |
string, required | https adresa na koju se šalje (prihvata se i target_url). |
events |
array of strings, required | Tipovi događaja, porodice kao što su order.* ili loyalty, ili * za sve (za jedan događaj prihvata se i event). |
description |
string | Naziv koji se prikazuje u panelu. Podrazumevano naziv platforme i naziv ključa. |
/v1/company/webhooks/{id}
Samo za čitanje ili za čitanje i pisanje
Otkazivanje pretplate na vebhuk
Prekida slanje na pretplatu koju je napravio ovaj ključ. Vraća 204. Opozivanje ključa uklanja i sve njegove pretplate.
Objekat rezervacije
Rezervacija i sastanak imaju isti zajednički oblik: kind, id, status, source, guestInitiated, startsAt/endsAt/timezone (zona filijale), currency, company, branch, guest, attribution, conversionId, createdAt/updatedAt — plus partySize i tabela za rezervaciju, usluga i specijalista za sastanak. To je upravo ono što vebhuk isporučuje, pa prijemnik koji obrađuje jedno obrađuje i oba.
{
"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…" }
}
}
Objekat porudžbine
Porudžbina ima isti oblik gde god da je sretnete — u REST API-ju, vebhukovima porudžbina i fidu događaja: kind ("order"), id, number (broj koji osoblje proziva), status (open ili paid), source (customer ili staff), guestInitiated, fulfilment, table, label, deliveryAddress, note, currency, timezone, company, branch, customer (član programa lojalnosti, kada ga je osoblje identifikovalo), items (name, variant, quantity, unitPriceCents, subtotalCents), itemCount, subtotalCents, discountCents, deliveryFeeCents, tipCents, totalCents, valueCents (vrednost porudžbine bez napojnice — broj koji prijavljuju konverzije), paymentMethod, servedBy, conversionId, createdAt, paidAt i attribution. Iznosi su uvek u najmanjim jedinicama valute.
{
"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…" }
}
}
Objekat lojalnosti
Svaki događaj, kartica i nagrada lojalnosti imaju isti oblik: kind ("loyalty"), id (kartica), timezone, company, branch (gde se desilo, ako postoji), program (id, name, stampsRequired, rewardTitle), customer (id, name, phone, locale), card (id, status, stampsCount, stampsRequired, stampsToReward, createdAt), stamp (za pečat: source, issuedBy, createdAt) i reward (za nagradu: code, title, status, expiresAt, redeemedAt, redeemedBy), plus conversionId, ID pod kojim se prijavljuje registracija u program lojalnosti.
{
"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…"
}
Fid događaja
Svaki red je { id, cursor, type, createdAt, previousStatus, data }. data sadrži predmet događaja pod ključem koji određuje prefiks događaja: data.booking, data.order ili data.loyalty. Sačuvajte najveći kursor koji ste obradili i vratite ga kao after — nikada ne preskače niti ponavlja red, pa je bezbedno nastaviti posle pada. Zanemarite tipove koje ne obrađujete: mogu biti dodati novi.
| Tip događaja | Značenje |
|---|---|
booking.requested | Gost je zatražio rezervaciju koja čeka vašu potvrdu. |
booking.confirmed | Rezervacija je potvrđena — odmah pri kreiranju ili kasnije, od strane osoblja. |
booking.cancelled | Otkazao je gost ili lokal; status pokazuje ko. |
booking.no_show | Gost nije došao. |
booking.completed | Poseta je završena. |
order.placed | Porudžbina gosta je stigla u lokal — sa stranice, preko QR koda na stolu, za poneti ili za dostavu; nakon plaćanja, ako lokal naplaćuje unapred. |
order.paid | Bilo koja porudžbina je plaćena, uključujući prodaje otkucane na kasi. |
loyalty.member_joined | Kupac je dobio prvi pečat u programu. |
loyalty.stamp_added | Na karticu je dodat pečat. |
loyalty.reward_issued | Kartica je popunjena i nagrada je izdata. |
loyalty.reward_redeemed | Nagrada je uručena. |
curl "https://api.tapti.me/v1/company/events?after=998&limit=100" \
-H "Authorization: Bearer tt_live_…"
Vebhukovi
Napravite krajnju tačku u odeljku Integracije → Vebhukovi i API — ili povežite Zapier, Make, n8n ili Pipedream u odeljku Integracije → Automatizacija — i TapTime će poslati POST sa potpisanim JSON događajem čim se promeni rezervacija, porudžbina ili kartica lojalnosti. Događaje birate za svaku krajnju tačku posebno. Kompanija može imati ukupno do 50 vebhukova, postbekova, četova i veza sa platformama za automatizaciju.
| Zaglavlje | Značenje |
|---|---|
TapTime-Event | Tip događaja, npr. booking.confirmed. |
TapTime-Event-Id | ID događaja u skladištu — koristite ga za uklanjanje duplikata pri ponovljenoj dostavi. |
TapTime-Delivery | ID ovog konkretnog pokušaja dostave. |
TapTime-Signature | t=<unix time>,v1=<hex HMAC-SHA256 of "t.rawBody">, potpisano sopstvenom tajnom tačke kraja. |
- Svaki 2xx odgovor se smatra isporučenim; ne-2xx odgovor ili istek vremena ponovo se pokušava sa produžavanjem intervala (1 min, 5 min, 15 min, 1 sat, 3 sata, 6 sati, 12 sati) do 8 pokušaja — kod 410 se prekida ponovno slanje.
- Preusmeravanja se ne prate.
- URL u produkciji mora biti HTTPS i ne sme upućivati na privatnu ili loopback adresu.
- Dostava se vrši barem jednom: uvek proverite potpis i uklonite duplikate na 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));
Pretplate na vebhukove
Platforme za automatizaciju uključuju i isključuju okidače preko API-ja, umesto da traže od korisnika da nalepi URL („REST hooks“): pošaljite POST sa URL-om platforme i događajima koje želi, sačuvajte vraćeni id i pošaljite DELETE kada se okidač isključi. Pretplata je običan potpisani vebhuk — prikazuje se u panelu, označena ključem koji ju je napravio.
- Ključ vidi i uklanja samo pretplate koje je sam napravio; opozivanje ključa uklanja ih sve.
- Adrese na hooks.zapier.com, make.com i pipedream.net se prepoznaju i prikazuju sa nazivom platforme; svaka druga https adresa je običan vebhuk.
- Tajni ključ za potpis vraća se jednom, u odgovoru na POST; vlasnik ga u panelu može ponovo prikazati.
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"]}'
Postbekovi
GET ili POST na URL vašeg trekera sa popunjenim makroima, za platforme koje koriste postbekove sa parametrima u URL-u umesto JSON vebhukova. Za porudžbinu, {value} je vrednost porudžbine bez napojnice, a {order_id} njen id.
https://tracker.example/postback
?cid={click_id}&event={event}&status={status}
&payout={value}&cur={currency}
Dostupni zamennici teksta
{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}
Greške
Svaka greška je JSON: { "error": "<code>", "message": "<human-readable>" }.
| Status | greška | Značenje |
|---|---|---|
| 401 | unauthorized |
Zaglavlje Authorization nedostaje, ili je ključ nevažeći ili poništen. |
| 403 | forbidden |
Ključ za čitanje samo, nazvan write endpoint (promena statusa). |
| 404 | not_found |
Nijedna rezervacija sa tim ID-om ne pripada kompaniji ključa. |
| 409 | conflict |
Promena statusa bi dovela do dvostrukog rezervisanja stola ili slota; ništa nije promenjeno. |
| 422 | invalid_status |
Vrednost polja status nije jedna od prihvaćenih vrednosti za tu vrstu rezervacije. |
| 422 | invalid_type |
Parametar type u fidu događaja ne navodi nijedan tip ni porodicu događaja. |
| 422 | invalid_url |
URL pretplate nije javna https adresa. |
| 429 | rate_limited |
Više od 50 zahteva za ovaj ključ u minuti. Usporite i ponovo pokušajte. |
Pristup API-ju, vebhukovi i integracije sa četovima i platformama za automatizaciju uključeni su u svaki modul — bez dodatne naknade, bez posebnog plana za programere.
Počnite besplatan probni period