import { PeriskopeApi } from '@periskope/periskope-client';
const client = new PeriskopeApi({
authToken: 'YOUR_API_KEY',
});
async function main() {
const response = await client.contacts.listContacts();
console.log(response);
}
main();curl -X GET 'https://api.periskope.app/v1/contacts' \
-H 'Authorization: Bearer YOUR_API_KEY'{
"from": 1,
"to": 20,
"count": 20,
"contacts": [
{
"org_id": "00000000-0000-0000-0000-000000000000",
"contact_id": "911111111111@c.us",
"contact_name": "John Doe",
"username": "jane.doe",
"contact_type": "user",
"is_wa_contact": true,
"is_my_contact": true,
"is_internal": false,
"is_imported": true,
"contact_image": "https://example.com/files/image.png",
"contact_color": "#DC2626",
"label_ids": {
"label-aaaaaaaaaaaa": true
},
"labels": [
"lead"
],
"chat_ids": [
"911111111111@c.us",
"120363000000000000@g.us"
],
"updated_at": "2026-01-15T09:30:00.000Z"
}
]
}{
"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
}Get Contacts
Returns a paginated list of contacts, ordered by name. Contacts are org-level — no x-phone header needed.
import { PeriskopeApi } from '@periskope/periskope-client';
const client = new PeriskopeApi({
authToken: 'YOUR_API_KEY',
});
async function main() {
const response = await client.contacts.listContacts();
console.log(response);
}
main();curl -X GET 'https://api.periskope.app/v1/contacts' \
-H 'Authorization: Bearer YOUR_API_KEY'{
"from": 1,
"to": 20,
"count": 20,
"contacts": [
{
"org_id": "00000000-0000-0000-0000-000000000000",
"contact_id": "911111111111@c.us",
"contact_name": "John Doe",
"username": "jane.doe",
"contact_type": "user",
"is_wa_contact": true,
"is_my_contact": true,
"is_internal": false,
"is_imported": true,
"contact_image": "https://example.com/files/image.png",
"contact_color": "#DC2626",
"label_ids": {
"label-aaaaaaaaaaaa": true
},
"labels": [
"lead"
],
"chat_ids": [
"911111111111@c.us",
"120363000000000000@g.us"
],
"updated_at": "2026-01-15T09:30:00.000Z"
}
]
}{
"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
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.
Query Parameters
Case-insensitive substring search across the contact number and contact name.
"hello"
Number of contacts to skip before the first returned contact. Use together with limit to paginate: page N is offset = N * limit. Defaults to 0.
x >= 00
Maximum number of contacts to return in one page. Defaults to 1000, capped at 2000.
1 <= x <= 2000100
Response
Paginated list of contacts
1-based index of the first record in this page (offset + 1).
1
1-based index of the last record in this page.
20
Number of records in this page — the length of the contacts array, not the total across all pages.
20
The contacts in this page.
Show child attributes
Show child attributes
Was this page helpful?