Για developers[email protected]
Prebook API · v1 · Beta

Συνδέστε οτιδήποτε με την εφαρμογή του Prebook.

Ένα μικρό σύνολο εργαλείων HTTP που μπορεί να καλεί οποιοδήποτε σύστημα — AI τηλεφωνική γραμματεία, chatbot, το δικό σας website ή άλλο λογισμικό — για να απαντά σε ερωτήσεις για μια επιχείρηση, να βρίσκει ελεύθερες ώρες και να κλείνει, να μεταφέρει ή να ακυρώνει ραντεβού, με κάθε κανόνα που έχει ορίσει η επιχείρηση στο Prebook να εφαρμόζεται αυτόματα.

Για επιχειρήσεις: αν χρησιμοποιείτε (ή θέλετε) AI τηλεφωνική γραμματεία, chatbot ή δικό σας website, μπορούν να κλείνουν ραντεβού κατευθείαν στο ημερολόγιο του Prebook σας. Δημιουργήστε κλειδί στις Ρυθμίσεις → Συνδέσεις & API (πακέτα Pro και Business) και δώστε το στον πάροχό σας.

Base URL https://management.prebook.gr/api/agent/v1JSON μέσω HTTPSΏρα Ελλάδας (Europe/Athens)17 εργαλεία

Επισκόπηση

Το Prebook είναι πλατφόρμα κρατήσεων για ελληνικές επιχειρήσεις — ιατρεία, κομμωτήρια, studios, γυμναστήρια, γήπεδα. Το Prebook API επιτρέπει σε οποιοδήποτε σύστημα να δουλεύει πάνω στο ημερολόγιο Prebook της επιχείρησης αντί να κρατά δικό του: διαθεσιμότητα, προσωπικό, ημέρες κλεισίματος και πολιτικές έρχονται πάντα από το Prebook, και τα ραντεβού καταλήγουν στο ίδιο ημερολόγιο που ήδη χρησιμοποιούν η επιχείρηση και οι πελάτες της.

Τι μπορείτε να συνδέσετε

AI τηλεφωνική γραμματεία

Ο φωνητικός βοηθός απαντά στο τηλέφωνο της επιχείρησης και κλείνει ραντεβού στο ημερολόγιο του Prebook.

Chatbot

Στο site της επιχείρησης ή στα κανάλια μηνυμάτων της: απαντά σε ερωτήσεις, βρίσκει ώρα και κλείνει το ραντεβού μέσα στη συνομιλία.

Το δικό σας website

Δικό σας πρόγραμμα κρατήσεων ή φόρμα στο site, που κλείνει μέσω του server σας στο ίδιο ημερολόγιο.

Άλλο λογισμικό

CRM, εσωτερικά εργαλεία ή αυτοματισμοί που χρειάζονται ωράριο, διαθεσιμότητα ή κλείσιμο ραντεβού.

Ο αριθμός τηλεφώνου είναι η ταυτότητα του πελάτη. Για να δείτε, να μεταφέρετε ή να ακυρώσετε ραντεβού, για συνδρομές, και για κάθε εγγραφή σε μάθημα ή λίστα αναμονής, ο αριθμός πρέπει να είναι επαληθευμένος από το κανάλι (αναγνώριση κλήσης, λογαριασμός μηνυμάτων ή δικός σας κωδικός SMS) — ποτέ αριθμός που απλώς πληκτρολόγησε ο επισκέπτης ενός site.
Όλες οι συνδέσεις τρέχουν σε server. Το κλειδί δεν μπαίνει ποτέ σε browser ή εφαρμογή — ένα website καλεί το API μέσω του δικού του server.

Τι κάνει και τι όχι

Τι κάνει

  • Στοιχεία επιχείρησης, ωράριο, υπηρεσίες και τιμές
  • Ελεύθερες ώρες για ατομικά ραντεβού
  • Κλείσιμο, μεταφορά και ακύρωση των δικών του ραντεβού του πελάτη
  • Μήνυμα προς την επιχείρηση· SMS με σύνδεσμο κράτησης

Τι σκόπιμα δεν κάνει

  • Ομαδικά μαθήματα, σειρές μαθημάτων και λίστες αναμονής
  • Πληρωμές ή επιστροφές χρημάτων (τα ραντεβού μέσω API πληρώνονται στην επιχείρηση ή με πακέτο που ήδη έχει ο πελάτης)
  • Πώληση πακέτων, κρατήσεις πολλών υπηρεσιών ή επαναλαμβανόμενες
  • Οτιδήποτε για άλλους πελάτες

Για ό,τι είναι εκτός πεδίου, η σύνδεση στέλνει στον πελάτη SMS με σύνδεσμο κράτησης ή αφήνει μήνυμα στην επιχείρηση.

Πρόσβαση

Η πρόσβαση δίνεται ανά επιχείρηση. Κάθε επιχείρηση στο Prebook εκδίδει ένα κλειδί ανά σύνδεση (π.χ. ένα για την τηλεφωνική γραμματεία, ένα για το chatbot), ώστε να μπορεί να ανακαλέσει μία χωρίς να επηρεάσει τις άλλες. Κάθε ραντεβού και μήνυμα δείχνει στην επιχείρηση από ποια σύνδεση ήρθε.

Πώς παίρνετε κλειδί

  1. Η επιχείρηση (σε πακέτο Pro ή Business) ανοίγει Ρυθμίσεις → Συνδέσεις & API και ενεργοποιεί τις συνδέσεις.
  2. Πατά «Δημιουργία κλειδιού» με ένα όνομα για τη σύνδεση (π.χ. «AI τηλεφωνική γραμματεία»). Το όνομα εμφανίζεται σε κάθε ραντεβού που φέρνει η σύνδεση.
  3. Το κλειδί εμφανίζεται μία φορά· η επιχείρηση το δίνει σε εσάς και εσείς το αποθηκεύετε στον server σας.
  4. Από την ίδια οθόνη η επιχείρηση ανακαλεί ένα κλειδί ή απενεργοποιεί όλες τις συνδέσεις με ένα κλικ.
Ένα κλειδί λειτουργεί μόνο όσο η επιχείρηση: είναι ενεργή στο Prebook, είναι σε πακέτο Pro ή Business (ή στον δωρεάν πρώτο μήνα, που έχει όλες τις λειτουργίες του Pro), και έχει ενεργές τις «Συνδέσεις API». Κάθε κλειδί βλέπει μόνο τη δική του επιχείρηση και μόνο τους δικούς της πελάτες.

Τα κλειδιά έχουν τη μορφή pbk_<keyId>_<secret>. Το Prebook αποθηκεύει μόνο ένα hash του μυστικού μέρους, οπότε ένα χαμένο κλειδί δεν μπορεί να εμφανιστεί ξανά — ανακαλείται και αντικαθίσταται.

Τα κλειδιά είναι διαπιστευτήρια server-to-server. Ποτέ σε browser, σε εφαρμογή κινητού ή μέσα σε URL.

Αυθεντικοποίηση & όρια

Στείλτε το κλειδί σε κάθε αίτημα, με έναν από τους δύο τρόπους:

Headers
Authorization: Bearer pbk_<keyId>_<secret>
# ή
x-agent-key: pbk_<keyId>_<secret>
  • Το κλειδί ορίζει την επιχείρηση. Τα αιτήματα δεν αναφέρουν ποτέ επιχείρηση· πεδίο που δεν υπάρχει στο schema του εργαλείου απορρίπτεται.
  • 120 αιτήματα το λεπτό ανά κλειδί, και ημερήσια όρια ανά κλειδί: 500 αναζητήσεις πελάτη (identifyCaller, listAppointments, getMySubscriptions, findClasses), 300 κρατήσεις/αλλαγές/ακυρώσεις/εγγραφές σε μαθήματα και λίστες αναμονής, 200 μηνύματα, 50 SMS. Πάνω από αυτά: 429 RATE_LIMITED. Χρειάζεστε περισσότερα; Γράψτε μας.
  • Κλειδί που λείπει, είναι λάθος ή έχει ανακληθεί: 401 UNAUTHORIZED. Επιχείρηση μη ενεργή στο Prebook: 403 SHOP_INACTIVE. Η επιχείρηση απενεργοποίησε τις συνδέσεις: 403 API_DISABLED. Η επιχείρηση δεν είναι πλέον σε Pro/Business: 403 PLAN_REQUIRED.
  • Κάθε κλήση καταγράφεται στο ιστορικό δραστηριότητας της επιχείρησης με το id του κλειδιού σας.

