docs/platform/integrations/sms/sms-webhook.mdx
SMS Webhook lets you send SMS notifications through any HTTP API you control. Instead of a built-in provider SDK, Novu POSTs each message to your Base URL with the subscriber phone number, message body, and sender ID.
Use this integration when your SMS gateway exposes a REST API that is not listed in Novu's provider catalog, or when you want Novu to call an internal service that handles delivery.
For each SMS, Novu sends a POST request to your Base URL with the configured API key headers.
{
"to": "+1234567890",
"content": "Your verification code is 123456",
"sender": "MyApp"
}
| Field | Description |
|---|---|
to | Recipient phone number from the subscriber profile or trigger override. |
content | Rendered SMS body from the workflow step. |
sender | Sender ID from the integration From field or trigger override. |
Return a 2xx JSON response. Novu reads the message ID and date using the Id Path and Date Path you configured.
Example response when Id Path is message.id and Date Path is message.date:
{
"message": {
"id": "msg_abc123",
"date": "2026-01-14T10:30:00.000Z"
}
}
If the date field is missing, Novu uses the current timestamp.
When Authenticate by token is enabled:
POSTs to your Auth URL with the API key headers.data.<Authentication Token Key> in the response.Use provider overrides to merge extra fields into the outbound request:
import { Novu } from '@novu/api';
const novu = new Novu({ secretKey: '<YOUR_SECRET_KEY_HERE>' });
await novu.trigger({
workflowId: 'workflow-id',
to: { subscriberId: 'user-123' },
overrides: {
providers: {
'generic-sms': {
_passthrough: {
body: {
templateId: 'otp-template',
},
},
},
},
},
});
The _passthrough.body fields are deep-merged into the default payload. See SMS overrides to change to, from, or content at trigger time.