> ## Documentation Index
> Fetch the complete documentation index at: https://docs.amplemarket.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create Contact

> Learn how to create contacts programmatically.

The Create Contact endpoint lets you create a contact in Amplemarket from your own data. Use it when you have a person — at minimum an email address — that you want to bring into Amplemarket and use in downstream flows, such as processing it through [Workflows](https://www.amplemarket.com/workflows).

Example flow:

1. You have a person's details (at least an email address)

2. You call `POST /contacts` with those details

3. Amplemarket creates the contact, optionally associating it to an account and an owner

4. You receive the created contact in the `201` response and can use it in downstream flows, for example running it through Workflows

## Create Contact Endpoint

This endpoint creates a single contact per request.

For specific API details, [please refer to the API specification](/api-reference/contacts/create-contact).

<Warning>
  This endpoint does **not** enrich the contact. Only the data you send in the payload is used. If you need to gather more information first, refer to the [People Search guide](https://docs.amplemarket.com/guides/people-search); to check an email before creating a contact, see the [Email Verification guide](https://docs.amplemarket.com/guides/email-verification).
</Warning>

### Request format

The request body is a single JSON object describing the contact.

```js theme={null}
POST /contacts HTTP/1.1
Authorization: Bearer {{API Key}}
Content-Type: application/json
```

```bash theme={null}
curl -X POST https://api.amplemarket.com/contacts \
  -H "Authorization: Bearer {{API Key}}" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "jane.doe@example.com",
    "first_name": "Jane",
    "last_name": "Doe",
    "title": "CEO"
  }'
```

The only required field is `email`, and it must be unique within your account: if a contact with the same email already exists, the request returns a `409 Conflict` instead of creating a duplicate. All other fields are optional, and every field except `phone_numbers` must be a `String`.

| Field            | Type   | Description                                                                   |
| ---------------- | ------ | ----------------------------------------------------------------------------- |
| `email`          | string | **Required.** The contact's email address. Must be unique within your account |
| `first_name`     | string | The contact's first name                                                      |
| `last_name`      | string | The contact's last name                                                       |
| `title`          | string | The contact's job title                                                       |
| `city`           | string | The contact's city                                                            |
| `state`          | string | The contact's state or region                                                 |
| `country`        | string | The contact's country                                                         |
| `industry`       | string | The contact's industry                                                        |
| `linkedin_url`   | string | The contact's LinkedIn profile URL                                            |
| `owner_email`    | string | Email of the Amplemarket user that should own the contact                     |
| `account_id`     | string | Public ID of an account to associate the contact to                           |
| `crm_account_id` | string | A CRM account identifier used to resolve the account association              |
| `company_domain` | string | A company domain used to resolve the account association                      |
| `company_name`   | string | A company name used to resolve the account association                        |
| `phone_numbers`  | array  | Phone numbers to attach to the contact (see [Phone numbers](#phone-numbers))  |

#### Associating the contact to an account

You can associate the new contact to an existing account using one of four fields. They are evaluated in the following priority order, and **only the first one present is used** — the others are ignored:

1. `account_id` — matched against the account's public ID
2. `crm_account_id` — matched against the linked CRM account identifier
3. `company_domain` — matched against the account's domain
4. `company_name` — matched against the account's name

<Warning>
  If the field you provide matches **no** account, or matches **more than one**, the request fails with a `400`. If you omit all four fields, the contact is created without an account association.
</Warning>

#### Assigning an owner

Use `owner_email` to assign the contact to a specific user. The email must match an active user in your Amplemarket account; otherwise the request fails with a `400`. If you omit `owner_email`, the contact is created without an owner.

<Note>
  The `owner_email` you provide must match an active user in your Amplemarket account — it is not an arbitrary email address.
</Note>

#### Phone numbers

`phone_numbers` is an array of objects. Each object supports:

| Field    | Type   | Description                                                                                                      |
| -------- | ------ | ---------------------------------------------------------------------------------------------------------------- |
| `number` | string | **Required** for each entry. The phone number, in a valid, parseable format (ideally E.164, e.g. `+12127365000`) |
| `kind`   | string | The kind of number: `mobile`, `office`, `phone`, `landline`, `voip`, `direct`, or `fax`                          |
| `type`   | string | An alias for `kind`                                                                                              |

<Warning>
  Each phone number is validated. If an entry has no `number`, or the `number` cannot be recognized as a valid phone number, the whole request fails with a `400` (`missing_field` or `invalid_parameter`) and the contact is not created. Send numbers in a valid, parseable format (ideally E.164, e.g. `+12127365000`).
</Warning>

### CRM behavior

If your account has an active CRM integration set up to push contacts, this endpoint always attempts to create a **new** contact in your CRM. It never links to, or imports, an existing CRM record.

<Warning>
  If the CRM push fails, the contact is **not** created — the request returns a `422` and nothing is persisted. Fix the CRM-side issue and retry.
</Warning>

### Request example

```json theme={null}
{
  "email": "jane.doe@example.com",
  "first_name": "Jane",
  "last_name": "Doe",
  "title": "CEO",
  "linkedin_url": "https://www.linkedin.com/in/jane-doe",
  "owner_email": "rep@yourcompany.com",
  "company_domain": "example.com",
  "phone_numbers": [
    { "number": "+1 212-736-5000", "kind": "mobile" }
  ]
}
```

### Response format

There are a few potential outcomes:

* The contact is created. The response will have status `201 Created` and the body is the created contact:

  ```json theme={null}
  {
    "id": "019f055d-8fb2-70f0-8bff-449354d1b3d2",
    "name": "Jane Doe",
    "first_name": "Jane",
    "last_name": "Doe",
    "linkedin_url": null,
    "email": "jane.doe@example.com",
    "time_zone": null,
    "location": null,
    "title": "CEO",
    "company_domain": "example.com",
    "company_name": "Example",
    "owner": "rep@yourcompany.com",
    "last_contacted_at": null,
    "phone_numbers": [
      {
        "id": "019f2864-54f2-737b-ab47-a328353c2355",
        "uploaded_id": "019f2864-54fd-76ac-a4e3-d4e2b36717e2",
        "object": "phone_number",
        "number": "+1 212-736-5000",
        "type": "mobile",
        "source": "uploaded_by_user",
        "is_wrong_number": false,
        "kind": "mobile"
      }
    ],
    "recent_activity": []
  }
  ```

* The request is malformed — for example, `email` is missing, or a field has the wrong type. The response will have status `400`, [following the standard error format](/api-reference/errors#error-object).

* A contact with the same email already exists. The response will have status `409` with the `conflict` error code.

* The request was well-formed but could not be completed — most commonly a CRM push failure. The response will have status `422`.

### Common errors and pitfalls

* **Missing or non-string fields**: every field except `phone_numbers` must be a `String`. Sending `null`, a number, or an object for a text field returns a `400` with a pointer to the offending field.
* **Account association that matches nothing (or too much)**: `account_id`, `crm_account_id`, `company_domain`, and `company_name` must each resolve to exactly one account. If you are getting `400`s here, confirm the value and remember that only the highest-priority field you send is used.
* **Unknown owner**: `owner_email` must be an active user in your account.
* **Invalid phone numbers**: every `phone_numbers` entry must include a `number` in a valid, parseable format. A missing or unrecognizable number returns a `400` and the contact is not created.
* **Duplicate emails**: creating the same email twice returns `409`, not a second contact.
* **CRM push failure**: if your account pushes contacts to a CRM, a CRM-side failure blocks creation with a `422`. In that configuration this endpoint behaves like a create-or-nothing operation, not a best-effort create.
