This document provides a complete collection of OpenWA API endpoints with request/response examples for each endpoint. It can be used as a quick reference or imported into tools such as Postman, Insomnia, or Bruno.
Development: http://localhost:2785
Production: https://api.your-domain.com
All endpoints (except /health) require an API Key:
X-API-Key: your-api-key-here{
"success": true,
"data": { ... },
"meta": {
"timestamp": "2026-02-02T10:30:00Z",
"requestId": "req_abc123"
}
}{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid phone number format",
"details": {
"field": "phone",
"expected": "format: 628xxx@c.us"
}
},
"meta": {
"timestamp": "2026-02-02T10:30:00Z",
"requestId": "req_abc123"
}
}Basic health check.
curl http://localhost:2785/healthResponse:
{
"status": "ok",
"timestamp": "2026-02-02T10:30:00Z"
}Detailed health check with system status.
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/health/detailedResponse:
{
"status": "ok",
"version": "0.1.0",
"uptime": 86400,
"timestamp": "2026-02-02T10:30:00Z",
"checks": {
"database": "ok",
"redis": "ok",
"sessions": {
"total": 5,
"connected": 4,
"disconnected": 1
}
}
}System metrics (Prometheus format).
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/api/metricsResponse:
# HELP openwa_sessions_total Total number of sessions
# TYPE openwa_sessions_total gauge
openwa_sessions_total{status="connected"} 4
openwa_sessions_total{status="disconnected"} 1
# HELP openwa_messages_total Total messages processed
# TYPE openwa_messages_total counter
openwa_messages_total{direction="incoming"} 15234
openwa_messages_total{direction="outgoing"} 8567
# HELP openwa_api_requests_total Total API requests
# TYPE openwa_api_requests_total counter
openwa_api_requests_total{method="GET",status="200"} 45678
openwa_api_requests_total{method="POST",status="200"} 12345
List all sessions.
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessionsQuery Parameters:
| Parameter | Type | Description |
|---|---|---|
| status | string | Filter by status: CONNECTED, DISCONNECTED, INITIALIZING |
| limit | number | Max results (default: 20) |
| offset | number | Pagination offset |
Response:
{
"success": true,
"data": [
{
"id": "default",
"name": "Default Session",
"status": "CONNECTED",
"phoneNumber": "628123456789",
"profileName": "John Doe",
"profilePicture": "https://...",
"createdAt": "2026-02-01T00:00:00Z",
"lastSeen": "2026-02-02T10:30:00Z"
}
],
"meta": {
"total": 1,
"limit": 20,
"offset": 0
}
}Create new session.
curl -X POST http://localhost:2785/api/sessions \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"id": "session-1",
"name": "Customer Support",
"config": {
"autoReconnect": true,
"webhookUrl": "https://your-server.com/webhook"
}
}'Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
| id | string | No | Session ID (auto-generated if not provided) |
| name | string | No | Display name |
| config.autoReconnect | boolean | No | Auto reconnect on disconnect (default: true) |
| config.webhookUrl | string | No | Webhook URL for this session |
| config.proxy | string | No | Proxy URL (http://user:pass@host:port) |
Response:
{
"success": true,
"data": {
"id": "session-1",
"name": "Customer Support",
"status": "INITIALIZING",
"qr": null,
"createdAt": "2026-02-02T10:30:00Z"
}
}Get session details.
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/session-1Response:
{
"success": true,
"data": {
"id": "session-1",
"name": "Customer Support",
"status": "CONNECTED",
"phoneNumber": "628123456789",
"profileName": "John Doe",
"profilePicture": "https://...",
"pushName": "John",
"platform": "android",
"config": {
"autoReconnect": true,
"webhookUrl": "https://your-server.com/webhook"
},
"stats": {
"messagesReceived": 1234,
"messagesSent": 567,
"lastMessageAt": "2026-02-02T10:25:00Z"
},
"createdAt": "2026-02-01T00:00:00Z",
"lastSeen": "2026-02-02T10:30:00Z"
}
}Delete session.
curl -X DELETE \
-H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/session-1Query Parameters:
| Parameter | Type | Description |
|---|---|---|
| keepAuth | boolean | Keep auth files for quick reconnect (default: false) |
Response:
{
"success": true,
"data": {
"message": "Session deleted successfully"
}
}Get QR code for authentication.
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/session-1/qrQuery Parameters:
| Parameter | Type | Description |
|---|---|---|
| format | string | base64 (default), raw, image |
Response (format=base64):
{
"success": true,
"data": {
"qr": "data:image/png;base64,iVBORw0KGgo...",
"expiresAt": "2026-02-02T10:31:00Z"
}
}Response (format=image):
Returns PNG image directly with Content-Type: image/png
Restart session.
curl -X POST \
-H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/session-1/restartResponse:
{
"success": true,
"data": {
"message": "Session restarting",
"status": "INITIALIZING"
}
}Logout session (clear auth).
curl -X POST \
-H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/session-1/logoutResponse:
{
"success": true,
"data": {
"message": "Session logged out successfully"
}
}Send message.
# Text message
curl -X POST http://localhost:2785/api/sessions/default/messages \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone": "628123456789@c.us",
"type": "text",
"body": "Hello, World!"
}'Request Body - Text:
{
"phone": "628123456789@c.us",
"type": "text",
"body": "Hello, World!",
"options": {
"quotedMessageId": "MSG_ABC123",
"mentions": ["628111222333@c.us"]
}
}Request Body - Image:
{
"phone": "628123456789@c.us",
"type": "image",
"media": {
"url": "https://example.com/image.jpg"
},
"caption": "Check this out!"
}Request Body - Image (Base64):
{
"phone": "628123456789@c.us",
"type": "image",
"media": {
"base64": "iVBORw0KGgo...",
"mimetype": "image/jpeg",
"filename": "photo.jpg"
},
"caption": "Photo from base64"
}Request Body - Document:
{
"phone": "628123456789@c.us",
"type": "document",
"media": {
"url": "https://example.com/document.pdf"
},
"filename": "report.pdf",
"caption": "Monthly report"
}Request Body - Location:
{
"phone": "628123456789@c.us",
"type": "location",
"location": {
"latitude": -6.2088,
"longitude": 106.8456,
"name": "Monas",
"address": "Jakarta, Indonesia"
}
}Request Body - Contact:
{
"phone": "628123456789@c.us",
"type": "contact",
"contact": {
"name": "John Doe",
"phone": "+628111222333"
}
}Request Body - Buttons (Interactive):
{
"phone": "628123456789@c.us",
"type": "buttons",
"body": "Please choose an option:",
"buttons": [
{ "id": "btn1", "text": "Option 1" },
{ "id": "btn2", "text": "Option 2" },
{ "id": "btn3", "text": "Option 3" }
],
"footer": "Powered by OpenWA"
}Request Body - List (Interactive):
{
"phone": "628123456789@c.us",
"type": "list",
"body": "Please select from the menu:",
"buttonText": "View Menu",
"sections": [
{
"title": "Category 1",
"rows": [
{ "id": "item1", "title": "Item 1", "description": "Description 1" },
{ "id": "item2", "title": "Item 2", "description": "Description 2" }
]
}
],
"footer": "Powered by OpenWA"
}Response:
{
"success": true,
"data": {
"id": "MSG_ABC123DEF456",
"phone": "628123456789@c.us",
"type": "text",
"body": "Hello, World!",
"status": "PENDING",
"timestamp": "2026-02-02T10:30:00Z"
}
}Send message with file upload.
curl -X POST http://localhost:2785/api/sessions/default/messages \
-H "X-API-Key: $API_KEY" \
-F "phone=628123456789@c.us" \
-F "type=image" \
-F "media=@/path/to/image.jpg" \
-F "caption=Uploaded via multipart"Get message history.
curl -H "X-API-Key: $API_KEY" \
"http://localhost:2785/api/sessions/default/messages?phone=628123456789@c.us&limit=50"Query Parameters:
| Parameter | Type | Description |
|---|---|---|
| phone | string | Filter by chat (required) |
| limit | number | Max results (default: 50, max: 200) |
| before | string | Messages before this ID |
| after | string | Messages after this ID |
| type | string | Filter by type: chat, image, video, etc. |
Response:
{
"success": true,
"data": [
{
"id": "MSG_ABC123",
"from": "628123456789@c.us",
"to": "628987654321@c.us",
"body": "Hello!",
"type": "chat",
"timestamp": "2026-02-02T10:25:00Z",
"status": "READ",
"isFromMe": false
}
],
"meta": {
"hasMore": true,
"nextCursor": "MSG_DEF456"
}
}Get specific message.
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/default/messages/MSG_ABC123Delete/revoke message.
curl -X DELETE \
-H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/default/messages/MSG_ABC123Query Parameters:
| Parameter | Type | Description |
|---|---|---|
| forEveryone | boolean | Delete for everyone (default: true) |
React to message.
curl -X POST http://localhost:2785/api/sessions/default/messages/MSG_ABC123/react \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"emoji": "👍"}'Get all contacts.
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/default/contactsResponse:
{
"success": true,
"data": [
{
"id": "628123456789@c.us",
"name": "John Doe",
"pushName": "John",
"shortName": "John",
"isMyContact": true,
"isBlocked": false,
"profilePicture": "https://..."
}
]
}Get contact info.
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/default/contacts/628123456789Check if number exists on WhatsApp.
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/default/contacts/628123456789/existsResponse:
{
"success": true,
"data": {
"exists": true,
"jid": "628123456789@c.us"
}
}Block contact.
curl -X POST \
-H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/default/contacts/628123456789/blockUnblock contact.
curl -X POST \
-H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/default/contacts/628123456789/unblockGet all groups.
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/default/groupsResponse:
{
"success": true,
"data": [
{
"id": "120363123456789@g.us",
"name": "Family Group",
"description": "Family chat",
"participantsCount": 15,
"isAdmin": true,
"profilePicture": "https://...",
"createdAt": "2025-01-15T00:00:00Z"
}
]
}Create new group.
curl -X POST http://localhost:2785/api/sessions/default/groups \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "New Group",
"participants": [
"628123456789@c.us",
"628987654321@c.us"
]
}'Response:
{
"success": true,
"data": {
"id": "120363987654321@g.us",
"name": "New Group",
"inviteCode": "ABC123XYZ"
}
}Get group info.
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/default/groups/120363123456789@g.usResponse:
{
"success": true,
"data": {
"id": "120363123456789@g.us",
"name": "Family Group",
"description": "Family chat",
"owner": "628111222333@c.us",
"participants": [
{
"id": "628123456789@c.us",
"isAdmin": true,
"isSuperAdmin": false
},
{
"id": "628987654321@c.us",
"isAdmin": false,
"isSuperAdmin": false
}
],
"settings": {
"announce": false,
"restrict": false
},
"inviteCode": "ABC123XYZ",
"createdAt": "2025-01-15T00:00:00Z"
}
}Update group info.
curl -X PATCH http://localhost:2785/api/sessions/default/groups/120363123456789@g.us \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Updated Group Name",
"description": "New description"
}'Leave group.
curl -X DELETE \
-H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/default/groups/120363123456789@g.usAdd participants to group.
curl -X POST http://localhost:2785/api/sessions/default/groups/120363123456789@g.us/participants \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"participants": ["628111222333@c.us", "628444555666@c.us"]
}'Remove participants from group.
curl -X DELETE http://localhost:2785/api/sessions/default/groups/120363123456789@g.us/participants \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"participants": ["628111222333@c.us"]
}'Promote to admin.
curl -X POST http://localhost:2785/api/sessions/default/groups/120363123456789@g.us/admins \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"participants": ["628123456789@c.us"]
}'Demote from admin.
curl -X DELETE http://localhost:2785/api/sessions/default/groups/120363123456789@g.us/admins \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"participants": ["628123456789@c.us"]
}'Get group invite code.
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/default/groups/120363123456789@g.us/invite-codeResponse:
{
"success": true,
"data": {
"inviteCode": "ABC123XYZ",
"inviteUrl": "https://chat.whatsapp.com/ABC123XYZ"
}
}Revoke and generate new invite code.
curl -X POST \
-H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/default/groups/120363123456789@g.us/invite-code/revokeList all webhooks.
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/sess_abc123/webhooksResponse:
{
"success": true,
"data": [
{
"id": "wh_123",
"url": "https://your-server.com/webhook",
"events": ["message.received", "message.ack"],
"sessionId": "sess_abc123",
"enabled": true,
"secret": "whsec_***",
"createdAt": "2026-02-01T00:00:00Z"
}
]
}Create webhook.
curl -X POST http://localhost:2785/api/sessions/sess_abc123/webhooks \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-server.com/webhook",
"events": ["message.received", "message.ack", "session.status"],
"headers": {
"Authorization": "Bearer your-token"
}
}'Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | Webhook endpoint URL |
| events | string[] | Yes | Events to subscribe |
| headers | object | No | Custom headers to send |
| secret | string | No | Secret for signature verification |
Available Events:
message.received - New incoming message
message.sent - Message sent
message.ack - Message status (sent, delivered, read)
message.revoked - Message deleted
session.status - Session status change
session.qr - QR code generated
session.authenticated - Session authenticated
session.disconnected - Session disconnected
group.join - Someone joined group
group.leave - Someone left group
group.update - Group settings changed
Response:
{
"success": true,
"data": {
"id": "wh_456",
"url": "https://your-server.com/webhook",
"events": ["message.received", "message.ack", "session.status"],
"sessionId": "sess_abc123",
"enabled": true,
"secret": "whsec_abc123xyz",
"createdAt": "2026-02-02T10:30:00Z"
}
}Get webhook details.
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/sess_abc123/webhooks/wh_456Update webhook.
curl -X PATCH http://localhost:2785/api/sessions/sess_abc123/webhooks/wh_456 \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"events": ["message.received"],
"enabled": false
}'Delete webhook.
curl -X DELETE \
-H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/sess_abc123/webhooks/wh_456Get webhook delivery logs.
curl -H "X-API-Key: $API_KEY" \
"http://localhost:2785/api/sessions/sess_abc123/webhooks/wh_456/logs?limit=20"Response:
{
"success": true,
"data": [
{
"id": "log_789",
"webhookId": "wh_456",
"event": "message.received",
"status": "success",
"statusCode": 200,
"duration": 150,
"attempt": 1,
"payload": { ... },
"response": { ... },
"createdAt": "2026-02-02T10:30:00Z"
}
]
}Test webhook.
curl -X POST \
-H "X-API-Key: $API_KEY" \
http://localhost:2785/api/sessions/sess_abc123/webhooks/wh_456/testResponse:
{
"success": true,
"data": {
"status": "success",
"statusCode": 200,
"duration": 125,
"response": {
"received": true
}
}
}List API keys.
curl -H "X-API-Key: $API_KEY" \
http://localhost:2785/api/api-keysResponse:
{
"success": true,
"data": [
{
"id": "key_123",
"name": "Production Key",
"prefix": "owa_prod_***",
"permissions": ["*"],
"sessionAccess": ["*"],
"rateLimit": 1000,
"lastUsed": "2026-02-02T10:30:00Z",
"expiresAt": null,
"createdAt": "2026-01-01T00:00:00Z"
}
]
}Create API key.
curl -X POST http://localhost:2785/api/api-keys \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Integration Key",
"permissions": ["sessions:read", "messages:write"],
"sessionAccess": ["default"],
"rateLimit": 100,
"expiresAt": "2027-01-01T00:00:00Z"
}'Permissions:
* - All permissions
sessions:read - Read session info
sessions:write - Create/delete sessions
messages:read - Read messages
messages:write - Send messages
contacts:read - Read contacts
contacts:write - Block/unblock contacts
groups:read - Read group info
groups:write - Manage groups
webhooks:read - Read webhooks
webhooks:write - Manage webhooks
api-keys:read - Read API keys
api-keys:write - Manage API keys
Response:
{
"success": true,
"data": {
"id": "key_456",
"name": "Integration Key",
"key": "owa_abc123xyz789...",
"permissions": ["sessions:read", "messages:write"],
"sessionAccess": ["default"],
"rateLimit": 100,
"expiresAt": "2027-01-01T00:00:00Z",
"createdAt": "2026-02-02T10:30:00Z"
}
}Note: The full key is only shown once at creation.
Revoke API key.
curl -X DELETE \
-H "X-API-Key: $API_KEY" \
http://localhost:2785/api/api-keys/key_456{
"info": {
"name": "OpenWA API",
"description": "OpenWA WhatsApp API Gateway",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"variable": [
{
"key": "baseUrl",
"value": "http://localhost:2785",
"type": "string"
},
{
"key": "apiKey",
"value": "your-api-key",
"type": "string"
},
{
"key": "sessionId",
"value": "default",
"type": "string"
}
],
"auth": {
"type": "apikey",
"apikey": [
{
"key": "key",
"value": "X-API-Key",
"type": "string"
},
{
"key": "value",
"value": "{{apiKey}}",
"type": "string"
},
{
"key": "in",
"value": "header",
"type": "string"
}
]
},
"item": [
{
"name": "Health",
"item": [
{
"name": "Health Check",
"request": {
"method": "GET",
"url": "{{baseUrl}}/health"
}
},
{
"name": "Detailed Health",
"request": {
"method": "GET",
"url": "{{baseUrl}}/health/detailed"
}
}
]
},
{
"name": "Sessions",
"item": [
{
"name": "List Sessions",
"request": {
"method": "GET",
"url": "{{baseUrl}}/api/sessions"
}
},
{
"name": "Create Session",
"request": {
"method": "POST",
"url": "{{baseUrl}}/api/sessions",
"body": {
"mode": "raw",
"raw": "{\n \"id\": \"{{sessionId}}\",\n \"name\": \"My Session\"\n}",
"options": {
"raw": {
"language": "json"
}
}
}
}
},
{
"name": "Get Session",
"request": {
"method": "GET",
"url": "{{baseUrl}}/api/sessions/{{sessionId}}"
}
},
{
"name": "Get QR Code",
"request": {
"method": "GET",
"url": "{{baseUrl}}/api/sessions/{{sessionId}}/qr"
}
},
{
"name": "Delete Session",
"request": {
"method": "DELETE",
"url": "{{baseUrl}}/api/sessions/{{sessionId}}"
}
}
]
},
{
"name": "Messages",
"item": [
{
"name": "Send Text Message",
"request": {
"method": "POST",
"url": "{{baseUrl}}/api/sessions/{{sessionId}}/messages",
"body": {
"mode": "raw",
"raw": "{\n \"phone\": \"628123456789@c.us\",\n \"type\": \"text\",\n \"body\": \"Hello from OpenWA!\"\n}",
"options": {
"raw": {
"language": "json"
}
}
}
}
},
{
"name": "Send Image (URL)",
"request": {
"method": "POST",
"url": "{{baseUrl}}/api/sessions/{{sessionId}}/messages",
"body": {
"mode": "raw",
"raw": "{\n \"phone\": \"628123456789@c.us\",\n \"type\": \"image\",\n \"media\": {\n \"url\": \"https://example.com/image.jpg\"\n },\n \"caption\": \"Check this out!\"\n}",
"options": {
"raw": {
"language": "json"
}
}
}
}
},
{
"name": "Get Message History",
"request": {
"method": "GET",
"url": {
"raw": "{{baseUrl}}/api/sessions/{{sessionId}}/messages?phone=628123456789@c.us&limit=50",
"host": ["{{baseUrl}}"],
"path": ["api", "sessions", "{{sessionId}}", "messages"],
"query": [
{"key": "phone", "value": "628123456789@c.us"},
{"key": "limit", "value": "50"}
]
}
}
}
]
}
]
}Download: openwa-postman-collection.json
#!/bin/bash
# openwa-curl-examples.sh
BASE_URL="http://localhost:2785"
API_KEY="your-api-key"
SESSION_ID="default"
# Health Check
echo "=== Health Check ==="
curl -s "$BASE_URL/health" | jq
# Create Session
echo "=== Create Session ==="
curl -s -X POST "$BASE_URL/api/sessions" \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d "{\"id\": \"$SESSION_ID\", \"name\": \"Test Session\"}" | jq
# Get QR Code
echo "=== Get QR Code ==="
curl -s "$BASE_URL/api/sessions/$SESSION_ID/qr" \
-H "X-API-Key: $API_KEY" | jq -r '.data.qr'
# Send Text Message
echo "=== Send Text Message ==="
curl -s -X POST "$BASE_URL/api/sessions/$SESSION_ID/messages" \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone": "628123456789@c.us",
"type": "text",
"body": "Hello from cURL!"
}' | jq
# Send Image
echo "=== Send Image ==="
curl -s -X POST "$BASE_URL/api/sessions/$SESSION_ID/messages" \
-H "X-API-Key: $API_KEY" \
-F "phone=628123456789@c.us" \
-F "type=image" \
-F "media=@./test-image.jpg" \
-F "caption=Uploaded via cURL" | jq
# Get Contacts
echo "=== Get Contacts ==="
curl -s "$BASE_URL/api/sessions/$SESSION_ID/contacts" \
-H "X-API-Key: $API_KEY" | jq
# Get Groups
echo "=== Get Groups ==="
curl -s "$BASE_URL/api/sessions/$SESSION_ID/groups" \
-H "X-API-Key: $API_KEY" | jq
# Create Webhook
echo "=== Create Webhook ==="
curl -s -X POST "$BASE_URL/api/sessions/$SESSION_ID/webhooks" \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-server.com/webhook",
"events": ["message.received", "message.ack"]
}' | jq