Contacts

Create Contacts

Create a contact, optionally adding it to a list.

The contact is created independent of any list. When list_id is provided, the contact is added to that list AFTER it is created; when omitted, the contact is created standalone. A company is resolved and attached from company_domain when supplied.

Duplicate handling: when the submitted work_email / linkedin_url (or the deterministic identity hash) already matches an existing contact, the handler does NOT overwrite it — it writes nothing and skips the list_id linkage. This endpoint mirrors the in-app create and responds 409 Conflict with the matched contact_id and a field_diff under detail (rather than a misleading 201 success). The 409 is NOT cached under the Idempotency-Key, so a later create of the same identity is re-evaluated fresh. The 409 detail also carries hint, upsert and update, which name the idempotent create-or-update route PUT /contacts/assert and the PATCH /contacts/{id} for the matched contact. To create-or-update in one call, use PUT /contacts/assert.

Supports optional Stripe-style idempotency via the Idempotency-Key header — a safe retry of the same key replays the first SUCCESSFUL response (flagged Idempotent-Replay: true) rather than creating duplicate contacts.

post/contacts

Request

  • Base URL: https://be.graph8.com/api/v1
  • URL: https://be.graph8.com/api/v1/contacts
  • Auth: HTTP bearer

Headers

Idempotency-Keystring nullable

Optional. Retrying a create with the same key returns the first response instead of creating a duplicate (cached 24h). Omit for the existing non-idempotent behavior.

Authorizationstring nullable
X-Target-Org-Idstring nullable

Request body

list_idinteger nullable

Optional target list ID. When provided, the contact is added to this list after it is created; omit to create the contact without a list.

first_namestring nullable

Contact first name

last_namestring nullable

Contact last name

work_emailstring nullable

Work email address

personal_emailsstring nullable

Personal email addresses

direct_phonestring nullable

Direct phone number

mobile_phonestring nullable

Mobile phone number

job_titlestring nullable

Job title

job_departmentstring nullable

Department

seniority_levelstring nullable

Seniority level

linkedin_urlstring nullable

LinkedIn profile URL

citystring nullable

City

statestring nullable

State/Province

countrystring nullable

Country

company_domainstring nullable

Company domain for matching

company_idinteger nullable

Existing company id (mashup_companies.id) to attach

custom_fieldsobject nullable

Custom column values keyed by the column's display title (e.g. 'Followup 1'), its slug (e.g. 'udo_followup_1_ab12cd34'), or a case/space variant of the title. Keys matching no existing column are reported in the response's custom_fields.ignored unless create_missing_fields is true.

create_missing_fieldsboolean

When true, custom_fields keys that match no existing column are created as NEW custom columns (list-scoped when list_id is set) and then written.

Response

Successful Response

Changes

No recorded changes to this operation across all 3 revisions of this API.