Dokumentacija programuotojams

TapTime REST API

Skaitykite ir keiskite stalų rezervacijas ir vizitus, skaitykite užsakymus ir lojalumo korteles, užklauskite surikiuotą įvykių srautą ir gaukite pasirašytus webhooks — iš savo CRM, kasos sistemos, duomenų saugyklos ar automatizavimo platformos. Šis puslapis — išsamus žinynas; konversijų sekimo vadove paaiškinta, kam jį naudoti.

Bazinis URLhttps://api.tapti.me AutentifikacijaBearer token FormatasJSON Kam to reikia

Kiekvienai užklausai reikia įmonės API rakto (valdymo skyde Integracijos → Webhooks ir API), siunčiamo kaip Authorization: Bearer tt_live_…. Atsakymai ir klaidos pateikiami JSON formatu.

Patvirtintos rezervacijos, pakeistos nuo nurodytos datos
curl "https://api.tapti.me/v1/company/reservations?status=confirmed&updatedSince=2026-09-01T00:00:00Z" \
  -H "Authorization: Bearer tt_live_…"

Autentifikacija

Kiekvienoje užklausoje siunčiamas įmonės API raktas kaip bearer žetonas. Jį sukursite valdymo skyde — Integracijos → Webhooks ir API → REST API raktai — kur jis parodomas vieną kartą, o serveryje saugomas tik kaip SHA-256 maiša; prarastas raktas atšaukiamas ir pakeičiamas, o ne atkuriamas. Įmonė gali turėti iki 10 aktyvių raktų.

  • Tik skaitymo raktai gali kviesti visus GET galinius taškus ir gali prenumeruoti bei atšaukti webhooks — prenumerata nesiunčia nieko, ko raktas ir taip negalėtų perskaityti.
  • Skaitymo ir rašymo raktai taip pat gali siųsti POST rezervacijos būsenos pakeitimui; tik skaitymo raktas šiuose maršrutuose gauna 403 Forbidden.
  • Raktas priklauso vienai įmonei — kiekvienas sąrašas ir paieška jau apriboti ja, companyId parametro nėra.

Užklausų limitai

50 užklausų per minutę vienam raktui, slenkančiu langu, bendrai visiems galiniams taškams. Viršijus limitą grąžinama 429 Too Many Requests; palaukite ir bandykite iš naujo, užuot užklausę dažniau — arba užsiprenumeruokite webhook ir nustokite užklausinėti.

Galiniai taškai

GET /v1/company Tik skaitymo arba skaitymo ir rašymo

Gauti dabartinę įmonę

Įmonė, kuriai priklauso raktas, ir ką pats raktas gali daryti.

GET /v1/company/reservations Tik skaitymo arba skaitymo ir rašymo

Rezervacijų sąrašas

Įmonės stalų rezervacijos, pirmiausia anksčiausiai prasidedančios — arba, kai nurodytas updatedSince, pirmiausia anksčiausiai atnaujintos.

ParametrasTipasReikšmė
status string Atskirta kableliais: pending, confirmed, seated, completed, no_show, cancelled. cancelled atitinka abi atšaukimo priežastis.
branchId integer Apriboti vienu filialu.
from ISO 8601 datetime Tik rezervacijos, prasidedančios šiuo metu arba vėliau (UTC, jei poslinkis nenurodytas).
to ISO 8601 datetime Tik rezervacijos, prasidedančios prieš šį laiką.
updatedSince ISO 8601 datetime Tik rezervacijos, pakeistos nuo šio laiko; rikiavimas perjungiamas į updatedAt didėjimo tvarka, sinchronizavimui.
limit integer Puslapio dydis, 1–100. Numatytasis 50.
page integer Puslapio numeris nuo 1. Numatytasis 1.
GET /v1/company/appointments Tik skaitymo arba skaitymo ir rašymo

Vizitų sąrašas

Ta pati struktūra ir filtrai kaip rezervacijų, modulio „Vizitai“ duomenims.

