Çdo kërkesë ka nevojë për një çelës API të kompanisë (Integrime → Webhooks & API në panel) të dërguar si Autorizim: Bearer tt_live_….. Përgjigjet dhe gabimet janë në JSON.
curl "https://api.tapti.me/v1/company/reservations?status=confirmed&updatedSince=2026-09-01T00:00:00Z" \
-H "Authorization: Bearer tt_live_…"
Autentifikimi
Çdo kërkesë mban një çelës API të kompanisë si token bartës. Krijoni një nga paneli — Integrime → Webhooks & API → Çelësa REST API — ku ai shfaqet një herë dhe ruhet vetëm në anën e serverit si një hash SHA-256; një çelës i humbur revokohet dhe zëvendësohet, jo rikuperohet. Një kompani mund të ketë deri në 10 çelësa aktivë.
- Çelësat vetëm-lexim mund të thërrasin çdo pikë përfundimtare GET dhe mund të krijojnë ose anulojnë abonime webhook — një abonim nuk dërgon asgjë që çelësi nuk mund ta lexonte tashmë.
- Çelësat lexim-shkrim mund të dërgojnë edhe me POST një ndryshim statusi të rezervimit; një çelës vetëm-lexim merr 403 Forbidden në ato rrugë.
- Një çelës i përket një kompanie — çdo listë dhe kërkim janë tashmë të kufizuara tek ajo, nuk ka parametër companyId.
Kufijtë e kërkesave
50 kërkesa në minutë për çelës, në një dritare rrëshqitëse, të përbashkëta për të gjitha pikat përfundimtare. Tejkalimi kthen 429 Too Many Requests; prisni dhe provoni përsëri në vend që të pyesni më shpesh — ose abononi një webhook dhe mos pyesni më.
Pikat përfundimtare
/v1/company
Vetëm lexim ose lexim-shkrim
Merr kompaninë aktuale
Kompania të cilës i përket çelësi, dhe çfarë mund të bëjë vetë çelësi.
/v1/company/reservations
Vetëm lexim ose lexim-shkrim
Listë rezervimesh
Rezervimet e tavolinave për kompaninë, së pari koha më e hershme e fillimit — ose, kur updatedSince është vendosur, së pari e përditësuara më e hershme.
| Parametër | Type | Kuptimi |
|---|---|---|
status |
string | Të ndara me presje: në pritje, të konfirmuara, të ulura, të përfunduara, jo_paraqitje, të anuluar. Të anuluara përputhen me të dy arsyet e anulimit. |
branchId |
integer | Kufizo në një degë. |
from |
ISO 8601 datetime | Vetëm rezervimet që fillojnë në ose pas kësaj kohe (UTC nëse nuk është dhënë asnjë zhvendosje). |
to |
ISO 8601 datetime | Vetëm rezervimet që fillojnë para kësaj kohe. |
updatedSince |
ISO 8601 datetime | Vetëm rezervimet e ndryshuara që nga kjo kohë; ndryshon renditjen në updatedAt në rritje, për sinkronizim. |
limit |
integer | Madhësia e faqes, 1–100. Parazgjedhje 50. |
page |
integer | Numri i faqes bazohet në 1. Parazgjedhje 1. |
/v1/company/appointments
Vetëm lexim ose lexim-shkrim
Listoni takimet
E njëjta formë dhe filtra si te Rezervimet, për modulën Takimet.
| Parametër | Type | Kuptimi |
|---|---|---|
status |
string | Të ndara me presje: në pritje, të konfirmuara, të përfunduara, jo-paraqitje, të anuluar. |
branchId |
integer | Kufizo në një degë. |
from |
ISO 8601 datetime | Vetëm rezervimet që fillojnë në këtë kohë ose më vonë. |
to |
ISO 8601 datetime | Vetëm rezervimet që fillojnë para kësaj kohe. |
updatedSince |
ISO 8601 datetime | Vetëm rezervimet e ndryshuara që nga ky moment; renditjet sipas updatedAt në rritje. |
limit |
integer | Madhësia e faqes, 1–100. Parazgjedhje 50. |
page |
integer | Numri i faqes bazohet në 1. Parazgjedhje 1. |
/v1/company/reservations/{id}
Vetëm lexim ose lexim-shkrim
Bëni një rezervim
Një rezervim, në të njëjtin format që e bartin webhooks, me atributin e tij. 404 kur ID nuk i përket kompanisë së çelësit.
/v1/company/appointments/{id}
Vetëm lexim ose lexim-shkrim
Caktoni një takim
Një emërim, me të njëjtën formë dhe rregulla si kërkimi i rezervimeve.
/v1/company/reservations/{id}/status
Vetëm lexim-shkrim
Ndrysho statusin e një rezervimi
Konfirmo, vendos, përfundo, shëno si mos-paraqitje, anuloj ose rihap — aktivizon të njëjtat webhooks dhe konvertime si kur e ndryshon në tabelë. Trupi JSON: {"status": "..."}.
| Parametër | Type | Kuptimi |
|---|---|---|
status |
string, required | Një nga: në pritje, i konfirmuar, i ulur, i përfunduar, nuk u paraqit, i anuluar (canceled dhe canceled_by_venue gjithashtu të pranueshme). |
/v1/company/appointments/{id}/status
Vetëm lexim-shkrim
Ndrysho statusin e një takimi
E njëjta gjë si pika e rezervimit, pa gjendjen e ulur.
| Parametër | Type | Kuptimi |
|---|---|---|
status |
string, required | Një nga: në pritje, i konfirmuar, i përfunduar, i paraqitur pa ardhur, i anuluar (canceled dhe canceled_by_venue gjithashtu të pranueshme). |
/v1/company/events
Vetëm lexim ose lexim-shkrim
Merr rrjedhën e ngjarjeve
Çdo ngjarje rezervimi, porosie dhe besnikërie, nga më e vjetra — e njëjta rrjedhë nga e cila dalin webhooks. Kaloni kursorin e fundit që keni parë si after për të marrë vetëm të rejat, dhe type për të marrë vetëm disa lloje.
| Parametër | Type | Kuptimi |
|---|---|---|
after |
integer cursor | Kursori i ngjarjes së fundit që keni përpunuar. Lëreni bosh për të filluar nga fillimi. |
type |
string | Lloje ose familje ngjarjesh të ndara me presje: booking.confirmed,order.placed, ose order, loyalty.*. Lëreni bosh për të gjitha ngjarjet. |
limit |
integer | Madhësia e faqes, 1–100. Parazgjedhje 50. |
/v1/company/orders
Vetëm lexim ose lexim-shkrim
Listo porositë
Porositë e mysafirëve në tavolinë, me vete dhe me dërgesë, si dhe çdo shitje e regjistruar në arkë, nga më e vjetra — ose, kur vendoset paidSince, sipas radhës së pagesës. Një porosi që pret ende pagesën paraprake lihet jashtë.
| Parametër | Type | Kuptimi |
|---|---|---|
status |
string | Të ndara me presje: open, paid. |
source |
string | customer (e bërë nga mysafiri) ose staff (e regjistruar nga stafi). |
fulfilment |
string | Të ndara me presje: dine_in, takeaway, delivery. |
branchId |
integer | Kufizo në një degë. |
from |
ISO 8601 datetime | Vetëm porositë e krijuara në këtë kohë ose më vonë. |
to |
ISO 8601 datetime | Vetëm porositë e krijuara para kësaj kohe. |
paidSince |
ISO 8601 datetime | Vetëm porositë e paguara që nga kjo kohë; rendit sipas paidAt në rritje, për sinkronizimin e shitjeve. |
limit |
integer | Madhësia e faqes, 1–100. Parazgjedhje 50. |
page |
integer | Numri i faqes, duke filluar nga 1. Parazgjedhje 1. |
/v1/company/orders/{id}
Vetëm lexim ose lexim-shkrim
Merr një porosi
Një porosi me rreshtat, totalet dhe atribuimin e saj, në formën që e bartin webhooks e porosive.
/v1/company/loyalty/programs
Vetëm lexim ose lexim-shkrim
Listo programet e besnikërisë
Çdo program me kartë vulash: emri, statusi, vulat e nevojshme, shpërblimi dhe ku vlen.
/v1/company/loyalty/cards
Vetëm lexim ose lexim-shkrim
Listo kartat e besnikërisë
Kartat e anëtarëve, në formën e objektit të besnikërisë. Një anëtar që ka mbushur një kartë e ka atë të përfunduar dhe një të re aktive pranë saj; customer.id është anëtari.
| Parametër | Type | Kuptimi |
|---|---|---|
programId |
integer | Kufizo në një program. |
customerId |
integer | Kufizo në një anëtar. |
status |
string | Të ndara me presje: active, completed. |
updatedSince |
ISO 8601 datetime | Vetëm kartat që morën vulë ose u përfunduan që nga kjo kohë; rendit sipas updatedAt në rritje. |
limit |
integer | Madhësia e faqes, 1–100. Parazgjedhje 50. |
page |
integer | Numri i faqes, duke filluar nga 1. Parazgjedhje 1. |
/v1/company/loyalty/rewards
Vetëm lexim ose lexim-shkrim
Listo shpërblimet e besnikërisë
Shpërblimet e fituara duke përfunduar një kartë, me kodin, skadimin dhe nëse janë përdorur.
| Parametër | Type | Kuptimi |
|---|---|---|
programId |
integer | Kufizo në një program. |
customerId |
integer | Kufizo në një anëtar. |
status |
string | Të ndara me presje: issued, redeemed, expired. |
from |
ISO 8601 datetime | Vetëm shpërblimet e lëshuara në këtë kohë ose më vonë. |
to |
ISO 8601 datetime | Vetëm shpërblimet e lëshuara para kësaj kohe. |
limit |
integer | Madhësia e faqes, 1–100. Parazgjedhje 50. |
page |
integer | Numri i faqes, duke filluar nga 1. Parazgjedhje 1. |
/v1/company/webhooks
Vetëm lexim ose lexim-shkrim
Listo abonimet e webhooks
Abonimet që ka krijuar ky çelës. Webhooks e shtuar në panel nuk shfaqen këtu.
/v1/company/webhooks
Vetëm lexim ose lexim-shkrim
Abono një webhook
Fillon dërgimin e ngjarjeve në një URL — kjo është ajo që thërret aplikacioni i një platforme automatizimi kur përdoruesi ndez një aktivizues. Kthen abonimin dhe sekretin e tij të nënshkrimit, vetëm një herë. Trupi JSON: {"url": "…", "events": ["order.placed"]}; pranohet edhe formati i Zapier {"target_url": "…", "event": "…"}.
| Parametër | Type | Kuptimi |
|---|---|---|
url |
string, required | Adresa https ku dërgohet (pranohet edhe target_url). |
events |
array of strings, required | Lloje ngjarjesh, familje si order.* ose loyalty, ose * për gjithçka (për një ngjarje pranohet edhe event). |
description |
string | Një emër që shfaqet në panel. Si parazgjedhje, platforma dhe emri i çelësit. |
/v1/company/webhooks/{id}
Vetëm lexim ose lexim-shkrim
Anulo abonimin e një webhook-u
Ndalon dërgimin te një abonim që ka krijuar ky çelës. Kthen 204. Revokimi i çelësit heq edhe të gjitha abonimet e tij.
Objekti i rezervimit
Një rezervim dhe një takim paraqiten në një formë të përbashkët: kind, id, status, source, guestInitiated, startsAt/endsAt/zonë kohore (zona e degës), monedhë, kompani, degë, mysafir, atribut, conversionId, createdAt/updatedAt — plus partySize dhe tavolina për një rezervim, shërbimi dhe specialisti për një takim. Është pikërisht ajo që ofron një webhook, kështu që një marrës që trajton njërën, trajton të dyja.
{
"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…" }
}
}
Objekti i porosisë
Një porosi ka të njëjtën formë kudo që e hasni — në REST API, në webhooks e porosive dhe në rrjedhën e ngjarjeve: kind ("order"), id, number (numri që thërret stafi), status (open ose paid), source (customer ose staff), guestInitiated, fulfilment, table, label, deliveryAddress, note, currency, timezone, company, branch, customer (anëtari i besnikërisë, kur stafi e ka identifikuar), items (name, variant, quantity, unitPriceCents, subtotalCents), itemCount, subtotalCents, discountCents, deliveryFeeCents, tipCents, totalCents, valueCents (sa vlen porosia pa bakshishin — numri që raportojnë konvertimet), paymentMethod, servedBy, conversionId, createdAt, paidAt dhe attribution. Shumat janë gjithmonë në njësitë më të vogla të monedhës.
{
"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…" }
}
}
Objekti i besnikërisë
Çdo ngjarje, kartë dhe shpërblim besnikërie ka të njëjtën formë: kind ("loyalty"), id (karta), timezone, company, branch (ku ndodhi, kur ka një të tillë), program (id, name, stampsRequired, rewardTitle), customer (id, name, phone, locale), card (id, status, stampsCount, stampsRequired, stampsToReward, createdAt), stamp (për një vulë: source, issuedBy, createdAt) dhe reward (për një shpërblim: code, title, status, expiresAt, redeemedAt, redeemedBy), plus conversionId, id-ja me të cilën raportohet një regjistrim në besnikëri.
{
"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…"
}
Rrjedha e ngjarjeve
Çdo rresht është { id, cursor, type, createdAt, previousStatus, data }. data mban subjektin nën çelësin që emërton prefiksi i ngjarjes: data.booking, data.order ose data.loyalty. Ruani kursorin më të lartë që keni përpunuar dhe kthejeni si after — nuk kapërcen dhe nuk përsërit asnjëherë një rresht, kështu që është e sigurt të vazhdoni pas një rrëzimi. Injoroni llojet që nuk i trajtoni: mund të shtohen të reja.
| Lloji i ngjarjes | Kuptimi |
|---|---|
booking.requested | Një mysafir kërkoi një rezervim që pret konfirmimin tuaj. |
booking.confirmed | Një rezervim u konfirmua — që në krijim, ose më vonë nga stafi. |
booking.cancelled | U anulua nga mysafiri ose nga lokali; statusi tregon nga kush. |
booking.no_show | Mysafiri nuk erdhi. |
booking.completed | Vizita përfundoi. |
order.placed | Porosia e një mysafiri mbërriti te lokali — nga faqja, nga kodi QR i një tavoline, me vete ose me dërgesë; pas pagesës, kur lokali e merr pagesën paraprakisht. |
order.paid | Çdo porosi e shlyer, përfshirë shitjet e regjistruara në arkë. |
loyalty.member_joined | Një klient mori vulën e parë në një program. |
loyalty.stamp_added | Një vulë u shtua në një kartë. |
loyalty.reward_issued | Një kartë u përfundua dhe shpërblimi i saj u lëshua. |
loyalty.reward_redeemed | Një shpërblim u dorëzua. |
curl "https://api.tapti.me/v1/company/events?after=998&limit=100" \
-H "Authorization: Bearer tt_live_…"
Webhooks
Krijoni një pikë përfundimtare te Integrime → Webhooks & API — ose lidhni Zapier, Make, n8n ose Pipedream te Integrime → Automatizimi — që TapTime të dërgojë me POST një ngjarje JSON të nënshkruar sapo ndryshon një rezervim, një porosi ose një kartë besnikërie. Ngjarjet i zgjidhni për çdo pikë përfundimtare. Një kompani mund të ketë gjithsej deri në 50 webhooks, postbacks, chat-e dhe lidhje automatizimi.
| Kokë | Kuptimi |
|---|---|
TapTime-Event | Lloji i ngjarjes, p.sh. booking.confirmed. |
TapTime-Event-Id | ID e qëndrueshme për ngjarjen — përdoreni për të hequr dublikatat në dorëzimin e ripërsëritur. |
TapTime-Delivery | ID e kësaj përpjekjeje specifike të dorëzimit. |
TapTime-Signature | t=<koha unix>,v1=<heksadecimal HMAC-SHA256 i "t.rawBody">, i nënshkruar me sekretin e vet të pikës së fundit. |
- Çdo përgjigje 2xx trajtohet si e dorëzuar; çdo përgjigje jo-2xx ose tejkalimi i kohës së pritjes riprovohet me intervale të shtuar (1 min, 5 min, 15 min, 1 orë, 3 orë, 6 orë, 12 orë) deri në 8 përpjekje — një përgjigje 410 ndalon riprovimet.
- Riaadresimet nuk ndiqen.
- URL-ja duhet të jetë HTTPS në prodhim dhe nuk mund të tregojë në një adresë private ose loopback.
- Dorëzimi është të paktën një herë: gjithmonë verifikoni nënshkrimin dhe hiqni përsëritjet në 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));
Abonimet e webhooks
Platformat e automatizimit i ndezin dhe i fikin aktivizuesit përmes API-së në vend që t’i kërkojnë përdoruesit të ngjitë një URL („REST hooks“): dërgoni me POST URL-në e platformës me ngjarjet që do, ruani id-në e kthyer dhe fshijeni me DELETE kur aktivizuesi fiket. Një abonim është një webhook i zakonshëm i nënshkruar — shfaqet në panel, i shënuar me çelësin që e krijoi.
- Një çelës sheh dhe heq vetëm abonimet që ka krijuar vetë; revokimi i çelësit i heq të gjitha.
- Adresat në hooks.zapier.com, make.com dhe pipedream.net njihen dhe shfaqen me emrin e platformës; çdo adresë tjetër https është një webhook i thjeshtë.
- Sekreti i nënshkrimit kthehet një herë, në përgjigjen e POST-it; pronari mund ta shfaqë përsëri në panel.
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"]}'
Postbacks
Një GET ose POST te URL-ja e gjurmuesit tuaj me makrot e plotësuara, për platformat që përdorin postbacks me parametra në URL në vend të webhooks JSON. Për një porosi, {value} është vlera e porosisë pa bakshishin dhe {order_id} id-ja e saj.
https://tracker.example/postback
?cid={click_id}&event={event}&status={status}
&payout={value}&cur={currency}
Vendmbajtësit e disponueshëm
{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}
Gabimet
Çdo gabim është JSON: { "error": "<code>", "message": "<human-readable>" }.
| Status | gabim | Kuptimi |
|---|---|---|
| 401 | unauthorized |
Koka e autorizimit mungon, ose çelësi është i pavlefshëm ose i revokuar. |
| 403 | forbidden |
Një çelës vetëm-lexim i quajtur pikë fundore e shkrimit (një ndryshim i statusit). |
| 404 | not_found |
Asnjë rezervim me atë ID nuk i përket kompanisë së çelësit. |
| 409 | conflict |
Ndryshimi i statusit do të rezervonte dy herë tavolinën ose slotin; asgjë nuk u ndryshua. |
| 422 | invalid_status |
Vlera e fushës së statusit nuk është një nga vlerat e pranuara për këtë lloj rezervimi. |
| 422 | invalid_type |
Parametri type i rrjedhës së ngjarjeve nuk emërton asnjë lloj ose familje ngjarjesh. |
| 422 | invalid_url |
URL-ja e abonimit nuk është një adresë publike https. |
| 429 | rate_limited |
Më shumë se 50 kërkesa në një minutë për këtë çelës. Ngadalëso dhe provo përsëri. |
Qasja në API, webhooks dhe integrimet me chat-et dhe platformat e automatizimit përfshihen në çdo modul — pa tarifë shtesë, pa plan të veçantë për zhvillues.
Filloni një provë falas