Geliştirici belgeleri

TapTime REST API

Masa rezervasyonlarını ve randevuları okuyun ve güncelleyin, siparişleri ve sadakat kartlarını okuyun, sıralı etkinlik akışını sorgulayın ve imzalı webhook’lar alın — kendi CRM’inizden, POS sisteminizden, veri ambarınızdan veya bir otomasyon platformundan. Bu sayfa eksiksiz referanstır; neden kullanacağınızı ise dönüşüm izleme kılavuzu anlatır.

Ana URLhttps://api.tapti.me AuthBearer token BiçimJSON Neden kullanılmalı?

Her istek için bir şirket API anahtarı (paneldeki Entegrasyonlar → Webhook'lar ve API) “Authorization: Bearer tt_live_….” biçiminde gönderilmelidir. Yanıtlar ve hata mesajları JSON biçimindedir.

Belirli bir tarihten bu yana değiştirilen onaylanmış rezervasyonlar
curl "https://api.tapti.me/v1/company/reservations?status=confirmed&updatedSince=2026-09-01T00:00:00Z" \
  -H "Authorization: Bearer tt_live_…"

Kimlik Doğrulama

Her istek, taşıyıcı belirteci olarak bir şirket API anahtarı içerir. Panelden bir tane oluşturun — Entegrasyonlar → Webhook’lar ve API → REST API anahtarları — burada anahtar yalnızca bir kez gösterilir ve sunucu tarafında sadece SHA-256 şeklinde bir hash olarak saklanır; kaybolan bir anahtar geri alınmaz, iptal edilir ve yenisiyle değiştirilir. Bir şirket en fazla 10 aktif anahtar bulundurabilir.

  • Salt okunur anahtarlar tüm GET uç noktalarını çağırabilir, ayrıca webhook abonelikleri oluşturup kaldırabilir — bir abonelik, anahtarın zaten okuyamayacağı hiçbir şeyi göndermez.
  • Okuma-yazma anahtarları ayrıca POST ile rezervasyon durumunu değiştirebilir; salt okunur bir anahtar bu yollarda 403 Forbidden alır.
  • Bir anahtar tek bir şirkete aittir — her liste ve sorgu zaten o şirketle sınırlıdır; companyId parametresi yoktur.

Hız sınırları

Anahtar başına dakikada 50 istek, kayan pencereyle ve tüm uç noktalar için ortak. Sınır aşılırsa 429 Too Many Requests döner; daha sık sorgulamak yerine bekleyip yeniden deneyin — ya da bir webhook aboneliği oluşturup sorgulamayı bırakın.

Uç Noktalar

GET /v1/company Yalnızca okuma veya okuma-yazma

Güncel şirketi al

Anahtarın ait olduğu şirket ve anahtarın kendisinin neler yapabileceği.

GET /v1/company/reservations Yalnızca okuma veya okuma-yazma

Rezervasyon listesi

Şirket için masa rezervasyonları, en eski başlangıç saatine göre sıralanır — ya da updatedSince ayarlandığında, en eski güncelleme tarihine göre sıralanır.

ParametreTypeAnlamı
status string Virgülle ayrılmış: beklemede, onaylandı, yer aldı, tamamlandı, katılmadı, iptal edildi. “iptal edildi” seçeneği her iki iptal nedeniyle de eşleşir.
branchId integer Tek bir dal ile sınırlandır.
from ISO 8601 datetime Yalnızca bu saatten itibaren başlayan rezervasyonlar (zaman farkı belirtilmedikçe UTC'ye göre).
to ISO 8601 datetime Yalnızca bu saatten önce başlayan rezervasyonlar.
updatedSince ISO 8601 datetime Yalnızca bu zamandan beri değiştirilen rezervasyonlar; senkronizasyon için sıralamayı updatedAt'dan başlayarak artan sıraya geçirir.
limit integer Sayfa boyutu, 1–100. Varsayılan değer 50.
page integer 1'den başlayan sayfa numarası. Varsayılan değer 1.
GET /v1/company/appointments Yalnızca okuma veya okuma-yazma

Randevuları listele

“Randevular” modülü için, “Rezervasyonlar” modülündeki ile aynı yapı ve filtreler.

ParametreTypeAnlamı
status string Virgülle ayrılmış: beklemede, onaylandı, tamamlandı, gelmedi, iptal edildi.
branchId integer Tek bir dal ile sınırlandır.
from ISO 8601 datetime Yalnızca bu saatten itibaren başlayan rezervasyonlar.
to ISO 8601 datetime Yalnızca bu saatten önce başlayan rezervasyonlar.
updatedSince ISO 8601 datetime Sadece bu tarihten itibaren değiştirilen rezervasyonlar; updatedAt'a göre artan sırada sıralanmıştır.
limit integer Sayfa boyutu, 1–100. Varsayılan değer 50.
page integer 1'den başlayan sayfa numarası. Varsayılan değer 1.
GET /v1/company/reservations/{id} Yalnızca okuma veya okuma-yazma

Bir rezervasyonu getir

Tek bir koşul: webhook'ların ilettiği şekliyle ve kaynak gösterimi dahil olmak üzere. Kimlik, anahtarın ait olduğu şirkete ait değilse 404 hatası verilir.

GET /v1/company/appointments/{id} Yalnızca okuma veya okuma-yazma

Bir randevuyu getir

Tek bir randevu; rezervasyon sorgulamayla aynı yapı ve kurallara sahiptir.

POST /v1/company/reservations/{id}/status Yalnızca okuma-yazma

Bir rezervasyonun durumunu değiştirme

Onayla, yer ayarla, tamamla, gelmeme durumu işaretle, iptal et veya yeniden aç — tahtada değişiklik yapıldığında olduğu gibi aynı webhook’ları ve dönüşümleri tetikler. JSON gövdesi: {"status": "..."}.

ParametreTypeAnlamı
status string, required Aşağıdakilerden biri: beklemede, onaylandı, yer aldı, tamamlandı, katılmadı, iptal edildi (canceled ve canceled_by_venue de kabul edilir).
POST /v1/company/appointments/{id}/status Yalnızca okuma-yazma

Bir randevunun durumunu değiştirme

Rezervasyon uç noktasıyla aynıdır, ancak “seated” durumu yoktur.

ParametreTypeAnlamı
status string, required Aşağıdakilerden biri: beklemede, onaylandı, tamamlandı, gelmedi, iptal edildi (canceled ve canceled_by_venue ifadeleri de kabul edilir).
GET /v1/company/events Yalnızca okuma veya okuma-yazma

Etkinlik akışını sorgula

Tüm rezervasyon, sipariş ve sadakat etkinlikleri, en eskiden başlayarak — webhook’ların da beslendiği aynı akış. Yalnızca yenileri almak için en son gördüğünüz imleci after olarak, yalnızca bazı türleri almak için type parametresini gönderin.

ParametreTypeAnlamı
after integer cursor İşlediğiniz son etkinliğin imleci. Baştan başlamak için bu parametreyi göndermeyin.
type string Virgülle ayrılmış etkinlik türleri veya aileleri: booking.confirmed,order.placed ya da order, loyalty.*. Tüm etkinlikler için göndermeyin.
limit integer Sayfa boyutu, 1–100. Varsayılan değer 50.
GET /v1/company/orders Yalnızca okuma veya okuma-yazma

Siparişleri listele

Misafirlerin masa, paket servis ve teslimat siparişleri ile kasada girilen tüm satışlar, en eskiden başlayarak — paidSince ayarlandığında ise ödenme sırasına göre. Ön ödemesi hâlâ beklenen siparişler dahil edilmez.

ParametreTypeAnlamı
status string Virgülle ayrılmış: open, paid.
source string customer (misafirin verdiği) veya staff (personelin girdiği).
fulfilment string Virgülle ayrılmış: dine_in, takeaway, delivery.
branchId integer Tek bir şube ile sınırlandır.
from ISO 8601 datetime Yalnızca bu saatte veya sonrasında oluşturulan siparişler.
to ISO 8601 datetime Yalnızca bu saatten önce oluşturulan siparişler.
paidSince ISO 8601 datetime Yalnızca bu saatten beri ödenen siparişler; satışları senkronize etmek için paidAt’a göre artan sırada sıralar.
limit integer Sayfa boyutu, 1–100. Varsayılan değer 50.
page integer 1'den başlayan sayfa numarası. Varsayılan değer 1.
GET /v1/company/orders/{id} Yalnızca okuma veya okuma-yazma

Bir siparişi getir

Satırları, toplamları ve atfıyla tek bir sipariş — sipariş webhook’larının taşıdığı biçimde.

GET /v1/company/loyalty/programs Yalnızca okuma veya okuma-yazma

Sadakat programlarını listele

Tüm damga kartı programları: ad, durum, gereken damga sayısı, ödül ve geçerli olduğu yerler.

GET /v1/company/loyalty/cards Yalnızca okuma veya okuma-yazma

Sadakat kartlarını listele

Üyelerin kartları, sadakat nesnesi biçiminde. Kartını dolduran üyenin o kartı completed olur ve yanında yeni bir aktif kart açılır; customer.id üyedir.

ParametreTypeAnlamı
programId integer Tek bir programla sınırlandır.
customerId integer Tek bir üyeyle sınırlandır.
status string Virgülle ayrılmış: active, completed.
updatedSince ISO 8601 datetime Yalnızca bu saatten beri damga alan veya tamamlanan kartlar; updatedAt’a göre artan sırada sıralar.
limit integer Sayfa boyutu, 1–100. Varsayılan değer 50.
page integer 1'den başlayan sayfa numarası. Varsayılan değer 1.
GET /v1/company/loyalty/rewards Yalnızca okuma veya okuma-yazma

Sadakat ödüllerini listele

Kart tamamlanarak kazanılan ödüller; kodu, son kullanma tarihi ve kullanılıp kullanılmadığıyla birlikte.

ParametreTypeAnlamı
programId integer Tek bir programla sınırlandır.
customerId integer Tek bir üyeyle sınırlandır.
status string Virgülle ayrılmış: issued, redeemed, expired.
from ISO 8601 datetime Yalnızca bu saatte veya sonrasında verilen ödüller.
to ISO 8601 datetime Yalnızca bu saatten önce verilen ödüller.
limit integer Sayfa boyutu, 1–100. Varsayılan değer 50.
page integer 1'den başlayan sayfa numarası. Varsayılan değer 1.
GET /v1/company/webhooks Yalnızca okuma veya okuma-yazma

Webhook aboneliklerini listele

Bu anahtarın oluşturduğu abonelikler. Panelde eklenen webhook’lar burada listelenmez.

POST /v1/company/webhooks Yalnızca okuma veya okuma-yazma

Webhook aboneliği oluştur

Bir URL’ye etkinlik göndermeye başlar — bir kullanıcı tetikleyiciyi açtığında otomasyon platformunun uygulamasının çağırdığı şey budur. Aboneliği ve imzalama anahtarını bir kez döndürür. JSON gövdesi: {"url": "…", "events": ["order.placed"]}; Zapier’in {"target_url": "…", "event": "…"} biçimi de kabul edilir.

ParametreTypeAnlamı
url string, required Gönderilecek https adresi (target_url de kabul edilir).
events array of strings, required Etkinlik türleri, order.* veya loyalty gibi aileler ya da her şey için * (tek bir etkinlik için event de kabul edilir).
description string Panelde gösterilen ad. Varsayılan olarak platformun ve anahtarın adı.
DELETE /v1/company/webhooks/{id} Yalnızca okuma veya okuma-yazma

Webhook aboneliğini kaldır

Bu anahtarın oluşturduğu bir aboneliğe gönderimi durdurur. 204 döndürür. Anahtar iptal edilirse tüm abonelikleri de kaldırılır.

Rezervasyon nesnesi

Bir rezervasyon ve bir randevu, tek bir ortak formda gösterilir: tür, kimlik, durum, kaynak, guestInitiated, startsAt/endsAt/zaman dilimi (şubenin kendi zaman dilimi), para birimi, şirket, şube, misafir, atıf, conversionId, createdAt/updatedAt — ayrıca rezervasyon için partySize ve tablo; randevu için ise hizmet ve uzman bilgileri. Bu, bir webhook'un ilettiği verilerle tam olarak aynıdır; dolayısıyla bunlardan birini işleyen bir alıcı, her ikisini de işleyebilir.

GET /v1/company/reservations/4821 → veri
{
  "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…" }
  }
}