ParametrasTipasReikšmė
status string Atskirta kableliais: pending, confirmed, completed, no_show, cancelled.
branchId integer Apriboti vienu filialu.
from ISO 8601 datetime Tik rezervacijos, prasidedančios šiuo metu arba vėliau.
to ISO 8601 datetime Tik rezervacijos, prasidedančios prieš šį laiką.
updatedSince ISO 8601 datetime Tik rezervacijos, pakeistos nuo šio laiko; rikiuojama pagal updatedAt didėjimo tvarka.
limit integer Puslapio dydis, 1–100. Numatytasis 50.
page integer Puslapio numeris nuo 1. Numatytasis 1.
GET /v1/company/reservations/{id} Tik skaitymo arba skaitymo ir rašymo

Gauti rezervaciją

Viena rezervacija, ta pačia struktūra, kokia ją perduoda webhooks, su jos priskyrimu. 404, kai id nepriklauso rakto įmonei.

GET /v1/company/appointments/{id} Tik skaitymo arba skaitymo ir rašymo

Gauti vizitą

Vienas vizitas, ta pati struktūra ir taisyklės kaip rezervacijos paieškai.

POST /v1/company/reservations/{id}/status Tik skaitymo ir rašymo

Keisti rezervacijos būseną

Patvirtinkite, pasodinkite, užbaikite, pažymėkite neatvykimą, atšaukite arba atidarykite iš naujo — paleidžiami tie patys webhooks ir konversijos kaip keičiant būseną lentoje. JSON turinys: {"status": "..."}.

ParametrasTipasReikšmė
status string, privalomas Viena iš: pending, confirmed, seated, completed, no_show, cancelled (taip pat priimami canceled ir canceled_by_venue).
POST /v1/company/appointments/{id}/status Tik skaitymo ir rašymo

Keisti vizito būseną

Tas pats kaip rezervacijos galinis taškas, tik be būsenos seated.

ParametrasTipasReikšmė
status string, privalomas Viena iš: pending, confirmed, completed, no_show, cancelled (taip pat priimami canceled ir canceled_by_venue).
GET /v1/company/events Tik skaitymo arba skaitymo ir rašymo

Užklausti įvykių srautą

Kiekvienas rezervacijos, užsakymo ir lojalumo įvykis, pirmiausia seniausi — tas pats srautas, iš kurio formuojami webhooks. Paskutinį matytą žymeklį perduokite kaip after, kad gautumėte tik naujus įvykius, o type — kad gautumėte tik tam tikras rūšis.

ParametrasTipasReikšmė
after integer cursor Paskutinio apdoroto įvykio žymeklis. Praleiskite, kad pradėtumėte nuo pradžios.
type string Kableliais atskirti įvykių tipai arba šeimos: booking.confirmed,order.placed arba order, loyalty.*. Praleiskite, kad gautumėte visus įvykius.
limit integer Puslapio dydis, 1–100. Numatytasis 50.
GET /v1/company/orders Tik skaitymo arba skaitymo ir rašymo

Užsakymų sąrašas

Svečių užsakymai prie stalo, išsinešti ir su pristatymu bei kiekvienas kasoje užregistruotas pardavimas, pirmiausia seniausi — arba, kai nurodytas paidSince, apmokėjimo tvarka. Užsakymas, vis dar laukiantis išankstinio apmokėjimo, neįtraukiamas.

ParametrasTipasReikšmė
status string Atskirta kableliais: open, paid.
source string customer (pateikė svečias) arba staff (užregistravo personalas).
fulfilment string Atskirta kableliais: dine_in, takeaway, delivery.
branchId integer Apriboti vienu filialu.
from ISO 8601 datetime Tik užsakymai, sukurti šiuo metu arba vėliau.
to ISO 8601 datetime Tik užsakymai, sukurti prieš šį laiką.
paidSince ISO 8601 datetime Tik užsakymai, apmokėti nuo šio laiko; rikiuojama pagal paidAt didėjimo tvarka, pardavimų sinchronizavimui.
limit integer Puslapio dydis, 1–100. Numatytasis 50.
page integer Puslapio numeris nuo 1. Numatytasis 1.
GET /v1/company/orders/{id} Tik skaitymo arba skaitymo ir rašymo

