TypeScript
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.chats.listChatNotifications();
console.log(response);
}
main();curl -X GET 'https://api.periskope.app/v1/chats/notifications' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'x-phone: 919876543210'{
"from": 1,
"to": 20,
"count": 20,
"start_time": "2026-01-01T00:00:00Z",
"end_time": null,
"messages": [
{
"notification_id": "true_120363000000000000@g.us_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_911111111111@c.us_add",
"org_id": "00000000-0000-0000-0000-000000000000",
"org_phone": "911111111111@c.us",
"chat_id": "120363000000000000@g.us",
"author": "911111111111@c.us",
"body": null,
"type": "add",
"recipientids": [
"922222222222@c.us"
],
"id": {
"id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"fromMe": true,
"remote": "120363000000000000@g.us",
"serialized": "true_120363000000000000@g.us_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_911111111111@c.us_add"
},
"timestamp": "2026-01-15T09:30:00+00:00",
"unique_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"metadata": null,
"call_metadata": {
"recording": {
"provider": "gcs",
"bucket": "periskope-call-attachments",
"path": "00000000-0000-0000-0000-000000000000/phone-aaaaaaaaaaaaaaaa/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.wav",
"url": "https://api.periskope.app/app/media/periskope-call-attachments/00000000-0000-0000-0000-000000000000/phone-aaaaaaaaaaaaaaaa/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.wav?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"url_expires_at": "2026-01-15T10:30:00.000Z",
"duration_seconds": 184,
"channels": {
"left": "customer",
"right": "agents"
},
"agent_tracks": [],
"recorded_at": "2026-01-15T09:33:10.000Z",
"truncated": true
},
"answered_by": "agent@example.com",
"participants": [
{
"agent_id": "agent@example.com",
"role": "Host"
}
],
"transcript": {
"status": "done",
"utterances": []
},
"summary": {
"text": "The customer asked about a delayed order. The agent confirmed it ships tomorrow and shared the tracking link.",
"tags": []
}
}
}
]
}{
"code": "UNAUTHORIZED_ERROR",
"message": "Invalid bearer auth token",
"status": 401
}{
"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
}Chat APIs
List All Notifications
Returns group system events (participants added or removed, admin and setting changes) and call-log entries (type “call”) across all chats, newest first. Call entries carry downloadable recording links in call_metadata; the Calls endpoints return calls in a cleaner shape with filters.
TypeScript
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.chats.listChatNotifications();
console.log(response);
}
main();curl -X GET 'https://api.periskope.app/v1/chats/notifications' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'x-phone: 919876543210'{
"from": 1,
"to": 20,
"count": 20,
"start_time": "2026-01-01T00:00:00Z",
"end_time": null,
"messages": [
{
"notification_id": "true_120363000000000000@g.us_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_911111111111@c.us_add",
"org_id": "00000000-0000-0000-0000-000000000000",
"org_phone": "911111111111@c.us",
"chat_id": "120363000000000000@g.us",
"author": "911111111111@c.us",
"body": null,
"type": "add",
"recipientids": [
"922222222222@c.us"
],
"id": {
"id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"fromMe": true,
"remote": "120363000000000000@g.us",
"serialized": "true_120363000000000000@g.us_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_911111111111@c.us_add"
},
"timestamp": "2026-01-15T09:30:00+00:00",
"unique_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"metadata": null,
"call_metadata": {
"recording": {
"provider": "gcs",
"bucket": "periskope-call-attachments",
"path": "00000000-0000-0000-0000-000000000000/phone-aaaaaaaaaaaaaaaa/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.wav",
"url": "https://api.periskope.app/app/media/periskope-call-attachments/00000000-0000-0000-0000-000000000000/phone-aaaaaaaaaaaaaaaa/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.wav?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"url_expires_at": "2026-01-15T10:30:00.000Z",
"duration_seconds": 184,
"channels": {
"left": "customer",
"right": "agents"
},
"agent_tracks": [],
"recorded_at": "2026-01-15T09:33:10.000Z",
"truncated": true
},
"answered_by": "agent@example.com",
"participants": [
{
"agent_id": "agent@example.com",
"role": "Host"
}
],
"transcript": {
"status": "done",
"utterances": []
},
"summary": {
"text": "The customer asked about a delayed order. The agent confirmed it ships tomorrow and shared the tracking link.",
"tags": []
}
}
}
]
}{
"code": "UNAUTHORIZED_ERROR",
"message": "Invalid bearer auth token",
"status": 401
}{
"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
Query Parameters
Response
Paginated list of notifications, newest first (under the messages key)
Was this page helpful?