Συμβάσεις

  • Κάθε εργαλείο είναι POST https://management.prebook.gr/api/agent/v1/<tool> με JSON body. Το GET https://management.prebook.gr/api/agent/v1/tools επιστρέφει όλα τα schemas, και ως απλό REST και ως ορισμούς functions τύπου OpenAI.
  • Οι απαντήσεις είναι HTTP 200 με { "ok": true, … } ή { "ok": false, "code": …, "message": … }. Οι αρνήσεις είναι δεδομένα (οι πλατφόρμες AI δίνουν το body στο μοντέλο). Το message είναι στα ελληνικά και μπορεί να δοθεί αυτούσιο στον πελάτη.
  • Οι ημερομηνίες είναι YYYY-MM-DD και οι ώρες HH:mm, πάντα σε ώρα Ελλάδας (Europe/Athens). Κάθε ώρα και κάθε ραντεβού έχει επίσης ένα label, π.χ. «Τρίτη 06/10 στις 10:30», έτοιμο για τον πελάτη.
  • Το getShopInfo.today δίνει την τρέχουσα ημερομηνία και ημέρα στην Ελλάδα — χρησιμοποιήστε το για το «αύριο», «την Πέμπτη».
  • Ο πελάτης αναγνωρίζεται από το τηλέφωνό του, σε κάθε συνηθισμένη μορφή (69…, +3069…, 003069…, σταθερά). Σε τηλεφωνική κλήση, δώστε την αναγνώριση κλήσης.
  • Αριθμοί και booleans που στέλνονται ως strings γίνονται δεκτοί ("20" → 20).
Παράδειγμα
curl -X POST https://management.prebook.gr/api/agent/v1/findAvailability \
  -H "Authorization: Bearer pbk_xxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"serviceId": 629, "dateFrom": "2026-10-06", "partOfDay": "morning"}'

Προτεινόμενη ροή

Ίδια για φωνή και chat· ένα website συνήθως χρειάζεται μόνο τα βήματα 3–5.

  1. Καλέστε getShopInfo και identifyCaller (σε τηλεφωνική κλήση, με την αναγνώριση κλήσης και αφού ενημερώσετε ότι η κλήση καταγράφεται).
  2. Απαντήστε σε ερωτήσεις από το getShopInfo (διεύθυνση, ωράριο, callerInfo) και το listServices (τιμές, διάρκειες, τι να φέρει).
  3. Για ραντεβού: findAvailability για την υπηρεσία και πρόταση 2–3 από τις ώρες που επέστρεψε — ποτέ ώρα που δεν επέστρεψε.
  4. Επιβεβαιώστε με τον πελάτη υπηρεσία, ημέρα, ώρα και όνομα. Με καθαρό «ναι», καλέστε bookAppointment.
  5. Δείξτε ή πείτε το αποτέλεσμα. Αν το status είναι pending, πείτε ότι θα το επιβεβαιώσει η επιχείρηση.
  6. Για αλλαγή ραντεβού: επιλέξτε το από το identifyCaller.upcoming και μετά rescheduleAppointment ή cancelAppointment (οι εκπρόθεσμες ακυρώσεις θέλουν ρητό «ναι»).
  7. Οτιδήποτε άλλο, ή όταν ο πελάτης ζητά άνθρωπο: takeMessage. Για ό,τι γίνεται μόνο online: sendBookingLink.

Endpoints

POSTgetShopInfo/api/agent/v1/getShopInfo

Ό,τι μπορεί να ρωτήσει ένας πελάτης για την επιχείρηση.

Μία φορά, στην αρχή κάθε συνομιλίας. Το `today` λύνει το «αύριο», «την Τρίτη».

Χωρίς πεδία — στείλτε {}.

Απάντηση
{
  "ok": true,
  "name": "Podia Demo",
  "type": "Ποδολογικό Κέντρο",
  "address": "Οδός Παραδείγματος 1",
  "area": "Αμπελόκηποι, Θεσσαλονίκη",
  "phone": "2310000000",
  "bookingLink": "https://www.prebook.gr/podia-demo",
  "today": {
    "date": "2026-10-05",
    "weekday": "Δευτέρα",
    "time": "09:12",
    "timezone": "Europe/Athens"
  },
  "openingHoursNext7Days": [
    {
      "date": "2026-10-05",
      "weekday": "Δευτέρα",
      "open": true,
      "hours": [
        {
          "from": "10:30",
          "to": "20:00"
        }
      ],
      "closedReason": null
    }
  ],
  "upcomingClosures": [
    {
      "from": "2026-12-24",
      "to": "2026-12-27",
      "note": "Χριστούγεννα"
    }
  ],
  "payments": {
    "inPerson": true,
    "online": false
  },
  "bookingPolicy": {
    "bookingsOpen": true,
    "needsShopConfirmation": true,
    "newClientsNeedApproval": false,
    "maxDaysAhead": 60,
    "maxBookingsPerDay": 2
  },
  "callerInfo": "Πάρκινγκ στον διπλανό δρόμο. Δεχόμαστε ΕΟΠΥΥ με παραπεμπτικό.",
  "packages": [
    {
      "id": 12,
      "name": "Πακέτο 5 θεραπειών",
      "category": null,
      "description": null,
      "offer": null,
      "price": 150,
      "sessions": 5,
      "sessionsNote": null,
      "validity": "90 ημέρες",
      "covers": [
        "Θεραπευτικό Πεντικιούρ"
      ],
      "autoRenew": false,
      "buyOnline": true,
      "payAtShop": true
    }
  ]
}
POSTgetOpeningHours/api/agent/v1/getOpeningHours

Ωράριο ανά ημέρα, για όλη την επιχείρηση ή για ένα μέλος του προσωπικού.

«Είστε ανοιχτά 15 Αυγούστου;», «Δουλεύει η γιατρός την Πέμπτη;». Δεν είναι το ίδιο με τις ελεύθερες ώρες.

ΠεδίοΤύποςΠεριγραφή
dateFromυποχρεωτικόYYYY-MM-DDΠρώτη ημέρα.
dateToYYYY-MM-DDΤελευταία ημέρα (προεπιλογή: dateFrom, έως 31 ημέρες).
employeeIdintegerΜόνο αυτό το μέλος του προσωπικού (αφαιρούνται οι άδειές του).
Body αιτήματος
{
  "dateFrom": "2026-08-14",
  "dateTo": "2026-08-16"
}
Απάντηση
{
  "ok": true,
  "employeeId": null,
  "days": [
    {
      "date": "2026-08-14",
      "weekday": "Παρασκευή",
      "open": true,
      "hours": [
        {
          "from": "10:30",
          "to": "18:00"
        }
      ],
      "closedReason": null
    },
    {
      "date": "2026-08-15",
      "weekday": "Σάββατο",
      "open": false,
      "hours": [],
      "closedReason": "Δεκαπενταύγουστος"
    }
  ]
}
Πιθανοί κωδικοί:INVALID_DATERANGE_TOO_LONGNOT_FOUND
POSTlistServices/api/agent/v1/listServices

Οι υπηρεσίες που κλείνονται, με όσα χρειάζεστε για να τις περιγράψετε στον πελάτη.

Πριν από την αναζήτηση διαθεσιμότητας· για ερωτήσεις τιμής και διάρκειας.

Χωρίς πεδία — στείλτε {}.

Απάντηση
{
  "ok": true,
  "services": [
    {
      "id": 629,
      "name": "Θεραπευτικό Πεντικιούρ",
      "category": null,
      "description": "Πλήρης περιποίηση άκρου ποδός",
      "registrationInstructions": null,
      "durationMinutes": 60,
      "allowedDurations": null,
      "price": 35,
      "priceLabel": null,
      "staff": [
        {
          "id": 290,
          "name": "Ελένη Γεωργίου"
        }
      ],
      "phoneBookable": true,
      "reason": null,
      "requiresPackage": false,
      "freeFirstBooking": false,
      "bookingCutoffHours": null,
      "cancellationPolicy": {
        "noticeMinutes": 1440,
        "mode": "warn",
        "message": null
      }
    }
  ]
}
POSTfindAvailability/api/agent/v1/findAvailability

