Η διεπαφή REST που μοιράζονται η κονσόλα της WeTalk και κάθε ενσωμάτωση πελάτη.
Δημιουργείται από το ίδιο το έγγραφο OpenAPI του API κατά το build, ώστε να μην περιγράφει endpoint που δεν διαθέτει το API. Οι λειτουργίες με ετικέτα operator παραλείπονται: ανήκουν στην εσωτερική κονσόλα της WeTalk, σε ξεχωριστή εγκατάσταση στην οποία δεν έχει πρόσβαση κανένα κλειδί API.
Βοηθοί και εκδόσεις
GET /v1/agents listVoiceAgents
Κάθε VoiceAgent σε αυτόν τον λογαριασμό, με τα νεότερα πρώτα.
Χωρίς σελιδοποίηση, σκόπιμα. Το Design §5.1 ζητά cursors στις συλλογές με συχνές προσθήκες — συνομιλίες, καθολικό, αρχείο παραδόσεων — και τα VoiceAgents ενός χώρου εργασίας δεν ανήκουν σε αυτές: η οθόνη είναι μια σύντομη λίστα που διαβάζεται από πάνω προς τα κάτω και η καταμέτρηση από πάνω («N βοηθοί · M απαντούν τώρα») αφορά ολόκληρο το σύνολο, όχι μία σελίδα.
Μπορεί να το διαβάσει κάθε ρόλος μέλους, συμπεριλαμβανομένου του Viewer: η απόφαση προϊόντος Q10 δίνει στον Viewer πρόσβαση μόνο για ανάγνωση σε αναλύσεις και αποτελέσματα, και αυτό ακριβώς είναι. Ο Viewer δεν βλέπει τον αριθμό του καλούντος σε μια συνομιλία, κάτι που επιβάλλεται μέσω της προβολής της βάσης δεδομένων και όχι με περιορισμό αυτής της λίστας.
POST /v1/agents createVoiceAgent
Δημιουργήστε ένα VoiceAgent και την πρώτη εργασία build του, που περιμένει τα έγγραφα.
Τέσσερις εγγραφές, σε μία συναλλαγή: voice_agent (κατάσταση building), agent_version v1 (κατάσταση building), build_job (κατάσταση queued) και τις έξι build_step εγγραφές του. ΔΕΝ προσθέτει στην ουρά build.start (plan-003, design §16.8): το build διαβάζει τα έγγραφα της έκδοσης, που υπάρχουν μόνο αφού ο οδηγός ανεβάσει και επιβεβαιώσει το καθένα (createAgentDocumentUpload, confirmAgentDocument). startVoiceAgentBuild τότε προσθέτει στην ουρά build.start, μία φορά, στη δική του συναλλαγή — εκεί βρίσκεται το συμβόλαιο outbox. Η εργασία build παραμένει queued μέχρι τότε.
Τρεις κανόνες ελέγχονται έναντι του καταλόγου της πλατφόρμας, επειδή μόνο εκεί ισχύουν: το πρότυπο πρέπει να είναι available, κάθε γλωσσικό πακέτο πρέπει να είναι complete, και η φωνή κάθε γλώσσας πρέπει να τη μιλά — voice_by_language ορίζει μία φωνή ανά γλώσσα, voice_id μία φωνή για κάθε γλώσσα (ακριβώς ένα από τα δύο· plan-015, 2026-10-09: ένα ζεύγος που αποτυγχάνει είναι 400 validation_failed στο voice_by_language.<language>, με αναφορά της γλώσσας). Η έκδοση 1 αποθηκεύει τον πίνακα αντιστοίχισης και, ως voice_id, τη φωνή της αρχικής γλώσσας. Ένας βοηθός διανομής (σχήμα αναφοράς pizzabot-menu-md-v1) μιλά προς το παρόν μία γλώσσα και απορρίπτεται αν έχει περισσότερες από μία. Το μήνυμα κάθε απόρριψης γράφεται για το άτομο που χρησιμοποιεί τον οδηγό· τα code και field δηλώνουν ποιος κανόνας ήταν.
Δέχεται Idempotency-Key. Ένας οδηγός του οποίου η απάντηση χάθηκε πρέπει να μπορεί να επαναλάβει το αίτημα χωρίς να δημιουργηθεί δεύτερο VoiceAgent.
«Έναρξη από κοινόχρηστη διαμόρφωση» (plan-014): με resource_share_id, ο νέος βοηθός αντιγράφει μια διαμόρφωση βοηθού που κοινοποίησε άλλος χώρος εργασίας και αποδέχθηκε αυτός (listSharedVoiceAgentConfigurations). Το είδος βοηθού, οι γλώσσες, η φωνή, ο χαιρετισμός, ο διακόπτης ηχογράφησης και η ταυτόχρονη εξυπηρέτηση συμπληρώνουν όσα παραλείπει το αίτημα· το είδος βοηθού δεν μπορεί να αλλάξει. Η αντιγραφή καταγράφεται ως προέλευση της κοινοποίησης στην ίδια συναλλαγή, μία φορά ανά χώρο εργασίας (409 conflict για δεύτερη αντιγραφή)· μια ανακληθείσα κοινοποίηση είναι 409 share_revoked, μια κοινοποίηση που δεν μπορεί να χρησιμοποιήσει αυτός ο χώρος εργασίας 404 share_unavailable. Το όριο βοηθών του οργανισμού εφαρμόζεται όπως σε κάθε δημιουργία (409 resource_limit_reached). Η αντιγραφή παίρνει επίσης τη ζώνη ώρας, τις ειδικές ημερομηνίες και τις επιλογές απάντησης της σταθερά ορισμένης έκδοσης, όπου παραλείπονται από το αίτημα.
Οι απαντήσεις για την εξυπηρέτηση (plan-015, 2026-10-09): η δική του, του VoiceAgent, time_zone (του χώρου εργασίας όταν παραλείπεται, γραμμένη στην έκδοση), οι special_date[], και τι γίνεται όταν είναι κλειστό ή απασχολημένο (after_hours_choice, busy_choice, longest_wait_minute, forward_to). Η προώθηση ελέγχεται πριν γραφτεί οτιδήποτε: 422 forward_unavailable όταν η προώθηση δεν είναι διαθέσιμη, 400 forward_destination_refused για αριθμό εκτός των ελεγμένων χωρών, αριθμό υψηλής χρέωσης, έκτακτης ανάγκης ή σύντομο αριθμό, ή αριθμό στον οποίο απαντά η WeTalk.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 429
GET /v1/agents/{voice_agent_id} getVoiceAgent
Ένα VoiceAgent, με τα στοιχεία της σημερινής ημέρας και του τρέχοντος μήνα.
Το VoiceAgent, με όσα εμφανίζει η σελίδα του (plan-015, 2026-10-09): τη φωνή κάθε γλώσσας, τις απαντήσεις εξυπηρέτησης της ενεργής έκδοσης (ζώνη ώρας, ειδικές ημερομηνίες, τι γίνεται όταν είναι κλειστό ή απασχολημένο και την πραγματική αναμονή των καλούντων), αν η online πληρωμή είναι μη διαθέσιμη για VoiceAgent που δέχεται μόνο online πληρωμές, και αν η προώθηση σε τηλέφωνο είναι διαθέσιμη με τα όρια κουδουνίσματος και διάρκειας.
PATCH /v1/agents/{voice_agent_id} updateVoiceAgent
Ενεργοποιήστε ή απενεργοποιήστε την «Ηχογράφηση κλήσεων», δημοσιεύοντας νέα έκδοση (plan-003 RC-47).
Το αν ένα VoiceAgent ηχογραφεί ορίζεται σταθερά στις εκδόσεις του, όπως κάθε άλλο στοιχείο του τρόπου απάντησής του: μια έκδοση είναι αμετάβλητη και μια συνομιλία διατηρεί την έκδοση με την οποία έγινε δεκτή. Επομένως, αυτό δεν επεξεργάζεται την ενεργή έκδοση. Την αντιγράφει — την ίδια επικυρωμένη διαμόρφωση με αλλαγμένο το recordingEnabled και το ίδιο μετρημένο πρόθεμα prompt — ως νέα ready έκδοση και τη δημοσιεύει μέσω του ίδιου compare-and-set, της ίδιας εγγραφής ελέγχου και του ίδιου μηνύματος outbox όπως το publishAgentVersion, σε μία συναλλαγή. Μια συνομιλία που ήδη εξελίσσεται διατηρεί τη ρύθμιση με την οποία ξεκίνησε· η επόμενη λαμβάνει τη νέα έκδοση.
recording_enabled είναι το μόνο πεδίο που αλλάζει αυτή η διαδρομή. expected_live_version_seq απαιτείται, όπως στη δημοσίευση. Αν ζητηθεί η τιμή που ήδη έχει η ενεργή έκδοση, δεν δημοσιεύεται τίποτα και η απάντηση είναι changed: false. Ένα VoiceAgent χωρίς ακόμη ενεργή έκδοση είναι 422 agent_version_not_ready: το πρώτο build του χρησιμοποιεί την τιμή με την οποία δημιουργήθηκε.
Με recording_enabled: false το runtime δεν εκφωνεί ειδοποίηση ηχογράφησης, δεν καταγράφει ήχο και αφήνει το conversation.recording_consent στην τιμή not_asked.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 429
GET /v1/agents/{voice_agent_id}/analytics getVoiceAgentAnalytics
Όλα όσα εμφανίζει η καρτέλα Αναλύσεις, για ένα χρονικό παράθυρο, σε μία ανάγνωση.
Κλήσεις ανά ημέρα, τα τέσσερα κύρια στοιχεία, η ανάλυση αποτελεσμάτων, τα μερίδια γλωσσών, ο πίνακας ανά κανάλι, οι ώρες αιχμής, σύγκριση ανά έκδοση και η ταξινομημένη λίστα ερωτήσεων στις οποίες ο βοηθός δεν μπόρεσε να απαντήσει.
Κάθε ανάλυση είναι πλήθος, ποτέ ποσοστό: ο παρονομαστής αποστέλλεται μία φορά, στο figure.conversation_count, και η οθόνη κάνει τη διαίρεση. Δύο ποσοστά που στρογγυλοποιούνται χωριστά δεν αθροίζονται σε 100 και ένα ποσοστό χρονικού παραθύρου που δεν βλέπει ο καλών δεν μπορεί να ελεγχθεί.
Οι ομάδες ορίζονται στη ζώνη ώρας του χώρου εργασίας που αναφέρει η απάντηση, ώστε οι «ώρες αιχμής» να σημαίνουν τις ώρες που είχε φόρτο η επιχείρηση, όχι ο διακομιστής. Μετρώνται μόνο συνομιλίες που απαντήθηκαν και δεν είναι δοκιμαστικές, και η απάντηση το δηλώνει στο counts_answered_only και excludes_test αντί να πρέπει να συναχθεί από έναν αριθμό που φαίνεται χαμηλός.
since και until είναι προαιρετικά και δεν έχουν προεπιλογή: η απουσία σημαίνει ότι δεν υπάρχει όριο σε εκείνη την πλευρά. Μια τιμή που δεν αναλύεται δίνει 400, ποτέ σιωπηρή διεύρυνση του εύρους.
GET /v1/agents/{voice_agent_id}/answering getVoiceAgentAnswering
Πότε απαντά αυτό το VoiceAgent και τι κάνει όταν δεν μπορεί.
Διαβάζεται από το έγγραφο της ενεργής agent_versionέκδοσης με την επικυρωμένη διαμόρφωση, που είναι αμετάβλητη. Σκόπιμα δεν υπάρχει αντίστοιχη λειτουργία εγγραφής: η αλλαγή του εβδομαδιαίου μοτίβου, μιας ημερομηνίας κλεισίματος, της συμπεριφοράς εκτός ωραρίου ή της υπερχείλισης σημαίνει δημοσίευση νέας agent_version, και ένα κουμπί αποθήκευσης εδώ θα έπρεπε να παραπλανεί σχετικά με τις συνομιλίες που επηρέασε.
GET /v1/agents/{voice_agent_id}/answers getVoiceAgentAnswers
Οι απαντήσεις από τις οποίες δημιουργήθηκε μια ολοκληρωμένη έκδοση, για τη φόρμα Επεξεργασίας (έλεγχος πύλης πελατών
Διαβάζονται από το επικυρωμένο έγγραφο διαμόρφωσης της έκδοσης (το προσχέδιο του οδηγού αντικαθίσταται όταν πετύχει το build): οι ώρες λειτουργίας ως εβδομάδα και ως πρόταση που διαβάζει το build, το κόστος διανομής και το όριο δωρεάν διανομής, ο τρόπος πληρωμής των καλούντων, οι γλώσσες, η φωνή, ο χαιρετισμός και η «Ηχογράφηση κλήσεων», καθώς και τα έγγραφα της έκδοσης. Ένα πεδίο κειμένου προτύπου που δεν περιέχεται στη διαμόρφωση αναφέρεται στο unrecovered_field και πρέπει να απαντηθεί ξανά. Η ενεργή έκδοση, εκτός αν το agent_version_id αναφέρει άλλη ολοκληρωμένη έκδοση. edit_refusal αναφέρει γιατί δεν μπορεί να αποθηκευτεί τώρα μια αλλαγή (εκτελείται build). Owner ή Admin.
- 200
- 401
- 403
- 404
- 409
- 422
- 429
POST /v1/agents/{voice_agent_id}/archive archiveVoiceAgent
Αρχειοθετήστε ένα VoiceAgent που δεν απαντά πλέον (έλεγχος πύλης πελατών
Ορίζει archived_at, με καταγραφή ελέγχου (voice_agent.archived): φεύγει από listVoiceAgents — τη λίστα, την καταμέτρηση της πλευρικής στήλης και κάθε επιλογέα — ενώ διατηρούνται οι συνομιλίες, οι παραγγελίες και το ιστορικό του και το getVoiceAgent εξακολουθεί να απαντά γι’ αυτό. Δεν διαγράφεται τίποτα.
Απορρίπτεται (409 voice_agent_archive_refused) όσο είναι ενεργό (θέστε το πρώτα σε παύση), όσο αριθμός ή endpoint εξακολουθεί να δρομολογεί σε αυτό (οι αριθμοί κατέχονται από τη WeTalk: ζητήστε από τη WeTalk μετακίνηση ή αποδέσμευση) ή όσο εκτελείται το build του. Ένα build που ακόμη περιμένει έγγραφα κλείνει μαζί του. Η αρχειοθέτηση ήδη αρχειοθετημένου VoiceAgent δεν αλλάζει τίποτα (changed: false).
- 200
- 400
- 401
- 403
- 404
- 409
- 429
POST /v1/agents/{voice_agent_id}/browser-test-calls createBrowserTestCall
Μιλήστε στην ενεργή έκδοση του βοηθού από το μικρόφωνο του περιηγητή.
Μια πραγματική συνομιλία στην ενεργή έκδοση μέσω της υπηρεσίας μεταφοράς φωνής περιηγητή της WeTalk, με ένδειξη is_test και χρέωση όπως κάθε άλλο λεπτό από τη στιγμή που απαντάται (AC-38), για έως max_duration_second (15 λεπτά). Η κονσόλα ζητά πρώτα άδεια μικροφώνου και δεν στέλνει τίποτα αν απορριφθεί. Διαβάστε τη δοκιμή με readTestCall ?conversation_id= και τερματίστε την με endTestCall — τις ίδιες δύο διαδρομές που χρησιμοποιεί μια τηλεφωνική δοκιμή.
Ελέγχεται με τη σειρά και τα μηνύματα της τηλεφωνικής δοκιμής, χωρίς τον έλεγχο «διαθέτει αριθμό»: ο βοηθός (404 voice_agent_not_found)· η ενεργή έκδοσή του (422 agent_version_not_ready)· η γλώσσα (422 language_unavailable)· ο βοηθός απαντά συνομιλίες (422 voice_agent_paused)· το τρέχον υπόλοιπο και ο προϋπολογισμός του χώρου εργασίας πληρώνουν ένα δευτερόλεπτό της (402 trial_exhausted, credit_exhausted, hard_stop_reached, budget_exceeded)· το μοντέλο εκτελείται (503 model_pool_unavailable). Κάθε απόρριψη τελειώνει με «Δεν χρεώθηκε τίποτα.» και δεν γράφεται τίποτα.
Μία δοκιμή περιηγητή ανά μέλος ανά βοηθό: η έναρξη μιας τερματίζει την ήδη εκτελούμενη δοκιμή σας σε αυτόν τον βοηθό και την αναφέρει στο replaced_conversation_id.
Η απάντηση περιέχει webrtc — τη διεύθυνση της υπηρεσίας μεταφοράς, token συμμετοχής (δύο λεπτά, το δωμάτιο μόνο αυτής της συνομιλίας, μόνο μικρόφωνο), join_by, και τις δύο ταυτότητες συμμετεχόντων — καθώς και το id της συνομιλίας, στο state = connecting.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 402
- 403
- 404
- 422
- 429
- 503
POST /v1/agents/{voice_agent_id}/build startVoiceAgentBuild
Ξεκινήστε το build του VoiceAgent από τα επιβεβαιωμένα έγγραφά του.
Προσθέτει στην ουρά το build της υπό κατασκευή έκδοσης του VoiceAgent, μία φορά. Δεύτερη έναρξη δίνει 409 build_already_started· πρότυπο που δημιουργείται από έγγραφα χωρίς κανένα επιβεβαιωμένο δίνει 422 build_no_document. Απαιτεί Idempotency-Key.
- 202
- 400
- 401
- 403
- 404
- 409
- 422
- 429
GET /v1/agents/{voice_agent_id}/channel-bindings listVoiceAgentChannelBindings
Τα endpoints που φτάνουν σε αυτό το VoiceAgent.
Μία εγγραφή ανά channel_binding: ποιο μέσο μεταφέρει, με ποιο στοιχείο διευθυνσιοδοτείται και πόσες συνομιλίες έφτασαν σε αυτό τις τελευταίες επτά ημέρες.
GET /v1/agents/{voice_agent_id}/concurrency getVoiceAgentConcurrency
Πόσες συνομιλίες εξυπηρετεί αυτό το VoiceAgent και πόσες επιτρέπεται να εξυπηρετεί.
in_use μετρά συνομιλίες χωρίς χρόνο λήξης. channel_unit_ceiling είναι το πραγματικό όριο στο οποίο η διαδικασία εισδοχής περιορίζει τις νέες συνομιλίες: το δικό του, του VoiceAgent, channel_unit_limit όταν έχει οριστεί, διαφορετικά το ενεργό agent_versionτου version_ceiling. Είναι null όταν δεν έχει δημοσιευτεί τίποτα — ένα VoiceAgent χωρίς ενεργή έκδοση δεν δέχεται κανέναν, κάτι που δεν ισοδυναμεί με μηδενικό όριο. entitlement_ceiling είναι το δικαίωμα ταυτόχρονων συνομιλιών του οργανισμού, η μέγιστη τιμή στην οποία μπορεί να οριστεί το channel_unit_limit .
PUT /v1/agents/{voice_agent_id}/concurrency setVoiceAgentChannelUnitLimit
Αλλάξτε πόσες συνομιλίες δέχεται αυτό το VoiceAgent ταυτόχρονα.
Ορίζει το δικό του όριο γραμμών του VoiceAgent, channel_unit_limit, χωρίς δημοσίευση νέας έκδοσης. null το επαναφέρει στο όριο της δημοσιευμένης έκδοσης. Όποιος μπορεί να αλλάξει τον βοηθό (Owner, Admin, Member, Developer) μπορεί να το αλλάξει, έως το δικαίωμα ταυτόχρονων συνομιλιών του οργανισμού· πάνω από αυτό η απάντηση είναι 422 channel_unit_limit_above_entitlement με error.detail.entitlement_ceiling, και ο τρόπος αύξησης είναι «Αίτημα για περισσότερες γραμμές» (POST /v1/quota-requests).
Οι νέες συνομιλίες εφαρμόζουν το όριο μέσα σε λίγα δευτερόλεπτα. Ένα χαμηλότερο όριο δεν τερματίζει ποτέ συνομιλία σε εξέλιξη: οι νέοι καλούντες συναντούν τη συμπεριφορά απασχολημένου βοηθού μέχρι να μιλούν λιγότεροι από το νέο όριο. Κάθε αλλαγή καταγράφεται στο αρχείο ελέγχου (voice_agent.channel_unit_limit_changed, παλιά και νέα τιμή)· ο ορισμός της ήδη υπάρχουσας τιμής δεν αλλάζει ούτε καταγράφει τίποτα.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 429
GET /v1/agents/{voice_agent_id}/connection getVoiceAgentConnection
Πώς φτάνουν οι κλήσεις σε αυτό το VoiceAgent και τι δεν μπορεί να υποσχεθεί κανείς γι’ αυτό.
Ο αριθμός, ο πάροχος, η διεύθυνση SIP με το domain στο οποίο βρίσκεται, το endpoint συμβάντων, η πιο πρόσφατη παρατήρηση εγγραφής — ή null όταν δεν υπάρχει — και το συμπέρασμα για την εφεδρική δρομολόγηση εισερχομένων.
inbound_failover.possible είναι πάντα false. Ένας αριθμός ανήκει σε έναν πάροχο και η μετακίνησή του είναι διαδικασία φορητότητας που μετριέται σε ημέρες· αναφέρεται η εναλλακτική (byo_sip_dual_home) ώστε η απάντηση να μην είναι απλώς «όχι».
GET /v1/agents/{voice_agent_id}/documents listVoiceAgentLiveDocuments
Τα ονόματα των αρχείων από τα οποία απαντά η ενεργή έκδοση του βοηθού (plan-015 TC1).
Τα έγγραφα από τα οποία δημιουργήθηκε η ενεργή έκδοση, με την παλαιότερη μεταφόρτωση πρώτη: εκείνα της νεότερης ολοκληρωμένης έκδοσης, στην ενεργή έκδοση ή πριν από αυτή, που έχει έγγραφα (μια επεξεργασία κάνει build χωρίς νέα μεταφόρτωση). Ένας βοηθός χωρίς ενεργή έκδοση απαντά με κενή λίστα. Μόνο ονόματα — τα αποθηκευμένα αρχεία δεν είναι προσβάσιμα από εδώ. Η υπόδειξη κειμένου της κονσόλας Δοκιμών τα αναφέρει («Ο βοηθός απαντά από …»).
POST /v1/agents/{voice_agent_id}/documents createAgentDocumentUpload
Σύνδεσμος μεταφόρτωσης μικρής διάρκειας, μόνο για εγγραφή, για ένα έγγραφο της υπό κατασκευή έκδοσης.
Επιστρέφει σύνδεσμο στον οποίο ο περιηγητής στέλνει με PUT τα bytes ενός αρχείου, απευθείας στον χώρο αποθήκευσης, και υπογεγραμμένη άδεια μεταφόρτωσης για την επιβεβαίωση. Δεν καταγράφεται ακόμη τίποτα: το έγγραφο υπάρχει όταν επιβεβαιωθεί.
Μόνο όσο το build του VoiceAgent περιμένει έγγραφα (στην ουρά, πριν ξεκινήσει): διαφορετικά 409 build_already_started. Έως το όριο εγγράφων ανά έκδοση της πλατφόρμας (422 document_count_exceeded). Απαιτεί Idempotency-Key.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 404
- 409
- 413
- 415
- 422
- 429
POST /v1/agents/{voice_agent_id}/documents/{agent_document_id}/confirm confirmAgentDocument
Καταγράψτε ένα μεταφορτωμένο έγγραφο αφού ελέγξετε το αποθηκευμένο μέγεθος και το SHA-256 του.
Επαληθεύει την άδεια μεταφόρτωσης, διαβάζει ξανά το αποθηκευμένο αντικείμενο και ελέγχει ότι μέγεθος, τύπος περιεχομένου και SHA-256 είναι τα δηλωμένα. Μια ασυμφωνία απορρίπτει τα αποθηκευμένα bytes και απαντά 422 document_mismatch. Μια αντιστοιχία καταγράφει το έγγραφο και μια εγγραφή ελέγχου.
Η επιβεβαίωση του ίδιου εγγράφου δύο φορές επιστρέφει το ίδιο έγγραφο. Μια άδεια πλαστή, αλλοιωμένη ή εκδοθείσα για άλλο έγγραφο ή λογαριασμό δίνει 400 upload_grant_invalid· μια άδεια που έχει λήξει δίνει 410 upload_grant_expired.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 410
- 422
- 429
POST /v1/agents/{voice_agent_id}/edit editVoiceAgent
Ανοίξτε την επόμενη έκδοση από επεξεργασμένες απαντήσεις και δημιουργήστε τη (έλεγχος πύλης πελατών
Εισάγει την επόμενη agent_version (κατάσταση building, τις επεξεργασμένες απαντήσεις ως προσχέδιό της), ένα queued build_job και τα έξι βήματά του. Η ενεργή έκδοση συνεχίζει να απαντά: ένα VoiceAgent που έχει ήδη ενεργή έκδοση δεν δημοσιεύεται από το build του (απόφαση D14 (a))· η νέα έκδοση δοκιμάζεται στην καρτέλα Εκδόσεις και δημοσιεύεται με publishAgentVersion, που διατηρεί τις συνομιλίες σε εξέλιξη στην έκδοση με την οποία ξεκίνησαν (design §7.5).
documents: "keep" αντιγράφει τα έγγραφα της βασικής έκδοσης στη νέα και ξεκινά το build (202). documents: "replace" ανοίγει την έκδοση χωρίς έγγραφα (201)· μεταφορτώστε τα με createAgentDocumentUpload / confirmAgentDocument, έπειτα startVoiceAgentBuild.
Ελέγχεται πριν γραφτεί οτιδήποτε με τους ίδιους κανόνες όπως createVoiceAgent και έπειτα από τον ίδιο τον αναγνώστη του build, ώστε μη αναγνώσιμες ώρες ή χρέωση να δίνουν 400 με αναφορά του πεδίου. 409 build_in_progress όσο εκτελείται build (ένα που απλώς περιμένει έγγραφα κλείνει και αντικαθίσταται)· 409 live_version_seq_stale; 409 voice_agent_archived; 422 agent_version_not_ready χωρίς ολοκληρωμένη έκδοση ως βάση επεξεργασίας· 422 build_no_document για «keep» χωρίς έγγραφο· 422 edit_unchanged όταν δεν άλλαξε τίποτα· 422 edit_needs_no_build όταν άλλαξε μόνο το recording_enabled — αυτός ο διακόπτης δημοσιεύεται ανεξάρτητα μέσω updateVoiceAgent, χωρίς build. Owner ή Admin· με καταγραφή ελέγχου (voice_agent.edit_requested)· απαιτεί Idempotency-Key.
Οι απαντήσεις εξυπηρέτησης (plan-015, 2026-10-09) μπορούν να αλλάξουν εδώ· όποια παραλείπεται διατηρεί την τιμή της βασικής έκδοσης· κάθε αλλαγή χρειάζεται build. Μια προώθηση — δηλωμένη ή διατηρημένη — ελέγχεται όπως στη δημιουργία: 422 forward_unavailable, 400 forward_destination_refused.
Δέχεται σώμα αιτήματος JSON.
- 201
- 202
- 400
- 401
- 403
- 404
- 409
- 422
- 429
GET /v1/agents/{voice_agent_id}/flags listConversationFlags
Συνομιλίες για τις οποίες κάποιος ή κάτι επισήμανε πρόβλημα.
Ένας πίνακας, δύο κατηγορίες προέλευσης. Ένα μέλος επισημαίνει συνομιλία από το Ιστορικό, ένας operator από την κονσόλα προσωπικού, το runtime αυτόματα, ένας πάροχος με αναφορά — και οι τέσσερις καταλήγουν στο conversation_flag και διακρίνονται από το raised_by_kind. Η λίστα επιστρέφει και τις τέσσερις προελεύσεις, επειδή η απόκρυψη όσων επισήμανε operator θα άφηνε τον πελάτη με λίστα που δεν συμφωνεί με όσα βλέπει η WeTalk.
state έχει προεπιλογή open, δηλαδή όσα δεν έχουν αντιμετωπιστεί.
POST /v1/agents/{voice_agent_id}/flags/{conversation_flag_id}/resolve resolveConversationFlag
Σημειώστε ότι ένα επισημασμένο πρόβλημα αντιμετωπίστηκε.
Ορίζει handled_at και καταγράφει ποια κατηγορία προέλευσης το αντιμετώπισε, στην αντίστοιχη στήλη. Η επίλυση ήδη επιλυμένου προβλήματος δεν είναι σφάλμα — δύο άτομα μπορεί να πατήσουν ταυτόχρονα — αλλά καταγράφεται ο πρώτος που το επέλυσε.
GET /v1/agents/{voice_agent_id}/gaps listGaps
Ερωτήσεις καλούντων στις οποίες δεν απαντούν τα έγγραφα, ομαδοποιημένες και με καταμέτρηση.
Ταξινομημένες βάσει του πλήθους των καλούντων που τις ρώτησαν. state επιλέγει σε ποια από τις τέσσερις καταστάσεις βρίσκεται ένα κενό και έχει προεπιλογή open· μια παρούσα αλλά άγνωστη τιμή δίνει 400 αντί για σιωπηρή διεύρυνση της λίστας.
POST /v1/agents/{voice_agent_id}/gaps/{gap_id}/answer answerGap
Βάλτε μια απάντηση στην ουρά για το επόμενο προσχέδιο.
Συμπληρώνει answer_text και αφήνει answered_into_agent_version_id null, που σημαίνει «στην ουρά». Δεν δημοσιεύεται και δεν δημιουργείται τίποτα — publishAnswers αποθηκεύει τις απαντήσεις της ουράς ως προσχέδιο έκδοσης και ο βοηθός συνεχίζει να λέει όσα λέει η ενεργή έκδοση μέχρι κάποιος να δημοσιεύσει το προσχέδιο από τις Εκδόσεις.
Ένα κενό που έχει ήδη ενσωματωθεί σε έκδοση — ακόμη και προσχέδιο — απορρίπτεται: εκείνη η απάντηση είναι μέρος μιας αμετάβλητης agent_version, και μια διόρθωση απαντάται σε νέο κενό και μπαίνει στο επόμενο προσχέδιο.
Δέχεται σώμα αιτήματος JSON.
POST /v1/agents/{voice_agent_id}/gaps/{gap_id}/dismiss dismissGap
Σημειώστε ότι ένα κενό δεν αξίζει να απαντηθεί.
Ορίζει dismissed_at. Η εγγραφή διατηρείται αντί να διαγραφεί: η ομάδα είναι απόδειξη ότι οι καλούντες ρώτησαν και η διαγραφή της θα επέτρεπε να εντοπιστεί ξανά η ίδια ερώτηση ως νέα τον επόμενο μήνα.
POST /v1/agents/{voice_agent_id}/gaps/publish publishAnswers
Αποθηκεύστε τις απαντήσεις της ουράς ως προσχέδιο έκδοσης.
Δημιουργεί προσχέδιο· δεν δημοσιεύει τίποτα (plan-015 DRF, ADR 0043). Ενσωματώνει κάθε απάντηση που δεν είναι ακόμη ενεργή — κάθε απάντηση στην ουρά (κενό με answer_text και χωρίς answered_into_agent_version_id) και κάθε απάντηση ήδη σε προσχέδιο που δεν δημοσιεύτηκε ποτέ — σε νέα ready έκδοση που βασίζεται στην ενεργή: τη διαμόρφωση της ενεργής έκδοσης με διευρυμένες απαντήσεις και το πρόθεμα prompt μετρημένο ξανά. Το προσχέδιο δεν έχει published_at, το base_agent_version_id είναι η ενεργή έκδοση και κάθε ενσωματωμένο κενό την αναφέρει από τότε. Μια ερώτηση της ουράς ίση με μία ήδη ενεργή την αντικαθιστά.
Δεν υπάρχει agent_version.published μήνυμα outbox και η ενεργή έκδοση δεν αλλάζει: live_version_id και live_version_seq επιστρέφουν όπως ήταν και κάθε συνομιλία συνεχίζει να φτάνει στην ενεργή έκδοση μέχρι κάποιος με δικαίωμα δημοσίευσης να δημοσιεύσει το προσχέδιο από τις Εκδόσεις (publishAgentVersion, που απορρίπτει 409 draft_base_changed αν στο μεταξύ ενεργοποιήθηκε άλλη έκδοση, εκτός αν αναγνωριστεί η αλλαγή). Η εγγραφή ελέγχου είναι agent_version.draft_created. Η επανεκτέλεση αφού ενεργοποιηθεί άλλη έκδοση είναι η «Αναδημιουργία στην τρέχουσα έκδοση» των απαντήσεων.
Το operationId διατηρεί το προηγούμενο όνομά του ώστε να μη χαλάσουν οι παραγόμενοι clients.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 429
GET /v1/agents/{voice_agent_id}/numbers listVoiceAgentNumbers
Οι αριθμοί στους οποίους απαντά αυτό το VoiceAgent.
Τόσο αριθμοί παρόχου όσο και αριθμοί του δικού σας SIP trunk. Ένας αριθμός trunk έχει provider: sip_trunk, carrier: null, και αναφέρει το trunk του.
POST /v1/agents/{voice_agent_id}/optimisation-reviews createOptimisationReview
Ξεκινήστε έναν έλεγχο βελτιστοποίησης. Καταγράφεται και μπαίνει στην ουρά για το worker· δεν εκτελείται εδώ.
Καταγράφει τον έλεγχο με state = idle και την τιμή του (price_minor, currency = EUR), τον βάζει στην ουρά του optimisation_review.run θέμα outbox και γράφει την εγγραφή ελέγχου optimisation_review.requested, όλα σε μία συναλλαγή βάσης δεδομένων. Ο έλεγχος εκτελείται πίσω από το frontier wall στο factory, ποτέ στη συστοιχία μοντέλων· το worker που τον εκτελεί δεν έχει ακόμη εγκατασταθεί, επομένως ο έλεγχος παραμένει idle και η απάντηση το δηλώνει στο queued.
Δεν μετακινούνται χρήματα κατά τη δημιουργία. Η χρέωση λαμβάνεται όταν ολοκληρωθεί ο έλεγχος, στην ίδια συναλλαγή που τον σημειώνει ως done· ένας έλεγχος που αποτυγχάνει δεν χρεώνεται ποτέ.
payer = customer χρεώνει τον λογαριασμό και απαιτεί η τρέχουσα διαθέσιμη πίστωση να καλύπτει την τιμή. payer = wetalk απορροφά το κόστος και αποτελεί απόφαση μόνο operator της WeTalk: χρειάζεται absorbed_reason, τουλάχιστον δώδεκα χαρακτήρες. Ένας operator της WeTalk που ενεργεί ως μέλος δεν μπορεί να χρεώσει τον λογαριασμό (403 impersonation_forbidden, και η απόρριψη γράφεται στο αρχείο ελέγχου του λογαριασμού)· ένα άτομο ή κλειδί API δεν μπορεί να απορροφήσει το κόστος (403 permission_denied).
Idempotency-Key είναι απαιτούμενο: ένα επαναλαμβανόμενο αίτημα επιστρέφει τον πρώτο έλεγχο αντί να βάλει στην ουρά δεύτερο πληρωμένο έλεγχο.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 429
GET /v1/agents/{voice_agent_id}/optimisation-reviews/quote getOptimisationReviewQuote
Τι θα κόστιζε κάθε βάθος ελέγχου βελτιστοποίησης για ένα χρονικό παράθυρο και αν μπορεί να εκτελεστεί.
Μετρά τις συνομιλίες που θα διάβαζε ένας έλεγχος — αυτού του VoiceAgent, στον χώρο εργασίας του διαπιστευτηρίου, ολοκληρωμένες και μη δοκιμαστικές, που ξεκίνησαν εντός του χρονικού παραθύρου (since_last_version σημαίνει από την πιο πρόσφατη δημοσίευση) — και πόσες έχουν ακόμη ηχογράφηση βάσει της πολιτικής διατήρησης. Οι ηχογραφήσεις είναι ορατές μόνο σε owners και admins, οπότε για ένα μέλος recording_available_count είναι 0.
Η τιμή κάθε βάθους προέρχεται από τον ισχύοντα τιμοκατάλογο του λογαριασμού (review_standard_minor, review_ultra_minor), EUR σε ακέραιες υπομονάδες. unavailable_reason είναι null όταν το βάθος μπορεί να εκτελεστεί, διαφορετικά: no_conversations_in_scope· για ultra μόνο, recording_consent_refused (κάθε καλών στο χρονικό παράθυρο αρνήθηκε την ηχογράφηση) ή recordings_expired; insufficient_credit όταν η τρέχουσα διαθέσιμη πίστωση είναι κάτω από την τιμή. Δεν καταγράφεται ούτε δαπανάται τίποτα.
POST /v1/agents/{voice_agent_id}/pause pauseVoiceAgent
Σταματήστε ένα ενεργό VoiceAgent να απαντά μέχρι να συνεχιστεί η λειτουργία του (έλεγχος πύλης πελατών
live → paused, με καταγραφή ελέγχου (voice_agent.paused). Από την επόμενη συνομιλία, ο καλών ακούει το μήνυμα του γλωσσικού πακέτου «δεν μπορούμε να δεχθούμε την κλήση σας αυτή τη στιγμή, δοκιμάστε αργότερα» και η συνομιλία λήγει ως voice_agent_paused — ποτέ σιωπή. Μια συνομιλία που ήδη εξελίσσεται ολοκληρώνεται. Μόνο ένα live VoiceAgent μπορεί να τεθεί σε παύση (409 voice_agent_not_pausable)· η παύση ενός ήδη σε παύση δεν αλλάζει τίποτα (changed: false).
- 200
- 400
- 401
- 403
- 404
- 409
- 429
POST /v1/agents/{voice_agent_id}/rebuild rebuildVoiceAgent
Δοκιμάστε ξανά ένα αποτυχημένο build, με τα ίδια ή με νέα έγγραφα (έλεγχος πύλης πελατών
Για VoiceAgent του οποίου η νεότερη έκδοση απέτυχε. documents: "reuse" κάνει ξανά build εκείνης της έκδοσης από τα ήδη μεταφορτωμένα έγγραφα και ξεκινά αμέσως (202). documents: "replace" ανοίγει νέα έκδοση με τις ίδιες απαντήσεις και χωρίς έγγραφα (201)· μεταφορτώστε τα με createAgentDocumentUpload / confirmAgentDocument, έπειτα startVoiceAgentBuild. Με καταγραφή ελέγχου (voice_agent.rebuild_requested). Απαιτεί Idempotency-Key.
409 rebuild_refused όταν η νεότερη έκδοση δεν απέτυχε (δημιουργείται, περιμένει έγγραφα ή έχει ολοκληρωθεί)· 409 voice_agent_archived για αρχειοθετημένο VoiceAgent· 422 build_no_document για «reuse» όταν η αποτυχημένη έκδοση δεν έχει έγγραφο και το πρότυπο απαιτεί ένα.
Δέχεται σώμα αιτήματος JSON.
- 201
- 202
- 400
- 401
- 403
- 404
- 409
- 422
- 429
POST /v1/agents/{voice_agent_id}/resume resumeVoiceAgent
Αφήστε να απαντήσει ξανά ένα VoiceAgent που έθεσε σε παύση ο ιδιοκτήτης του (έλεγχος πύλης πελατών
paused → live, με καταγραφή ελέγχου (voice_agent.resumed). Ένα VoiceAgent που έθεσε σε παύση η WeTalk επανενεργοποιείται μόνο από τη WeTalk (409 voice_agent_paused_by_operator)· ένα που δεν βρίσκεται σε παύση είναι 409 voice_agent_not_paused· η επανενεργοποίηση ήδη ενεργού δεν αλλάζει τίποτα (changed: false).
- 200
- 400
- 401
- 403
- 404
- 409
- 429
POST /v1/agents/{voice_agent_id}/sandbox-turns createSandboxTurn
Πληκτρολογήστε μία γραμμή ως καλών και λάβετε την απάντηση της ενεργής έκδοσης.
Μια δοκιμή κειμένου με τον βοηθό, στην οποία απαντά το agent_runtime από το prompt της έκδοσης μέσω της συστοιχίας μοντέλων — αυτό που θα άκουγε ένας καλών, ως κείμενο. Δωρεάν (AC-38): δεν ελέγχεται υπόλοιπο και δεν χρεώνεται τίποτα. turn είναι όσα παρήγαγε αυτό το αίτημα, με τη σειρά — η καταγεγραμμένη γραμμή, η απάντηση και μία system γραμμή όταν ο βοηθός θα εκτελούσε κάτι (μια δοκιμή κειμένου δεν εκτελεί τίποτα: δεν καταχωρίζεται παραγγελία) — όχι ολόκληρη η συνομιλία.
Η συνομιλία κειμένου είναι συνομιλία (medium = web_chat, is_test), οπότε εμφανίζεται στο Ιστορικό ως δοκιμή. Στείλτε ξανά το επιστρεφόμενο conversation_id για να τη συνεχίσετε· η συνομιλία παραμένει στην έκδοση που χρησιμοποιήθηκε στην πρώτη σειρά ομιλίας. Παραλείψτε το για νέα συνομιλία στην ενεργή έκδοση ή στείλτε agent_version_id για να ξεκινήσετε σε ολοκληρωμένη έκδοση που δεν έχει ακόμη δημοσιευτεί (μια επεξεργασία, έλεγχος πύλης πελατών #75): 422 agent_version_not_ready εκτός αν εκείνη η έκδοση είναι ready.
Ελέγχεται με αυτή τη σειρά: text (μη κενό, έως 2000 χαρακτήρες)· ο βοηθός (404 voice_agent_not_found)· η ενεργή έκδοσή του (422 agent_version_not_ready)· η γλώσσα (422 language_unavailable)· η συνομιλία κειμένου (404 conversation_not_found). Ένα μοντέλο σε ανάπαυση δίνει 503 model_pool_unavailable και ένα runtime που δεν απαντά δίνει 503 agent_runtime_unavailable — δηλώνεται πριν γραφτεί οτιδήποτε.
plan-015 TC2: μια έρευνα με δύο ομάδες ερωτήσεων χρειάζεται survey_arm (A = ομάδα 1, B = ομάδα 2) σε κάθε σειρά ομιλίας της συνομιλίας της· απορρίπτεται για μία ομάδα ή απουσία έρευνας (400 validation_failed, πεδίο survey_arm). opening: true σε νέα συνομιλία κειμένου βοηθό που κάνει κλήσεις απαντά τη σειρά ομιλίας 0 — τον χαιρετισμό του, πριν πληκτρολογήσει οτιδήποτε ο δοκιμαστής — αποθηκευμένο όπως κάθε γραμμή και δωρεάν.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 422
- 429
- 503
GET /v1/agents/{voice_agent_id}/signalling listVoiceAgentSignallingEvents
Πρόσφατη σηματοδοσία SIP για αυτό το VoiceAgent.
Οι εγγραφές που συνέθεσε η WeTalk αντί να παρατηρήσει περιέχουν synthesised: true, επειδή ορισμένοι πάροχοι δεν εκθέτουν REGISTER ή κωδικό απάντησης και ένα κατασκευασμένο στοιχείο που παρουσιάζεται ως παρατηρημένο είναι χειρότερο από ένα κενό.
GET /v1/agents/{voice_agent_id}/sip getVoiceAgentSip
Η διεύθυνση SIP δικής σας σύνδεσης για αυτό το VoiceAgent (παλαιότερη λειτουργία).
Παλαιότερη λειτουργία (P10). Το διαπιστευτήριο SIP ανά VoiceAgent της εποχής παρόχου. Παραμένει και απαντά όπως πριν, αλλά δεν είναι SIP trunk πελάτη και η πύλη δεν το εμφανίζει πλέον: συνδέστε το δικό σας trunk με /v1/sip-trunks.
Η διεύθυνση είναι στο domain του παρόχου, όχι της WeTalk, και το sip_address_owner το δηλώνει. Τα προσαρμοσμένα domains SIP της Telnyx υπάρχουν μόνο σε συνδέσεις IP, FQDN και Teams-auth, ενώ οι συνδέσεις διαπιστευτηρίων που απαιτούν τα ονόματα ανά VoiceAgent δεν μπορούν να διαθέτουν τέτοιο domain.
POST /v1/agents/{voice_agent_id}/sip/rotation requestSipRotation
Ζητήστε νέο κωδικό πρόσβασης SIP για αυτό το VoiceAgent (παλαιότερη λειτουργία).
Παλαιότερη λειτουργία (P10). Αλλάζει το διαπιστευτήριο SIP ανά VoiceAgent της εποχής παρόχου· ο κωδικός πρόσβασης ενός trunk πελάτη αντικαθίσταται με PUT /v1/sip-trunks/{sip_trunk_id}/password.
Έγινε δεκτό, δεν εφαρμόστηκε. Το worker εκδίδει το νέο μυστικό στον πάροχο και το γράφει στον χώρο κλειδιών· μέχρι τότε, ο υπάρχων κωδικός πρόσβασης λειτουργεί. Το τμήμα χρήστη της διεύθυνσης SIP δεν αλλάζει, οπότε δεν χρειάζεται αλλαγή προορισμού.
GET /v1/agents/{voice_agent_id}/test-calls readTestCall
Πώς εξελίσσεται μια δοκιμαστική φωνητική κλήση — τηλεφωνική ή περιηγητή.
Τηλεφωνική δοκιμή: μετά το createTestCall, η κονσόλα το διαβάζει με party_number και since μέχρι να φτάσει και να λήξει η κλήση του δοκιμαστή: state = idle όσο δεν έχει έρθει τίποτα από party_number από τη στιγμή since, έπειτα dialing, live και ended, με το id της συνομιλίας (για τη ζωντανή ροή απομαγνητοφώνησης) και, όταν λήξει, τα χρεωμένα δευτερόλεπτα και το ποσό.
Δοκιμή περιηγητή (plan-004, από 2026-09-26): μετά το createBrowserTestCall, διαβάστε το με conversation_id αντί αυτού. state = connecting μέχρι η εισδοχή να αναλάβει τη συνομιλία — πριν συνδεθεί ο περιηγητής (καμία εγγραφή ακόμη) και όσο έχει συνδεθεί αλλά δεν έχει απαντηθεί ακόμη — έπειτα live και ended, όπως σε τηλεφωνική δοκιμή. Ένα id που δεν ξεκίνησε αυτός ο χώρος εργασίας είναι 404.
Προσδιορίστε τη δοκιμή με έναν τρόπο: conversation_id, ή party_number και since — και τα δύο δίνουν 400.
POST /v1/agents/{voice_agent_id}/test-calls createTestCall
Πραγματοποιήστε δοκιμαστική φωνητική κλήση στην ενεργή έκδοση του βοηθού.
agent_calls_me καλεί party_number από τον βοηθό· i_call_the_agent απαντά state = idle και θεωρεί την επόμενη εισερχόμενη συνομιλία από party_number, εντός 120 δευτερολέπτων, ως τη δοκιμή. Και στις δύο περιπτώσεις η συνομιλία εκτελείται στην ενεργή έκδοση μέσω των πραγματικών συνδέσεων, επισημαίνεται ως is_test, και χρεώνεται όπως κάθε άλλο λεπτό (AC-38).
Ελέγχεται με αυτή τη σειρά: το σώμα (party_number απαιτείται και στις δύο κατευθύνσεις — στην εισερχόμενη κλήση, έτσι αναγνωρίζεται η δοκιμή)· ο βοηθός (404 voice_agent_not_found)· η ενεργή έκδοσή του (422 agent_version_not_ready, με λόγια που δηλώνουν αν το build απέτυχε ή εκτελείται ακόμη)· η γλώσσα (422 language_unavailable).
Έπειτα, και στις δύο κατευθύνσεις: ο βοηθός πρέπει να απαντά κλήσεις (422 voice_agent_paused) και να διαθέτει αριθμό (422 tenant_resolution_failed, «δεν έχει ακόμη αριθμό τηλεφώνου» — τον αριθμό προς κλήση ή τον αριθμό προέλευσης)· για agent_calls_me, party_number δεν πρέπει να βρίσκεται στη λίστα μη κλήσης του λογαριασμού για όλους τους βοηθούς ή για αυτόν (422 contact_suppressed)· το τρέχον υπόλοιπο (402 trial_exhausted, credit_exhausted ή hard_stop_reached) και ο μηνιαίος προϋπολογισμός του χώρου εργασίας (402 budget_exceeded) πρέπει να πληρώνουν ένα δευτερόλεπτό της.
i_call_the_agent: το agent_runtime θέτει τον αριθμό του δοκιμαστή σε αναμονή δοκιμής — 503 model_pool_unavailable όταν το μοντέλο είναι σε ανάπαυση, 503 agent_runtime_unavailable όταν το runtime δεν απαντά — και η απάντηση είναι 201 με state = idle, dial_number (ο αριθμός προς κλήση), waiting_since και waiting_until.
agent_calls_me (από 2026-09-25): το agent_runtime καλεί party_number από τον αριθμό του ίδιου του βοηθού — dial_number στην απάντηση, ώστε η κονσόλα να αναφέρει ποιος αριθμός θα καλέσει. Απορρίπτεται πριν χτυπήσει οτιδήποτε με 503 model_pool_unavailable όταν το μοντέλο είναι σε ανάπαυση ή όταν κάθε ελεύθερη γραμμή κρατείται για εισερχόμενους καλούντες (τα εισερχόμενα προηγούνται των εξερχομένων), 503 agent_runtime_unavailable όταν το runtime δεν απαντά ή επανεκκινείται, 502 carrier_failed όταν ο πάροχος απορρίπτει την κλήση, 422 tenant_resolution_failed όταν ο αριθμός δεν φτάνει πλέον στον βοηθό. Η απάντηση είναι 201 με state = dialing, dial_number, waiting_since και waiting_until (όταν σταματά το κουδούνισμα). Ένα τηλέφωνο που δεν απαντάται ή είναι απασχολημένο ή απορρίπτει τερματίζει τη συνομιλία με end_reason no_answer ή busy, χωρίς χρέωση.
Διαβάστε την εξέλιξη της κλήσης με GET σε αυτή τη διαδρομή. Δεν γράφεται τίποτα εδώ: το runtime γράφει τη συνομιλία όταν ο πάροχος αναφέρει το σκέλος, με ένδειξη is_test, και χρεώνεται όπως κάθε άλλο λεπτό από τη στιγμή που απαντάται.
Αριθμός στο SIP trunk του ίδιου του λογαριασμού (plan-008, από 2026-09-30). Ο αριθμός του βοηθού είναι ο πρώτος ενεργοποιημένος αριθμός παρόχου του· όταν δεν έχει κανέναν, ο ενεργοποιημένος αριθμός trunk του (σύνδεση sip_trunk_number , πρώτα μία που επιτρέπεται ως caller ID). Ένας αριθμός παρόχου έχει προτεραιότητα όταν ο βοηθός διαθέτει και τα δύο. Ένας αριθμός trunk προσεγγίζεται μέσω του trunk, με τους ίδιους κανόνες όπως createSipTrunkTestCall:
- agent_calls_me καλεί party_number μέσω του trunk από τον αριθμό trunk (origin: test_call, ο προεπιλεγμένος χρόνος κουδουνίσματος του trunk). Πριν χτυπήσει οτιδήποτε: ένα κλειδί χρειάζεται επίσης conversation:dial (403 scope_insufficient)· τα όρια κλήσης ανά λεπτό που μοιράζονται με startOutboundConversation (10 ανά λογαριασμό, 3 ανά κλειδί: 429 rate_limited, με Retry-After)· το trunk δεν είναι απενεργοποιημένο (422 sip_trunk_disabled)· ο αριθμός επιτρέπεται ως caller ID (422 caller_id_not_bound)· οι κανόνες προορισμού (422 destination_refused)· η λίστα μη κλήσης (422 contact_suppressed)· το υπόλοιπο (402). Οι απορρίψεις του ίδιου του runtime: 429 daily_ceiling_reached, 422 sip_trunk_unverified, 503 all_lines_busy, 503 sip_edge_unavailable, 503 model_pool_unavailable, 503 agent_runtime_unavailable. Το runtime ανοίγει τη συνομιλία πριν απαντήσει, επομένως το 201 περιέχει το conversation_id με state = dialing, dial_number (τον αριθμό trunk), waiting_since και waiting_until; GET σε αυτή τη διαδρομή το διαβάζει όπως μια δοκιμαστική κλήση παρόχου και το endTestCall την τερματίζει μέσω του trunk. Ένα σκέλος που δεν μπόρεσε να φτάσει στο τηλέφωνο λήγει ως unreachable, χωρίς χρέωση. - i_call_the_agent απαιτεί η WeTalk να δέχεται κλήσεις μέσω trunks πελατών: όσο οι εισερχόμενες SIP της πλατφόρμας είναι κλειστές, είναι 422 sip_trunk_inbound_off («Οι κλήσεις προς … περνούν μέσω του δικού σας τηλεφωνικού συστήματος και η WeTalk δεν δέχεται ακόμη κλήσεις μέσω τηλεφωνικών συστημάτων.»), πριν διαβαστεί το υπόλοιπο. Όταν ενεργοποιηθεί, τίθεται σε αναμονή δοκιμής ο ίδιος ο αριθμός trunk (waiting_until είναι όταν λήγει η αναμονή δοκιμής), και ένα trunk μη έτοιμο για εισερχόμενα είναι 422 sip_trunk_inbound_off.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 402
- 403
- 404
- 422
- 429
- 503
POST /v1/agents/{voice_agent_id}/test-calls/arm/release releaseTestCallArm
Σταματήστε το «Το τηλέφωνό μου» να περιμένει την κλήση του δοκιμαστή (plan-015 TC1).
Ακυρώνει την αναμονή δοκιμής όταν κλείνει το πάνελ δοκιμών. Μια μεταγενέστερη κλήση από εκείνο το τηλέφωνο είναι κανονική συνομιλία, όχι δοκιμή. Idempotent: 204 είτε ο αριθμός βρισκόταν σε αναμονή δοκιμής είτε όχι. Ο αριθμός του δοκιμαστή βρίσκεται στο σώμα, ποτέ στο URL.
Δέχεται σώμα αιτήματος JSON.
- 204
- 400
- 401
- 403
- 404
- 429
- 503
POST /v1/agents/{voice_agent_id}/test-calls/arm/renew renewTestCallArm
Διατηρήστε το «Το τηλέφωνό μου» σε αναμονή της κλήσης του δοκιμαστή (plan-015 TC1).
Μετακινεί ξανά το τέλος ενός παραθύρου «Εγώ καλώ τον βοηθό» σε αναμονή κατά το παράθυρο αναμονής της πλατφόρμας (δέκα λεπτά), διατηρώντας την αρχή του: η απάντηση είναι waiting_since (αμετάβλητο) και το νέο waiting_until. Η κονσόλα Δοκιμών ανανεώνει στα μισά του παραθύρου όσο το πάνελ είναι ανοικτό. Αναμονή που έληξε ή χρησιμοποιήθηκε ήδη από κλήση δεν επαναφέρεται: 404 test_call_arm_not_found, και η κονσόλα θέτει εκ νέου αναμονή με createTestCall. Ο αριθμός του δοκιμαστή βρίσκεται στο σώμα, ποτέ στο URL. Δεν γίνεται κλήση ή χρέωση.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 429
- 503
GET /v1/agents/{voice_agent_id}/test-suites getVoiceAgentTestSuites
Οι σουίτες δοκιμών για αυτό το VoiceAgent, με την πιο πρόσφατη εκτέλεση καθεμίας.
Επιτυχία και αποτυχία ανά περίπτωση, με το κείμενο αποτελέσματος και το απόσπασμα απομαγνητοφώνησης που δείχνει την αποτυχία. Μια αποτυχημένη περίπτωση δεν εμποδίζει τη δημοσίευση (AC-15) — δεν υπάρχει περιορισμός που συνδέει την ενεργή έκδοση με επιτυχή εκτέλεση — επομένως η εκτέλεση καταγράφει σε ποια agent_version_id έγινε και η αποτυχία παραμένει ανακτήσιμη για την έκδοση που δημοσιεύτηκε ούτως ή άλλως.
Η ανάγνωση μιας εκτέλεσης δεν την εκτελεί. Η πραγματοποίηση δοκιμαστικής συνομιλίας χρειάζεται το runtime και ανήκει στην κονσόλα Δοκιμών (P11-09)· αυτή η διαδρομή διαβάζει όσα έχουν ήδη εκτελεστεί.
GET /v1/agents/{voice_agent_id}/versions listAgentVersions
Κάθε έκδοση αυτού του VoiceAgent, με τις νεότερες πρώτα.
Το ίδιο το έγγραφο διαμόρφωσης δεν περιλαμβάνεται στην προβολή της λίστας: περιέχει ολόκληρο τον εξαγμένο κατάλογο και η οθόνη εκδόσεων εμφανίζει ετικέτα, ημερομηνία, συντάκτη, σημείωση και λίστα αλλαγών. Διαβάστε μία έκδοση για να λάβετε το έγγραφό της.
GET /v1/agents/{voice_agent_id}/versions/{agent_version_id} getAgentVersion
Μία έκδοση, με το έγγραφο διαμόρφωσης στο οποίο μετατράπηκε κατά το build.
GET /v1/agents/{voice_agent_id}/versions/{agent_version_id}/documents listAgentVersionDocuments
Τα έγγραφα πηγής από τα οποία δημιουργήθηκε αυτή η έκδοση.
Τα έγγραφα ορίζονται σταθερά ανά έκδοση, ώστε όσα χρησιμοποιεί μια ενεργή έκδοση για να απαντήσει να μπορούν πάντα να ληφθούν ακριβώς όπως μεταφορτώθηκαν.
POST /v1/agents/{voice_agent_id}/versions/{agent_version_id}/publish publishAgentVersion
Ορίστε αυτή την έκδοση ως εκείνη στην οποία καταλήγουν οι νέες συνομιλίες.
Ενημέρωση μίας εγγραφής. Οι συνομιλίες που ήδη εξελίσσονται κρατούν τη διαμόρφωση που επιλύθηκε κατά την εισδοχή και ολοκληρώνονται στην προηγούμενη έκδοση· η επόμενη νέα συνομιλία παίρνει αυτήν. expected_live_version_seq είναι η ακολουθία που διαβάσατε τελευταία — μια ασυμφωνία δίνει 409 αντί για σιωπηρή αντικατάσταση της απόφασης κάποιου άλλου.
Ένα ΠΡΟΣΧΕΔΙΟ (plan-015, ADR 0043) — έκδοση από απαντήσεις, διορθώσεις πληρωμένου ελέγχου ή επεξεργασία, που δεν δημοσιεύτηκε ποτέ — καταγράφει την έκδοση που ήταν ενεργή όταν δημιουργήθηκε. Αν δεν είναι πλέον η ενεργή έκδοση, η δημοσίευσή του θα αντικαθιστούσε όσα ενεργοποιήθηκαν έκτοτε, επομένως απαντά 409 draft_base_changed (με error.detail.base_agent_version_id, base_label, live_agent_version_id, live_label) εκτός αν το σώμα δηλώνει acknowledge_base_change: true. Ένα παλιό expected_live_version_seq ελέγχεται πρώτο.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 429
POST /v1/agents/{voice_agent_id}/versions/{agent_version_id}/restore restoreAgentVersion
Επιστρέψτε σε προηγούμενη έκδοση. Η ίδια λειτουργία με τη δημοσίευση.
Ίδιο με τη δημοσίευση, με id παλαιότερης έκδοσης και την ίδια εγγύηση για τις συνομιλίες που ήδη εξελίσσονται. Δεν υπάρχει ξεχωριστή διαδρομή επαναφοράς.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 429
GET /v1/builds/{build_job_id} getBuildJob
Ένα build όπως ισχύει τώρα — τα βήματα, η πρόοδος ή ο λόγος αποτυχίας του (έλεγχος πύλης πελατών
Αυτό που διαβάζει η οθόνη Δημιουργίας κατά τη φόρτωση και όταν η ροή της δηλώνει αλλαγή, ώστε μια επαναφόρτωση, δεύτερη καρτέλα ή σύνδεσμος που ανοίγει αργότερα να δείχνει την πραγματική κατάσταση. Η αποτυχία περιέχει την πρόταση για τον ιδιοκτήτη και το σφάλμα, ποτέ την τεχνική λεπτομέρεια του operator.
GET /v1/connections listConnections
Τα συστήματα που μπορεί να καλέσει μία έκδοση ενός VoiceAgent, με τις λίστες επιτρεπόμενων λειτουργιών τους.
POST /v1/connections createConnection
Καταχωρίστε ένα σύστημα που μπορεί να καλέσει το VoiceAgent και τις λειτουργίες που μπορεί να χρησιμοποιήσει.
Το μεταφορτωμένο έγγραφο OpenAPI 3 ή Swagger 2 αναλύεται εδώ και το operation_id πρέπει να αναφέρει λειτουργίες που δηλώνει εκείνο το έγγραφο. Η προκύπτουσα λίστα είναι η λίστα επιτρεπόμενων λειτουργιών: το runtime δεν μπορεί να καλέσει τίποτα άλλο και κάθε τέτοια απόπειρα αποκλείεται και γράφεται στο χρονολόγιο συμβάντων της ίδιας της συνομιλίας.
Δέχεται σώμα αιτήματος JSON.
GET /v1/connections/{connection_id} getConnection
Μία σύνδεση και η λίστα επιτρεπόμενων λειτουργιών της.
POST /v1/connections/read-spec readConnectionSpec
Διαβάστε μια μεταφορτωμένη προδιαγραφή και απαριθμήστε τις λειτουργίες που προσφέρει.
Δεν αποθηκεύει τίποτα. Αυτό είναι το βήμα «διαβάσαμε το αρχείο σας, ορίστε τι προσφέρει» του οδηγού, από το οποίο ο πελάτης επιλέγει τη λίστα επιτρεπόμενων λειτουργιών.
Δέχεται σώμα αιτήματος JSON.
POST /v1/document-previews createDocumentPreviewUpload
Προετοιμάστε ένα μενού για προεπισκόπηση — ή επιστρέψτε την προεπισκόπηση του ίδιου αρχείου που έχει ήδη διαβαστεί.
Αναφέρει το πρότυπο, τη γλώσσα του μενού και το αρχείο (μέγεθος και SHA-256). Όταν αυτός ο χώρος εργασίας έχει ήδη προεπισκόπηση του ίδιου ακριβώς αρχείου για το ίδιο πρότυπο και γλώσσα — διαβασμένη ή υπό ανάγνωση — επιστρέφεται αμέσως (200, upload: null): η επισύναψη του ίδιου αρχείου ξανά δεν κοστίζει τίποτα και δεν το διαβάζει ξανά. Διαφορετικά (201) η προεπισκόπηση είναι uploading και upload είναι σύνδεσμος μικρής διάρκειας, μόνο για εγγραφή, στον οποίο ο περιηγητής στέλνει τα bytes με PUT και ακριβώς τις δοθείσες κεφαλίδες· έπειτα καλέστε confirmDocumentPreview.
Κάθε νέα προεπισκόπηση είναι ανάγνωση από το μοντέλο: έως το όριο της πλατφόρμας ανά άτομο ανά ώρα (429 rate_limited, με Retry-After). Προεπισκοπήσεις έχουν μόνο τα πρότυπα που διαβάζουν μενού (422 validation_failed στο agent_template_code). Μια προεπισκόπηση διατηρείται για το διάστημα διατήρησης της πλατφόρμας και έπειτα αφαιρείται.
Δέχεται σώμα αιτήματος JSON.
- 200
- 201
- 400
- 401
- 403
- 413
- 415
- 422
- 429
GET /v1/document-previews/{document_preview_id} readDocumentPreview
Μία προεπισκόπηση μενού — ελέγχετε περιοδικά όσο διαβάζεται.
POST /v1/document-previews/{document_preview_id}/confirm confirmDocumentPreview
Ελέγξτε το μεταφορτωμένο μενού και ξεκινήστε την ανάγνωσή του.
Διαβάζει ξανά το αποθηκευμένο αρχείο και ελέγχει ότι μέγεθος, τύπος περιεχομένου και SHA-256 είναι τα δηλωμένα· μια ασυμφωνία το απορρίπτει (422 document_mismatch). Έπειτα, όταν έχει ήδη διαβαστεί προεπισκόπηση του ίδιου αρχείου, αυτή η μεταφόρτωση ενσωματώνεται σε εκείνη και επιστρέφεται η υπάρχουσα προεπισκόπηση· διαφορετικά η προεπισκόπηση είναι queued και η WeTalk διαβάζει το μενού στο παρασκήνιο. Ελέγχετε περιοδικά το readDocumentPreview μέχρι να είναι done ή failed. Η επιβεβαίωση προεπισκόπησης που δεν είναι πλέον uploading την επιστρέφει όπως είναι.
- 200
- 400
- 401
- 403
- 404
- 422
- 429
GET /v1/messaging/conversations listMessagingConversations
Συνομιλίες στα widgets ιστοτόπου του χώρου εργασίας, γραπτές ή φωνητικές.
Ο πίνακας συνομιλιών της σελίδας Μηνυμάτων (plan-004 WC-90, design §17.10.7): κάθε συνομιλία σε σύνδεση καναλιού web_chat_widget — web_chat και φωνή widget — με τον επισκέπτη (visitor_tag, ποτέ το κλειδί), την ετικέτα καναλιού, την τελευταία γραμμή που ειπώθηκε, το αποτέλεσμα και τον χρόνο. Η δοκιμαστική συνομιλία της ίδιας της κονσόλας δεν έχει σύνδεση και δεν εμφανίζεται.
Διαβάζεται σύμφωνα με την ορατότητα του αναγνώστη: party_address επιστρέφει null για Member και Viewer — conversation_visible το θέτει NULL στη βάση δεδομένων — και last_message είναι null για Viewer, του οποίου ο ρόλος δεν περιλαμβάνει όσα ειπώθηκαν (transcript_withheld).
GET /v1/messaging/media listMessagingMedia
Τα τέσσερα μέσα και αν καθένα μπορεί να μεταφέρει συνομιλία σήμερα.
GET /v1/messaging/media/{medium_code} getMessagingMedium
Ένα μέσο πλήρως — συνδεδεμένο, σύντομα διαθέσιμο ή μη συνδεδεμένο.
Αποκωδικοποιεί βάσει του MessagingMediumDetail και για τα τέσσερα μέσα. Για web_chat περιέχει επίσης κάθε widget ιστοτόπου (widget, το καθένα με το απόσπασμα κώδικα, τις γραμμές CSP και την κατάστασή του) και install (το URL του script και την πρόταση χρέωσης)· για τα άλλα μέσα το widget είναι κενό και το install είναι null.
POST /v1/messaging/media/{medium_code}/connection connectMessagingMedium
Συνδέστε ένα μέσο σε VoiceAgent.
Απορρίπτεται με 409 για μέσο σε λίστα αναμονής και για voice — αριθμός, trunk και εναλλασσόμενος κωδικός SIP ανήκουν στην περιοχή Αριθμοί και SIP, και η σύνδεση αριθμού σε δύο μέρη οδηγεί σε λάθος στο ένα. Η απόρριψη δηλώνει ποια από τις δύο περιπτώσεις ισχύει.
Για web_chat το σώμα χρειάζεται επίσης site_origin — τη διεύθυνση του ιστοτόπου όπου τοποθετείται η συνομιλία (https://host[:port]· απλό http μόνο για localhost) — που γίνεται η πρώτη επιτρεπόμενη προέλευση του widget. Ένας φωνητικός βοηθός που έχει ήδη widget λαμβάνει πίσω εκείνο το widget, επανενεργοποιημένο, με προσθήκη της διεύθυνσης (200)· διαφορετικά δημιουργείται νέο (201). Το κλειδί widget είναι το id της σύνδεσης: δημόσιο αναγνωριστικό επικολλημένο στη σελίδα του πελάτη, χωρίς scope ή μυστικό.
Δέχεται σώμα αιτήματος JSON.
- 200
- 201
- 400
- 401
- 403
- 404
- 409
- 429
POST /v1/messaging/media/{medium_code}/disconnection disconnectMessagingMedium
Σταματήστε την απάντηση σε ένα μέσο, διατηρώντας το ιστορικό του.
Απενεργοποιεί τις συνδέσεις του χώρου εργασίας σε αυτό το μέσο. Δεν διαγράφεται τίποτα: οι συνομιλίες αναφέρονται στη σύνδεση και μια διαγραφή θα έπρεπε να επιλέξει μεταξύ παραβίασης του ξένου κλειδιού και αφαίρεσης των απομαγνητοφωνήσεων μαζί της. Κάθε widget ιστοτόπου που απενεργοποιείται καταγράφεται στο αρχείο ελέγχου.
PATCH /v1/messaging/media/web_chat/widgets/{channel_binding_id} updateWebChatWidget
Ενεργοποιήστε ή απενεργοποιήστε ένα widget ιστοτόπου και τη φωνή του.
{ enabled?, voice_enabled? } — τουλάχιστον ένα. Η ενεργοποίηση οποιουδήποτε χρειάζεται τουλάχιστον μία επιτρεπόμενη προέλευση (422 origin_list_empty). Η απενεργοποίηση της συνομιλίας σταματά αμέσως την απάντηση. Κάθε αλλαγή γράφει μία εγγραφή ελέγχου· ένα αίτημα χωρίς αλλαγές δεν γράφει καμία. Μόνο Owners και Admins.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 422
- 429
POST /v1/messaging/media/web_chat/widgets/{channel_binding_id}/disconnection disconnectWebChatWidget
Αποσυνδέστε ένα widget ιστοτόπου, διατηρώντας το ιστορικό του.
Απενεργοποιεί το widget και τη φωνή του και διαγράφει τις επιτρεπόμενες προελεύσεις· η σελίδα έπειτα το εμφανίζει ως μη συνδεδεμένο. Δεν διαγράφεται τίποτα από το Ιστορικό και η επανασύνδεση του ίδιου φωνητικού βοηθού επαναφέρει το ίδιο κλειδί widget. Μόνο Owners και Admins.
PUT /v1/messaging/media/web_chat/widgets/{channel_binding_id}/origins replaceWebChatWidgetOrigins
Αντικαταστήστε τους ιστοτόπους στους οποίους απαντά ένα widget ιστοτόπου.
{ allowed_origin: [...] } αντικαθιστά ολόκληρη τη λίστα. Κάθε τιμή κανονικοποιείται σε scheme://host[:port] (πεζά, με αφαίρεση της προεπιλεγμένης θύρας)· https μόνο, εκτός από http://localhost:<port>. Έως 20 μετά την αφαίρεση διπλοτύπων. Τιμή που δεν είναι διεύθυνση ιστοτόπου → 400 origin_invalid με αναφορά του allowed_origin[<i>]· κενή λίστα όσο η συνομιλία ή η φωνή της είναι ενεργή → 422 origin_list_empty. Ο έλεγχος προέλευσης εμποδίζει την ενσωμάτωση του widget σε άλλο ιστότοπο· δεν είναι έλεγχος ταυτότητας. Μόνο Owners και Admins.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 422
- 429
GET /v1/numbers listNumbers
Κάθε αριθμός στον χώρο εργασίας, συνδεδεμένος ή όχι.
Η λίστα ανά VoiceAgent δεν μπορεί να εξυπηρετήσει αυτή την οθόνη: ένας αριθμός χωρίς σύνδεση δεν έχει VoiceAgent κάτω από το οποίο να εμφανιστεί και αυτή ακριβώς είναι η εγγραφή που ανοίγει ο πελάτης στους Αριθμούς και SIP για να διορθώσει. Οι αριθμοί του δικού σας SIP trunk εμφανίζονται δίπλα στους αριθμούς παρόχου, με provider: sip_trunk και το όνομα εμφάνισης του trunk. meta.sip_trunk_count μετρά τα SIP trunks πελατών του χώρου εργασίας (εξαιρούνται τα διαγραμμένα) — όχι τα παλαιότερα διαπιστευτήρια SIP ανά VoiceAgent.
Η επικεφαλίδα μετρά σκόπιμα αριθμούς και trunks και δεν ένα endpoint WebRTC: η υποδομή πολυμέσων περιηγητή παραμένει ανεπίλυτη (plan spike S8, risk R15), και η καταμέτρηση κάποιου στοιχείου που δεν μπορεί να μεταφέρει ήχο θα ήταν ισχυρισμός, όχι μέτρηση.
GET /v1/numbers/{phone_number_id}/activity getNumberActivity
Η τελευταία συνομιλία ενός αριθμού, το πλήθος του τρέχοντος μήνα και οι πέντε πιο πρόσφατες συνομιλίες του.
Όσα εμφανίζει η οθόνη Αριθμοί και SIP όταν ανοίγει ένας αριθμός: «Τελευταία κλήση», «Αυτόν τον μήνα» και «Πρόσφατη δραστηριότητα». Μια συνομιλία μετρά όταν ήρθε — ή, για εξερχόμενο σκέλος μέσω SIP trunk, έφυγε — μέσω φωνητικής σύνδεσης αυτού του αριθμού όσο τον κατείχε ο χώρος εργασίας (μεταξύ των purchased_at και released_at), που είναι ακριβώς όσα GET /v1/conversations?phone_number_id= απαριθμεί («Δείτε όλες τις κλήσεις σε αυτόν τον αριθμό»).
Το «Αυτόν τον μήνα» ξεκινά από την πρώτη χρονική στιγμή του τρέχοντος μήνα στη ζώνη ώρας του χώρου εργασίας. Οι δοκιμαστικές συνομιλίες μετρούν: είναι συνομιλίες σε αυτόν τον αριθμό. Διαβάζεται βάσει της ορατότητας του καλούντος, επομένως Member και Viewer λαμβάνουν party_address ως null, όπως στο Ιστορικό.
GET /v1/numbers/availability getNumberAvailability
Αν η WeTalk μπορεί να εκδώσει αριθμό σήμερα.
Απαντά waitlisted. Σε ποιες χώρες η WeTalk εκδίδει αριθμούς και ποιος αναλαμβάνει τα κανονιστικά δικαιολογητικά είναι ανοικτή απόφαση προϊόντος: ένας ελληνικός αριθμός +30 χρειάζεται απόδειξη ταυτότητας από κράτος μέλος της ΕΕ και απαιτεί ημέρες, ένας αμερικανικός δεν χρειάζεται. Η λεπτομέρεια αναφέρει τις δύο υπάρχουσες διαδρομές: αίτημα αριθμού που εκπληρώνει η WeTalk και «Σύνδεση trunk» για αριθμούς που ήδη έχετε στον δικό σας πάροχο VoIP (/v1/sip-trunks).
GET /v1/numbers/region-latency getRegionLatency
Περιοχή και καθυστέρηση μετ’ επιστροφής, μετρημένες από τη WeTalk.
Κανένα API παρόχου δεν το αναφέρει. Ούτε η Telnyx ούτε η Twilio εκθέτει σε πελάτη μέτρηση καθυστέρησης ανά περιοχή, επομένως το στοιχείο σχεδιασμού us-west · 4 ms είναι μέτρηση της WeTalk ή διακόσμηση. Τα δείγματα προέρχονται από region_latency_sample, τον πίνακα πλατφόρμας που δημιούργησε για αυτά το design §4.7· όταν δεν έγινε καμία ανίχνευση εντός του παραθύρου, η απάντηση δηλώνει measured: false και δεν περιέχει τιμή. Έναν εύλογο αριθμό χωρίς τεκμηρίωση θα τον επικαλούνταν ο πελάτης στη διάρκεια περιστατικού.
GET /v1/numbers/requests listNumberRequests
Τα αιτήματα αριθμών αυτού του χώρου εργασίας, με τα νεότερα πρώτα και ένδειξη αν ικανοποιήθηκε καθένα.
state παράγεται κατά την ανάγνωση: connected μόλις ο ζητούμενος βοηθός έχει συνδεδεμένο αριθμό κατά ή μετά το αίτημα, pending μέχρι τότε.
POST /v1/numbers/requests requestPhoneNumber
Ζητήστε από τη WeTalk να ορίσει αριθμό τηλεφώνου για έναν από τους βοηθούς σας.
Προς το παρόν οι αριθμοί ορίζονται από τη WeTalk. Αυτό καταγράφει το αίτημα — τον βοηθό που πρέπει να απαντά, τη χώρα και όσα πρέπει να γνωρίζει η WeTalk (αριθμό που ήδη κατέχετε, το δικό σας τηλεφωνικό σύστημα) — ως εγγραφή στο αρχείο ελέγχου σας (voice_agent.number_requested)· το id της εγγραφής είναι του αιτήματος. Ένας operator το διαβάζει από το API προσωπικού και αναθέτει τον αριθμό· το αίτημα έπειτα εμφανίζεται ως state: connected.
Δέχεται σώμα αιτήματος JSON.
GET /v1/optimisation-reviews/{optimisation_review_id} getOptimisationReview
Ένας έλεγχος βελτιστοποίησης, με τα ευρήματα και τις αποφάσεις τους.
recording_available_count μετριέται ξανά στο χρονικό παράθυρο του ελέγχου όπως ίσχυε όταν ζητήθηκε, με τη σημερινή διατήρηση. next_agent_version_label είναι η ετικέτα που θα λάμβανε το προσχέδιο. queued ορίζεται όσο ο έλεγχος περιμένει το worker.
PUT /v1/optimisation-reviews/{optimisation_review_id}/findings/{optimisation_finding_id}/decision decideOptimisationFinding
Αποδεχθείτε, απορρίψτε ή αναιρέστε την απόφαση για ένα εύρημα.
Τα ευρήματα αποφασίζονται ένα τη φορά και τίποτα δεν γίνεται δεκτό από προεπιλογή. Επιτρέπεται μόνο όσο ο έλεγχος είναι done και οι διορθώσεις του δεν βρίσκονται ακόμη σε προσχέδιο (409 optimisation_review_state_conflict διαφορετικά). Γράφει την εγγραφή ελέγχου optimisation_finding.decided.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 429
POST /v1/optimisation-reviews/{optimisation_review_id}/publish publishOptimisationReview
Αποθηκεύστε τις αποδεκτές διορθώσεις ως προσχέδιο έκδοσης — compare-and-set στην ενεργή ακολουθία.
Δημιουργεί προσχέδιο· δεν δημοσιεύει τίποτα (plan-015 DRF, ADR 0043 — «Δημιουργία προσχεδίου vN με N διορθώσεις»). Εφαρμόζει την αλλαγή διαμόρφωσης κάθε αποδεκτού ευρήματος στο έγγραφο διαμόρφωσης της ενεργής έκδοσης (μια αλλαγή μπορεί να τροποποιήσει μόνο τον χαιρετισμό, τον εξαγμένο κατάλογο, τις ώρες λειτουργίας, την υπερχείλιση και τη συμπεριφορά εκτός ωραρίου — ποτέ μεταφορές, συνδέσεις, διατύπωση συγκατάθεσης, γλώσσες, φωνή ή ταυτόχρονη εξυπηρέτηση), επικυρώνει το αποτέλεσμα και το εισάγει ως ready έκδοση χωρίς published_at και base_agent_version_id = την ενεργή έκδοση, εφόσον το live_version_seq εξακολουθεί να ισούται με expected_live_version_seq. Ο έλεγχος αναφέρει από τότε το προσχέδιο.
Η ενεργή έκδοση δεν αλλάζει: δεν υπάρχει agent_version.published μήνυμα outbox, live_version_seq επιστρέφει όπως ήταν και κάθε συνομιλία συνεχίζει να φτάνει στην ενεργή έκδοση μέχρι κάποιος με δικαίωμα δημοσίευσης να δημοσιεύσει το προσχέδιο από τις Εκδόσεις (publishAgentVersion). Γράφει τις εγγραφές ελέγχου agent_version.draft_created και optimisation_review.published. Η χρέωση παραμένει αμετάβλητη: ο έλεγχος χρεώθηκε όταν ολοκληρώθηκε και η αποθήκευση των διορθώσεών του ως προσχέδιο δεν μετακινεί χρήματα.
Ένας έλεγχος του οποίου το προσχέδιο δεν δημοσιεύτηκε ποτέ και δεν βασίζεται πλέον στην ενεργή έκδοση (άλλη έκδοση ενεργοποιήθηκε στο μεταξύ) μπορεί να το εκτελέσει ξανά: οι ίδιες αποδεκτές διορθώσεις εφαρμόζονται στο τρέχον ενεργό έγγραφο και ο έλεγχος αναφέρει το νέο προσχέδιο («Αναδημιουργία στην τρέχουσα έκδοση»). Ένα προσχέδιο που εξακολουθεί να βασίζεται στην ενεργή έκδοση ή έχει ήδη δημοσιευτεί είναι 409 optimisation_review_state_conflict.
Ένα live_version_seq που μετακινήθηκε από τότε που το διαβάσατε είναι 409 live_version_seq_stale χωρίς να αποθηκευτεί τίποτα: επαναφορτώστε και αποφασίστε ξανά, ποτέ επανάληψη με τον ίδιο αριθμό.
Το operationId διατηρεί το προηγούμενο όνομά του ώστε να μη χαλάσουν οι παραγόμενοι clients.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 429
POST /v1/public/widget-voice/{widget_key}/grants createWidgetVoiceGrant
Ξεκινήστε φωνητική συνομιλία από widget ιστοτόπου.
Χωρίς έλεγχο ταυτότητας. Πραγματική συνομιλία με τον βοηθό του widget μέσω της υπηρεσίας μεταφοράς φωνής περιηγητή της WeTalk, με χρέωση στον ιδιοκτήτη του ιστοτόπου όπως κάθε άλλο λεπτό από τη στιγμή που απαντάται, για έως max_duration_second (10 λεπτά).
Ελέγχεται με αυτή τη σειρά· κάθε απόρριψη δεν γράφει τίποτα και δεν δημιουργεί δωμάτιο: το στοιχείο του αιτήματος Origin είναι το πλαίσιο φωνής της WeTalk (403 origin_not_allowed)· το σώμα (400 validation_failed)· η απόδειξη εργασίας — γνήσια, μη ληγμένη, λυμένη και χωρίς προηγούμενη υποβολή (400 proof_of_work_failed)· έως δέκα άδειες από μία διεύθυνση δικτύου ανά ώρα (429 rate_limited)· το widget υπάρχει, είναι ενεργό και έχει ενεργή φωνή — μία απάντηση και για τα τρία (404 widget_voice_disabled); embedding_origin είναι ένας από τους επιτρεπόμενους ιστοτόπους του widget (403 origin_not_allowed)· ο βοηθός μπορεί να δεχθεί τώρα τη συνομιλία (503 widget_voice_unavailable — μία απάντηση ανεξάρτητα από την αιτία, ώστε ο επισκέπτης να μην μαθαίνει ποτέ την κατάσταση χρέωσης του ιδιοκτήτη)· όλες οι γραμμές του βοηθού απασχολημένες (503 all_lines_busy).
Σύνδεση στη συνομιλία κειμένου. Όταν ο επισκέπτης ήδη συνομιλεί γραπτώς, το πλαίσιο στέλνει το στοιχείο μίας χρήσης της συνομιλίας join_proof· η φωνή τότε συνδέεται σε εκείνη τη συνομιλία αντί να ξεκινήσει νέα, μετά από κάθε παραπάνω έλεγχο. Το agent runtime ελέγχει την απόδειξη: μια που απορρίπτει (ληγμένη, ήδη χρησιμοποιημένη, άλλου widget ή άλλου επισκέπτη) είναι 503 widget_voice_unavailable όπως κάθε άλλος λόγος. Χωρίς απόδειξη, η άδεια συμπεριφέρεται ακριβώς όπως πριν.
Ο έλεγχος επιτρεπόμενων ιστοτόπων εμποδίζει την ενσωμάτωση widget σε άλλο ιστότοπο· δεν είναι έλεγχος ταυτότητας. Η απόδειξη εργασίας, το όριο ανά διεύθυνση και η ταυτόχρονη εξυπηρέτηση του ίδιου του βοηθού είναι τα όρια κατάχρησης.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 403
- 404
- 429
- 502
- 503
GET /v1/public/widget-voice/challenge issueWidgetVoiceChallenge
Νέα πρόκληση απόδειξης εργασίας για το πλαίσιο φωνής του widget.
Χωρίς έλεγχο ταυτότητας. Πρόκληση ALTCHA — ο ίδιος αυτοφιλοξενούμενος έλεγχος, κλειδί και κόστος με τη δημόσια σελίδα εξαίρεσης (απόφαση προϊόντος A6) — υπογεγραμμένη από αυτό το API και έγκυρη για πέντε λεπτά. Το πλαίσιο φωνής τη λύνει και στέλνει τη λύση ως altcha σε createWidgetVoiceGrant· κάθε λυμένη πρόκληση γίνεται δεκτή μία φορά.
Μετριέται ανά διεύθυνση προέλευσης από τον δημόσιο περιοριστή του API, ώστε να μην μπορούν να συσσωρευτούν προκλήσεις. Δεν αποθηκεύεται ποτέ προσωρινά. Το στοιχείο σώματος data είναι η ίδια η μορφή πρόκλησης του ALTCHA (ονόματα πεδίων camelCase — ο επιλυτής διαβάζει ακριβώς αυτά).
GET /v1/sip listSipCredentials
Τα διαπιστευτήρια SIP του χώρου εργασίας, ένα ανά VoiceAgent (παλαιότερη λειτουργία).
Παλαιότερη λειτουργία (P10). Τα διαπιστευτήρια SIP ανά VoiceAgent της εποχής παρόχου. Η διαδρομή παραμένει και απαντά όπως πριν· η οθόνη Αριθμοί και SIP δεν τα εμφανίζει πλέον (η κάρτα trunk πελάτη, /v1/sip-trunks, αντικατέστησε την κάρτα διαπιστευτηρίων) και δεν μετρώνται στο listNumbers.meta.sip_trunk_count.
Ο κωδικός πρόσβασης δεν μεταφέρεται σε αυτή τη διεπαφή και δεν θα μεταφερθεί ποτέ: secret_ref είναι ΟΝΟΜΑ μυστικού στον χώρο κλειδιών. Η αλλαγή γίνεται με POST /v1/agents/{voice_agent_id}/sip/rotation, που γίνεται δεκτό και εφαρμόζεται από το worker.
POST /v1/test-calls/{conversation_id}/end endTestCall
Τερματίστε μια δοκιμαστική φωνητική κλήση.
Μπορεί να προσδιοριστεί μόνο δοκιμαστική φωνητική συνομιλία (is_test, medium = voice) του χώρου εργασίας του καλούντος· κάθε άλλο id — συμπεριλαμβανομένης πραγματικής συνομιλίας πελάτη — είναι 404 conversation_not_found. Μια δοκιμαστική κλήση που έχει ήδη λήξει επιστρέφει τα αποθηκευμένα στοιχεία της (state = ended), επομένως ο διπλός τερματισμός είναι ακίνδυνος. Μια ανοικτή τερματίζεται από το agent_runtime, που κατέχει το σκέλος παρόχου· η απάντηση είναι η κλήση όπως αποθηκεύεται εκείνη τη στιγμή (συνήθως ακόμη live — ο τερματισμός του παρόχου κλείνει την εγγραφή λίγο αργότερα), οπότε διαβάστε την ξανά με readTestCall. Το API δεν σημειώνει ποτέ ως ληγμένη κλήση που δεν τερμάτισε: όταν το runtime δεν εξυπηρετεί πλέον την κλήση ή δεν απαντά, είναι 503 agent_runtime_unavailable και η εγγραφή παραμένει ως έχει. billed_amount είναι η αξία των χρεωμένων δευτερολέπτων στην τιμή του λογαριασμού· charged_amount είναι όσα χρεώνει η τιμολόγηση αφού η δωρεάν δοκιμή καλύψει όσα καλύπτει (review #233)· το τιμολόγιο είναι το κλείσιμο ημέρας (design §7.9).
Μια δοκιμή περιηγητή (plan-004, από 2026-09-26) τερματίζεται μέσω του σκέλους WebRTC του agent_runtime, όχι παρόχου: ανοικτή συνομιλία στη σύνδεση περιηγητή του βοηθού ή — στα δευτερόλεπτα πριν το runtime ανοίξει την εγγραφή του — δοκιμή που ξεκίνησε ο καλών μόλις πριν (state = ended, end_reason = caller_hangup, χωρίς χρέωση). Μια δοκιμή περιηγητή που μόλις ξεκίνησε άλλο μέλος είναι 404, όπως ένα άγνωστο id.
Μια δοκιμαστική κλήση σε αριθμό trunk (plan-008, από 2026-09-30) τερματίζεται μέσω της διαδρομής τερματισμού του ίδιου του trunk, όπως την endSipTrunkTestCall τερματίζει. Μια κλήση που πραγματοποίησε ο δοκιμαστής προς αριθμό trunk δεν έχει διαδρομή τερματισμού: 422 validation_failed — κλείστε το τηλέφωνο.
- 200
- 400
- 401
- 403
- 404
- 422
- 429
- 503
GET /v1/test-calls/availability readTestCallAvailability
Τι μπορεί να δοκιμαστεί τώρα και γιατί όχι.
Διαβάζεται όταν ανοίγει η κονσόλα Δοκιμών ή μια καρτέλα Δοκιμής, ώστε μια δοκιμή που δεν μπορεί να εκτελεστεί να δηλώνεται πριν κάποιος πληκτρολογήσει ή πατήσει κουμπί. model_running είναι false εκτός των προγραμματισμένων παραθύρων της συστοιχίας μοντέλων· direction_available απαριθμεί τις κατευθύνσεις φωνητικών δοκιμών που μπορούν να πραγματοποιηθούν (μόνο εισερχόμενες: η πλατφόρμα δεν κάνει ακόμη εξερχόμενες κλήσεις)· message αναφέρει γιατί κάτι δεν μπορεί να εκτελεστεί, με λόγια για ένα άτομο. country_calling_code είναι του ίδιου του λογαριασμού (+30), για το παράδειγμα του πεδίου τηλεφώνου. browser_test_call_available (plan-004) αναφέρει αν μπορεί να ξεκινήσει δοκιμή περιηγητή — το runtime απάντησε, το μοντέλο εκτελείται και η υπηρεσία μεταφοράς φωνής περιηγητή της WeTalk είναι προσβάσιμη — με browser_test_call_message να αναφέρει γιατί όχι.
GET /v1/workspace/shared-agent-configurations listSharedVoiceAgentConfigurations
Οι κοινόχρηστες διαμορφώσεις βοηθών από τις οποίες μπορεί αυτός ο χώρος εργασίας να ξεκινήσει νέο βοηθό.
plan-014 (παράδοση B5): κάθε διαμόρφωση βοηθού που κοινοποίησε άλλος χώρος εργασίας του οργανισμού, την οποία αυτός ο χώρος αποδέχθηκε και δεν έχει ακόμη αντιγράψει, όσο η κοινοποίηση ισχύει και οι δύο χώροι εργασίας είναι ενεργοί — ακριβώς όσα το createVoiceAgent δέχεται ως resource_share_id. Καθεμία περιέχει το είδος βοηθού, τις γλώσσες, τη φωνή, τον χαιρετισμό, τον διακόπτη ηχογράφησης και την ταυτόχρονη εξυπηρέτηση της σταθερά ορισμένης έκδοσης, από τα οποία ξεκινά ο οδηγός. Κλήσεις, ηχογραφήσεις, αριθμοί και έγγραφα δεν μεταφέρονται ποτέ μαζί με διαμόρφωση. Owner ή Admin, όπως στη δημιουργία βοηθού.
Χρέωση
GET /v1/billing-accounts/{billing_account_id}/postpaid getPostpaid
Η σύμβαση μεταπληρωμής ενός υπολοίπου, η οφειλή του και το διαθέσιμο ποσό.
Το πιστωτικό όριο που ενέκρινε το WeTalk, η τρέχουσα οφειλή (χρεωμένη σε ανεξόφλητα μηνιαία τιμολόγια μαζί με τη χρήση που δεν τιμολογήθηκε ακόμη, συμπεριλαμβανομένων ανοικτών συνομιλιών — χωρίς διπλή προσμέτρηση), το διαθέσιμο ποσό (το τρέχον υπόλοιπο μαζί με το πιστωτικό όριο και την υπέρβαση· νέες πληρωμένες συνομιλίες σταματούν στο μηδέν), οι όροι (εξόφληση τιμολογίου 14 ημέρες μετά το τέλος του μήνα, με κάρτα ή τραπεζική μεταφορά), το πρόγραμμα «αν αποτύχει πληρωμή» (ημερομηνία λήξης, +7, +14), κάθε ανεξόφλητο τιμολόγιο με τα βήματα είσπραξης, το τελευταίο εξοφλημένο τιμολόγιο και η κατάσταση είσπραξης. Ένα προπληρωμένο υπόλοιπο απαντά contract: null. Η ανάγνωση δεν προχωρά καμία διαδικασία. Απαιτείται account.finance.read στο υπόλοιπο.
POST /v1/billing-accounts/{billing_account_id}/postpaid/pay payPostpaid
Πληρώστε ανεξόφλητο τιμολόγιο μεταπληρωμής με κάρτα — ανοίξτε τη σελίδα πληρωμής του παρόχου.
Ξεκινά μια statement_payment πράξη χρέωσης για το μικτό ποσό του τιμολογίου (παγωμένο στο κλείσιμο του μήνα) και επιστρέφει τη φιλοξενούμενη σελίδα πληρωμής για παραπομπή του ατόμου (next_action), ή επιστρέφει τη σελίδα όπου ήδη περιμένει ανοικτή πληρωμή του ίδιου τιμολογίου. Ποτέ δεύτερη προσπάθεια (409 payment_pending)· ένα ήδη εξοφλημένο τιμολόγιο ή χωρίς οφειλή είναι 409 operation_state_conflict· μια σύμβαση που πληρώνεται μόνο με τραπεζική μεταφορά είναι 409 conflict. Το αποτέλεσμα έρχεται από τον πάροχο· αυτή η απάντηση δεν αναφέρει αποτέλεσμα. Απαιτείται account.finance.manage.
- 202
- 400
- 401
- 403
- 404
- 409
- 429
POST /v1/billing-accounts/{billing_account_id}/refund-requests createRefundRequest
Ζητήστε επιστροφή αχρησιμοποίητης αγορασμένης πίστωσης· αποφασίζει χειριστής οικονομικών.
Μια πρόχειρη πράξη επιστροφής που περιμένει χειριστή με οικονομικά δικαιώματα (απόφαση ιδιοκτήτη OD-13). Με έγκριση, η πίστωση επιστρέφει στις αρχικές κάρτες, από την πιο πρόσφατη αγορά, και το υπόλοιπο με τραπεζική μεταφορά. Μόνο ένα αίτημα μπορεί να εκκρεμεί ανά υπόλοιπο (409 operation_conflict)· ποσό μεγαλύτερο από το επιστρέψιμο είναι 422 refund_not_refundable.
- 200
- 202
- 400
- 401
- 403
- 404
- 409
- 422
- 429
GET /v1/billing-accounts/{billing_account_id}/refundable getRefundable
Αχρησιμοποίητη αγορασμένη πίστωση σε υπόλοιπο.
POST /v1/billing-operations/{billing_operation_id}/pay payOperation
Πληρωμή τώρα — άνοιγμα (ή εκ νέου άνοιγμα) της σελίδας πληρωμής του παρόχου.
Επιβεβαιώνει αυτόματη ανανέωση πίστωσης που περιμένει κλικ (τρόπος είσπραξης hosted_notification) ή επιστρέφει τη σελίδα όπου ήδη περιμένει μια πράξη. Ποτέ δεύτερη προσπάθεια για πράξη που έχει ήδη μία (409 payment_pending).
GET /v1/billing-operations/{billing_operation_id}/payment getOperationPayment
Τι περιμένει μια πράξη χρέωσης και πώς συνεχίζεται.
Διαβάζει, χωρίς να προχωρά: το διαβάζει η σελίδα επιστροφής από τον πάροχο. Κατονομάζονται οι καταστάσεις «αναμονή τράπεζας» (διερεύνηση άγνωστου αποτελέσματος) και «πληρώθηκε, δεν εφαρμόστηκε» (συνεχίζεται ακριβώς μία φορά).
GET /v1/billing/auto-reload getAutoReloadPolicy
Ο κανόνας αυτόματης ανανέωσης πίστωσης.
Λογαριασμός χωρίς πολιτική δεν είναι 404 — configured: false είναι πραγματική κατάσταση και η οθόνη εμφανίζει τον διακόπτη κλειστό.
PUT /v1/billing/auto-reload putAutoReloadPolicy
Ορίστε τον κανόνα αυτόματης ανανέωσης πίστωσης.
Μια αλλαγή υπάρχουσας πολιτικής κατονομάζει την αναθεώρηση που διάβασε στο If-Match (400 validation_failed χωρίς αυτό) και απορρίπτεται με 409 revision_stale όταν η πολιτική άλλαξε έκτοτε — δύο αποθηκεύσεις από μία αναθεώρηση δεν μπορούν να επιτύχουν και οι δύο (plan-014 review I-9, 2026-10-06). Η πρώτη αποθήκευση δεν χρειάζεται αναθεώρηση· αν προηγήθηκε άλλη πρώτη αποθήκευση, απορρίπτεται με 409 revision_stale επίσης. Μία πολιτική ανά υπόλοιπο (migration 0114).
Δέχεται σώμα αιτήματος JSON.
GET /v1/billing/balance getBillingBalance
Το υπόλοιπο και τι πραγματικά απομένει για δαπάνη.
Επιστρέφει το εκκαθαρισμένο υπόλοιπο και το τρέχον. Απαντούν διαφορετικά ερωτήματα: το εκκαθαρισμένο ποσό είναι ό,τι χρεώθηκε και πληρώθηκε, το τρέχον αφαιρεί τα σημερινά μη τιμολογημένα δευτερόλεπτα και τις δεσμεύσεις ανοικτών συνομιλιών και είναι το ποσό με το οποίο αξιολογείται η υποχρεωτική διακοπή.
GET /v1/billing/budget getBudget
Οι έλεγχοι δαπανών του χώρου εργασίας.
Ο μηνιαίος προϋπολογισμός, το ποσοστό που στέλνει προειδοποίηση και η υποχρεωτική διακοπή. Χώρος εργασίας χωρίς ρύθμιση απαντά configured: false με προϋπολογισμό null αντί για 404: «δεν ορίστηκε προϋπολογισμός» είναι κατάσταση που εμφανίζει η οθόνη, όχι ανύπαρκτος πόρος.
PUT /v1/billing/budget putBudget
Ορίστε μηνιαίο προϋπολογισμό, ποσοστό ειδοποίησης και υποχρεωτική διακοπή.
Η υποχρεωτική διακοπή είναι εντολή, όχι ετυμηγορία. Η εγγραφή καταγράφει ότι οι βοηθοί πρέπει να σταματούν να απαντούν αντί να υπερβαίνουν τη δαπάνη· αν αυτό συνέβη αποφασίζεται σε κάθε αποδοχή από billingRefusalOf με βάση το τρέχον υπόλοιπο του design §7.9 — το εκκαθαρισμένο υπόλοιπο μείον τα σημερινά μη κοστολογημένα δευτερόλεπτα μείον ό,τι μπορεί να κοστίσουν ακόμη οι συνομιλίες σε εξέλιξη. Πάγωμα αυτής της κρίσης κατά την εγγραφή θα χρησιμοποιούσε ποσό ήδη παρωχημένο στην επόμενη κλήση.
Δέχεται σώμα αιτήματος JSON.
GET /v1/billing/charge-attempts listChargeAttempts
Πρόσφατες προσπάθειες χρέωσης, από τη νεότερη.
Τα στοιχεία της ειδοποίησης απόρριψης. Διαβάζονται σκόπιμα χωριστά από το υπόλοιπο: «η κάρτα σας απορρίφθηκε» και «η πίστωση εξαντλήθηκε» είναι διαφορετικές καταστάσεις με διαφορετική αντιμετώπιση και ένας χρηματοδοτημένος λογαριασμός μπορεί να βρίσκεται στην πρώτη χωρίς τη δεύτερη — state στο υπόλοιπο δεν μπορεί να το εκφράσει, επειδή η απόρριψη αφορά κάρτα και όχι το τρέχον υπόλοιπο.
requires_reauth και declined είναι διαφορετικές: η μία ζητά νέα ταυτοποίηση κατόχου, η άλλη διαφορετική κάρτα. ambiguous σημαίνει άγνωστο αποτέλεσμα υπό ευθύνη της περιοδικής συμφωνίας πληρωμών — ποτέ «επανάληψη».
GET /v1/billing/funding getWorkspaceFunding
Ποιο υπόλοιπο χρηματοδοτεί τον ανοικτό χώρο εργασίας, από πότε και τι επιτρέπεται να κάνει το άτομο με αυτό.
Το ισχύον υπόλοιπο του ανοικτού χώρου εργασίας (scope account είναι το κοινό υπόλοιπο του οργανισμού, workspace το δικό του), η αρχή της αδιάλειπτης χρήσης αυτού του υπολοίπου (since· null για χώρο εργασίας που δεν μεταφέρθηκε ακόμη σε χρηματοδότηση με ημερομηνία ισχύος) και οι χώροι εργασίας που χρηματοδοτεί — κατονομάζονται μόνο για όποιον επιτρέπεται να διαβάζει τους χώρους εργασίας του οργανισμού (funded_workspace_names_complete), διαφορετικά μόνο το πλήθος και ο ανοικτός χώρος εργασίας.
finance_access είναι όσα επιτρέπεται να κάνει το άτομο με το υπόλοιπο: manage ή read (Ιδιοκτήτης, Διαχειριστής ή Οικονομικά του οργανισμού, ή εξουσιοδοτημένος αποκλειστικού υπολοίπου) ή none — μέλος χώρου εργασίας χωρίς αυτό βλέπει μόνο τη δαπάνη του χώρου και οι μέθοδοι πληρωμής, η αυτόματη ανανέωση, οι προσπάθειες χρέωσης, τα τιμολόγια και το καθολικό του υπολοίπου απαντούν 403 capability_missing.
GET /v1/billing/invoices listInvoices
Τα εκδοθέντα τιμολόγια, από τη νεότερη περίοδο.
blob_name είναι η αποθηκευμένη αναφορά, όχι URL. Η παροχή υπογεγραμμένου συνδέσμου παραχωρεί πρόσβαση και ανήκει στη διαδρομή λήψης, όχι στην παράθεση.
GET /v1/billing/ledger listLedgerEntries
Συναλλαγές — κάθε κίνηση χρημάτων, από τη νεότερη.
Σελιδοποιείται με δείκτη στο sequence, που αυξάνεται μονότονα ανά λογαριασμό χρέωσης. Ποτέ με μετατόπιση: το καθολικό δέχεται συνεχείς προσθήκες και η σελίδα μετατόπισης υπολογίζει ξανά την αρχή σε κάθε αίτημα, οπότε εισαγωγή γραμμής κατά τη σελιδοποίηση προκαλεί διπλότυπο ή παράλειψη.
GET /v1/billing/payment-methods listBillingPaymentMethods
Αποθηκευμένες κάρτες — μάρκα, λήξη και τέσσερα τελευταία ψηφία.
DELETE /v1/billing/payment-methods/{payment_method_id} deleteBillingPaymentMethod
Αφαιρέστε αποθηκευμένη κάρτα.
Η γραμμή επισημαίνεται αντί να διαγράφεται, ώστε ιστορική πληρωμή να αντιστοιχεί ακόμη στην κάρτα της. Αφαίρεση της προεπιλεγμένης προάγει την πιο πρόσφατα προστεθείσα κάρτα που απομένει.
POST /v1/billing/payment-methods/{payment_method_id}/default setBillingDefaultPaymentMethod
Ορίστε αυτή την κάρτα ως προεπιλεγμένη.
POST /v1/billing/payment-methods/card-purchase completeCardPurchase
Αγοράστε το πακέτο πίστωσης με το token της φόρμας και αποθηκεύστε την κάρτα.
Χρεώνει το token μίας χρήσης που παρήγαγε η φόρμα του παρόχου για το ποσό της προσφοράς για την οποία άνοιξε η φόρμα (billing_quote_id: καθαρή αξία πακέτου + ΦΠΑ, FIX-MONEY C1) — ποτέ ποσό υπολογισμένο από το αίτημα· ποσό φόρμας (amount_due_minor) που δεν ισούται με το σύνολο της προσφοράς είναι 409 quote_mismatch και δεν χρεώνεται τίποτα — μέσω του ίδιου καθολικού πρόθεσης χρέωσης που χρησιμοποιεί κάθε ανανέωση. Στην επιτυχία πιστώνεται ο λογαριασμός και αποθηκεύεται η κάρτα από την απάντηση του ίδιου του παρόχου: token αποθηκευμένου πελάτη, token κάρτας, εξουσιοδότηση, μάρκα, λήξη, όνομα κατόχου και τέσσερα τελευταία ψηφία. Δεν γίνεται ποτέ δεκτό στοιχείο κάρτας από το αίτημα· card_token πρέπει να είναι της φόρμας το ctn_ token, ενώ απορρίπτεται token αποθηκευμένου πελάτη ή κάρτας.
Idempotency-Key είναι απαιτούμενο. Η αναφορά δημιουργείται πριν την κλήση και παρέχει *απόρριψη* διπλοτύπων, όχι ιδιοδυναμία: όταν το αποτέλεσμα είναι άγνωστο, ο πάροχος ερωτάται μία φορά τι συνέβη στην ίδια αναφορά και, αν πάλι δεν απαντήσει, η απάντηση είναι pending_reconciliation — ποτέ δεύτερη χρέωση.
Δέχεται σώμα αιτήματος JSON.
POST /v1/billing/payment-methods/hosted-form createHostedCardForm
Με τι ανοίγει η φόρμα πληρωμής για προσθήκη κάρτας με αγορά πίστωσης.
Μια κάρτα προστίθεται με αγορά πίστωσης (απόφαση προϊόντος 2026-09-23). Ο πάροχος δεν τεκμηριώνει αποθήκευση κάρτας χωρίς πληρωμή: το φιλοξενούμενο Payform χρειάζεται ποσό και η εξουσιοδότηση για μελλοντική αυτόματη ανανέωση εκδίδεται μόνο με πραγματική πρώτη πληρωμή από φόρμα που άνοιξε με frequency_type: recurring.
Κατονομάστε ένα πακέτο πίστωσης· η απάντηση περιέχει το ποσό σε ακέραιες υπομονάδες νομίσματος, το δημόσιο κλειδί του παρόχου, το δικό του script και τον τύπο συχνότητας. Το ποσό ορίζεται από τον διακομιστή — το αίτημα δεν περιέχει ποσό. Δεν χρεώνεται τίποτα: ο περιηγητής ανοίγει τη φόρμα του παρόχου με αυτές τις τιμές, ο κάτοχος εισάγει εκεί την κάρτα (ποτέ στο WeTalk) και η φόρμα επιστρέφει token μίας χρήσης για completeCardPurchase.
ΤΡΟΠΟΠΟΙΗΣΗ 2026-10-06 (FIX-MONEY C1): οι τιμές δεν περιλαμβάνουν ΦΠΑ (OD-8), άρα το πακέτο είναι ΚΑΘΑΡΗ πίστωση και αυτή η διαδρομή γράφει μία γραμμή — μια top_up προσφορά καθαρής αξίας πακέτου + ΦΠΑ (billing_quote_id, net_minor, tax_minor, το σύνολο). Η φόρμα ανοίγει και το 3-D Secure επαληθεύει αυτό το σύνολο· η κονσόλα δείχνει πρώτα καθαρή αξία, ΦΠΑ και σύνολο. 409 terms_acceptance_required μέχρι μέλος με ρόλο Ιδιοκτήτη ή Οικονομικών να αποδεχθεί τους όρους αγοράς (PD-8)· 422 legal_profile_required χωρίς τα νομικά στοιχεία του οργανισμού· 503 tax_rate_unset όταν δεν ισχύει συντελεστής ΦΠΑ για τη φορολογική μεταχείριση του πληρωτή.
Τα δωρεάν λεπτά δοκιμής δεν χρειάζονται κάρτα.
Δέχεται σώμα αιτήματος JSON.
POST /v1/billing/top-ups createTopUp
Αγοράστε πίστωση με αποθηκευμένη ή νέα κάρτα.
Το σώμα περιέχει token της φιλοξενούμενης φόρμας πληρωμής — τα στοιχεία κάρτας δεν φτάνουν ποτέ στο WeTalk, διατηρώντας το πεδίο PCI στο SAQ A.
Μια αναφορά δημιουργείται ντετερμινιστικά από τον λογαριασμό και την προσπάθεια πριν την κλήση και επαναχρησιμοποιείται σε κάθε επανάληψη. Παρέχει *απόρριψη* διπλοτύπων, όχι ιδιοδυναμία: ένα error αποτέλεσμα σημαίνει ότι η έκβαση είναι άγνωστη και πρέπει να διερευνηθεί, ποτέ ότι επιτρέπεται νέα προσπάθεια χρέωσης.
ΤΡΟΠΟΠΟΙΗΣΗ 2026-10-06 (FIX-MONEY C1): amount_minor είναι η ΚΑΘΑΡΗ πίστωση· η κάρτα χρεώνεται με την καθαρή αξία + ΦΠΑ της προσφοράς για την οποία άνοιξε η φόρμα (billing_quote_id, amount_due_minor — createHostedCardForm). Ποσό φόρμας διαφορετικό από το σύνολο της προσφοράς είναι 409 quote_mismatch και δεν χρεώνεται τίποτα.
Δέχεται σώμα αιτήματος JSON.
GET /v1/billing/usage listBillingUsage
Χρόνος ομιλίας, αθροισμένος ανά φωνητικό βοηθό ανά ημέρα.
Η συγκεντρωτική αναφορά που ζητά το FR-BIL-1. Τα δευτερόλεπτα αθροίζονται ανά (voice_agent, day, medium, is_test) και κοστολογούνται μία φορά, στο κλείσιμο της ημέρας — ώστε εκατόν σαράντα δύο χωριστές στρογγυλοποιήσεις να μην συσσωρεύονται σε υπόλοιπο που δεν συμφωνεί.
POST /v1/billing/webhooks/everypay/new-payment receivePaymentWebhookNewPayment
Το webhook «νέα πληρωμή» του παρόχου πληρωμών.
Ο πάροχος στέλνει εδώ το σκέτο αντικείμενο πληρωμής όταν δημιουργείται πληρωμή στον έμπορο χρέωσης. Η διαδρομή ορίζει τον τύπο συμβάντος· δεν διαβάζεται στοιχείο του σώματος για να καθοριστεί.
Δημόσιο: το διαπιστευτήριο είναι η υπογραφή. X-Signature-SHA256 είναι base64(hmac_sha256(raw body, secret)) και επαληθεύεται στα ακατέργαστα bytes, σε σταθερό χρόνο, πριν από οποιαδήποτε ανάλυση JSON. Αίτημα από διεύθυνση εκτός της τεκμηριωμένης λίστας του παρόχου απορρίπτεται με 403 χωρίς εγγραφή. Κάθε άλλο αίτημα καταγράφεται με τα ακατέργαστα bytes και την ετυμηγορία του, ακόμη και πλαστογραφημένο, που επιβεβαιώνεται με 200 χωρίς καμία επεξεργασία.
Τίποτα δεν εξαρτάται από την επίτευξη αυτού του endpoint. Η συμπεριφορά επανάληψης του παρόχου δεν τεκμηριώνεται, επομένως μια περιοδική διεργασία συμφωνίας κλείνει κάθε πληρωμή και από την πλευρά του WeTalk. Το webhook είναι έναυσμα, ποτέ τεκμήριο.
Δέχεται σώμα αιτήματος JSON.
POST /v1/billing/webhooks/everypay/notification-expired receivePaymentWebhookNotificationExpired
Το webhook «ειδοποίηση που έληξε» του παρόχου πληρωμών.
Ο πάροχος στέλνει εδώ το σκέτο αντικείμενο ειδοποίησης πληρωμής όταν λήγει ανεξόφλητο. Επαλήθευση, έλεγχος διεύθυνσης και επιβεβαίωση είναι ίδια με τη διαδρομή «νέα πληρωμή».
Δέχεται σώμα αιτήματος JSON.
POST /v1/billing/webhooks/everypay/notification-paid receivePaymentWebhookNotificationPaid
Το webhook «ειδοποίηση που πληρώθηκε» του παρόχου πληρωμών.
Ο πάροχος στέλνει εδώ το σκέτο αντικείμενο ειδοποίησης πληρωμής όταν εξοφλείται· το payment πεδίο κατονομάζει την πληρωμή ως συμβολοσειρά token. Επαλήθευση, έλεγχος διεύθυνσης και επιβεβαίωση είναι ίδια με τη διαδρομή «νέα πληρωμή».
Δέχεται σώμα αιτήματος JSON.
POST /v1/billing/webhooks/everypay/refund receivePaymentWebhookRefund
Το webhook «επιστροφή χρημάτων» του παρόχου πληρωμών.
Ο πάροχος στέλνει εδώ όταν επιστρέφεται πληρωμή στον έμπορο χρέωσης. Το σώμα δεν τεκμηριώνεται, οπότε διαβάζεται μόνο ως έναυσμα: ο worker ξαναδιαβάζει τις επιστροφές της πληρωμής από τον πάροχο πριν καταγράψει οτιδήποτε. Επαλήθευση, έλεγχος διεύθυνσης και επιβεβαίωση είναι ίδια με τη διαδρομή «νέα πληρωμή».
Δέχεται σώμα αιτήματος JSON.
GET /v1/online-payment/status readOnlinePaymentStatus
Αν προσφέρεται τώρα διαδικτυακή πληρωμή στους καλούντες και τι λείπει.
Για το βήμα πληρωμής του οδηγού νέου βοηθού και τη ρύθμιση Πληρωμών του φωνητικού βοηθού. mode είναι ο τρόπος διαδικτυακής πληρωμής του λογαριασμού, που ορίζει μόνο το WeTalk (off μέχρι τότε). offered_to_callers δηλώνει αν προσφέρεται τώρα διαδικτυακή πληρωμή σε τηλεφωνικό καλούντα πραγματικής συνομιλίας· offered_in_web_chat το ίδιο για widget ιστοσελίδας. missing παραθέτει, με σειρά ενεργειών, τα εμπόδια: mode_off (το WeTalk δεν την ενεργοποίησε), merchant_binding (ο έμπορος πληρωμών του WeTalk δεν είναι ακόμη στον τρόπο που χρειάζεται αυτός ο λογαριασμός), destination και destination_unverified (απαιτείται προορισμός πληρωμής επαληθευμένος από το WeTalk για pilot και live· ένας sandbox λογαριασμός δεν χρειάζεται κανέναν), general_live (οι πληρωμές πραγματικών χρημάτων δεν είναι ακόμη διαθέσιμες σε κάθε λογαριασμό) και sms_unavailable (δεν υπάρχει αποστολέας SMS, οπότε οι τηλεφωνικοί καλούντες δεν μπορούν να λάβουν σύνδεσμο). Αν το κατάστημα δέχεται διαδικτυακή πληρωμή και αν μια γλώσσα περιέχει το κείμενο πληρωμών είναι ρυθμίσεις του φωνητικού βοηθού και δεν αξιολογούνται εδώ.
GET /v1/payouts readPayoutStatement
Η κατάσταση πληρωτέων για ένα βιβλίο και μία περίοδο.
Τι οφείλει το WeTalk στο κατάστημα για τις διαδικτυακά πληρωμένες παραγγελίες του, για το live βιβλίο (ή, με ένδειξη «Sandbox» στην κονσόλα, το sandbox βιβλίο, που δεν αποδίδεται ποτέ). Η περίοδος αποτελεί ολόκληρες ημέρες στη Europe/Athens, τη ζώνη ώρας όλων των ορίων απόδοσης χρημάτων.
balance είναι το βιβλίο τώρα: held_minor βρίσκεται ακόμη στην περίοδο παρακράτησης (κάθε παρακρατούμενη πίστωση παρατίθεται με το release_at), available_minor είναι όσα μπορεί να πάρει μια απόδοση χρημάτων. Στο πραγματικό βιβλίο holds αναφέρει τι εμποδίζει την επόμενη απόδοση και γιατί, και next_payout είναι το επόμενο χρονικό όριο και το αναμενόμενο ποσό τότε (0 όσο υπάρχει εμπόδιο). entries είναι το καθολικό της περιόδου σε σειρά· μια γραμμή παραγγελίας γράφει μικτό ποσό · προμήθεια WeTalk απορροφημένη · προμήθεια 0 · καθαρό = μικτό. opening_balance_minor + entry_total_minor = closing_balance_minor, και το υπόλοιπο κλεισίματος είναι του βιβλίου στο τέλος της περιόδου. Περισσότερες από 5000 εγγραφές στην περίοδο είναι 422 export_too_large· επιλέξτε μικρότερη περίοδο.
Ιδιοκτήτες, Διαχειριστές και Αναγνώστες το διαβάζουν· Μέλη όχι.
GET /v1/payouts/destination readPayoutDestination
Πού αποδίδονται τα χρήματα, με απόκρυψη στοιχείων.
null μέχρι ο Ιδιοκτήτης να προσθέσει προορισμό. Ο IBAN εμφανίζεται με τους τέσσερις τελευταίους χαρακτήρες και το φορολογικό αναγνωριστικό με τους τρεις τελευταίους· δεν επιστρέφονται ποτέ οι πλήρεις τιμές. verified γίνεται true όταν το WeTalk ελέγξει τον προορισμό· αλλαγή προορισμού αφαιρεί την επαλήθευση και οι αποδόσεις περιμένουν μέχρι hold_until. Ιδιοκτήτες και Διαχειριστές, συνδεδεμένοι· ποτέ κλειδί API.
PUT /v1/payouts/destination setPayoutDestination
Αλλάξτε προορισμό απόδοσης (ο Ιδιοκτήτης, με πρόσφατη πρόσθετη ταυτοποίηση).
Μόνο Ιδιοκτήτης, συνδεδεμένος, εντός λίγων λεπτών από νέα εισαγωγή κωδικού, κωδικού εφαρμογής ταυτοποίησης ή passkey (POST /v1/session/step-up): διαφορετικά 401 step_up_required. Απορρίπτεται με 403 step_up_unavailable ενώ η υποστήριξη WeTalk ενεργεί ως μέλος, και 403 για κάθε άλλο ρόλο ή κλειδί API. Ο IBAN πρέπει να ανήκει σε χώρα SEPA και να περνά έλεγχο ψηφίων· BIC απαιτείται μόνο εκτός ΕΟΧ· το ελληνικό φορολογικό αναγνωριστικό είναι ο 9-ψήφιος ΑΦΜ. Μη έγκυρο πεδίο είναι 422 payout_destination_invalid κατονομάζοντας το πεδίο — η τιμή δεν επαναλαμβάνεται ποτέ.
Ο IBAN φυλάσσεται στην αποθήκη κλειδιών αποδόσεων του WeTalk, ποτέ στη βάση: η απάντηση περιέχει τους τέσσερις τελευταίους χαρακτήρες του. Ο νέος προορισμός δεν επαληθεύεται μέχρι να τον ελέγξει το WeTalk, και οι αποδόσεις περιμένουν την παρακράτηση αλλαγής προορισμού (hold_until). Καταγράφεται ως payout_destination.changed.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 422
- 429
- 502
GET /v1/payouts/export.csv exportPayoutStatement
Οι πληρωτέες εγγραφές της περιόδου ως υπολογιστικό φύλλο.
Οι ίδιες εγγραφές με το GET /v1/payouts, μία γραμμή καθεμία, δημιουργούνται όταν ζητούνται χωρίς αποθήκευση: UTF-8 με δείκτη σειράς bytes, εγγραφές CRLF, ποσά ως προσημασμένοι δεκαδικοί σε ευρώ. Πεδίο κειμένου που αρχίζει με =, +, - ή @ προτάσσεται με μονό εισαγωγικό.
GET /v1/quota-requests listQuotaRequests
Τα αιτήματα αυτού του χώρου εργασίας για περισσότερες ταυτόχρονες συνομιλίες, από το νεότερο.
POST /v1/quota-requests requestConcurrencyQuota
Ζητήστε από το WeTalk περισσότερες ταυτόχρονες συνομιλίες.
Καταγράφει ένα quota_request (state: pending) και μια καταχώριση ελέγχου (billing.quota_requested) σε μία db_transaction. Χειριστής διαβάζει εκκρεμή αιτήματα από το API χειριστών και αυξάνει το όριο του λογαριασμού· τίποτα δεν αλλάζει πριν το κάνει.
Δέχεται σώμα αιτήματος JSON.
Χώροι εργασίας
GET /v1/accounts/{account_id}/workspace-creation-policy getWorkspaceCreationPolicy
Ποιος επιτρέπεται να δημιουργεί χώρους εργασίας σε αυτόν τον οργανισμό.
PUT /v1/accounts/{account_id}/workspace-creation-policy putWorkspaceCreationPolicy
Αλλάξτε ποιος μπορεί να δημιουργεί χώρους εργασίας.
account.workspace.manage (Ιδιοκτήτης, Διαχειριστής)· όταν επιτρέπεται μόνο στον Ιδιοκτήτη, μόνο εκείνος μπορεί να αλλάξει την πολιτική (403 workspace_creation_forbidden). Απορρίπτεται χειριστής WeTalk που ενεργεί ως μέλος. If-Match κατονομάζει την αναθεώρηση του οργανισμού (409 revision_stale όταν άλλαξε).
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 429
GET /v1/accounts/{account_id}/workspace-lifecycle listWorkspaceLifecycle
Κάθε χώρος εργασίας του οργανισμού με την κατάσταση κύκλου ζωής του.
account.workspace_metadata.read. Πρώτα ενεργοί χώροι και χώροι σε διαδικασία παύσης, τελευταίοι αρχειοθετημένοι, καθένας με την αρχειοθέτηση σε εξέλιξη (open_operation_id) — η σελίδα Αρχειοθέτηση και κλείσιμο.
POST /v1/accounts/{account_id}/workspaces createAccountWorkspace
Δημιουργήστε χώρο εργασίας σε αυτόν τον οργανισμό και ορίστε τον καλούντα ως Ιδιοκτήτη.
plan-014 B3 (FR12-WSP-01). Όνομα, προαιρετικό σταθερό slug (ποτέ _account· ένα που έχει χρησιμοποιήσει αυτός ο οργανισμός είναι 409 slug_taken), ζώνη ώρας και τρόπος χρηματοδότησης: κοινό υπόλοιπο ή δικό του από €0.00 — που απαιτεί account.finance.manage (Ιδιοκτήτης, Διαχειριστής, Οικονομικά). Ο χώρος, η ιδρυτική συμμετοχή Ιδιοκτήτη και η χρηματοδότησή του (billing_assignment) αποτελούν μία μονάδα εργασίας.
Η πολιτική «ποιος μπορεί να δημιουργεί χώρους εργασίας» καθορίζει τους δικαιούχους: Ιδιοκτήτης και Διαχειριστές ή μόνο Ιδιοκτήτης — 403 workspace_creation_forbidden για Διαχειριστή στη δεύτερη περίπτωση. Ελέγχεται πρώτα το δικαίωμα χώρων εργασίας του οργανισμού (409 resource_limit_reached· η πληρωμή ανά χρήση δεν έχει όριο). Δεν επιτρέπεται κλήση από κλειδί API.
plan-015 WSK (G25): προαιρετικό kind — standard (όταν απουσιάζει) ή test, ετικέτα που χρεώνεται όπως κάθε χώρος εργασίας.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 404
- 409
- 429
GET /v1/audit-entries listAuditEntries
Το αρχείο ελέγχου του χώρου εργασίας, από τη νεότερη εγγραφή.
Εγγραφές από τους τελευταίους retention_month ημερολογιακούς μήνες (24), από τη νεότερη, με προαιρετικό φίλτρο. matched_count μετρά το φιλτραρισμένο σύνολο, όχι τη σελίδα, έως 10 000 (matched_count_capped δηλώνει αν υπάρχουν περισσότερες). Εγγραφές χειριστή WeTalk — αναπαραγωγή ηχογράφησης, ανάγνωση απομαγνητοφώνησης, χρόνος εκπροσώπησης μέλους — περιέχουν origin: wetalk_support, κατονομάζουν τον χειριστή όπως καταγράφηκε και το εκπροσωπούμενο μέλος στο effective_actor. Το αρχείο χειριστών δεν διαβάζεται ποτέ.
POST /v1/audit-entries/exports exportAuditEntries
Εξαγάγετε το αρχείο ελέγχου ως CSV.
Γράφει κάθε εγγραφή που ταιριάζει στα φίλτρα εντός του ορίου διατήρησης σε CSV (UTF-8 με δείκτη σειράς bytes, εγγραφές CRLF, πεδίο που αρχίζει με =, +, - ή @ με πρόθεμα ') και επιστρέφει σύνδεσμο λήψης μικρής διάρκειας. Περισσότερες από WETALK_API_EXPORT_MAX_ROW εγγραφές είναι 422 export_too_large μαζί με το πλήθος· το αρχείο δεν περικόπτεται ποτέ. Το CSV περιέχει τα στοιχεία της προβολής — πραγματικό και ενεργό δράστη, αποτέλεσμα, πεδίο στόχου, αιτιολογία και ασφαλείς τιμές πριν/μετά — ποτέ άλλα στοιχεία της εγγραφής, και κατονομάζει τον χειριστή σε κάθε δική του εγγραφή. Η ίδια η εξαγωγή καταγράφεται (audit_entry.exported): η εγγραφή γράφεται ΠΡΙΝ διαβαστούν οι γραμμές, στην ίδια συναλλαγή βάσης δεδομένων, και δεν περιλαμβάνεται στο αρχείο.
Δέχεται σώμα αιτήματος JSON.
GET /v1/workspaces listWorkspaces
Οι ενεργοί χώροι εργασίας που μπορεί να δει ο καλών.
Κάθε γραμμή περιέχει τα δύο μεγέθη των καρτών — πόσα άτομα συμμετέχουν και τη δαπάνη του μήνα — υπολογισμένα στο ίδιο στιγμιότυπο με τη γραμμή, ώστε όνομα και μεγέθη να μην προέρχονται από διαφορετικές στιγμές. Οι αρχειοθετημένοι χώροι απουσιάζουν· deleted_at είναι αυτό που αρχειοθετεί έναν χώρο.
plan-014 B3: Ιδιοκτήτης, Διαχειριστής, Οικονομικά και Αναγνώστης του οργανισμού βλέπουν κάθε χώρο εργασίας (account.workspace_metadata.read), με ή χωρίς ανοικτό χώρο· όλοι οι άλλοι βλέπουν χώρους όπου έχουν ρόλο — κανένας άλλος χώρος δεν εμφανίζεται, ούτε ως πλήθος. Κάθε γραμμή κατονομάζει τη χρηματοδότησή της, την αναθεώρηση και τον ρόλο του καλούντος. q αναζητά στο όνομα (χωρίς διάκριση πεζών/κεφαλαίων)· η λίστα σελιδοποιείται με κλειδιά, από τον παλαιότερο.
plan-015 BAL (G24): γραμμή με δικό της υπόλοιπο περιέχει dedicated_balance (το ποσό του) μόνο για καλούντα με πρόσβαση ανάγνωσης στο υπόλοιπο — Ιδιοκτήτη, Διαχειριστή και Οικονομικά του οργανισμού ή άτομο του χώρου με σχετική εξουσιοδότηση. Για άλλους το πεδίο απουσιάζει.
POST /v1/workspaces createWorkspace
Δημιουργήστε χώρο εργασίας και ορίστε τον καλούντα ως Ιδιοκτήτη (διαδρομή πριν το plan-014).
Διατηρείται για μία έκδοση δίπλα στο POST /v1/accounts/{account_id}/workspaces, με τους ίδιους κανόνες· σώμα χωρίς funding σημαίνει κοινό υπόλοιπο, όπως πάντα.
Ο χώρος και η ιδρυτική συμμετοχή αποτελούν μία μονάδα εργασίας. Χώρος χωρίς συμμετοχή δεν είναι προσβάσιμος στον δημιουργό του, γι’ αυτό οι δύο εγγραφές γίνονται σε μία συναλλαγή αντί για δύο αιτήματα με ενδιάμεσο κενό.
Ο νέος χώρος δείχνει στον προεπιλεγμένο λογαριασμό χρέωσης — την επιλογή σχεδιασμού «κοινό υπόλοιπο λογαριασμού». Χωριστό υπόλοιπο είναι διαφορετικός λογαριασμός χρέωσης και δεν δημιουργείται εδώ: χώρος συνδεδεμένος σε τέτοιον χωρίς μέθοδο πληρωμής θα φαινόταν χρηματοδοτημένος αλλά θα απέρριπτε κάθε κλήση.
Δεν επιτρέπεται κλήση από κλειδί API. Η ιδρυτική συμμετοχή χρειάζεται άτομο ως ιδιοκτήτη, και το κλειδί δεν είναι άτομο.
Δέχεται σώμα αιτήματος JSON.
DELETE /v1/workspaces/{workspace_id} deleteWorkspace
Αρχειοθετήστε χώρο εργασίας. Ο Ιδιοκτήτης του χώρου ή ο Ιδιοκτήτης ή Διαχειριστής του οργανισμού.
Ποιος. Ο Ιδιοκτήτης του ίδιου του χώρου (workspace.lifecycle) ή ο Ιδιοκτήτης ή Διαχειριστής του οργανισμού — είτε μέλος του χώρου είτε όχι, με ανοικτό χώρο ή μόνο οργανισμό (ADR 0041, 2026-10-09). Οποιοσδήποτε άλλος απορρίπτεται ως προς τον χώρο στόχο.
Αρχειοθέτηση, όχι διαγραφή. Συνομιλίες, εγγραφές καθολικού και ελέγχου δείχνουν σε αυτή τη γραμμή· η αφαίρεσή της θα διέγραφε διαδοχικά ιστορικό χρέωσης ή θα αποτύγχανε σε ξένο κλειδί. deleted_at με state = 'archived' αφαιρεί τον χώρο από κάθε ενεργή προβολή — σταματώντας τις απαντήσεις όλων των βοηθών του — διατηρώντας ανέπαφα τα τεκμήρια των ενεργειών του.
Του λογαριασμού ο τελευταίος ενεργός χώρος δεν αρχειοθετείται: λογαριασμός χωρίς χώρο δεν μπορεί να δημιουργήσει βοηθό, να συνδέσει αριθμό ή να διατηρήσει συνομιλία.
Μόνο ένας κενός χώρος αρχειοθετείται (διαφορετικά 409): χωρίς φωνητικούς βοηθούς και μόνο με το άτομο που αρχειοθετεί. Απορρίπτεται ο χώρος στον οποίο είναι συνδεδεμένος ο καλών (πρώτα αλλάξτε χώρο). Η αρχειοθέτηση αποσύρει ανοικτές προσκλήσεις και τερματίζει τις υπόλοιπες συμμετοχές.
GET /v1/workspaces/{workspace_id} getWorkspace
Ένας χώρος εργασίας με τους φωνητικούς βοηθούς του.
PATCH /v1/workspaces/{workspace_id} updateWorkspace
Μετονομάστε χώρο εργασίας ή αλλάξτε τη ζώνη ώρας του.
Το slug δεν αλλάζει με μετονομασία. Χρησιμοποιείται σε διαδρομές αποθήκευσης, άρα η αλλαγή θα άφηνε ορφανά τα blobs της παλιάς διαδρομής.
name καθαρίζεται από ακραία κενά και έχει έως 60 χαρακτήρες (όπως στη δημιουργία), και δεν μπορεί να υπάρχει ήδη σε άλλον ενεργό χώρο του λογαριασμού (χωρίς διάκριση πεζών/κεφαλαίων): 409 conflict διαφορετικά. Αλλαγή ονόματος γράφει workspace.renamed, αλλαγή ζώνης workspace.time_zone_changed, καθεμία με προηγούμενη και νέα τιμή.
Μόνο σύνδεση ατόμου. Ένα κλειδί API είναι 403 permission_denied: η καταχώριση ελέγχου κατονομάζει το άτομο που άλλαξε τα στοιχεία (customer-portal review item 182). Χώρος σε παύση ή αρχειοθετημένος κρατά το όνομά του (422).
plan-015 WSK (G25, ADR 0050): προαιρετικό kind (standard | test) αλλάζει την ετικέτα του χώρου — μόνο Ιδιοκτήτης ή Διαχειριστής του οργανισμού, όπως στη μετονομασία — και αλλαγή τύπου γράφει workspace.kind_changed με { old, new }. Αν απουσιάζει, ο τύπος διατηρείται.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 429
GET /v1/workspaces/{workspace_id}/access-policy getWorkspaceAccessPolicy
Πώς εντάσσονται άτομα σε αυτόν τον χώρο εργασίας.
PUT /v1/workspaces/{workspace_id}/access-policy putWorkspaceAccessPolicy
Αλλάξτε πώς εντάσσονται άτομα σε αυτόν τον χώρο εργασίας.
Ο Ιδιοκτήτης ή Διαχειριστής του χώρου ή του οργανισμού. verified_domain κατονομάζει έναν ΕΠΑΛΗΘΕΥΜΕΝΟ τομέα του οργανισμού και τον ρόλο ένταξης — ποτέ Ιδιοκτήτη ή Διαχειριστή (422 validation_failed). Χώρος σε παύση ή αρχειοθετημένος κρατά τους κανόνες του (422). Απορρίπτεται χειριστής WeTalk που ενεργεί ως μέλος.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 429
POST /v1/workspaces/{workspace_id}/archive archiveWorkspaceWithPreflight
Αρχειοθετήστε τον χώρο όταν τελειώσουν οι συνομιλίες του.
Ο χώρος γίνεται draining: απορρίπτονται νέες συνομιλίες και προσπάθειες καμπάνιας (workspace_draining), οι καμπάνιες παύουν και δεν επανεκκινούν με επαναφορά, αριθμοί και widgets αποσυνδέονται (οι αριθμοί παραμένουν του οργανισμού), κλειδιά API ανακαλούνται οριστικά, εκκρεμείς προσκλήσεις αποσύρονται. Οι τρέχουσες συνομιλίες τελειώνουν· ο χώρος αρχειοθετείται όταν λήξει η τελευταία — αμέσως αν καμία δεν εκτελείται. 202 με την πράξη (200 για το ίδιο Idempotency-Key ξανά). Απορρίπτεται ο μοναδικός ενεργός χώρος του οργανισμού με 409 operation_conflict· ένας ήδη σε παύση ή αρχειοθετημένος με 422 workspace_draining / workspace_archived. in_progress_action είναι finish (δεν διατίθεται άμεσος τερματισμός συνομιλιών).
- 200
- 202
- 400
- 401
- 403
- 404
- 409
GET /v1/workspaces/{workspace_id}/archive-preflight getWorkspaceArchivePreflight
Τι θα έκανε η αρχειοθέτηση αυτού του χώρου, στοιχείο προς στοιχείο.
workspace.lifecycle στον χώρο ή account.workspace.manage στον οργανισμό. Μία γραμμή για τρέχουσες συνομιλίες, ενεργές καμπάνιες, αριθμούς και διαδικτυακή συνομιλία, κλειδιά API, αποκλειστικό υπόλοιπο και επαναλαμβανόμενα πρόσθετα: now (τι υπάρχει) και on_archive (τι κάνει η αρχειοθέτηση σε αυτό), με τις λέξεις της κονσόλας, μαζί με πλήθος ή ποσό (amount_minor + currency). open_operation είναι η αρχειοθέτηση σε εξέλιξη, αν υπάρχει.
POST /v1/workspaces/{workspace_id}/invitations inviteWorkspaceMember
Προσκαλέστε κάποιον σε χώρο εργασίας.
Το token επιστρέφεται ακριβώς μία φορά. invitation.token_hash είναι το μόνο που κρατά η βάση, άρα δεν υπάρχει δεύτερη εμφάνιση ή διαδρομή ανάκτησης — ίδιο συμβόλαιο με κλειδί API, για τον ίδιο λόγο. Ο καλών παραδίδει τον σύνδεσμο· η κονσόλα εμφανίζει διάλογο εφάπαξ αντιγραφής.
Μια πρόσκληση δεν δημιουργεί άτομο. Η αποδοχή απαιτεί ταυτοποιημένη σύνδεση και το άτομο είτε υπάρχει είτε εγγράφεται πρώτα: πρόσκληση που δημιουργούσε εγγραφή ατόμου θα δημιουργούσε λογαριασμούς για διευθύνσεις που δεν ελέγχει κανείς.
Διαχειριστής δεν μπορεί να προσκαλέσει Ιδιοκτήτη. Προσφέρεται οποιοσδήποτε από τους επτά ρόλους χώρου (plan-014 B3). Χώρος σε παύση ή αρχειοθετημένος δεν δέχεται πρόσκληση (422 workspace_draining / workspace_archived), και ελέγχεται το δικαίωμα θέσεων (409 seat_limit_reached· η πληρωμή ανά χρήση δεν έχει όριο θέσεων).
Διεύθυνση που ανήκει ήδη σε μέλος του χώρου απορρίπτεται με 409 και τον ρόλο του: αλλάξτε τον από τη λίστα ατόμων.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 429
DELETE /v1/workspaces/{workspace_id}/invitations/{invitation_id} revokeWorkspaceInvitation
Ανακαλέστε πρόσκληση που δεν έχει γίνει δεκτή.
Ποιος. Οι Ιδιοκτήτες και Διαχειριστές του χώρου (membership.invite) και ο Ιδιοκτήτης και Διαχειριστής του οργανισμού σε κάθε χώρο του, είτε συμμετέχουν είτε όχι, που έχουν membership.remove εκεί χωρίς δυνατότητα πρόσκλησης (ADR 0052, 2026-10-10). Η καταχώριση ελέγχου περιέχει authority: "organization" όταν χρησιμοποιείται αυτή η εξουσία.
GET /v1/workspaces/{workspace_id}/lifecycle-operations/{workspace_lifecycle_operation_id} getWorkspaceLifecycleOperation
Η μόνιμη κατάσταση αρχειοθέτησης ή επαναφοράς.
POST /v1/workspaces/{workspace_id}/lifecycle-operations/{workspace_lifecycle_operation_id}/cancel cancelWorkspaceArchive
Ακυρώστε αρχειοθέτηση που περιμένει ακόμη την τελευταία συνομιλία.
Ο χώρος ενεργοποιείται ξανά και επανασυνδέονται αριθμοί και widgets που αποσυνδέθηκαν· ανακληθέντα κλειδιά API παραμένουν ανακληθέντα και καμπάνιες σε παύση παραμένουν σε παύση (γνωστοποιείται). 409 operation_state_conflict όταν ολοκληρωθεί η αρχειοθέτηση.
GET /v1/workspaces/{workspace_id}/members listWorkspaceMembers
Τα άτομα του χώρου και οι προσκλήσεις του — εκκρεμείς, ληγμένες και ανακληθείσες.
Μία απάντηση αντί δύο, επειδή η οθόνη τα εμφανίζει σε μία λίστα με στήλη Κατάσταση — και επειδή μέλος και πρόσκληση στην ίδια διεύθυνση από χωριστά σελιδοποιημένες απαντήσεις προκαλούν διπλή γραμμή στην οθόνη.
Ποιος. Οι Ιδιοκτήτες, Διαχειριστές, Μέλη και Αναγνώστες του χώρου (membership.read) και ο Ιδιοκτήτης και Διαχειριστής του οργανισμού σε κάθε χώρο του, μέλη ή όχι, με ανοικτό χώρο ή μόνο οργανισμό (ADR 0041, 2026-10-09).
display_name και email προέρχονται από τον ρόλο ταυτότητας, δηλαδή μια δεύτερη ανάγνωση: membership περιορίζεται στον λογαριασμό και person δεν περιορίζεται, άρα κανένας ρόλος δεν μπορεί να τα ενώσει. Είναι null όταν δεν υπάρχει πια το άτομο, επειδή επινόηση ονόματος για ορφανή συμμετοχή θα έκρυβε πραγματική κατάσταση.
DELETE /v1/workspaces/{workspace_id}/members/{membership_id} removeWorkspaceMember
Αφαιρέστε κάποιον από χώρο εργασίας.
removed_at ορίζεται· η γραμμή παραμένει. Οι καταχωρίσεις ελέγχου κατονομάζουν τη συμμετοχή και η διαγραφή της θα αφαιρούσε το νόημα εγγραφών που ακόμη την αναφέρουν. Ο τελευταίος Ιδιοκτήτης δεν αφαιρείται, όπως δεν υποβιβάζεται, και μόνο Ιδιοκτήτης μπορεί να αφαιρέσει Ιδιοκτήτη (403 member_role_insufficient για Διαχειριστή ή κλειδί API· review #132).
Ποιος. Οι Ιδιοκτήτες και Διαχειριστές του χώρου (membership.remove) και ο Ιδιοκτήτης και Διαχειριστής του οργανισμού σε κάθε χώρο του, μέλη ή όχι (ADR 0052, 2026-10-10). Με εξουσία οργανισμού μπορούν να αφαιρέσουν Ιδιοκτήτη, ακόμη και τον τελευταίο· ο Διαχειριστής του οργανισμού ποτέ δεν αφαιρεί τον Ιδιοκτήτη του οργανισμού. Η καταχώριση ελέγχου περιέχει authority: "organization".
PATCH /v1/workspaces/{workspace_id}/members/{membership_id} setWorkspaceMemberRole
Αλλάξτε ρόλο μέλους.
Ο τελευταίος Ιδιοκτήτης δεν υποβιβάζεται. Λογαριασμός χωρίς Ιδιοκτήτη δεν έχει κανέναν που μπορεί να πληρώσει, να αλλάξει επίπεδο ή να τον διαγράψει, και η ανάκτηση καταλήγει σε SQL από την υποστήριξη.
Μόνο Ιδιοκτήτης μπορεί να προάγει κάποιον σε Ιδιοκτήτη ή να αλλάξει ρόλο Ιδιοκτήτη (403 member_role_insufficient διαφορετικά· customer-portal review 2026-09-25 #132). Αλλιώς η αλλαγή ρόλου γίνεται μηχανισμός αύξησης προνομίων: Διαχειριστής θα μπορούσε να υποβιβάσει όλους τους Ιδιοκτήτες πλην ενός. Κλειδί API δεν επιτρέπεται καμία από τις δύο ενέργειες επειδή δεν έχει ρόλο.
Ποιος. Οι Ιδιοκτήτες και Διαχειριστές του χώρου (membership.role_change) και ο Ιδιοκτήτης και Διαχειριστής του οργανισμού σε κάθε χώρο του, μέλη ή όχι, με ανοικτό χώρο ή μόνο οργανισμό (ADR 0052, 2026-10-10). Με εξουσία οργανισμού ενεργούν υπό τα όρια Ιδιοκτήτη χώρου και μπορούν να υποβιβάσουν τον τελευταίο Ιδιοκτήτη (ο οργανισμός εξακολουθεί να εποπτεύει τον χώρο)· κανείς δεν αλλάζει έτσι τον δικό του ρόλο και ο Διαχειριστής του οργανισμού ποτέ δεν αλλάζει τον Ιδιοκτήτη του οργανισμού (403 member_role_insufficient). Η καταχώριση ελέγχου περιέχει authority: "organization".
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 429
POST /v1/workspaces/{workspace_id}/restore restoreWorkspace
Επαναφέρετε αρχειοθετημένο χώρο εργασίας.
Επανελέγχει σε μία db_transaction: «ποιος μπορεί να δημιουργεί χώρους» (403 workspace_creation_forbidden), τη χρηματοδότηση (παύση ισχύος υπολοίπου 409 operation_conflict· αναστολή λόγω μη πληρωμής 422 account_suspended_nonpayment) και το όριο χώρων του οργανισμού (409 resource_limit_reached). Καμπάνιες, κλειδιά API και αριθμοί παραμένουν όπως στην αρχειοθέτηση: ξεκινήστε καμπάνιες και επανασυνδέστε αριθμό όταν είστε έτοιμοι.
λογαριασμός
GET /v1/accounts listAccounts
Οι οργανισμοί στους οποίους μπορεί να εισέλθει το συνδεδεμένο άτομο.
Plan-014 B1 (design §27.9.2). Κάθε οργανισμός όπου το άτομο έχει ρόλο οργανισμού ή συμμετοχή χώρου, με τον ρόλο και τους χώρους που μπορεί να ανοίξει (enterable είναι false για μη ενεργό χώρο). Διαβάζεται μέσω account_access_for_person (migration 0078)· ποτέ δεν παρατίθενται οργανισμοί άλλου ατόμου. Συνήθης καλών είναι auth_session χωρίς πεδίο ή μόνο με λογαριασμό.
GET /v1/accounts/{account_id} getAccountProfile
Το προφίλ οργανισμού.
Plan-014 B2. Όνομα, κατάσταση, χώρα, προεπιλεγμένη γλώσσα, ισχύουσα ζώνη ώρας χρέωσης και αλλαγή που περιμένει τον μήνα χρέωσης, και το revision που πρέπει να κατονομάσει η επόμενη αλλαγή (ETag το περιέχει επίσης) — μαζί με τα στοιχεία Επισκόπησης: μεταδεδομένα κάθε χώρου (account.workspace_metadata.read· ποτέ το περιεχόμενό του), πόσοι έχουν πρόσβαση, πόσοι έχουν ρόλο οργανισμού και αριθμός υπολοίπων (null εκτός αν ο καλών έχει account.finance.read). Δυνατότητα account.profile.read — κάθε ρόλος οργανισμού. Απορρίψεις: 403 capability_missing (μέλος χώρου χωρίς ρόλο οργανισμού), 404 not_found, τα 401, 429 rate_limited.
PATCH /v1/accounts/{account_id} updateAccountProfile
Μετονομάστε οργανισμό ή αλλάξτε προεπιλεγμένη γλώσσα.
Plan-014 B2. If-Match: "<revision>" απαιτείται (409 revision_stale όταν ο οργανισμός άλλαξε μετά την ανάγνωση). Δυνατότητα account.profile.write — Ιδιοκτήτης, Διαχειριστής. Η ζώνη ώρας χρέωσης αλλάζει από scheduleAccountBillingTimezone, ποτέ εδώ. Καταγράφεται (account.profile_changed).
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 429
POST /v1/accounts/{account_id}/allowed-networks createAccountAllowedNetwork
Επιτρέψτε σύνδεση κονσόλας από περιοχή δικτύου.
Plan-014 C2 (FR12-SEC-04/06). Μόνο σύνδεση κονσόλας: κλειδιά API έχουν δικούς τους κανόνες δικτύου και κλήσεις και webhooks δεν επηρεάζονται. Περιοχή με bits υπολογιστή κανονικοποιείται στο δίκτυό της. Η αλλαγή αυξάνει την αναθεώρηση πολιτικής (κάθε auth_session επανελέγχεται στο επόμενο αίτημα) και ισχύει από το επόμενο αίτημα· αλλαγή που θα άφηνε τη διεύθυνση αυτού του περιηγητή όπως τη βλέπει το WeTalk εκτός κάθε περιοχής απορρίπτεται με 409 sign_in_policy_lockout· ενεργό διπλότυπο είναι 409 conflict. Δυνατότητα account.sign_in_policy.write με πρόσφατη πρόσθετη ταυτοποίηση. Καταγράφεται (allowed_network.added).
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 404
- 409
- 429
DELETE /v1/accounts/{account_id}/allowed-networks/{account_allowed_network_id} deleteAccountAllowedNetwork
Αφαιρέστε επιτρεπόμενη περιοχή δικτύου.
Plan-014 C2. Αυξάνει αναθεώρηση πολιτικής. Απορρίπτεται με 409 sign_in_policy_lockout όταν οι περιοχές που απομένουν δεν περιέχουν τη διεύθυνση αυτού του περιηγητή όπως τη βλέπει το WeTalk. Δυνατότητα account.sign_in_policy.write με πρόσφατη πρόσθετη ταυτοποίηση. Καταγράφεται (allowed_network.removed).
GET /v1/accounts/{account_id}/audit-entries listAccountAuditEntries
Το αρχείο ελέγχου οργανισμού, από τη νεότερη εγγραφή.
Plan-014 C4b (FR12-SEC-08). Κάθε εγγραφή οργανισμού — των χώρων, του ίδιου του οργανισμού και των υπολοίπων του — από τους τελευταίους retention_month ημερολογιακούς μήνες, από τη νεότερη, με τα φίλτρα αρχείου χώρου συν scope και workspace_id. account.audit.read (Ιδιοκτήτης, Διαχειριστής) διαβάζει όλες τις εγγραφές· account.audit.financial_read μόνο (Οικονομικά) διαβάζει εγγραφές που ο κατάλογος ορίζει ως οικονομικές, στη σελίδα, στο πλήθος και στην εξαγωγή, και η απάντηση το δηλώνει (finance_only). Διατίθεται με ανοικτό μόνο οργανισμό. Ποτέ κλειδί API.
POST /v1/accounts/{account_id}/audit-entries/exports exportAccountAuditEntries
- μόνο συνδεδεμένο άτομο
- βαρύ
Εξαγάγετε το αρχείο ελέγχου οργανισμού ως CSV.
Plan-014 C4b. Εξαγωγή με όρια και καταγραφή όπως στον χώρο: πρώτα το πλήθος (422 export_too_large πάνω από WETALK_API_EXPORT_MAX_ROW, κατονομάζοντάς το), μετά audit_entry.exported γραμμένο πριν διαβαστούν οι εγγραφές, μετά αρχείο και σύνδεσμος μικρής διάρκειας. Τα Οικονομικά εξάγουν μόνο οικονομικές εγγραφές. Μέχρι ο οργανισμός να έχει δική του θέση αρχείου, αυτό αποθηκεύεται στον ανοικτό χώρο του ατόμου, άρα σύνδεση με μόνο οργανισμό απορρίπτεται με 409 scope_required.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 429
POST /v1/accounts/{account_id}/billing-timezone scheduleAccountBillingTimezone
Αλλάξτε ζώνη ώρας χρέωσης από τον επόμενο μήνα χρέωσης.
Plan-014 B2 (design §27.8.5· owner input 12). Η αλλαγή ισχύει από την αρχή του επόμενου μήνα χρέωσης στην τρέχουσα ζώνη (effective_from) και ποτέ δεν ξαναγράφει ανοικτή περίοδο· δήλωση της ισχύουσας ζώνης αποσύρει εκκρεμή αλλαγή. If-Match: "<revision>" απαιτείται. Δυνατότητα account.finance.manage — Ιδιοκτήτης, Διαχειριστής, Οικονομικά. Απορρίψεις: 400 time_zone_invalid, 409 revision_stale, 403 capability_missing. Με καταγραφή ελέγχου (account.billing_timezone_scheduled).
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 429
GET /v1/accounts/{account_id}/closure-preflight getAccountClosurePreflight
Τι εμποδίζει το κλείσιμο οργανισμού, τι επιστρέφεται και τι διατηρείται.
Η ανάγνωση του Ιδιοκτήτη (account.close· αρκεί παλαιότερη πρόσθετη ταυτοποίηση για ανάγνωση). blocker[] παραθέτει κάθε τρέχον εμπόδιο κλεισίματος — συνομιλία σε εξέλιξη, ανεξόφλητη κατάσταση, αρνητικό υπόλοιπο, πληρωμή σε επεξεργασία, υποχρέωση απόδοσης — με την αντιμετώπισή του. refundable[] είναι η αχρησιμοποίητη ΑΓΟΡΑΣΜΕΝΗ πίστωση κάθε υπολοίπου (δοκιμαστική και προωθητική πίστωση δεν επιστρέφονται και χρησιμοποιούνται πρώτες). retention δηλώνει τα μεγέθη του ιδιοκτήτη: το περιεχόμενο διαγράφεται content_purge_after_day ημέρες μετά τη λήξη πρόσβασης (περίοδος χάριτος αναίρεσης), τα οικονομικά αρχεία διατηρούνται financial_keep_year ημερολογιακά έτη μετά το κλείσιμο. latest_closure είναι το πιο πρόσφατο κλείσιμο, ανεξαρτήτως κατάστασης.
POST /v1/accounts/{account_id}/closures startAccountClosure
Ξεκινήστε κλείσιμο οργανισμού (ασύγχρονα).
Μόνο Ιδιοκτήτης (account.close), με πρόσφατη πρόσθετη ταυτοποίηση (step_up_required διαφορετικά), ποτέ χειριστής WeTalk που ενεργεί ως μέλος. Τα εμπόδια αποθηκεύονται και απαντούν με 409 closure_blocked με error.detail.blocker[]. Διαφορετικά ο οργανισμός γίνεται closing — χωρίς νέες συνομιλίες ή αγορές — και το κλείσιμο ακολουθεί παύση → απόφαση επιστροφών → λήξη προγράμματος και όρων μεταπληρωμής → ανάκληση πρόσβασης → χάρη → διαγραφή περιεχομένου → κλειστός· ακολουθήστε status_url. refund_choice είναι refund (ένα αίτημα επιστροφής ανά υπόλοιπο, καθένα εγκεκριμένο από χειριστή οικονομικών), waive (με refund_waiver, τα λόγια του ίδιου του ιδιοκτήτη) ή none (όταν δεν υπάρχει αχρησιμοποίητη αγορασμένη πίστωση). Το κλείσιμο αυτού του οργανισμού ποτέ δεν αφαιρεί συμμετοχές του ατόμου σε άλλους.
Δέχεται σώμα αιτήματος JSON.
- 200
- 202
- 400
- 401
- 403
- 404
- 409
GET /v1/accounts/{account_id}/closures/{account_closure_operation_id} getAccountClosure
Η μόνιμη κατάσταση κλεισίματος.
POST /v1/accounts/{account_id}/closures/{account_closure_operation_id}/undo undoAccountClosure
Αναιρέστε κλείσιμο εντός της περιόδου χάριτος (ο πρώην Ιδιοκτήτης).
Σημείο εισόδου ταυτότητας: μετά τη λήξη πρόσβασης ο πρώην Ιδιοκτήτης δεν έχει συμμετοχή, άρα το cookie auth_session παρουσιάζεται στην ίδια τη διαδρομή (με X-WeTalk-Csrf). Μόνο το άτομο που ζήτησε κλείσιμο το αναιρεί, μόνο εντός χάριτος (409 operation_state_conflict διαφορετικά)· κλείσιμο άλλου ατόμου είναι 404. Ο οργανισμός επιστρέφει στην προηγούμενη κατάσταση με τον πρώην Ιδιοκτήτη ως Ιδιοκτήτη του και των χώρων που αρχειοθετήθηκαν· δεν επιστρέφει άλλη πρόσβαση και κλειδιά, αριθμοί και καμπάνιες παραμένουν κλειστά.
POST /v1/accounts/{account_id}/closures/{account_closure_operation_id}/withdraw withdrawAccountClosure
Αποσύρετε κλείσιμο πριν αρχίσει η ανάκληση πρόσβασης.
Επιτρέπεται όσο το κλείσιμο παύει λειτουργία, επιστρέφει χρήματα ή λήγει πρόγραμμα (409 operation_state_conflict μετά). Ο οργανισμός επιστρέφει στην προηγούμενη κατάσταση· αιτήματα επιστροφής χωρίς απόφαση ακυρώνονται. Καμπάνιες και αυτόματες ανανεώσεις παραμένουν κλειστές μέχρι να επανεκκινηθούν.
GET /v1/accounts/{account_id}/invitations listAccountInvitations
Οι προσκλήσεις οργανισμού σε κάθε κατάσταση, από τη νεότερη.
Plan-014 B2 (FR12-TEAM-05). Εκκρεμείς, ληγμένες, ανακληθείσες, αντικατασταθείσες και αποδεκτές προσκλήσεις — η κονσόλα τις εμφανίζει χωριστά από τα μέλη. Δυνατότητα account_membership.read.
POST /v1/accounts/{account_id}/invitations createAccountInvitation
Προσκαλέστε κάποιον στον οργανισμό.
Plan-014 B2 (FR12-TEAM-01/02). Προσφέρει ρόλο οργανισμού (Διαχειριστής, Οικονομικά ή Αναγνώστης — ποτέ Ιδιοκτήτης, 403 owner_change_forbidden), κατονομασμένους ρόλους χώρων σε ενεργούς χώρους αυτού του οργανισμού ή και τα δύο· η προσφορά παγώνει — μεταγενέστερος χώρος δεν περιλαμβάνεται ποτέ. Μόνο Ιδιοκτήτης οργανισμού προσφέρει ρόλο Ιδιοκτήτη χώρου. Ο σύνδεσμος ισχύει για τη ρυθμισμένη διάρκεια (7 ημέρες). Μία εκκρεμής πρόσκληση ανά διεύθυνση (409 conflict)· άτομο που έχει ήδη ρόλο οργανισμού απορρίπτεται αντί δεύτερης πρόσκλησης. Δυνατότητα account_membership.invite — Ιδιοκτήτης, Διαχειριστής. delivery δηλώνει αν η πρόσκληση στάλθηκε με email ή — όσο δεν έχει συνδεθεί αποστολέας email — το invitation_path επιστρέφεται ΜΙΑ ΦΟΡΑ για προώθηση από τον προσκαλούντα. Καταγράφεται (account_invitation.sent).
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 404
- 409
- 429
POST /v1/accounts/{account_id}/invitations/{account_invitation_id}/resend resendAccountInvitation
Στείλτε ξανά πρόσκληση με νέο σύνδεσμο· ο παλιός παύει να λειτουργεί.
Plan-014 B2 (FR12-TEAM-03). Εκκρεμής ή ληγμένη πρόσκληση αντικαθίσταται και εκδίδεται νέα με την ίδια παγωμένη προσφορά στην ίδια συναλλαγή βάσης δεδομένων. Αποδεκτή, ανακληθείσα ή αντικατασταθείσα είναι 409 conflict. Δυνατότητα account_membership.invite. Με καταγραφή ελέγχου (account_invitation.resent).
POST /v1/accounts/{account_id}/invitations/{account_invitation_id}/revoke revokeAccountInvitation
Ανακαλέστε εκκρεμή πρόσκληση.
Plan-014 B2 (FR12-TEAM-03). Μόνο εκκρεμής πρόσκληση· οτιδήποτε άλλο είναι 409 conflict. Δυνατότητα account_membership.invite. Με καταγραφή ελέγχου (account_invitation.revoked).
GET /v1/accounts/{account_id}/members listAccountMembers
Όλοι με πρόσβαση στον οργανισμό, με τους ρόλους τους.
Plan-014 B2 (FR12-TEAM-01). Μία γραμμή ανά άτομο με ρόλο οργανισμού, χώρου ή και τα δύο: ο ρόλος οργανισμού και το revision, κάθε ρόλος χώρου με το όνομά του, ο τρόπος σύνδεσης (οι υπάρχοντες τύποι — ποτέ διαπιστευτήριο) και η τελευταία παρουσία εδώ. Δυνατότητα account_membership.read — Ιδιοκτήτης, Διαχειριστής.
DELETE /v1/accounts/{account_id}/members/{account_membership_id} removeAccountMember
Αφαιρέστε τον ρόλο οργανισμού κάποιου.
Plan-014 B2 (FR12-TEAM-04, FR12-AUTH-08). Τερματίζει τον ρόλο ΟΡΓΑΝΙΣΜΟΥ — κατάσταση, ποτέ διαγραφή· το άτομο και οι ρόλοι χώρων του παραμένουν ανέπαφοι (οι δύο συμμετοχές είναι ανεξάρτητες). If-Match απαιτείται. Δυνατότητα account_membership.remove: Διαχειριστής ποτέ δεν αφαιρεί Ιδιοκτήτη (403 owner_change_forbidden)· ο τελευταίος ενεργός Ιδιοκτήτης ποτέ δεν αφαιρείται (409 last_owner_protected). Καταγράφεται.
- 204
- 400
- 401
- 403
- 404
- 409
- 429
PATCH /v1/accounts/{account_id}/members/{account_membership_id} updateAccountMember
Αλλάξτε τον ρόλο οργανισμού κάποιου.
Plan-014 B2 (design §27.5.2; FR12-AUTH-08). If-Match: "<revision>" κατονομάζει την αναθεώρηση συμμετοχής. Δυνατότητα account_membership.role_change. Κανείς δεν αλλάζει ΣΕ Ιδιοκτήτη (η ιδιοκτησία μεταφέρεται)· Διαχειριστής αλλάζει μόνο μη ιδιοκτήτες και ποτέ δεν αυξάνει τον δικό του ρόλο (403 owner_change_forbidden)· ο τελευταίος ενεργός Ιδιοκτήτης ποτέ δεν υποβιβάζεται (409 last_owner_protected, υπό κλείδωμα κάθε ενεργής γραμμής Ιδιοκτήτη). Οι ανοικτές σελίδες του ατόμου επανελέγχουν την πρόσβαση στο επόμενο αίτημα. Καταγράφεται.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 429
POST /v1/accounts/{account_id}/ownership-transfers transferAccountOwnership
Μεταφέρετε την ιδιοκτησία οργανισμού.
Plan-014 B2 (FR12-AUTH-08). Δυνατότητα account.ownership.transfer — μόνο Ιδιοκτήτης — με πρόσφατη πρόσθετη ταυτοποίηση (401 step_up_required διαφορετικά). Ο νέος Ιδιοκτήτης πρέπει ήδη να είναι ενεργό μέλος οργανισμού (400 validation_failed) με επαληθευμένο email (403 invitation_identity_mismatch). Σε μία συναλλαγή βάσης, υπό κλείδωμα κάθε ενεργής γραμμής Ιδιοκτήτη, ο στόχος γίνεται Ιδιοκτήτης και ο καλών κρατά former_owner_role: ταυτόχρονες μεταφορές καταλήγουν σε ακριβώς έναν Ιδιοκτήτη, ποτέ σε κανέναν. Δέχεται Idempotency-Key. Με καταγραφή ελέγχου (account.ownership_transferred).
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 429
GET /v1/accounts/{account_id}/resource-shares listAccountResourceShares
Τι κοινοποιείται μεταξύ των χώρων αυτού του οργανισμού και τι θα μπορούσε να κοινοποιήσει ο καλών.
Plan-014 B5. Ιδιοκτήτης ή Διαχειριστής οργανισμού (account.resource_share.read) βλέπει όλες τις κοινοποιήσεις· άτομο χωρίς αυτό αλλά με resource_share.publish ή resource_share.accept σε χώρο βλέπει μόνο κοινοποιήσεις που τον αφορούν (η χρήση ανοικτής προσφοράς από άλλον χώρο παραμένει δική του). Κάθε κοινοποίηση κατονομάζει αναθεώρηση, από → προς, κατάσταση και κάθε αποδοχή με τις εκδόσεις φωνητικών βοηθών που τη χρησιμοποιούν. shareable παραθέτει όσα θα μπορούσε να δημοσιεύσει ο καλών (ενεργούς βοηθούς και έγγραφα στους χώρους όπου επιτρέπεται να δημοσιεύει)· do_not_call είναι το μέγεθος της πάντα ενιαίας λίστας.
GET /v1/accounts/{account_id}/security getAccountSecurity
Η πολιτική σύνδεσης, οι επαληθευμένοι τομείς και τα επιτρεπόμενα δίκτυα οργανισμού.
Plan-014 C2. Η εφαρμοζόμενη πολιτική και κάθε προσχέδιο, policy_revision (τι κατονομάζει η επόμενη αλλαγή στο If-Match, 0 όσο δεν εφαρμόζεται τίποτα), κάθε επαληθευμένος τομέας με την εγγραφή TXT προς δημοσίευση, οι ενεργές περιοχές δικτύου, η διεύθυνση αυτού του περιηγητή όπως τη βλέπει το WeTalk (από τον δικό του διαμεσολαβητή, ποτέ από κεφαλίδα περιηγητή), αν την περιέχουν οι περιοχές και ο έλεγχος αποκλεισμού κάθε πολιτικής — ποιοι επηρεάζονται και αν Ιδιοκτήτης κρατά δοκιμασμένη πρόσβαση. Δυνατότητα account.security.read.
PUT /v1/accounts/{account_id}/sign-in-policy updateAccountSignInPolicy
Ορίστε πώς συνδέονται τα άτομα.
Plan-014 C2 (FR12-SEC-04/06). If-Match: "<policy_revision>" κατονομάζει την εφαρμοζόμενη αναθεώρηση βάσης αλλαγής ("0" για καμία· 409 revision_stale όταν άλλαξε). Η εφαρμογή αντικαθιστά προηγούμενη πολιτική, παίρνει επόμενη αναθεώρηση και αξιολογείται στο επόμενο αίτημα κάθε auth_session· πολιτική που δεν αφήνει σε κανέναν Ιδιοκτήτη δοκιμασμένη πρόσβαση απορρίπτεται με 409 sign_in_policy_lockout και δεν αποθηκεύεται τίποτα. Αποκλειστική ενιαία σύνδεση χωρίς επαληθευμένο τομέα αποθηκεύεται ως ΠΡΟΣΧΕΔΙΟ (state: draft, draft_reason: sign_in_policy_domain_unverified) και δεν απαιτεί τίποτα από κανέναν. Αποθήκευση της ήδη εφαρμοζόμενης πολιτικής δεν αλλάζει τίποτα (unchanged: true). Δυνατότητα account.sign_in_policy.write με πρόσφατη πρόσθετη ταυτοποίηση. Καταγράφεται (account.sign_in_policy_changed).
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 429
POST /v1/accounts/{account_id}/sign-in-policy/preflight previewAccountSignInPolicy
Ποιους θα επηρέαζε η πολιτική σύνδεσης πριν την αποθήκευση.
Plan-014 C2 (FR12-SEC-04). Έλεγχος αποκλεισμού μίας επιλογής: τα επηρεαζόμενα άτομα (προσθήκη εφαρμογής ταυτοποίησης, εξάντληση κωδικών ανάκτησης ή απώλεια πρόσβασης επειδή δεν συνδέονται με ενιαία σύνδεση επαληθευμένου τομέα) και αν τουλάχιστον ένας Ιδιοκτήτης κρατά δοκιμασμένη πρόσβαση. Δεν αποθηκεύει τίποτα. Δυνατότητα account.security.read.
Δέχεται σώμα αιτήματος JSON.
GET /v1/accounts/{account_id}/terms-acceptance readAccountTerms
Οι ισχύοντες όροι αγοράς οργανισμού και αν τους αποδέχθηκε.
Plan-014 (παράδοση E4· design §27.8.15· PD-8). Η ισχύουσα αναθεώρηση όρων αγοράς, τα έγγραφα όρων και απορρήτου, αν ο οργανισμός την αποδέχθηκε και αν το συνδεδεμένο άτομο επιτρέπεται να την αποδεχθεί (Ιδιοκτήτης ή μέλος Οικονομικών). Η σελίδα Προγράμματα το διαβάζει πριν το «Επιβεβαίωση και πληρωμή», που στέλνει την αναθεώρηση ως terms_revision. Διαβάζεται από κάθε άτομο που μπορεί να εισέλθει στον οργανισμό. Απορρίψεις: 404 not_found (οργανισμός όπου δεν μπορεί να εισέλθει το άτομο)· τα τρία 401· 429 rate_limited.
POST /v1/accounts/{account_id}/terms-acceptance acceptAccountTerms
Αποδεχθείτε τους ισχύοντες όρους αγορών οργανισμού.
Plan-014 B1 (design §27.8.15· owner decision PD-8). Ιδιοκτήτης ή μέλος Οικονομικών αποδέχεται την ισχύουσα αναθεώρηση· μέχρι τότε μια αγορά απορρίπτεται με 409 terms_acceptance_required. Καταγράφονται άτομο και χρόνος με καταχώριση ελέγχου· αποδοχή ήδη αποδεκτής αναθεώρησης δεν αλλάζει τίποτα.
Απαιτεί X-WeTalk-Csrf. Απορρίψεις: 409 terms_acceptance_required (η αναθεώρηση δεν είναι η ισχύουσα — ανανεώστε)· 403 capability_missing (δεν υπάρχει ρόλος Ιδιοκτήτη ή Οικονομικών εδώ)· 404 not_found (οργανισμός όπου δεν μπορεί να εισέλθει το άτομο)· 400 validation_failed; 403 impersonation_forbidden· τα τρία 401· 429 rate_limited.
Δέχεται σώμα αιτήματος JSON.
- 204
- 400
- 401
- 403
- 404
- 409
- 429
POST /v1/accounts/{account_id}/verified-domains createAccountVerifiedDomain
Προσθέστε τομέα για επαλήθευση.
Plan-014 C2 (FR12-SEC-05). Ο τομέας προστίθεται pending με νέα πρόκληση: δημοσιεύστε txt_value ως εγγραφή TXT στο txt_nameκαι επαληθεύστε. 409 conflict όταν ο οργανισμός τον έχει ήδη καταχωρίσει. Δυνατότητα account.sign_in_policy.write με πρόσφατη πρόσθετη ταυτοποίηση. Καταγράφεται (verified_domain.added).
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 404
- 409
- 429
DELETE /v1/accounts/{account_id}/verified-domains/{sso_domain_id} deleteAccountVerifiedDomain
Αφαιρέστε τομέα.
Plan-014 C2. Απορρίπτεται με 409 sign_in_policy_lockout για τον τελευταίο επαληθευμένο τομέα όταν εφαρμόζεται μόνο ενιαία σύνδεση, και 409 conflict για τον τελευταίο αποδεδειγμένο τομέα εφαρμοζόμενου παρόχου ενιαίας σύνδεσης. Δυνατότητα account.sign_in_policy.write με πρόσφατη πρόσθετη ταυτοποίηση. Καταγράφεται (verified_domain.removed).
PUT /v1/accounts/{account_id}/verified-domains/{sso_domain_id}/auto-join updateAccountVerifiedDomainAutoJoin
Ποιος μπορεί να ενταχθεί χωρίς πρόσκληση και πού.
Plan-014 C2 (FR12-SEC-05). Άτομα με διεύθυνση στον τομέα εντάσσονται όσο είναι επαληθευμένος — πάντα με περιορισμένο ρόλο χώρου (viewer, member, developer, campaign_manager ή billing· ποτέ ιδιοκτήτη ή διαχειριστή), μόνο στους κατονομασμένους ενεργούς χώρους. member_role: null το απενεργοποιεί. 422 validation_failed για άλλον ρόλο ή χώρο που δεν είναι ενεργός χώρος αυτού του οργανισμού. Δυνατότητα account.sign_in_policy.write με πρόσφατη πρόσθετη ταυτοποίηση. Καταγράφεται (verified_domain.auto_join_changed).
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 422
- 429
POST /v1/accounts/{account_id}/verified-domains/{sso_domain_id}/verify verifyAccountVerifiedDomain
- μόνο συνδεδεμένο άτομο
- βαρύ
Επαληθεύστε τώρα — έλεγχος εγγραφής TXT τομέα.
Plan-014 C2 (FR12-SEC-05, ED-3). Ένας έλεγχος DNS στον resolver του WeTalk. outcome: found επαληθεύει τον τομέα (από εκκρεμή ή ξανά από ληγμένο) και προγραμματίζει καθημερινό επανέλεγχο· not_found_yet τον αφήνει σε αναμονή («το DNS μπορεί να χρειαστεί έως μία ώρα»)· λήξη χρόνου, SERVFAIL ή άρνηση σύνδεσης είναι 503 domain_check_unavailable — ποτέ «δεν βρέθηκε», και η κατάσταση τομέα δεν αλλάζει εξαιτίας του. 409 sso_domain_already_claimed όταν άλλος οργανισμός επαλήθευσε πρώτος τον τομέα. Επαληθεύει μόνο άτομο (χειριστής ποτέ δεν χαρακτηρίζει τομέα ως επαληθευμένο). Κατηγορία ρυθμού expensive. Δυνατότητα account.sign_in_policy.write με πρόσφατη πρόσθετη ταυτοποίηση. Καταγράφεται (verified_domain.verified).
- 200
- 401
- 403
- 404
- 409
- 429
- 503
POST /v1/accounts/{account_id}/workspace-access-grants grantAccountWorkspaceAccess
Δώστε σε άτομο του οργανισμού λειτουργική πρόσβαση σε χώρο, με αιτιολογία.
Plan-014 B2 πάνω στην ρητή παραχώρηση A3 (FR12-AUTH-07). Ρόλος οργανισμού ποτέ δεν ανοίγει περιεχόμενο χώρου· αυτό το κάνει, ορατά — η συμμετοχή καταγράφει access_grant και αιτιολογία (τουλάχιστον δέκα χαρακτήρες), και το αρχείο ελέγχου καταγράφει τον παραχωρούντα. Το άτομο πρέπει ήδη να ανήκει στον οργανισμό (404 not_found διαφορετικά — προσκαλέστε ξένο άτομο). Μόνο Ιδιοκτήτης οργανισμού παραχωρεί ρόλο Ιδιοκτήτη χώρου. Δυνατότητα account.workspace_access.grant — Ιδιοκτήτης, Διαχειριστής.
ΤΡΟΠΟΠΟΙΗΣΗ 2026-10-06 (plan-014 review I-4 / I-5): χώρος σε παύση ή αρχειοθετημένος δεν δέχεται νέα άτομα (422 workspace_draining / workspace_archived· διαγραμμένος είναι 404), και οι θέσεις του υπολοίπου χρηματοδότησης ελέγχονται μετά τη γραμμή, στην ίδια συναλλαγή (409 seat_limit_reached).
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 429
GET /v1/me/account-closures listMyAccountClosures
Τα κλεισίματα που ζήτησε το συνδεδεμένο άτομο και μπορούν ακόμη να αναιρεθούν.
Σημείο εισόδου ταυτότητας (συνήθης καλών μετά τη λήξη πρόσβασης είναι auth_session χωρίς πεδίο). Κάθε κλείσιμο που ξεκίνησε το άτομο και βρίσκεται σε χάρη, με όνομα οργανισμού, τέλος χάριτος και διαδρομή αναίρεσης.
GET /v1/me/onboarding-draft getOnboardingDraft
Το συνεχίσιμο προσχέδιο Δημιουργίας οργανισμού του συνδεδεμένου ατόμου.
Plan-014 B1 (FR12-ONB-01, FR12-ONB-05). Το ανοικτό προσχέδιο — αναθεώρηση σχήματος, ολοκληρωμένα βήματα (identity, organization, voice_agent) και επικυρωμένες είσοδοι — ή κενό, μαζί με όσα δείχνει η οθόνη: επαλήθευση email, δικαίωμα δοκιμής ατόμου (μία ανά επαληθευμένο άτομο) και διάρκειά της, ζώνη ώρας χρέωσης νέου οργανισμού, ισχύουσα αναθεώρηση όρων με συνδέσμους. Αποθηκεύεται στον διακομιστή· ποτέ κωδικός, στοιχεία κάρτας ή token.
PUT /v1/me/onboarding-draft saveOnboardingDraft
Αποθηκεύστε το προσχέδιο Δημιουργίας οργανισμού.
Plan-014 B1 (FR12-ONB-05). Αντικαθιστά τις εισόδους ανοικτού προσχεδίου και τις ενδείξεις βημάτων του ατόμου. Άγνωστα πεδία απορρίπτονται, ώστε να αποθηκεύονται μόνο οι τρεις γνωστές είσοδοι. identity απαιτεί επαληθευμένο email (403 email_unverified); organization επισημαίνεται μόνο με τη δημιουργία οργανισμού (POST /v1/accounts) και απορρίπτεται εδώ· voice_agent χρειάζεται πρώτα τον οργανισμό. Μόλις υπάρχει, οι είσοδοί του ανήκουν στην εγγραφή και δεν αλλάζουν με αποθήκευση. Το προσχέδιο ολοκληρώνεται όταν επισημανθούν όλα τα βήματα· το επόμενο ξεκινά κενό.
Απαιτεί X-WeTalk-Csrf. Απορρίψεις: 400 validation_failed; 422 country_unsupported; 403 email_unverified; 403 impersonation_forbidden· τα τρία 401· 429 rate_limited.
Δέχεται σώμα αιτήματος JSON.
POST /v1/resource-shares/{resource_share_id}/accept acceptResourceShare
Αποδεχθείτε κάτι κοινοποιημένο σε χώρο εργασίας.
Plan-014 B5 (FR12-SHR-02). Ο καταναλωτής είναι consumer_workspace_id, αλλιώς ο προορισμός κοινοποίησης, αλλιώς ο ανοικτός χώρος του ατόμου. Έγγραφο γίνεται δεκτό ως αναφορά (mode: reference), ρύθμιση ως αντίγραφο (mode: copy); mode μπορεί να παραλειφθεί. Νέα αποδοχή απαντά με outcome: already_accepted. Δυνατότητα resource_share.accept στον χώρο καταναλωτή (Ιδιοκτήτης, Διαχειριστής χώρου).
- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 429
POST /v1/resource-shares/{resource_share_id}/attach attachResourceShare
Προσθέστε αποδεκτό κοινοποιημένο έγγραφο σε μια δημιουργία βοηθού αυτού του χώρου.
Plan-014 B5 (FR12-SHR-03). Αντιγράφει την αποδεκτή σταθερή αναθεώρηση στη δημιουργία βοηθού που περιμένει έγγραφα (επεξεργασία αντικατάστασης εγγράφων ή νέος βοηθός πριν αρχίσει η δημιουργία), μέσω του ελέγχου κοινοποίησης: αποδεκτή από τον χώρο βοηθού, χωρίς ανάκληση, και οι δύο χώροι ενεργοί. Δημιουργία με ίδια bytes απαντά με created: false. Δυνατότητα agent_document.write στον βοηθό.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 429
POST /v1/resource-shares/{resource_share_id}/revoke revokeResourceShare
Ανακαλέστε κοινοποίηση — καμία νέα χρήση· ό,τι δημιουργήθηκε την κρατά.
Plan-014 B5 (FR12-SHR-03). Οριστική. Εμποδίζει νέα αποδοχή, χρήση, αντίγραφα και δημιουργίες· ενεργές εκδόσεις βοηθού και συνομιλίες σε εξέλιξη κρατούν τη χρησιμοποιούμενη αναθεώρηση. Η απάντηση παραθέτει κάθε αποδοχή με τις εκδόσεις που τη χρησιμοποιούν, ενημερώνοντας ποιος την κρατά. Νέα ανάκληση απαντά με outcome: already_revoked. Δυνατότητα resource_share.publish στον χώρο προέλευσης ή account.workspace.manage στον οργανισμό.
POST /v1/workspaces/{workspace_id}/resource-shares createResourceShare
Κοινοποιήστε αναθεώρηση εγγράφου ή ρύθμιση βοηθού από αυτόν τον χώρο.
Plan-014 B5 (FR12-SHR-02). Ο χώρος προέλευσης δημοσιεύει την αναθεώρηση που έχει ΤΩΡΑ — τη γραμμή εγγράφου ή την ενεργή έκδοση βοηθού — σε έναν άλλο χώρο ή σε όλους όταν destination_workspace_id παραλείπεται. Δημοσίευση ίδιας αναθεώρησης στον ίδιο προορισμό ξανά απαντά με 200 με outcome: already_published και δεν γράφει τίποτα. Δυνατότητα resource_share.publish στον χώρο προέλευσης (Ιδιοκτήτης, Διαχειριστής χώρου).
Δέχεται σώμα αιτήματος JSON.
- 200
- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 429
συμμόρφωση
GET /v1/compliance getCompliance
Τι ακούνε οι καλούντες, πόσο διατηρούνται τα στοιχεία και ποιος στο WeTalk μπορεί να τα ακούσει.
Ο χώρος του εντολέα: οι γραμμές συγκατάθεσης (μία ανά μέσο, με πλήθος γλωσσών που την περιέχουν και ένα δείγμα), ο ισχύων κανόνας διατήρησης ανά κατηγορία, η πρόσβαση χειριστών (ρύθμιση του ΛΟΓΑΡΙΑΣΜΟΥ — operator_access.scope είναι account), το πλήθος ενεργών αριθμών χωρίς κλήσεις, τα αιτήματα προσωπικών δεδομένων του χώρου (τα νεότερα 50) και η προθεσμία AC-34 σε ώρες. outbound_caller_id είναι null: η επώνυμη ταυτότητα καλούντος δεν έχει μοντελοποιηθεί ακόμη.
DELETE /v1/compliance/consent-lines/{medium}/{language_code} deleteConsentLine
Επαναφέρετε την τυπική ειδοποίηση ηχογράφησης WeTalk για μία γλώσσα.
Μόνο σύνδεση ατόμου, ιδιοκτήτης ή διαχειριστής, απορρίπτεται υπό εκπροσώπηση, όπως putConsentLine. Αφαιρεί τη γραμμή του χώρου — δεν υπάρχει «κλειστό»: έκδοση που ηχογραφεί ενημερώνει πάντα τον καλούντα — και επαναδημοσιεύει κάθε ενεργό ή σε παύση βοηθό της γλώσσας με την τυπική ειδοποίηση του γλωσσικού πακέτου. Γράφει compliance.consent_line_changed.
- 200
- 400
- 401
- 403
- 409
- 422
- 429
PUT /v1/compliance/consent-lines/{medium}/{language_code} putConsentLine
Αποθηκεύστε τη διατύπωση του χώρου που ακούνε οι καλούντες πριν αρχίσει ηχογράφηση.
Μόνο σύνδεση ατόμου και ιδιοκτήτης ή διαχειριστής: κλειδί API είναι 403 permission_denied. text καθαρίζεται από ακραία κενά και συμπτύσσει τα υπόλοιπα· απαιτείται μη κενό, έως 300 χαρακτήρες, χωρίς καμία φράση «μην με ηχογραφείς» της γλώσσας (ο βοηθός θα άκουγε τη δική του ειδοποίηση ως άρνηση του καλούντος) — καθεμία είναι 400 validation_failed στο text. Γλώσσα που δεν υποστηρίζει η πλατφόρμα είναι 400 language_unavailable ή language_pack_incomplete.
Εισάγει ή ενημερώνει του χώρου τη consent_line γραμμή και στην ίδια συναλλαγή βάσης επαναδημοσιεύει κάθε ενεργό ή σε παύση βοηθό του χώρου, του οποίου η ενεργή έκδοση μιλά τη γλώσσα και λέει άλλο κείμενο — την ενεργή ρύθμιση με νέα γραμμή, δημοσιευμένη ως νέα έκδοση, όπως ο διακόπτης «Ηχογράφηση κλήσεων» — ώστε οι καλούντες να την ακούνε από την επόμενη συνομιλία. Ένας βοηθός που δεν μπορεί να επαναδημοσιευτεί αναιρεί όλη την αποθήκευση (422 agent_version_not_ready, κατονομάζοντάς τον)· ένας που άλλαξε ενδιάμεσα είναι 409 conflict. Γράφει compliance.consent_line_changed. Χειριστής WeTalk που ενεργεί ως μέλος απορρίπτεται με 403 impersonation_forbidden, και η απόρριψη καταγράφεται στο αρχείο ελέγχου ως impersonation.refused.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 409
- 422
- 429
PUT /v1/compliance/operator-access putOperatorAccess
Επιτρέψτε ή σταματήστε την πρόσβαση χειριστών WeTalk σε ηχογραφήσεις.
Μόνο σύνδεση ατόμου: κλειδί API είναι 403 permission_denied. Γράφει account.operator_access_recording_enabled, που ισχύει για ΚΑΘΕ χώρο του λογαριασμού (operator_access.scope είναι account), και η καταχώριση ελέγχου compliance.operator_access_changed. Χειριστής WeTalk που ενεργεί ως μέλος απορρίπτεται με 403 impersonation_forbidden — χειριστής δεν παραχωρεί πρόσβαση στον εαυτό του — και η ίδια η απόρριψη καταγράφεται στο αρχείο ελέγχου ως impersonation.refused.
Δέχεται σώμα αιτήματος JSON.
POST /v1/compliance/person-data-requests createPersonDataRequest
Ζητήστε εξαγωγή ή διαγραφή όλων των στοιχείων που τηρούνται για ένα άτομο.
Μόνο σύνδεση ατόμου: κλειδί API είναι 403 permission_denied. search_term είναι αριθμός τηλεφώνου διεθνούς μορφής (αγνοούνται κενά, παρενθέσεις και παύλες) ή διεύθυνση email· οτιδήποτε άλλο είναι 400 person_data_request_term_invalid. Η γραμμή αιτήματος αποθηκεύει μόνο κατακερματισμό του όρου — τον κοινό κατακερματισμό τηλεφώνου για αριθμό, SHA-256 πεζής διεύθυνσης για email — και η καταχώριση ελέγχου person_data_request.created καταγράφει κάλυψη (τα τελευταία τέσσερα ψηφία ή τον πρώτο χαρακτήρα και το domain), την οποία search_term_masked εμφανίζει. Ένα person_data_request.run μήνυμα που περιέχει μόνο το αναγνωριστικό του αιτήματος μπαίνει στην ουρά στην ίδια συναλλαγή βάσης.
Απαντά 202: το αίτημα έγινε δεκτό και μπήκε στην ουρά, δεν ολοκληρώθηκε. deadline_at είναι 24 ώρες μετά το requested_at (AC-34) και το progress δείχνει τη θέση του αιτήματος σε σχέση με αυτήν. Δεν έχει αναπτυχθεί ακόμη χειριστής worker για το θέμα (execution.handler_deployed είναι false), επομένως ένα αίτημα στην ουρά δεν προχωρά μέχρι να υπάρξει· η προθεσμία τρέχει ανεξάρτητα και ένα αίτημα που παραμένει στην ουρά μετά από αυτή δείχνει overdue. download_url είναι πάντα null: το αρχείο ολοκληρωμένης εξαγωγής παραλαμβάνεται με downloadPersonDataExport.
Ένας χειριστής WeTalk που ενεργεί ως μέλος απορρίπτεται με 403 impersonation_forbidden — η διαγραφή είναι μη αναστρέψιμη — και η άρνηση καταγράφεται στο αρχείο ελέγχου ως impersonation.refused.
Δέχεται σώμα αιτήματος JSON.
POST /v1/compliance/person-data-requests/{person_data_request_id}/download downloadPersonDataExport
Λάβετε σύνδεσμο σύντομης διάρκειας για το αρχείο ολοκληρωμένης εξαγωγής.
Μόνο σύνδεση ατόμου και ιδιοκτήτης ή διαχειριστής: κλειδί API είναι 403 permission_denied. Το αίτημα πρέπει να είναι ολοκληρωμένη εξαγωγή στον χώρο εργασίας του υποκειμένου· διαγραφή ή εξαγωγή που δεν έχει ολοκληρωθεί είναι 409 person_data_export_not_ready, και εξαγωγή της οποίας το αρχείο αφαιρέθηκε από τον export κανόνα επτά ημερών του container (download_available_until έχει παρέλθει) είναι 410 person_data_export_expired — ζητήστε νέα εξαγωγή. Κάθε κλήση γράφει την εγγραφή ελέγχου person_data_request.downloaded, οριστικοποιημένη πριν υπάρξει ο σύνδεσμος, και επιστρέφει νέο εξουσιοδοτημένο σύνδεσμο ανάγνωσης του zip, έγκυρο μέχρι expires_at (το παράθυρο ανάγνωσης εξαγωγής του API). Ένας χειριστής WeTalk που ενεργεί ως μέλος απορρίπτεται με 403 impersonation_forbidden, και η απόρριψη καταγράφεται στο αρχείο ελέγχου ως impersonation.refused.
- 200
- 401
- 403
- 404
- 409
- 410
- 429
PUT /v1/compliance/retention-policies/{class} putRetentionPolicy
Επιλέξτε πόσο διατηρείται μία κατηγορία δεδομένων σε αυτόν τον χώρο εργασίας.
retain_day πρέπει να είναι μία από τις τιμές που προσφέρει η κατηγορία (option στην κατηγορία στο getCompliance)· κάθε άλλη τιμή και κάθε άγνωστη κατηγορία είναι 400 retention_option_invalid. Προσθέτει ή ενημερώνει την εγγραφή retention_policy του χώρου εργασίας — την εγγραφή που διαβάζει η εκκαθάριση διατήρησης — γράφει την εγγραφή ελέγχου compliance.retention_changed με την τιμή πριν και μετά και βάζει στην ουρά ένα retention.sweep μήνυμα για τον χώρο εργασίας, όλα σε μία συναλλαγή βάσης. Η εκκαθάριση είναι εργασία εφαρμογής στον αποστολέα εξερχόμενων μηνυμάτων, όχι κανόνας κύκλου ζωής αποθήκευσης (AC-35)· μέχρι να αναπτυχθεί ο χειριστής, το μήνυμα περιμένει, όπως δηλώνει η απάντηση στο retention_sweep.handler_deployed.
Δέχεται σώμα αιτήματος JSON.
GET /v1/compliance/retention-policies/{class}/preview previewRetentionPolicy
Τι θα αφαιρούσε η επόμενη εκκαθάριση με την επιλογή περιόδου για μία κατηγορία.
Μόνο ανάγνωση. Μετρά, με τα κριτήρια της εκκαθάρισης διατήρησης, όσα θα αφαιρούνταν στον χώρο εργασίας αν η κατηγορία διατηρούνταν για retain_day ημέρες: ηχογραφήσεις (εγγραφές και ήχο), απομαγνητοφωνήσεις (ανά συνομιλία με έγγραφο ή λόγια που θα αφαιρούνταν) ή κενούς αριθμούς καλούντων (caller_detail), για συνομιλίες που ΤΕΛΕΙΩΣΑΝ πριν από το χρονικό όριο. Οι κατηγορίες που κρατά η εκκαθάριση (order, survey_result, audit) απαντούν swept: false και affected_count: 0. retain_day πρέπει να είναι μία από τις option τιμές της κατηγορίας (400 retention_option_invalid διαφορετικά). Τίποτα δεν αποθηκεύεται· η οθόνη Συμμόρφωση το ελέγχει πριν επιβεβαιώσει μικρότερη περίοδο.
GET /v1/do-not-call-entries listDoNotCallEntries
Οι ενεργές εγγραφές μη κλήσης του λογαριασμού.
agent:write για κλειδί· owner, admin ή member για πρόσωπο. Οι νεότερες πρώτα. source φιλτράρει βάσει τρόπου προσθήκης αριθμού (added_by_member εμφανίζει επίσης προσθήκες χειριστή WeTalk)· search αντιστοιχίζει τα τελευταία ψηφία του αριθμού (όταν ο όρος είναι αριθμός) ή οποιοδήποτε μέρος του ονόματος, χωρίς διάκριση πεζών και κεφαλαίων. matched_count μετρά όλο το φιλτραρισμένο σύνολο και το stat ολόκληρο τον λογαριασμό — κανένα δεν αφορά μόνο τη σελίδα.
POST /v1/do-not-call-entries addDoNotCallEntry
Προσθέστε αριθμό στη λίστα μη κλήσης του λογαριασμού.
agent:write για κλειδί· owner, admin ή member για πρόσωπο. Ο αριθμός κανονικοποιείται σε E.164 (εθνικός αριθμός βάσει χώρας λογαριασμού) και αποθηκεύεται με τον κατακερματισμό του. Γράφεται ως added_by_member με το πρόσωπο, ως added_by_operator με τον χειριστή όταν χειριστής WeTalk ενεργεί ως το πρόσωπο και χωρίς κανένα από τα δύο για κλειδί API. note διατηρείται στην εγγραφή ελέγχου do_not_call_entry.added.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 404
- 409
- 429
DELETE /v1/do-not-call-entries/{do_not_call_entry_id} removeDoNotCallEntry
Αφαιρέστε αριθμό από τη λίστα μη κλήσης του λογαριασμού.
Μόνο με σύνδεση: owner, admin ή member που έχει συνδεθεί. Κλειδί API είναι 403 permission_denied. Χειριστής WeTalk που ενεργεί ως το πρόσωπο είναι 403 impersonation_forbiddenκαι η άρνηση καταγράφεται: οι χειριστές μπορούν να προσθέσουν αποκλεισμό αλλά ποτέ να αφαιρέσουν. Ένα μέλος μπορεί να αφαιρέσει κάθε εγγραφή, ακόμη και προσθήκη χειριστή. Ορίζει removed_at και removed_by_person_id· γράφει την εγγραφή ελέγχου do_not_call_entry.removed.
POST /v1/do-not-call-entries/exports exportDoNotCallEntries
Εξαγάγετε τις ενεργές εγγραφές μη κλήσης του λογαριασμού ως CSV.
agent:write για κλειδί· owner ή admin για πρόσωπο. Η εγγραφή ελέγχου do_not_call_entry.exported (πλήθος εγγραφών και αναγνωριστικό αρχείου) γράφεται πριν υπάρξει το αρχείο. Περισσότερες εγγραφές από WETALK_API_EXPORT_MAX_ROW απορρίπτονται με το πλήθος· το αρχείο δεν περικόπτεται ποτέ.
POST /v1/do-not-call-entries/import importDoNotCallEntries
Προσθέστε κάθε αριθμό CSV στη λίστα μη κλήσης του λογαριασμού.
agent:write για κλειδί· owner, admin ή member για πρόσωπο. Το αρχείο μεταφέρεται ως κείμενο στο source_text (σχέδιο §15.5.6)· διαβάζεται, δεν αποθηκεύεται. Κάθε αναγνώσιμος αριθμός προστίθεται για όλους τους βοηθούς· υπάρχων αριθμός μετριέται, δεν διπλασιάζεται. Γράφει μία εγγραφή ελέγχου, do_not_call_entry.imported, με τα τρία πλήθη.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 413
- 422
- 429
POST /v1/do-not-call-entries/removals removeDoNotCallEntries
Αφαιρέστε πολλούς αριθμούς από τη λίστα μη κλήσης του λογαριασμού μαζί.
Ίδιοι κανόνες με την αφαίρεση ενός (έλεγχος πύλης πελατών #254, 2026-09-27). Μόνο με σύνδεση: owner, admin ή member. Κλειδί API είναι 403 permission_denied. Χειριστής WeTalk που ενεργεί ως το πρόσωπο είναι 403 impersonation_forbidden, η άρνηση καταγράφεται μία φορά και καμία εγγραφή δεν αλλάζει. Κάθε αφαιρεμένη εγγραφή γράφει δική της εγγραφή ελέγχου, do_not_call_entry.removed. Αναγνωριστικό που δεν αντιστοιχεί σε ενεργή εγγραφή του λογαριασμού μετριέται στο not_found_count αντί να απορρίπτεται, ώστε μια ελαφρώς παλιά λίστα να αφαιρεί τις υπόλοιπες εγγραφές.
Δέχεται σώμα αιτήματος JSON.
GET /v1/do-not-call/opt-out-page getOptOutPage
Η επιχείρηση του καλούντος όπως εμφανίζεται στη δημόσια σελίδα εξαίρεσης.
agent:read για κλειδί· κάθε ρόλος μέλους. Το slug και όνομα του λογαριασμού, από τον λογαριασμό των στοιχείων πρόσβασης και κανέναν άλλον: η σελίδα αποκλείει μόνο για αυτή την επιχείρηση (AC-32).
GET /v1/do-not-call/refusal-phrases listRefusalPhrases
Οι φράσεις άρνησης που αναγνωρίζει ο βοηθός ανά γλώσσα και η προθεσμία AC-30.
agent:read για κλειδί· κάθε ρόλος μέλους. Διαβάζεται από τα διαθέσιμα γλωσσικά πακέτα· μη διαθέσιμη γλώσσα (αδημοσίευτη, διαφορετική από τη δημοσιευμένη ή που αποτυγχάνει σε οποιαδήποτε από τις έξι προϋποθέσεις, μαζί με εγκεκριμένες φράσεις άρνησης) λείπει και δεν απαντάται ποτέ σε άλλη γλώσσα. Δείτε DoNotCallRefusalPhraseCard.
POST /v1/public/opt-out/{business_slug} createOptOutRequest
Εξαιρέστε έναν αριθμό από τις κλήσεις μίας επιχείρησης μέσω της δημόσιας σελίδας της.
Χωρίς έλεγχο ταυτότητας. Το slug είναι το δημόσιο όνομα του λογαριασμού (§15.4.3) και το μόνο στοιχείο που ορίζει την επιχείρηση: ο αριθμός αποκλείεται μόνο για αυτόν τον λογαριασμό, όχι άλλον (AC-32), σε όλον τον λογαριασμό (scope = every_voice_agent, source = opt_out_page). Εθνικός αριθμός διαβάζεται βάσει χώρας επιχείρησης. Η υποβολή καταγράφεται ως opt_out_request με κατακερματισμό της διεύθυνσης προέλευσης, ποτέ την ίδια τη διεύθυνση.
Τι δεν αποκαλύπτεται σε άγνωστο. Επαναλαμβανόμενη υποβολή ήδη καταχωρισμένου αριθμού απαντάται ακριβώς όπως η πρώτη — ίδια κατάσταση, ίδιο σώμα, recorded_at είναι η ώρα αυτής της υποβολής — ώστε η σελίδα να μην αποκαλύπτει ποιος έχει εξαιρεθεί. Άγνωστη επιχείρηση και μη αναγνώσιμος αριθμός απορρίπτονται πανομοιότυπα (ίδια κατάσταση, κωδικός, πεδίο και μήνυμα).
Σειρά ελέγχων: όριο ανά προέλευση (μετρά κάθε προσπάθεια), σώμα, CAPTCHA, επιχείρηση και αριθμός. Τίποτα δεν διαβάζεται ή γράφεται μέχρι να περάσει το CAPTCHA: λύση πρόκλησης από getOptOutChallenge γνήσια, μη ληγμένη και μη υποβληθείσα ξανά.
Δέχεται σώμα αιτήματος JSON.
GET /v1/public/opt-out/challenge getOptOutChallenge
Νέα πρόκληση proof-of-work για τη δημόσια σελίδα εξαίρεσης.
Χωρίς έλεγχο ταυτότητας. Πρόκληση ALTCHA (απόφαση προϊόντος A6: αυτοφιλοξενούμενη, χωρίς τρίτο μέρος ή cookie), υπογεγραμμένη από αυτό το API και έγκυρη για πέντε λεπτά. Το widget της σελίδας τη λύνει και η λύση μεταφέρεται ως captcha_token σε createOptOutRequest· κάθε λυμένη πρόκληση γίνεται δεκτή μία φορά.
Μετριέται στο ίδιο όριο ανά προέλευση με createOptOutRequest — η λήψη πρόκλησης καταναλώνει το ίδιο όριο με την υποβολή. Δεν αποθηκεύεται ποτέ σε cache: κάθε κλήση είναι νέα πρόκληση.
Το πεδίο data του σώματος έχει τη μορφή πρόκλησης του ALTCHA, γι’ αυτό τα ονόματα πεδίων είναι camelCase: το widget διαβάζει ακριβώς αυτά.
ταυτότητα
POST /v1/accounts createAccount
Δημιουργήστε οργανισμό για το συνδεδεμένο πρόσωπο (plan-014 B1) ή ολοκληρώστε εγγραφή.
Δύο σώματα, διακρινόμενα βάσει `terms_revision` (παράθυρο συμβατότητας μίας κυκλοφορίας):
* με `terms_revision` — Δημιουργία οργανισμού του plan-014 B1 (FR12-ONB-01 βήμα 2): { account_name, country, first_workspace_name, terms_revision, time_zone? }. Το email του προσώπου πρέπει να είναι επαληθευμένο (403 email_unverified), και terms_revision πρέπει να είναι η ισχύουσα αναθεώρηση όρων (409 terms_acceptance_required — ανανεώστε και αποδεχτείτε τους τρέχοντες όρους). Η ζώνη ώρας χρέωσης είναι η ρυθμισμένη της πλατφόρμας για νέους οργανισμούς και δεν λαμβάνεται ποτέ από το αίτημα· χωρίς time_zone την παίρνει και ο πρώτος χώρος εργασίας. Το Idempotency-Key έχει 16–128 χαρακτήρες. * χωρίς αυτό — το σώμα ανάκτησης του σχεδίου §15.4.2 { account_name, country, time_zone }, που στέλνει η κονσόλα μετά από εγγραφή της οποίας το βήμα λογαριασμού απέτυχε (setup_pending: true). Δημιουργεί όσα θα δημιουργούσε η εγγραφή· δεν καταγράφεται αποδοχή όρων.
Σε κάθε περίπτωση ΜΙΑ οριστικοποιημένη μονάδα δημιουργεί οργανισμό (κατάσταση trial), κοινό υπόλοιπο, πρώτο χώρο εργασίας, ρόλο Owner του προσώπου στον οργανισμό ΚΑΙ στον χώρο εργασίας, χρηματοδότηση χώρου εργασίας με όρους πληρωμής ανά χρήση, μία δοκιμή του προσώπου όταν είναι επαληθευμένο και δεν είχε άλλη (trial_granted), αποδοχή όρων (σώμα B1) και εγγραφές ελέγχου — μετά μεταφέρει το auth_session στον νέο οργανισμό και χώρο εργασίας και θέτει νέο cookie.
Το `Idempotency-Key` απαιτείται, αποθηκευμένο μόνιμα βάσει *προσώπου* και κλειδιού. Ίδιο κλειδί με ίδια στοιχεία μεταφέρει στον οργανισμό του πρώτου αιτήματος — όσο παλιός και αν είναι, ακόμη και σε ταυτόχρονα αιτήματα — αντί να δημιουργεί άλλον· με άλλα στοιχεία είναι 409 idempotency_key_reused_with_different_body.
Απαιτεί X-WeTalk-Csrf που ταιριάζει με το token αυτού του auth_session (401 csrf_token_invalid διαφορετικά), ελέγχεται πριν από οποιαδήποτε αναζήτηση. Αρνήσεις: 400 validation_failed (απόν ή άγνωστο πεδίο, μήκος ονόματος, απόν ή κακοσχηματισμένο Idempotency-Key); 422 country_unsupported; 400 time_zone_invalid; 403 email_unverified; 409 terms_acceptance_required; 403 impersonation_forbidden; 401 authentication_required, auth_session_expired ή auth_session_revoked; 429 rate_limited, ανά διεύθυνση προέλευσης.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 409
- 422
- 429
- 500
POST /v1/auth/discover discoverIdentity
Ανακάλυψη τομέα σύνδεσης — πρέπει αυτή η διεύθυνση να βλέπει πεδίο κωδικού;
Σύνδεση με αρχικό αναγνωριστικό (σχέδιο §8.3). Διεύθυνση εργασίας σε επαληθευμένο domain υπό SSO απαντά microsoft με start_url; show_password είναι false όταν ο οργανισμός επιβάλλει SSO και το πρόσωπο δεν έχει ενεργή άδεια έκτακτης πρόσβασης.
Ασφαλές έναντι απαρίθμησης. Άγνωστο domain, γνωστό χωρίς SSO και κακοσχηματισμένη διεύθυνση απαντούν όλα { "method": "password", "start_url": null, "show_password": true }. Αποκαλύπτεται μόνο αν ένα *domain* διέπεται από SSO — ποτέ αν υπάρχει πρόσωπο ή λογαριασμός. Οι απαντήσεις καθυστερούν μέχρι ρυθμισμένο ελάχιστο ώστε οι δύο περιπτώσεις να έχουν συγκρίσιμο χρόνο και η διαδρομή περιορίζεται ανά διεύθυνση προέλευσης.
Δέχεται σώμα αιτήματος JSON.
POST /v1/auth/email-verification verifyPersonEmail
- δεν χρειάζεται κλειδί
- βαρύ
Επιβεβαιώστε email προσώπου με το token του συνδέσμου επαλήθευσης.
Το token του email επαλήθευσης στο fragment του συνδέσμου (plan-014 MAIL· απάντηση ιδιοκτήτη 41). Δημόσιο: ο σύνδεσμος μπορεί να ανοίξει σε browser χωρίς συνδεδεμένο πρόσωπο. Το token χρησιμοποιείται μία φορά και λήγει με WETALK_API_EMAIL_VERIFICATION_TTL_MS (24 ώρες στην παραγωγή)· χρησιμοποιημένο, ληγμένο ή πλαστό token δίνει μία απάντηση, 404 not_found. Η επαληθευμένη διεύθυνση επιτρέπει στον πρώτο οργανισμό του προσώπου τη δοκιμή (μία ανά επαληθευμένο πρόσωπο). Μετρά στο παράθυρο εγγραφών ανά προέλευση (429 rate_limited).
Δέχεται σώμα αιτήματος JSON.
POST /v1/auth/email-verification/resend resendPersonEmailVerification
- δεν χρειάζεται κλειδί
- βαρύ
Στείλτε νέο σύνδεσμο επαλήθευσης email στο συνδεδεμένο πρόσωπο.
Αντικαθιστά τον ενεργό σύνδεσμο επαλήθευσης (ο παλιός παύει να λειτουργεί) και βάζει νέο email στην ουρά (plan-014 MAIL). Απαιτεί X-WeTalk-Csrf που ταιριάζει με το token αυτού του auth_session (401 csrf_token_invalid διαφορετικά). 202 sent; 200 already_verified όταν η διεύθυνση είναι ήδη επαληθευμένη (τίποτα δεν στέλνεται)· 404 not_found όσο το WeTalk δεν στέλνει email (mail.binding = none); 403 impersonation_forbidden όταν χειριστής WeTalk ενεργεί ως το πρόσωπο· 429 rate_limited πέρα από το παράθυρο του προσώπου.
POST /v1/auth/impersonation-handoff redeemImpersonationHandoff
Εξαργυρώστε παραπομπή υποστήριξης WeTalk και λάβετε το auth_session εκπροσώπησης.
Το τμήμα πελάτη της παραπομπής εκπροσώπησης (σχέδιο §15.7.8, ADR 0017 §7). Όταν χειριστής WeTalk αρχίσει να ενεργεί ως μέλος, η κονσόλα χειριστών ανοίγει <this console's origin>/impersonation/<impersonation_grant_id>#<handoff_token>. Η κονσόλα αφαιρεί αμέσως το fragment και στέλνει εδώ και τις δύο τιμές.
Το token γίνεται δεκτό μόνο αν αντιστοιχεί σε ενεργό auth_session εκδοθέν ακριβώς για αυτή την άδεια, με τον χειριστή ως δράστη, που δεν έχει παρουσιαστεί ποτέ, του οποίου το πρόσωπο είναι ενεργό και έχει ακόμη τη συμμετοχή της άδειας. Μετά αντικαθίσταται αμέσως: το token παραπομπής παύει να λειτουργεί στην πρώτη χρήση και νέο token τίθεται ως __Host-wetalk_session cookie. Η σύνδεση δεν μπορεί να διαρκέσει περισσότερο από την άδεια (έως τριάντα λεπτά) και η μη εξαργυρωμένη παραπομπή λήγει μετά το παράθυρο της εγκατάστασης χειριστών.
Δεν απαιτείται cookie και τυχόν υπάρχον αγνοείται. Κάθε άρνηση — άγνωστο, χρησιμοποιημένο, ληγμένο, ασύμφωνο, ανακλημένο ή κακοσχηματισμένο — είναι το ίδιο 401 impersonation_handoff_invalid, ώστε η διαδρομή να μην αποκαλύπτει πληροφορίες. 400 validation_failed μόνο για σώμα διαφορετικό από την τεκμηριωμένη μορφή.
Το σώμα είναι το auth_session μαζί με τα πεδία ειδοποίησης (actor.operator_display_name, actor.reason) από το αρχείο ελέγχου του λογαριασμού.
Δέχεται σώμα αιτήματος JSON.
POST /v1/auth/invitation/accept acceptInvitation
- δεν χρειάζεται κλειδί
- βαρύ
Εγγραφείτε σε χώρο εργασίας από σύνδεσμο πρόσκλησης, με ορισμό κωδικού αν είστε νέοι.
Σχέδιο §16.37. Browser με ενεργή σύνδεση συμμετέχει ως εκείνο το πρόσωπο (και πρέπει να φέρει x-wetalk-csrf)· η διεύθυνση πρόσκλησης πρέπει να είναι δική του, αλλιώς 403 permission_denied. Διαφορετικά δημιουργείται πρόσωπο για τη διεύθυνση της πρόσκλησης με display_name και password (κανόνες εγγραφής: 400 password_too_short; 409 email_taken όταν η διεύθυνση έχει ήδη σύνδεση — συνδεθείτε και ανοίξτε ξανά τον σύνδεσμο). Δεν ιδρύει δικό του λογαριασμό. Η πρόσκληση χρησιμοποιείται μία φορά· η σύνδεση μεταφέρεται στον λογαριασμό και χώρο εργασίας και τίθεται cookie.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 429
POST /v1/auth/invitation/inspect inspectInvitation
- δεν χρειάζεται κλειδί
- βαρύ
Πού οδηγεί η πρόσκληση πριν συνδεθεί κανείς.
Η πρώτη ανάγνωση της σελίδας συμμετοχής (σχέδιο §16.37). Το token είναι η άδεια· μεταφέρεται στο σώμα για να μην εμφανίζεται στα αρχεία πρόσβασης. 404 not_found για σύνδεσμο χρησιμοποιημένο, ληγμένο, ανακλημένο ή ανύπαρκτο — μία απάντηση και για τις τέσσερις περιπτώσεις.
Δέχεται σώμα αιτήματος JSON.
POST /v1/auth/login logInPerson
- δεν χρειάζεται κλειδί
- βαρύ
Συνδεθείτε με email και κωδικό.
Θέτει το __Host-wetalk_session cookie για έγκυρα στοιχεία και απαντά 401 διαφορετικά.
Κάθε αποτυχία που αφορά πρόσωπο — άγνωστη διεύθυνση, λάθος κωδικός, κλειδωμένο, απενεργοποιημένο ή πρόσωπο που συνδέεται μόνο μέσω Google — είναι το ίδιο `401 credential_invalid`, με ίδιο μήνυμα, χωρίς `field` και ίδιο κόστος: καθεμία εκτελεί πλήρη παραγωγή κωδικού με υψηλές απαιτήσεις μνήμης πριν απαντήσει. Το κλείδωμα δεν ανακοινώνεται· η ανάκτηση γίνεται με κανονική επαναφορά κωδικού.
401 sso_required_for_domain είναι η μόνη διαφορετική άρνηση, επειδή αφορά *domain* που ήδη αποκαλύπτεται στην ανακάλυψη. Πρόσωπο με ακριβώς έναν λογαριασμό μεταφέρεται σε αυτόν· πρόσωπο χωρίς κανέναν ή με πολλούς λαμβάνει auth_session χωρίς επιλεγμένο λογαριασμό και τον κατάλογο account_choice.
Δέχεται σώμα αιτήματος JSON.
POST /v1/auth/logout logOutPerson
Τερματίστε αυτό το auth_session.
Ανακαλεί το auth_session του cookie και καθαρίζει το cookie. Απαιτεί X-WeTalk-Csrf που ταιριάζει με το token αυτού του auth_session (401 csrf_token_invalid διαφορετικά), ελέγχεται πριν από οποιαδήποτε αναζήτηση. Idempotent: ήδη ληγμένο auth_session απαντάται με 204 και το cookie καθαρίζεται ούτως ή άλλως.
GET /v1/auth/sign-in-code readSignInCodeAvailability
Μπορεί να σταλεί κωδικός σύνδεσης μέσω email σε αυτό το περιβάλλον;
Αν το POST /v1/auth/sign-in-code μπορεί να στείλει κωδικό. false όσο το WeTalk δεν έχει αποστολέα email· η σελίδα σύνδεσης τότε δεν προσφέρει κωδικό μέσω email. Δεν δηλώνει τίποτα για καμία διεύθυνση.
POST /v1/auth/sign-in-code requestSignInCode
- δεν χρειάζεται κλειδί
- βαρύ
Στείλτε κωδικό σύνδεσης μίας χρήσης μέσω email (ομοιόμορφη απάντηση).
FR12-SEC-02. Απαντά 202 ίδια για γνωστή και άγνωστη διεύθυνση και θέτει το HttpOnly cookie πρόκλησης __Host-wetalk_sign_in_code με το οποίο πρέπει να υποβληθεί ο κωδικός (δέσμευση browser). Κωδικός στέλνεται μόνο σε υπαρκτό πρόσωπο. Νέο αίτημα με ανοιχτό κωδικό είναι επαναποστολή: ο παλιός παύει να λειτουργεί. Έως personSecurity.signInCodeResendMaximumPerHour επαναποστολές ανά διεύθυνση την ώρα (429 rate_limited). Διεύθυνση σε domain με υποχρεωτικό SSO είναι 401 sso_required_for_domain. 404 not_found όταν δεν υπάρχει αποστολέας email (δείτε readSignInCodeAvailability). Κωδικός μέσω email δεν μετρά ποτέ ως δεύτερος παράγοντας.
Δέχεται σώμα αιτήματος JSON.
POST /v1/auth/sign-in-code/verify verifySignInCode
- δεν χρειάζεται κλειδί
- βαρύ
Συνδεθείτε με τον κωδικό του email.
Χρειάζεται το cookie πρόκλησης που έθεσε το requestSignInCode. Μίας χρήσης, λήγει μετά personSecurity.signInCodeExpirySecond, έως personSecurity.signInCodeAttemptMaximum προσπάθειες (η τελευταία ακυρώνει τον κωδικό)· λάθος κωδικός μετρά στο κλείδωμα προσώπου. Κάθε αποτυχία είναι το ίδιο 401 sign_in_code_invalid. Σε επιτυχία τίθεται το cookie auth_session όπως στη σύνδεση με κωδικό· το mfa_verified_at του auth_session δεν τίθεται ποτέ από κωδικό email.
Δέχεται σώμα αιτήματος JSON.
POST /v1/auth/signup signUpPerson
- δεν χρειάζεται κλειδί
- βαρύ
Δημιουργήστε πρόσωπο με κωδικό και επαγγελματικό λογαριασμό και συνδέστε το.
Τα δύο βήματα του σχεδίου §15.4.2 σε ένα αίτημα. Πρώτα το πρόσωπο και ο κωδικός του, με auth_session και το __Host-wetalk_session cookie (Secure; HttpOnly; SameSite=Lax; Path=/). Μετά το λογαριασμός που ορίζει το όνομα επιχείρησης: λογαριασμός, λογαριασμός χρέωσης, πρώτος χώρος εργασίας, η owner συμμετοχή του προσώπου και η δοκιμή (WETALK_API_TRIAL_GRANT_SECOND, 30 δωρεάν λεπτά). Το auth_session μεταφέρεται έπειτα σε λογαριασμό και χώρο εργασίας, ώστε το 201 κανονικά περιέχει account_id, workspace_id και member_role: ownerκαι νέο cookie.
Τα δύο βήματα χρησιμοποιούν δύο ρόλους βάσης και δεν μοιράζονται συναλλαγή, επομένως αποτυχία αφού υπάρχει το πρόσωπο αναφέρεται ειλικρινά, δεν κρύβεται. Παραμένει `201`:
* setup_pending: true, account_id: null — ο λογαριασμός δεν δημιουργήθηκε. Ολοκληρώστε με POST /v1/accounts (createAccount). * setup_pending: false, account_id: null, ο νέος λογαριασμός στο account_choice — ο λογαριασμός υπάρχει αλλά η σύνδεση δεν μεταφέρθηκε. Ολοκληρώστε με POST /v1/session/account (switchAuthSessionAccount), ποτέ με δεύτερο createAccount.
Όλα ελέγχονται πριν δημιουργηθεί το πρόσωπο: πεδία, χώρα (κλειστός κατάλογος· 422 country_unsupported), ζώνη ώρας (όνομα IANA· 400 time_zone_invalid) και κατάλογος πλατφόρμας. Μηδέν ή πολλοί ισχύοντες τιμοκατάλογοι είναι 500 data_integrity_out_of_range χωρίς δημιουργία — δεν υπάρχει εφεδρικός τιμοκατάλογος.
Απορρίψεις: 400 password_too_short (λιγότεροι από 10 χαρακτήρες) ή validation_failed με ονομασία πεδίου· 401 sso_required_for_domain όταν ο οργανισμός της διεύθυνσης επιβάλλει σύνδεση Microsoft (σχέδιο §8.3 — λογαριασμός κωδικού εκεί θα ήταν κατάληψη)· 409 email_taken όταν υπάρχει ήδη πρόσωπο με τη διεύθυνση. Το τελευταίο αναγνωρίζεται ότι αποκαλύπτει ύπαρξη, γι’ αυτό η διαδρομή περιορίζεται ανά προέλευση.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 409
- 410
- 422
- 429
- 500
POST /v1/invitations/accept acceptAccountInvitation
Αποδεχτείτε πρόσκληση οργανισμού.
Plan-014 B2 (FR12-TEAM-03, FR12-ONB-04). Το συνδεδεμένο πρόσωπο με το προσκεκλημένο email (403 invitation_identity_mismatch διαφορετικά). Απάντηση ιδιοκτήτη 45: αποδοχή με την προσκεκλημένη διεύθυνση την ΕΠΑΛΗΘΕΥΕΙ αν δεν ήταν ήδη επαληθευμένη (το token email αποδεικνύει το γραμματοκιβώτιο) — χωρίς δεύτερο email επαλήθευσης· άλλη διεύθυνση δεν επαληθεύεται ποτέ. Η τρέχουσα εξουσία του προσκαλούντος ελέγχεται ξανά (αφαίρεση ή υποβάθμισή του ακυρώνει τον σύνδεσμο)· χορηγείται ρόλος οργανισμού ή επαναχρησιμοποιείται ο υπάρχων· δημιουργείται κάθε ρόλος χώρου εργασίας ή επαναχρησιμοποιείται η συμμετοχή, σε μία συναλλαγή βάσης. Το token λειτουργεί μία φορά· δεύτερη αποδοχή από το ίδιο πρόσωπο — ταυτόχρονη ή αργότερα — επιστρέφει ίδιο αποτέλεσμα (replayed: true). Δεν δημιουργεί οργανισμό, χώρο εργασίας, συνδρομή ή δοκιμή. Η κονσόλα μετά μεταβαίνει στο account_id και πηγαίνει στο landing. Απαιτεί X-WeTalk-Csrf· χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται.
Δέχεται σώμα αιτήματος JSON.
POST /v1/invitations/inspect inspectAccountInvitation
Τι προσφέρει πρόσκληση οργανισμού.
Plan-014 B2 (FR12-ONB-04). Το token είναι η απόδειξη· δεν απαιτείται σύνδεση. Απαντά οργανισμό, ακριβώς τις προσφερόμενες συμμετοχές (χώρος εργασίας που αρχειοθετήθηκε έκτοτε είναι available: false και δεν χορηγείται), αν η προσκεκλημένη διεύθυνση συνδέεται ήδη στο WeTalk, πολιτική οργανισμού και — όταν παρουσιάζεται ενεργό cookie — αν το συνδεδεμένο πρόσωπο είναι το προσκεκλημένο. Πρόσκληση που ο θεατής έχει ήδη αποδεχτεί απαντά state: accepted με τον προορισμό. Κάθε μη χρησιμοποιήσιμο token έχει μία απάντηση: 410 invitation_unavailable.
Δέχεται σώμα αιτήματος JSON.
GET /v1/me/auth-sessions listMyAuthSessions
Πού έχω συνδεθεί.
Μόνο προσωπική ταυτότητα: cookie auth_session, με επιλεγμένο οργανισμό ή χωρίς. Χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται με 403 impersonation_forbidden (σχέδιο §27.5.5).
DELETE /v1/me/auth-sessions/{auth_session_id} revokeMyAuthSession
Αποσυνδέστε μία άλλη συσκευή μου.
Μόνο προσωπική ταυτότητα: cookie auth_session, με επιλεγμένο οργανισμό ή χωρίς. Χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται με 403 impersonation_forbidden (σχέδιο §27.5.5). Η εγγραφή περιέχει x-wetalk-csrf. 400 για τη συσκευή που κάνει το αίτημα (χρησιμοποιήστε αποσύνδεση)· 404 not_found για οτιδήποτε δεν είναι ενεργό auth_session του ίδιου του προσώπου.
Έλεγχος ασφαλείας CR-1 (2026-10-06): όταν το πρόσωπο έχει ενεργό authenticator, η εγγραφή απαιτεί auth_session που τον πέρασε (mfa_verified_at), αλλιώς 401 assurance_required — απαντήστε POST /v1/me/mfa/challenge (κωδικός authenticator ή κωδικός ανάκτησης) και επαναλάβετε. Η επιβεβαίωση κωδικού πρόσβασης δεν τον αντικαθιστά.
POST /v1/me/auth-sessions/sign-out-others signOutMyOtherAuthSessions
Αποσυνδέστε όλες τις άλλες συσκευές.
Μόνο προσωπική ταυτότητα: cookie auth_session, με επιλεγμένο οργανισμό ή χωρίς. Χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται με 403 impersonation_forbidden (σχέδιο §27.5.5). Η εγγραφή περιέχει x-wetalk-csrf.
Έλεγχος ασφαλείας CR-1 (2026-10-06): όταν το πρόσωπο έχει ενεργό authenticator, η εγγραφή απαιτεί auth_session που τον πέρασε (mfa_verified_at), αλλιώς 401 assurance_required — απαντήστε POST /v1/me/mfa/challenge (κωδικός authenticator ή κωδικός ανάκτησης) και επαναλάβετε. Η επιβεβαίωση κωδικού πρόσβασης δεν τον αντικαθιστά.
GET /v1/me/domain-join-offers listDomainJoinOffers
Οι προσφορές συμμετοχής σε οργανισμό μέσω επαληθευμένου domain email.
Απάντηση ιδιοκτήτη 47. Μία προσφορά ανά οργανισμό και επαληθευμένο domain: οργανισμός, domain και χώροι εργασίας με ρόλο συμμετοχής (ποτέ Owner ή Admin). Μόνο ΕΠΑΛΗΘΕΥΜΕΝΗ διεύθυνση, domain σε κατάσταση verified με αυτόματη συμμετοχή, οργανισμός που δεν έκλεισε και πρόσωπο χωρίς συμμετοχή λογαριασμού ή χώρου εργασίας εκεί σε καμία κατάσταση (πρόσωπο που αφαίρεσε Owner δεν λαμβάνει νέα προσφορά — μπορεί όμως να προσκληθεί). Μη επαληθευμένη διεύθυνση δεν έχει προσφορές. Η απόρριψη προσφοράς αφορά την κονσόλα· δεν αποθηκεύεται τίποτα.
POST /v1/me/domain-join-offers/{offer_id}/accept acceptDomainJoinOffer
Αποδεχτείτε προσφορά συμμετοχής μέσω επαληθευμένου domain email.
Απάντηση ιδιοκτήτη 47. Πρώτα ελέγχεται η πολιτική σύνδεσης οργανισμού (plan-014 C2, FR12-SEC-06): αυστηρότερη πολιτική είναι 401 assurance_required, δίκτυο εκτός των περιοχών του 403 network_not_allowed· καμία περίπτωση δεν συμμετέχει. Μετά, σε μία συναλλαγή βάσης στον οργανισμό, ελέγχεται ξανά κάθε προϋπόθεση και δημιουργείται συμμετοχή σε κάθε ονομασμένο ενεργό χώρο εργασίας με τον περιορισμένο ρόλο (προέλευση domain_join· ποτέ ρόλος οργανισμού), καταγράφεται ως membership.domain_joined. Προσφορά που δεν ισχύει πλέον — για οποιαδήποτε αιτία — είναι 410 domain_join_offer_unavailable. Η κονσόλα μετά μεταβαίνει στο account_id και πηγαίνει στο landing. Απαιτεί X-WeTalk-Csrf.
POST /v1/me/email-changes requestMyEmailChange
- δεν χρειάζεται κλειδί
- βαρύ
Αλλάξτε το email μου: σύνδεσμος επιβεβαίωσης στέλνεται στη νέα διεύθυνση.
Μόνο προσωπική ταυτότητα: cookie auth_session, με επιλεγμένο οργανισμό ή χωρίς. Χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται με 403 impersonation_forbidden (σχέδιο §27.5.5). Η εγγραφή περιέχει x-wetalk-csrf. Αλλαγή ασφαλείας: απαιτεί επιβεβαίωση εντός WETALK_API_STEP_UP_MAX_AGE_S (POST /v1/session/step-up ή POST /v1/me/mfa/challenge), αλλιώς 401 step_up_required. 409 email_taken όταν άλλη σύνδεση κατέχει τη διεύθυνση· 404 not_found όταν δεν υπάρχει αποστολέας email. Η αλλαγή γίνεται μόνο όταν ανοιχτεί ο σύνδεσμος (confirmMyEmailChange)· τότε ενημερώνεται η προηγούμενη διεύθυνση.
Έλεγχος ασφαλείας CR-1 (2026-10-06): όταν το πρόσωπο έχει ενεργό authenticator, η εγγραφή απαιτεί auth_session που τον πέρασε (mfa_verified_at), αλλιώς 401 assurance_required — απαντήστε POST /v1/me/mfa/challenge (κωδικός authenticator ή κωδικός ανάκτησης) και επαναλάβετε. Η επιβεβαίωση κωδικού πρόσβασης δεν τον αντικαθιστά.
Δέχεται σώμα αιτήματος JSON.
POST /v1/me/email-changes/confirm confirmMyEmailChange
- δεν χρειάζεται κλειδί
- βαρύ
Επιβεβαιώστε αλλαγή email με το token του συνδέσμου.
Το token είναι η άδεια (μίας χρήσης, λήγει μετά WETALK_API_EMAIL_VERIFICATION_TTL_MS)· δεν απαιτείται cookie. 404 not_found για χρησιμοποιημένο, ληγμένο ή άγνωστο token. Ενημερώνεται η προηγούμενη διεύθυνση και η αλλαγή γράφεται στο αρχείο ελέγχου κάθε οργανισμού του προσώπου.
Δέχεται σώμα αιτήματος JSON.
POST /v1/me/mfa/challenge answerMyMfaChallenge
- δεν χρειάζεται κλειδί
- βαρύ
Αποδείξτε το δεύτερο βήμα μου (κωδικός authenticator ή ανάκτησης).
Μόνο προσωπική ταυτότητα: cookie auth_session, με επιλεγμένο οργανισμό ή χωρίς. Χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται με 403 impersonation_forbidden (σχέδιο §27.5.5). Η εγγραφή περιέχει x-wetalk-csrf. Επισημαίνει το mfa_verified_at και την επιβεβαίωση αυτού του auth_session. Κωδικός TOTP λειτουργεί μία φορά (επανάληψη απορρίπτεται βάσει χρονικού βήματος)· κωδικός ανάκτησης λειτουργεί μία φορά και καταγράφεται η χρήση του. 401 mfa_factor_invalid / 401 recovery_code_invalid· με όριο αιτημάτων (429) και μετρά στο κλείδωμα.
Δέχεται σώμα αιτήματος JSON.
POST /v1/me/mfa/recovery-codes regenerateMyRecoveryCodes
Δημιουργήστε νέους κωδικούς ανάκτησης· οι παλιοί παύουν να λειτουργούν.
Μόνο προσωπική ταυτότητα: cookie auth_session, με επιλεγμένο οργανισμό ή χωρίς. Χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται με 403 impersonation_forbidden (σχέδιο §27.5.5). Η εγγραφή περιέχει x-wetalk-csrf. Αλλαγή ασφαλείας: απαιτεί επιβεβαίωση εντός WETALK_API_STEP_UP_MAX_AGE_S (POST /v1/session/step-up ή POST /v1/me/mfa/challenge), αλλιώς 401 step_up_required. 403 mfa_enrolment_required χωρίς authenticator. Οι κωδικοί απαντώνται μία φορά και αποθηκεύονται μόνο ως σύνοψη με κλειδί.
Έλεγχος ασφαλείας CR-1 (2026-10-06): όταν το πρόσωπο έχει ενεργό authenticator, η εγγραφή απαιτεί auth_session που τον πέρασε (mfa_verified_at), αλλιώς 401 assurance_required — απαντήστε POST /v1/me/mfa/challenge (κωδικός authenticator ή κωδικός ανάκτησης) και επαναλάβετε. Η επιβεβαίωση κωδικού πρόσβασης δεν τον αντικαθιστά.
POST /v1/me/mfa/totp startMyTotpEnrolment
Ξεκινήστε (ή αντικαταστήστε) την εφαρμογή authenticator μου.
Μόνο προσωπική ταυτότητα: cookie auth_session, με επιλεγμένο οργανισμό ή χωρίς. Χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται με 403 impersonation_forbidden (σχέδιο §27.5.5). Η εγγραφή περιέχει x-wetalk-csrf. Αλλαγή ασφαλείας: απαιτεί επιβεβαίωση εντός WETALK_API_STEP_UP_MAX_AGE_S (POST /v1/session/step-up ή POST /v1/me/mfa/challenge), αλλιώς 401 step_up_required. Απαντά το otpauth:// URI μία φορά (η κονσόλα εμφανίζει QR· ο σπόρος δεν επιστρέφεται ξανά και αποθηκεύεται μόνο στο vault MFA προσώπων). Επιβεβαιώστε εντός personSecurity.totpEnrolmentExpirySecond· νέα έναρξη αντικαθιστά μη ολοκληρωμένη.
Έλεγχος ασφαλείας CR-1 (2026-10-06): όταν το πρόσωπο έχει ενεργό authenticator, η εγγραφή απαιτεί auth_session που τον πέρασε (mfa_verified_at), αλλιώς 401 assurance_required — απαντήστε POST /v1/me/mfa/challenge (κωδικός authenticator ή κωδικός ανάκτησης) και επαναλάβετε. Η επιβεβαίωση κωδικού πρόσβασης δεν τον αντικαθιστά.
POST /v1/me/mfa/totp/confirm confirmMyTotpEnrolment
- δεν χρειάζεται κλειδί
- βαρύ
Επιβεβαιώστε τον authenticator με κωδικό 6 ψηφίων.
Μόνο προσωπική ταυτότητα: cookie auth_session, με επιλεγμένο οργανισμό ή χωρίς. Χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται με 403 impersonation_forbidden (σχέδιο §27.5.5). Η εγγραφή περιέχει x-wetalk-csrf. 401 mfa_factor_invalid για λάθος κωδικό (μετρά στο κλείδωμα). Ο πρώτος authenticator απαντά τους κωδικούς ανάκτησης μία φορά (recovery_code, personSecurity.recoveryCodeCount συνολικά)· αντικατάσταση διατηρεί τους υπάρχοντες κωδικούς και απαντά null.
Έλεγχος ασφαλείας CR-1 (2026-10-06): όταν το πρόσωπο έχει ενεργό authenticator, η εγγραφή απαιτεί auth_session που τον πέρασε (mfa_verified_at), αλλιώς 401 assurance_required — απαντήστε POST /v1/me/mfa/challenge (κωδικός authenticator ή κωδικός ανάκτησης) και επαναλάβετε. Η επιβεβαίωση κωδικού πρόσβασης δεν τον αντικαθιστά.
Δέχεται σώμα αιτήματος JSON.
POST /v1/me/password changeMyPassword
- δεν χρειάζεται κλειδί
- βαρύ
Αλλάξτε (ή ορίστε) κωδικό μου· οι άλλες συσκευές μου αποσυνδέονται.
Μόνο προσωπική ταυτότητα: cookie auth_session, με επιλεγμένο οργανισμό ή χωρίς. Χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται με 403 impersonation_forbidden (σχέδιο §27.5.5). Η εγγραφή περιέχει x-wetalk-csrf. Αλλαγή ασφαλείας: απαιτεί επιβεβαίωση εντός WETALK_API_STEP_UP_MAX_AGE_S (POST /v1/session/step-up ή POST /v1/me/mfa/challenge), αλλιώς 401 step_up_required. Ισχύουν οι κανόνες εγγραφής (400 password_too_short). Κάθε άλλο auth_session του προσώπου ανακαλείται.
Έλεγχος ασφαλείας CR-1 (2026-10-06): όταν το πρόσωπο έχει ενεργό authenticator, η εγγραφή απαιτεί auth_session που τον πέρασε (mfa_verified_at), αλλιώς 401 assurance_required — απαντήστε POST /v1/me/mfa/challenge (κωδικός authenticator ή κωδικός ανάκτησης) και επαναλάβετε. Η επιβεβαίωση κωδικού πρόσβασης δεν τον αντικαθιστά.
Δέχεται σώμα αιτήματος JSON.
GET /v1/me/profile readMyProfile
Το προφίλ μου — ίδιο σε κάθε οργανισμό.
Μόνο προσωπική ταυτότητα: cookie auth_session, με επιλεγμένο οργανισμό ή χωρίς. Χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται με 403 impersonation_forbidden (σχέδιο §27.5.5).
PATCH /v1/me/profile updateMyProfile
Αλλάξτε εμφανιζόμενο όνομα, locale ή ζώνη ώρας μου.
Μόνο προσωπική ταυτότητα: cookie auth_session, με επιλεγμένο οργανισμό ή χωρίς. Χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται με 403 impersonation_forbidden (σχέδιο §27.5.5). Η εγγραφή περιέχει x-wetalk-csrf. time_zone πρέπει να είναι ζώνη IANA (400 time_zone_invalid); null καθαρίζει το locale ή τη ζώνη ώρας.
Έλεγχος ασφαλείας CR-1 (2026-10-06): όταν το πρόσωπο έχει ενεργό authenticator, η εγγραφή απαιτεί auth_session που τον πέρασε (mfa_verified_at), αλλιώς 401 assurance_required — απαντήστε POST /v1/me/mfa/challenge (κωδικός authenticator ή κωδικός ανάκτησης) και επαναλάβετε. Η επιβεβαίωση κωδικού πρόσβασης δεν τον αντικαθιστά.
Δέχεται σώμα αιτήματος JSON.
GET /v1/me/sign-in-methods listMySignInMethods
Οι τρόποι σύνδεσής μου και το δεύτερο βήμα μου.
Μόνο προσωπική ταυτότητα: cookie auth_session, με επιλεγμένο οργανισμό ή χωρίς. Χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται με 403 impersonation_forbidden (σχέδιο §27.5.5). linkable είναι false όσο το WeTalk δεν παρέχει σύνδεση Google ή Microsoft.
DELETE /v1/me/sign-in-methods/{provider} unlinkMySignInMethod
Αφαιρέστε τρόπο σύνδεσης — ποτέ τον τελευταίο.
Μόνο προσωπική ταυτότητα: cookie auth_session, με επιλεγμένο οργανισμό ή χωρίς. Χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται με 403 impersonation_forbidden (σχέδιο §27.5.5). Η εγγραφή περιέχει x-wetalk-csrf. Αλλαγή ασφαλείας: απαιτεί επιβεβαίωση εντός WETALK_API_STEP_UP_MAX_AGE_S (POST /v1/session/step-up ή POST /v1/me/mfa/challenge), αλλιώς 401 step_up_required. 409 last_sign_in_method όταν είναι ο τελευταίος χρησιμοποιήσιμος τρόπος σύνδεσης· 404 not_found όταν δεν έχει ρυθμιστεί.
Έλεγχος ασφαλείας CR-1 (2026-10-06): όταν το πρόσωπο έχει ενεργό authenticator, η εγγραφή απαιτεί auth_session που τον πέρασε (mfa_verified_at), αλλιώς 401 assurance_required — απαντήστε POST /v1/me/mfa/challenge (κωδικός authenticator ή κωδικός ανάκτησης) και επαναλάβετε. Η επιβεβαίωση κωδικού πρόσβασης δεν τον αντικαθιστά.
POST /v1/me/sign-in-methods/{provider}/link linkMySignInMethod
Συνδέστε Google ή Microsoft (δεν είναι ακόμη διαθέσιμο).
Μόνο προσωπική ταυτότητα: cookie auth_session, με επιλεγμένο οργανισμό ή χωρίς. Χειριστής που ενεργεί ως το πρόσωπο απορρίπτεται με 403 impersonation_forbidden (σχέδιο §27.5.5). Η εγγραφή περιέχει x-wetalk-csrf. Απαντά 404 not_found σε αυτή την κυκλοφορία: οι διαδρομές σύνδεσης εξαρτώμενου μέρους δεν παρέχονται. Ταυτότητες δεν συγχωνεύονται ποτέ βάσει μη επαληθευμένου email.
Έλεγχος ασφαλείας CR-1 (2026-10-06): όταν το πρόσωπο έχει ενεργό authenticator, η εγγραφή απαιτεί auth_session που τον πέρασε (mfa_verified_at), αλλιώς 401 assurance_required — απαντήστε POST /v1/me/mfa/challenge (κωδικός authenticator ή κωδικός ανάκτησης) και επαναλάβετε. Η επιβεβαίωση κωδικού πρόσβασης δεν τον αντικαθιστά.
POST /v1/operator-action-confirmations/confirm confirmOperatorAction
- δεν χρειάζεται κλειδί
- βαρύ
Επιβεβαιώστε αλλαγή που προετοίμασε η υποστήριξη WeTalk, με το token του συνδέσμου.
awaiting_approval: δεύτερος χειριστής WeTalk αποφασίζει στη συνέχεια (εντός 7 ημερών). approved: χειριστής την εφαρμόζει. Η επιβεβαίωση γράφεται στο αρχείο ελέγχου οργανισμού με το πρόσωπο ως δράστη.
Δέχεται σώμα αιτήματος JSON.
POST /v1/operator-action-confirmations/inspect inspectOperatorActionConfirmation
- δεν χρειάζεται κλειδί
- βαρύ
Τι ζητά ένας σύνδεσμος επιβεβαίωσης από το πρόσωπο — μόνο ανάγνωση.
Δέχεται σώμα αιτήματος JSON.
GET /v1/session getCurrentAuthSession
Ποιος συνδέθηκε, σε ποιον λογαριασμό και εκ μέρους ποιου.
Η πηγή αλήθειας της κονσόλας για συνδεδεμένο πρόσωπο, λογαριασμό, ρόλο μέλους και ειδοποίηση εκπροσώπησης (σχέδιο §5.2, §8.7). Απαντά και μη ενταγμένο σε λογαριασμό auth_session (account_id: null, με account_choice).
401 authentication_required όταν δεν υπάρχει cookie· 401 auth_session_expired — με καθαρισμένο cookie — όταν υπάρχει ληγμένο, ανακλημένο ή άγνωστο. Σκόπιμα δεν δηλώνεται ποια περίπτωση ίσχυσε.
ΤΡΟΠΟΠΟΙΗΘΗΚΕ 2026-10-07 (plan-014 ACT, σχέδιο §27.6.3): σύνδεση σε χώρο εργασίας ή οργανισμό όπου δεν ανήκει πια το πρόσωπο ΔΕΝ αποσυνδέεται. Αντικαθίσταται (νέο cookie, νέα γενιά πεδίου εφαρμογής) προς τον επόμενο επιτρεπόμενο προορισμό — άλλο προσβάσιμο χώρο εργασίας του οργανισμού, αλλιώς μόνο τον οργανισμό αν έχει εκεί ρόλο, αλλιώς την επιλογή — και το σώμα περιέχει notice: { code: "membership_revoked" }. Το auth_session εκπροσώπησης χειριστή κρατά την παλιά απάντηση (σταθερό πεδίο εφαρμογής), ένα 401 auth_session_expired.
ΤΡΟΠΟΠΟΙΗΘΗΚΕ 2026-10-07 (plan-014 FIX2): οι καρτέλες browser μοιράζονται cookie· ανάγνωση δεύτερης καρτέλας που έφυγε πριν επιστρέψει η αλλαγή περιέχει το token που μόλις αντικαταστάθηκε. Για 30 δευτερόλεπτα μετά την αλλαγή το token απαντάται με 409 auth_session_superseded και το cookie παραμένει άθικτο (δεν καθαρίζεται ποτέ): διαβάστε ξανά τη σύνδεση με το τρέχον cookie του browser. Δεν του περιγράφεται τίποτα.
Το σώμα περιέχει το csrf_tokenτου auth_session, την τιμή που πρέπει να στέλνει κάθε μη GET αίτημα με cookie ως X-WeTalk-Csrf.
Plan-014 A2 (σχέδιο §27.6.1), προσθετικά: context είναι το πλαίσιο ελέγχου ταυτότητας τριών καταστάσεων (selection_required, account_only, workspace_selected) με το scope_generation, οργανισμό, χώρο εργασίας, κατάλογο δυνατοτήτων και στοιχεία διασφάλισης· landing είναι ο προορισμός της κονσόλας· κάθε account_choice εγγραφή περιέχει και πεδία του οργανισμού. Τα επίπεδα account_id / account_name / workspace_id / member_role πεδία και το account_name / member_role κάθε επιλογής διατηρούν τη σημασία τους για μία κυκλοφορία (παράθυρο συμβατότητας). Κάθε αίτημα cookie σε διαδρομή συγκεκριμένου πεδίου πρέπει να στέλνει X-WeTalk-Scope-Generation με context.scope_generation· παλιό ή απόν είναι 409 scope_changed.
POST /v1/session/account switchAuthSessionAccount
Μεταφέρετε αυτό το auth_session σε άλλον οργανισμό, χώρο εργασίας του ή μόνο στον οργανισμό.
Σχέδιο §15.4.4, §27.6.2. Ο οργανισμός πρέπει να είναι προσβάσιμος στο πρόσωπο (συμμετοχή λογαριασμού, χώρων εργασίας ή και τα δύο)· ο χώρος εργασίας είναι ο ονομασμένος. Με scope_generation (νέα σύμβαση) workspace_id: null σημαίνει ΜΟΝΟ ο οργανισμός — απαιτεί εκεί ρόλο λογαριασμού (403 capability_missing διαφορετικά) — και η γενιά πρέπει να είναι η τρέχουσα του auth_session (409 scope_changed διαφορετικά, καμία αλλαγή). Χωρίς αυτό (παλιά σύμβαση, μία κυκλοφορία) workspace_id: null σημαίνει η πρώτη συμμετοχή χώρου εργασίας του οργανισμού ή μόνο ο οργανισμός για πρόσωπο με ρόλο λογαριασμού χωρίς χώρο εργασίας εκεί. Auth_session χωρίς λογαριασμό (πρόσωπο με πολλούς οργανισμούς που δεν επέλεξε) είναι κανονικός καλών.
Η αλλαγή πεδίου είναι αλλαγή προνομίων, οπότε το auth_session αντικαθίσταται: νέο token και cookie και άμεση παύση του παλιού token (σχέδιο §8.1).
Απαιτεί X-WeTalk-Csrf που ταιριάζει με το token αυτού του auth_session (401 csrf_token_invalid διαφορετικά), ελέγχεται πριν από κάθε αναζήτηση. 404 not_found για λογαριασμό ή χώρο εργασίας όπου δεν ανήκει το πρόσωπο — ίδια απάντηση με ανύπαρκτο. 403 impersonation_scope_fixed όταν χειριστής WeTalk ενεργεί ως το πρόσωπο: η αλλαγή θα άφηνε τον λογαριασμό της άδειας. 401 authentication_required χωρίς cookie· 401 auth_session_expired ή auth_session_revoked, με καθαρισμένο cookie, για μη λειτουργικό.
ΤΡΟΠΟΠΟΙΗΘΗΚΕ 2026-10-06 (plan-014 C2, FR12-SEC-06): πρώτα ελέγχεται η πολιτική σύνδεσης του οργανισμού προορισμού — 401 assurance_required όταν απαιτεί authenticator ή SSO που δεν απέδειξε αυτό το auth_session (απαντήστε στην πρόκληση και αλλάξτε ξανά), 403 network_not_allowed εκτός επιτρεπόμενων δικτύων του· καμία περίπτωση δεν αλλάζει τη σύνδεση.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 429
POST /v1/session/step-up stepUpAuthSession
- δεν χρειάζεται κλειδί
- βαρύ
Επιβεβαιώστε ότι είστε εσείς — επαληθεύστε ξανά παράγοντα για ευαίσθητη αλλαγή λίγων λεπτών.
Το πρόσωπο αποδεικνύει παράγοντα που ήδη έχει και αυτό το auth_session καταγράφει τη στιγμή (stepped_up_at). Διαδρομές αλλαγής οικονομικών στοιχείων — προορισμός πληρωμής (PUT /v1/payouts/destination) — απαντούν 401 step_up_required όταν η στιγμή λείπει ή είναι παλαιότερη από WETALK_API_STEP_UP_MAX_AGE_S (300 δευτερόλεπτα στην παραγωγή)· η κονσόλα ζητά εδώ τον παράγοντα και επαναλαμβάνει μία φορά.
factor είναι password, totp, recovery_code, single_sign_on ή passkey. ΤΡΟΠΟΠΟΙΗΘΗΚΕ 2026-10-06 (plan-014 C2): ο authenticator επιβεβαιώνει επίσης — totp με το codeτου ή ένα recovery_code (μίας χρήσης· επαναλαμβανόμενος κωδικός είναι 401 credential_invalid· κοινό κλείδωμα προσώπου με τη σύνδεση) — και καταγράφει και το δεύτερο βήμα σύνδεσης· πρόσωπο χωρίς αυτόν λαμβάνει 400 validation_failed με αναφορά του factor. single_sign_on (νέα σύνδεση Google ή Microsoft) απαντά 403 step_up_unavailable μέχρι να συνδεθούν αυτοί οι τρόποι. passkey απαντά 400 validation_failed. Auth_session μόνο στον οργανισμό (χωρίς χώρο εργασίας) επιβεβαιώνεται επίσης, με καταγραφή στον οργανισμό. Auth_session χωρίς οργανισμό απαντά 403 step_up_unavailable — εκτός (έλεγχος plan-014 I-18, 2026-10-06) προσώπου σε ΚΑΝΕΝΑΝ οργανισμό, χωρίς ΚΑΝΕΝΑΝ authenticator, που επιβεβαιώνει τον password ώστε να προσθέσει τον πρώτο (POST /v1/me/mfa/totp), όπως πρέπει πριν αποδοχή πρόσκλησης οργανισμού που απαιτεί authenticator· καταγράφεται μόνο στο auth_session (δεν υπάρχει αρχείο οργανισμού).
Δεν είναι αντικατάσταση: 204 χωρίς cookie και το token CSRF δεν αλλάζει. Μεταγενέστερη αντικατάσταση (αλλαγή λογαριασμού, ρόλου ή κωδικού) ξεκινά νέο auth_session χωρίς πρόσθετη επιβεβαίωση.
Απαιτεί X-WeTalk-Csrf που ταιριάζει με το token αυτού του auth_session (401 csrf_token_invalid διαφορετικά), ελέγχεται πριν από οποιαδήποτε αναζήτηση. Αρνήσεις: 401 credential_invalid για λάθος κωδικό — ίδια απάντηση όσο το πρόσωπο είναι κλειδωμένο, όπως στη σύνδεση, και κάθε αποτυχία μετρά στο κλείδωμα· 403 step_up_unavailable όταν χειριστής WeTalk ενεργεί ως το πρόσωπο (μόνο το ίδιο επιβεβαιώνει την ταυτότητά του), όταν το auth_session δεν έχει ακόμη οργανισμό ή όταν το πρόσωπο συνδέεται μόνο με Google/Microsoft χωρίς κωδικό· 429 rate_limited όταν οι προσπάθειες του προσώπου υπερβαίνουν το παράθυρο σύνδεσης· 401 authentication_required χωρίς cookie· 401 auth_session_expired ή auth_session_revoked, με καθαρισμένο cookie, για μη λειτουργικό. Κάθε επιτυχία γράφει auth_session.stepped_up στο αρχείο ελέγχου λογαριασμού με το είδος παράγοντα.
ΤΡΟΠΟΠΟΙΗΘΗΚΕ 2026-10-06 (έλεγχος ασφαλείας CR-1): password απορρίπτεται με 401 assurance_required όσο το πρόσωπο έχει ενεργό authenticator που δεν πέρασε το auth_session — ο κωδικός δεν αντικαθιστά ποτέ τον authenticator· επιβεβαιώστε με totp ή recovery_code, που καταγράφει και το δεύτερο βήμα και την πρόσθετη επιβεβαίωση.
Δέχεται σώμα αιτήματος JSON.
εξερχόμενα
GET /v1/agents/{voice_agent_id}/campaigns listCampaigns
Οι εκστρατείες ενός VoiceAgent.
Νεότερες πρώτα.
GET /v1/agents/{voice_agent_id}/questionnaire getVoiceAgentQuestionnaire
Οι ερωτήσεις που κάνει μια εκστρατεία αυτού του VoiceAgent.
Διαβάζονται από την ενεργή έκδοση του VoiceAgent (το έγγραφο δημιουργίας). Όταν asks_questionnaire είναι true, η εκστρατεία δεν δέχεται κατάλογο ερωτήσεων· για αλλαγή αναδημιουργήστε τον VoiceAgent με νέο έγγραφο. Η εκστρατεία δεν δεσμεύει έκδοση, οπότε νέα δημοσίευση αλλάζει τις ερωτήσεις μεταγενέστερων κλήσεων.
GET /v1/agents/{voice_agent_id}/survey-results getVoiceAgentSurveyResult
Αποτελέσματα VoiceAgent έρευνας — σύνολα ανά έκβαση και απαντήσεις κάθε ερώτησης.
Κάθε συνομιλία του VoiceAgent μετρά στα σύνολα βάσει έκβασης (Completed, Partial, Declined, No answerή καμία ακόμη), μαζί με όσες αρνήθηκαν πριν απαντήσουν. Κάθε ερώτηση εμφανίζει τις καταγεγραμμένες απαντήσεις και το μερίδιό τους στο δικό της answered_count (μονάδες βάσης) και πόσες ο ερευνητής θεώρησε βέβαιες. Ερωτήσεις συναισθήματος και προέλευσης μετρούν και κάθε ονομασμένη επιλογή (mention_count). Δοκιμαστικές συνομιλίες εξαιρούνται εκτός αν include_is_test=true, και hidden_is_test_count δηλώνει πόσες εξαιρέθηκαν. Οι language και campaign κατάλογοι καλύπτουν όλο το παράθυρο όποια επιλογή και αν γίνει. Απαιτεί conversation:read· κάθε ρόλος μέλους.
POST /v1/agents/{voice_agent_id}/survey-results/exports createVoiceAgentSurveyExport
Γράψτε τους συμμετέχοντες έρευνας και τις απαντήσεις σε CSV και επιστρέψτε σύνδεσμο σύντομης διάρκειας.
Σύγχρονο και περιορισμένο (σχέδιο §15.5.5): το σώμα περιέχει ίδια φίλτρα με τα αποτελέσματα· πλήθος πάνω από WETALK_API_EXPORT_MAX_ROW απορρίπτεται με 422 export_too_large με το πλήθος (χωρίς περικοπή)· η εγγραφή ελέγχου survey_result.exported γράφεται πριν εκδοθεί ο σύνδεσμος. Μία γραμμή ανά συνομιλία, μία στήλη ανά ερώτηση, τιμές όπως αποθηκεύτηκαν, καλούμενος καλυμμένος. Δεν χρεώνεται τίποτα.
Απαιτεί conversation:read· owner ή admin· X-WeTalk-Csrf σε αίτημα cookie. Δέχεται Idempotency-Key.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 429
GET /v1/agents/{voice_agent_id}/survey-results/respondents listVoiceAgentSurveyRespondents
Οι συνομιλίες της έρευνας, νεότερες πρώτα, με τις απαντήσεις τους.
Φίλτρα όπως στα αποτελέσματα και βάσει outcome. party_masked είναι ο καλυμμένος καλούμενος (+30***1391) για owner, admin ή κλειδί API και null για member· ολόκληρος αριθμός δεν επιστρέφεται ποτέ. Απαιτεί conversation:read· owner, admin ή member.
GET /v1/agents/{voice_agent_id}/survey-rounds listSurveyRounds
Οι κύκλοι έρευνας στους οποίους συμμετείχαν οι εκστρατείες ενός VoiceAgent, νεότεροι πρώτα.
Ένας κύκλος εμφανίζεται όταν το campaign_id[] περιλαμβάνει εκστρατεία αυτού του VoiceAgent. Κύκλος που δεν ξεκίνησε ταξινομείται πρώτος. Απαιτεί conversation:read· κάθε ρόλος μέλους.
POST /v1/campaigns createCampaign
Δημιουργήστε εκστρατεία και βάλτε τις κλήσεις της στην ουρά.
Καταγράφει την εκστρατεία ως scheduled με τις ερωτήσεις της (δεύτερο σύνολο, όταν returning_person είναι different_questions, ως question_set = 'returning'), αποθηκεύει το ανώτερο όριο της εκτίμησης ως εκτιμώμενο κόστος και βάζει τις κλήσεις στην ουρά ως campaign.dial μήνυμα, παραδοτέο από starts_at. Κανείς δεν καλείται από αυτό το αίτημα: ο dialler εκστρατείας πραγματοποιεί τις κλήσεις από starts_at, μέσα στις ώρες κλήσης κάθε προσώπου. Γράφει την εγγραφή ελέγχου campaign.created. Όλη η εγγραφή γίνεται σε μία db_transaction.
ΤΡΟΠΟΠΟΙΗΘΗΚΕ 2026-10-09 (plan-015 CMP): η αρχή (start_local_date, start_local_time) και το προαιρετικό τέλος (end_local_date) διαβάζονται στο ρολόι κάθε προσώπου. starts_at υπολογίζεται — η πρώτη στιγμή που οποιαδήποτε ζώνη ώρας της λίστας φτάνει στην αρχή.
Η εκστρατεία καλεί μόνο μέσω δικού σας SIP trunk (plan-008): caller_id_phone_number_id πρέπει να ορίζει αριθμό αναγνώρισης καλούντος σε επαληθευμένο, ενεργό SIP trunk δεσμευμένο στο voice_agent_id. Χωρίς αυτό δεν υπάρχει διαδρομή SIP trunk και δεν δημιουργείται εκστρατεία. Απαντήσεις τηλεφωνητή χρεώνονται ως χρόνος ομιλίας, όπως κάθε απαντημένη συνομιλία.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 429
DELETE /v1/campaigns/{campaign_id} deleteCampaign
Διαγράψτε εκστρατεία που δεν κάλεσε κανέναν.
Επιτρέπεται μόνο όσο δεν έχει κληθεί κανείς: καμία απόπειρα που κάλεσε (ή καλεί) ο dialler και καμία συνομιλία που ορίζει την εκστρατεία (deletable στην εκστρατεία). Οι παραλείψεις μόνες τους δεν μετρούν. Αφαιρεί εκστρατεία, ερωτήσεις και παραλείψεις· εκκρεμές βήμα dialler βλέπει την απουσία και σταματά. Γράφει την εγγραφή ελέγχου campaign.deleted.
GET /v1/campaigns/{campaign_id} getCampaign
Μία πλήρης εκστρατεία.
PATCH /v1/campaigns/{campaign_id} updateCampaign
Αλλάξτε εκστρατεία πριν ξεκινήσει.
plan-015 CMP (G17, απάντηση ιδιοκτήτη 6). Επιτρέπεται όσο η εκστρατεία είναι scheduled (ή draft) και η πρώτη δυνατή έναρξή της (starts_at) παραμένει στο μέλλον — editable στην εκστρατεία· αφού ξεκινήσει η απάντηση είναι 409 campaign_started: διακόψτε προσωρινά ή τερματίστε τη. Ορίστε μόνο τα πεδία αλλαγής· τα υπόλοιπα μένουν. Η αλλαγή ελέγχεται όπως η δημιουργία (παράθυρο κλήσεων, αναμονή μεταξύ προσπαθειών, τέλος κατά ή μετά την αρχή, ταυτόχρονες συνομιλίες οργανισμού, κανόνας ονόματος και μοναδικότητα). Η εκτίμηση και το starts_at υπολογίζονται ξανά, οι κλήσεις μπαίνουν πάλι στην ουρά στη νέα αρχή και η εγγραφή ελέγχου campaign.edited ορίζει τα αλλαγμένα πεδία. Αίτημα για όσα είναι ήδη αποθηκευμένα δεν αλλάζει ούτε γράφει τίποτα.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 429
POST /v1/campaigns/{campaign_id}/end endCampaign
Τερματίστε οριστικά εκστρατεία.
Ένα scheduled, running ή paused η εκστρατεία γίνεται cancelled («Τερματισμένη»): ο dialler δεν καλεί ξανά και δεν μπορεί ποτέ να συνεχιστεί. Συνομιλία σε εξέλιξη δεν κλείνει· ολοκληρώνεται και η έκβασή της εκκαθαρίζεται. Εκβάσεις, αποτελέσματα ερευνών και κόστη παραμένουν αναγνώσιμα. Τερματισμός ήδη τερματισμένης εκστρατείας δεν αλλάζει τίποτα. Γράφει την εγγραφή ελέγχου campaign.ended.
PUT /v1/campaigns/{campaign_id}/paused setCampaignPaused
Παύστε ή συνεχίστε εκστρατεία.
Γράφει campaign.paused ή campaign.resumed. Η συνέχιση βάζει ξανά τις κλήσεις στην ουρά (ένα campaign.dial μήνυμα) για τον dialler, όπως η δημιουργία, και απαιτεί η διαδρομή SIP trunk να ισχύει ακόμη: απενεργοποιημένο trunk ή αποσυνδεδεμένος αριθμός απορρίπτονται με αιτία, χωρίς αλλαγή. Η παύση σταματά νέες κλήσεις εντός ενός βήματος dialler και δεν τερματίζει συνομιλία σε εξέλιξη.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 422
- 429
GET /v1/campaigns/{campaign_id}/skips listCampaignSkips
Τα πρόσωπα που παρέλειψε η εκστρατεία, καθένα με αιτία (AC-31).
Νεότερες πρώτα. total_count και count_by_reason περιγράφουν όλες τις παραλείψεις της εκστρατείας, όχι τη σελίδα· count_by_reason περιέχει και τις έξι αιτίες, μαζί με μηδενικές. Κενό πριν εκτελεστεί ο dialler, γιατί μόνο αυτός καταγράφει παράλειψη.
POST /v1/campaigns/estimate estimateCampaign
Το εκτιμώμενο κόστος εκστρατείας ως εύρος και οι απαιτούμενες ημέρες κλήσεων.
Καθαρή λειτουργία: δεν γράφει τίποτα. Δείτε CampaignEstimate για τις παραδοχές του εύρους· τα τρία μεγέθη παραδοχών είναι προσωρινές εκτιμήσεις και επιστρέφονται μαζί του.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 422
- 429
GET /v1/contact-lists listContactLists
Οι λίστες επαφών αυτού του χώρου εργασίας.
Νεότερες πρώτα. list_count, person_count και suppressed_count περιγράφουν ολόκληρη τη συλλογή, όχι τη σελίδα. person_count είναι το πλήθος διαφορετικών αριθμών στις λίστες του χώρου (ένας αριθμός σε δύο λίστες είναι ένα πρόσωπο)· suppressed_count είναι οι ενεργές εγγραφές μη κλήσης του λογαριασμού.
POST /v1/contact-lists createContactList
Αποθηκεύστε λίστα επαφών από CSV ή επικολλημένους αριθμούς.
Διαβάζει ξανά το source_text (δεν εμπιστεύεται παλαιότερη επιθεώρηση) και γράφει μία επαφή ανά αναγνώσιμη γραμμή: αριθμό σε E.164 (εθνική μορφή βάσει χώρας λογαριασμού) με κατακερματισμό αριθμού, όνομα, γλώσσα, ζώνη ώρας και τις personal_detail στήλες. Αγνοημένες στήλες δεν αποθηκεύονται σε καμία επαφή. Αριθμός στη λίστα μη κλήσης του λογαριασμού για όλους τους VoiceAgent σημειώνεται αποκλεισμένος· ο dialler τον ελέγχει ξανά κατά την κλήση. Το αρχικό κείμενο κρατιέται στην contact-list αποθήκη μέχρι διαγραφή λίστας. Οι παραλειφθείσες γραμμές (αριθμός γραμμής και αιτία, χωρίς τιμή) και το assumed_time_zone διατηρούνται με τη λίστα. Γράφει την εγγραφή ελέγχου contact_list.created, μόνο με πλήθη, ποτέ αριθμό ή όνομα. Κάθε μήνυμα άρνησης απευθύνεται στο πρόσωπο που επέλεξε το αρχείο και ορίζει τι να αλλάξει.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 409
- 413
- 422
- 429
DELETE /v1/contact-lists/{contact_list_id} deleteContactList
Διαγράψτε λίστα επαφών, τις επαφές της και το αποθηκευμένο αντίγραφο.
Απορρίπτεται με 409 contact_list_in_use όσο οποιαδήποτε εκστρατεία αναφέρεται στη λίστα, ανεξάρτητα από κατάσταση: ολοκληρωμένη εκστρατεία κρατά τη λίστα που κάλεσε. Η άρνηση ορίζει έως τρεις εκστρατείες. Διαγράφει τα πρόσωπα της λίστας και το αποθηκευμένο αντίγραφο αρχείου. Γράφει την εγγραφή ελέγχου contact_list.deleted. Δεν αφαιρεί κανέναν από τη λίστα μη κλήσης.
GET /v1/contact-lists/{contact_list_id} getContactList
Μία λίστα επαφών με τις γραμμές που παραλείφθηκαν στην αποθήκευση.
PATCH /v1/contact-lists/{contact_list_id} updateContactList
Μετονομάστε λίστα επαφών ή αλλάξτε τους δύο κανόνες της.
Κάθε πεδίο είναι προαιρετικό και απαιτείται τουλάχιστον ένα. Τα πρόσωπα της λίστας δεν αλλάζουν. Γράφει την εγγραφή ελέγχου contact_list.updated με ονομασία των αλλαγών.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 429
GET /v1/contact-lists/{contact_list_id}/contacts listContactListContacts
Τα πρόσωπα μιας λίστας επαφών.
Με τη σειρά ανάγνωσης από την πηγή.
POST /v1/contact-lists/{contact_list_id}/contacts addContactListContacts
Προσθέστε πρόσωπα σε αποθηκευμένη λίστα επαφών από CSV ή επικολλημένους αριθμούς.
Owner ή Admin (γύρος διορθώσεων R, CL #121). Διαβάζει source_text όπως η αποθήκευση και γράφει μία επαφή ανά αναγνώσιμη γραμμή με αριθμό που δεν υπάρχει ήδη στη λίστα (οι υπάρχοντες παραλείπονται ως duplicate_number). Απορρίπτεται με 409 contact_list_in_use όσο οποιαδήποτε εκστρατεία αναφέρεται στη λίστα: η εκστρατεία κρατά τη λίστα που κάλεσε. Το συνολικό πλήθος δεν μπορεί να υπερβεί WETALK_API_UPLOAD_MAX_ROW. Το αντίγραφο αρχικού αρχείου διατηρείται· πλήθη προσθήκης και παραλειφθείσες γραμμές (χωρίς τιμές) καταγράφονται με τη λίστα. Γράφει την εγγραφή ελέγχου contact_list.contacts_added, μόνο με πλήθη.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 413
- 422
- 429
PUT /v1/contact-lists/{contact_list_id}/contacts replaceContactListContacts
Αντικαταστήστε όλα τα πρόσωπα αποθηκευμένης λίστας με νέο αρχείο.
Owner ή Admin (γύρος διορθώσεων R, CL #121). Διαγράφει τα πρόσωπα και γράφει τις αναγνώσιμες γραμμές νέας πηγής όπως νέα αποθήκευση· όνομα και κανόνες μένουν. Το αποθηκευμένο αντίγραφο γίνεται το νέο κείμενο και οι παραλείψεις προέρχονται από τη νέα πηγή. Απορρίπτεται με 409 contact_list_in_use όσο οποιαδήποτε εκστρατεία αναφέρεται στη λίστα. Γράφει την εγγραφή ελέγχου contact_list.contacts_replaced, μόνο με πλήθη.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 404
- 409
- 413
- 422
- 429
GET /v1/contact-lists/{contact_list_id}/export.csv exportContactListCsv
Μία λίστα επαφών ως υπολογιστικό φύλλο.
Owner ή Admin (γύρος διορθώσεων R, CL #121). Μία γραμμή ανά πρόσωπο με σειρά ανάγνωσης: όνομα, αριθμός (E.164), γλώσσα, ζώνη ώρας, κάθε στήλη προσωπικών στοιχείων που κρατά η λίστα και αν ο αριθμός είναι στη λίστα μη κλήσης. UTF-8 με BOM και εγγραφές CRLF· πεδίο που αρχίζει =, +, - ή @ λαμβάνει πρόθεμα μονό εισαγωγικό ώστε το υπολογιστικό φύλλο να μην το εκτελέσει ως τύπο. Γράφει την εγγραφή ελέγχου contact_list.exported, μόνο με το πλήθος.
POST /v1/contact-lists/inspect inspectContactSource
Τι περιέχει CSV ή επικόλληση πριν αποθηκευτεί οτιδήποτε.
Στήλες που βρέθηκαν, προτεινόμενος ρόλος και έως τρία δείγματα τιμών για καθεμία, πλήθος γραμμών και όσων θα αποθηκεύονταν, κάθε γραμμή που δεν θα γινόταν επαφή με αριθμό γραμμής, όνομα και αιτία και κάθε τιμή που θα έμενε κενή. Με column, βάσει αντιστοίχισης του μέλους. Δεν αποθηκεύει τίποτα.
Δέχεται σώμα αιτήματος JSON.
- 200
- 400
- 401
- 403
- 413
- 422
- 429
GET /v1/conversations/{conversation_id}/survey-answers getConversationSurveyAnswer
Οι απαντήσεις μιας συνομιλίας έρευνας ανά ερώτηση.
Με σειρά ερωτηματολογίου, καθεμία με τη διατύπωση της έκδοσης της συνομιλίας στη γλώσσα απάντησης (text, null όταν το ερωτηματολόγιο δεν έχει τέτοιο κείμενο). Συνομιλία χωρίς απαντήσεις έχει κενό answer. Απαιτεί conversation:read· owner, admin ή member.
POST /v1/survey-rounds/{survey_round_id}/exports createSurveyResultExport
Γράψτε τα αποτελέσματα κύκλου σε CSV και επιστρέψτε σύνδεσμο σύντομης διάρκειας.
Σύγχρονο και περιορισμένο (σχέδιο §15.5.5): οι εγγραφές διαβάζονται σε μία εντολή, πλήθος πάνω από WETALK_API_EXPORT_MAX_ROW απορρίπτεται με 422 export_too_large με το πλήθος (χωρίς περικοπή), η εγγραφή ελέγχου survey_result.exported γράφεται πριν εκδοθεί ο σύνδεσμος και ο σύνδεσμος διαρκεί WETALK_API_EXPORT_READ_WINDOW_SECOND δευτερόλεπτα. Το αρχείο είναι UTF-8 με BOM, μία γραμμή ανά πρόσωπο, μία στήλη ανά ερώτηση. Δεν χρεώνεται τίποτα.
Απαιτεί conversation:read· owner ή admin· X-WeTalk-Csrf σε αίτημα cookie. Δέχεται Idempotency-Key.
Δέχεται σώμα αιτήματος JSON.
- 201
- 400
- 401
- 403
- 404
- 409
- 422
- 429
GET /v1/survey-rounds/{survey_round_id}/respondents listSurveyRespondents
Τα πρόσωπα που κλήθηκαν σε κύκλο με τις τελευταίες απαντήσεις, νεότερη κλήση πρώτα.
status φιλτράρει τη σελίδα και το matched_count; called_count είναι ολόκληρος ο κύκλος. Απόν status είναι ολόκληρος ο κύκλος, όπως all. Απαιτεί conversation:read· owner, admin ή member — viewers απορρίπτονται επειδή κάθε εγγραφή έχει αριθμό. Δείκτης για εγγραφή εκτός κύκλου είναι 400 cursor_invalid.
GET /v1/survey-rounds/{survey_round_id}/result getSurveyResult
Τα στοιχεία ενός κύκλου ανά ερώτηση.
Κάθε μερίδιο διαιρείται με το δικό της answered_count. Οι απαντήσεις μένουν στην αρχική ερώτηση, ώστε αντικατάσταση συνόλου ερωτήσεων να δείχνει και τα δύο σύνολα με χωριστά πλήθη. Ανοιχτές απαντήσεις δεν έχουν μερίδιο· theme είναι κενό στο plan-002 (O-5) και το quote κρατά τις οκτώ πιο πρόσφατες. Το attribution είναι null ενός αποσπάσματος για member ή viewer. Απαιτεί conversation:read· κάθε ρόλος μέλους.