---
title: "Create a contact"
method: POST
path: "/v1/contacts"
tags: ["Contacts"]
---

# Create a contact

`POST /v1/contacts`

## Request

- Base URL: `https://smtpfa.st/api`
- URL: `https://smtpfa.st/api/v1/contacts`
- Auth: HTTP bearer

Create one contact, or send { contacts: [...] } to create or update up to 500 at once. The single form returns 409 when the email already exists; the bulk form matches existing contacts by email and updates them. Supports firstName/lastName and first_name/last_name aliases for Resend compatibility.

## Request body

- union
  - CreateContactRequest
    - `email` string, email, required: The contact email address
    - `firstName` string
    - `lastName` string
    - `first_name` string
    - `last_name` string
    - `unsubscribed` boolean: Global broadcast subscription status
    - `properties` object
    - `segment_ids` string[]: Manual segment IDs to assign this contact to
  - CreateContactBatchRequest: Create or update up to 500 contacts, matched by email. Fields sent replace the stored ones; fields left out stay. segment_ids only adds memberships.
    - `contacts` CreateContactRequest[], required
      - `email` string, email, required: The contact email address
      - `firstName` string
      - `lastName` string
      - `first_name` string
      - `last_name` string
      - `unsubscribed` boolean: Global broadcast subscription status
      - `properties` object
      - `segment_ids` string[]: Manual segment IDs to assign this contact to
    - `segment_ids` string[]: Manual segments to add every contact to, for contacts that do not name their own

## Response `201`

Contact created. The bulk form returns the created and updated contacts as a list.

- union
  - ContactCreated
    - `object` string, required
    - `id` string, required
  - ContactBatchCreated
    - `object` string, required
    - `has_more` boolean, required
    - `data` ContactSummary[], required
      - `id` string, required
      - `email` string, email, required
      - `first_name` string, nullable
      - `last_name` string, nullable
      - `created_at` string, date-time, required
      - `unsubscribed` boolean, required
      - `disposable` boolean, required: The address is on a known throwaway-mailbox domain (set when the contact is created).
      - `suppressed` boolean, required: The address is on the suppression list
      - `segments` object[]: The manual segments the contact is in. Lists and GET /v1/contacts/{id} return it.
        - `id` string, required
        - `name` string, required
        - `color` string, nullable, required

## Other responses

- `400`: Bad request - check your payload
- `401`: Invalid or missing API key
- `402`: Plan limit reached - upgrade the plan to add more
- `403`: Forbidden - domain not verified or insufficient permissions
- `409`: Conflict - the resource already exists or changed meanwhile
- `429`: Rate limit exceeded - retry after the period indicated in the Retry-After header
- `500`: Internal server error

---

[API](https://skmtc.dev/smtpfa/apis/smtpfast-api.md) · [All operations](https://skmtc.dev/smtpfa/apis/smtpfast-api/llms.txt) · [OpenAPI document](https://skmtc.dev/smtpfa/apis/smtpfast-api/revisions/79dda742f53e?raw)