Gauti užsakymą

Vienas užsakymas su eilutėmis, sumomis ir priskyrimu, ta pačia struktūra, kokia jį perduoda užsakymų webhooks.

GET /v1/company/loyalty/programs Tik skaitymo arba skaitymo ir rašymo

Lojalumo programų sąrašas

Kiekviena štampų kortelės programa: pavadinimas, būsena, reikalingų štampų skaičius, prizas ir kur jis galioja.

GET /v1/company/loyalty/cards Tik skaitymo arba skaitymo ir rašymo

Lojalumo kortelių sąrašas

Narių kortelės, lojalumo objekto struktūra. Narys, užpildęs kortelę, turi ją su būsena completed ir šalia naują aktyvią; customer.id — tai narys.

ParametrasTipasReikšmė
programId integer Apriboti viena programa.
customerId integer Apriboti vienu nariu.
status string Atskirta kableliais: active, completed.
updatedSince ISO 8601 datetime Tik kortelės, pažymėtos štampu arba užbaigtos nuo šio laiko; rikiuojama pagal updatedAt didėjimo tvarka.
limit integer Puslapio dydis, 1–100. Numatytasis 50.
page integer Puslapio numeris nuo 1. Numatytasis 1.
GET /v1/company/loyalty/rewards Tik skaitymo arba skaitymo ir rašymo

Lojalumo prizų sąrašas

Prizai, gauti užpildžius kortelę, su kodu, galiojimo pabaiga ir informacija, ar jie panaudoti.

ParametrasTipasReikšmė
programId integer Apriboti viena programa.
customerId integer Apriboti vienu nariu.
status string Atskirta kableliais: issued, redeemed, expired.
from ISO 8601 datetime Tik prizai, išduoti šiuo metu arba vėliau.
to ISO 8601 datetime Tik prizai, išduoti prieš šį laiką.
limit integer Puslapio dydis, 1–100. Numatytasis 50.
page integer Puslapio numeris nuo 1. Numatytasis 1.
GET /v1/company/webhooks Tik skaitymo arba skaitymo ir rašymo

Webhook prenumeratų sąrašas

Šio rakto sukurtos prenumeratos. Valdymo skyde pridėti webhooks čia nerodomi.

POST /v1/company/webhooks Tik skaitymo arba skaitymo ir rašymo

Prenumeruoti webhook

Pradeda siųsti įvykius adresu — tai, ką automatizavimo platformos programėlė iškviečia, kai naudotojas įjungia trigerį. Grąžina prenumeratą ir jos pasirašymo slaptą raktą, vieną kartą. JSON turinys: {"url": "…", "events": ["order.placed"]}; Zapier formatas {"target_url": "…", "event": "…"} taip pat priimamas.

ParametrasTipasReikšmė
url string, privalomas https adresas, kuriuo siunčiama (taip pat priimamas target_url).
events array of strings, privalomas Įvykių tipai, šeimos, pvz., order.* arba loyalty, arba * viskam (vienam įvykiui taip pat priimamas event).
description string Valdymo skyde rodomas pavadinimas. Numatytasis — platforma ir rakto pavadinimas.
DELETE /v1/company/webhooks/{id} Tik skaitymo arba skaitymo ir rašymo

Atšaukti webhook prenumeratą

Nustoja siųsti šio rakto sukurtai prenumeratai. Grąžina 204. Atšaukus raktą, pašalinamos ir visos jo prenumeratos.

Rezervacijos objektas

