Dokumentacija za programere

TapTime REST API

Čitajte i ažurirajte rezervacije stolova i termine, čitajte porudžbine i kartice lojalnosti, preuzimajte hronološki fid događaja i primajte potpisane vebhukove — iz svog CRM-a, POS sistema, skladišta podataka ili platforme za automatizaciju. Ova stranica je kompletna referenca; vodič za praćenje konverzija objašnjava zašto biste je koristili.

Osnovni URLhttps://api.tapti.me AuthBearer token FormatJSON Zašto ga koristiti

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.

Potvrđene rezervacije su promenjene od određenog datuma.
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

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

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

ParametarTypeZnač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.
GET /v1/company/appointments Samo za čitanje ili za čitanje i pisanje

Spisak termina

Isti oblik i filteri kao kod rezervacija, za modul termina.

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

GET /v1/company/appointments/{id} Samo za čitanje ili za čitanje i pisanje

Zakažite sastanak

Jedan termin, isti oblik i pravila kao pretraga rezervacija.

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

ParametarTypeZnač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).
POST /v1/company/appointments/{id}/status Samo za čitanje i pisanje

Promeni status sastanka

Isto kao i rezervacioni endpoint, bez stanja sedećeg stanja.

ParametarTypeZnačenje
status string, required Jedan od: u čekanju, potvrđeno, završeno, nejavljanje, otkazano (canceled i canceled_by_venue takođe prihvaćeni).
GET /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.

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

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

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

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

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

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

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

ParametarTypeZnač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.
DELETE /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.

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

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

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

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đajaZnačenje
booking.requestedGost je zatražio rezervaciju koja čeka vašu potvrdu.
booking.confirmedRezervacija je potvrđena — odmah pri kreiranju ili kasnije, od strane osoblja.
booking.cancelledOtkazao je gost ili lokal; status pokazuje ko.
booking.no_showGost nije došao.
booking.completedPoseta je završena.
order.placedPorudž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.paidBilo koja porudžbina je plaćena, uključujući prodaje otkucane na kasi.
loyalty.member_joinedKupac je dobio prvi pečat u programu.
loyalty.stamp_addedNa karticu je dodat pečat.
loyalty.reward_issuedKartica je popunjena i nagrada je izdata.
loyalty.reward_redeemedNagrada je uručena.
Ostanite u sinhronosti sa fidom događaja
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.

ZaglavljeZnačenje
TapTime-EventTip događaja, npr. booking.confirmed.
TapTime-Event-IdID događaja u skladištu — koristite ga za uklanjanje duplikata pri ponovljenoj dostavi.
TapTime-DeliveryID ovog konkretnog pokušaja dostave.
TapTime-Signaturet=<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.
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", "…": "…" } }
}
Proveri potpis (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));

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.
Pretplatite URL na nove porudžbine
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.

Postbek URL sa zamenama · GET ili POST
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>" }.

StatusgreškaZnač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.
Treba li vam ključ?

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