Assistant messages
Messages collected by the auto answer (auto_answer destination): the phone system asks callers why they are calling, records the answer, produces a transcript and summary, then notifies the extensions listed in notifyExtensionIds. Scope recordings:read (list, playback, transcript) and recordings:write (deletion).
Requires the AI Assistant plugin (ai): without it every endpoint on this page returns 403 PLUGIN_REQUIRED. The Recordings plugin is not needed: call recordings stay in the Recordings section.
List, playback and transcript
curl -s "https://centralino.exovoip.it/api/v1/assistant/messages?from=2026-11-01&limit=50" -H "X-API-Key: $EXOPBX_API_KEY"
curl -s https://centralino.exovoip.it/api/v1/assistant/messages/91/transcript -H "X-API-Key: $EXOPBX_API_KEY"
curl -s "https://centralino.exovoip.it/api/v1/assistant/messages/91/audio?download=1" -H "X-API-Key: $EXOPBX_API_KEY" -o messaggio.wav
curl -s -X DELETE https://centralino.exovoip.it/api/v1/assistant/messages/91 -H "X-API-Key: $EXOPBX_API_KEY"import { writeFile } from 'node:fs/promises';
const { items } = await pbx.assistant.listMessages({ from: '2026-11-01', limit: 50 });
for (const msg of items) {
const { transcript } = await pbx.assistant.messageTranscript(msg.id);
console.log(msg.caller, transcript.summary ?? transcript.text);
const audio = await pbx.assistant.messageAudio(msg.id, { download: true });
await writeFile(`messaggio-${msg.id}.wav`, Buffer.from(audio));
}
await pbx.assistant.deleteMessage(91);$items = $pbx->assistant->listMessages(from: '2026-11-01', limit: 50)['items'];
$transcript = $pbx->assistant->messageTranscript(91);
file_put_contents('messaggio.wav', $pbx->assistant->messageAudio(91, download: true));
$pbx->assistant->deleteMessage(91);items = pbx.assistant.list_messages(from_="2026-11-01", limit=50)["items"]
transcript = pbx.assistant.message_transcript(91)
with open("messaggio.wav", "wb") as fh:
fh.write(pbx.assistant.message_audio(91, download=True))
pbx.assistant.delete_message(91)GET /v1/assistant/messagesaccepts the same filters and returns the same format asGET /v1/recordings(cursorpagination), limited to messages withkind: "auto_answer". Thesummaryfield already contains the message summary.GET /v1/assistant/messages/:id/audio: playback withRangesupport;download=1to download the file.GET /v1/assistant/messages/:id/transcript: full text, segments and summary.DELETE /v1/assistant/messages/:id: deletes the message (optionalreason, written to the activity log).
Who can listen to and read messages follows the same settings as recordings (supervisorsCanListen, supervisorsCanDownload, usersCanListenOwn); playback, downloads and deletions are written to the access log.
Messages and recordings
Every recording has a kind field:
kind | Content |
|---|---|
call | Recorded call |
auto_answer | Message left with the auto answer |
With the Recordings plugin, GET /v1/recordings returns both kinds: the kind=call or kind=auto_answer filter separates them.
Endpoints
| Request | Scope | SDK method |
|---|---|---|
GET /v1/assistant/messages | recordings:read | assistant.listMessages() · py: assistant.list_messages() |
GET /v1/assistant/messages/:id | recordings:read | assistant.getMessage() · py: assistant.get_message() |
DELETE /v1/assistant/messages/:id | recordings:write | assistant.deleteMessage() · py: assistant.delete_message() |
GET /v1/assistant/messages/:id/audio | recordings:read | assistant.messageAudio() · py: assistant.message_audio() |
GET /v1/assistant/messages/:id/transcript | recordings:read | assistant.messageTranscript() · py: assistant.message_transcript() |
