Skip to content
API PlatformDevelopers
GET/v1/contactsstable

List contacts

Needs
Read your data (mcp:read)
Plan
Any plan with API access
Limits
300 a minute per key
Undo
Nothing to undo: this only reads.

Finds contacts in your workspace, newest first. Filter by text, tags, groups, starred or do-not-disturb. For custom fields, dates, assigned staff, broadcasts and saved filters use Search contacts (POST /contacts/search).

Use detail=full to include email, tags and groups on every row.

Try it

Query (9)

Name or phone contains this text.

Contacts in ANY of these groups.

Contacts with ANY of these tags (repeat the parameter).

`true` = starred contacts only.

`true` = do-not-disturb on; `false` = can receive broadcasts.

`true` = contacts in no group.

`summary` (default) or `full` (adds email, tags and groups).

How many items per page (1–100).

The `next_cursor` from the previous page. Cursors expire after 24 hours.

This only reads. It uses your real data and changes nothing.

Code and response

curl -X GET 'https://mcp.wa-api.cloud/v1/contacts?tag_ids=17&detail=full&limit=2' \
  -H "Authorization: Bearer $API_KEY"

The code reads your key from $API_KEY.

Parameters

Parameters
FieldTypeWhat it is
querystring · queryName or phone contains this text.1–100 characters
group_idsarray of string | integer · queryContacts in ANY of these groups.0–50 items
tag_idsarray of string | integer · queryContacts with ANY of these tags (repeat the parameter).0–50 itemsSigned in? Pick one from your data with “My data”.
starredboolean · querytrue = starred contacts only.
dndboolean · querytrue = do-not-disturb on; false = can receive broadcasts.
not_in_any_groupboolean · querytrue = contacts in no group.
detailstring · querysummary (default) or full (adds email, tags and groups).one of: summary, full · default "summary"
limitinteger · queryHow many items per page (1–100).1–100 · default 25
cursorstring · queryThe next_cursor from the previous page. Cursors expire after 24 hours.1–2048 characters

Headers

Headers
FieldTypeWhat it is
AuthorizationrequiredheaderBearer $API_KEY — your API key.
Api-VersionheaderThe API version to use, e.g. 2026-10-01. Default: the version your key is pinned to.one of: 2026-10-01 · pattern ^\d{4}-\d{2}-\d{2}$

Response 200

A page of contacts.

Response fields
FieldTypeWhat it is
datarequiredarray of object
idrequiredstring
namerequiredstring or null
phonerequiredstring or nullAs the platform shows it to this staff member: E.164 digits, or masked (e.g. "*******12345") when the workspace hides numbers from agents. Never unmasked here.
phone_maskedrequiredboolean
whatsapp_user_idrequiredstring or null
dndrequiredbooleanDo-not-disturb: the contact receives no broadcasts/marketing.
starredrequiredboolean or nullnull only when it could not be read this time (unavailable includes profile_extras).
created_atrequiredstring or null
updated_atrequiredstring or null
emailstring or null
web_visitor_idstring or null
tagsarray of object
idrequiredstring
namerequiredstring or null
groupsarray of object
idrequiredstring
namerequiredstring or null
attributesarray of objectEvery custom field value this staff member may see (manager-only fields are hidden from agents; deleted fields never appear), at most 100. Text values longer than 2000 characters are clipped.
keyrequiredstringThe custom field key (as in GET /v1/custom-fields).
labelrequiredstring or nullThe field label shown in the panel.
typerequiredstring or nulltext, textarea, number, int, float, decimal, email, phone, url, select, radio, multiselect, checkbox, boolean, date or datetime.
valuerequiredanyThe value as the panel shows it: text; checkbox/boolean "Yes"/"No"; date "YYYY-MM-DD"; datetime "YYYY-MM-DD HH:MM:SS" (UTC); multiselect "a, b"; int/float numbers; decimal a string with 8 decimals.
displayrequiredstring or nullvalue as text.
typed_valuerequiredstring | number | boolean | array of string or nullvalue typed by the field type: number/int/float/decimal → number; checkbox/boolean → true/false; date → "YYYY-MM-DD"; datetime → ISO-8601 UTC; multiselect → array of the chosen values; select/radio/text/… → string. null when empty or unreadable.
conversationsarray of objectNewest first (at most 10), a timeline summary; read messages with the inbox tools.
idrequiredstring
channel_idrequiredstring or null
staterequiredstring or null
assignedrequiredboolean
assigned_staff_idrequiredstring or null
created_atrequiredstring or null
last_activity_atrequiredstring or null
last_activity_atstring or nullLatest conversation activity (from the conversation list).
unavailablearray of stringPresent only when part of the contact could not be read this time (retry later for it): profile_extras = starred, createdAt, updatedAt and webVisitorId are null because they are unknown, not empty; conversations = the timeline (and lastActivityAt) is empty because it could not be read, not because there are none.
totalrequiredinteger or nullContacts matching the filters (all pages); with filter / savedFilterId / sort only on the first page.-9007199254740991–9007199254740991
approximateboolean or nulltrue when total is an estimate (advanced path).
resolved_datesarray of objectRelative or local dates in filter and the absolute instants they were run with.
pathrequiredstring
inputrequiredstring
valuerequiredstring
warningsarray of objectFilter conditions that may not mean what they look like: {path, message}.
pathstring
messagerequiredstring
next_cursorrequiredstring or nullPass as "cursor" to get the next page; null when there are no more results.

Errors

Errors are application/problem+json. Branch on code.

StatusCodeWhen
400invalid_input

A field is missing or has the wrong format. errors[] points at each field.

401unauthenticated

The Authorization header is missing, the key is unknown, expired or revoked.

403entitlement_required

The workspace's plan does not include API access (api_access).

403insufficient_scope

The key does not have the permission this operation needs.

429rate_limited

The key or workspace went over its rate limit. Wait for Retry-After seconds.

503upstream_unavailable

A service behind the API is briefly unavailable. Safe to retry with backoff.

Examples

VIP contacts with full detail

Response 200

{
  "data": [
    {
      "id": "48213",
      "name": "Jane Doe",
      "phone": "+15555550123",
      "phone_masked": false,
      "email": "jane@example.com",
      "dnd": false,
      "starred": false,
      "tags": [
        {
          "id": "17",
          "name": "vip"
        }
      ],
      "groups": [
        {
          "id": "5",
          "name": "Newsletter"
        }
      ],
      "created_at": "2026-09-20T08:14:03Z",
      "updated_at": "2026-09-23T16:40:11Z",
      "whatsapp_user_id": null
    }
  ],
  "next_cursor": "eyJ2IjoxLCJwIjoyfQ.c2ln",
  "total": 1
}

Operation path

The same operation is also at POST /v1/ops/crm_search_contacts, with every field in the JSON body.