Skip to content
API PlatformDevelopers
GET/v1/contacts/{contact_id}stable

Get a contact

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.

Returns one contact with every custom field value, tags, groups and when they last talked to you.

If part of the contact cannot be read right now, the answer still comes back with unavailable listing what is missing: profile_extras means starred, created_at, updated_at and web_visitor_id are null because they are unknown; conversations means the timeline is empty because it could not be read. Retry later for those parts.

Try it

Path

The contact id.

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

Code and response

curl -X GET 'https://mcp.wa-api.cloud/v1/contacts/48213' \
  -H "Authorization: Bearer $API_KEY"

The code reads your key from $API_KEY.

Parameters

Parameters
FieldTypeWhat it is
contact_idrequiredstring | integer · pathThe contact id.pattern ^[1-9]\d{0,18}$Signed in? Pick one from your data with “My data”.

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

The contact.

Response fields
FieldTypeWhat it is
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.

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.

404not_found

No contact with this id in your workspace.

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

Read one contact

Response 200

{
  "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",
  "attributes": [
    {
      "key": "order_count",
      "label": "Orders",
      "type": "number",
      "value": 4,
      "display": "4",
      "typed_value": 4
    }
  ],
  "last_activity_at": "2026-09-23T16:40:11Z",
  "whatsapp_user_id": null
}

Operation path

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