Rezervacija ir vizitas pateikiami viena bendra struktūra: kind, id, status, source, guestInitiated, startsAt/endsAt/timezone (paties filialo laiko juosta), currency, company, branch, guest, attribution, conversionId, createdAt/updatedAt — bei partySize ir table rezervacijai, service ir specialist vizitui. Tai lygiai tai, ką pristato webhook, todėl gavėjas, apdorojantis vieną, apdoros ir kitą.

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

Užsakymo objektas

Užsakymas visur pateikiamas viena struktūra — REST API, užsakymų webhooks, įvykių sraute: kind ("order"), id, number (numeris, kurį iškviečia personalas), status (open arba paid), source (customer arba staff), guestInitiated, fulfilment, table, label, deliveryAddress, note, currency, timezone, company, branch, customer (lojalumo narys, kai personalas jį identifikavo), items (name, variant, quantity, unitPriceCents, subtotalCents), itemCount, subtotalCents, discountCents, deliveryFeeCents, tipCents, totalCents, valueCents (užsakymo vertė be arbatpinigių — skaičius, kurį praneša konversijos), paymentMethod, servedBy, conversionId, createdAt, paidAt ir attribution. Sumos visada nurodomos smulkiaisiais vienetais.

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

Lojalumo objektas

Kiekvienas lojalumo įvykis, kortelė ir prizas turi vieną struktūrą: kind ("loyalty"), id (kortelė), timezone, company, branch (kur tai įvyko, jei yra), program (id, name, stampsRequired, rewardTitle), customer (id, name, phone, locale), card (id, status, stampsCount, stampsRequired, stampsToReward, createdAt), stamp (štampui: source, issuedBy, createdAt) ir reward (prizui: code, title, status, expiresAt, redeemedAt, redeemedBy), taip pat conversionId — id, kuriuo pranešama apie lojalumo registraciją.

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

Įvykių srautas

Kiekviena eilutė yra { id, cursor, type, createdAt, previousStatus, data }. data saugo objektą po raktu, kurį nurodo įvykio priešdėlis: data.booking, data.order arba data.loyalty. Išsaugokite didžiausią apdorotą cursor ir perduokite jį atgal kaip after — jis niekada nepraleidžia ir nepakartoja eilutės, todėl saugu tęsti po gedimo. Ignoruokite neapdorojamus tipus: gali būti pridėta naujų.

Įvykio tipasReikšmė
booking.requestedSvečias pateikė rezervacijos užklausą, laukiančią Jūsų patvirtinimo.
booking.confirmedRezervacija patvirtinta — sukurta iškart patvirtinta arba vėliau patvirtinta personalo.
booking.cancelledAtšaukė svečias arba vieta; status nurodo, kas.
booking.no_showSvečias neatvyko.
booking.completedVizitas baigtas.
order.placedSvečio užsakymas pasiekė vietą — iš puslapio, stalo QR kodo, išsinešti ar su pristatymu; po apmokėjimo, kai vieta ima apmokėjimą iš anksto.
order.paidBet koks užsakymas apmokėtas, įskaitant kasoje užregistruotus pardavimus.
loyalty.member_joinedKlientas gavo pirmąjį štampą programoje.
loyalty.stamp_addedĮ kortelę pridėtas štampas.
loyalty.reward_issuedKortelė užpildyta ir išduotas jos prizas.
loyalty.reward_redeemedPrizas įteiktas.
Sinchronizuokite su įvykių srautu
curl "https://api.tapti.me/v1/company/events?after=998&limit=100" \
  -H "Authorization: Bearer tt_live_…"

Webhooks

Sukurkite galinį tašką skiltyje Integracijos → Webhooks ir API — arba prijunkite Zapier, Make, n8n ar Pipedream skiltyje Integracijos → Automatizavimas — ir TapTime išsiųs pasirašytą JSON įvykį tą pačią akimirką, kai pasikeičia rezervacija, užsakymas ar lojalumo kortelė. Įvykius pasirenkate kiekvienam galiniam taškui. Įmonė iš viso gali turėti iki 50 webhooks, postbacks, pokalbių ir automatizavimo jungčių.