Ελεύθερες ώρες για μια υπηρεσία — οι μόνες ώρες που επιτρέπεται να προτείνετε.

Όποτε ο πελάτης ζητά ώρα. Προτείνετε 2–3 από τις ώρες που επιστράφηκαν κάθε φορά. Τα slots είναι δείγμα· όλες οι ελεύθερες ώρες κάθε ημέρας είναι στο freeTimes. Αν ο πελάτης πει συγκεκριμένη ώρα, στείλτε τη στο time: το requested.available λέει αν είναι ελεύθερη.

ΠεδίοΤύποςΠεριγραφή
serviceIdυποχρεωτικόintegerΑπό το listServices.
dateFromYYYY-MM-DDΠροεπιλογή: σήμερα.
dateToYYYY-MM-DDΠροεπιλογή: dateFrom + 6 ημέρες, έως 14 ημέρες.
employeeIdintegerΜόνο αυτό το μέλος του προσωπικού.
partOfDaymorning | afternoon | eveningΠρωί < 12:00 ≤ μεσημέρι < 17:00 ≤ απόγευμα/βράδυ.
durationMinutesintegerΜόνο για υπηρεσίες με ρυθμιζόμενη διάρκεια· μία από τις allowedDurations.
timeHH:mmΗ ώρα που ζήτησε ο πελάτης. Η απάντηση λέει αν είναι ελεύθερη (requested) και τα slots γίνονται οι πιο κοντινές ελεύθερες ώρες.
limitinteger1–20, προεπιλογή 6. Οι ώρες μοιράζονται σε ημέρες και μέσα στην ημέρα (ή γύρω από το time).
Body αιτήματος
{
  "serviceId": 629,
  "dateFrom": "2026-10-06",
  "dateTo": "2026-10-07",
  "time": "11:00"
}
Απάντηση
{
  "ok": true,
  "service": {
    "id": 629,
    "name": "Θεραπευτικό Πεντικιούρ",
    "durationMinutes": 60
  },
  "range": {
    "from": "2026-10-06",
    "to": "2026-10-07"
  },
  "totalFound": 9,
  "slots": [
    {
      "date": "2026-10-06",
      "time": "10:30",
      "employeeId": 290,
      "employeeName": "Ελένη Γεωργίου",
      "label": "Τρίτη 06/10 στις 10:30"
    },
    {
      "date": "2026-10-07",
      "time": "11:00",
      "employeeId": 290,
      "employeeName": "Ελένη Γεωργίου",
      "label": "Τετάρτη 07/10 στις 11:00"
    }
  ],
  "freeTimes": [
    {
      "date": "2026-10-06",
      "day": "Τρίτη 06/10",
      "times": "09:00–10:30 κάθε 30′, 14:00"
    },
    {
      "date": "2026-10-07",
      "day": "Τετάρτη 07/10",
      "times": "10:00–11:30 κάθε 30′"
    }
  ],
  "nextAvailable": null,
  "requested": {
    "time": "11:00",
    "available": true,
    "freeOn": [
      {
        "date": "2026-10-07",
        "time": "11:00",
        "employeeId": 290,
        "employeeName": "Ελένη Γεωργίου",
        "label": "Τετάρτη 07/10 στις 11:00"
      }
    ]
  }
}
Πιθανοί κωδικοί:NOT_FOUNDNOT_PHONE_BOOKABLEBOOKINGS_DISABLEDOUTSIDE_BOOKING_WINDOWINVALID_DATEINVALID_DURATION
POSTidentifyCaller/api/agent/v1/identifyCaller

Γνωρίζει η επιχείρηση αυτόν τον αριθμό; Μικρά ονόματα και τα δικά του επερχόμενα ραντεβού.

Νωρίς στη συνομιλία (σε κλήση, με την αναγνώριση κλήσης) — για να χαιρετήσετε τον πελάτη και να βρει το ραντεβού που θέλει να αλλάξει.

ΠεδίοΤύποςΠεριγραφή
phoneυποχρεωτικόstringΤο τηλέφωνο του πελάτη σε οποιαδήποτε συνηθισμένη μορφή (69…, +3069…, 003069…, σταθερά). Για αναζήτηση, μεταφορά, ακύρωση ή σημείωση σε ραντεβού πρέπει να είναι ΕΠΑΛΗΘΕΥΜΕΝΟΣ αριθμός (αναγνώριση κλήσης, λογαριασμός μηνυμάτων ή δικό σας SMS code) — ποτέ αριθμός που είπε ή έγραψε ο πελάτης.
Body αιτήματος
{
  "phone": "+30 694 123 4567"
}
Απάντηση
{
  "ok": true,
  "known": true,
  "firstNames": [
    "Μαρία"
  ],
  "upcoming": [
    {
      "appointmentId": 31510,
      "kind": "appointment",
      "service": "Θεραπευτικό Πεντικιούρ",
      "staff": "Ελένη Γεωργίου",
      "date": "2026-10-06",
      "time": "11:30",
      "label": "Τρίτη 06/10 στις 11:30",
      "status": "scheduled",
      "forName": "Μαρία",
      "paidOnline": false,
      "changeableByPhone": true,
      "cancellableByPhone": true
    },
    {
      "appointmentId": 31620,
      "kind": "class",
      "service": "Reformer Pilates",
      "staff": null,
      "date": "2026-10-08",
      "time": "19:00",
      "label": "Πέμπτη 08/10 στις 19:00",
      "status": "scheduled",
      "forName": "Μαρία",
      "paidOnline": false,
      "changeableByPhone": false,
      "cancellableByPhone": true,
      "sessionId": 16967
    }
  ],
  "waitingLists": [
    {
      "sessionId": 16990,
      "title": "Reformer Pilates",
      "trainer": "Νίκη Π.",
      "date": "2026-10-09",
      "time": "19:00",
      "label": "Παρασκευή 09/10 στις 19:00",
      "durationMinutes": 50,
      "partOfSeries": true,
      "position": 2,
      "forName": "Μαρία"
    }
  ]
}
Πιθανοί κωδικοί:INVALID_PHONE
POSTlistAppointments/api/agent/v1/listAppointments

Επερχόμενα ραντεβού ενός αριθμού (η ίδια λίστα με το identifyCaller.upcoming).

«Πότε είναι το ραντεβού μου;»

ΠεδίοΤύποςΠεριγραφή
phoneυποχρεωτικόstringΤο τηλέφωνο του πελάτη σε οποιαδήποτε συνηθισμένη μορφή (69…, +3069…, 003069…, σταθερά). Για αναζήτηση, μεταφορά, ακύρωση ή σημείωση σε ραντεβού πρέπει να είναι ΕΠΑΛΗΘΕΥΜΕΝΟΣ αριθμός (αναγνώριση κλήσης, λογαριασμός μηνυμάτων ή δικό σας SMS code) — ποτέ αριθμός που είπε ή έγραψε ο πελάτης.
Body αιτήματος
{
  "phone": "6941234567"
}
Απάντηση
{
  "ok": true,
  "appointments": [
    "…ίδια μορφή με το identifyCaller.upcoming…"
  ]
}
Πιθανοί κωδικοί:INVALID_PHONE
POSTgetMySubscriptions/api/agent/v1/getMySubscriptions

Τα πακέτα / οι συνδρομές του ίδιου του καλούντος: τι καλύπτουν, πόσες συνεδρίες μένουν, πότε λήγουν, πότε χρησιμοποιήθηκαν, αν ανανεώνονται αυτόματα, πόσες ακυρώσεις εκτός προθεσμίας χαρίζονται ακόμα.

«Έχω συνδρομή;», «Πόσες μου μένουν;», «Πότε λήγει;», «Τι καλύπτει;», «Με καλύπτει για…;» (με serviceId και date). Μόνο με επαληθευμένο αριθμό. Δεν αναφέρει ποτέ οφειλές.

