import { PeriskopeApi } from '@periskope/periskope-client';
const client = new PeriskopeApi({
authToken: 'YOUR_API_KEY',
phone: '919876543210', // the phone to act with (x-phone)
});
async function main() {
const response = await client.messages.getMessageStatus({
unique_id: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
});
console.log(response);
}
main();curl -X GET 'https://api.periskope.app/v1/message/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/status' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'x-phone: 919876543210'{
"queue_id": "00000000-0000-0000-0000-000000000000",
"unique_id": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"message_id": "true_911111111111@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"chat_id": "911111111111@c.us",
"performed_by": "api",
"status": "delivered",
"status_description": "Delivered to recipient.",
"message": {
"body": "Hello World",
"type": "chat",
"quoted_message_id": null
},
"timeline": {
"queued_at": "2026-01-15T09:30:00.000Z",
"sent_at": "2026-01-15T09:30:02.000Z",
"failed_at": null,
"processing_started_at": null
},
"attempts": 1,
"ack": 3,
"delivered_count": 1,
"read_count": 1
}{
"code": "ERROR",
"message": "The phone is off or its server is unreachable",
"status": 400
}{
"code": "UNAUTHORIZED_ERROR",
"message": "Invalid bearer auth token",
"status": 401
}{
"code": "NOT_FOUND_ERROR",
"message": "No job in the send queue matches unique_id",
"status": 404
}{
"code": "VALIDATION_ERROR",
"message": "Request validation failed",
"status": 422,
"fields": {
"body.chat_id": {
"message": "chat_id is required"
}
}
}{
"code": "RATE_LIMIT_ERROR",
"message": "You can only make 100 requests per second",
"status": 429
}{
"code": "UNKNOWN_ERROR",
"message": "Internal server error",
"status": 500
}Get Message Status
Tracks a message sent via POST /message/send by its unique_id: queued, scheduled, sending or failed while queued, then sent, delivered, read or played.
import { PeriskopeApi } from '@periskope/periskope-client';
const client = new PeriskopeApi({
authToken: 'YOUR_API_KEY',
phone: '919876543210', // the phone to act with (x-phone)
});
async function main() {
const response = await client.messages.getMessageStatus({
unique_id: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
});
console.log(response);
}
main();curl -X GET 'https://api.periskope.app/v1/message/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/status' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'x-phone: 919876543210'{
"queue_id": "00000000-0000-0000-0000-000000000000",
"unique_id": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"message_id": "true_911111111111@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"chat_id": "911111111111@c.us",
"performed_by": "api",
"status": "delivered",
"status_description": "Delivered to recipient.",
"message": {
"body": "Hello World",
"type": "chat",
"quoted_message_id": null
},
"timeline": {
"queued_at": "2026-01-15T09:30:00.000Z",
"sent_at": "2026-01-15T09:30:02.000Z",
"failed_at": null,
"processing_started_at": null
},
"attempts": 1,
"ack": 3,
"delivered_count": 1,
"read_count": 1
}{
"code": "ERROR",
"message": "The phone is off or its server is unreachable",
"status": 400
}{
"code": "UNAUTHORIZED_ERROR",
"message": "Invalid bearer auth token",
"status": 401
}{
"code": "NOT_FOUND_ERROR",
"message": "No job in the send queue matches unique_id",
"status": 404
}{
"code": "VALIDATION_ERROR",
"message": "Request validation failed",
"status": 422,
"fields": {
"body.chat_id": {
"message": "chat_id is required"
}
}
}{
"code": "RATE_LIMIT_ERROR",
"message": "You can only make 100 requests per second",
"status": 429
}{
"code": "UNKNOWN_ERROR",
"message": "Internal server error",
"status": 500
}Authorizations
Your Periskope API token, sent as Authorization: Bearer <token>. Generate one from the Periskope dashboard under Settings → API & Webhooks. API access requires an active Pro or Enterprise plan.
Headers
Optional. Phone to act with: country code + number without symbols or spaces (e.g. 911111111111), or a phone_id (phone-xxxxxxxxxxxx). Omit to let the API select an eligible phone automatically — within the token's phone scopes and connected; chat actions use a phone that has the chat (a group admin where required), message actions use the phone the message belongs to.
"919876543210"
Path Parameters
The unique_id of the queued message, returned by POST /message/send
1"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
Response
The queue job with delivery status
A message queue job enriched with the delivery acknowledgement of the resulting message
Id of the queue job
"00000000-0000-0000-0000-000000000000"
unique_id of the queued message — the value returned by POST /message/send
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
WhatsApp message_id assigned once the message was submitted. null while the job has not completed.
"true_911111111111@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
Chat the message is being sent to
"911111111111@c.us"
Who queued the message: a member's email, or 'api' when queued via the API
"api"
Current state of the job: one of queued, scheduled, sending, sent, pending, delivered, read, played, failed. Queue states (queued, scheduled, sending, failed) come from the send queue; once the job completed, the state reflects the delivery acknowledgement (sent, delivered, read, played — or pending/failed).
"delivered"
Human-readable explanation of the status
"Delivered to recipient."
The content of the queued message
Show child attributes
Show child attributes
Timestamps of the job lifecycle
Show child attributes
Show child attributes
Number of submission attempts made so far
1
Raw delivery acknowledgement level: -1 failed, 0 pending, 1 sent, 2/3 delivered, 4 read, 5 played. null while the message record has no acknowledgement yet.
3
Number of recipients the message was delivered to. Present only once at least one recipient received or read it.
1
Number of recipients who read the message. Present only once at least one recipient received or read it.
1
Was this page helpful?