Recordings
Call recordings with playback, download, transcription and summary. Scope recordings:read (list, playback, transcripts) and recordings:write (settings, rules, deletion, access log).
List, playback and transcription
curl -s "https://centralino.exovoip.it/api/v1/recordings?from=2026-11-01&direction=inbound&limit=50" -H "X-API-Key: $EXOPBX_API_KEY"
curl -s "https://centralino.exovoip.it/api/v1/recordings/77/audio?download=true" -H "X-API-Key: $EXOPBX_API_KEY" -o chiamata.wav
curl -s https://centralino.exovoip.it/api/v1/recordings/77/transcript -H "X-API-Key: $EXOPBX_API_KEY"import { writeFile } from 'node:fs/promises';
const { items } = await pbx.recordings.list({
from: '2026-11-01',
direction: 'inbound',
limit: 50,
});
const audio = await pbx.recordings.audio(77, { download: true });
await writeFile('chiamata.wav', Buffer.from(audio));
const transcript = await pbx.recordings.transcript(77);$items = $pbx->recordings->list(from: '2026-11-01', direction: 'inbound', limit: 50)['items'];
file_put_contents('chiamata.wav', $pbx->recordings->audio(77, download: true));
$transcript = $pbx->recordings->transcript(77);items = pbx.recordings.list(from_="2026-11-01", direction="inbound", limit=50)["items"]
with open("chiamata.wav", "wb") as fh:
fh.write(pbx.recordings.audio(77, download=True))
transcript = pbx.recordings.transcript(77)- Filters:
from,to,direction,extensionId,queueId,number,q(text in transcripts),hasTranscript. GET /v1/recordings/:id/audio: playback (download=trueto download the file;channel=left|rightfor a single side of stereo recordings). Every playback and download is recorded in the access log (GET /v1/recordings/access-log).POST /v1/recordings/:id/transcribeandPOST /v1/recordings/:id/summarizestart transcription and summary in the background (status viaGET /v1/jobs/:id).
Who can listen depends on the tenant settings (supervisorsCanListen, supervisorsCanDownload, usersCanListenOwn).
What to record
Rules are set per level (tenant, number, queue, extension): the most specific level wins, mode: "inherit" inherits from the level above.
# Registra sempre le chiamate in entrata della coda 5
curl -s -X PUT https://centralino.exovoip.it/api/v1/recordings/policies/queue/5 \
-H "X-API-Key: $EXOPBX_API_KEY" -H "Content-Type: application/json" \
-d '{"mode":"always","inbound":true,"outbound":false,"announceEnabled":true}'await pbx.recordings.upsertPolicy('queue', 5, {
mode: 'always',
inbound: true,
outbound: false,
announceEnabled: true,
});
const effective = await pbx.recordings.effectivePolicy({ queueId: 5 });$pbx->recordings->upsertPolicy('queue', 5, ['mode' => 'always', 'inbound' => true, 'outbound' => false, 'announceEnabled' => true]);pbx.recordings.upsert_policy("queue", 5, {"mode": "always", "inbound": True, "outbound": False, "announceEnabled": True})targetId is the id of the number, queue or extension (0 for the tenant level). GET /v1/recordings/policies/effective shows the effective rule for a combination of number, queue and extension.
General settings (PUT /v1/recordings/settings) include retention in days, format, storage quota and playback permissions.
Endpoints
| Request | Scope | SDK method |
|---|---|---|
GET /v1/recordings | recordings:read | recordings.list() |
GET /v1/recordings/settings | recordings:read | recordings.getSettings() · py: recordings.get_settings() |
PUT /v1/recordings/settings | recordings:write | recordings.setSettings() · py: recordings.set_settings() |
GET /v1/recordings/policies | recordings:read | recordings.listPolicies() · py: recordings.list_policies() |
GET /v1/recordings/policies/effective | recordings:read | recordings.effectivePolicy() · py: recordings.effective_policy() |
PUT /v1/recordings/policies/:scope/:targetId | recordings:write | recordings.upsertPolicy() · py: recordings.upsert_policy() |
DELETE /v1/recordings/policies/:scope/:targetId | recordings:write | recordings.deletePolicy() · py: recordings.delete_policy() |
GET /v1/recordings/access-log | recordings:write | recordings.accessLog() · py: recordings.access_log() |
GET /v1/recordings/:id | recordings:read | recordings.get() |
DELETE /v1/recordings/:id | recordings:write | recordings.delete() |
GET /v1/recordings/:id/audio | recordings:read | recordings.audio() |
GET /v1/recordings/:id/transcript | recordings:read | recordings.transcript() |
POST /v1/recordings/:id/transcribe | recordings:write | recordings.transcribe() |
POST /v1/recordings/:id/summarize | recordings:write | recordings.summarize() |
