Plugins
Some phone system features are paid plugins, enabled per company by Exobyte. The APIs are always included for every section: features of a plugin that is not active return 403 PLUGIN_REQUIRED. To enable a plugin, contact Exobyte.
Available plugins
| Plugin | Features | Endpoints and fields |
|---|---|---|
ai — AI Assistant | Professional voices and voice catalog; voice choice for text prompts; auto answer (asks the reason for the call, records it and takes a note with transcript and summary); voice assistant | voices.list, voices.preview, voices.sample, voices.setTenantDefault; voiceId in POST /v1/prompts and PATCH /v1/prompts/:id; auto_answer and ai_assistant destinations; auto answer messages: assistant.listMessages, assistant.getMessage, assistant.messageAudio, assistant.messageTranscript, assistant.deleteMessage (Assistant messages) |
recording — Recordings | Call recording with rules per company, number, queue and extension; playback, download, transcription and summary of recordings and voicemail messages | All recordings.* endpoints; voicemail.messageTranscript, voicemail.transcribeMessage |
Without plugins, every other phone system feature remains available:
- without
ai: text prompts use the platform's standard voice, and audio files (MP3, WAV, OGG, M4A) can always be uploaded. An auto answer that was already configured is replaced by an "unavailable" message; - without
recording: the phone system does not record calls; voicemail works as usual, without transcription.
The demo company always has every plugin enabled.
Company plugins
GET /v1/plugins returns the plugins of the key's company (scope extensions:read), with enabled for each one; locked is true for companies that always have every plugin enabled. The company object returned by GET /v1/tenants/current also contains plugins, the list of active ids.
# Plugin attivi per l'azienda della chiave
curl -s https://centralino.exovoip.it/api/v1/plugins -H "X-API-Key: $EXOPBX_API_KEY"
# Funzione di un plugin non attivo
# HTTP/1.1 403 Forbidden
# {"error":{"code":"PLUGIN_REQUIRED","message":"Funzione disponibile con il plugin «Registrazioni». ...","details":{"plugin":"recording"}}}import { isExoPBXError } from '@exobyte/exopbx-sdk';
const { plugins } = await pbx.plugins.list();
const hasRecording = plugins.some((p) => p.id === 'recording' && p.enabled);
try {
await pbx.recordings.list();
} catch (err) {
if (isExoPBXError(err, 'PLUGIN_REQUIRED')) {
const { plugin } = err.details as { plugin: string };
console.log(`Funzione non attiva: plugin ${plugin}`);
} else throw err;
}use Exobyte\ExoPBX\ApiException;
$out = $pbx->plugins->list();
foreach ($out['plugins'] as $p) {
echo $p['id'], ' ', $p['enabled'] ? 'attivo' : 'non attivo', PHP_EOL;
}
try {
$pbx->recordings->list();
} catch (ApiException $e) {
if ($e->getErrorCode() !== 'PLUGIN_REQUIRED') throw $e;
echo 'Plugin richiesto: ', $e->getDetails()['plugin'], PHP_EOL;
}from exopbx import ExoPBXError
plugins = pbx.plugins.list()["plugins"]
enabled = [p["id"] for p in plugins if p["enabled"]]
try:
pbx.recordings.list()
except ExoPBXError as err:
if err.code != "PLUGIN_REQUIRED":
raise
print("Plugin richiesto:", err.details["plugin"])PLUGIN_REQUIRED error
A feature of an inactive plugin returns 403 PLUGIN_REQUIRED; details.plugin names the required plugin (ai or recording). For the auto_answer and ai_assistant destinations, details.path points to the affected field. Read GET /v1/plugins at startup and hide the features that are not available.
Activation (platform administrator)
GET /v1/tenants/:id/plugins and PUT /v1/tenants/:id/plugins are reserved for the platform administrator. The PUT body replaces the list of active plugins: { "enabled": ["ai", "recording"] } (an empty list disables all of them). The change applies to the phone system immediately and is written to the audit log.
# Solo amministratore della piattaforma (chiave globale)
curl -s https://centralino.exovoip.it/api/v1/tenants/3/plugins -H "X-API-Key: $EXOPBX_API_KEY"
curl -s -X PUT https://centralino.exovoip.it/api/v1/tenants/3/plugins -H "X-API-Key: $EXOPBX_API_KEY" \
-H "Content-Type: application/json" -d '{"enabled":["ai","recording"]}'const current = await pbx.tenants.getPlugins(3);
const updated = await pbx.tenants.setPlugins(3, { enabled: ['ai', 'recording'] });
console.log(updated.plugins.filter((p) => p.enabled).map((p) => p.id));$current = $pbx->tenants->getPlugins(3);
$updated = $pbx->tenants->setPlugins(3, ['enabled' => ['ai', 'recording']]);current = pbx.tenants.get_plugins(3)
updated = pbx.tenants.set_plugins(3, {"enabled": ["ai", "recording"]})Endpoints
| Request | Scope | SDK method |
|---|---|---|
GET /v1/plugins | extensions:read | plugins.list() |