Sipariş nesnesi

Bir sipariş, nerede karşınıza çıkarsa çıksın — REST API, sipariş webhook’ları, etkinlik akışı — tek bir biçimde gelir: kind ("order"), id, number (personelin seslendiği fiş numarası), status (open veya paid), source (customer veya staff), guestInitiated, fulfilment, table, label, deliveryAddress, note, currency, timezone, company, branch, customer (personel tanımladıysa sadakat üyesi), items (name, variant, quantity, unitPriceCents, subtotalCents), itemCount, subtotalCents, discountCents, deliveryFeeCents, tipCents, totalCents, valueCents (siparişin bahşiş hariç değeri — dönüşümlerin raporladığı sayı), paymentMethod, servedBy, conversionId, createdAt, paidAt ve attribution. Tutarlar her zaman küçük birim cinsindendir (kuruş).

GET /v1/company/orders/9170 → data
{
  "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…" }
  }
}

Sadakat nesnesi

Her sadakat etkinliği, kartı ve ödülü aynı biçimi paylaşır: kind ("loyalty"), id (kart), timezone, company, branch (varsa gerçekleştiği şube), program (id, name, stampsRequired, rewardTitle), customer (id, name, phone, locale), card (id, status, stampsCount, stampsRequired, stampsToReward, createdAt), stamp (damga için: source, issuedBy, createdAt) ve reward (ödül için: code, title, status, expiresAt, redeemedAt, redeemedBy), ayrıca conversionId — sadakat kaydının raporlandığı kimlik.

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

