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.
Authentication Errors
AUTH_001: User is not authenticated
Error Message: "User is not authenticated"
HTTP Status: 401 Unauthorized
Cause: The request is missing the required x-api-key header.
Remediation:
- Ensure you're including the
x-api-keyheader in all API requests - Verify the header name is exactly
x-api-key(case-sensitive) - Check that your API key is being loaded from environment variables correctly
Example Fix:
# ❌ Missing header
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"AUTH_002: Invalid or missing API key
Error Message: "Invalid or missing API key"
HTTP Status: 401 Unauthorized
Cause: The provided API key is invalid, revoked, or the x-api-key header is present but its value is not recognized.
Remediation:
- 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
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
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 (
sms,whatsapp), template category (MARKETING,UTILITY,AUTHENTICATION)
VALIDATION_007: Invalid Idempotency-Key format
Error Message: "Invalid Idempotency-Key format"
HTTP Status: 400 Bad Request
Cause: The idempotency key doesn't meet the format requirements.
Remediation:
- Use only alphanumeric characters, hyphens, and underscores
- Keep the key between 1 and 255 characters
- Avoid special characters such as spaces,
@, and#
Valid Examples:
req-abc-123send_msg_001webhook_retry_1
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
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
Business Logic Errors
BUSINESS_001: Cannot modify inherited contact
Error Message: "Cannot modify inherited contact"
HTTP Status: 422 Unprocessable Entity
Cause: You're attempting to modify a contact that was inherited from a parent organization or shared profile.
Remediation:
- Create a new contact with the desired phone number
- Contacts inherited from parent organizations are read-only
- Use your own profile-scoped API key for contact modifications
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 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: 422 Unprocessable Entity
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 (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 = FILTEREDGET /v3/messages/{id}/activities: aFILTEREDactivity; itsdescriptionis the genericMessage updated to FILTERED- The
message.filteredwebhook event
The ERR_CONSENT_BLOCKED code and the consent-block reason are recorded internally and are not included in API responses or webhook payloads. A FILTERED terminal status indicates a policy block (consent or routing); check the contact's opt_out field to confirm a consent block.
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: 422 Unprocessable Entity
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 modified in current state
Error Message: "Message cannot be modified in current state"
HTTP Status: 422 Unprocessable Entity
Cause: The message has already been sent or is in a final state that prevents modification.
Remediation:
- Messages can only be modified while in
QUEUEDorACCEPTEDstatus - Once a message is
SENT,DELIVERED,READ, orFAILED, it cannot be modified - Send a new message if you need to make changes
BUSINESS_007: Channel not available
Error Message: "Channel not available for this contact"
HTTP Status: 422 Unprocessable Entity
Cause: The requested messaging channel (SMS/WhatsApp) isn't available for this phone number.
Remediation:
- Check available channels for the contact:
curl -X GET https://api.sent.dm/v3/contacts/{id} \ -H "x-api-key: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - Use an available channel from
available_channels - Don't specify a channel to let the API choose automatically
BUSINESS_008: Operation would exceed quota
Error Message: "Operation would exceed quota"
HTTP Status: 422 Unprocessable Entity
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
Conflict Errors
CONFLICT_001: Concurrent idempotent request
Error Message: "Concurrent idempotent request in progress"
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
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: "External service error (SMS/WhatsApp provider)"
HTTP Status: 502 Bad Gateway
Cause: The upstream messaging provider is experiencing issues.
Remediation:
- Wait a few minutes and retry
- Check API Status for known issues
- The message is queued and retried automatically
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
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 | Add x-api-key header |
| AUTH_002 | Authentication | 401 | Verify/regenerate API key |
| 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 | 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_007 | Validation | 400 | Fix Idempotency-Key format |
| 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 |
| BUSINESS_001 | Business Logic | 422 | Create new contact instead |
| BUSINESS_002 | Business Logic | 429 | Implement backoff |
| BUSINESS_003 | Business Logic | 402 | Add account funds |
| BUSINESS_004 | Business Logic | 422 | Remove opted-out contacts |
| ERR_CONSENT_BLOCKED | Business Logic | n/a (message FILTERED) | Stop targeting the contact |
| BUSINESS_005 | Business Logic | 422 | Wait for template approval |
| BUSINESS_006 | Business Logic | 422 | Send a new message instead |
| BUSINESS_007 | Business Logic | 422 | Use an available channel |
| BUSINESS_008 | Business Logic | 422 | Check quota limits |
| CONFLICT_001 | Conflict | 409 | Wait for the original request |
| 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 | 502 | Retry after a delay |
| INTERNAL_004 | Internal | 504 | Retry or contact support |
| INTERNAL_005 | Internal | 503 | Retry with backoff |
Need More Help? Contact support@sent.dm with your request ID for personalized assistance.