AckdbIngestContact
One person to create or update at the resolved entity, pushed via IngestRequest.contacts. Resolution is person-first: durable keys (LinkedIn, then email, then person-scoped ids) find the human globally, then the affiliation edge at this company is found or created.
Properties
contactIdstringPer-entry pin (#397). Maps this entry to an EXISTING contact edge instead of resolving it from keys — the answer when the caller already knows who this is but the payload carries no durable key the stored edge shares (a contact known only by slack_user_id, arriving from a source that only has an email). A strict assertion, never a mint: the edge must exist and belong to the resolved entity (422 otherwise), and a creation-grade key on this entry that contradicts the pinned person is a 409 with a merge candidate — ackDB never fuses two humans on a guess. Omit it and the entry resolves normally. Distinct from IngestRequest.contactId, which pins the EVENT'S ACTOR; a request may legitimately carry both, naming different people.
emailstringWork email. A durable person key.
namestringDisplay name.
titlestringJob title at this company.
phonestringPhone number.
departmentstringDepartment.
linkedinUrlstringLinkedIn profile URL — the strongest durable person key (tried before email), and the one that survives a job change.
isExternalbooleanAccepted for backwards compatibility and IGNORED. ackDB is the sole authority on internal/external classification, via the deployment's internal domains + internal users.
identityLinksarray ofSource-specific ids for this person. Universal-registered person-scope types join the global match ladder; everything else is stamped on the edge and is match-only.
externalIdTypestringrequiredexternalIdValuestringrequiredtraitsarray ofContact-grain trait values (trait definitions with scope 'contact').
Example
{
"contactId": "01JQC7X8Y9Z0A1B2C3D4E5F6G7",
"email": "string",
"name": "string",
"title": "string",
"phone": "string",
"department": "string",
"linkedinUrl": "string",
"isExternal": false,
"identityLinks": [
{
"externalIdType": "slack_user_id",
"externalIdValue": "U07ABC123"
}
],
"traits": [
{
"traitKey": "slack_message_count",
"value": 42,
"op": "increment",
"workflow": "slack-ingestion",
"confidence": 1
}
]
}