Curated Plugin Registry¶
The Plugins tab uses these discovery endpoints when FEATURE_V3_PLUGINS=true.
Plugins Overview :material-http: HTTP Manifest Docs Plugin Config File Plugin Builder
Endpoints (admin scope required)¶
 GET /plugins
: List installed plugins with manifests and current enabled/config values
 GET /plugins/{id}/config
: Return enabled and settings for a plugin
 PUT /plugins/{id}/config
: Validate and persist via the JSON config store
 GET /plugin-registry
: Serve the curated registry JSON for UI search
Config store¶
 Path
: FAXBOT_CONFIG_PATH (default config/faxbot.config.json)
 Writes
: Atomic writes with .bak backups; roll back to last known‑good on validation/startup failure
Security & permissions¶
 Scopes
: admin:plugins:read, admin:plugins:write
 Who can write
: Only keys with keys:manage may change plugin configs
Rate limits : Per‑key RPM: mirror inbound list/get defaults for reads (stricter for writes)
Dynamic install (optional)¶
 Default
: Keep FEATURE_PLUGIN_INSTALL=false
When enabled : Use a strict allowlist and checksums (signatures if provided); non‑interactive, sandboxed install only
HIPAA : Leave remote install disabled for HIPAA profiles
Admin Console behavior¶
 Plugins tab
: Reads /plugins and renders schema‑driven forms
Backend isolation : Only the active outbound provider’s help is shown; switching providers is a guided flow (no mixed instructions)
Notes¶
- Backends remain isolated across docs and UI; Phaxio users never see SIP/Asterisk instructions
 - Inbound cloud callbacks remain core HTTP endpoints that delegate to plugin handlers; HMAC/signature verification is enforced in core
 
Troubleshooting¶
/pluginsreturns 404 → enableFEATURE_V3_PLUGINS=trueand restart the API- Config write errors → check permissions on 
FAXBOT_CONFIG_PATH(default lives under thefaxdatavolume) 
Quick examples¶
{
  "providers": [
    {
      "id": "phaxio",
      "name": "Phaxio (Cloud)",
      "type": "outbound",
      "version": "1.0.0",
      "manifest": {
        "actions": { "send_fax": { "method": "POST", "url": "https://api.phaxio.com/..." } },
        "allowed_domains": ["api.phaxio.com"]
      }
    }
  ]
}
{
  "plugins": [
    {
      "id": "phaxio",
      "enabled": true,
      "settings": { "api_key": "***", "api_secret": "***" },
      "type": "outbound"
    }
  ]
}
BASE="http://localhost:8080"
API_KEY="your_admin_api_key"
curl -sS -X PUT "$BASE/plugins/phaxio/config" \
  -H "X-API-Key: $API_KEY" -H 'content-type: application/json' \
  -d '{"enabled":true, "settings": {"api_key":"...","api_secret":"..."}}'