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
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
Response
The queue job with delivery status
A message queue job enriched with the delivery acknowledgement of the resulting message
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"
Was this page helpful?