Contacts

Create Contact

Creates a new contact or updates an existing one (upsert by email/LinkedIn), or creates/updates team contact profile only when CampaignId is omitted or null (no campaign enrollment row).

Campaign enrollment: When CampaignId is set, returns the created/updated contact (enrollment). Optional contact_profile_id seeds the enrollment from an existing profile; the profile must already have a ContactTeam row for the campaign's team.

Profile-only (no campaign): Omit CampaignId (or send null/empty). Requires TeamId and at least one of email or linkedin_url. Returns 201 with data.object: contact_profile and enrolled: false (no Contact row).

Flow: With CampaignId, the API upserts ContactProfile + ContactTeam for the team, then creates or updates the Contact (campaign enrollment). Without CampaignId, only the profile and team membership are upserted.

Email validation: Set validate_emails: true to queue deliverability verification when the contact profile is unvalidated or pending (valid2 -1 or 0). Already-validated profiles are not re-checked (no extra credits). Applies on create, update, and re-enroll. Default is false. Not applied on the profile-only path.

post/contacts

Request body

emailstring email
linkedin_urlstring uri
first_namestring
last_namestring
companystring
titlestring
phonestring
websitestring
customobject
TeamIdstring uuid required
CampaignIdstring uuid required
validate_emailsboolean

When true, runs email verification when the contact profile is unvalidated or pending (valid2 -1 or 0). Already-validated profiles are skipped (no extra credits). Default is false to avoid surprise billing. Applies on create, update, and re-enroll. Not applied on the profile-only path (omit CampaignId).

Response

Contact updated (existing contact)

successboolean
request_idstring

Example response

{
  "success": true,
  "request_id": "req_abc123def456"
}

Changes

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