POST /api/v1/partner/contacts
Creates a new contact or updates an existing one. A contact represents a person — a customer, client, patient, or borrower — that you intend to send a review request to. Contacts are matched for upsert in this order:external_id(if provided) — your own stable identifier for the record.email— if noexternal_idmatch is found, the API looks up by email address.
Authentication
x-api-key header — see Authentication.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Contact’s email address. Used for review request delivery and as a fallback upsert key. |
name | string | No | Contact’s full name. Used to personalize review request messages. |
professional_id | UUID | No | The eEndorsements professional this contact worked with. Scopes the review request to that professional. |
external_id | string | No | Your own stable identifier for this contact (e.g. a CRM record ID). Used for idempotent upserts — safe to call repeatedly with the same value. |
Example request
Example response
Contact object
| Field | Type | Description |
|---|---|---|
id | UUID | Unique eEndorsements contact identifier. Use this as contact_id when firing events. |
email | string | Contact’s email address. |
name | string | null | Contact’s full name. |
professional_id | UUID | null | The professional associated with this contact, if set. |
external_id | string | null | Your own identifier for this contact, if provided. |
created_at | ISO 8601 | Timestamp when the contact was first created. Not updated on subsequent upserts. |
Idempotency
Passing a consistentexternal_id makes this endpoint safe to call multiple times — for example, on every sync from your CRM. If the contact already exists, the response returns the existing record with any updated fields applied. The created_at timestamp always reflects the original creation time.