ΠεδίοΤύποςΠεριγραφή
phoneυποχρεωτικόstringΤο τηλέφωνο του πελάτη σε οποιαδήποτε συνηθισμένη μορφή (69…, +3069…, 003069…, σταθερά). Για αναζήτηση, μεταφορά, ακύρωση ή σημείωση σε ραντεβού πρέπει να είναι ΕΠΑΛΗΘΕΥΜΕΝΟΣ αριθμός (αναγνώριση κλήσης, λογαριασμός μηνυμάτων ή δικό σας SMS code) — ποτέ αριθμός που είπε ή έγραψε ο πελάτης.
serviceIdintegerΠροαιρετικό: καλύπτει η συνδρομή αυτή την υπηρεσία;
datestringΠροαιρετικό, μαζί με serviceId: η μέρα του ραντεβού (YYYY-MM-DD, προεπιλογή σήμερα).
Body αιτήματος
{
  "phone": "6941234567",
  "serviceId": 629,
  "date": "2026-10-13"
}
Απάντηση
{
  "ok": true,
  "known": true,
  "firstNames": [
    "Μαρία"
  ],
  "subscriptions": [
    {
      "forName": "Μαρία",
      "name": "8 συνεδρίες",
      "state": "active",
      "covers": [
        "Θεραπευτικό Πεντικιούρ"
      ],
      "startDate": "2026-10-01",
      "endDate": "2026-10-31",
      "makeUpUntil": "2026-11-07",
      "sessions": {
        "total": 8,
        "attended": 4,
        "bookedAhead": 1,
        "remaining": 3
      },
      "sessionsMode": "fixed",
      "autoRenew": true,
      "renewsOn": "2026-11-01",
      "cancellations": {
        "lateFreePerPeriod": 2,
        "period": "month",
        "usedThisPeriod": 1,
        "remainingThisPeriod": 1
      },
      "usedOn": [
        {
          "date": "2026-10-02",
          "time": "10:00",
          "label": "Παρασκευή 02/10 στις 10:00",
          "service": "Θεραπευτικό Πεντικιούρ"
        }
      ],
      "lostOn": [],
      "upcomingOnIt": [
        {
          "date": "2026-10-07",
          "time": "10:00",
          "label": "Τετάρτη 07/10 στις 10:00",
          "service": "Θεραπευτικό Πεντικιούρ"
        }
      ]
    }
  ],
  "coverage": {
    "service": "Θεραπευτικό Πεντικιούρ",
    "date": "2026-10-13",
    "people": [
      {
        "forName": "Μαρία",
        "covered": true,
        "subscriptionName": "8 συνεδρίες"
      }
    ]
  },
  "message": null
}
Πιθανοί κωδικοί:INVALID_PHONENOT_FOUNDINVALID_DATE
POSTfindClasses/api/agent/v1/findClasses

Οι ημερομηνίες μαθημάτων / ομαδικών που μπορεί να κλείσει ο ίδιος ο πελάτης, όπως τις βλέπει στο δικό του ημερολόγιο (χωρίς κλειδωμένες ή άλλου επιπέδου).

«Έχετε θέση στο pilates την Πέμπτη;» Με επαληθευμένο αριθμό. Έως 14 ημέρες ανά αναζήτηση.

ΠεδίοΤύποςΠεριγραφή
phoneυποχρεωτικόstringΤο τηλέφωνο του πελάτη σε οποιαδήποτε συνηθισμένη μορφή (69…, +3069…, 003069…, σταθερά). Για αναζήτηση, μεταφορά, ακύρωση ή σημείωση σε ραντεβού πρέπει να είναι ΕΠΑΛΗΘΕΥΜΕΝΟΣ αριθμός (αναγνώριση κλήσης, λογαριασμός μηνυμάτων ή δικό σας SMS code) — ποτέ αριθμός που είπε ή έγραψε ο πελάτης.
namestringΜικρό όνομα, όταν ο αριθμός έχει πολλά ονόματα (needsName).
serviceIdintegerΜόνο αυτό το μάθημα (kind: class στο listServices).
dateFromstringYYYY-MM-DD (προεπιλογή σήμερα).
dateTostringYYYY-MM-DD (προεπιλογή +6 ημέρες, έως 14).
partOfDaystringmorning | afternoon | evening
Body αιτήματος
{
  "phone": "6941234567",
  "serviceId": 1033,
  "dateFrom": "2026-10-08",
  "dateTo": "2026-10-09"
}
Απάντηση
{
  "ok": true,
  "range": {
    "from": "2026-10-08",
    "to": "2026-10-09"
  },
  "classes": [
    {
      "sessionId": 16967,
      "title": "Reformer Pilates",
      "service": "Reformer Pilates",
      "trainer": "Νίκη Π.",
      "date": "2026-10-08",
      "time": "19:00",
      "label": "Πέμπτη 08/10 στις 19:00",
      "durationMinutes": 50,
      "partOfSeries": true,
      "spotsLeft": 2,
      "full": false,
      "canJoin": true,
      "canJoinWaitingList": false,
      "onWaitingList": null,
      "enrolled": false,
      "needsShopApproval": false,
      "reason": null,
      "reasonMessage": null
    },
    {
      "sessionId": 16990,
      "title": "Reformer Pilates",
      "service": "Reformer Pilates",
      "trainer": "Νίκη Π.",
      "date": "2026-10-09",
      "time": "19:00",
      "label": "Παρασκευή 09/10 στις 19:00",
      "durationMinutes": 50,
      "partOfSeries": true,
      "spotsLeft": 0,
      "full": true,
      "canJoin": false,
      "canJoinWaitingList": true,
      "onWaitingList": null,
      "enrolled": false,
      "needsShopApproval": false,
      "reason": "full",
      "reasonMessage": null
    }
  ],
  "truncated": false,
  "message": null
}
Πιθανοί κωδικοί:INVALID_PHONEINVALID_DATERANGE_TOO_LONGNOT_FOUND
POSTenrollInClass/api/agent/v1/enrollInClass

Γράφει τον πελάτη σε ΜΙΑ ημερομηνία μαθήματος — ποτέ σε όλη τη σειρά. Ίδιοι κανόνες με την εφαρμογή (θέσεις, επίπεδα, προθεσμίες, πακέτα, ίδια ώρα, έγκριση).

Μόνο για sessionId με canJoin από το findClasses, αφού επιβεβαιώσετε μάθημα, ημέρα, ώρα και όνομα. Ασφαλές να ξανασταλεί: η ίδια εγγραφή επιστρέφεται με alreadyEnrolled. SESSION_FULL → joinWaitingList.

ΠεδίοΤύποςΠεριγραφή
sessionIdυποχρεωτικόintegerΑπό το findClasses.
nameυποχρεωτικόstringΜικρό όνομα.
surnamestringΕπώνυμο.
phoneυποχρεωτικόstringΤο τηλέφωνο του πελάτη σε οποιαδήποτε συνηθισμένη μορφή (69…, +3069…, 003069…, σταθερά). Για αναζήτηση, μεταφορά, ακύρωση ή σημείωση σε ραντεβού πρέπει να είναι ΕΠΑΛΗΘΕΥΜΕΝΟΣ αριθμός (αναγνώριση κλήσης, λογαριασμός μηνυμάτων ή δικό σας SMS code) — ποτέ αριθμός που είπε ή έγραψε ο πελάτης.
commentstringΣύντομη σημείωση για την επιχείρηση.
Body αιτήματος
{
  "sessionId": 16967,
  "name": "Μαρία",
  "surname": "Παπαδοπούλου",
  "phone": "6941234567"
}
Απάντηση
{
  "ok": true,
  "sessionId": 16967,
  "title": "Reformer Pilates",
  "label": "Πέμπτη 08/10 στις 19:00",
  "appointmentId": 31620,
  "status": "scheduled",
  "payment": "subscription",
  "newClient": false,
  "canTextLink": true,
  "message": "Η εγγραφή στη συνεδρία ολοκληρώθηκε."
}
Πιθανοί κωδικοί:NOT_FOUNDSESSION_FULLALREADY_ENROLLEDSAME_TIMEINSIDE_CUTOFFNOT_ALLOWEDMEMBERSHIP_REQUIREDSUBSCRIPTION_REQUIREDNOT_PHONE_BOOKABLEBANNED
POSTjoinWaitingList/api/agent/v1/joinWaitingList

Βάζει τον πελάτη στη λίστα αναμονής μιας ΠΛΗΡΟΥΣ ημερομηνίας μαθήματος.

Όταν το findClasses δίνει canJoinWaitingList. Όποιος δεν έχει εφαρμογή ούτε email ειδοποιείται με SMS όταν ελευθερωθεί θέση.