Etkinlik akışı

Her satır { id, cursor, type, createdAt, previousStatus, data } biçimindedir. data, konuyu etkinliğin önekinin adlandırdığı anahtar altında taşır: data.booking, data.order veya data.loyalty. İşlediğiniz en yüksek cursor değerini saklayın ve after olarak geri gönderin — hiçbir satırı atlamaz veya tekrarlamaz, bu yüzden bir çökmeden sonra kaldığınız yerden devam etmek güvenlidir. İşlemediğiniz türleri yok sayın: yenileri eklenebilir.

Etkinlik türüAnlamı
booking.requestedBir misafir, onayınızı bekleyen bir rezervasyon talep etti.
booking.confirmedBir rezervasyon onaylandı — onaylı olarak oluşturuldu ya da sonradan personel tarafından onaylandı.
booking.cancelledMisafir veya işletme tarafından iptal edildi; hangisi olduğunu status gösterir.
booking.no_showMisafir gelmedi.
booking.completedZiyaret sona erdi.
order.placedBir misafirin siparişi işletmeye ulaştı — sayfadan, bir masanın QR kodundan, paket servis ya da teslimat olarak; işletme ödemeyi önceden alıyorsa ödemeden sonra.
order.paidKasada girilen satışlar dahil, herhangi bir siparişin ödemesi alındı.
loyalty.member_joinedBir müşteri bir programdaki ilk damgasını aldı.
loyalty.stamp_addedBir karta damga eklendi.
loyalty.reward_issuedBir kart tamamlandı ve ödülü verildi.
loyalty.reward_redeemedBir ödül teslim edildi.
Etkinlik akışını takip edin
curl "https://api.tapti.me/v1/company/events?after=998&limit=100" \
  -H "Authorization: Bearer tt_live_…"

