Skip to content

identify_contact

Upsert a contact by your system’s user id. If a contact with external_user_id exists in this workspace, traits fill any null fields (admin-edited values stick); otherwise a new contact is inserted. Naturally idempotent: same payload, same final state. Prefer over create_contact when you control the external id.

required scope: read:write.

  • “every time my user logs in, call identify_contact with their plan and mrr so spirby’s customer list stays fresh.”
  • “on subscription change, identify the contact with the new plan tier.”
fieldtyperequirednotes
external_user_idstring (max 255 chars)yes
emailstring (max 320 chars)no
namestring (max 200 chars)no
planstring (max 100 chars)no
mrr_centsinteger (0-100,000,000)no
currencystring (regex)no
metadataobjectno
  • Identify never overwrites a trait with null — pass a real value to update; omit the key to leave it alone.
  • mrr_cents and currency must be paired — set both or omit both.
  • mrr_cents is capped at 100,000,000 ($1M); email capped at 320 characters; metadata may not exceed 100 keys.
  • Identify calls that only update last_seen_at (no trait changes) skip the contact.updated webhook to avoid flooding subscribers on every widget page load.

The contact row.