ΠεδίοΤύποςΠεριγραφή
sessionIdυποχρεωτικόintegerΑπό το findClasses.
nameυποχρεωτικόstringΜικρό όνομα.
surnamestringΕπώνυμο.
phoneυποχρεωτικόstringΤο τηλέφωνο του πελάτη σε οποιαδήποτε συνηθισμένη μορφή (69…, +3069…, 003069…, σταθερά). Για αναζήτηση, μεταφορά, ακύρωση ή σημείωση σε ραντεβού πρέπει να είναι ΕΠΑΛΗΘΕΥΜΕΝΟΣ αριθμός (αναγνώριση κλήσης, λογαριασμός μηνυμάτων ή δικό σας SMS code) — ποτέ αριθμός που είπε ή έγραψε ο πελάτης.
Body αιτήματος
{
  "sessionId": 16990,
  "name": "Μαρία",
  "phone": "6941234567"
}
Απάντηση
{
  "ok": true,
  "sessionId": 16990,
  "title": "Reformer Pilates",
  "label": "Παρασκευή 09/10 στις 19:00",
  "queuePosition": 2,
  "alreadyOnList": false,
  "message": "Μπήκατε στη λίστα αναμονής (θέση 2). Θα ειδοποιηθείτε αν ελευθερωθεί θέση."
}
Πιθανοί κωδικοί:NOT_FOUNDNOT_FULLALREADY_ENROLLEDNOT_ALLOWEDMEMBERSHIP_REQUIREDSUBSCRIPTION_REQUIREDNOT_PHONE_BOOKABLE
POSTleaveWaitingList/api/agent/v1/leaveWaitingList

Βγάζει τον πελάτη από τη λίστα αναμονής μιας ημερομηνίας μαθήματος.

«Δεν χρειάζεται πια, βγάλτε με από την αναμονή.» (identifyCaller.waitingLists)

ΠεδίοΤύποςΠεριγραφή
sessionIdυποχρεωτικόintegerΑπό το identifyCaller.waitingLists.
phoneυποχρεωτικόstringΤο τηλέφωνο του πελάτη σε οποιαδήποτε συνηθισμένη μορφή (69…, +3069…, 003069…, σταθερά). Για αναζήτηση, μεταφορά, ακύρωση ή σημείωση σε ραντεβού πρέπει να είναι ΕΠΑΛΗΘΕΥΜΕΝΟΣ αριθμός (αναγνώριση κλήσης, λογαριασμός μηνυμάτων ή δικό σας SMS code) — ποτέ αριθμός που είπε ή έγραψε ο πελάτης.
Body αιτήματος
{
  "sessionId": 16990,
  "phone": "6941234567"
}
Απάντηση
{
  "ok": true,
  "sessionId": 16990,
  "title": "Reformer Pilates",
  "label": "Παρασκευή 09/10 στις 19:00",
  "removed": 1,
  "message": "Αφαιρεθήκατε από τη λίστα αναμονής."
}
Πιθανοί κωδικοί:NOT_FOUND
POSTbookAppointment/api/agent/v1/bookAppointment

Κλείνει μια ώρα που επέστρεψε το findAvailability.

Μόνο αφού επιβεβαιώσετε με τον πελάτη υπηρεσία, ημέρα, ώρα και όνομα και πάρετε καθαρό «ναι». Μπορείτε να το ξαναστείλετε με ασφάλεια: αν η ίδια κράτηση υπάρχει ήδη (π.χ. ο agent διέκοψε και επανέλαβε την κλήση), επιστρέφεται με alreadyBooked: true αντί για SLOT_TAKEN.

ΠεδίοΤύποςΠεριγραφή
serviceIdυποχρεωτικόintegerΑπό το listServices.
dateυποχρεωτικόYYYY-MM-DDΑπό την ώρα που επιλέχθηκε.
timeυποχρεωτικόHH:mmΑπό την ώρα που επιλέχθηκε.
employeeIdintegerΑπό την ώρα που επιλέχθηκε.
durationMinutesintegerΜόνο για υπηρεσίες με ρυθμιζόμενη διάρκεια.
nameυποχρεωτικόstringΜικρό όνομα του πελάτη.
surnamestringΕπώνυμο του πελάτη.
phoneυποχρεωτικόstringΤο τηλέφωνο του πελάτη σε οποιαδήποτε συνηθισμένη μορφή (69…, +3069…, 003069…, σταθερά). Για αναζήτηση, μεταφορά, ακύρωση ή σημείωση σε ραντεβού πρέπει να είναι ΕΠΑΛΗΘΕΥΜΕΝΟΣ αριθμός (αναγνώριση κλήσης, λογαριασμός μηνυμάτων ή δικό σας SMS code) — ποτέ αριθμός που είπε ή έγραψε ο πελάτης.
commentstringΣύντομη σημείωση για την επιχείρηση (≤300 χαρακτήρες). Όχι ιατρικές λεπτομέρειες πέρα από όσα πει ο ίδιος ο πελάτης.
Body αιτήματος
{
  "serviceId": 629,
  "date": "2026-10-06",
  "time": "10:30",
  "employeeId": 290,
  "name": "Μαρία",
  "surname": "Παπαδοπούλου",
  "phone": "+306941234567"
}
Απάντηση
{
  "ok": true,
  "appointmentId": 31512,
  "status": "pending",
  "service": "Θεραπευτικό Πεντικιούρ",
  "staff": "Ελένη Γεωργίου",
  "date": "2026-10-06",
  "time": "10:30",
  "label": "Τρίτη 06/10 στις 10:30",
  "durationMinutes": 60,
  "payment": "in_person",
  "price": 35,
  "priceLabel": null,
  "smsExpected": false,
  "newClient": true,
  "canTextLink": true,
  "message": "Το αίτημα καταχωρήθηκε· το κατάστημα θα το επιβεβαιώσει."
}
Πιθανοί κωδικοί:SLOT_TAKENOUTSIDE_BOOKING_WINDOWINSIDE_CUTOFFDAILY_LIMITBANNEDMEMBERSHIP_REQUIREDSUBSCRIPTION_REQUIREDNOT_PHONE_BOOKABLEBOOKINGS_DISABLEDINVALID_DURATIONNOT_FOUND
POSTrescheduleAppointment/api/agent/v1/rescheduleAppointment

Μεταφέρει ένα από τα δικά του επερχόμενα ραντεβού του πελάτη σε άλλη ελεύθερη ώρα.

Αφού επιβεβαιώσετε τη νέα ημέρα και ώρα. Κρατά το ίδιο μέλος του προσωπικού, εκτός αν δοθεί employeeId.

ΠεδίοΤύποςΠεριγραφή
appointmentIdυποχρεωτικόintegerΑπό το identifyCaller / listAppointments.
phoneυποχρεωτικόstringΤο τηλέφωνο του πελάτη σε οποιαδήποτε συνηθισμένη μορφή (69…, +3069…, 003069…, σταθερά). Για αναζήτηση, μεταφορά, ακύρωση ή σημείωση σε ραντεβού πρέπει να είναι ΕΠΑΛΗΘΕΥΜΕΝΟΣ αριθμός (αναγνώριση κλήσης, λογαριασμός μηνυμάτων ή δικό σας SMS code) — ποτέ αριθμός που είπε ή έγραψε ο πελάτης.
dateυποχρεωτικόYYYY-MM-DDΝέα ημέρα.
timeυποχρεωτικόHH:mmΝέα ώρα.
employeeIdintegerΜεταφορά σε αυτό το μέλος του προσωπικού.
Body αιτήματος
{
  "appointmentId": 31510,
  "phone": "6941234567",
  "date": "2026-10-07",
  "time": "12:00"
}
Απάντηση
{
  "ok": true,
  "appointmentId": 31510,
  "status": "scheduled",
  "label": "Τετάρτη 07/10 στις 12:00",
  "message": "Το ραντεβού μεταφέρθηκε."
}
Πιθανοί κωδικοί:NOT_FOUNDSLOT_TAKENOUTSIDE_BOOKING_WINDOWINSIDE_CUTOFFNOT_PHONE_BOOKABLE
POSTcancelAppointment/api/agent/v1/cancelAppointment