AntraštėReikšmė
TapTime-EventĮvykio tipas, pvz., booking.confirmed.
TapTime-Event-IdPastovus įvykio id — naudokite jį pakartotinio pristatymo dublikatams pašalinti.
TapTime-DeliveryŠio konkretaus pristatymo bandymo id.
TapTime-Signaturet=<unix time>,v1=<hex HMAC-SHA256 of "t.rawBody">, pasirašyta paties galinio taško slaptu raktu.
  • Bet koks 2xx atsakymas laikomas pristatytu; ne 2xx atsakymas arba laiko viršijimas kartojamas su atidėjimu (1m, 5m, 15m, 1h, 3h, 6h, 12h) iki 8 bandymų — 410 sustabdo kartojimą.
  • Peradresavimai nesekami.
  • Produkcinėje aplinkoje URL turi būti HTTPS ir negali rodyti į privatų ar loopback adresą.
  • Pristatymas vyksta bent kartą: visada tikrinkite parašą ir šalinkite dublikatus pagal 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", "…": "…" } }
}
Patikrinkite parašą (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 prenumeratos

Automatizavimo platformos įjungia ir išjungia trigerius per API, užuot prašiusios naudotojo įklijuoti URL („REST hooks“): siųskite POST su platformos URL ir norimais įvykiais, išsaugokite grąžintą id ir siųskite DELETE, kai trigeris išjungiamas. Prenumerata yra įprastas pasirašytas webhook — ji rodoma valdymo skyde, pažymėta ją sukūrusiu raktu.

  • Raktas mato ir šalina tik savo sukurtas prenumeratas; atšaukus raktą, pašalinamos visos jos.
  • Adresai hooks.zapier.com, make.com ir pipedream.net atpažįstami ir rodomi su platformos pavadinimu; bet kuris kitas https adresas yra paprastas webhook.
  • Pasirašymo slaptas raktas grąžinamas vieną kartą, atsakyme į POST; savininkas gali jį vėl parodyti valdymo skyde.
Prenumeruokite URL naujiems užsakymams
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

GET arba POST užklausa į Jūsų sekimo sistemos URL su užpildytais makrokomandų kintamaisiais — platformoms, naudojančioms užklausos eilutės postbacks, o ne JSON webhooks. Užsakymui {value} yra užsakymo vertė be arbatpinigių, o {order_id} — jo id.

Postback URL su kintamaisiais · GET arba POST
https://tracker.example/postback
  ?cid={click_id}&event={event}&status={status}
  &payout={value}&cur={currency}

Galimi kintamieji

  • {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}

Klaidos

Kiekviena klaida pateikiama JSON formatu: { "error": "<code>", "message": "<human-readable>" }.

BūsenaklaidaReikšmė
401 unauthorized Trūksta Authorization antraštės arba raktas neteisingas ar atšauktas.
403 forbidden Tik skaitymo raktas iškvietė rašymo galinį tašką (būsenos keitimą).
404 not_found Rakto įmonei nepriklauso rezervacija su tokiu id.
409 conflict Būsenos pakeitimas dvigubai užimtų stalą ar laiką; niekas nepakeista.
422 invalid_status status reikšmė nėra viena iš šiam rezervacijos tipui priimamų reikšmių.
422 invalid_type Įvykių srauto type neatitinka jokio įvykio tipo ar šeimos.
422 invalid_url Prenumeratos URL nėra viešas https adresas.
429 rate_limited Daugiau nei 50 užklausų per minutę šiam raktui. Sulėtinkite ir bandykite iš naujo.
Reikia rakto?

API prieiga, webhooks bei automatizavimo ir pokalbių integracijos įtrauktos į kiekvieną modulį — be papildomo mokesčio, be atskiro programuotojų plano.

Pradėti nemokamą bandymą