Hər bir sorğu şirkətin API açarına (paneldə Integrasiyalar → Webhooks & API) Authorization: Bearer tt_live_…. kimi göndərilməlidir. Cavablar və xətalar JSON formatındadır.
curl "https://api.tapti.me/v1/company/reservations?status=confirmed&updatedSince=2026-09-01T00:00:00Z" \
-H "Authorization: Bearer tt_live_…"
Təsdiq
Hər bir sorğu şirkətin API açarını daşıyıcı token kimi daşıyır. Paneldən — Integrations → Webhooks & API → REST API açarları — bölməsində birini yaradın; orada açar yalnız bir dəfə göstərilir və yalnız server tərəfində SHA-256 həş kimi saxlanılır; itirilmiş açar ləğv edilir və əvəzlənir, bərpa edilmir. Bir şirkət maksimum 10 aktiv açar saxlaya bilər.
- Yalnız oxuma açarları bütün GET son nöqtələrini çağıra, həmçinin webhook-lara abunə ola və abunəliyi ləğv edə bilər — abunəlik açarın onsuz da oxuya bilmədiyi heç nəyi göndərmir.
- Oxuma-yazma açarları həmçinin rezervasiya statusunu POST ilə dəyişə bilər; yalnız oxuma açarı bu marşrutlarda 403 Forbidden alır.
- Açar bir şirkətə məxsusdur — hər siyahı və sorğu artıq həmin şirkətlə məhdudlaşır, companyId parametri yoxdur.
Sürət məhdudiyyətləri
Hər açar üçün dəqiqədə 50 sorğu, sürüşən pəncərə üzrə, bütün son nöqtələr üçün ümumi. Limiti aşdıqda 429 Too Many Requests qaytarılır; sorğuları sıxlaşdırmaq əvəzinə gözləyib yenidən cəhd edin — və ya webhook-a abunə olub sorğulamanı dayandırın.
Son nöqtələr
/v1/company
Yalnız oxuma və ya oxuma-yazma
Cari şirkəti əldə edin
Açar hansı şirkətə məxsusdur və özü nə edə bilər.
/v1/company/reservations
Yalnız oxuma və ya oxuma-yazma
Rezervasiyaları siyahıya alın
Şirkət üçün masa rezervasiyaları, ən erkən başlanğıc vaxtı birinci — və ya updatedSince təyin edildikdə, ən əvvəl yenilənən birinci.
| Parametr | Type | Mənası |
|---|---|---|
status |
string | Vergüllə ayrılmış: gözləyir, təsdiqlənib, oturub, tamamlanıb, gəlməyən, ləğv olunub. ləğv olunub ləğv səbəblərinin hər ikisini əhatə edir. |
branchId |
integer | Yalnız bir şöbəyə məhdudlaşdırın. |
from |
ISO 8601 datetime | Yalnız bu vaxtdan (UTC, əgər heç bir ofset göstərilməyibsə) və ya daha sonra başlayan rezervasiyalar. |
to |
ISO 8601 datetime | Yalnız bu vaxtdan əvvəl başlayan rezervasiyalar. |
updatedSince |
ISO 8601 datetime | Yalnız bu vaxtdan bəri dəyişdirilmiş rezervasiyalar; sinxronizasiya üçün sıralamayı updatedAt artan qaydada dəyişdirir. |
limit |
integer | Səhifə ölçüsü, 1–100. Standart 50. |
page |
integer | 1-ə əsaslanan səhifə nömrəsi. Standart 1. |
/v1/company/appointments
Yalnız oxuma və ya oxuma-yazma
Təyinatları siyahıya alın
Görüşlər modulunda rezervasiyalarla eyni forma və filtrlər.
| Parametr | Type | Mənası |
|---|---|---|
status |
string | Vergüllə ayrılmış: gözləyir, təsdiqlənib, tamamlanıb, iştirak etməyib, ləğv olunub. |
branchId |
integer | Yalnız bir şöbəyə məhdudlaşdırın. |
from |
ISO 8601 datetime | Yalnız bu vaxtdan və ya daha sonra başlayan rezervasiyalar. |
to |
ISO 8601 datetime | Yalnız bu vaxtdan əvvəl başlayan rezervasiyalar. |
updatedSince |
ISO 8601 datetime | Yalnız bu vaxtdan bəri dəyişdirilmiş rezervasiyalar; updatedAt üzrə artan sıralama. |
limit |
integer | Səhifə ölçüsü, 1–100. Standart 50. |
page |
integer | 1-ə əsaslanan səhifə nömrəsi. Standart 1. |
/v1/company/reservations/{id}
Yalnız oxuma və ya oxuma-yazma
Rezervasiyanı əldə edin
Bir şərt var: webhooks-lar onu eyni formada, atributu ilə birlikdə ötürür. ID açarın şirkətinə aid olmadıqda 404 qaytarılır.
/v1/company/appointments/{id}
Yalnız oxuma və ya oxuma-yazma
Görüşü əldə edin
Bir təyinat, rezervasiya axtarışı ilə eyni forma və qaydalar.
/v1/company/reservations/{id}/status
Yalnız oxuma-yazma
Rezervasiyanın statusunu dəyişdirin
Təsdiqlə, yerləşdir, tamamla, gəlməməyi qeyd et, ləğv et və ya yenidən aç — lövhədə dəyişdirməklə eyni webhookları və konversiyaları işə salır. JSON bədəni: {"status": "..."}.
| Parametr | Type | Mənası |
|---|---|---|
status |
string, required | Aşağıdakılardan biri: gözləyən, təsdiqlənmiş, oturmuş, tamamlanmış, gəlməmiş, ləğv edilmiş (canceled və canceled_by_venue də qəbul edilir). |
/v1/company/appointments/{id}/status
Yalnız oxuma-yazma
Görüşün statusunu dəyişdirin
Eyni rezervasiya son nöqtəsi kimi, oturmuş vəziyyət olmadan.
| Parametr | Type | Mənası |
|---|---|---|
status |
string, required | Aşağıdakılardan biri: gözləyən, təsdiqlənmiş, tamamlanmış, gəlməmiş, ləğv edilmiş (canceled və canceled_by_venue də qəbul edilir). |
/v1/company/events
Yalnız oxuma və ya oxuma-yazma
Hadisə lentini sorğu edin
Bütün rezervasiya, sifariş və loyallıq hadisələri, ən köhnəsi birinci — webhook-ların da götürüldüyü eyni axın. Yalnız yeniləri almaq üçün gördüyünüz son kursoru after kimi, yalnız bəzi növləri almaq üçün isə type ötürün.
| Parametr | Type | Mənası |
|---|---|---|
after |
integer cursor | Emal etdiyiniz son hadisənin kursoru. Əvvəldən başlamaq üçün ötürməyin. |
type |
string | Vergüllə ayrılmış hadisə növləri və ya ailələri: booking.confirmed,order.placed, yaxud order, loyalty.*. Bütün hadisələr üçün ötürməyin. |
limit |
integer | Səhifə ölçüsü, 1–100. Standart 50. |
/v1/company/orders
Yalnız oxuma və ya oxuma-yazma
Sifarişləri siyahıya alın
Qonaqların masa, özü ilə aparma və çatdırılma sifarişləri və kassada vurulan hər satış, ən köhnəsi birinci — paidSince təyin edildikdə isə ödənilmə ardıcıllığı ilə. Qabaqcadan ödənişi hələ gözləyən sifariş daxil edilmir.
| Parametr | Type | Mənası |
|---|---|---|
status |
string | Vergüllə ayrılmış: open, paid. |
source |
string | customer (qonaq verib) və ya staff (əməkdaş vurub). |
fulfilment |
string | Vergüllə ayrılmış: dine_in, takeaway, delivery. |
branchId |
integer | Yalnız bir filialla məhdudlaşdırın. |
from |
ISO 8601 datetime | Yalnız bu vaxtdan və ya daha sonra yaradılmış sifarişlər. |
to |
ISO 8601 datetime | Yalnız bu vaxtdan əvvəl yaradılmış sifarişlər. |
paidSince |
ISO 8601 datetime | Yalnız bu vaxtdan bəri ödənilmiş sifarişlər; satışları sinxronlaşdırmaq üçün paidAt üzrə artan qaydada sıralayır. |
limit |
integer | Səhifə ölçüsü, 1–100. Standart 50. |
page |
integer | 1-ə əsaslanan səhifə nömrəsi. Standart 1. |
/v1/company/orders/{id}
Yalnız oxuma və ya oxuma-yazma
Sifarişi əldə edin
Sətirləri, cəmləri və atribusiyası ilə bir sifariş — sifariş webhook-larının daşıdığı formada.
/v1/company/loyalty/programs
Yalnız oxuma və ya oxuma-yazma
Loyallıq proqramlarını siyahıya alın
Bütün möhür kartı proqramları: adı, statusu, lazım olan möhür sayı, mükafat və harada tətbiq olunduğu.
/v1/company/loyalty/cards
Yalnız oxuma və ya oxuma-yazma
Loyallıq kartlarını siyahıya alın
Üzvlərin kartları, loyallıq obyekti formasında. Kartı dolduran üzvün həmin kartı completed olur və yanında yeni aktiv kart açılır; customer.id üzvdür.
| Parametr | Type | Mənası |
|---|---|---|
programId |
integer | Yalnız bir proqramla məhdudlaşdırın. |
customerId |
integer | Yalnız bir üzvlə məhdudlaşdırın. |
status |
string | Vergüllə ayrılmış: active, completed. |
updatedSince |
ISO 8601 datetime | Yalnız bu vaxtdan bəri möhür vurulmuş və ya tamamlanmış kartlar; updatedAt üzrə artan qaydada sıralayır. |
limit |
integer | Səhifə ölçüsü, 1–100. Standart 50. |
page |
integer | 1-ə əsaslanan səhifə nömrəsi. Standart 1. |
/v1/company/loyalty/rewards
Yalnız oxuma və ya oxuma-yazma
Loyallıq mükafatlarını siyahıya alın
Kartı tamamlamaqla qazanılan mükafatlar — kodu, bitmə tarixi və istifadə olunub-olunmadığı ilə.
| Parametr | Type | Mənası |
|---|---|---|
programId |
integer | Yalnız bir proqramla məhdudlaşdırın. |
customerId |
integer | Yalnız bir üzvlə məhdudlaşdırın. |
status |
string | Vergüllə ayrılmış: issued, redeemed, expired. |
from |
ISO 8601 datetime | Yalnız bu vaxtdan və ya daha sonra verilmiş mükafatlar. |
to |
ISO 8601 datetime | Yalnız bu vaxtdan əvvəl verilmiş mükafatlar. |
limit |
integer | Səhifə ölçüsü, 1–100. Standart 50. |
page |
integer | 1-ə əsaslanan səhifə nömrəsi. Standart 1. |
/v1/company/webhooks
Yalnız oxuma və ya oxuma-yazma
Webhook abunəliklərini siyahıya alın
Bu açarın yaratdığı abunəliklər. Paneldə əlavə edilmiş webhook-lar burada göstərilmir.
/v1/company/webhooks
Yalnız oxuma və ya oxuma-yazma
Webhook-a abunə olun
URL-ə hadisə göndərməyə başlayır — istifadəçi tətiyi işə saldıqda avtomatlaşdırma platformasının tətbiqi məhz bunu çağırır. Abunəliyi və onun imza sirrini bir dəfə qaytarır. JSON gövdəsi: {"url": "…", "events": ["order.placed"]}; Zapier-in {"target_url": "…", "event": "…"} formatı da qəbul olunur.
| Parametr | Type | Mənası |
|---|---|---|
url |
string, required | Göndəriləcək https ünvanı (target_url də qəbul olunur). |
events |
array of strings, required | Hadisə növləri, order.* və ya loyalty kimi ailələr, yaxud hər şey üçün * (tək hadisə üçün event də qəbul olunur). |
description |
string | Paneldə göstərilən ad. Standart olaraq platformanın və açarın adı. |
/v1/company/webhooks/{id}
Yalnız oxuma və ya oxuma-yazma
Webhook abunəliyini ləğv edin
Bu açarın yaratdığı abunəliyə göndərməni dayandırır. 204 qaytarır. Açar ləğv edildikdə onun bütün abunəlikləri də silinir.
Rezervasiya obyekti
Sifariş və görüş eyni ortaq strukturda təqdim olunur: kind, id, status, source, guestInitiated, startsAt/endsAt/vaxt zonası (filialın öz zonası), valyuta, şirkət, filial, qonaq, atribut, conversionId, createdAt/updatedAt — üstəlik rezervasiya üçün partySize və cədvəl, görüş üçün xidmət və mütəxəssis. Bu, məhz bir webhook-un çatdırdığı məlumatdır, ona görə də birini qəbul edən alıcı hər ikisini qəbul edə bilir.
{
"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…" }
}
}
Sifariş obyekti
Sifariş harada rast gəlsəniz — REST API, sifariş webhook-ları, hadisə axını — bir formada gəlir: kind ("order"), id, number (əməkdaşların səsləndirdiyi çek nömrəsi), status (open və ya paid), source (customer və ya staff), guestInitiated, fulfilment, table, label, deliveryAddress, note, currency, timezone, company, branch, customer (əməkdaş müəyyən etdikdə loyallıq üzvü), items (name, variant, quantity, unitPriceCents, subtotalCents), itemCount, subtotalCents, discountCents, deliveryFeeCents, tipCents, totalCents, valueCents (sifarişin çaypulu olmadan dəyəri — konversiyaların bildirdiyi rəqəm), paymentMethod, servedBy, conversionId, createdAt, paidAt və attribution. Məbləğlər həmişə kiçik vahidlərlə (qəpiklə) göstərilir.
{
"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…" }
}
}
Loyallıq obyekti
Hər loyallıq hadisəsi, kartı və mükafatı eyni formadadır: kind ("loyalty"), id (kart), timezone, company, branch (hadisənin baş verdiyi filial, əgər varsa), program (id, name, stampsRequired, rewardTitle), customer (id, name, phone, locale), card (id, status, stampsCount, stampsRequired, stampsToReward, createdAt), stamp (möhür üçün: source, issuedBy, createdAt) və reward (mükafat üçün: code, title, status, expiresAt, redeemedAt, redeemedBy), üstəlik conversionId — loyallıq qeydiyyatının bildirildiyi ID.
{
"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…"
}
Hadisə axını
Hər sətir { id, cursor, type, createdAt, previousStatus, data } formasındadır. data mövzunu hadisənin prefiksinin adlandırdığı açar altında saxlayır: data.booking, data.order və ya data.loyalty. Emal etdiyiniz ən böyük cursor-u saxlayın və onu after kimi geri ötürün — o heç vaxt sətri ötürüb keçmir və ya təkrarlamır, ona görə də çökmədən sonra davam etmək təhlükəsizdir. Emal etmədiyiniz növlərə məhəl qoymayın: yeniləri əlavə oluna bilər.
| Hadisə növü | Mənası |
|---|---|
booking.requested | Qonaq sizin təsdiqinizi gözləyən rezervasiya istədi. |
booking.confirmed | Rezervasiya təsdiqləndi — dərhal təsdiqlənmiş kimi yaradıldı və ya sonradan əməkdaş tərəfindən təsdiqləndi. |
booking.cancelled | Qonaq və ya məkan tərəfindən ləğv edildi; hansı olduğunu status göstərir. |
booking.no_show | Qonaq gəlmədi. |
booking.completed | Səfər başa çatdı. |
order.placed | Qonağın sifarişi məkana çatdı — səhifədən, masanın QR kodundan, özü ilə aparma və ya çatdırılma üçün; məkan ödənişi qabaqcadan alırsa, ödənişdən sonra. |
order.paid | İstənilən sifariş ödənildi, kassada vurulan satışlar da daxil olmaqla. |
loyalty.member_joined | Müştəri proqramda ilk möhürünü aldı. |
loyalty.stamp_added | Karta möhür əlavə edildi. |
loyalty.reward_issued | Kart tamamlandı və mükafatı verildi. |
loyalty.reward_redeemed | Mükafat təhvil verildi. |
curl "https://api.tapti.me/v1/company/events?after=998&limit=100" \
-H "Authorization: Bearer tt_live_…"
Webhook-lar
İnteqrasiyalar → Webhook və API bölməsində endpoint yaradın — və ya İnteqrasiyalar → Avtomatlaşdırma bölməsində Zapier, Make, n8n ya da Pipedream qoşun — ki, rezervasiya, sifariş və ya loyallıq kartı dəyişən anda TapTime imzalanmış JSON hadisəsini POST ilə göndərsin. Hadisələri hər endpoint üçün ayrıca seçirsiniz. Bir şirkətdə cəmi 50-yə qədər webhook, postback, çat və avtomatlaşdırma bağlantısı ola bilər.
| Başlıq | Mənası |
|---|---|
TapTime-Event | Hadisə növü, məsələn booking.confirmed. |
TapTime-Event-Id | Hadisə üçün sabit identifikator — yenidən cəhd edilən çatdırılmanı təkrarlardan ayırmaq üçün istifadə edin. |
TapTime-Delivery | Bu konkret çatdırılma cəhdinin ID-si. |
TapTime-Signature | t=<unix vaxtı>,v1=<hex HMAC-SHA256 of "t.rawBody">, endpointun öz sirri ilə imzalanmışdır. |
- Hər hansı 2xx cavabı çatdırılmış sayılır; 2xx olmayan cavab və ya vaxt bitməsi geri çəkilmə intervalları (1 dəq, 5 dəq, 15 dəq, 1 saat, 3 saat, 6 saat, 12 saat) ilə 8 cəhdədək yenidən cəhd edilir — 410 xətası yenidən cəhd etməyi dayandırır.
- Yönləndirmələr izlənilmir.
- URL istehsalat mühitində HTTPS olmalıdır və şəxsi və ya loopback ünvana yönəlməməlidir.
- Çatdırılma ən azı bir dəfədir: həmişə imzoyu və TapTime-Event-Id üzrə təkrarları yoxlayın.
{
"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));
Webhook abunəlikləri
Avtomatlaşdırma platformaları istifadəçidən URL yapışdırmağı istəmək əvəzinə tətikləri API vasitəsilə yandırıb-söndürür (“REST hooks”): platformanın öz URL-ini istədiyi hadisələrlə POST edin, qaytarılan id-ni saxlayın və tətik söndürüləndə onu DELETE edin. Abunəlik adi imzalanmış webhook-dur — paneldə onu yaradan açarla işarələnmiş şəkildə görünür.
- Açar yalnız özünün yaratdığı abunəlikləri görür və silir; açar ləğv edildikdə hamısı silinir.
- hooks.zapier.com, make.com və pipedream.net ünvanları tanınır və platformanın adı ilə göstərilir; istənilən digər https ünvanı adi webhook-dur.
- İmza sirri bir dəfə, POST cavabında qaytarılır; sahib onu paneldə yenidən görə bilər.
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"]}'
Postback-lər
Makroları doldurulmuş şəkildə trekerinizin öz URL-inə GET və ya POST sorğusu — JSON webhook-lar əvəzinə sorğu sətri (query string) postback-ləri ilə işləyən platformalar üçün. Sifarişdə {value} sifarişin çaypulu olmadan dəyəri, {order_id} isə onun id-sidir.
https://tracker.example/postback
?cid={click_id}&event={event}&status={status}
&payout={value}&cur={currency}
Mövcud yer tutucular
{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}
Səhvlər
Hər bir səhv JSON-dur: { "error": "<code>", "message": "<human-readable>" }.
| Status | səhv | Mənası |
|---|---|---|
| 401 | unauthorized |
Authorization başlığı yoxdur, yaxud açar etibarsızdır və ya ləğv edilib. |
| 403 | forbidden |
Yalnız oxunur açar, yazı nöqtəsi adlanır (status dəyişikliyi). |
| 404 | not_found |
Həmin ID-yə aid heç bir rezervasiya şirkətə məxsus deyil. |
| 409 | conflict |
Status dəyişikliyi masanı və ya slotu ikiqat rezervasiya edərdi; heç nə dəyişmədi. |
| 422 | invalid_status |
Status sahəsinin dəyəri bu rezervasiya növü üçün qəbul edilən dəyərlərdən biri deyil. |
| 422 | invalid_type |
Hadisə axınının type parametri heç bir hadisə növünü və ya ailəsini adlandırmır. |
| 422 | invalid_url |
Abunəlik URL-i açıq https ünvanı deyil. |
| 429 | rate_limited |
Bu açar üçün bir dəqiqədə 50-dən çox sorğu. Sürəti azaldın və yenidən cəhd edin. |
API girişi, webhook-lar, avtomatlaşdırma və çat inteqrasiyaları hər modula daxildir — əlavə ödəniş yoxdur, ayrıca tərtibatçı planı yoxdur.
Pulsuz sınaq müddətinə başlayın