Dokumentacioni i zhvilluesit

TapTime REST API

Lexoni dhe përditësoni rezervimet e tavolinave dhe takimet, lexoni porositë dhe kartat e besnikërisë, merrni rrjedhën e renditur të ngjarjeve dhe pranoni webhooks të nënshkruar — nga CRM-ja juaj, POS-i, magazina e të dhënave ose një platformë automatizimi. Kjo faqe është referenca e plotë; udhëzuesi i ndjekjes së konvertimeve shpjegon pse do ta përdornit.

URL-ja bazëhttps://api.tapti.me AuthBearer token FormatJSON Pse ta përdorësh

Ç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.

Rezervimet e konfirmuara janë ndryshuar që nga një datë
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

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

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

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

POST /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ërTypeKuptimi
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).
POST /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ërTypeKuptimi
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).
GET /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ërTypeKuptimi
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.
GET /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ërTypeKuptimi
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.
GET /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.

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

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

POST /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ërTypeKuptimi
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.
DELETE /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.

GET /v1/company/reservations/4821 → të dhëna
{
  "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.

GET /v1/company/orders/9170 → të dhëna
{
  "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.

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

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 ngjarjesKuptimi
booking.requestedNjë mysafir kërkoi një rezervim që pret konfirmimin tuaj.
booking.confirmedNjë rezervim u konfirmua — që në krijim, ose më vonë nga stafi.
booking.cancelledU anulua nga mysafiri ose nga lokali; statusi tregon nga kush.
booking.no_showMysafiri nuk erdhi.
booking.completedVizita përfundoi.
order.placedPorosia 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_joinedNjë klient mori vulën e parë në një program.
loyalty.stamp_addedNjë vulë u shtua në një kartë.
loyalty.reward_issuedNjë kartë u përfundua dhe shpërblimi i saj u lëshua.
loyalty.reward_redeemedNjë shpërblim u dorëzua.
Qëndro në sinkron me përmbledhjen e ngjarjeve
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-EventLloji i ngjarjes, p.sh. booking.confirmed.
TapTime-Event-IdID e qëndrueshme për ngjarjen — përdoreni për të hequr dublikatat në dorëzimin e ripërsëritur.
TapTime-DeliveryID e kësaj përpjekjeje specifike të dorëzimit.
TapTime-Signaturet=<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.
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", "…": "…" } }
}
Verifikoni nënshkrimin (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));

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.
Abono një URL te porositë e reja
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.

URL-ja e postimit me vendëmbajtës · GET ose POST
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>" }.

StatusgabimKuptimi
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.
Të duhet një çelës?

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