Send multi-channel notifications, manage contacts, and configure events via REST API.
Using Node.js? See the SDK Guide for TypeScript examples with the
@appitude/sendiventpackage.
Reference: API Guide | Official Docs
export SENDIVENT_API_KEY=live_your_key_hereuser.welcome)All requests require a Bearer token in the Authorization header:
text
Authorization: Bearer YOUR_API_KEY
Base URLs:
https://api.sendivent.comhttps://api-sandbox.sendivent.comKey Prefixes:
live_* — Production (real deliveries)test_* — Sandbox (safe testing)All POST/PATCH requests must include Content-Type: application/json.
POST /v1/send/{event}
The event is the event name in the URL path (e.g. order.confirmed), not in the body.
ParameterTypeRequiredDescriptionto``string | objectYesRecipient — email, phone, UUID, external_id, or contact objectpayload``objectYesTemplate variables (can be {} if none)language``stringNoTemplate language override (e.g. sv, en)from``stringNoSender override (must be verified)overrides``objectNoChannel-specific overrides
Flexible to formats:
json
"to": "user@example.com"
"to": "+14155551234"
"to": "550e8400-e29b-41d4-a716-446655440000"
"to": { "email": "user@example.com", "name": "Jane", "tier": "premium" }
Any non-standard field in the contact object (like tier above) is stored in meta and accessible in templates as {{contact.meta.tier}}.
Response:
json
{
"success": true,
"deliveries": [
{ "email": "d4e5f6a7-b8c9-4d0e-a1f2-3b4c5d6e7f8a" },
{ "sms": "a1b2c3d4-e5f6-7890-abcd-ef1234567890" }
]
}
Each entry in deliveries is a { channel: uuid } object mapping the channel to the delivery UUID.
POST /v1/send/{event}
Pass an array to to for personalized multi-recipient sends:
json
{
"to": [
{ "email": "user1@example.com", "name": "Alice", "tier": "premium" },
{ "email": "user2@example.com", "name": "Bob", "tier": "free" }
],
"payload": { "company": "ACME" }
}
Each contact receives individually compiled templates with their specific data + shared payload.
POST /v1/send/{event}/{channel}
Channels: email, sms, slack, push, telegram, whatsapp, discord
Include X-Idempotency-Key: your-unique-key header to prevent duplicate sends. Replayed requests return X-Idempotent-Replay: true.
When a send fails, the response includes an errors array:
json
{
"success": false,
"deliveries": [],
"errors": [
{ "code": "INTEGRATION_MISSING", "message": "No email integration configured" }
]
}
GET /v1/contacts
ParameterTypeRequiredDescriptionlimit``numberNoMax 100 (default 50)offset``numberNoPagination offsetsearch``stringNoSearch by email, name, or phone
Response:
json
{
"success": true,
"data": {
"contacts": [{ "uuid": "...", "email": "...", "name": "...", "meta": {} }],
"total": 150,
"limit": 50,
"offset": 0
}
}
GET /v1/contacts/{identifier}
Identifier can be: email, phone, UUID, external_id, or Slack user ID.
POST /v1/contacts
ParameterTypeRequiredDescriptionemail``stringNo*Email addressphone``stringNo*Phone (E.164 format)name``stringNoDisplay nameexternalId``stringNoYour system's user IDavatar``stringNoAvatar URLusername``stringNoUsernameslack``stringNoSlack user IDtelegram``stringNoTelegram user IDdiscord``stringNoDiscord user ID
*At least one identifier (email, phone, externalId) is required.
Any unknown field is automatically stored in meta with camelCase conversion.
PATCH /v1/contacts/{identifier}
Same fields as create. Only updates provided fields.
DELETE /v1/contacts/{identifier}
Hard delete (GDPR compliant). Returns { "success": true, "deleted": true }.
POST /v1/contacts/{identifier}/push-tokens — Register token: { "token": "ExponentPushToken[...]" }
DELETE /v1/contacts/{identifier}/push-tokens — Remove token: { "token": "..." }
Read-only endpoints for inspecting events, deliveries, and integrations. Available on the customer API with standard Bearer token auth.
GET /v1/events
Returns all notification events for the application.
Response:
json
{
"success": true,
"data": {
"events": [
{ "identifier": "user.welcome", "name": "User Welcome", "channels": ["email", "slack"] }
]
}
}
GET /v1/events/{identifier}
Returns detailed event configuration including templates and channel settings.
Response:
json
{
"success": true,
"data": {
"event": { "identifier": "user.welcome", "name": "User Welcome", "channels": [...], "templates": [...] }
}
}
GET /v1/deliveries
ParameterTypeRequiredDescriptionlimit``numberNoMax results (default 20)offset``numberNoPagination offsetevent``stringNoFilter by event namechannel``stringNoFilter by channelstatus``stringNoFilter by status: pending, sent, delivered, failed
Response:
json
{
"success": true,
"data": {
"deliveries": [...],
"total": 42,
"limit": 20,
"offset": 0
}
}
GET /v1/deliveries/{uuid}/trace
Returns full delivery trace with timeline and content snapshot.
Response:
json
{
"success": true,
"data": {
"delivery": { "uuid": "...", "channel": "email", "status": "sent", ... },
"timeline": [
{ "event": "queued", "timestamp": "2026-03-30T12:00:00Z" },
{ "event": "sent", "timestamp": "2026-03-30T12:00:01Z" }
]
}
}
GET /v1/integrations
ParameterTypeRequiredDescriptionchannel``stringNoFilter by channel
Returns channel integrations with secrets stripped.
Response:
json
{
"success": true,
"data": {
"integrations": [
{ "channel": "email", "provider": "ses", "status": "active" }
]
}
}
Register one webhook endpoint per application to receive delivery status events.
delivery.sent — Notification dispatched to providerdelivery.delivered — Provider confirmed delivery (email only via SES)delivery.failed — Delivery failed permanentlydelivery.bounced — Email bounceddelivery.complained — Recipient marked as spamPOST /v1/webhooks
json
{
"url": "https://yourapp.com/webhooks/sendivent",
"enabled_events": ["delivery.sent", "delivery.failed"],
"description": "Production webhook"
}
Response includes signing_secret for HMAC-SHA256 verification.
GET /v1/webhooks — Get webhook configPATCH /v1/webhooks/{uuid} — Update (url, enabled_events, is_active)DELETE /v1/webhooks/{uuid} — Remove webhookjson
{
"event": "delivery.sent",
"delivery": {
"uuid": "d4e5f6a7-...",
"channel": "email",
"status": "sent",
"event_name": "order.confirmed",
"message_id": "ses-message-id",
"sent_at": "2026-03-30T12:00:00Z",
"delivered_at": null,
"error": null
},
"request_id": "req-uuid",
"timestamp": "2026-03-30T12:00:00Z"
}
Sendivent supports 7 channels. Each requires a configured integration.
ChannelIdentifierProviderEmailemailAWS SES, SendGrid, BrevoSMSphone (E.164)AWS SNS, CellsyntSlackslack (user ID)Slack APIPushpush_tokenExpo, FCM, APNsTelegramtelegram (user ID)Telegram Bot APIWhatsAppphone (E.164)WhatsApp Business APIDiscorddiscord (user ID)Discord Bot API
Templates use Handlebars syntax. Available in all channel templates:
VariableDescription{{contact.name}}Contact display name{{contact.email}}Contact email{{contact.phone}}Contact phone{{contact.meta.fieldName}}Custom contact fields{{payload.key}}Event payload data{{app.name}}Application name{{sender.name}}Sender name{{sender.email}}Sender email
Fallback syntax: {{name | Guest}} — uses "Guest" if name is empty.
All errors return JSON:
json
{
"error": "Event 'order.shipped' not found",
"code": "EVENT_NOT_FOUND"
}
StatusCodeDescription400``VALIDATION_ERRORMissing or invalid parameters401``UNAUTHORIZEDInvalid or missing API key402``QUOTA_EXCEEDEDContact quota exceeded — upgrade plan403``FORBIDDENSubscription inactive or addon not enabled404``NOT_FOUNDEvent, contact, or resource not found409``CONFLICTWebhook endpoint already exists429``RATE_LIMITEDToo many requests — retry with backoff500``SERVER_ERRORInternal error502``PROVIDER_ERRORThird-party provider failed
CodeDescriptionMISSING_IDENTIFIERContact lacks required identifier for channelINTEGRATION_MISSINGChannel integration not configuredADDON_NOT_ENABLEDSMS/WhatsApp addon not on planUNVERIFIED_SENDERSender email/phone not verifiedINVALID_EMAILInvalid email formatINVALID_PHONEInvalid phone number (must be E.164)EVENT_NOT_FOUNDEvent name doesn't exist
EnvironmentRequests/SecondDaily QuotaProduction1001,000Sandbox10150