Ακυρώνει ένα από τα δικά του επερχόμενα ραντεβού του πελάτη — ή ΜΙΑ ημερομηνία μαθήματος (ποτέ όλη τη σειρά).

Αφού επιβεβαιώσετε ποιο ραντεβού. Για μάθημα ισχύουν οι ίδιοι κανόνες ακύρωσης με την εφαρμογή και η λίστα αναμονής προχωρά. Σε CONFIRMATION_REQUIRED, διαβάστε την πολιτική και καλέστε ξανά με confirmLateCancel μόνο μετά από ρητό «ναι».

ΠεδίοΤύποςΠεριγραφή
appointmentIdυποχρεωτικόintegerΑπό το identifyCaller / listAppointments.
phoneυποχρεωτικόstringΤο τηλέφωνο του πελάτη σε οποιαδήποτε συνηθισμένη μορφή (69…, +3069…, 003069…, σταθερά). Για αναζήτηση, μεταφορά, ακύρωση ή σημείωση σε ραντεβού πρέπει να είναι ΕΠΑΛΗΘΕΥΜΕΝΟΣ αριθμός (αναγνώριση κλήσης, λογαριασμός μηνυμάτων ή δικό σας SMS code) — ποτέ αριθμός που είπε ή έγραψε ο πελάτης.
confirmLateCancelbooleanΟ πελάτης αποδέχτηκε την πολιτική εκπρόθεσμης ακύρωσης.
Body αιτήματος
{
  "appointmentId": 31511,
  "phone": "6941234567"
}
Απάντηση
{
  "ok": false,
  "code": "CONFIRMATION_REQUIRED",
  "message": "Η ακύρωση γίνεται λιγότερο από 24 ώρες πριν το ραντεβού και μπορεί να χρεωθεί. Θέλετε σίγουρα να ακυρωθεί;",
  "noticeMinutes": 1440,
  "mode": "forfeit"
}
Πιθανοί κωδικοί:NOT_FOUNDCONFIRMATION_REQUIREDCANCELLATION_NOT_ALLOWEDHANDOFF_REQUIREDNOT_PHONE_BOOKABLE
POSTupdateBookingDetails/api/agent/v1/updateBookingDetails

Προσθέτει σημείωση σε ένα από τα δικά του επερχόμενα ραντεβού του πελάτη, ή καταχωρεί το επώνυμό του αν η επιχείρηση δεν το έχει.

Όταν ο πελάτης προσθέσει κάτι μετά την κράτηση («ανδρικό φιλέ», «θα φέρω τη ρακέτα μου», «το επώνυμό μου είναι…»). Η σημείωση προστίθεται κάτω από όσα υπάρχουν — δεν αντικαθιστά τίποτα — και η επιχείρηση ειδοποιείται. Όνομα ή επώνυμο που ήδη υπάρχει δεν αλλάζει ποτέ (surnameSaved: false με surnameReason already_set / account_holder)· για διορθώσεις χρησιμοποιήστε takeMessage.

ΠεδίοΤύποςΠεριγραφή
appointmentIdυποχρεωτικόintegerΑπό το bookAppointment, το identifyCaller ή το listAppointments.
phoneυποχρεωτικόstringΤο τηλέφωνο του πελάτη σε οποιαδήποτε συνηθισμένη μορφή (69…, +3069…, 003069…, σταθερά). Για αναζήτηση, μεταφορά, ακύρωση ή σημείωση σε ραντεβού πρέπει να είναι ΕΠΑΛΗΘΕΥΜΕΝΟΣ αριθμός (αναγνώριση κλήσης, λογαριασμός μηνυμάτων ή δικό σας SMS code) — ποτέ αριθμός που είπε ή έγραψε ο πελάτης.
notestringΤι να προστεθεί για την επιχείρηση (≤300 χαρακτήρες).
surnamestringΕπώνυμο του πελάτη — καταχωρείται μόνο αν λείπει.
Body αιτήματος
{
  "appointmentId": 31511,
  "phone": "6941234567",
  "note": "Ανδρικό φιλέ",
  "surname": "Παπαδόπουλος"
}
Απάντηση
{
  "ok": true,
  "appointmentId": 31511,
  "label": "Τρίτη 06/10 στις 10:00",
  "noteAdded": true,
  "surnameSaved": true,
  "message": "Η σημείωση προστέθηκε στο ραντεβού. Το επώνυμο καταχωρήθηκε."
}
Πιθανοί κωδικοί:NOT_FOUNDNOT_PHONE_BOOKABLENOTHING_TO_UPDATENOTE_TOO_LONG
POSTtakeMessage/api/agent/v1/takeMessage

Αφήνει μήνυμα στην επιχείρηση για να καλέσει πίσω.

Για ό,τι δεν μπορεί να κάνει ή να απαντήσει η σύνδεσή σας, και όποτε ο πελάτης ζητά άνθρωπο.

ΠεδίοΤύποςΠεριγραφή
nameυποχρεωτικόstringΌνομα του πελάτη.
phoneυποχρεωτικόstringΤο τηλέφωνο του πελάτη σε οποιαδήποτε συνηθισμένη μορφή (69…, +3069…, 003069…, σταθερά). Για αναζήτηση, μεταφορά, ακύρωση ή σημείωση σε ραντεβού πρέπει να είναι ΕΠΑΛΗΘΕΥΜΕΝΟΣ αριθμός (αναγνώριση κλήσης, λογαριασμός μηνυμάτων ή δικό σας SMS code) — ποτέ αριθμός που είπε ή έγραψε ο πελάτης.
reasonυποχρεωτικόstringΓια ποιο θέμα (≤1000 χαρακτήρες).
urgentbooleanΣημειώνεται ως επείγον για το προσωπικό.
Body αιτήματος
{
  "name": "Νίκος",
  "phone": "2109999999",
  "reason": "Θέλει να μιλήσει με τη γιατρό για τα αποτελέσματα",
  "urgent": false
}
Απάντηση
{
  "ok": true,
  "messageId": 88,
  "message": "Το μήνυμα καταγράφηκε· το κατάστημα θα σας καλέσει."
}

Κανόνες & έλεγχοι κράτησης

Η σύνδεσή σας κλείνει ως πελάτης: το Prebook εφαρμόζει κάθε κανόνα που έχει ορίσει η επιχείρηση, με αυτή τη σειρά, και απαντά με κωδικό όταν κάποιος αποτύχει. Δεν χρειάζεται να υλοποιήσετε κανέναν — αλλά η σύνδεσή σας πρέπει να ξέρει τι σημαίνει κάθε απάντηση.

