Step 1: Confirm Instance Is Open
Dashboard > Instances > Manage > Connection
Do not send if the portal connection state is not open.
On-Site Documentation
Send outbound transactional messages through the guarded API endpoint.
Send
Validate connection first, then send expected transactional messages with traceable payloads.
Dashboard > Instances > Manage > Connection
Do not send if the portal connection state is not open.
curl -i -X POST "https://evoapi.faisak.com/api/send-message" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"instance_id": "faisak-demo",
"phone": "9665XXXXXXXX",
"message": "Your invoice INV-2041 is ready. Please check your customer portal.",
"message_purpose": "transactional"
}'
This endpoint requires Content-Type: application/json and Authorization: Bearer CUSTOMER_API_KEY. The API key is for your customer system to call WhatsApp Gateway.
POST /api/send-message
Headers:
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Body:
{
"instance_id": "inst_12345",
"phone": "+9665XXXXXXX",
"message": "Your order #2041 has been shipped.",
"message_purpose": "transactional"
}
Response:
{
"success": true,
"status": "sent",
"message_id": "string",
"log_id": 123
}
All outgoing messages must be sent through the WhatsApp Gateway application API so responsible messaging checks, fair-use limits, suppression rules, and policy logging are applied before delivery.
Use the equivalent instance field your integration endpoint expects, and always classify the message purpose.
Manage API keys in the customer dashboard. /api-keys is a portal form route, not a public JSON API endpoint.
Media sending is not exposed through the guarded public beta API yet.
Keep beta integrations on guarded text messages until media sends are added to the same responsible messaging flow.
{
"success": false,
"error": "error_code",
"message": "Human readable explanation.",
"details": {
"action": "block",
"risk_score": 90,
"limit": 100,
"used": 100
}
}
unsupported_media_type{
"success": false,
"error": "unsupported_media_type",
"message": "This endpoint requires application/json.",
"details": []
}
invalid_api_key{
"success": false,
"error": "invalid_api_key",
"message": "A valid API key is required.",
"details": []
}
revoked_api_key{
"success": false,
"error": "revoked_api_key",
"message": "This API key has been revoked.",
"details": []
}
invalid_json{
"success": false,
"error": "invalid_json",
"message": "Request body must be valid JSON.",
"details": []
}
validation_error{
"success": false,
"error": "validation_error",
"message": "The request payload is missing required fields.",
"details": {
"fields": [
"instance_id",
"phone",
"message"
]
}
}
module_not_enabled{
"success": false,
"error": "module_not_enabled",
"message": "API access is not enabled for this account.",
"details": {
"module": "api_access",
"status": "not_in_plan"
}
}
active_plan_required{
"success": false,
"error": "active_plan_required",
"message": "An active plan is required before sending messages.",
"details": []
}
invalid_instance{
"success": false,
"error": "invalid_instance",
"message": "The requested instance was not found for this API key.",
"details": []
}
message_purpose_required{
"success": false,
"error": "message_purpose_required",
"message": "message_purpose is required. Allowed values are transactional, operational, support, internal_team, and authentication.",
"details": {
"action": "block",
"risk_score": 0
}
}
message_purpose_not_allowed{
"success": false,
"error": "message_purpose_not_allowed",
"message": "WhatsApp Gateway does not support marketing, cold outreach, political, or bulk campaign messaging.",
"details": {
"action": "block",
"risk_score": 100
}
}
daily_message_limit_exceeded{
"success": false,
"error": "daily_message_limit_exceeded",
"message": "Your daily transactional message limit has been reached. Please try again tomorrow or request a higher reviewed limit.",
"details": {
"action": "block",
"risk_score": 90,
"limit": 100,
"used": 100
}
}
monthly_message_limit_exceeded{
"success": false,
"error": "monthly_message_limit_exceeded",
"message": "Your monthly fair-use message limit has been reached. Please contact support for a reviewed higher limit.",
"details": {
"action": "block",
"risk_score": 90,
"limit": 2000,
"used": 2000
}
}
recipient_suppressed{
"success": false,
"error": "recipient_suppressed",
"message": "This recipient has opted out or has been blocked from non-essential messages.",
"details": {
"action": "block",
"risk_score": 100
}
}
sending_throttled{
"success": false,
"error": "sending_throttled",
"message": "Sending speed has been temporarily limited to protect gateway reliability and prevent bulk messaging.",
"details": {
"action": "throttle",
"risk_score": 65
}
}
instance_paused_for_review{
"success": false,
"error": "instance_paused_for_review",
"message": "This instance has been paused for responsible messaging review.",
"details": {
"action": "pause_instance",
"risk_score": 100
}
}
policy_violation{
"success": false,
"error": "policy_violation",
"message": "This message appears to violate WhatsApp Gateway responsible messaging rules. Bulk marketing, spam, and cold outreach are not allowed.",
"details": {
"action": "block",
"risk_score": 90
}
}
gateway_send_failed{
"success": false,
"error": "gateway_send_failed",
"message": "The message passed responsible messaging checks, but delivery could not be completed. Please try again or contact support.",
"details": []
}
internal_error{
"success": false,
"error": "internal_error",
"message": "The request could not be processed. Please try again or contact support.",
"details": []
}
transactional for invoices, orders, appointments, and expected customer updates.operational for ERP/CRM notifications, system alerts, and workflow events.support for support ticket updates and service conversations.internal_team for internal approvals, tasks, stock, and team alerts.authentication for OTP or verification-style messages with strict limits.message.status_updated, message.delivered, or message.read webhook events.