Telenaas API
One platform, one key format. Authenticate with
Authorization: Bearer <key>
and use the path prefix of the product you want. Create a key in the console, under
Developers.
One prefix per product
A URL says which product it belongs to, and so does the name of every agent tool.
/api/v1/telechat/…
and telenaas_telechat_*
are the same product reached two ways, and a key
scoped to one product cannot wander into another.
Scopes are checked on reads too
A key is deliberately narrower than a person's membership. One scoped to meetings cannot read the call history, even though both belong to the same tenant. Every route below names the scope it needs.
Repeating a request is safe
Send an Idempotency-Key header on anything that writes. Repeating the
request with the same key returns the first response instead of doing the work twice,
which is what makes retrying after a timeout safe.
TeleCall
One-to-one audio, in the app.
A call between two people over WebRTC, with nothing in the middle. Audio only and direct, so it costs a fraction of a video room and connects in well under a second.
For business: Put a call button in your marketplace, your app or your listing, so a buyer reaches a seller without either of them giving out a number.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/telecall/calls |
List TeleCall calls
In-app audio calls this key can see, most recent first. |
voice:read |
| POST | /api/v1/telecall/calls |
Place an in-app call
Rings another account over WebRTC. No number is dialled and no carrier is involved, so there is no per-minute charge; pass `to_user_id`. For a call to a telephone, use TeleVoip instead. |
voice:call |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telecall_place needs approval | Ring another account over the app. No number is dialled and no carrier is involved; for a telephone, use telenaas_televoip_call_place. | voice:call |
| telenaas_telecall_history | In-app calls this person was in. Not the telephone log. | voice:read |
TeleMeet
Video meetings, 4 people to 400.
Scheduled or instant, with a waiting room, screen sharing, dial-in by telephone and the AI agents beside it. Only the active speakers are forwarded, which is what makes a large room affordable rather than theoretical.
For business: Branded rooms, your own domain, service levels, and a room size that matches the town hall rather than the stand-up.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/telemeet/meetings |
List meetings
Meetings for this tenant, most recent first. |
meeting:read |
| POST | /api/v1/telemeet/meetings |
Create a meeting
Room size is capped by the tenant's plan. Asking for more is refused rather than quietly reduced. |
meeting:manage |
| GET | /api/v1/telemeet/meetings/{id} |
Get a meeting
One meeting, with its join code and dial-in PIN. |
meeting:read |
| DELETE | /api/v1/telemeet/meetings/{id} |
Cancel a meeting
Marks it cancelled. Anyone already in the room is not thrown out. |
meeting:manage |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telemeet_create needs approval | Schedule a meeting and return its join code. | meeting:manage |
| telenaas_telemeet_list | List meetings for this tenant. | meeting:read |
| telenaas_telemeet_peers | Who is in a room right now — peer id, name, role, admitted or waiting — and what each is publishing on the SFU. | meeting:manage |
| telenaas_telemeet_peer_remove needs approval | Take someone out of a room. Their media stops at once and their socket closes; a grant token cannot reopen it. | meeting:manage |
| telenaas_telemeet_peer_mute needs approval | Mute or unmute someone's audio or video. Enforced on the SFU and in their channel, not requested of their browser. | meeting:manage |
| telenaas_telemeet_recording needs approval | Start (recording: true) or stop (recording: false) server-side recording of a room. Refused, with the reason, unless the tenant, plan and meeting all allow it. | meeting:record |
| telenaas_telemeet_invite_link | The link and dial-in PIN for a meeting, to send to somebody outside. | meeting:read |
TeleExpo
Show the thing, live.
A public room where somebody demonstrates a product in real time and anybody can walk in from a link — no account, no application. Viewers ask questions beside the video, and the presenter can take one of them on camera.
For business: A live shop window. Run a demo from a product page, a marketplace listing or a campaign, and let anybody who is curious watch it happen.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| DELETE | /api/v1/teleexpo/demos/{id}/live |
End a demo
Closes the room. The recording, if there was one, still has to be claimed. |
demo:host |
| POST | /api/v1/teleexpo/demos/{id}/live |
Go live
Opens the room and tells everybody watching the directory that it has started. |
demo:host |
| GET | /api/v1/teleexpo/demos/{id} |
Get a demo
One demo, with its audience count. |
demo:read |
| GET | /api/v1/teleexpo/demos |
List demos
Scheduled, live and finished product demonstrations. |
demo:read |
| POST | /api/v1/teleexpo/demos |
Schedule a demo
Creates the demo and its public page. Viewers join by slug and need no account; a demo is a broadcast with a question queue, not a meeting everybody talks in. |
demo:host |
| GET | /api/v1/teleexpo/requests |
Demo requests
People who asked for a demonstration and have not had one yet. |
demo:read |
| GET | /api/v1/teleexpo/demos/{id}/questions |
Questions asked
The audience's questions, most upvoted first, with the answers given. |
demo:read |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_teleexpo_schedule needs approval | Schedule a live product demonstration and return its public link. Viewers need no account. | demo:host |
| telenaas_teleexpo_list | Demos in this tenant: scheduled, live and finished. | demo:read |
| telenaas_teleexpo_go_live needs approval | Open the room for a demo and announce it to everybody watching the directory. | demo:host |
| telenaas_teleexpo_questions | What the audience asked, most upvoted first — the useful thing to summarise after a demo. | demo:read |
TeleVoip
Real numbers on the real telephone network.
Numbers, inbound and outbound calls, queues and emergency calling. The part that reaches somebody who has never heard of us and is holding an ordinary telephone.
For business: Numbers per country, call centre queues, recording where the law allows it, and emergency calling handled properly.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| POST | /api/v1/televoip/numbers/{id}/assign |
Assign a number
Give a number to a person in this tenant, or to a TeleAssistant so that it answers instead. |
number:assign |
| GET | /api/v1/televoip/calls |
List calls
Telephone call history for this tenant. |
voice:read |
| POST | /api/v1/televoip/calls |
Place a call
An emergency number takes a different path: never billed, never rate-limited, and refused outright if there is no dispatchable location. |
voice:call |
| GET | /api/v1/televoip/numbers |
List numbers
Numbers this tenant holds. |
number:read |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_televoip_call_place needs approval | Place a call. Emergency numbers require an address on file. | voice:call |
| telenaas_televoip_call_history | Recent calls for this tenant. | voice:read |
| telenaas_televoip_number_list | Phone numbers this tenant holds. | number:read |
| telenaas_televoip_number_request | Ask for a phone number on behalf of the person this key acts for. | number:request |
TeleChat
Live chat, between anybody.
Conversations with presence, typing, replies and announcements. Message bodies are encrypted per organisation, so the platform carries them without being able to read them.
For business: Drop the widget into your website and a visitor is talking to your team in one line of script — the same conversation your staff already answer in the console.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/telechat/attachments/{id} |
Fetch a file
A short-lived download link for a file message: the provider's own when it can sign one, ours otherwise. |
chat:read |
| GET | /api/v1/telechat/widgets |
List chat widgets
The website widgets this tenant has, with their public keys and allowed origins. |
chat:read |
| POST | /api/v1/telechat/widgets |
Create a chat widget
Returns a public key for the `<script>` tag. The key is not a secret — `allowed_origins` is what keeps the widget to your own sites, and an empty list refuses every origin. |
chat:moderate |
| POST | /api/v1/telechat/conversations/{id}/contact |
Send a contact card
`name`, plus a `phone` or an `email`. The card is encrypted whole in the message body rather than spread across metadata, because it is somebody's number. |
chat:write |
| GET | /api/v1/telechat/conversations/{id}/archive |
Archived days
Days moved out of the hot window into the organisation's storage, newest first. |
chat:read |
| GET | /api/v1/telechat/conversations |
List conversations
Chat threads this key can see, including those started from a website widget. |
chat:read |
| POST | /api/v1/telechat/conversations/{id}/attachments |
Send a file
Multipart `file`, or JSON `name` and base64 `data`. Stored in the organisation's own storage; the message carries only the name and a reference. |
chat:write |
| POST | /api/v1/telechat/conversations/direct |
Start a direct conversation
Between the calling person and `user_id`; reuses the existing one. |
chat:write |
| GET | /api/v1/telechat/conversations/{id}/messages |
Read recent messages
The hot window, newest last, decrypted for the caller. Older days are in the archive. |
chat:read |
| POST | /api/v1/telechat/conversations/{id}/messages |
Send a message
Posts into a conversation. Bodies are encrypted at rest per tenant. |
chat:write |
| POST | /api/v1/telechat/conversations/{id}/voice |
Send a voice message
A recording, with `seconds` from whatever recorded it. Audio only: anything else is refused rather than stored as something no client can play. |
chat:write |
| GET | /api/v1/telechat/conversations/{id}/archive/{day} |
Read an archived day
The messages of one archived day, fetched from the organisation's storage and decrypted for the caller. |
chat:read |
| GET | /api/v1/telechat/attachment-policy |
What may be attached
Allowed content types and extensions, the size ceiling per class, and how long a voice message may run. Published so an integration can refuse a file before uploading it. |
chat:read |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telechat_message_send | Send a message to a conversation. | chat:write |
| telenaas_telechat_conversation_list | Conversations visible to this key. | chat:read |
| telenaas_telechat_message_list | Recent messages of a conversation, oldest first, decrypted for this key. | chat:read |
| telenaas_telechat_direct_start | Start (or find) the direct conversation with a person. | chat:write |
| telenaas_telechat_contact_send | Send somebody's details into a conversation as a contact card. Needs a name and either a number or an address. | chat:write |
| telenaas_telechat_attachment_policy | What may be attached to a message, how big it may be, and how long a voice message may run. | chat:read |
| telenaas_telechat_widget_list | The website chat widgets this tenant has, with the origins each one is allowed to load from. | chat:read |
TeleDesk
A help desk that knows about the call.
Tickets, queues with real routing rules, service levels computed from timestamps rather than tracked by a flag, and a knowledge base that knows what may be sent to a customer and what may not.
For business: One thread per problem, whether it started on the telephone, in chat or in a meeting.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/teledesk/knowledge |
Search the knowledge base
Pass `audience=public` to get only articles that may be sent to a customer. |
helpdesk:read |
| GET | /api/v1/teledesk/tickets/{id} |
Get a ticket
With its messages. Internal notes are included only for a key holding helpdesk:respond. |
helpdesk:read |
| POST | /api/v1/teledesk/tickets/{id}/replies |
Reply to a ticket
Set `internal` to true for a note to colleagues, which is not sent to the requester. |
helpdesk:respond |
| GET | /api/v1/teledesk/tickets |
List tickets
Help desk tickets for this tenant. |
helpdesk:read |
| POST | /api/v1/teledesk/tickets |
Open a ticket
Routed to a queue by the same rules a ticket opened by a person would be. |
helpdesk:respond |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_teledesk_ticket_open | Open a help desk ticket. Routed to a queue by the same rules a person's would be. | helpdesk:respond |
| telenaas_teledesk_ticket_list | Tickets in this tenant, newest first. | helpdesk:read |
| telenaas_teledesk_ticket_reply needs approval | Reply to a ticket. An internal note is not sent to the person who raised it. | helpdesk:respond |
| telenaas_teledesk_knowledge_search | Search the knowledge base. Ask for audience 'public' to get only what may be sent to a customer. | helpdesk:read |
TeleAssistant
What answers when you cannot.
A virtual assistant in front of a TeleVoip number: a greeting, a menu, voicemail, out-of-hours handling, and an agent that can take a message or route the call.
For business: Per number, per queue, per time of day — with the AI agents transcribing the voicemail and telling you what it was about.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/teleassistant/assistants |
List assistants
The assistants in this tenant and the numbers they answer. |
assistant:read |
| POST | /api/v1/teleassistant/assistants |
Create an assistant
A greeting, business hours, and what to do outside them: take a message, offer a menu, forward, or hand over to an AI agent. |
assistant:manage |
| GET | /api/v1/teleassistant/voicemails |
List voicemails
Who called, when, and the transcript. The audio is not here: like every recording, it is delivered to a device or to Burmeel Storage and never kept in our database. |
assistant:read |
| GET | /api/v1/teleassistant/assistants/{id} |
Get an assistant
One assistant, with its menu and its schedule. |
assistant:read |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_teleassistant_list | Assistants in this tenant: what they answer, and what they do out of hours. | assistant:read |
| telenaas_teleassistant_voicemails | Messages left for this tenant, with transcripts. The audio is not here and never was: recordings leave to a device or to Burmeel Storage, and are not kept. | assistant:read |
TeleMarketing
Campaigns by text, to people who agreed to hear from you.
An audience, a message with their name in it, and a send that obeys the opt-out and the hour of day. Consent is checked before every message, not at the upload.
For business: Upload a list, write one message, and reach all of it — with the people who said stop taken out for you, and nobody woken at four in the morning.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/marketing/campaigns |
List campaigns
Marketing campaigns and their state. |
campaign:read |
| POST | /api/v1/marketing/campaigns |
Create a campaign
A message and an audience. Marketing insists on opt-in and obeys quiet hours unless you say otherwise; `{{name}}` and anything else you stored about a person is filled in per message, and a message with a gap nothing fills is not sent to that person. |
campaign:manage |
| POST | /api/v1/marketing/campaigns/{id}/send |
Send it
The audience is fixed at this moment; people added later are not caught up in it. |
campaign:manage |
| POST | /api/v1/marketing/campaigns/{id}/cancel |
Cancel
Stops it for good. |
campaign:manage |
| GET | /api/v1/marketing/campaigns/{id} |
A campaign and its numbers
Sent, delivered, failed, skipped, replied. |
campaign:read |
| POST | /api/v1/marketing/campaigns/{id}/pause |
Pause
What has gone has gone; what has not, will not until it is sent again. |
campaign:manage |
| GET | /api/v1/marketing/campaigns/{id}/recipients |
Who it reached
Per person: what happened, and if they were skipped, why. |
campaign:read |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telemarketing_campaign_send needs approval | Send a marketing campaign to an audience. Obeys opt-out and quiet hours; people who opted out are skipped and reported. | campaign:manage |
| telenaas_telemarketing_campaign_list | Campaigns this tenant has sent, with what became of them. | campaign:read |
TeleSurvey
Ask by text, one question at a time.
Questions go out as messages and answers come back as answers: a number in range, a yes or a no, one of the choices offered, or whatever they typed. Anything that does not fit is asked again rather than counted wrong.
For business: The response rate of a text message, with the results added up for you — no link to click, no form to load.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/surveys/{id}/results |
Results
Numbers averaged, choices counted, free text left alone — an average of somebody's sentences is not a finding. |
campaign:read |
| GET | /api/v1/surveys/{id}/responses |
Every response
Per person: where they got to, and what they said. |
campaign:read |
| GET | /api/v1/surveys |
List surveys
The questionnaires this tenant has written. |
campaign:read |
| POST | /api/v1/surveys |
Create a survey
Questions are asked one message at a time. A question may be `scale` (a number in range), `yes_no`, `choice` (answered by word or by position) or `text`. |
campaign:manage |
| POST | /api/v1/surveys/campaigns |
Send a survey
Asks the first question of everybody on the audience; the rest follow as they answer. |
campaign:manage |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telesurvey_results | What a survey found: averages, counts, and what people typed. | campaign:read |
TeleAlert
The message that has to arrive now.
Raised and sent in one call, at any hour, with an acknowledgement recorded when somebody replies. The only product here that ignores quiet hours, because that is the entire point of it.
For business: Wire it to your monitoring: one POST raises the alert, and you can see who has acknowledged it.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/alerts |
List alerts
What has been raised. |
campaign:read |
| POST | /api/v1/alerts |
Raise an alert
Sent at any hour — an alert is the one thing that ignores quiet hours. With `ack_required`, a reply is recorded as an acknowledgement and you can see who has answered. |
campaign:manage |
| GET | /api/v1/alerts/{id} |
An alert and its numbers
Including who acknowledged it. |
campaign:read |
| GET | /api/v1/alerts/{id}/recipients |
Who was alerted
And who has replied to say they are on it. |
campaign:read |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telealert_raise needs approval | Raise an alert now, at any hour. With acknowledgement required, replies are recorded as acknowledgements. | campaign:manage |
TeleEcommerce
Order updates your customers actually read.
Post an order and its status; the customer hears about the parts you wrote a rule for. Sending the same status twice tells nobody twice, by text or by WhatsApp.
For business: Placed, paid, shipped, delivered — each with its own message, on whichever channel your customer uses.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/ecommerce/orders |
List orders
What we are tracking, and its state. |
campaign:read |
| POST | /api/v1/ecommerce/orders |
Record or update an order
Keyed on your own reference, so sending the same order twice updates it rather than duplicating it. The customer is told only when the status actually changes, and only where a rule says to. |
campaign:manage |
| GET | /api/v1/ecommerce/rules |
List rules
What gets said when an order reaches a state. |
campaign:read |
| PUT | /api/v1/ecommerce/rules |
Set a rule
One message per status. `channel` may be `sms` or `whatsapp`; a WhatsApp rule needs an approved template, and `fallback_channel` says what to do when WhatsApp cannot carry it — without one, nothing is sent rather than quietly switching channel. |
campaign:manage |
| GET | /api/v1/ecommerce/orders/{reference} |
One order
Including the history of what it has been. |
campaign:read |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_teleecommerce_order_update needs approval | Record or move an order along. The customer is told only when the status actually changes, and only where a rule says to. | campaign:manage |
TeleLogistics
Where the parcel is, said out loud.
Collected, in transit, out for delivery, delayed, delivered — each a message with the tracking link in it, by text or WhatsApp, and a fallback when WhatsApp cannot carry it.
For business: Fewer "where is my parcel" calls, because the parcel says where it is.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/logistics/shipments |
List shipments
What is in flight. |
campaign:read |
| POST | /api/v1/logistics/shipments |
Record or update a shipment
The same shape as an order: your reference, the customer, the status, and anything else — a tracking link, an ETA — which the message can refer to by name. |
campaign:manage |
| GET | /api/v1/logistics/rules |
List rules
What gets said at each stage. |
campaign:read |
| PUT | /api/v1/logistics/rules |
Set a rule
By text or WhatsApp, with a fallback when WhatsApp cannot carry it. |
campaign:manage |
| GET | /api/v1/logistics/shipments/{reference} |
One shipment
And its history. |
campaign:read |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telelogistics_shipment_update needs approval | Record or move a shipment along, telling the customer where a rule says to. | campaign:manage |
TeleSMS
Appointments, confirmed and remembered.
A booking goes in, the customer gets a confirmation and a reminder, and a reply of YES or NO confirms or cancels it — which the clinic, the garage or the salon sees as a status rather than as a text to read.
For business: The no-show rate falls when people can confirm by replying to a message they already have open.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/service/bookings/{reference} |
One booking
And its history. |
campaign:read |
| GET | /api/v1/service/rules |
List rules
Confirmations, reminders and cancellations. |
campaign:read |
| PUT | /api/v1/service/rules |
Set a rule
A negative `delay_minutes` is a reminder: -1440 is the day before. A reminder re-reads the booking before it goes, so one cancelled in the meantime is not reminded about. |
campaign:manage |
| GET | /api/v1/service/bookings |
List bookings
Appointments and their state. |
campaign:read |
| POST | /api/v1/service/bookings |
Record or update a booking
`at` is when the appointment is. A customer who replies YES confirms it and one who replies NO cancels it, which you read back here as a status rather than as a message to interpret. |
campaign:manage |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telesms_booking_update needs approval | Record or change an appointment. A customer replying YES confirms it and NO cancels it. | campaign:manage |
TeleTransit
Text the stop, hear when the bus comes.
A rider texts the code on the pole and gets the next departures — the operator's own latest times where they differ from the timetable, which is the number somebody standing in the rain actually wants.
For business: Works on every phone ever made, with no app to install and no data connection — which is exactly the rider your app never reaches.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/transit/stops |
List stops
Every stop, by the code riders text. |
textin:read |
| PUT | /api/v1/transit/stops |
Upload stops
Keyed on the code printed at the stop. Bad rows are named and the rest are written — a timetable from somebody else's system should not fail whole because of one stop. |
textin:manage |
| GET | /api/v1/transit/services |
List text lines
The numbers and keywords this operator answers on. |
textin:read |
| POST | /api/v1/transit/services |
Set up a text line
Bind a service to one of your numbers, optionally behind a keyword so one number can run several: "BUS 4412" and "TRAIN 4412". |
textin:manage |
| GET | /api/v1/transit/stops/{code}/departures |
What is due
The next departures from one stop, as a rider texting it would be told. |
textin:read |
| PUT | /api/v1/transit/departures |
Upload departures
Keyed on stop, line and timetabled time, so pushing the same board every thirty seconds updates it rather than duplicating it. `expected_at` is what you now believe, and is what riders are told. |
textin:manage |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_teletransit_departures | The next departures from a stop, as a rider texting its code would be told. | textin:read |
TeleFly
Text a flight number, get its times.
Status, gate, terminal and the times as they now stand. One message out, one back, while the passenger is walking through the terminal with no signal to spare.
For business: Fewer people at the desk asking the same question, and an answer that reaches somebody whose roaming data is off.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/flights |
Today's flights
What we can answer about. |
textin:read |
| PUT | /api/v1/flights |
Upload flights
Keyed on number and date, because BA123 is a different aeroplane every morning. Send the whole board as often as you like. |
textin:manage |
| GET | /api/v1/flights/services |
List text lines
Where TeleFly answers. |
textin:read |
| POST | /api/v1/flights/services |
Set up a text line
Bind TeleFly to a number. |
textin:manage |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telefly_flight | A flight's times, gate and status for today. | textin:read |
TeleCrime
Report it by text, and get a reference.
Somebody texts what happened and gets a reference back; the report is encrypted and a ticket is raised for whoever works the queue. It can be configured to take reports anonymously, in which case the number is never written down at all. It is not an emergency service, and every reply says so.
For business: A quiet way to report something for people who will not ring, with the reports in one queue and a reference they can quote.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/reports/services |
List text lines
Where TeleCrime answers. |
report:read |
| POST | /api/v1/reports/services |
Set up a reporting line
`config.anonymous` makes it anonymous, in which case the reporter's number is never written down. `config.emergency_number` is the number every reply tells people to ring if they are in danger. |
report:read |
| GET | /api/v1/reports |
Reports received
Behind its own permission: setting up a line and reading what was confided to it are different things. |
report:read |
| GET | /api/v1/reports/{reference} |
One report
Including what was written. |
report:read |
| POST | /api/v1/reports/{reference} |
Move a report along
received, acknowledged, investigating, closed. |
report:read |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telecrime_reports | Reports made by text. Anonymous ones carry no number, because none was kept. | report:read |
TeleAuth
The second factor, sent and checked.
Send a code to a telephone number and ask us, a moment later, whether what somebody typed matches. The code is hashed the way a password is and never stored, a wrong id and a wrong code take the same time to refuse, and a code works exactly once. Sending is the guarded half: second factors are the favourite target of SMS pumping, so every code goes through the same policy that stops toll fraud on calls, and through rate limits held per destination as well as per account.
For business: Two calls — send, then check — and the parts that are easy to get wrong are already wrong-proof: no plaintext codes, no replay, no timing tell, and no open door for pumped traffic.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/verify/verifications |
Recent verifications
Status only — never the code, which we do not keep. |
verify:read |
| POST | /api/v1/verify/verifications |
Send a code
Six digits to a telephone number, hashed here the way a password is and never stored in the clear. Defaults: ten minutes, five attempts. `message` may carry your own wording with `{{code}}` in it; `reference` is your own identifier for whatever you are protecting, handed back to you. Asking again for the same number cancels the previous code. |
verify:send |
| GET | /api/v1/verify/verifications/{id} |
One verification
Its state and how long is left of it. |
verify:read |
| GET | /api/v1/verify/verifications/stats |
How it is going
Sent, approved, expired and failed over the last week, with the success rate. Watch the expired count: codes sent and never checked are people who never received them. |
verify:read |
| POST | /api/v1/verify/verifications/{id}/check |
Check a code
Answers 200 with `approved` or `denied` and a reason — a wrong code is an answer, not a failed request. A code works once; an approved verification cannot be approved again. |
verify:check |
| POST | /api/v1/verify/check |
Check by number
The same check against whatever is outstanding for a telephone number, for callers who know the number rather than our id. |
verify:check |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_teleauth_stats | How second factors are going: sent, approved, and how many were never checked. Read-only — sending a code is something a person asks for, not something an agent decides. | verify:read |
TeleGuard
When something is forced, the guards know in seconds.
Sensors, doors and panels report here; the people on the rota are texted at once, and if nobody answers within five minutes the next people are. An alarm nobody acknowledged is recorded as exactly that rather than disappearing.
For business: Wire your existing panel to one endpoint. Rotas, escalation and acknowledgements come with it, and a device that stops reporting is itself an alarm.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/guard/events/{id} |
One event
Including what the device reported. |
device:read |
| GET | /api/v1/guard/devices |
List devices
Sensors, doors and panels, and which have gone quiet. |
device:read |
| PUT | /api/v1/guard/devices |
Register a device
Keyed on your own reference. `heartbeat_minutes` is how often it promises to report; silence past twice that is itself an alarm, because a cut sensor cannot announce that it has been cut. |
device:manage |
| GET | /api/v1/guard/devices/silent |
Devices gone quiet
The ones to go and look at. |
device:read |
| GET | /api/v1/guard/events |
Events
Raised, notified, acknowledged, resolved — or expired, which means nobody ever answered. |
device:read |
| POST | /api/v1/guard/events |
Report something
The call a panel makes at two in the morning, so it is the simplest one here. A repeat of something already ringing updates it rather than raising a second alarm and waking the rota twice. |
device:report |
| POST | /api/v1/guard/events/{id}/resolve |
Close it
With a note about what it was. |
device:manage |
| GET | /api/v1/guard/responders |
Who gets told
In the order they are told. |
device:read |
| PUT | /api/v1/guard/responders |
Add somebody to the rota
`step` is the escalation order: everybody on step one is told at once, step two only if nobody answered within five minutes. |
device:manage |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_teleguard_events | Security events: what is ringing, what was answered, and what nobody answered. | device:read |
TeleHealth
A fall, a missed dose, a reading out of range — somebody is told.
Health devices report here and the right people are texted: family are told that something happened, where, and who to ring; clinicians may be told the reading. The payload is encrypted and a family member is never sent a measurement, because a text message is not the place for somebody's medical detail.
For business: Escalation that reaches a person rather than a dashboard nobody is watching at three in the morning, with disclosure decided by role rather than by whoever wrote the template.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/health/events |
Events
And what became of each. |
device:read |
| POST | /api/v1/health/events |
Report something
A fall, a missed dose, a reading out of range. Anything in `reading` is encrypted at rest and is never put in a message to family. |
device:report |
| POST | /api/v1/health/events/{id}/resolve |
Close it
With a note. |
device:manage |
| GET | /api/v1/health/devices/silent |
Devices gone quiet
A monitor that has stopped reporting is not a monitor. |
device:read |
| GET | /api/v1/health/devices |
List devices
Health devices and which have gone quiet. |
device:read |
| PUT | /api/v1/health/devices |
Register a device
The same shape as TeleGuard: your reference, what it is, where it is. |
device:manage |
| GET | /api/v1/health/responders |
Who gets told
With their role, which decides what they may be told. |
device:read |
| PUT | /api/v1/health/responders |
Add somebody
`role` matters here: a clinician may be told the reading, family are told that something happened, where, and who to ring. That line is not a template setting. |
device:manage |
| GET | /api/v1/health/events/{id} |
One event
With the reading, for somebody allowed to see it. |
device:read |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telehealth_events | Health device events. Readings are not returned: what a family member may be told is decided by role, and an agent is not a role. | device:read |
TeleAI
Agents that can text, ring and open a room — on a leash.
A session gives an agent a person to talk to, the channels it may use, the actions it may take and what it may spend. Every action is checked before it happens and written down afterwards, including the ones it was refused — because "it never rang them" and "it tried and was not allowed to" are different facts.
For business: Let something autonomous touch a telephone network on your account and still be able to say exactly what it did, what it cost, and what stopped it.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/agents/sessions |
Sessions
What agents are running, and what they have spent. |
agent:read |
| POST | /api/v1/agents/sessions |
Open a session
Give the agent one person to talk to, the channels it may use, the actions it may take and what it may spend. An agent with no `allowed_actions` can only listen. |
agent:run |
| POST | /api/v1/agents/sessions/{id}/act |
Do something
`send_message`, `place_call`, `open_room` or `hand_over`. Checked in that order: may it, can it afford it, is the destination allowed — the same dial policy a person is held to. |
agent:run |
| GET | /api/v1/agents/sessions/{id} |
One session
Its leash and what is left of the budget. |
agent:read |
| POST | /api/v1/agents/sessions/{id}/close |
End the session
Nothing further may be done on it. |
agent:run |
| GET | /api/v1/agents/sessions/{id}/actions |
Everything it did
Including what it tried and was refused, with the reason — "it never rang them" and "it tried and was not allowed to" are different facts. |
agent:read |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_teleai_sessions | Agent sessions, what they were allowed to do, and what they have spent. | agent:read |
TeleMarket
The hardware, already paired with the platform.
Door contacts, panels, trackers and fall sensors, sold with the thing they talk to. Every item says which products it works with, so nobody buys a sensor that cannot reach the alarm — and what arrives is registered to the account rather than to a manual nobody reads.
For business: Fit out a site without spending a week checking which hub speaks to which protocol: the catalogue only lists what we have already made work.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/telemarket/items |
The catalogue
What this account may buy, which is not the whole shop: a household is not offered the 24-zone panel and a business is not offered the single-flat starter kit. `works_with` names the products an item talks to; `requires` names what must already be on a bundle before it can be added to one. A `stock` of `null` means made to order rather than sold out. |
market:read |
| GET | /api/v1/telemarket/orders/{reference} |
One order
Including the delivery address, which is encrypted at rest. |
market:read |
| GET | /api/v1/telemarket/orders |
Your orders
Newest first, with their lines. |
market:read |
| POST | /api/v1/telemarket/orders |
Place an order
`items` is a list of `{sku, quantity}`. Nothing else is read from it — a price sent in the request is ignored, and every line is priced from the catalogue inside the same transaction that takes it out of stock. One line that cannot be sold refuses the whole basket, because a hub without its sensors is an alarm that cannot ring. |
market:buy |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telemarket_items | What TeleMarket sells this account: devices, what each one works with, what it costs and whether we hold any. Read-only — spending money is not something an agent decides. | market:read |
TeleHome
A number, texting and an alarm — as one thing, for one home.
A telephone number, text messages, TeleGuard watching the door, and the devices to do it with. One monthly price, and anything else from TeleMarket can be added to it later at its own price.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| DELETE | /api/v1/telehome/addons/{sku} |
Take a line off
What the bundle came with cannot be taken off it — cancel or change the bundle instead. |
bundle:manage |
| GET | /api/v1/telehome/addons |
What can be added
With what each one needs. |
bundle:read |
| POST | /api/v1/telehome/addons |
Add a paid line
An accessory is refused unless the bundle already includes what it needs; an upgrade requires nothing, because buying it is what adds the product. |
bundle:manage |
| GET | /api/v1/telehome/bundle |
Your bundle
What is on it, what it costs a month, and — if there is none — which bundle this account could take. |
bundle:read |
| DELETE | /api/v1/telehome/bundle |
Give it up
The row stays, with the date. The charging stops. |
bundle:manage |
| POST | /api/v1/telehome/bundle |
Take TeleHome
Refused for a company account: TeleHome is a household and TeleBusiness is premises, and selling either to the other is selling the wrong shape of thing. |
bundle:manage |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telehome_bundle | The household bundle this account is on, what is included, what was added and what it costs a month. | bundle:read |
TeleBusiness
The same bundle, sized for premises and staff.
Numbers, texting and TeleGuard across your sites, with add-ons for the products a business actually uses — campaigns, a help desk, more devices, more numbers. One subscription, itemised, and every line can be taken off it again.
For business: One subscription instead of seven line items, and an itemised bill that still says which product earned which pound.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/telebusiness/bundle |
Your bundle
As TeleHome, for a company. |
bundle:read |
| DELETE | /api/v1/telebusiness/bundle |
Give it up
The charging stops. |
bundle:manage |
| POST | /api/v1/telebusiness/bundle |
Take TeleBusiness
Refused for a personal account, for the same reason in reverse. |
bundle:manage |
| DELETE | /api/v1/telebusiness/addons/{sku} |
Take a line off
From next month. |
bundle:manage |
| GET | /api/v1/telebusiness/addons |
What can be added
Seats, sites, campaigns, storage and numbers. |
bundle:read |
| POST | /api/v1/telebusiness/addons |
Add a paid line
Charged from the month it is added. |
bundle:manage |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telebusiness_bundle | The company bundle this account is on, its lines and its monthly total. The same tool as TeleHome's under a different name, because an account has one of the two and a person asking should not have to know which. | bundle:read |
TeleCash
The text that arrives the moment money moves.
For transfer agencies, remittance operators and lenders: post each movement as it happens and the account holder is told in seconds — sent, received, paid in, taken out — with the history in their own Telenaas app afterwards. We are not the ledger. You hold the money and the truth about it; a balance here is the one you reported, stamped with when you reported it, and a movement posted twice is one movement rather than two texts about somebody's money.
For business: Transaction alerts that are yours rather than your core banking vendor's: your words, your sender ID, your own record of what was sent and what arrived.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/telecash/transactions |
Movements
Newest first, filterable by account, kind and status. |
cash:read |
| POST | /api/v1/telecash/transactions |
Post a movement
The call to make the moment money moves. `reference` is your own and is the idempotency key: post the same movement again — after a timeout, say — and you get 200 with `duplicate: true` and the holder is not texted a second time. Amounts are positive integers in minor units; which way the money went follows from `kind`, so a negative amount is refused rather than read as a direction. |
cash:post |
| GET | /api/v1/telecash/pin-calls |
PIN calls
Newest first, filterable by your `reference`. How each call ended, never what was typed. |
cash:read |
| POST | /api/v1/telecash/pin-calls |
Ring for a PIN
`in_reply_to` is the id of a text the customer sent in the last 15 minutes, and `reference` your own name for what is being approved. We ring the sender from the number they texted and ask for their PIN on the keypad. The digits are posted once, signed like any webhook, to your endpoint subscribed to `telecash.pin.entered`; answer `{"result": "approved" | "retry" | "refused"}` and the caller hears it. **The digits are never stored, logged or retried** — there is no delivery record of them to replay. How the call ended arrives as `telecash.pin_call.ended`. Three calls per number per 15 minutes; your dial policy applies. |
cash:post |
| POST | /api/v1/telecash/messages/{id}/reply |
Answer a text
`text` (up to 480 characters) goes to the number that sent the message, from the number it was sent to. Only within 30 minutes of it arriving and at most five times per message: a TeleCash key answers people who wrote to you, it cannot text anybody else. |
cash:post |
| GET | /api/v1/telecash/accounts/{reference} |
One account
As you last reported it. |
cash:read |
| GET | /api/v1/telecash/pin-calls/{id} |
One PIN call
Its status: ringing, answered, approved, refused, unavailable, not_answered, abandoned or timed_out. |
cash:read |
| GET | /api/v1/telecash/accounts |
Accounts
The accounts you have registered, with the balance you last reported and when you reported it. |
cash:read |
| PUT | /api/v1/telecash/accounts |
Register an account
Keyed on your own reference. `holder` is the telephone that gets the alert, and it is also how the account holder's own Telenaas app finds this account. A `balance_minor` here is recorded as reported now — we never compute one, because a balance worked out from messages we might have missed is how somebody is told they have money they have not got. |
cash:manage |
| GET | /api/v1/telecash/messages/{id} |
A text a customer sent
The words of an inbound text, by the `message_id` in an `sms.received` webhook. The webhook names the message and never carries its words, because deliveries are stored and replayable while message bodies are kept encrypted. Readable for 30 minutes after it arrived; older texts are the console's business. |
cash:read |
| GET | /api/v1/telecash/summary |
Today
What moved in the last day, and how many alerts have not gone out. |
cash:read |
| GET | /api/v1/telecash/transactions/{reference} |
One movement
Including the counterparty, which is encrypted at rest. |
cash:read |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telecash_accounts | Accounts registered with TeleCash: kind, holder, currency, and the balance the institution last reported — with the moment it said so, because the number goes stale rather than being kept current by us. Account numbers come back masked. | cash:read |
| telenaas_telecash_transactions | Movements posted to TeleCash: what moved, which way, when, and whether the holder was told. Read-only, and deliberately so — posting a movement sends a real person a message about their money, and that is not a decision anything autonomous makes. | cash:read |
TeleBooking
Booked, arriving, leaving — said before they have to ask.
For hotels, clinics, venues and anybody who keeps a room or a slot: the confirmation when it is booked, the message the evening before, the code at check-in and the reminder at check-out. A reminder counts back from the arrival rather than from the booking, which is the difference between "tomorrow" meaning tomorrow and meaning the moment somebody pressed book.
For business: One line in your property system becomes every message a guest gets, in your words and from your sender ID.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/booking/stays/{reference} |
One stay
With its history. |
campaign:read |
| GET | /api/v1/booking/stays |
List stays
What is booked, and where each one is up to. |
campaign:read |
| POST | /api/v1/booking/stays |
Record or update a stay
Keyed on your own reference. `at` is the arrival — a rule with a negative delay counts back from it, so the evening before is the evening before the guest arrives rather than the evening before they booked. |
campaign:manage |
| GET | /api/v1/booking/rules |
List rules
What is said at each state of a stay. |
campaign:read |
| PUT | /api/v1/booking/rules |
Set a rule
One message per status, per channel. |
campaign:manage |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telebooking_stay_update needs approval | Record a stay or move it along — booked, confirmed, checked in, checked out — telling the guest where a rule says to. `at` is the arrival, which is what a reminder counts back from. | campaign:manage |
TeleBilling
The bill, before it is late.
Subscription billing, utility billing, anything that comes round again: issued, due, paid, overdue. Set it once as an automation and it runs on the first of the month without anybody pressing send — and stops the day somebody pays.
For business: Fewer late payments for the price of a text message, and a customer who was told rather than chased.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/billing/bills |
List bills
Issued, due, paid, overdue. |
campaign:read |
| POST | /api/v1/billing/bills |
Record or update a bill
`at` is when it falls due, which is what the reminder counts back from. Marking it paid stops the chasing: rules fire on a change of status, and paid is a status. |
campaign:manage |
| GET | /api/v1/billing/bills/{reference} |
One bill
With its history. |
campaign:read |
| GET | /api/v1/billing/rules |
List rules
What is said at each state of a bill. |
campaign:read |
| PUT | /api/v1/billing/rules |
Set a rule
Including the reminder before the due date and the chase after it. |
campaign:manage |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telebilling_bill_update needs approval | Record a bill or move it along: issued, due, paid, overdue. `at` is when it falls due. | campaign:manage |
TeleInvoices
Sent, seen, due, paid — and the one that is late.
An invoice's whole life as four messages, each with the link to pay in it. The late one is the product: an invoice nobody chased is an invoice nobody paid, and chasing is the part everybody puts off.
For business: Your ledger stays where it is. What changes is that being owed money stops depending on somebody remembering to ask for it.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/invoices/rules |
List rules
What is said at each state. |
campaign:read |
| PUT | /api/v1/invoices/rules |
Set a rule
Including the one that chases a late invoice. |
campaign:manage |
| GET | /api/v1/invoices/invoices/{reference} |
One invoice
With its history. |
campaign:read |
| GET | /api/v1/invoices/invoices |
List invoices
Sent, viewed, due, paid, late. |
campaign:read |
| POST | /api/v1/invoices/invoices |
Record or update an invoice
Put the payment link in `attributes` and name it in the rule's body — the message that gets paid is the one somebody can pay from. |
campaign:manage |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_teleinvoices_invoice_update needs approval | Record an invoice or move it along: sent, viewed, due, paid, late. | campaign:manage |
TeleReminder
The message that arrives in time to be useful.
An exam, an interview, a train, a payment, an appointment: give it a time and what to say, and the reminder counts back from the thing itself. One that would arrive after the event is not sent, because a reminder about something that already happened is just noise from a machine.
For business: Fewer people who simply forgot — which is most of the people who do not turn up.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/reminders/rules |
List rules
When to remind, and what to say. |
campaign:read |
| PUT | /api/v1/reminders/rules |
Set a rule
A negative `delay_minutes` counts back from `at`; a positive one follows up after. |
campaign:manage |
| GET | /api/v1/reminders/reminders |
List reminders
What is waiting to be sent. |
campaign:read |
| POST | /api/v1/reminders/reminders |
Set a reminder
`at` is when the thing happens — the exam, the interview, the train, the payment. A rule with `delay_minutes: -1440` sends the day before. A reminder whose moment has already passed is not sent, because a reminder about something that has happened is noise. |
campaign:manage |
| GET | /api/v1/reminders/reminders/{reference} |
One reminder
With its history. |
campaign:read |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telereminder_reminder_update needs approval | Set a reminder or close one. `at` is when the thing itself happens — the exam, the interview, the train — and the reminder counts back from it. One whose moment has passed is not sent. | campaign:manage |
TeleMarkets
A text when the market moves, not a newsletter next week.
Movement, shortage, high demand, disruption, a recession, a recovery: somebody registers the markets they have money or stock in, and hears the moment one of them changes. Businesses and investors both — a shopkeeper watching cement and a fund watching Brent are the same product. A signal that repeats yesterday's condition is not sent. An alerting product that cries the same thing twice teaches people to ignore it.
For business: Your own market watch on your own list of things, going out in your name — rather than your customers finding out from somebody else's alert.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/markets/rules |
List rules
What is said at each condition. |
campaign:read |
| PUT | /api/v1/markets/rules |
Set a rule
One message per condition, per channel. |
campaign:manage |
| POST | /api/v1/markets/signals |
A market moved
`condition` is one of steady, movement, high_demand, shortage, disruption, recession, recovery. Everybody watching that market is told, under their own rules and their own quiet hours. **A signal repeating the condition somebody was last told is not sent to them** — an alerting product that cries the same thing twice teaches people to ignore it — and the answer says how many were told and how many were already there. |
campaign:manage |
| GET | /api/v1/markets/markets |
Markets
Everything anybody here is watching. |
campaign:read |
| GET | /api/v1/markets/watchers |
Who is watching what
One row per person per market, with the condition each was last told about. |
campaign:read |
| PUT | /api/v1/markets/watchers |
Register a watch
`market` is the thing — an instrument, a commodity, a supply line — and `customer` is the telephone that hears about it. Idempotent per person per market, so a client retrying a sign-up does not create two. |
campaign:manage |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telemarkets_signal needs approval | Tell everybody watching a market that it has moved: steady, movement, high_demand, shortage, disruption, recession or recovery. Anybody already at that condition is not told again. This sends real messages to real people about their money, so it asks first. | campaign:manage |
| telenaas_telemarkets_watchers | Who is watching which market, and the condition each was last told about. | campaign:read |
TeleInternet
Broadband, fibre, fixed wireless and satellite — from whoever reaches the address.
Internet is sold to a place rather than to a person: a fibre plan exists only if somebody already laid fibre down that street. So this asks the one question the rest of the platform never has to — can it be delivered here — and refuses to take the order until the answer is yes. Where a partner publishes a qualification API, the address is checked while the customer waits. Where they do not, the order is placed and stays visibly unsent until a person has checked, because a line sold to an address that cannot have one is a customer who cancelled their old provider for nothing.
For business: Sell connectivity alongside your own services — your price, your invoice, and your brand where the carrier's programme permits it.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/teleinternet/plans/{id} |
One plan in full
Speeds, caps, contract length and what we pay for it — a key belonging to the reselling organisation may see the wholesale price and the margin, because they are the reseller. |
resale:read |
| POST | /api/v1/teleinternet/plans/{id}/coverage |
Can this address have it
Address in, availability out. Three answers: available, not available, or `available: null` — which means that partner publishes no qualification API and a person has to check. The third is not a failure and the plan stays orderable. |
resale:read |
| GET | /api/v1/teleinternet/plans |
Broadband plans in a country
`market` is required: a plan list without one is a list of things that may be impossible where the customer lives. Fibre, DSL, cable, fixed wireless and satellite, cheapest first, with the partner behind each one named. |
resale:read |
| POST | /api/v1/teleinternet/orders/{id}/refresh |
Ask the provider what has happened
Their word for the state is recorded as it came. Only unambiguous ones move our status: `completed` means live, `rejected` means failed, and anything else leaves ours alone rather than guessing. |
resale:read |
| POST | /api/v1/teleinternet/orders/{id}/submit |
Hand the order to the provider
`status` is ours, `partner_status` is theirs. A partner with no integration answers `awaiting_manual_submission`, which means **nothing has been sent yet** and a person must place it. Treating that as success is how a customer is told their line is ordered when it is not. |
resale:sell |
| GET | /api/v1/teleinternet/orders/{id} |
One order and its history
Every state change and every message from the partner, in order — because a line that took three weeks is a story somebody has to tell a customer. |
resale:read |
| DELETE | /api/v1/teleinternet/orders/{id} |
Cancel an order
The provider is asked first where they allow it, then the order is marked cancelled. A cancellation recorded but never received is a service that keeps being billed. |
resale:sell |
| GET | /api/v1/teleinternet/orders |
Internet orders
This organisation's orders for broadband, newest first. |
resale:read |
| POST | /api/v1/teleinternet/orders |
Order a line
Needs the installation address. Refused when there is no signed agreement with the partner, when the agreement does not cover that country, or when the address came back unavailable. The price is taken from the catalogue and frozen onto the order; a price in the request is ignored. |
resale:sell |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_teleinternet_plan_list | Broadband, fibre, fixed-wireless and satellite plans sellable in one country. A market is required: a plan list without one may be a list of things impossible where the customer lives. | resale:read |
| telenaas_teleinternet_coverage_check | Whether a broadband plan can be delivered to an address. Answers available, not available, or unknown — unknown meaning that partner has no coverage API and a person must check. | resale:read |
| telenaas_teleinternet_order_place needs approval | Order a broadband line for an address. Refused without a signed agreement covering that country, and refused when the address came back unavailable. | resale:sell |
TelePhones
Handsets, routers, SIMs and eSIMs, with the line already on them.
A phone is a physical object with a serial number, a SIM is posted and activated, and an eSIM is a profile downloaded onto a device that must be named before it is issued. Three different things behind one shelf, and the distinctions are kept: stock is decremented inside the order, an IMEI is checked before it is believed, and an eSIM activation code is shown once because anybody holding it can use it. Devices come from distributors and manufacturers; the line that runs on them comes from a carrier or an eSIM aggregator. A customer buying both is placing one order.
For business: Put hardware and connectivity in the same basket as the rest of your account — including eSIMs somebody can use the moment they land.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/telephones/catalogue/{id} |
One item in full
Brand, model, storage, data allowance and validity, as the supplier stated them. |
resale:read |
| POST | /api/v1/telephones/orders/{id}/submit |
Hand the order to the supplier
As with every product here: `awaiting_manual_submission` means a person still has to place it with the distributor. |
resale:sell |
| GET | /api/v1/telephones/orders |
Device and SIM orders
This organisation's orders, newest first. |
resale:read |
| POST | /api/v1/telephones/orders |
Order a device, a SIM or an eSIM
A device order may carry an `imei`, which is checked against the Luhn rule before it is believed. An eSIM order carries the phone's `eid` where the supplier issues profiles to a named device. Stock is decremented inside the order, so two people cannot buy the last handset. |
resale:sell |
| POST | /api/v1/telephones/orders/{id}/refresh |
Ask the supplier what has happened
Their status, recorded as they said it. |
resale:read |
| GET | /api/v1/telephones/catalogue |
Handsets, routers, SIMs and eSIMs
`market` is required. `kind` narrows it to `handset`, `router`, `sim`, `esim` or `mobile_plan`. Stock is reported as `in_stock` rather than a count, because a count that is one behind is worse than a boolean. |
resale:read |
| GET | /api/v1/telephones/orders/{id} |
One order and its history
Every state change, in order. |
resale:read |
| DELETE | /api/v1/telephones/orders/{id} |
Cancel an order
Asked of the supplier, then recorded. |
resale:sell |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telephones_catalogue | Handsets, routers, SIMs and eSIMs for sale in one country, with what the supplier said about each. | resale:read |
| telenaas_telephones_order_place needs approval | Order a device, a SIM or an eSIM. An IMEI is checked before it is believed; an eSIM may need the phone's EID. | resale:sell |
TeleTV
Television and streaming packages, licensed for the country they are watched in.
Television is the most conservative thing on this platform, because what is sold is a licence to watch content in a territory rather than a service that can be delivered anywhere. Rights are granted per country, per channel and per window, so every package carries its own territories and they are checked on top of the partner's own market. The channel line-up is whatever the partner published. Where they published none, the package says so rather than showing a list that looks authoritative and is not.
For business: Add television to a broadband or mobile sale, inside the rights territory, under your own brand where the operator's programme allows rebranding.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| POST | /api/v1/teletv/orders/{id}/refresh |
Ask the operator what has happened
Their status, recorded as they said it. |
resale:read |
| GET | /api/v1/teletv/orders |
Television orders
This organisation's orders, newest first. |
resale:read |
| POST | /api/v1/teletv/orders |
Order a package
Needs the watching country. Checked twice: against the partner's programme and against the package's own rights territories, because a partner can operate in a country where a particular package is not licensed. |
resale:sell |
| GET | /api/v1/teletv/packages |
Television packages licensed for a country
`market` is required and means the country the customer watches in. Television rights are granted per country, per channel and per window, so a package sellable in Ireland may not be sellable in France even from the same operator. |
resale:read |
| GET | /api/v1/teletv/packages/{id} |
One package in full
The channel line-up exactly as the operator published it, the rights `territories`, and whether rebranding is permitted. An empty channel list means they published none — not that the package is empty. |
resale:read |
| POST | /api/v1/teletv/orders/{id}/submit |
Hand the order to the operator
`awaiting_manual_submission` means nothing has been sent yet. |
resale:sell |
| GET | /api/v1/teletv/orders/{id} |
One order and its history
Every state change, in order. |
resale:read |
| DELETE | /api/v1/teletv/orders/{id} |
Cancel an order
Asked of the operator, then recorded. |
resale:sell |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_teletv_package_list | Television and streaming packages licensed for one country. Rights are granted per country, so the market is what decides the list. | resale:read |
| telenaas_teletv_order_place needs approval | Order a television package for a customer in one country. Checked against the partner's programme and against the package's own rights territories. | resale:sell |
TeleCenter
A VoIP phone system for a call centre: queues, agents and the wallboard.
Telenaas already carries calls and the help desk already holds tickets. Neither is a call centre. What makes one is a queue that knows who is available, hands a call to exactly one of them, and measures what happened — so this is that, and nothing else. Three things it does that a switch with a hunt group does not. Wrap-up is a real state, so somebody who has just taken a complaint gets the seconds they were promised before the next call. One call reaches one headset, enforced in the database rather than hoped for. And the service level is measured from what happened against a promise the customer chose, so nobody is reporting an average that flatters the afternoon.
For business: Run an inbound team on the same platform as your numbers, your chat and your help desk — one address book, one bill, and a wallboard that says what is happening now.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| POST | /api/v1/telecenter/calls/{id}/abandon |
The caller hung up while waiting
Its own status and its own flag, because it is the number a centre is judged on and folding it into "ended" is how it disappears from a report. |
center:work |
| POST | /api/v1/telecenter/agents/me/status |
An agent says what they are doing
`center:work`, not `center:manage`: going on a break should not need a supervisor. `away` needs a reason. Refused while on a call, because the router would otherwise offer a second one. |
center:work |
| POST | /api/v1/telecenter/queues/{queue_id}/route |
Offer the longest wait to the next agent
Three distinct refusals: no such queue, nothing waiting, or nobody available — and a supervisor needs to know which. |
center:work |
| POST | /api/v1/telecenter/calls/{id}/end |
The call ended
The agent goes into wrap-up for as long as the queue promised. Talk time is metered here — a call nobody answered cost nothing to carry. |
center:work |
| GET | /api/v1/telecenter/wallboard |
The wallboard
Per queue: waiting, longest wait, agents by state, handled and abandoned today, and the service level measured from the last day's calls. `service_level` is **null** when nothing has been answered — not 100. |
center:read |
| GET | /api/v1/telecenter/calls |
The floor right now
Waiting, ringing and talking, oldest first, with live wait times. |
center:read |
| POST | /api/v1/telecenter/calls |
A call arrives in a queue
Answers with the assignment, already offered to somebody if anybody was free. The caller is queued the moment they arrive whether or not there is an agent. |
center:work |
| POST | /api/v1/telecenter/calls/{id}/wrap-up |
Wrap-up finished
Its own step on purpose. Collapsing it into the end of the call is the change that quietly removes wrap-up from the product. |
center:work |
| GET | /api/v1/telecenter/agents |
Who is on the floor
With what each is doing and for how long. `available` is the only state a call is offered to: wrap-up is not available, and neither is a break. |
center:read |
| POST | /api/v1/telecenter/agents |
Put somebody on the floor
Queues, skills, and whether they may supervise. Supervising is a capability on the agent rather than a role, so promoting somebody to administrator does not silently let them listen to calls. |
center:manage |
| GET | /api/v1/telecenter/queues |
The queues
Each with its strategy, its wrap-up seconds and its service-level promise as words. |
center:read |
| POST | /api/v1/telecenter/queues |
Create or change a queue
`strategy` is one of `longest_idle`, `round_robin`, `fewest_calls` or `skills` — named rules rather than a score, so a supervisor can predict who the next call goes to. A skills queue with no skills is refused, because that is a longest-idle queue wearing a confusing name. |
center:manage |
| POST | /api/v1/telecenter/calls/{id}/answer |
The agent picked up
The wait is measured here and stamped against the queue's own promise, once. Nothing recomputes a service level later from averages. |
center:work |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telecenter_wallboard | What is happening in every call queue right now: waiting calls, longest wait, agents by state, and today's service level. A queue that has answered nothing reports no service level rather than a perfect one. | center:read |
| telenaas_telecenter_queue_list | The call queues, with the strategy and the service level each one promises. | center:read |
TeleStream
Live streaming, and the shop beside it.
Broadcast live to an unbounded audience — RTMP or WHIP in, low-latency HLS out — with live chat, moderation, and a product list you can put on screen one at a time. The API and the MCP tools are the product: build a live-shopping channel, a creator platform or an auction on them, and Telenaas carries the video. It is not a bigger meeting. A room forwards every speaker to every peer, so its cost rises with the square of the people in it; a broadcast is ingested once, transcoded once and served over HTTP, which is why a hundred thousand viewers is an ordinary number here and a research project there.
For business: Put live video and a live shop inside your own app. Your branding, your checkout, your domain — our ingest, transcode, edge and chat, reached over one REST API and one set of MCP tools.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| DELETE | /api/v1/telestream/broadcasts/{id}/live |
End it
Meters two things, because they are two costs: `stream.ingest.minutes` is what the transcoder ran for whether or not anybody watched, and `stream.viewer.kminutes` is what the edge served, in thousands of viewer-minutes. Pass `received_video: false` to end it as `failed`. |
stream:broadcast |
| POST | /api/v1/telestream/broadcasts/{id}/live |
Go live
Refused with `already_live` when the channel already has one live — by a database index, not by a check two requests can both pass. Two ingests on one playback URL is what happens the first time an encoder reconnects early. |
stream:broadcast |
| GET | /api/v1/telestream/channels |
The channels
Each with its playback URLs, its latency mode and the last four characters of its ingest key. The key itself is not here and never will be. |
stream:read |
| POST | /api/v1/telestream/channels |
Create or change a channel
Creating one answers with the ingest key — **the only time it is returned**, because it is stored hashed. `handle` is in the playback URL and is unique across the platform. `latency_mode: "low"` costs more to serve and is what an auction or a live shop needs; `standard` is what a lecture needs. |
stream:manage |
| GET | /api/v1/telestream/broadcasts/{id} |
One broadcast
With both measured durations and both viewer figures — now and the peak. A falling "watching now" means nothing without the peak beside it. |
stream:read |
| DELETE | /api/v1/telestream/messages/{message_id}/hide |
Put it back
For when a moderator was wrong. |
stream:moderate |
| POST | /api/v1/telestream/messages/{message_id}/hide |
Hide a message
Hides; nothing deletes. The row keeps who hid it and why, so the author can be told and the moderator can be asked. Silently dropping a muted viewer's messages while still showing them their own is the most common dark pattern in live chat, and there is no endpoint for it here. |
stream:moderate |
| POST | /api/v1/telestream/channels/{id}/key |
Rotate the ingest key
Answers with the new key and invalidates the old one immediately. A rotation that leaves the old key working is not a rotation. |
stream:manage |
| DELETE | /api/v1/telestream/broadcasts/{id}/pin |
Take it off screen
Without putting anything else up. |
stream:broadcast |
| GET | /api/v1/telestream/broadcasts/{id}/products |
What is for sale
In the order the seller put them in, with whichever is pinned flagged. |
stream:read |
| POST | /api/v1/telestream/broadcasts/{id}/products |
Put something on sale
`price_cents` and `currency` are required. Live commerce runs on urgency, and urgency with the price hidden until checkout is a trap rather than a feature. Refused with `commerce_not_enabled` when the channel has no shop switched on. |
stream:broadcast |
| POST | /api/v1/telestream/broadcasts/{id}/products/{product_id}/pin |
Put one product on screen
One at a time, in one transaction, so there is no moment where the stream is showing two prices. |
stream:broadcast |
| GET | /api/v1/telestream/broadcasts/{id}/viewers |
The audience over time
The samples, so a chart can show whether people arrived and stayed or arrived and left. A peak alone cannot tell you which. |
stream:read |
| POST | /api/v1/telestream/broadcasts/{id}/viewers |
How many are watching
Reported by whoever is counting at the edge; the peak is stamped here as it is passed. Nothing estimates this number, because it is the one capacity is bought against. |
stream:broadcast |
| GET | /api/v1/telestream/broadcasts/{id}/messages |
The chat
Hidden lines are left out unless `moderator=true`, which needs `stream:moderate`. |
stream:read |
| POST | /api/v1/telestream/broadcasts/{id}/messages |
Say something
Needs only `stream:read`: a viewer is the point of a chat. Slow mode is enforced per author — a viewer with two tabs is one author — and a refusal says how many seconds are left rather than dropping the message. |
stream:read |
| GET | /api/v1/telestream/broadcasts/{id}/stats |
The numbers for one broadcast
Ingest seconds and viewer seconds are reported separately because they are billed separately, and an invoice should be checkable against this. |
stream:read |
| GET | /api/v1/telestream/broadcasts |
Broadcasts, newest first
Filter with `status` (`scheduled`, `live`, `ended`, `failed`) and `channel_id`. `failed` means it went live and no video ever arrived — distinct from `ended`, because "nobody watched" and "it was never on" call for opposite responses. |
stream:read |
| POST | /api/v1/telestream/broadcasts |
Schedule a broadcast
`record` is decided here, while nobody is watching, and is refused afterwards. A recording switch that can be flipped mid-stream records people who were told it was off. |
stream:broadcast |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telenaas_telestream_channel_list | The live-streaming channels this organisation owns: handle, playback URLs, latency mode and whether chat and the shop are on. The ingest key is never included — it is stored hashed. | stream:read |
| telenaas_telestream_broadcast_list | Broadcasts, newest first. `status` narrows to scheduled, live, ended or failed — `failed` means it went live and no video ever arrived, which is a different problem from nobody watching. | stream:read |
| telenaas_telestream_stats | The numbers for one broadcast: who is watching now, the peak, how long the transcoder ran, and how many viewer-minutes were served. The last two are billed separately and are reported separately here. | stream:read |
Platform
What belongs to no single product: what a key can reach, what it has used, what it has been told, and the automations that wire the products together.
Endpoints
| Method | Path | What it does | Scope |
|---|---|---|---|
| GET | /api/v1/assistants |
The assistants, one per product
Each product has its own: what it is for, what it can do, what it refuses, and the questions worth asking it first. Only products on this plan are listed. |
ai:use |
| GET | /api/v1/assistants/plan/{number} |
An assistant's plan for a dialled number
Infrastructure token. What the assistant in front of this number wants done with an incoming call: the greeting, the action, the forward or the menu. 404 with `no_assistant` means ring it normally. |
infrastructure token |
| POST | /api/v1/assistants/{product}/ask |
Ask a product's assistant
`question`, and `context` for what the caller already has on the screen. It answers and suggests; it never acts. Charged as one assistant message, half price on your own provider key, and every answer says a model wrote it. |
ai:use |
| GET | /api/v1/audiences |
List audiences
The lists this tenant writes to, and how many people are on each. |
campaign:read |
| POST | /api/v1/audiences |
Create an audience
A named list to send to. |
campaign:manage |
| GET | /api/v1/audiences/{id}/members |
List members
Everybody on a list, with whatever the business knows about them. |
campaign:read |
| POST | /api/v1/audiences/{id}/members |
Add members
Takes as many as you send, and answers with how many were added and which were rejected and why. A number that is not a number is named rather than failing the upload. |
campaign:manage |
| DELETE | /api/v1/audiences/{id}/members/{number} |
Remove a member
They stop being written to by anything that uses this list. |
campaign:manage |
| GET | /api/v1/audit |
Audit ledger
Hash-chained, append-only, and readable here. |
audit:read |
| POST | /api/v1/calls/events |
A call event from the switch
Infrastructure token. `started`, `answered` or `ended`, keyed on the switch's own call id. This is what turns a call into a record with a duration and a cost. |
infrastructure token |
| GET | /api/v1/emergency/route/{number} |
Emergency routing
Where an emergency call from this number goes, and with what address. |
infrastructure token |
| GET | /api/v1/greetings |
List greetings
Greetings for TeleCall, TeleVoip and TeleMeet: the caller's own and the organisation's shared one. `product` narrows it. |
greeting:read |
| POST | /api/v1/greetings |
Save a recorded greeting
Multipart `file`, or `name` and base64 `data`, plus `product`. Audio only, two minutes at most, and charged for nothing — it is somebody's own voice. |
greeting:manage |
| POST | /api/v1/greetings/spoken |
Write a greeting and have it read aloud
`script` and `product`, optionally a `voice`. Charged per thousand characters of speech, half price on your own provider key. Nothing is stored if the engine cannot speak: a greeting that plays silence is worse than none. |
greeting:manage |
| DELETE | /api/v1/greetings/{id} |
Delete a greeting
The audio is deleted from storage as well as the greeting retired. The audit trail keeps the record that it existed. |
greeting:manage |
| POST | /api/v1/greetings/{id}/default |
Make a greeting the one that plays
One default per person per product, enforced by a database index rather than by hope. The previous default is cleared in the same transaction. |
greeting:manage |
| GET | /api/v1/meetings/by-pin/{pin} |
Resolve a dial-in PIN
Used by the telephony switch. Authenticated with the infrastructure token, not an API key. |
infrastructure token |
| POST | /api/v1/meetings/{id}/phone-legs |
Join a meeting by telephone
Used by the conference bridge. Admits a caller and answers with the RTP addresses for their leg, or 202 when the host has not admitted them yet. |
infrastructure token |
| DELETE | /api/v1/meetings/{id}/phone-legs/{participant_id} |
End a telephone leg
Releases the media node's ports when the caller hangs up. |
infrastructure token |
| GET | /api/v1/partners |
The partner programmes we know about
Filterable by `market`, `domain`, `model` and `white_label=true` — the last being the shortlist of programmes documented as allowing our own brand on their service. `resale_permitted`, `markup_permitted` and `has_api` are separate fields on purpose: **API access is not resale authorisation**, and a provider with an excellent API whose terms forbid a markup is a supplier of capacity rather than a product. |
partner:read |
| GET | /api/v1/partners/agreements |
Agreements this organisation holds
What was actually signed, which is frequently not what the programme advertised. Credentials are never returned. |
partner:read |
| GET | /api/v1/partners/markets |
Every market a partner covers
With how many programmes are in each — the honest answer to "where could we launch", since a country with one agent and no API is not a country we can launch in. |
partner:read |
| GET | /api/v1/partners/resale/earnings |
What has been sold, by product
Orders, revenue and margin per product, computed from the orders rather than from the catalogue — the catalogue has changed since and the orders are what happened. |
resale:read |
| GET | /api/v1/partners/{key} |
One partner programme in full
Capabilities per function, the access tier as plain words, published commission terms where a company publishes them — and `null` where nobody does, rather than a plausible number somebody would quote back as fact. |
partner:read |
| GET | /api/v1/products |
The product line
The product line, what each one is for, which tiers it has, and which of them this tenant's plan actually includes. Read this rather than hard-coding the list. |
tenant:read |
| GET | /api/v1/realtime/ice |
ICE servers
STUN, plus a TURN credential minted for this request and valid for an hour. Fetch these per session rather than caching them: WebRTC that works in an office and fails on a phone is almost always a missing relay, and a stale credential fails the same way. |
meeting:read |
| GET | /api/v1/realtime/rooms/{room} |
Open an SFU room
Opens the room for one of this tenant's meetings on the media plane and returns the router's RTP capabilities — the first step of the mediasoup handshake. `room` is the meeting id; a meeting belonging to another tenant answers 404 exactly as a made-up id does. Signalling continues over the media socket. If no media plane is configured this answers 200 with `sfu: false`, so a caller can fall back to mesh instead of waiting. |
meeting:manage |
| GET | /api/v1/realtime/rooms/{room}/peers |
Who is in a room
Participant rows for one of this tenant's rooms — peer id, name, role, admitted or waiting — with what each is publishing on the SFU and whether it is paused. The roster a host control is aimed from. |
meeting:manage |
| DELETE | /api/v1/realtime/rooms/{room}/peers/{peer_id} |
Remove someone from a room
Releases their SFU peer at once, so their media stops before their browser is told, then closes their signalling channel. A grant socket token opens one socket, so the removed person cannot reconnect on the token they had. |
meeting:manage |
| POST | /api/v1/realtime/rooms/{room}/peers/{peer_id}/mute |
Mute or unmute someone
`kind` is `audio` (default) or `video`; `muted` defaults to true. Pauses their producer on the SFU and holds the mute in their channel, so opening a fresh producer of that kind is refused until a host unmutes them. |
meeting:manage |
| DELETE | /api/v1/realtime/rooms/{room}/recording |
Stop recording a room
Closes the recording; hand it over with the recordings API. |
meeting:record |
| POST | /api/v1/realtime/rooms/{room}/recording |
Start recording a room
Server-side recording. Refused with the reason unless the tenant enabled it, the plan includes it and the meeting was created with `record_server_side`. |
meeting:record |
| POST | /api/v1/realtime/socket-token |
Mint a socket token
A two-minute token that opens the signalling socket at /media/socket in place of the API key, so the key never appears in a WebSocket URL, a proxy log or a browser history. Pass it as the `token` connect parameter. Send `room` (and optionally `name`, `role` = participant | viewer, `publish` = [audio, video]) to mint a grant: one room, one vouched-for name, only the listed media, one socket. |
meeting:read |
| GET | /api/v1/share/accounts |
Connected accounts
The accounts connected for sending. Credentials are never returned. |
share:read |
| POST | /api/v1/share/accounts |
Connect an account
`provider` and the fields that channel asks for. Refused when the details are not enough to send with, rather than stored and discovered useless at the moment somebody shares something. The token is encrypted under the tenant's own credential key. |
share:manage |
| DELETE | /api/v1/share/accounts/{provider} |
Disconnect an account
The row goes and the token with it. Not disabled: a credential we were asked to stop holding is not kept in case somebody comes back. |
share:manage |
| GET | /api/v1/share/channels |
Channels a message can be handed to
WhatsApp, email, Telegram, Facebook, Instagram — each with the fields it needs and what it can and cannot carry. Instagram takes pictures only; a page post cannot carry a voice message. |
share:read |
| POST | /api/v1/share/messages/{id} |
Share a message outside Telenaas
`provider`, and `destination` where the channel addresses somebody. Words, a picture, a file, a voice message or a contact. Recorded whether it worked or not — and once it has gone, it has gone. |
share:manage |
| GET | /api/v1/status |
Platform status
What this key can reach, and whether the platform is healthy. |
tenant:read |
| GET | /api/v1/storage |
Where files and history live
The organisation's storage plane: Burmeel by default, or its own Amazon S3, Google Cloud Storage, Azure Blob or S3-compatible bucket. Never returns credentials. |
tenant:read |
| PUT | /api/v1/storage |
Choose the storage
`provider` (burmeel, s3, gcs, azure), `bucket`, `endpoint`, `region`, `account`, `prefix`, `key_id`, `secret`. Credentials are encrypted under the organisation's own key and only replaced when supplied. |
tenant:manage |
| POST | /api/v1/storage/verify |
Check the storage
Writes, reads back and deletes a probe object with the configured credentials. |
tenant:manage |
| GET | /api/v1/usage |
Usage
Metered usage for the current billing period. |
billing:read |
| GET | /api/v1/webhooks |
List webhook endpoints
Where we send events. |
developer:read |
| POST | /api/v1/webhooks |
Add a webhook endpoint
Returns the signing secret once. The timestamp is inside the signature, so a captured delivery cannot be replayed later. |
developer:manage |
| GET | /api/v1/webhooks/deliveries |
Delivery history
So "it never arrived" has an answer. |
developer:read |
| GET | /api/v1/workflow-runs |
Automation history
Every run, with the steps it took and the ones it was denied. |
automation:read |
| GET | /api/v1/workflows |
List automations
What runs on its own in this tenant. |
automation:read |
| POST | /mcp |
Model Context Protocol
A JSON-RPC dispatcher for agents. Tools are named for the product they belong to; each enforces its own permission, so an agent can never reach further than a REST client holding the same key. |
any authenticated key |
Agent tools
| Tool | What it does | Scope |
|---|---|---|
| telecenter_agent_status | Set your own state on the call-centre floor: available, away with a reason, or offline. Refused while you are on a call. | center:work |
| telestream_schedule | Schedule a broadcast on a channel. `record` is decided here and cannot be changed once it is live, because a recording switch flipped mid-stream records people who were told it was off. | stream:broadcast |
| telestream_go_live | Put a scheduled broadcast live. Refused when the channel already has one live: two ingests on one playback URL means the audience sees whichever won. | stream:broadcast |
| telestream_end | End a live broadcast and meter it. Pass `received_video: false` when no video ever arrived, so it is recorded as failed rather than as one that simply ended. | stream:broadcast |
| telestream_product_pin | Put one product on screen during a broadcast, or clear it by leaving `product_id` out. One at a time, so the stream is never showing two prices. | stream:broadcast |
| telestream_message_hide | Hide a line of live chat, with a reason. It hides and never deletes: the row keeps who hid it, so the author can be told and the moderator can be asked. | stream:moderate |
| telenaas_partner_list | Telecom partner programmes: which country, which model, whether resale and markup are permitted, and whether our own brand may go on their service. API access is not resale authorisation and these are separate fields. | partner:read |
| telenaas_partner_white_label | Only the partners whose programmes are documented as allowing white-labelling — the shortlist a Telenaas-branded broadband, mobile or TV product could be built on. | partner:read |
| telenaas_resale_order_list | Orders placed for resold internet, devices or television, with our status and the partner's. | resale:read |
| telenaas_greeting_list | Greetings for TeleCall, TeleVoip and TeleMeet — what a caller hears before a person answers, and which one plays. | greeting:read |
| telenaas_greeting_speak | Write a greeting and have the speech engine read it aloud. Charged per thousand characters; stores nothing if the engine cannot speak. | greeting:manage |
| telenaas_greeting_set_default | Make a greeting the one that plays for its product. | greeting:manage |
| telenaas_share_channel_list | Channels a message can be handed to — WhatsApp, email, Telegram, Facebook, Instagram — with what each needs and what it can carry. | share:read |
| telenaas_share_account_list | Connected outbound accounts. Never their credentials. | share:read |
| telenaas_share_message | Hand a message — words, a picture, a file, a voice message, a contact — to a connected account. Once it has gone it cannot be recalled. | share:manage |
| telenaas_assistant_list | The assistants, one per product: what each is for, what it can do and what it refuses. | ai:use |
| telenaas_assistant_ask | Ask a product's assistant a question, with whatever context the caller already has. It answers and suggests; it never acts. | ai:use |
| telenaas_storage_describe | Where this organisation's files and chat history are stored. | tenant:read |
| telenaas_usage_summary | What this tenant has used and what it costs. | billing:read |
| telenaas_audit_search | Read the audit ledger. | audit:read |
| telenaas_automation_list | Automations in this tenant and whether they are running. | automation:read |
| telenaas_automation_dry_run | Test an automation against events that already happened. Nothing is performed. | automation:read |
| telenaas_products | The product line, and which of them this key can actually reach. Read this before guessing a tool name. | tenant:read |
| telenaas_platform_health | Whether each part of the platform is answering. | tenant:read |