ΈλεγχοςΡύθμιση επιχείρησης / υπηρεσίαςΑπάντηση APIΤι κάνει η σύνδεσή σας
Κρατήσεις κλειστέςΕπιχείρηση: «Κρατήσεις» απενεργοποιημένεςBOOKINGS_DISABLEDΟι κρατήσεις είναι κλειστές — προτείνετε takeMessage.
Η υπηρεσία κλείνεται τηλεφωνικάΑτομική υπηρεσία ημερολογίου, δημόσια, όχι αρχειοθετημένη, όχι πολυήμερηNOT_FOUND / NOT_PHONE_BOOKABLE + reasonΠροτείνετε sendBookingLink.
Το προσωπικό κάνει την υπηρεσίαΣύνδεση προσωπικού ↔ υπηρεσίας, ενεργό στο ημερολόγιοNOT_FOUNDΠροτείνετε άλλο μέλος του προσωπικού ή οποιονδήποτε.
Πόσο μπροστάΕπιχείρηση: μέγιστες ημέρες κράτησης μπροστάOUTSIDE_BOOKING_WINDOWΟι κρατήσεις ανοίγουν έως Ν ημέρες μπροστά.
Προθεσμία κράτησηςΥπηρεσία: κράτηση τουλάχιστον Ν ώρες πρινINSIDE_CUTOFFΠολύ κοντά στην ώρα — προτείνετε πιο αργά.
Η συγκεκριμένη ώρα είναι διαθέσιμηΩράρια, πλέγμα ωρών, άδειες, εξωτερικό ημερολόγιο, ημέρες κλεισίματος, μαθήματα σε γήπεδο, χωρητικότηταSLOT_TAKENΗ ώρα μόλις έκλεισε — νέα αναζήτηση.
ΔιάρκειαΥπηρεσία: επιλογές ρυθμιζόμενης διάρκειας· πρέπει να χωράει στο ωράριοINVALID_DURATION / SLOT_TAKENΠροτείνετε τις επιτρεπτές διάρκειες.
Για ποιον είναι η κράτησηΤηλέφωνο + μικρό όνομα → εγγεγραμμένος πελάτης, μετά υπάρχων πελάτης, μετά νέος πελάτης—Ρωτήστε το όνομα του ατόμου για το οποίο είναι το ραντεβού.
ΑποκλεισμόςΛίστα αποκλεισμένων της επιχείρησηςBANNEDΔιαβάστε το μήνυμα· προτείνετε takeMessage.
Έγκριση μελώνΕπιχείρηση: τα νέα μέλη χρειάζονται έγκρισηMEMBERSHIP_REQUIRED (εγγεγραμμένος) ή status pending (νέος)Η επιχείρηση πρέπει πρώτα να εγκρίνει τον πελάτη.
Ημερήσιο όριοΕπιχείρηση: μέγιστα ραντεβού ανά ημέρα ανά πελάτηDAILY_LIMITΠροτείνετε άλλη ημέρα.
ΠληρωμήΔωρεάν πρώτο ραντεβού → πακέτο που ήδη έχει ο πελάτης → πληρωμή στο κατάστημα. Ποτέ online.SUBSCRIPTION_REQUIRED* / NOT_PHONE_BOOKABLE (online_only)Προτείνετε sendBookingLink για αγορά πακέτου ή online πληρωμή.
ΕπιβεβαίωσηΗ επιχείρηση εγκρίνει τα ραντεβού χειροκίνητα, ή νέο μέλος σε αναμονήstatus: pending«Θα σας επιβεβαιώσει το κατάστημα.»
Ταυτόχρονες κρατήσειςΝέα καταμέτρηση μετά την καταχώρηση· η κράτηση που περισσεύει αποσύρεταιSLOT_TAKENΗ ώρα μόλις έκλεισε — νέα αναζήτηση.
Δύο εξαιρέσεις για τις συνδέσεις: μια επιχείρηση που απαιτεί εγγραφή στην εφαρμογή δέχεται κανονικά κρατήσεις μέσω API (το επέλεξε εκδίδοντας κλειδί), και χρήματα δεν πληρώνονται ποτέ μέσω API.

Μεταφορά & ακύρωση

ΈλεγχοςΡύθμιση επιχείρησης / υπηρεσίαςΑπάντηση APIΤι κάνει η σύνδεσή σας
Μόνο δικά του ραντεβούΤο τηλέφωνο του πελάτη του ραντεβού πρέπει να ταιριάζει με του καλούντοςNOT_FOUNDΖητήστε τον αριθμό με τον οποίο έγινε η κράτηση.
Μόνο ατομικά ραντεβούΜαθήματα, κρατήσεις πολλών υπηρεσιών, επαναλαμβανόμενες και πολυήμερες κρατήσειςNOT_PHONE_BOOKABLEΟι αλλαγές γίνονται από την εφαρμογή ή την επιχείρηση — takeMessage.
Πληρωμένο onlineΤις επιστροφές χρημάτων τις χειρίζεται η επιχείρησηHANDOFF_REQUIREDΑφήστε μήνυμα στην επιχείρηση.
Αυστηρή προθεσμίαΥπηρεσία: δεν επιτρέπεται εκπρόθεσμη ακύρωσηCANCELLATION_NOT_ALLOWEDΔιαβάστε το μήνυμα της επιχείρησης.
Εκπρόθεσμη ακύρωσηΥπηρεσία: προθεσμία ακύρωσης (προειδοποίηση / πιθανή χρέωση)CONFIRMATION_REQUIREDΔιαβάστε την πολιτική, ζητήστε ρητό «ναι», καλέστε ξανά με confirmLateCancel.
Σημείωση / επώνυμο μετά την κράτησηΗ σημείωση προστίθεται στο «Μήνυμα πελάτη» (έως 500 χαρακτήρες συνολικά)· το επώνυμο μόνο αν λείπει, ποτέ σε εγγεγραμμένο πελάτηNOTE_TOO_LONG / surnameSaved: falseΓια ό,τι δεν αποθηκεύτηκε, takeMessage.
Νέα ώρα μεταφοράςΟι ίδιοι έλεγχοι με την κράτηση, χωρίς να μετρά το ίδιο το ραντεβούSLOT_TAKEN / OUTSIDE_BOOKING_WINDOW / INSIDE_CUTOFFΠροτείνετε άλλη ώρα.

Απόρρητο

Ο πελάτης μαθαίνει μόνο για ραντεβού στον δικό του αριθμό, και μόνο μικρά ονόματα, υπηρεσίες, προσωπικό, ώρες και κατάσταση — ποτέ σημειώσεις, ιατρικά στοιχεία, ιστορικό, επίπεδα ή στοιχεία άλλων πελατών. Ισχύει για κάθε τύπο επιχείρησης, και για ιατρεία και θεραπευτές.

Υποχρεώσεις της σύνδεσής σας

  • Ο αριθμός τηλεφώνου είναι η ταυτότητα του πελάτη. Για identifyCaller, listAppointments, rescheduleAppointment, cancelAppointment και updateBookingDetails στείλτε ΜΟΝΟ αριθμό επαληθευμένο από το κανάλι: αναγνώριση κλήσης, ο αριθμός του λογαριασμού μηνυμάτων, ή αριθμός που επιβεβαιώσατε εσείς με κωδικό SMS. Ποτέ αριθμό που είπε ή πληκτρολόγησε ο πελάτης — αλλιώς οποιοσδήποτε θα έβλεπε ή θα ακύρωνε ραντεβού άλλου. Το bookAppointment και το takeMessage μπορούν να χρησιμοποιούν τον αριθμό που δίνει ο πελάτης.
  • Προτείνετε μόνο ώρες που επέστρεψε το findAvailability. Ποτέ μην επινοείτε ή στρογγυλεύετε ώρα.
  • Επιβεβαιώστε με τον πελάτη υπηρεσία, ημέρα, ώρα και όνομα και πάρτε καθαρό «ναι» πριν από bookAppointment, rescheduleAppointment ή cancelAppointment.
  • Σε CONFIRMATION_REQUIRED, διαβάστε το κείμενο της πολιτικής και καλέστε ξανά με confirmLateCancel: true μόνο μετά από ρητό «ναι».
  • Όταν μια κράτηση επιστρέφει pending, πείτε στον πελάτη ότι θα την επιβεβαιώσει η επιχείρηση.
  • Σε φωνητικές κλήσεις: ενημερώστε στην αρχή ότι η κλήση καταγράφεται (GDPR) και κρατήστε ηχογραφήσεις και απομαγνητοφωνήσεις μόνο όσο τις χρειάζεται η επιχείρηση.
  • Αντιμετωπίστε ιατρεία και θεραπευτές ως ευαίσθητα: μη ζητάτε ιατρικές λεπτομέρειες πέρα από μια σύντομη αιτία και μην κρατάτε στοιχεία του καλούντος μετά την κλήση.
  • Τα SMS δεν φτάνουν σε σταθερά — προτείνετε takeMessage.
  • Για ό,τι δεν μπορείτε να κάνετε, και όποτε ο πελάτης ζητά άνθρωπο, χρησιμοποιήστε το takeMessage.
  • Κρατήστε το κλειδί στον server — ποτέ σε browser, εφαρμογή ή JavaScript σελίδας. Ένα κλειδί ανά επιχείρηση ανά σύνδεση· αν διαρρεύσει, ζητήστε από την επιχείρηση να το ανακαλέσει.

Κωδικοί άρνησης

