Most contact issues are duplicates, key scope, or plan limit.
Cause: email, phone, or external identifier already registered in the workspace.
What to do:
GET /v1/contacts with filter by email or phone
- Update with
PUT /v1/contacts/{id} instead of a new POST
- On import, use upsert mode if available
403 — No permission
Cause: API Key missing the required scope (contacts:read, contacts:create, etc.).
What to do: review API Key scopes and recreate or edit the key in the dashboard.
403 — PLAN_LIMIT_CRM
Cause: contact or CRM resource limit for the plan reached.
What to do: upgrade the plan or clean up obsolete contacts (per workspace policy).
400 — Invalid channel
Cause: channels with unsupported type or missing identifier (email without @, phone without country code).
What to do: normalize phone (E.164) and validate email before POST.
Cause: tagIds with wrong ID; topic only via preferences or specific field.
What to do:
- List tags:
GET /v1/tags
- Confirm
PUT with tagIds and contacts:update scope
- For topics, use the preferences link or opt-in flow documented in Topics
Empty timeline
Cause: new contact; events not yet synced; missing contacts:read on sub-resources.
What to do: send a test message; wait for webhook; check GET /v1/contacts/{id}/timeline.
Next steps