Error Catalog
This catalog is the canonical reference for Sent API v3 error codes. Every documented code appears below with its cause and step-by-step remediation; other documentation pages link to this catalog rather than restating code details.
The same codes also explain outcomes that happen after a request succeeds. A message that ends FAILED, FILTERED or BLOCKED reports why as reason_code and reason, and so does a channel that is not ACTIVE. A cause the API rejects synchronously keeps its code there: an opted-out recipient is BUSINESS_004 on a refused request and on a filtered message alike. Codes only an outcome can have are listed under Message Outcome Codes and Channel Status Reasons. A phone call that ends without completing reports why as failure_reason; those values are under Call Failure Reasons. Branch on reason_code; the wording of reason may improve, but a code never changes meaning.
Authentication Errors
AUTH_001: User is not authenticated
Error Message: "User is not authenticated"
HTTP Status: 401 Unauthorized
Cause: The request reached an endpoint without an authenticated identity, for a reason other than the API key. A request with no API key, or an unrecognized one, returns AUTH_002 instead, whichever header it used. On v3 you see AUTH_001 when the voice token on an in-app calling request is invalid or expired, and as the fallback code for any other 401.
Remediation:
- If the message is
Invalid or expired voice token, mint a new voice token on your backend and retry. See In-app calls - If you expected your API key to authenticate the request, check
error.code: a key problem is reported asAUTH_002, so follow its remediation below
AUTH_002: Invalid or missing API key
Error Message: "Invalid or missing API key"
HTTP Status: 401 Unauthorized
Cause: The request carries no API key in either header, or the key it carries is invalid, revoked, or not recognized.
Remediation:
- Send the API key on every request, in the
x-api-keyheader or asAuthorization: Bearer <key>. Any otherAuthorizationscheme counts as no key - Verify your API key is correct and complete
- Check that you're using the API key for the correct environment (each environment should have its own key)
- Log into your Sent Dashboard and verify the key is active
- Generate a new API key if the current one was revoked
Example Fix:
# ❌ Missing key
curl -X GET https://api.sent.dm/v3/me
# ✅ Correct
curl -X GET https://api.sent.dm/v3/me \
-H "x-api-key: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
# ✅ Also correct
curl -X GET https://api.sent.dm/v3/me \
-H "Authorization: Bearer xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"AUTH_004: Insufficient permissions
Error Message: "Insufficient permissions for this operation"
HTTP Status: 403 Forbidden
Cause: Your user role doesn't have permission to perform this operation.
Remediation:
- Check your organization role (
owner,admin,developer,billing) - Contact your organization owner to request additional permissions
- Some operations require the
owneroradminrole
See: Roles and Permissions for the operations each role can perform and how to look up your own role
AUTH_005: Account not yet activated
Error Message: "Your account is not yet activated. Please wait for account activation before using the API."
HTTP Status: 403 Forbidden
Cause: The API key is valid and channel setup is complete, but the account is still pending final activation by Sent.
Remediation:
- You have completed all required setup steps, so no action is needed from your side
- Wait for the activation confirmation email from Sent
- Contact support@sent.dm if activation takes longer than expected
AUTH_006: KYC verification not complete
Error Message: "Your KYC verification is not complete. Please submit your KYC documents before using the API."
HTTP Status: 403 Forbidden
Cause: The API key is valid but the account has not completed KYC verification. Applies to accounts in status: SIGNED_UP, KYC_STARTED, WHITELISTED, ONBOARDING_STARTED, or KYC_RESUBMISSION_REQUESTED.
Remediation:
- Log into your Sent Dashboard and complete the KYC verification flow
- If resubmission was requested, address the flagged items and resubmit your documents
- Contact support@sent.dm if you need assistance with KYC
AUTH_007: Channel setup not complete
Error Message: "Your channel setup is not complete. Please configure at least one messaging channel before using the API."
HTTP Status: 403 Forbidden
Cause: The API key is valid and KYC is approved, but no messaging channel (SMS or WhatsApp) has been configured. Applies to accounts in status: KYC_COMPLETED or MESSAGE_COMPLIANCE_COMPLETED.
Remediation:
- Log into your Sent Dashboard and complete channel setup
- Configure at least one SMS or WhatsApp sender
- See Channel Setup for step-by-step instructions
Validation Errors
VALIDATION_001: Request validation failed
Error Message: "Request validation failed"
HTTP Status: 400 Bad Request. Also returned with:
413 Payload Too Largeand the message "Request body is too large" when the request body exceeds the endpoint's size limit.422 Unprocessable EntityfromPOST /v3/sender-profilesandPOST /v3/channels/smswhen a compliance document the market requires was not uploaded, or an uploaded file was rejected.detailsnames each affected document or file.
Cause: The request body or parameters failed validation. Check the details field for specific field-level errors.
Remediation:
- Review the
error.detailsobject for field-specific error messages - Ensure all required fields are provided
- Verify data types match the schema (for example, strings vs numbers)
Example:
{
"error": {
"code": "VALIDATION_001",
"message": "Request validation failed",
"details": {
"to": ["'to' must contain at least one recipient"],
"template": ["'template' must have either 'id' (non-empty GUID) or 'name' (non-empty string)"]
}
}
}VALIDATION_002: Invalid phone number format
Error Message: "Invalid phone number format"
HTTP Status: 400 Bad Request
Cause: The phone number is not in a valid format.
Remediation:
- Use E.164 format:
+1234567890 - Include the country code (for example,
+1for US) - Remove any non-numeric characters except the leading
+
Valid Examples:
+1234567890(US)+447911123456(UK)+919876543210(India)
VALIDATION_003: Invalid GUID format
Error Message: "Invalid GUID format"
HTTP Status: 400 Bad Request
Cause: A UUID field contains an invalid format.
Remediation:
- Ensure UUIDs follow the format:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - Verify the UUID is complete (36 characters including hyphens)
- Check that you're not passing an empty string or null
Valid Example: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
VALIDATION_004: Required field is missing
Error Message: "Required field is missing"
HTTP Status: 400 Bad Request
Cause: A required field is not present in the request body.
Remediation:
- Check the API documentation for required fields
- Ensure the field name is spelled correctly (snake_case)
- Verify the field is not null or undefined
VALIDATION_005: Field value out of valid range
Error Message: "Field value out of valid range"
HTTP Status: 400 Bad Request
Cause: A numeric field value is outside the allowed minimum/maximum range.
Remediation:
- Check the API documentation for valid ranges
- For
retry_count: must be between 1 and 5 - For
timeout_seconds: must be between 5 and 120 - Ensure integer values are not negative where prohibited
Example:
{
"error": {
"code": "VALIDATION_005",
"message": "Field value out of valid range",
"details": {
"retry_count": ["Value must be between 1 and 5"]
}
}
}VALIDATION_006: Invalid enum value
Error Message: "Invalid enum value"
HTTP Status: 400 Bad Request
Cause: A field value is not one of the allowed enum values.
Remediation:
- Check the API documentation for allowed values
- Verify the value matches exactly (case-sensitive)
- Common enums: channel (
sent,sms,whatsapp,rcs), template category (MARKETING,UTILITY,AUTHENTICATION)
An unrecognized channel is rejected rather than ignored, and the error message
lists the accepted values. sent is the auto-detect value; see
Channel routing.
VALIDATION_008: Invalid template variable value
Error Message: varies by cause (see below)
HTTP Status: 400 Bad Request. Also reported as the reason_code of a FAILED message, when variables are found missing or invalid after the send was accepted with 202.
Cause: A supplied template variable value is rejected before the message is accepted. Three distinct causes share this code, and the message tells you which one applies:
| Message | Cause |
|---|---|
Variable '{name}' does not match the required pattern. | The value fails the variable's configured validation pattern. |
Variable '{name}' is invalid: param text cannot have new-line/tab characters or more than 4 consecutive spaces. | The value contains a newline, carriage return, or tab, or more than four consecutive spaces. |
Template variables cannot be empty for WhatsApp: {names} | One or more variables were supplied with a blank value on a WhatsApp-only send. |
Remediation:
- Read the variable name from the error message. It names every offending variable, so you can fix them in one pass rather than one send at a time.
- For a pattern mismatch, check the variable's pattern on the template and confirm the value matches it.
- For invalid text, strip newlines, carriage returns, and tabs from the value, and collapse any run of more than four spaces. These are rejected because WhatsApp does not accept them in a parameter. The rule applies to template variables only: free-form
textkeeps its line breaks, tabs, and spacing on every channel. - For an empty value on WhatsApp, supply a non-empty value or omit the variable if the template does not require it. WhatsApp rejects a text parameter with no text, so the send can never succeed.
The empty-value rule applies only when the send is pinned to WhatsApp. On an
auto-detect send (channel omitted) the same value is accepted, because the
message can still route over another channel.
VALIDATION_011: Voice identity is invalid
Error Message: "Voice identity is invalid"
HTTP Status: 400 Bad Request
Cause: An app user's identity is empty, longer than 200 characters, or contains something other than letters, digits, - and _. It is checked on identity of POST /v3/channels/voice/tokens and on to.value of POST /v3/calls/{id}/participants when to.kind is user. The identity names the user in every call, so only characters that survive a URL and a token unchanged are accepted.
Remediation:
- Read
error.detailsfor the field at fault. - Use your own stable user id, such as
agent-42, with letters, digits, hyphens, and underscores only. - Keep it to 200 characters or fewer.
Resource Errors
RESOURCE_001: Contact not found
Error Message: "Contact not found"
HTTP Status: 404 Not Found
Cause: The specified contact ID doesn't exist or doesn't belong to your account.
Remediation:
- Verify the contact ID is correct
- List all contacts to find the correct ID:
GET /v3/contacts - Check that you're using the correct API key for the account that owns the contact
Debug Steps:
# List contacts to find valid IDs
curl -X GET https://api.sent.dm/v3/contacts \
-H "x-api-key: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"RESOURCE_002: Template not found
Error Message: "Template not found"
HTTP Status: 404 Not Found
Cause: The specified template ID doesn't exist.
Remediation:
- Verify the template ID is correct
- List all templates:
GET /v3/templates - Ensure the template hasn't been deleted
RESOURCE_003: Message not found
Error Message: "Message not found"
HTTP Status: 404 Not Found
Cause: The specified message ID doesn't exist.
Remediation:
- Verify the message ID is correct
- Note that message IDs are only available after sending
- Messages may be purged after retention period
- A message ID that belongs to another account also returns this error rather than
403, so the response does not reveal whether the ID exists
RESOURCE_004: Customer not found
Error Message: "Customer not found"
HTTP Status: 404 Not Found
Cause: The specified customer ID doesn't exist or is not accessible.
Remediation:
- Verify the customer ID is correct
- Check that your API key has access to this customer
- Contact support if the customer should exist
RESOURCE_005: Organization not found
Error Message: "Organization not found"
HTTP Status: 404 Not Found
Cause: The specified organization ID doesn't exist or you don't have access.
Remediation:
- Verify the organization ID is correct
- Ensure you're using an organization-level API key
- Check that your account is a member of the organization
RESOURCE_006: User not found
Error Message: "User not found"
HTTP Status: 404 Not Found
Cause: The specified user ID doesn't exist in your organization.
Remediation:
- Verify the user ID is correct
- List organization users to find valid IDs
- The user may have been removed from the organization
RESOURCE_007: Resource already exists
Error Message: "Resource already exists"
HTTP Status: 409 Conflict
Cause: Attempting to create a resource that already exists (for example, a duplicate contact).
Remediation:
- Check if the resource already exists using a list or get endpoint
- Update the existing resource instead of creating
- Use a unique identifier for your idempotency key
RESOURCE_008: Webhook not found
Error Message: "Webhook not found"
HTTP Status: 404 Not Found
Cause: The specified webhook ID doesn't exist.
Remediation:
- Verify the webhook ID is correct
- List all webhooks:
GET /v3/webhooks - Check if the webhook was deleted
RESOURCE_009: Brand not found
Error Message: "Brand not found for this profile"
HTTP Status: 404 Not Found
Cause: No 10DLC brand is registered for the profile, and none is inherited from its organization.
Remediation:
- Register the brand first; see the 10DLC Registration Guide
- Confirm you are targeting the right profile with
GET /v3/profiles
RESOURCE_010: Campaign not found
Error Message: "Campaign not found for this profile"
HTTP Status: 404 Not Found
Cause: The specified campaign ID doesn't belong to this profile's brand.
Remediation:
- List the profile's campaigns and reuse the returned
id - Verify the campaign belongs to the brand registered for this profile
RESOURCE_011: Batch not found
Error Message: "Batch not found"
HTTP Status: 404 Not Found
Cause: The specified batch SMS operation doesn't exist.
Remediation:
- Verify the batch ID is correct
- Check whether the batch has expired or was already processed
RESOURCE_012: Phone number not found
Error Message: "Phone number not found"
HTTP Status: 404 Not Found
Cause: The specified phone number isn't provisioned on your account.
Remediation:
- List your numbers to confirm the exact value
- Use E.164 format (for example,
+14155550123)
RESOURCE_013: Resource not found
Error Message: "Resource not found"
HTTP Status: 404 Not Found
Cause: Generic not-found fallback, returned when no more specific code applies.
Remediation:
- Verify the resource ID in the request path
- Check the endpoint path is correct for the resource type
RESOURCE_014: Profile not found
Error Message: "Profile not found"
HTTP Status: 404 Not Found
Cause: The specified profileId isn't a child profile of your organization. Passing your organization's own ID also fails.
Remediation:
- Use a profile ID returned by
GET /v3/profiles - Confirm the profile belongs to your organization
RESOURCE_015: Call not found
Error Message: "Call not found"
HTTP Status: 404 Not Found
Cause: No call with this id belongs to your account. A call that belongs to another account is reported as not found rather than forbidden, so an id never reveals whether it exists.
Remediation:
- Use the id from the
call.requestquestion, acall.*webhook, orGET /v3/calls. It has the formcall_followed by a GUID. - Send the request with the API key of the account the call belongs to.
RESOURCE_017: Participant not found
Error Message: "Participant not found"
HTTP Status: 404 Not Found
Cause: The participantId on PATCH or DELETE /v3/calls/{id}/participants/{participantId} is not a live participant of this call's conference room. A participant in another room or another account answers the same way, and so does one who has already left.
Remediation:
- List the room with
GET /v3/calls/{id}/participantsand use anidfrom that list. - Treat a
404on remove as done: the participant is no longer in the room.
Business Logic Errors
BUSINESS_002: Rate limit exceeded
Error Message: "Rate limit exceeded"
HTTP Status: 429 Too Many Requests
Cause: You've exceeded the allowed number of requests per minute.
Remediation:
- Check the
Retry-Afterheader for wait time - Implement exponential backoff in your code
- Consider using webhooks instead of polling
- Contact support if you need higher limits
See: Rate Limits Documentation
BUSINESS_003: Insufficient account balance
Error Message: "Insufficient balance"
HTTP Status: 402 Payment Required
Cause: Your account doesn't have enough credit to complete the operation.
Note: POST /v3/messages does not return this error. Sends are accepted with 202; when the balance is insufficient, each message is finalized asynchronously as BLOCKED with reason_code: "BUSINESS_003" and clears after a top-up. Legacy v2 send endpoints reject an out-of-balance request synchronously with this error.
Remediation:
- Check your current balance and add funds in Billing → Overview (the balance is not exposed through the API)
- Review pricing for the operation you're attempting
BUSINESS_004: Contact has opted out
Error Message: "Contact has opted out of messaging"
HTTP Status: 400 Bad Request
Cause: An operation targeted a contact that has opted out of messaging.
Note: POST /v3/messages does not return this error. Sends are accepted with 202 regardless of recipient opt-out state, and each consent-blocked message is finalized asynchronously as FILTERED with reason_code: "BUSINESS_004" (see ERR_CONSENT_BLOCKED below).
Remediation:
- Inspect the affected contacts via
GET /v3/contacts/{id}and confirm theiropt_outstatus. - Remove opted-out contacts from your messaging lists.
- Re-engagement requires the contact to opt back in through a STOP/START style flow or via an
opt_out: falseupdate to the contact (where you have a verifiable record of new consent).
ERR_CONSENT_BLOCKED: Per-message consent block
Where it surfaces:
GET /v3/messages/{id}:status = FILTERED, withreason_code: "BUSINESS_004"GET /v3/messages/{id}/activities: aFILTEREDactivity carrying the samereason_codeandreason- The
message.filteredwebhook event, withpayload.reason_code: "BUSINESS_004"
ERR_CONSENT_BLOCKED itself is the internal classification and never appears in a response or payload. What you see is BUSINESS_004, the same code an opted-out contact returns elsewhere in the API. A FILTERED message whose reason_code is DELIVERY_004 was stopped by a routing rule rather than by consent.
Cause: The send-time consent policy refused this individual message because the recipient's contact has opt_out = true or their phone is on the customer's phone-channel suppression list. The check runs pre-routing, so no provider call is made and the customer is not charged.
Remediation:
- Stop targeting this contact until they re-confirm consent.
- If the opt-out is incorrect (for example, test data), update the contact's
opt_outfield throughPATCH /v3/contacts/{id}. Only do this when you have a verifiable record of renewed consent. - For phone-level suppression entries that should be removed, contact support.
BUSINESS_005: Template not approved
Error Message: "Template not approved for sending"
HTTP Status: 400 Bad Request
Cause: The WhatsApp template hasn't been approved yet.
Remediation:
- Check template status:
GET /v3/templates/{id} - Wait for WhatsApp/Meta approval (typically 24-48 hours)
- For urgent needs, use SMS channel instead
- Review template guidelines to ensure approval
BUSINESS_006: Message cannot be resent or cancelled in its current state
Error Messages:
| Message | Cause |
|---|---|
Message was filtered because the recipient opted out or a routing rule refused it, and cannot be resent. | POST /v3/messages/{id}/resend targeted a FILTERED message. |
Message is not resendable in its current state: it is still in flight, held for quiet hours, or was sent less than 15 minutes ago. | POST /v3/messages/{id}/resend targeted a message in a state it doesn't accept yet. |
Only a scheduled message can be cancelled. This message has already been released for sending, is in flight, or has finished. | POST /v3/messages/{id}/cancel targeted a message that is not SCHEDULED. |
HTTP Status: 409 Conflict
Cause: A resend or cancel targeted a message whose current state doesn't allow it.
Remediation:
- For a
FILTEREDmessage, don't retry the resend; aFILTEREDmessage is always refused. Check itsreason_codewithGET /v3/messages/{id}to see why it was filtered. - For a message still in flight, held for quiet hours, or sent less than 15 minutes ago, wait and retry the resend later.
- On cancel, only a message that is currently
SCHEDULEDcan be cancelled. Read the current status withGET /v3/messages/{id}: a message that has leftSCHEDULEDnever returns to it, so retrying returns the same error. See Cancelling scheduled messages. - Send a new message with
POST /v3/messagesif you need to make changes.
BUSINESS_007: Channel not available
Error Message: "Sending from {COUNTRY} as {type} is not available yet. Contact support if you expected it to be."
HTTP Status: 503 Service Unavailable, from GET /v3/compliance/requirements. Also reported as the reason_code of a FAILED message.
Cause:
- On
GET /v3/compliance/requirements: the requested country and number type market is not available yet. - On a message: the send needed MMS, and MMS is not enabled for the account.
Remediation:
- For the compliance requirements request, contact support if you expected the market to be available.
- For a message, contact support@sent.dm to enable MMS on the account. See Sending MMS.
BUSINESS_008: Operation would exceed quota
Error Message: "Operation would exceed quota"
HTTP Status: 400 Bad Request
Cause: The operation would exceed your account's quota limits, such as those for messages, contacts, or templates.
Remediation:
- Check your current usage in the Dashboard
- Upgrade your plan to increase quotas
- Delete unused resources to free up quota
- Contact support for temporary quota increases
BUSINESS_009: Feature not supported
Error Message: "Compliance requirements for the {channel} channel are not published yet. Only "sms" is available here."
HTTP Status: 501 Not Implemented, from GET /v3/compliance/requirements. Also reported as the reason_code of a FAILED message.
Cause:
- On
GET /v3/compliance/requirements:channelwas set to a channel other thansms. Only SMS has published compliance requirements. - On a message: the channel does not support this kind of message; the message type or operation is not available for this sender or destination.
Remediation:
- For the compliance requirements request, omit
channelor set it tosms. - For a message, read its
reasonfor the likely cause, and send the content on a channel or sender that supports it.
BUSINESS_010: Webhook is inactive
Error Message: "Webhook is inactive"
HTTP Status: 400 Bad Request
Cause: The operation targets a webhook that is not active. Sending a test event to an inactive webhook returns this code. A webhook can be inactive because you turned it off, or because Sent turned it off automatically after repeated delivery failures.
Remediation:
- Check the webhook's status on the Webhooks page in the Dashboard.
- If Sent turned it off automatically, fix the endpoint first: confirm it is reachable and returns a 2xx within the timeout. Then turn the webhook back on. Turning it back on without fixing the endpoint will lead to Sent turning it off again.
- Re-send the test event once the webhook is active.
BUSINESS_011: Destination country is not allowed
Error Message: "Calls and messages to the destination country are not allowed"
HTTP Status: 400 Bad Request, from POST /v3/calls/{id}/participants. Also reported as the reason_code of a FAILED message.
Cause:
- On a call, the phone participant's number is in a country Sent does not allow calls to. A
connectToNumberanswer to such a destination is an invalid answer, reported asdestination_blockedby the test endpoint, and the call fails withinvalid_answer. A call placed from your app straight to such a number is refused before your callback is asked and fails withdestination_blocked. - On a message, WhatsApp refused it because the WhatsApp business account is restricted from messaging recipients in the destination country.
Remediation:
- Check the destination number and its country code.
- For a message, check the business account's restrictions in WhatsApp Business Manager.
- Contact support@sent.dm if you expected the destination country to be allowed.
BUSINESS_012: Template is not active on the requested channel
Error Message: "This template is not active on the requested channel"
HTTP Status: 400 Bad Request
Cause: The template exists and is approved, but not on the channel this send is pinned to. Template approval is per channel, so a template approved for SMS is not automatically usable on WhatsApp.
Remediation:
- Check the template's per-channel status with
GET /v3/templates/{id}. - Send on a channel where the template is active, or omit
channelto let Sent choose one that is. - If you need the template on that channel, submit it for approval there and wait for it to be approved.
This is distinct from BUSINESS_005, which means the template is not approved anywhere. BUSINESS_012 means it is approved, but not on the channel you asked for.
WHATSAPP_TEMPLATE_REQUIRED: Free-form WhatsApp outside Meta's window
Error Message: "Free-form WhatsApp messages are only allowed within 24 hours of the user's latest inbound WhatsApp message. Send an approved template instead."
HTTP Status: Not returned on an HTTP response. POST /v3/messages accepts the batch with 202, and this code arrives as the terminal FAILED status on the individual message.
Cause: A free-form message (text rather than template) was sent with channel: "whatsapp" while Meta's 24-hour customer-service window was shut. Only an inbound WhatsApp message from the contact opens that window; an outbound template does not.
Meta can also reject a send that Sent considered inside the window, returning error 131047 (re-engagement required). Sent surfaces that as this same code, so treat it as one condition with one fix.
Where it surfaces: the message's terminal status. GET /v3/messages/{id} reports status: "FAILED" with reason_code: "WHATSAPP_TEMPLATE_REQUIRED", and the message.failed webhook carries the same payload.reason_code and payload.reason.
Remediation:
- Send an approved WhatsApp template instead. A template is always accepted, window or no window.
- Omit
channelto let Sent choose. An auto-detect send falls back to RCS or SMS when Meta's window is shut, so the message still goes out if the contact is reachable there. - Wait for the contact to message you on WhatsApp, which re-opens the window for 24 hours.
This is Meta's rule and applies to sends pinned to channel: "whatsapp" only. The
counterpart for SMS, RCS, and auto-detect is
CONVERSATION_TEMPLATE_REQUIRED,
which is Sent's own rule and records BLOCKED rather than FAILED.
CONVERSATION_TEMPLATE_REQUIRED: No open conversation
Error Messages:
| Message | Cause |
|---|---|
No open conversation with this contact. Send an approved template to start one before sending free-form content. | The contact has never replied and no template was ever sent. |
This contact has never replied, and the template that opened the conversation is more than 7 days old, so it has lapsed. Send an approved template to start a new one before sending free-form content. | A template opened the conversation, the contact never replied, and the template is more than 7 days old. |
HTTP Status: Not returned on an HTTP response. POST /v3/messages accepts the batch with 202, and this code arrives as the terminal BLOCKED status on the individual message. The gate runs before routing, so nothing reaches a carrier and the message is excluded from your deliverability rate; it fires message.blocked, not message.failed.
Cause: A free-form message (text rather than template) was sent on SMS, RCS, or with channel omitted to a contact who has never replied, and either no approved template was ever sent to them or the last one is more than 7 days old. A contact who has replied at any point in the past is never blocked by this gate. Your own free-form messages do not count as templates, and neither leg of a STOP exchange counts as a reply.
Where it surfaces: the message's terminal status. GET /v3/messages/{id} reports status: "BLOCKED" with reason_code: "CONVERSATION_TEMPLATE_REQUIRED", and the message.blocked webhook carries the same payload.reason_code and payload.reason.
Remediation:
- Send an approved template to open or re-open the conversation. Free-form text is then accepted for 7 days, and indefinitely once the contact replies.
- Do not retry the same free-form send. It will keep being blocked until a template or a reply from the contact opens the conversation.
- This only affects contacts who have never replied, so it is most common on cold outreach; see Conversation Windows.
BUSINESS_014: Account is suspended
Error Message: "This account is suspended"
HTTP Status: 403 Forbidden
Cause: The account is suspended and cannot send messages or create templates.
Remediation:
- Contact support. A suspension is not something you can clear through the API.
- Do not retry the request. Every send will return this code until the suspension is lifted, so a retry loop will not recover.
BUSINESS_015: Market not supported
Error Message: "This country and number type combination is not available"
HTTP Status: 422 Unprocessable Entity, from POST /v3/sender-profiles. Also reported as the reason_code of a FAILED message.
Cause:
- On
POST /v3/sender-profiles: thechannels.smsblock asks for a number type that is not available in the requested country.detailsnames the market. Nothing is created. - On a message: messaging to the destination country or region is not supported for this sender.
Remediation:
- Choose a different country or number type, or contact support to request the market.
BUSINESS_016: Sender type not supported
Error Message: "This number type cannot be provisioned yet"
HTTP Status: 422 Unprocessable Entity
Cause: POST /v3/sender-profiles asked for a channels.sms.number_type that can't be provisioned in any country. details lists the number types that can. Nothing is created.
Remediation:
- Ask for one of the number types listed in
details. - Omit the
channels.smsblock to create a profile that sends through the shared routes for its country.
BUSINESS_017: WhatsApp business account unavailable
HTTP Status: Not returned on an HTTP response. Reported as the reason_code of a FAILED message.
Cause: The WhatsApp business account cannot send at the moment: WhatsApp has restricted or locked it (for example, over a policy violation), its payment method has a problem, or it is in maintenance.
Remediation:
- Check the account's status and payment method in WhatsApp Business Manager.
- Omit
channelso auto-detect can send over another channel while WhatsApp is unavailable.
BUSINESS_018: WhatsApp marketing messages disabled
HTTP Status: Not returned on an HTTP response. Reported as the reason_code of a FAILED message.
Cause: Marketing sends are switched off for this WhatsApp business account.
Remediation:
- Enable marketing messages for the account in WhatsApp Business Manager.
- Until then, send
UTILITYorAUTHENTICATIONtemplates, or send marketing over another channel.
BUSINESS_019: Sender not configured for the channel
HTTP Status: Not returned on an HTTP response. Reported as the reason_code of a FAILED message.
Cause: The sender is not set up to send on the channel the message was routed to: the number or sender ID is invalid, not enabled for messaging or temporarily unusable; its 10DLC, toll-free or sender ID registration is missing or incomplete; or, on WhatsApp, the business number is not registered or has no approved display name.
Remediation:
- Check the channel with
GET /v3/channels. A market that is notACTIVEcarries areason_codesaying what it's waiting on (see Channel Status Reasons). - Contact support@sent.dm with the message ID if the channel reports
ACTIVE.
BUSINESS_020: Onboarding message limit reached
HTTP Status: Not returned on an HTTP response. Reported as the reason_code of a BLOCKED message.
Cause: The account has sent as many messages as its current onboarding stage allows. It has finished KYC or channel setup, but not the step after, which lifts the limit.
Remediation:
- Complete the next onboarding step in the Sent Dashboard.
- Check the blocked messages with
GET /v3/messages/{id}once the limit is lifted, and resend any that are stillBLOCKED.
BUSINESS_022: Phone number is not owned by this account
Error Message: "Phone number is not owned by this account"
HTTP Status: 400 Bad Request
Cause: POST /v3/channels/voice named a number you do not hold, or POST /v3/calls/{id}/participants named a caller_id that is not one of your numbers. A connectToNumber answer whose callerId you do not own is an invalid answer instead, reported as caller_id_not_owned by the test endpoint, and the call fails with invalid_answer.
Remediation:
- List the numbers you hold with
GET /v3/channels. - To take calls on a new number instead, leave
numberout ofPOST /v3/channels/voice, optionally with anarea_code. - For a participant or a
callerId, use one of your own numbers, or omit the field and the call's owning number is used.
BUSINESS_023: Phone calls are not enabled for this account
Error Message: "Phone calls are not enabled for this account"
HTTP Status: 403 Forbidden
Cause: POST /v3/channels/voice/tokens or POST /v3/channels/voice/{number}/test was called while the account has no active voice number.
Remediation:
- Turn calls on for a number with
POST /v3/channels/voice. See Voice.
BUSINESS_024: Phone number is not voice-enabled for this account
Error Message: "Phone number is not voice-enabled for this account"
HTTP Status: 400 Bad Request
Cause: The number is not one of your active voice numbers. POST /v3/channels/voice/tokens (for number) and POST /v3/channels/voice/{number}/test return it for a number that never had calls turned on and for one that was turned off. POST /v3/channels/voice/{number}/rotate-secret returns it for a number that never had calls turned on.
Remediation:
- List your voice numbers with
GET /v3/channels/voice. - Turn calls on for the number with
POST /v3/channels/voice, or use a number from the list.
BUSINESS_025: The participant could not be added to the call
Error Message: "The participant could not be added to the call"
HTTP Status: 400 Bad Request
Cause: POST /v3/calls/{id}/participants passed every check on Sent's side, but the request to dial the participant into the room was refused when it was placed. A participant who is busy or does not answer is not this error: by then the request was accepted with 202, and that outcome arrives later as the participant leg's call.failed.
Remediation:
- Check the destination number or identity, and that an app user is registered.
- Retry. Contact support@sent.dm with the request ID if it repeats.
BUSINESS_026: Call recording is not available
Error Message: "Call recording is not available"
HTTP Status: 403 Forbidden
Cause: POST /v3/calls/{id}/recordings was called, to start or to stop, while call recording is not available. An answer that asks for a recording still connects the call, without the recording.
Remediation:
- Contact support@sent.dm if you need call recording.
- Until it is available, do not rely on
record: trueorstartRecordingin your answers.
BUSINESS_027: The number could not be set up to receive calls
Error Message: "The number could not be set up to receive calls; try again shortly"
HTTP Status: 502 Bad Gateway
Cause: POST /v3/channels/voice could not attach the number to Sent's voice service, which is what routes a call on it to your callback. Nothing was written, so the number is not half on.
Remediation:
- Repeat the request. Your request was right, and a retry usually succeeds.
- Contact support@sent.dm with the request ID if it keeps failing.
BUSINESS_028: No phone number is available for the requested area
Error Message: "No phone number is available for the requested area; try another area code"
HTTP Status: 409 Conflict
Cause: POST /v3/channels/voice without number asked for a new number, and none could be had for the country and area_code. Nothing was bought and nothing was charged.
Remediation:
- Try another
area_code. - Omit
area_codeto take a number from anywhere in the country.
BUSINESS_029: Requested sender is not available on this account
Error Message: "One of the numbers in the channels 'from' list is not a valid sender for that channel"
HTTP Status: Not returned on an HTTP response. Reported as the reason_code of a BLOCKED message.
Cause: A POST /v3/messages request listed a number in a channels.sms entry's from that is not an active SMS number on your account. The number may have been released, may belong to another account, or may never have existed; the reason does not say which. The message's reason names the number by its position, for example channels.sms[0].from[1] is not a valid sms sender. The whole message is blocked, nothing is sent from the other listed numbers, and nothing is charged.
Remediation:
- Check the number at that position against your active SMS numbers in
GET /v3/channels/sms. - Remove or replace it, and send the message again.
BUSINESS_030: Template is protected and cannot be deleted
Error Message: "Auto-reply (OPT_OUT) templates are required for TCPA compliance and cannot be deleted" or "This template is read-only. It becomes editable after WhatsApp approval"
HTTP Status: 400 Bad Request
Cause: The template is one of the account's OPT_IN, OPT_OUT, or HELP auto-reply templates, which answer the consent keywords TCPA requires and which every account must keep, or it is a LOB template that stays read-only until WhatsApp approves it. The request was well-formed and the template exists. The MCP templates.delete tool returns the same code, and templates.list reports canDelete: false on every template this applies to.
Remediation:
- Leave the primary OPT_IN, OPT_OUT, and HELP templates in place. Edit their text instead of deleting them.
- For a LOB template, wait for WhatsApp approval, then edit or delete it.
LIMIT_001: Scheduled message limit exceeded
Error Message: "Scheduled message limit exceeded"
HTTP Status: 429 Too Many Requests
Cause: Accepting the request would push the account's outstanding scheduled messages past the 1,000,000-message cap. This limit applies to messages currently in SCHEDULED status across all senders and recipients on the account.
Remediation:
- Wait for existing scheduled messages to be released and sent, which reduces the outstanding count.
- Cancel scheduled messages you no longer need. A cancelled message stops counting toward the limit.
- Schedule fewer messages at once, or stagger scheduling over time.
- Contact support if you need a higher limit for your use case.
Conflict Errors
CONFLICT_001: Concurrent idempotent request
Error Message: "A request with this Idempotency-Key is currently being processed. Please retry shortly."
HTTP Status: 409 Conflict
Cause: Another request with the same idempotency key is currently being processed.
Remediation:
- Wait for the original request to complete
- Use a unique idempotency key for each distinct operation
- Don't reuse idempotency keys across different operations
CONFLICT_005: Idempotency key reused for a different request
Error Message: "This Idempotency-Key was already used for a different request. Send a new key for a new operation, or repeat the original request unchanged to receive its response."
HTTP Status: 422 Unprocessable Entity
Cause: The Idempotency-Key was already used within the last 24 hours by a request with a different method, path, query string, or body. The stored response belongs to that first request, so the API neither replays it nor executes this one.
Remediation:
- Send a new idempotency key for a new operation.
- To get the original response, repeat the original request unchanged, byte for byte.
See: Idempotency
CONFLICT_006: Template is in review
Error Message: "This template is in review; its definition, category and language are frozen until the review completes"
HTTP Status: 409 Conflict
Cause: A PUT /v3/templates/{id} tried to change the template's definition, category, or language, or to resubmit it with submit_for_review, while it was still with a reviewer. A template counts as in review when its own status is PENDING, and also when its status is something else but any one of its channels is still awaiting a verdict, which is why an APPROVED template can return this. The freeze is checked before anything is written, so a refused request leaves the template exactly as the reviewer sees it.
Remediation:
- Wait for the review to finish. Subscribe to
templateswebhook events to learn the outcome per channel rather than polling. - Send only
nameif you need a change now. The display name is editable throughout, including during review. - Resubmit after the verdict lands. A
REJECTEDtemplate is editable again, and anAPPROVEDone accepts a live edit.
CONFLICT_007: Default line for app calls is in use
Error Message: "This number is the default line for app calls and other voice numbers are active; move the default to another number first"
HTTP Status: 409 Conflict
Cause: PATCH /v3/channels/voice/{number} sent status: "INACTIVE" for the number calls placed from your app go out from, while other voice numbers are active. An account with active voice numbers always has exactly one default, so the default moves by being given to another number, never by being removed.
Remediation:
PATCHanother active voice number withdefault_for_app_calls: true.- Turn this number off. Turning off your last voice number is allowed; that turns phone calls off.
CONFLICT_008: Call is no longer active
Error Message: "Call is no longer active"
HTTP Status: 409 Conflict
Cause: A hangup, recording or participant command reached a call that has ended, or that ended between your read and the command.
Remediation:
- Read
GET /v3/calls/{id}for the final status. Nothing can change a call once it has ended. - Rely on
call.completedandcall.failedto learn when a call ends, rather than polling.
CONFLICT_009: Call is not in a conference
Error Message: "Call is not in a conference"
HTTP Status: 409 Conflict
Cause: A participant command reached a call your answer connected to a user or a number rather than to a conference room. It can also arrive for a moment right after a connectToConference answer, because the room is recorded on the call as Sent reads the answer.
Remediation:
- Answer the
call.requestwithconnectToConferencefor calls you want to add participants to. - Retry a
409that arrives within a second or two of answering; the example app retries for a few seconds.
CONFLICT_011: Call has no phone leg
Error Message: "Call has no phone leg"
HTTP Status: 409 Conflict
Cause: POST /v3/calls/{id}/hangup or POST /v3/calls/{id}/recordings reached a call with no leg on the phone network, such as a call between two of your app users. Such a call can be changed only by the apps in it, so the command is refused up front rather than reported as an ended call.
Remediation:
- End the call from the app with
hangup()in@sentdm/voice. - Do not ask for a recording of a call between two app users; it cannot be recorded.
- A call with a phone caller, or one connected to a phone number, accepts both commands.
Service Errors
SERVICE_001: Cache service temporarily unavailable
Error Message: "Cache service temporarily unavailable. Please retry your request."
HTTP Status: 503 Service Unavailable
Cause: The cache backing idempotency processing is unavailable, so the API cannot guarantee your request is not a duplicate. Returned on requests that carry an Idempotency-Key header while the cache is down.
Remediation:
- Retry the request after a short delay, reusing the same
Idempotency-Key - Check API Status for known issues
Internal Errors
INTERNAL_001: Unexpected internal server error
Error Message: "Unexpected internal server error"
HTTP Status: 500 Internal Server Error
Cause: An unexpected error occurred on the server.
Remediation:
- Retry the request after a short delay
- If the error persists, contact support with:
- The
request_idfrom the response - Timestamp of the error
- The operation you were attempting
- The
INTERNAL_002: Database operation failed
Error Message: "Database operation failed"
HTTP Status: 500 Internal Server Error
Cause: An unexpected database error occurred while processing your request.
Remediation:
- Retry the request after a short delay
- If the error persists, contact support with the request ID
- This is typically a transient issue
INTERNAL_003: External service error
Error Message: "An upstream service error occurred"
HTTP Status: 500 Internal Server Error. POST /v3/sender-profiles returns it with 502 Bad Gateway and the message "Could not verify this WhatsApp account with Meta" when the WhatsApp account in channels.whatsapp can't be verified because Meta couldn't be reached. Nothing is created.
Cause: An upstream service Sent depends on returned an error or couldn't be reached.
Remediation:
- Wait a few moments and retry
- Check API Status for known issues
INTERNAL_004: Timeout waiting for operation
Error Message: "Timeout waiting for operation"
HTTP Status: 504 Gateway Timeout
Cause: The operation timed out while waiting for an external service or internal processing.
Remediation:
- The operation may still be in progress - check the resource status
- Retry the request with the same idempotency key
- Contact support if timeouts persist
INTERNAL_005: Service temporarily unavailable
Error Message: "Service temporarily unavailable"
HTTP Status: 503 Service Unavailable
Cause: The API is temporarily unavailable due to maintenance or high load.
Remediation:
- Retry with exponential backoff
- Check API Status
- Wait for service restoration
Message Outcome Codes
These codes are never returned on an HTTP response. POST /v3/messages accepts the send with 202, and when the message ends FAILED, FILTERED or BLOCKED the code arrives as reason_code on GET /v3/messages/{id} (top level and on the event), on GET /v3/messages/{id}/activities, and on the message.failed, message.filtered and message.blocked webhooks. A cause with a code elsewhere in this catalog reuses it, so these cover only what a message outcome alone can have. Several carrier conditions fold into one code, so read reason for the likely causes.
| Code | Meaning | What to do |
|---|---|---|
DELIVERY_001 | The send never reached the carrier: a routing or processing error, content the network couldn't accept, or no reported cause | Check the content and media, then resend. Contact support with the message ID if it repeats |
DELIVERY_002 | The carrier accepted the message and later reported it undelivered, with no specific reason | Resend later; treat repeated failures to one number as a bad number |
DELIVERY_003 | The account has no sender set up for this destination on this channel | Add the market with POST /v3/channels/sms, or send on another channel |
DELIVERY_004 | Sending to this destination isn't allowed right now: it's blocked for the account, its sender is still being set up, or the recipient recently couldn't be reached on this channel | Check the market's status with GET /v3/channels; wait for it to reach ACTIVE |
DELIVERY_005 | No route is available: the destination network or region isn't provisioned for this sender | Send on another channel, or contact support to add coverage |
DELIVERY_006 | The channel's content policy blocked the text, links or media | Revise the content and resend |
DELIVERY_007 | The recipient isn't on this channel: no WhatsApp account, or no RCS-capable handset | Omit channel so auto-detect can pick one the recipient has |
DELIVERY_008 | WhatsApp held back a marketing message: the recipient has received too many recently, or is in a marketing experiment | Send later or over another channel; don't retry immediately |
DELIVERY_009 | The channel rejected the credentials the message was sent with | Reconnect the WhatsApp or RCS account, or contact support |
DELIVERY_010 | The message couldn't be delivered: the line or handset can't receive it, the carrier discarded it, or every available channel failed | Treat as permanent for this recipient and channel |
DELIVERY_011 | The carrier rejected the message: the line is barred, the recipient hasn't opted in to this sender, or the network refused it | Confirm consent; don't retry on the same sender |
DELIVERY_012 | Carrier screening blocked it as spam, a blocked keyword or content, or a block-listed number | Revise the content; check the sender's registration covers this use |
DELIVERY_013 | The recipient couldn't be reached: phone off, out of coverage, busy, or storage full | Resend later |
DELIVERY_014 | The message expired before it could be delivered | Resend if still relevant |
DELIVERY_015 | The carrier reported a temporary error, such as congestion | Resend later; a later send may succeed |
DELIVERY_016 | The channel couldn't use the media: unsupported type, file too large, or a link it couldn't fetch | Check the MMS media rules and that the URL is public |
Channel Status Reasons
These codes are never returned on an HTTP response. Every SMS market, WhatsApp account and RCS agent that isn't ACTIVE reports one as reason_code, with a sentence as reason. They appear on GET /v3/channels, the single-market reads, and Sender Profiles, and for SMS markets on the channel.* webhooks too. WhatsApp and RCS don't publish channel.* webhooks yet. The code is decided by the same logic as the status, so the two never disagree. On reads, an ACTIVE channel carries neither field. A channel.* webhook for an ACTIVE market omits reason_code but can still carry reason when the event brought its own explanation, such as a correction requested against a sender that still works.
| Status | Code | Meaning | What to do |
|---|---|---|---|
ACTION_NEEDED | CHANNEL_001 | Information or documents the channel requires are missing, or were rejected. On an SMS market, reason names what | Send them with PATCH /v3/channels/sms/{country}/{type}; see Managing channels |
ACTION_NEEDED | CHANNEL_002 | The registration came back from review and must be corrected | Correct what Sent emailed about and resubmit |
ACTION_NEEDED | CHANNEL_003 | The registration was rejected (RCS verification or launch) | Correct the submission and resubmit, or contact support |
ACTION_NEEDED | CHANNEL_004 | The channel was suspended and can't send | Contact support |
ACTION_NEEDED | CHANNEL_005 | Setting the channel up failed | Contact support to retry |
ACTION_NEEDED | CHANNEL_006 | No WhatsApp Business Account is connected | Connect one in the Sent Dashboard |
ACTION_NEEDED | CHANNEL_007 | The WhatsApp Business Account has no phone number registered | Register a number on the account |
INACTIVE | CHANNEL_008 | The channel had a working sender and lost it: the number was released or its campaign lapsed | Contact support to restore it; sends fail until then |
PENDING_REVIEW | CHANNEL_009 | The registration is with the registry or the carriers | Wait; nothing on your side speeds it up |
PROVISIONING | CHANNEL_010 | The registration was approved and a number is being acquired | Wait for channel.activated |
PROVISIONING | CHANNEL_011 | The channel is being set up | Wait for channel.activated |
Call Failure Reasons
These values are never returned on an HTTP response. A phone call that ends without completing reports why as failure_reason on GET /v3/calls/{id} and GET /v3/calls, and as reason on the call.failed webhook. The field is null on the read and omitted on the webhook when no reason was recorded, and always on a call that completed. The values are Sent's classification, never a carrier's own code.
| Reason | Meaning | What to do |
|---|---|---|
callback_timeout | The last attempt to reach your callback with the call.request question failed in a way other than a 4xx: it timed out, could not connect, was answered with a 3xx or a 5xx, returned a body over 64 KiB, or the callback URL is one Sent will not call. Sent asks once and retries once unless the first answer was a 4xx, and the reason reflects the last attempt | Answer within 2.5 seconds and do no network calls in the handler. Check the response size and that the URL answers directly, without a redirect. See Deadlines and Retries |
invalid_answer | The last attempt returned a 2xx with a body Sent could not use. This includes a connectToNumber to a blocked country or with a callerId you do not own | Run POST /v3/channels/voice/{number}/test, which names the field at fault. See the Voice Callback Contract |
rejected | Your callback refused the call.request with a 4xx or a reject action, or the phone that was dialed was busy. On a call.input the same answers hang the call up and it ends COMPLETED instead | Nothing, when that was the intent. A busy callee is reported the same way |
no_answer | The phone that was dialed did not pick up | Nothing on your side. Consider a fallback destination in your routing |
insufficient_balance | The account balance was at or below zero when a call was placed from your app, to a phone, an app user or a room alike, or when an answer added a phone leg to a call that had none. Inbound calls are not checked before the question | Add funds. Legs to app users and rooms cost nothing, but a call from your app still needs a balance greater than zero to start |
destination_blocked | A call placed from your app to a phone number in a country Sent does not allow calls to. Refused before your callback is asked; an answer that dials such a number fails as invalid_answer instead | Check the destination. Contact support@sent.dm to have the country allowed |
callback_not_configured | The number the call arrived on has no callback URL, so there was nobody to ask | Set callback_url with PATCH /v3/channels/voice/{number} |
Troubleshooting Guide
General Troubleshooting Steps
- Check the Error Code: Use the error code to find its entry in this catalog
- Review Request ID: Include
meta.request_idwhen contacting support - Verify API Version: Ensure you're using v3 endpoints (
/v3/) - Test in Sandbox Mode: Use
sandbox: trueto validate without side effects
Getting Help
If you can't resolve an error:
- Documentation: Check this catalog and the Error Handling guide
- Support email: support@sent.dm
- Include in Support Request:
- Request ID (
meta.request_id) - Error code and message
- Timestamp of occurrence
- Endpoint and method
- Request payload (sanitized)
- Request ID (
Error Code Quick Reference
Every code documented on this page, in page order:
| Code | Category | HTTP Status | Quick Fix |
|---|---|---|---|
| AUTH_001 | Authentication | 401 | Renew the voice token. A missing or wrong API key is AUTH_002 |
| AUTH_002 | Authentication | 401 | Send the key in x-api-key or Authorization: Bearer, then verify or regenerate it |
| AUTH_004 | Authentication | 403 | Check user permissions |
| AUTH_005 | Authentication | 403 | Wait for account activation |
| AUTH_006 | Authentication | 403 | Complete KYC verification |
| AUTH_007 | Authentication | 403 | Configure a messaging channel |
| VALIDATION_001 | Validation | 400, 413, 422 | Check error.details |
| VALIDATION_002 | Validation | 400 | Use E.164 phone format |
| VALIDATION_003 | Validation | 400 | Check UUID format |
| VALIDATION_004 | Validation | 400 | Provide all required fields |
| VALIDATION_005 | Validation | 400 | Check value is within range |
| VALIDATION_006 | Validation | 400 | Check enum values |
| VALIDATION_008 | Validation | 400 (or message FAILED) | Fix the template variable value named in the message |
| VALIDATION_011 | Validation | 400 | Use letters, digits, - and _, up to 200 characters |
| RESOURCE_001 | Resource | 404 | Verify contact ID exists |
| RESOURCE_002 | Resource | 404 | Verify template ID exists |
| RESOURCE_003 | Resource | 404 | Verify message ID exists |
| RESOURCE_004 | Resource | 404 | Verify customer ID exists |
| RESOURCE_005 | Resource | 404 | Verify organization ID |
| RESOURCE_006 | Resource | 404 | Verify user ID exists |
| RESOURCE_007 | Resource | 409 | Update the existing resource |
| RESOURCE_008 | Resource | 404 | Verify webhook ID exists |
| RESOURCE_009 | Resource | 404 | Register a brand for the profile |
| RESOURCE_010 | Resource | 404 | Verify campaign belongs to the profile's brand |
| RESOURCE_011 | Resource | 404 | Verify batch ID exists |
| RESOURCE_012 | Resource | 404 | Verify the number is provisioned (E.164) |
| RESOURCE_013 | Resource | 404 | Verify the resource ID and endpoint path |
| RESOURCE_014 | Resource | 404 | Use a profile ID from GET /v3/profiles |
| RESOURCE_015 | Resource | 404 | Use a call id from a question, a webhook or GET /v3/calls |
| RESOURCE_017 | Resource | 404 | List the room and use an id from it |
| BUSINESS_002 | Business Logic | 429 | Implement backoff |
| BUSINESS_003 | Business Logic | 402 | Add account funds |
| BUSINESS_004 | Business Logic | 400 | Remove opted-out contacts |
| ERR_CONSENT_BLOCKED | Business Logic | n/a (message FILTERED) | Stop targeting the contact |
| BUSINESS_005 | Business Logic | 400 | Wait for template approval |
| BUSINESS_006 | Business Logic | 409 | Wait and retry the resend, or check the message is SCHEDULED before cancelling |
| BUSINESS_007 | Business Logic | 503 (or message FAILED) | Contact support about the market or MMS |
| BUSINESS_008 | Business Logic | 400 | Check quota limits |
| BUSINESS_009 | Business Logic | 501 (or message FAILED) | Request sms requirements; send on a supported channel |
| BUSINESS_010 | Business Logic | 400 | Re-enable the webhook after fixing the endpoint |
| BUSINESS_011 | Business Logic | 400 (or message FAILED) | Check the destination country; contact support if it should be allowed |
| BUSINESS_012 | Business Logic | 400 | Use a channel the template is active on |
| WHATSAPP_TEMPLATE_REQUIRED | Business Logic | - (message FAILED) | Send an approved template, or omit channel to fall back |
| CONVERSATION_TEMPLATE_REQUIRED | Business Logic | - (message BLOCKED) | Send an approved template to open or re-open the conversation |
| BUSINESS_014 | Business Logic | 403 | Contact support; do not retry |
| BUSINESS_015 | Business Logic | 422 (or message FAILED) | Choose another country or number type |
| BUSINESS_016 | Business Logic | 422 | Ask for a number type listed in details |
| BUSINESS_017 | Business Logic | - (message FAILED) | Check the WhatsApp business account |
| BUSINESS_018 | Business Logic | - (message FAILED) | Enable marketing on the WhatsApp business account |
| BUSINESS_019 | Business Logic | - (message FAILED) | Check the channel's reason_code |
| BUSINESS_020 | Business Logic | - (message BLOCKED) | Complete the next onboarding step |
| BUSINESS_022 | Business Logic | 400 | Use a number you hold, or leave number out to get one |
| BUSINESS_023 | Business Logic | 403 | Turn calls on for a number first |
| BUSINESS_024 | Business Logic | 400 | Use a number from GET /v3/channels/voice |
| BUSINESS_025 | Business Logic | 400 | Retry; contact support with the request ID if it repeats |
| BUSINESS_026 | Business Logic | 403 | Contact support to turn call recording on |
| BUSINESS_027 | Business Logic | 502 | Repeat the request |
| BUSINESS_028 | Business Logic | 409 | Try another area_code, or omit it |
| BUSINESS_029 | Business Logic | - (message BLOCKED) | Remove or replace the number at the position reason names in channels |
| BUSINESS_030 | Business Logic | 400 | Keep the primary OPT_IN, OPT_OUT, and HELP templates; edit them instead of deleting |
| LIMIT_001 | Business Logic | 429 | Wait for scheduled messages to send, cancel ones you no longer need, or schedule fewer at once |
| CONFLICT_001 | Conflict | 409 | Wait for the original request |
| CONFLICT_005 | Conflict | 422 | Use a new key, or resend the original request unchanged |
| CONFLICT_006 | Conflict | 409 | Wait for the template review to finish; only name is editable meanwhile |
| CONFLICT_007 | Conflict | 409 | Move the default to another number first |
| CONFLICT_008 | Conflict | 409 | The call has ended; nothing to do |
| CONFLICT_009 | Conflict | 409 | Answer with connectToConference; retry a 409 right after answering |
| CONFLICT_011 | Conflict | 409 | Hang up from the app; app-to-app calls cannot be recorded |
| SERVICE_001 | Service | 503 | Retry after a short delay |
| INTERNAL_001 | Internal | 500 | Retry or contact support |
| INTERNAL_002 | Internal | 500 | Retry or contact support |
| INTERNAL_003 | Internal | 500, 502 | Retry after a delay |
| INTERNAL_004 | Internal | 504 | Retry or contact support |
| INTERNAL_005 | Internal | 503 | Retry with backoff |
| DELIVERY_001 to DELIVERY_016 | Message outcome | - (message FAILED/FILTERED/BLOCKED) | See Message Outcome Codes |
| CHANNEL_001 to CHANNEL_011 | Channel status | - (channel not ACTIVE) | See Channel Status Reasons |
callback_timeout to callback_not_configured | Call failure reason | - (call FAILED, NO_ANSWER or REJECTED) | See Call Failure Reasons |
Need More Help? Contact support@sent.dm with your request ID for personalized assistance.