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

contactIdstring

Per-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.

emailstring

Work email. A durable person key.

namestring

Display name.

titlestring

Job title at this company.

phonestring

Phone number.

departmentstring

Department.

linkedinUrlstring

LinkedIn profile URL — the strongest durable person key (tried before email), and the one that survives a job change.

isExternalboolean

Accepted for backwards compatibility and IGNORED. ackDB is the sole authority on internal/external classification, via the deployment's internal domains + internal users.

identityLinksarray of

Source-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.

externalIdTypestringrequired
externalIdValuestringrequired
traitsarray of

Contact-grain trait values (trait definitions with scope 'contact').

Example

AckdbIngestContact 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
    }
  ]
}