Creates or updates a CRM person using a unique attribute to find an existing match.
200 is returned.201 is returned.This is the recommended endpoint for bulk imports and sync jobs — send your full person payload and let the API decide whether to create or update.
Required scope: crm:write
curl --request PUT \
--url https://api.zeeg.me/v2/crm/people \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "Jane",
"lastName": "Doe",
"salutation": "<string>",
"emails": [
"jane.doe@acme.com"
],
"jobTitle": "<string>",
"description": "<string>",
"phoneNumber": "<string>",
"primaryLocation": "<string>",
"avatarUrl": "<string>",
"companyId": "<string>",
"socials": {
"linkedin": "<string>",
"twitter": "<string>",
"facebook": "<string>",
"instagram": "<string>"
}
}
'{
"success": true,
"status": 200,
"person": {
"id": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
"firstName": "Jane",
"lastName": "Doe",
"salutation": "Ms",
"emails": [
"jane.doe@acme.com"
],
"jobTitle": "Head of Product",
"description": "Key decision-maker at Acme Corp.",
"phoneNumber": "+4930123456789",
"primaryLocation": "Berlin, Germany",
"avatarUrl": null,
"company": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"domain": "<string>"
},
"socials": {
"linkedin": "https://linkedin.com/in/janedoe",
"twitter": null,
"facebook": null,
"instagram": null
},
"customAttributes": {},
"createdAt": "2025-01-15T09:00:00+00:00",
"updatedAt": "2025-06-01T12:00:00+00:00"
}
}Creates or updates a CRM person record using a unique attribute to find an existing match.Documentation Index
Fetch the complete documentation index at: https://developer.zeeg.me/llms.txt
Use this file to discover all available pages before exploring further.
matchingAttribute is found → it is updated and 200 is returned.201 is returned.matchingAttribute query parameter specifies which field to use for the lookup. It can be any standard or custom attribute slug on the people object.
PUT /v2/crm/people?matchingAttribute=email
PUT /v2/crm/people?matchingAttribute=phone_number
PUT /v2/crm/people?matchingAttribute=my_custom_attribute
matchingAttribute is email or emails, the lookup checks both the primary email and all secondary email addresses, so a person is found regardless of which email slot holds the value.
phone_number) and custom attributes are matched using exact equality.
{
"firstName": "Jane",
"lastName": "Doe",
"emails": ["jane.doe@acme.com"],
"jobTitle": "Head of Product",
"primaryLocation": "Berlin, Germany",
"socials": {
"linkedin": "https://linkedin.com/in/janedoe"
}
}
Attribute slug to use when searching for an existing person. Can be any standard or custom attribute slug.
Use email (or emails) to match against the person's primary email and secondary emails.
All other attributes are matched using an exact equality check.
First name. Required if lastName is not provided.
"Jane"
Last name. Required if firstName is not provided.
"Doe"
List of email addresses. The first entry is the primary (matching) email.
["jane.doe@acme.com"]
Updated — a person with the matching email was found and updated
true
200
A CRM person record.
Hide child attributes
Unique identifier for the person record.
"b2c3d4e5-f6a7-8901-bcde-f23456789012"
First name.
"Jane"
Last name.
"Doe"
Salutation or title (e.g. Mr, Ms, Dr).
"Ms"
List of email addresses. The first entry is the primary email.
["jane.doe@acme.com"]
Job title or role.
"Head of Product"
Free-text description or notes about the person.
"Key decision-maker at Acme Corp."
Primary phone number.
"+4930123456789"
Primary location or city.
"Berlin, Germany"
URL of the person's avatar image.
null
Key/value pairs for custom attributes defined on the people object.
{}
ISO 8601 timestamp when the record was created.
"2025-01-15T09:00:00+00:00"
ISO 8601 timestamp when the record was last updated.
"2025-06-01T12:00:00+00:00"
curl --request PUT \
--url https://api.zeeg.me/v2/crm/people \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "Jane",
"lastName": "Doe",
"salutation": "<string>",
"emails": [
"jane.doe@acme.com"
],
"jobTitle": "<string>",
"description": "<string>",
"phoneNumber": "<string>",
"primaryLocation": "<string>",
"avatarUrl": "<string>",
"companyId": "<string>",
"socials": {
"linkedin": "<string>",
"twitter": "<string>",
"facebook": "<string>",
"instagram": "<string>"
}
}
'{
"success": true,
"status": 200,
"person": {
"id": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
"firstName": "Jane",
"lastName": "Doe",
"salutation": "Ms",
"emails": [
"jane.doe@acme.com"
],
"jobTitle": "Head of Product",
"description": "Key decision-maker at Acme Corp.",
"phoneNumber": "+4930123456789",
"primaryLocation": "Berlin, Germany",
"avatarUrl": null,
"company": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"domain": "<string>"
},
"socials": {
"linkedin": "https://linkedin.com/in/janedoe",
"twitter": null,
"facebook": null,
"instagram": null
},
"customAttributes": {},
"createdAt": "2025-01-15T09:00:00+00:00",
"updatedAt": "2025-06-01T12:00:00+00:00"
}
}