ExoVoIPDeveloper guide

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"
  • Filters: from, to, direction, extensionId, queueId, number, q (text in transcripts), hasTranscript.
  • GET /v1/recordings/:id/audio: playback (download=true to download the file; channel=left|right for 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/transcribe and POST /v1/recordings/:id/summarize start transcription and summary in the background (status via GET /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}'

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

RequestScopeSDK method
GET /v1/recordingsrecordings:readrecordings.list()
GET /v1/recordings/settingsrecordings:readrecordings.getSettings() · py: recordings.get_settings()
PUT /v1/recordings/settingsrecordings:writerecordings.setSettings() · py: recordings.set_settings()
GET /v1/recordings/policiesrecordings:readrecordings.listPolicies() · py: recordings.list_policies()
GET /v1/recordings/policies/effectiverecordings:readrecordings.effectivePolicy() · py: recordings.effective_policy()
PUT /v1/recordings/policies/:scope/:targetIdrecordings:writerecordings.upsertPolicy() · py: recordings.upsert_policy()
DELETE /v1/recordings/policies/:scope/:targetIdrecordings:writerecordings.deletePolicy() · py: recordings.delete_policy()
GET /v1/recordings/access-logrecordings:writerecordings.accessLog() · py: recordings.access_log()
GET /v1/recordings/:idrecordings:readrecordings.get()
DELETE /v1/recordings/:idrecordings:writerecordings.delete()
GET /v1/recordings/:id/audiorecordings:readrecordings.audio()
GET /v1/recordings/:id/transcriptrecordings:readrecordings.transcript()
POST /v1/recordings/:id/transcriberecordings:writerecordings.transcribe()
POST /v1/recordings/:id/summarizerecordings:writerecordings.summarize()