---
title: "Upsert Contact"
method: POST
path: "/v1/contacts"
tags: ["contacts"]
---

# Upsert Contact

`POST /v1/contacts`

Create a contact, or update the matching one if it already exists.

The contact is matched inside your organization on `email` first, then
on `linkedin_url` (both normalized), so re-sending the same person is
safe and returns the same `id`. Fields you send overwrite the stored
values; fields you omit are left untouched. `201` is returned for both
the create and the update.

`company_domain` is what links the contact to an account — the account
(and its company) is created when it does not exist yet, and
`company_name` is only used for that creation. Sending `company_name`
alone does not link an account.

Requires the `contacts:write` scope on the API key.

## Request body

- UpsertContactPublicInput
  - `first_name` string, nullable — First name.
  - `last_name` string, nullable — Last name.
  - `email` string, nullable — Email. At least one of `email` or `linkedin_url` is required.
  - `linkedin_url` string, nullable — LinkedIn profile URL. At least one of `email` or `linkedin_url` is required.
  - `job_title` string, nullable — Job title.
  - `phone_number` string, nullable — Phone number.
  - `company_name` string, nullable — Employer name.
  - `company_domain` string, nullable — Employer's primary domain. Required to link the contact to an account.

## Response `201`

Successful Response

- PublicContactOutput
  - `id` string, uuid, required — Unique identifier of the contact.
  - `email` string, nullable — Email.
  - `first_name` string, nullable — First name.
  - `last_name` string, nullable — Last name.
  - `job_title` string, nullable — Job title.
  - `linkedin_url` string, nullable — LinkedIn profile URL.
  - `phone_number` string, nullable — Phone number.
  - `city` string, nullable — City.
  - `state` string, nullable — State.
  - `country` string, nullable — Country.
  - `profile_picture_url` string, nullable — Profile picture URL.
  - `company_name` string, nullable — Employer name.
  - `company_domain` string, nullable — Employer's primary domain.
  - `account_id` string, uuid, nullable — Account this contact is linked to. Use it with the Accounts endpoints.
  - `owner_user_id` string, uuid, nullable — User who owns this contact, if any.
  - `owner` PublicUserSummary
    - `id` string, uuid, required — Unique identifier of the user.
    - `name` string, nullable — Display name.
    - `email` string, required — Email address.
  - `first_seen_at` string, date-time, required — When this contact was first associated with the organization.
  - `last_seen_at` string, date-time, required — When this contact was last touched in the organization.

---

[API](https://skmtc.net/topo/apis/topo-public-api.md) · [All operations](https://skmtc.net/topo/apis/topo-public-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/topo/topo-public-api/versions/6e9ca9d5acac/schema)