ΚωδικόςΣημασίαΠροτεινόμενη διατύπωση
SLOT_TAKENΗ ώρα δεν είναι (ή δεν είναι πλέον) διαθέσιμη.Αυτή η ώρα μόλις έκλεισε. Να σας προτείνω κάποια άλλη;
OUTSIDE_BOOKING_WINDOWΠιο μπροστά από όσο δέχεται κρατήσεις η επιχείρηση.Δεχόμαστε κρατήσεις έως τόσες ημέρες μπροστά.
INSIDE_CUTOFFΠολύ κοντά στην έναρξη για αυτή την υπηρεσία.Για αυτή την υπηρεσία χρειάζεται να κλείσετε λίγο νωρίτερα.
DAILY_LIMITΟ πελάτης έχει ήδη τα μέγιστα ραντεβού εκείνη την ημέρα.Έχετε ήδη τα μέγιστα ραντεβού εκείνη τη μέρα.
BANNEDΗ επιχείρηση δεν δέχεται κρατήσεις από αυτόν τον πελάτη.Δεν μπορώ να ολοκληρώσω την κράτηση· να αφήσω μήνυμα στο κατάστημα;
MEMBERSHIP_REQUIREDΗ επιχείρηση πρέπει πρώτα να εγκρίνει αυτόν τον πελάτη.Το κατάστημα πρέπει πρώτα να εγκρίνει την εγγραφή σας.
SUBSCRIPTION_REQUIREDΧρειάζεται πακέτο (επίσης _EXHAUSTED, _EXPIRED, _INSUFFICIENT, _REQUIRED_ACCOUNT).Αυτή η υπηρεσία κλείνεται με πακέτο· να σας στείλω σύνδεσμο;
NOT_PHONE_BOOKABLEΔεν κλείνεται ή δεν αλλάζει τηλεφωνικά· δείτε το `reason`.Αυτό γίνεται online· να σας στείλω σύνδεσμο;
BOOKINGS_DISABLEDΗ επιχείρηση έχει σταματήσει προσωρινά τις κρατήσεις.Αυτή τη στιγμή δεν δεχόμαστε κρατήσεις· να αφήσω μήνυμα;
CONFIRMATION_REQUIREDΕκπρόθεσμη ακύρωση — χρειάζεται ρητό «ναι».(διαβάστε το `message`) Θέλετε σίγουρα να ακυρωθεί;
CANCELLATION_NOT_ALLOWEDΕίναι αργά για ακύρωση σε αυτή την υπηρεσία.(διαβάστε το `message`)
HANDOFF_REQUIREDΠρέπει να το χειριστεί η επιχείρηση (π.χ. επιστροφή χρημάτων).Θα το δει το κατάστημα και θα σας καλέσει.
NOT_FOUNDΔεν υπάρχει τέτοια υπηρεσία, μέλος προσωπικού ή δικό του ραντεβού.Δεν βρίσκω κάτι τέτοιο· μου λέτε ξανά;
NOTHING_TO_UPDATE / NOTE_TOO_LONGΤο updateBookingDetails δεν είχε τι να αποθηκεύσει, ή η σημείωση δεν χωράει πια στο ραντεβού.Να το αφήσω ως μήνυμα στο κατάστημα;
INVALID_PHONE / INVALID_DATE / INVALID_DURATION / RANGE_TOO_LONG / INVALID_REQUESTΗ ίδια η κλήση του εργαλείου ήταν λάθος.(διορθώστε την κλήση και ξαναδοκιμάστε)
SMS_NOT_POSSIBLEΣταθερό τηλέφωνο, ή η επιχείρηση δεν έχει μονάδες SMS.Δεν μπορώ να στείλω SMS· να αφήσω μήνυμα;
RATE_LIMITEDΠάρα πολλές κλήσεις για αυτό το κλειδί, ή στάλθηκε ήδη σύνδεσμος την τελευταία ώρα.—
UNAUTHORIZED (401) / SHOP_INACTIVE · API_DISABLED · PLAN_REQUIRED (403) / INTERNAL_ERROR (500)Πρόβλημα κλειδιού, ρυθμίσεων της επιχείρησης ή πλατφόρμας.Αν γίνεται, πάρτε τηλέφωνο την επιχείρηση.

Φωνητικές πλατφόρμες

Για AI τηλεφωνική γραμματεία ή chatbot με LLM: κατεβάστε μία φορά τους ορισμούς των εργαλείων με το κλειδί σας και επικολλήστε τους στην πλατφόρμα σας. Όλες οι πλατφόρμες παρακάτω καλούν απλά εργαλεία HTTPS με δικό σας header. Για δικό σας κώδικα, απλώς καλέστε τα endpoints. Τα ονόματα των μενού αλλάζουν συχνά — ελέγξτε την τρέχουσα τεκμηρίωση της πλατφόρμας σας.

Ορισμοί εργαλείων
curl https://management.prebook.gr/api/agent/v1/tools -H "Authorization: Bearer <key>"

Vapi

  1. Δημιουργήστε ένα Function tool για κάθε εργαλείο του Prebook (ή εισάγετε τον πίνακα openaiFunctions από το GET /tools).
  2. Ορίστε ως server URL κάθε εργαλείου το endpoint του και προσθέστε το header Authorization: Bearer <key>.
  3. Βάλτε το prompt γραμματείας παρακάτω στο system prompt του assistant και δώστε τον αριθμό του καλούντος ({{customer.number}}) στο identifyCaller.

Retell

  1. Προσθέστε ένα Custom Function ανά εργαλείο: URL = endpoint, μέθοδος POST, header Authorization: Bearer <key>, parameters = το JSON schema του εργαλείου.
  2. Ενεργοποιήστε το «payload: args only», ώστε το body να περιέχει μόνο τα ορίσματα.
  3. Χρησιμοποιήστε το {{user_number}} ως τηλέφωνο για το identifyCaller.

ElevenLabs Agents

  1. Προσθέστε ένα Webhook (server) tool ανά εργαλείο του Prebook: POST, το URL του endpoint και secret header Authorization: Bearer <key>.
  2. Ορίστε τις παραμέτρους του body από το schema του εργαλείου· αφήστε το LLM να τις συμπληρώσει.
  3. Χρησιμοποιήστε τη δυναμική μεταβλητή system__caller_id ως τηλέφωνο για το identifyCaller.

Prompt για AI γραμματεία ή chatbot

Ένα σημείο εκκίνησης για το system prompt (γραμμένο για τηλέφωνο· για chat αφαιρέστε τη γραμμή για την καταγραφή). Αντικαταστήστε το {{shopName}}· οι σημειώσεις της ίδιας της επιχείρησης έρχονται στο getShopInfo.callerInfo.

System prompt
Είσαι η τηλεφωνική γραμματεία του «{{shopName}}». Μιλάς ελληνικά, ευγενικά και σύντομα.
Στην αρχή της κλήσης: ενημέρωσε ότι η κλήση καταγράφεται, κάλεσε getShopInfo και identifyCaller με τον αριθμό της αναγνώρισης κλήσης.
Για αναζήτηση, μεταφορά, ακύρωση ή σημείωση σε ραντεβού χρησιμοποίησε ΜΟΝΟ τον αριθμό της αναγνώρισης κλήσης — ποτέ αριθμό που σου λέει ο καλών. Αν η κλήση είναι από απόκρυψη, μην αλλάζεις ραντεβού· κάλεσε takeMessage.
Για ραντεβού: listServices → findAvailability. Πρότεινε ΜΟΝΟ ώρες που επέστρεψε το findAvailability (2-3 κάθε φορά).
Πριν κλείσεις, επιβεβαίωσε δυνατά υπηρεσία, ημέρα, ώρα και όνομα. Μετά κάλεσε bookAppointment.
Αν status = "pending", πες ότι το κατάστημα θα επιβεβαιώσει το ραντεβού.
Για ακύρωση με code CONFIRMATION_REQUIRED, διάβασε την πολιτική και ζήτα ρητό «ναι» πριν ξανακαλέσεις με confirmLateCancel.
Μην ρωτάς ιατρικές λεπτομέρειες πέρα από μια σύντομη αιτία επίσκεψης.
Ό,τι δεν μπορείς να κάνεις ή να απαντήσεις: takeMessage (ή sendBookingLink για online κράτηση).

Εκδόσεις & υποστήριξη

  • Το /v1 αλλάζει μόνο προσθετικά: νέα εργαλεία, νέα προαιρετικά πεδία, νέοι κωδικοί. Έναν άγνωστο κωδικό αντιμετωπίστε τον ως λόγο να αφήσετε μήνυμα.
  • Ασύμβατες αλλαγές έρχονται ως /v2, με ενημέρωση εκ των προτέρων σε κάθε κάτοχο κλειδιού.
  • Ερωτήσεις, κλειδιά και συνεργασίες: [email protected].