Changelog
A chronological record of platform updates, new features, and important changes to Sent's APIs and services.
2026
July 2026
Message Status Model — New Values
Three new MessageStatus values have been introduced to distinguish policy-driven suppression from delivery failures:
- Added:
FILTERED— message suppressed by a DENY routing rule before reaching a carrier. Policy-driven and expected. Does not count against your deliverability rate. Includes areasonfield (e.g.DENY_RULE_MATCHED). Webhook event:message.filtered. - Added:
BLOCKED— message gated before send evaluation due to an account-level condition (insufficient balance, suspended account, missing entitlement). Does not count against your deliverability rate. Includes areasonfield (e.g.INSUFFICIENT_BALANCE,ACCOUNT_SUSPENDED). Webhook event:message.blocked. - Added:
SCHEDULED— message queued for future delivery (curfew window or scheduled send). Not a terminal state — transitions toROUTEDonce the window opens. Webhook event:message.scheduled.
Migration note: Prior to this release, all non-delivered outcomes were surfaced as FAILED. If your integration filters on FAILED to catch all unsent messages, also handle FILTERED and BLOCKED to maintain full coverage. FILTERED and BLOCKED are excluded from the deliverability rate denominator — only FAILED counts against the rate.
| Old behavior | New behavior |
|---|---|
FAILED covered all non-delivered outcomes | FAILED = downstream delivery attempt that failed (carrier/network) |
| — | FILTERED = suppressed by DENY rule — policy-driven, not a failure |
| — | BLOCKED = gated by account condition before send |
| — | SCHEDULED = deferred to a future window (transient, not terminal) |
Message Scheduling & Quiet Hours
- Added: Messages destined for a mobile network with quiet-hours restrictions are now automatically deferred (status
SCHEDULED) instead of being sent or failed during the restricted window, and released once it ends. - Fixed: Quiet-hours windows that span midnight are now evaluated correctly.
Delivery Reliability
- Added: SMS messages that fail delivery on their original channel are now automatically retried on an alternate channel. This automatic fallback now also covers WhatsApp messages that can't be delivered.
- Fixed: A delivery receipt from a carrier could occasionally be matched to the wrong send attempt after a message was retried across channels, leaving its status stuck. Delivery status now updates correctly in this case.
- Fixed:
message.receivedwebhook events were not firing for some inbound WhatsApp and SMS auto-reply messages, and for messages sent to shared/ported numbers or redelivered inbound messages. These now fire correctly.
Compliance & Consent
- Added: WhatsApp contacts who send a keyword command (
STOP,START,HELP) now automatically receive a reply, and aSTOPreply updates the contact'sopt_outstatus as returned byGET /v3/contacts/{id}. - Updated: Stricter validation now applies to
AUTHENTICATION-category WhatsApp template bodies for the SMS channel, and for link/URL variables.
API Reliability & Security
- Fixed: Sending a free-form (non-template) message with
channelomitted (auto-detect) could bypass the conversation-window gate that normally restricts free-form SMS/RCS sends to an active conversation. Auto-detect sends are now gated the same as explicit-channel sends. - Fixed: Authentication-failure lockouts (
429) are now scoped to the specific API key rather than the caller's IP address, so a customer sharing an IP with another tenant is no longer at risk of being locked out by unrelated failed attempts. - Fixed:
DELETE /v3/templates/{id}could fail for templates with channel-status or WhatsApp update-history records; deletion now cleans these up first.
Dashboard
- Added: Sign in and sign up with Google, GitHub, or Facebook, in addition to email and password.
- Added: A new bulk-messaging tab in the Playground lets you upload a CSV of recipients and send to the whole list at once, with upfront validation of phone number formats.
- Added: Message activity now shows a segment count (e.g. "3 parts") for multi-part SMS messages.
June 2026
Webhooks & Conversations
- Added: New webhook events for the 10DLC brand resubmission flow:
customer.flow.tcr_resubmission_requestedandcustomer.flow.tcr_resubmission_completed. - Added: New webhook events for alphanumeric SMS sender provisioning:
customer.activity.alphanumeric_sender_provisionedandcustomer.activity.alphanumeric_sender_activated. - Added: New
GET /v3/conversationsandGET /v3/conversations/{id}endpoints to list a customer's messages grouped by conversation, with pagination.
WhatsApp Messaging
- Added:
POST /v3/messagesnow accepts a plain-texttextfield as an alternative totemplate, for free-form WhatsApp messages within the 24-hour customer-service window. Sending free-form text outside that window now returns a dedicatedWHATSAPP_TEMPLATE_REQUIREDerror. - Added: WhatsApp templates can now be approved and sent per channel independently — a template pending or rejected on one channel no longer blocks sending on a channel where it's approved. Sending on a channel where the template isn't active now returns a dedicated
BUSINESS_012error. - Fixed: Templates approved without a connected WhatsApp Business Account (for example, compliance-approved for SMS only) can now actually be sent, instead of being blocked for lacking a WhatsApp template ID.
Billing Accuracy
- Fixed: Multi-part SMS messages (over the 160-character GSM segment limit) are now billed per segment rather than as a single message.
- Fixed: WhatsApp messages billed directly by Meta to your WhatsApp Business Account are now only charged the difference against Sent's own price for that message, preventing double-charging.
- Updated: The recurring per-contact messaging charge now runs on a rolling 28-day cycle from the last charge, rather than resetting on the 1st of each calendar month.
- Fixed: Corrected per-network SMS cost resolution to always use the actual matching rate for a destination.
10DLC Compliance
- Added:
GETcampaign responses now include apricingobject (the resolved recurring campaign fee) and a flag indicating whether the one-time submission fee has been charged. - Updated: 10DLC campaign submission and recurring maintenance fees are now billed on each campaign's own activation anniversary, rather than a shared calendar cycle.
- Fixed: Campaign submission fees that were missed on a brand resubmission are now correctly backfilled and charged.
- Fixed: Campaign activation now reliably registers the connected phone number with the carrier, so an approved campaign is actually enabled for sending.
Reliability
- Fixed: WhatsApp Business Account health is now determined the same way across onboarding, Meta webhooks, and send-time checks, reducing inconsistent "WhatsApp degraded" errors.
- Fixed: SMS delivery status is no longer marked
DELIVEREDas soon as a carrier accepts a message for transit — it now stays in transit until an actual delivery or failure signal arrives. - Fixed: Contact opt-out (
STOP) handling is now unified onto a single consent record, so a contact's opt-out status is consistent regardless of which channel they opted out on.HELP/STOPcompliance auto-replies are no longer blocked by a contact's own opt-out status. - Fixed: A deny routing rule with no fallback configured is now a hard block, instead of occasionally falling through to another route and sending anyway.
Dashboard
- Added: Sub-account (sender profile) SMS configuration and pricing can now automatically inherit from the parent organization's defaults.
- Added: Self-service auto-recharge — enable auto-charge to automatically top up your balance from a saved card when it drops below a chosen threshold.
- Added: A restructured Brand Registration (10DLC) wizard for compliance onboarding.
- Added: Dedicated Sender Identity requests now support uploading required registration documents directly, with document-type status shown in the flow.
- Added: Campaign details now offer an AI-assisted quality check and rewrite of your campaign messaging.
May 2026
Pre-Send Consent Gate
- Added: New
ERR_CONSENT_BLOCKEDsend-time error code. Every outbound message now runs through a pre-routing consent check that refuses sends to recipients withopt_out = trueor whose phone is on the customer's phone-channel suppression list. Blocked messages are finalized asFAILEDbefore any provider call is made, so no carrier charge applies. Inspectdescriptionon the message detail or inGET /v3/messages/{id}/activitiesto see the reason. - Updated:
BUSINESS_004is now scoped to the all-recipients-opted-out case. When some recipients are still reachable, the API accepts the batch and only the blocked recipients fail asynchronously withERR_CONSENT_BLOCKED. See API Errors and the error catalog.
Inbound Message Webhooks
- Fixed:
message.receivedwebhook events now fire correctly for inbound messages across all channels. Previously, subscribing tomessage.receivedproduced no deliveries despite the event appearing in the subscription list — the webhook notification was only sent for outbound status changes. All inbound messages persisted since this release trigger amessage.receivedevent to your webhook endpoint. - Updated:
message.receivedpayloadchannelfield now reflects the actual inbound channel (smsorwhatsapp). WhatsApp replies fire the samemessage.receivedevent shape as SMS replies. - Fixed: Inbound WhatsApp replies now reliably resolve to the correct account when a number has been used across multiple WhatsApp Business Accounts.
Profile Completion API
- Updated:
POST /v3/profiles/{profileId}/completenow returns distinct typed responses:- 200 — Profile was already in a completed state. Response body:
{success: true, data: {status: "completed", message: "..."}}. - 202 — Completion accepted and running in the background. Response body:
{success: true, data: {message: "..."}}. The provided webhook URL is called when processing finishes. - Previously both paths returned an opaque
objecttype, which made it difficult to distinguish synchronous completion from asynchronous processing in generated SDK clients.
- 200 — Profile was already in a completed state. Response body:
API Schema
- Updated:
event_dataandmetadatafields on webhook event and message objects are now typed as open JSON objects in the OpenAPI spec. This resolves ambiguity in generated SDK clients where these fields previously appeared as untyped empty schemas. Runtime behaviour is unchanged.
Webhook Payload Standardization
- Updated: Standardized the message webhook payload shape. The event-type field is now named
event(wassub_type). Inbound message payloads:from/torenamed toinbound_number/outbound_number, theproviderfield was removed, andupdated_atwas added. Outbound message payloads gainedupdated_atandtemplate_namefields. - Updated:
message.sentnow reflects successful submission to the upstream provider; provider-side acknowledgement signals that previously could report asmessage.sentnow resolve tomessage.delivered, so you see one clear status after submission (a latermessage.failedcan still follow).message.readwebhooks now cover WhatsApp and RCS (previously WhatsApp only), and are never emitted for SMS.
WhatsApp Template Reliability
- Fixed: Several classes of WhatsApp template were silently stuck and never actually submitted to Meta for approval — default compliance auto-reply templates (
STOP/START/HELP), templates copied from the template library, and templates in a bulk submission with an empty name or unresolved language. These now submit correctly, and previously-stuck templates were backfilled. - Added: WhatsApp template URL buttons now support a dynamic variable in the button URL, for per-recipient personalization.
Compliance & Reliability
- Fixed: Inbound SMS opt-in (
START) keywords are now only honored when the receiving number is currently assigned to your account, preventing consent from being recorded incorrectly after a number is reassigned or released. - Fixed: A cross-provider configuration bug could let one SMS provider's delivery/webhook settings bleed into another's, affecting delivery status and webhook routing for some numbers. Resolved.
- Fixed: Messages that failed before a channel was selected now report the actual (or auto-routed) channel instead of the placeholder value
unknown.
April 2026
Opt-In / Opt-Out Keyword Management
- Added: Per-account keyword management for SMS opt-in and opt-out flows. You can now configure custom keywords (beyond the standard STOP/START/HELP) that trigger automatic replies and consent state changes. Contacts who send an opt-out keyword are automatically suppressed from future messages.
- Added: Inbound keyword matches now trigger configurable auto-replies, billed as standard outbound messages.
Inbound Message Processing
- Added: Inbound messages from contacts are now persisted and fully tracked across all supported channels. Each inbound message appears in your message history with
direction: "INBOUND"andstatus: "RECEIVED". - Added: Inbound messages generate a
message.receivedwebhook event. Subscribe to this event to receive real-time notifications when contacts reply to your messages. See webhook event types for payload details. - Added: The
fromfield is now captured on all message activities, so you can see the sender's phone number throughout the full message lifecycle.
Webhook Event Filtering
- Added: Granular webhook event filtering via the
event_filtersfield. When creating or updating a webhook, you can now specify which message sub-types to receive per event type (e.g. onlydeliveredandfailed) instead of subscribing to all status transitions. This reduces webhook volume for high-throughput integrations.
March 2026
Template Approval Enforcement
- Added: Messages using WhatsApp templates that have not been approved by Meta are now blocked before dispatch, with a clear error response. Previously, unapproved templates could reach the provider and produce a delayed failure. Approved templates continue to send without any change.
OTP Delivery via WhatsApp
- Added: OTP codes can now be delivered via WhatsApp. The platform waits for a delivery confirmation before reporting success, and automatically falls back to SMS if WhatsApp delivery is not confirmed within the timeout window. No API changes required — channel selection follows your normal routing configuration.
Account Suspension
- Added: Accounts flagged as suspended are blocked from sending messages and receive a clear
account_suspendederror response on all API calls. This applies to both the messaging API and webhook delivery.
Error Documentation Links
- Updated: All API error responses now include a
doc_urlfield pointing to the relevant documentation page for that specific error code. This makes it easier to diagnose and resolve integration issues without searching the docs manually.
Message Metadata
- Added: Messages now carry a
metadataobject that captures origin context (e.g. the API endpoint that created the message). This field is returned in message detail and activity responses as an open JSON object.
February 2026
Per-Customer Pricing
- Added: Two billing models are now supported — Active Contact (charged per unique contact reached in a billing period) and Per Message (charged per message sent). Your account's billing model is configured at account setup. Charges are deducted automatically after each successful send.
Number Provisioning
- Added: Phone numbers associated with your account are now visible via the API. Use
GET /v3/lookup/number/{phone}to retrieve carrier and capability information for any number.
Playground Message Endpoint
- Added: A dedicated endpoint for sending test messages during onboarding, without requiring a fully provisioned profile. Useful for verifying end-to-end message delivery before going live.
January 2026
Organizations & Sender Profiles (Multi-Tenancy)
- Added: Full multi-tenancy support via Organizations and Sender Profiles. An Organization is the top-level account; Sender Profiles are sub-accounts that can inherit or isolate contacts, templates, brands, and campaigns from the parent organization.
- Added: Profile CRUD — create, list, retrieve, update, and delete sender profiles via the API.
- Added:
POST /v3/profiles/{id}/complete— trigger the compliance setup workflow for a profile (TCR registration, WhatsApp connection). - Added: Contact and template inheritance — profiles can be configured to share contacts and templates with the parent organization (
inheritContacts,inheritTemplates), or to maintain their own isolated sets. - Added: Template sharing — templates created at the organization level can be shared with child profiles without duplication.
User Management
- Added: Full user management for your organization:
GET /v3/users/GET /v3/users/{id}— list and retrieve usersPOST /v3/users— invite a user by email with a specified rolePATCH /v3/users/{id}— update a user's roleDELETE /v3/users/{id}— remove a user from the organization
- Added: Role-based access —
OWNER,ADMIN, andMEMBERroles with appropriate permission scopes. Owners have implicit admin access across all endpoints. - Added: User invitation emails with organization and profile context included in the invitation link.
WhatsApp Template Synchronization
- Added: WhatsApp templates are now automatically synchronized from your connected WhatsApp Business Account. Template status updates (approved, rejected, paused) are reflected in real time via webhook-driven sync — no manual re-import needed.
- Added: Template soft-deletion — when a WhatsApp Business Account is disconnected or deleted, all associated templates are soft-deleted rather than permanently removed, preserving message history.
- Added: AUTHENTICATION template category support, including OTP and COPY_CODE button types for one-time password flows.
Error Codes
- Added: Comprehensive error code system for message sending failures. Each failure now includes a machine-readable
error_codefield in the message activity, making it straightforward to programmatically distinguish temporary failures (retry) from permanent ones (suppress).
API v3
Overview
Sent API v3 is the current major version, featuring a redesigned authentication system, consistent response formats, and expanded functionality for multi-channel messaging.
Key Changes from v2
| Feature | v2 | v3 |
|---|---|---|
| Authentication | x-sender-id + x-api-key headers | x-api-key header only |
| Response Format | FastEndpoints problem details | Consistent JSON envelope |
| Property Naming | Mixed case | snake_case |
| Sandbox Mode | Not available | sandbox field in body |
| Idempotency | Not available | Idempotency-Key header |
| Error Codes | Limited | Comprehensive error catalog |
| Profiles | Limited | Full CRUD operations |
| Brands/Campaigns | Not available | Full 10DLC support |
| Users | Not available | Organization management |
| Webhooks | v2 endpoints | Enhanced v3 webhooks |
2024
December 2024
API v3 General Availability
- Added: Sent API v3 is now the recommended version for all integrations
- Added: Comprehensive API documentation for v3 endpoints
- Added: New getting started guide for v3
November 2024
Webhook Enhancements
- Added:
GET /v3/webhooks/event-typesendpoint to list available event types - Added:
POST /v3/webhooks/{id}/testendpoint to test webhook delivery - Added:
POST /v3/webhooks/{id}/rotate-secretendpoint for security rotation - Added:
PATCH /v3/webhooks/{id}/toggle-statusendpoint to enable/disable webhooks
User Management
- Added:
GET /v3/usersandGET /v3/users/{id}for user listing and details - Added:
POST /v3/usersto invite users to your organization - Added:
PATCH /v3/users/{id}to update user roles - Added:
DELETE /v3/users/{id}to remove users
October 2024
10DLC Compliance (Brands & Campaigns)
- Added: Brand registration endpoints for 10DLC compliance
POST /v3/brands- Create brandGET /v3/brands- List brandsPUT /v3/brands/{id}- Update brandDELETE /v3/brands/{id}- Delete brand
- Added: Campaign management endpoints
POST /v3/brands/{id}/campaigns- Create campaignGET /v3/brands/{id}/campaigns- List campaignsPUT /v3/brands/{id}/campaigns/{id}- Update campaignDELETE /v3/brands/{id}/campaigns/{id}- Delete campaign
Profile Management
- Added: Full profile CRUD operations
POST /v3/profiles- Create profileGET /v3/profiles- List profilesGET /v3/profiles/{id}- Get profile detailsPATCH /v3/profiles/{id}- Update profileDELETE /v3/profiles/{id}- Delete profile
- Added:
POST /v3/profiles/{id}/completefor profile setup completion
September 2024
API v3 Beta Release
- Added: Core messaging endpoints
POST /v3/messages- Send messagesGET /v3/messages/{id}- Get message statusGET /v3/messages/{id}/activities- Get message activities
- Added: Contact management
GET /v3/contacts- List contactsPOST /v3/contacts- Create contactGET /v3/contacts/{id}- Get contactPATCH /v3/contacts/{id}- Update contactDELETE /v3/contacts/{id}- Delete contact
- Added: Template management
GET /v3/templates- List templatesPOST /v3/templates- Create templateGET /v3/templates/{id}- Get templatePUT /v3/templates/{id}- Update templateDELETE /v3/templates/{id}- Delete template
- Added: Webhook management
GET /v3/webhooks- List webhooksPOST /v3/webhooks- Create webhookGET /v3/webhooks/{id}- Get webhookPUT /v3/webhooks/{id}- Update webhookDELETE /v3/webhooks/{id}- Delete webhookGET /v3/webhooks/{id}/events- List webhook events
- Added: Number lookup
GET /v3/lookup/number/{phone}- Lookup phone number information
- Added: Account information
GET /v3/me- Get authenticated account details
New Features
- Added: Sandbox mode (
sandbox: true) for all mutation endpoints - Added: Idempotency key support via
Idempotency-Keyheader - Added: Consistent JSON response envelope (
success,data,error,meta) - Added: Standardized error codes with documentation URLs
- Added: snake_case property naming convention
- Added: Enhanced rate limiting with detailed headers
2023
Legacy API v2
The v2 API remains fully supported for existing integrations. All v2 endpoints continue to operate at /v2/ paths.
Key v2 endpoints:
POST /v2/messages/contact- Send message to contactPOST /v2/messages/phone- Send message to phone numberGET /v2/contacts- List contactsGET /v2/templates- List templates
See Legacy API Reference for complete v2 documentation.
Deprecation Notices
API v2
- Status: Legacy (still supported)
- Recommendation: New integrations should use v3
- End of Support: No end date announced
Subscribe to our API Status page for real-time updates on API changes and service status.
Feedback
Have suggestions for API improvements? Contact us at support@sent.dm.