---
title: "Create Contact"
method: POST
path: "/contacts"
tags: ["Contacts"]
---

# Create Contact

`POST /contacts`

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.

## Request body

- CreateContactRequest
  - `email` string, email
  - `linkedin_url` string, uri
  - `first_name` string
  - `last_name` string
  - `company` string
  - `title` string
  - `phone` string
  - `website` string
  - `custom` object
  - `TeamId` string, uuid, required
  - `CampaignId` string, uuid, required
  - `validate_emails` boolean — 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 `200`

Contact updated (existing contact)

- ContactResponse
  - `success` boolean
  - `request_id` string
  - `data` Contact
    - `id` string, uuid
    - `email` string, email
    - `first_name` string
    - `last_name` string
    - `company` string
    - `title` string
    - `linkedin_url` string, uri
    - `phone` string
    - `website` string
    - `interest` string — Contact status - interested, not_interested, meeting_request, meeting_booked, customer, future, follow_up
    - `finished` boolean
    - `deleted` boolean
    - `custom` object
    - `team_id` string, uuid
    - `campaign_id` string, uuid
    - `created_at` string, date-time
    - `updated_at` string, date-time

## Other responses

- `201` — Contact created
- `400` — Bad Request - Invalid parameters
- `401` — Unauthorized - Invalid or missing API key
- `402` — Not enough email verification credits
- `403` — Forbidden - Access denied

---

[API](https://skmtc.dev/supersend/apis/supersend-api.md) · [All operations](https://skmtc.dev/supersend/apis/supersend-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/supersend/supersend-api/revisions/f0cbeaa12643/schema)
