Transport Channels
PSAPLink Cloud supports 11 pluggable transport channels. All implement TransportHandlerInterface.
Available Transports
| Slug | Provider | Inbound ACK |
|---|---|---|
email | Symfony Mailer (SMTP / SES / Postmark) | ✅ Yes |
sms | Twilio REST API | ✅ Yes |
webhook | HMAC-signed JSON HTTP POST | ✅ Yes |
ntfy | ntfy.sh topic push | No |
slack | Slack Incoming Webhooks | No |
teams | Microsoft Teams Connector Cards | No |
pagerduty | PagerDuty Events API v2 | No |
discord | Discord Webhooks | No |
cap | CAP 1.2 XML | No |
pager_snpp | SNPP pager (RFC 1861) | No |
push | FCM / APNs | No |
Transports that support Inbound ACK can receive replies from recipients and automatically mark notifications acknowledged.
Transport Interface
interface TransportHandlerInterface
{
public function getSlug(): string;
/** Send a notification. $config is already decrypted. */
public function send(NotificationDelivery $delivery, array $config): DeliveryResult;
/** Send a test message. $config is already decrypted. */
public function test(array $config): DeliveryResult;
/** Throw \InvalidArgumentException if config is invalid. */
public function validateConfig(array $config): void;
/** Parse inbound payload into AckResult. Return null if not applicable. */
public function parseInboundAck(array $payload): ?AckResult;
}
Credential Storage
Credentials are stored in transport_channels.config as a JSON blob encrypted at rest using libsodium. The transport handler receives the decrypted config array at send time. Credentials are never logged or returned in API responses.
Three-Level Config Hierarchy
| Level | Where stored | Who controls |
|---|---|---|
| Platform defaults | transport_types.platform_config | superadmin |
| Per-channel config | transport_channels.config | agency admin |
| Per-user overrides | user_transport_preferences.config_override | company user |
All three levels are encrypted.
Adding a Custom Transport
- Create a class in
cloud/src/Transport/implementingTransportHandlerInterface - Tag the service with
psaplink.transport - Add credentials schema to the transport registry
- Add a doc page in this section