Plugins¶
-
Overview
Architecture and provider slots.
Stay here -
Curated Registry
Discover vetted providers.
Browse -
:material-http: HTTP Manifest Providers
Describe providers declaratively.
Guide -
Plugin Config File
Resolved config formats and locations.
Reference -
SIP Provider Plugins
Self‑hosted telephony adapters.
Read -
Home Assistant Sample
Integrate with your smart home.
Example
Faxbot v3 introduces runtime‑switchable provider plugins backed by a single resolved config file. Initially supported slots are outbound (send faxes) and storage (inbound artifact storage). Inbound cloud callbacks remain core endpoints that delegate to plugin‑specific handlers; signature verification stays in core.
- Outbound: exactly one active provider (e.g., phaxio, sinch, sip, documo, signalwire, or an HTTP manifest provider)
- Storage: local or S3/S3‑compatible (MinIO) for inbound PDFs
Feature flags and config
- Enable discovery endpoints: set FEATURE_V3_PLUGINS=true on the API
- Optional dynamic install (off by default): FEATURE_PLUGIN_INSTALL=true (strict allowlist & checksums required)
- Resolved config file path: FAXBOT_CONFIG_PATH (default config/faxbot.config.json)
Admin Console integration - Plugins tab lists installed providers with enable/disable toggles - Each provider shows schema‑driven settings and “Learn more” links - UI surfaces only the currently selected outbound provider’s guidance (backend isolation)
Learn more - Curated Registry - HTTP Manifest Providers
Manifests available (examples)¶
These example manifests live in the repo and can be used as starting points.
- id
faxplus— Fax.Plus - id
ringcentral— RingCentral — Try it - id
interfax— InterFAX — Try it - id
sfax— Sfax (Consensus) - id
pamfax— PamFax - id
dropbox_fax— Dropbox Fax
{
"id": "ringcentral",
"name": "RingCentral Fax API",
"auth": { "scheme": "bearer" },
"traits": {
"kind": "cloud",
"requires_ghostscript": true,
"requires_tiff": false,
"supports_inbound": false,
"inbound_verification": "none",
"needs_storage": false,
"outbound_status_only": false
},
"actions": {
"send_fax": {
"method": "POST",
"url": "https://platform.ringcentral.com/restapi/v1.0/account/~/extension/~/fax",
"body": { "kind": "multipart", "template": "request={\\"to\\":[{\\"phoneNumber\\":\\"{{to}}\\"}]}&attachment={{file}}" },
"response": { "faxId": "id" }
},
"get_status": {
"method": "GET",
"url": "https://platform.ringcentral.com/restapi/v1.0/account/~/message-store/{{fax_id}}",
"body": { "kind": "none", "template": "" },
"response": { "status": "messageStatus", "sentPages": "faxPageCount" }
}
},
"allowed_domains": ["platform.ringcentral.com"],
"timeout_ms": 15000
}
{
"id": "interfax",
"name": "InterFAX API",
"auth": { "scheme": "basic" },
"actions": {
"send_fax": {
"method": "POST",
"url": "https://rest.interfax.net/outbound/faxes?faxNumber={{to}}",
"headers": { "Content-Location": "{{file_url}}", "Content-Type": "application/pdf" },
"body": { "kind": "none", "template": "" },
"response": { "faxId": "id" }
},
"get_status": {
"method": "GET",
"url": "https://rest.interfax.net/outbound/faxes/{{fax_id}}",
"body": { "kind": "none", "template": "" },
"response": { "status": "status" }
}
},
"allowed_domains": ["rest.interfax.net"]
}