Webhook'lar

Entegrasyonlar → Webhook’lar ve API altında bir uç nokta oluşturun — ya da Entegrasyonlar → Otomasyon altında Zapier, Make, n8n veya Pipedream bağlayın — böylece bir rezervasyon, sipariş veya sadakat kartı değiştiği anda TapTime imzalı bir JSON etkinliğini POST ile göndersin. Etkinlikleri her uç nokta için ayrı seçersiniz. Bir şirketin toplamda en fazla 50 webhook, postback, sohbet ve otomasyon bağlantısı olabilir.

BaşlıkAnlamı
TapTime-EventEtkinlik türü, örneğin booking.confirmed.
TapTime-Event-IdOlayın sabit kimliği — yeniden denenmiş bir teslimatı tekilleştirmek için bunu kullanın.
TapTime-DeliveryBu belirli teslimat girişiminin kimlik numarası.
TapTime-Signaturet=<unix time>,v1=<"t.rawBody" için hex HMAC-SHA256>, uç noktanın kendi anahtarıyla imzalanır.
  • 2xx serisi yanıtlar, isteklerin ulaştığı kabul edilir; 2xx serisi dışındaki yanıtlar veya zaman aşımı durumlarında, geri çekilme aralıkları (1 dk, 5 dk, 15 dk, 1 saat, 3 saat, 6 saat, 12 saat) uygulanarak en fazla 8 deneme yapılır — 410 yanıtı geldiğinde denemeler durdurulur.
  • Yönlendirmeler takip edilmez.
  • Üretim ortamında URL’nin HTTPS olması gerekir ve özel bir adrese ya da döngü gerisi adresine yönlendirilmemelidir.
  • Teslimat en az bir kez yapılır: her zaman imzayı doğrulayın ve TapTime-Event-Id değerinde yinelenenleri ayıklayın.
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", "…": "…" } }
}
İmzayı doğrula (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));

