ackDB

Attach a durable key

Scope-validated (person-scope types only), normalized (lowercased email / canonical LinkedIn), and first-writer-wins: a value owned by another human is 409 — the response names the owning person AND the merge_candidates row it just recorded, and nothing is written. Adding a SECOND linkedin_url to one person is also 409 + candidate (a slug change and two different humans look identical from here — a person decides). Re-adding a key the person already holds is an idempotent 200.

Email is a fallback anchor (#575). An email_address is added only when the person has NO linkedin_url anchor. A clean email on a linkedin-anchored person is DECLINED with 200 { data: null, suppressed: true, stored: false, reason } — this door has no contact edge, so the value is not stored anywhere (set it on a contact to keep it as contacts.email context). A conflict still wins first: an email owned by another human is 409 + candidate even on a linkedin-anchored person.

post/api/v1/ackdb/persons/{personId}/links

Request

  • Base URL
    http://localhost:3009
  • Auth
    HTTP bearer

Path parameters

personIdstring required

Person id (ULID = persons.person_id). A merged (tombstoned) id resolves to its survivor.

Request body

externalIdTypestring required
externalIdValuestring required
sourcestring

Source stamp on the key row. Defaults to "manual".

Example request

{
  "externalIdType": "linkedin_url",
  "externalIdValue": "https://www.linkedin.com/in/ellychen/"
}

Response

The person already held this key — nothing changed.

dataunknown required

Changes

No recorded changes to this operation across all 1 revision of this API.