# Bulk create contacts

You can bulk create contacts by submitting an array of contact objects. This is a **strict create** and never updates an existing contact.
The endpoint creates an async job that processes the items in the background. Use the returned job ID with `GET /contacts/bulk/{id}` to check the job status.
Only the fields listed in the request schema below can be set. Any other fields in a contact object are ignored.
If a contact already exists with the given `external_id` or `email` (including an archived contact), that item is rejected and the job's `state` ends as `completed_with_errors`. New contacts in the same request are still created. The job `state` from `GET /contacts/bulk/{id}` is the signal that one or more items were rejected.
Created contacts aren't returned with IDs in the response. Look them up afterwards with [Get a contact by External ID](/docs/references/preview/rest-api/api.intercom.io/contacts/showcontactbyexternalid) or [Search contacts](/docs/references/preview/rest-api/api.intercom.io/contacts/searchcontacts).
- Maximum of 100 contacts per request.
- You can append tasks to an existing job by including `job.id` in the request body.
- Tag application is best-effort and processed asynchronously: unknown tag IDs are skipped, and per-tag results are not returned in the job status.

Endpoint: POST /contacts/bulk
Version: Preview
Security: bearerAuth

## Header parameters:

  - `Intercom-Version` (string)

## Request fields (application/json):

  - `contacts` (array, required)
    An array of contact objects to create. Maximum 100 contacts per request.

  - `contacts.external_id` (string)
    A unique identifier for the contact which you have defined.
    Example: abc123

  - `contacts.email` (string)
    The contact's email address.
    Example: joe@example.com

  - `contacts.name` (string)
    The contact's name.
    Example: Joe Bloggs

  - `contacts.role` (string)
    The contact's role. One of `user` or `lead`. Leads are exempt from the uniqueness check described above.
    Example: user

  - `contacts.phone` (string)
    The contact's phone number.

  - `contacts.avatar` (string)
    An image URL containing the avatar of the contact.
    Example: https://www.example.com/avatar_image.jpg

  - `contacts.language_override` (string)
    A preferred language setting for the contact, used by the Intercom Messenger.
    Example: fr

  - `contacts.custom_attributes` (object)
    Custom attributes to set on the contact.

  - `contacts.signed_up_at` (integer)
    The time the contact signed up, in Unix timestamp format.

  - `contacts.last_seen_at` (integer)
    The time the contact was last seen, in Unix timestamp format.

  - `contacts.owner_id` (string)
    The ID of an admin that has been assigned account ownership of the contact.
    Example: 321

  - `contacts.unsubscribed_from_emails` (boolean)
    Whether the contact is unsubscribed from emails.
    Example: true

  - `contacts.companies` (array)
    A list of companies to associate with the contact. Each company is identified by the `company_id` you have defined. A company that does not exist is created, and one that already exists has the supplied attributes applied to it.

  - `contacts.companies.company_id` (string, required)
    The company ID you have defined for the company.
    Example: 6

  - `contacts.companies.name` (string)
    The name of the company.
    Example: Blue Sun

  - `contacts.tags` (object)
    Tags to add to the contact. Each tag is identified by its `id`, which must be a positive integer for a tag that already exists in your workspace. Tag application is best-effort: unknown tag IDs are skipped while the rest of the contact create still applies. Per-tag results are not yet returned in the job status.

  - `contacts.tags.add` (array)
    Tags to add to the contact.

  - `contacts.tags.add.id` (string, required)
    The ID of an existing tag to add to the contact.
    Example: 123

  - `job` (object)
    Optional. Include to append tasks to an existing job.

  - `job.id` (string)
    The ID of an existing bulk job to append to.
    Example: job_v2_1

## Response 202 fields (application/json):

  - `id` (string)
    The unique identifier for the bulk job.
    Example: job_v2_1

  - `type` (string)
    The type of the object.
    Enum: "contacts.bulk.job"

  - `state` (string)
    The current state of the job.
    Enum: "pending", "running", "completed", "completed_with_errors"

  - `created_at` (integer)
    The time the job was created as a Unix timestamp.
    Example: 1713360000

  - `updated_at` (integer)
    The time the job was last updated as a Unix timestamp.
    Example: 1713360060

  - `completed_at` (integer)
    The time the job completed as a Unix timestamp. Null if not yet completed.
    Example: 1713360120

  - `tasks` (array)
    The tasks that make up this bulk job.

  - `tasks.id` (string)
    The unique identifier for the task.
    Example: task_v2_1

  - `tasks.item_count` (integer)
    The number of items in this task.
    Example: 3

  - `tasks.state` (string)
    The current state of the task.
    Enum: "pending", "running", "completed", "completed_with_errors"

  - `tasks.created_at` (integer)
    The time the task was created as a Unix timestamp.
    Example: 1713360000

  - `tasks.started_at` (integer)
    The time the task started as a Unix timestamp. Null if not yet started.
    Example: 1713360060

  - `tasks.completed_at` (integer)
    The time the task completed as a Unix timestamp. Null if not yet completed.
    Example: 1713360120

  - `url` (string)
    The URL to check the job status.
    Example: https://api.intercom.io/contacts/bulk/job_v2_1

## Response 401 fields (application/json):

  - `type` (string, required)
    The type is error.list
    Example: error.list

  - `request_id` (string)
    Example: f93ecfa8-d08a-4325-8694-89aeb89c8f85

  - `errors` (array, required)
    An array of one or more error objects

  - `errors.code` (string, required)
    A string indicating the kind of error, used to further qualify the HTTP response code
    Example: unauthorized

  - `errors.message` (string)
    Optional. Human readable description of the error.
    Example: Access Token Invalid

  - `errors.field` (string)
    Optional. Used to identify a particular field or query parameter that was in error.
    Example: email

## Response 403 fields (application/json):

  - `type` (string, required)
    The type is error.list
    Example: error.list

  - `request_id` (string)
    Example: f93ecfa8-d08a-4325-8694-89aeb89c8f85

  - `errors` (array, required)
    An array of one or more error objects

  - `errors.code` (string, required)
    A string indicating the kind of error, used to further qualify the HTTP response code
    Example: unauthorized

  - `errors.message` (string)
    Optional. Human readable description of the error.
    Example: Access Token Invalid

  - `errors.field` (string)
    Optional. Used to identify a particular field or query parameter that was in error.
    Example: email

## Response 404 fields (application/json):

  - `type` (string, required)
    The type is error.list
    Example: error.list

  - `request_id` (string)
    Example: f93ecfa8-d08a-4325-8694-89aeb89c8f85

  - `errors` (array, required)
    An array of one or more error objects

  - `errors.code` (string, required)
    A string indicating the kind of error, used to further qualify the HTTP response code
    Example: unauthorized

  - `errors.message` (string)
    Optional. Human readable description of the error.
    Example: Access Token Invalid

  - `errors.field` (string)
    Optional. Used to identify a particular field or query parameter that was in error.
    Example: email

## Response 422 fields (application/json):

  - `type` (string, required)
    The type is error.list
    Example: error.list

  - `request_id` (string)
    Example: f93ecfa8-d08a-4325-8694-89aeb89c8f85

  - `errors` (array, required)
    An array of one or more error objects

  - `errors.code` (string, required)
    A string indicating the kind of error, used to further qualify the HTTP response code
    Example: unauthorized

  - `errors.message` (string)
    Optional. Human readable description of the error.
    Example: Access Token Invalid

  - `errors.field` (string)
    Optional. Used to identify a particular field or query parameter that was in error.
    Example: email