Webhook abonelikleri

Otomasyon platformları, kullanıcıdan URL yapıştırmasını istemek yerine tetikleyicileri API üzerinden açıp kapatır (“REST hooks”): platformun kendi URL’sini istediği etkinliklerle POST edin, dönen id’yi saklayın ve tetikleyici kapatıldığında DELETE ile silin. Abonelik sıradan bir imzalı webhook’tur — panelde, onu oluşturan anahtarla işaretlenmiş olarak görünür.

  • Bir anahtar yalnızca kendi oluşturduğu abonelikleri görür ve kaldırır; anahtar iptal edilirse hepsi kaldırılır.
  • hooks.zapier.com, make.com ve pipedream.net adresleri tanınır ve platformun adıyla gösterilir; diğer tüm https adresleri sıradan webhook’lardır.
  • İmzalama anahtarı bir kez, POST yanıtında döndürülür; hesap sahibi onu panelde yeniden görüntüleyebilir.
Bir URL’yi yeni siparişlere abone et
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'ler

JSON webhook’lar yerine sorgu dizesi (query string) postback’leri kullanan platformlar için, makroları doldurulmuş olarak takip aracınızın kendi URL’sine bir GET veya POST isteği. Bir siparişte {value} siparişin bahşiş hariç değeri, {order_id} ise kimliğidir.

Yer tutucular içeren geri gönderim URL’si · GET veya POST
https://tracker.example/postback
  ?cid={click_id}&event={event}&status={status}
  &payout={value}&cur={currency}

Kullanılabilir 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}

Hatalar

Her hata JSON biçimindedir: { "error": "<code>", "message": "<human-readable>" }.

StatushataAnlamı
401 unauthorized Authorization başlığı eksik ya da anahtar geçersiz ya da iptal edilmiş.
403 forbidden “Yazma uç noktası” (durum değişikliği) olarak adlandırılan, salt okunur bir anahtar.
404 not_found Bu kimlik numarasına ait, anahtarın ait olduğu şirkete kayıtlı hiçbir rezervasyon bulunmamaktadır.
409 conflict Durum değişikliği, masanın veya zaman diliminin iki kez rezerve edilmesine yol açacaktı; hiçbir değişiklik yapılmadı.
422 invalid_status Durum alanı değeri, söz konusu rezervasyon türü için kabul edilen değerlerden biri değil.
422 invalid_type Etkinlik akışındaki type hiçbir etkinlik türünü veya ailesini belirtmiyor.
422 invalid_url Abonelik URL’si herkese açık bir https adresi değil.
429 rate_limited Bu anahtar için bir dakikada 50'den fazla istek alındı. Hızınızı azaltın ve tekrar deneyin.
Anahtar mı lazım?

API erişimi, webhook’lar ve otomasyon ile sohbet entegrasyonları her modüle dahildir — ek ücret yok, ayrı bir geliştirici planı yok.

Ücretsiz deneme sürümünü başlatın