Server API: Contacts
Who a person is: Identify, erase and export, by your own id for them.
| What it does | Route |
|---|---|
| Erase a person | DELETE /server/v1/contacts/{external_id} |
| Identify a person | PUT /server/v1/contacts/{external_id} |
| Export a person | GET /server/v1/contacts/{external_id}/export |
Erase a person
Section titled “Erase a person”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
| Name | In | Description |
|---|---|---|
external_id (required) | path | Your id for the person: 1 to 200 characters, the same id your users’ tokens carry as their subject. |
Answers
| Status | Body | Meaning |
|---|---|---|
| 202 | none | Queued |
| 400 | problem | The request could not be read: the problem names the field. |
| 401 | problem | No credential, or one that is not right. |
| 429 | problem | Too many requests: wait for Retry-After. |
Identify a person
Section titled “Identify a person”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
| Name | In | Description |
|---|---|---|
external_id (required) | path | Your id for the person: 1 to 200 characters, the same id your users’ tokens carry as their subject. |
Body (application/json): Identify
| Field | Type | Description |
|---|---|---|
attributes | object of any | The 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. |
consent | crm.Consent | |
display_name | string | What they are called, at most 100 characters. |
email | string | Their address, which PurrCRM sends email to. |
language | string | Their language as a BCP 47 tag (“en”, “en-GB”). |
provider | string | How they sign in, in the app’s own word: apple, google, password, or any other of at most 40 characters. |
signed_up_at | string (date-time) | When they made their account. |
time_zone | string | Their IANA zone (“Europe/London”). |
Answers
| Status | Body | Meaning |
|---|---|---|
| 200 | IdentifyAnswer | OK |
| 400 | problem | The request could not be read: the problem names the field. |
| 401 | problem | No credential, or one that is not right. |
| 409 | problem | Refused as things stand: the problem says why. |
| 429 | problem | Too many requests: wait for Retry-After. |
Export a person
Section titled “Export a person”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
| Name | In | Description |
|---|---|---|
external_id (required) | path | Your id for the person: 1 to 200 characters, the same id your users’ tokens carry as their subject. |
Answers
| Status | Body | Meaning |
|---|---|---|
| 200 | ExportContact | OK |
| 400 | problem | The request could not be read: the problem names the field. |
| 401 | problem | No credential, or one that is not right. |
| 404 | problem | Not found, or the part is switched off. |
| 429 | problem | Too many requests: wait for Retry-After. |