Skip to content

Server API: Contacts

Who a person is: Identify, erase and export, by your own id for them.

What it doesRoute
Erase a personDELETE /server/v1/contacts/{external_id}
Identify a personPUT /server/v1/contacts/{external_id}
Export a personGET /server/v1/contacts/{external_id}/export

DELETE /server/v1/contacts/{external_id}

Queues the erase of everything kept about the person, done within minutes. For 30 days afterwards nothing new is kept about that id (409 erased).

Needs: a server key (Authorization: Bearer crm_sk_…). See Connect your backend.

Parameters

NameInDescription
external_id (required)pathYour id for the person: 1 to 200 characters, the same id your users’ tokens carry as their subject.

Answers

StatusBodyMeaning
202noneQueued
400problemThe request could not be read: the problem names the field.
401problemNo credential, or one that is not right.
429problemToo many requests: wait for Retry-After.

PUT /server/v1/contacts/{external_id}

Makes or updates the contact with your id for them. Only what you send changes: a field left out keeps its value, and one sent empty (or an attribute sent null) clears it. Safe to send again.

Needs: a server key (Authorization: Bearer crm_sk_…). See Connect your backend.

Parameters

NameInDescription
external_id (required)pathYour id for the person: 1 to 200 characters, the same id your users’ tokens carry as their subject.

Body (application/json): Identify

FieldTypeDescription
attributesobject of anyThe app’s custom attributes, by name, each held to its definition: a string, a number, true or false, a date as 2026-09-27 or an RFC 3339 time, or a list of strings. Null removes the value. One PurrCRM computes is refused; one the app does not define is made on first sight, its type worked out, for review, unless the app’s strict data refuses it.
consentcrm.Consent
display_namestringWhat they are called, at most 100 characters.
emailstringTheir address, which PurrCRM sends email to.
languagestringTheir language as a BCP 47 tag (“en”, “en-GB”).
providerstringHow they sign in, in the app’s own word: apple, google, password, or any other of at most 40 characters.
signed_up_atstring (date-time)When they made their account.
time_zonestringTheir IANA zone (“Europe/London”).

Answers

StatusBodyMeaning
200IdentifyAnswerOK
400problemThe request could not be read: the problem names the field.
401problemNo credential, or one that is not right.
409problemRefused as things stand: the problem says why.
429problemToo many requests: wait for Retry-After.

GET /server/v1/contacts/{external_id}/export

Everything kept about the person, for your own subject-access export.

Needs: a server key (Authorization: Bearer crm_sk_…). See Connect your backend.

Parameters

NameInDescription
external_id (required)pathYour id for the person: 1 to 200 characters, the same id your users’ tokens carry as their subject.

Answers

StatusBodyMeaning
200ExportContactOK
400problemThe request could not be read: the problem names the field.
401problemNo credential, or one that is not right.
404problemNot found, or the part is switched off.
429problemToo many requests: wait for Retry-After.