Skip to content

List contacts

List the contacts of a number, with filters and cursor pagination. Items come from the most recently updated to the oldest.

Each contact belongs to a number: {ref} is main (main number), the alias of an extra number or its id (num_…), and the same phone reached by two different numbers corresponds to two distinct contacts.

Endpoint

GET /v1/contacts?limit=20&cursor=<opaque>

For extra numbers: GET /v1/numbers/{ref}/contacts?limit=20&cursor=<opaque>

Required scope: contacts:read.

Query parameters

ParameterTypeDescription
limitint1 to 200 (default 50)
cursorstringOpaque token returned in cursor
phonestringExact match on an E.164 phone number. In the URL, write the + as %2B (phone=%2B5511988887777) or send digits only (phone=5511988887777): a bare + turns into a space and the filter finds nothing
namestringPartial match on the contact name
sourceenuminbound | outbound | self | mention: mention is a contact first seen because it was mentioned in a message; contacts created by a mention do not take a slot of the contact quota
contacted_in_cycleboolReturns only the contacts you talked to through Turbo Notify within the current billing cycle (new or returning). A send that did not reach WhatsApp does not count

Request example

Terminal window
curl -X GET "https://api.turbonotify.com/v1/contacts?limit=20" \
-H "Authorization: Bearer YOUR_KEY"

Only the contacts that took a slot of the current cycle’s quota:

Terminal window
curl -X GET "https://api.turbonotify.com/v1/contacts?contacted_in_cycle=true" \
-H "Authorization: Bearer YOUR_KEY"

Response (200)

HTTP status: 200
{
  "data": [
    {
      "id": "ct_a1b2c3d4e5f6789012345678901234ab",
      "number_alias": "main",
      "phone_number": "+5511988887777",
      "name": "João Silva",
      "is_self": false,
      "first_messaged_at": "2026-05-10T13:25:00Z",
      "last_interaction_at": "2026-05-10T13:42:00Z",
      "verified_on_whatsapp_at": "2026-05-10T13:25:00Z",
      "picture": {
        "kind": "unavailable",
        "reason": "peer_has_none"
      },
      "refresh": null,
      "created_at": "2026-05-10T13:25:00Z",
      "updated_at": "2026-05-10T13:42:00Z"
    }
  ],
  "cursor": "eyJpZCI6ImN0XzAxIn0=",
  "has_more": true
}

Each item is the same object returned by Detail, which explains each field. The phone_number is the full E.164 (unmasked). The contact has its own dates (created_at, updated_at, first_messaged_at and the others), which do not repeat the dates of an event.

See also: Detail · Errors.