---
title: "Bulk Import Contacts"
method: POST
path: "/contacts/bulk"
tags: ["Contacts"]
---

# Bulk Import Contacts

`POST /contacts/bulk`

Import contacts in bulk via JSON array or CSV file upload.
Processing happens asynchronously - returns an upload ID for tracking.

**JSON Body:**
```json
{
  "contacts": [
    { "email": "john@example.com", "first_name": "John" },
    { "email": "jane@example.com", "first_name": "Jane" }
  ],
  "TeamId": "uuid",
  "CampaignId": "uuid"
}
```

**CSV Upload:**
Use `multipart/form-data` with:
- `contacts`: CSV file
- `TeamId`: Team UUID
- `CampaignId`: Campaign UUID
- `mapping_fields`: JSON mapping of CSV columns to contact fields
- `validate_emails`: Optional. Set to `true` to run email verification (consumes credits). Default `false`.

**Email Validation:**
Set `validate_emails: true` to queue verification for contacts in the import (consumes credits).
Default is false to avoid surprise billing. Applies to both JSON and CSV uploads. For single-contact
upsert (`POST /contacts`), already-validated profiles are not re-checked.

**Limits:**
- Maximum 50,000 contacts per request
- Subject to your organization's contact limit

## Request body

- BulkContactRequest
  - `contacts` object[], required — Array of contacts to import (max 50,000)
    - `email` string, email
    - `linkedin_url` string, uri
    - `first_name` string
    - `last_name` string
    - `company_name` string
    - `title` string
    - `phone` string
    - `city` string
    - `state` string
    - `country` string
    - `industry` string
    - `company_url` string, uri
    - `note` string
    - `one_liner` string
    - `custom` object
  - `TeamId` string, uuid, required — Team ID
  - `CampaignId` string, uuid, required — Campaign ID
  - `validate_emails` boolean — When true, queues email verification for contacts in the import (consumes credits). Default false to avoid surprise billing. Single-contact upsert via POST /contacts skips already-validated profiles.

## Response `202`

Upload accepted for processing

- BulkContactResponse
  - `success` boolean
  - `request_id` string
  - `data` object
    - `upload_id` string, uuid — Unique ID to track this upload
    - `status` 'pending' | 'processing' | 'completed' | 'failed' — Current processing status
    - `contact_count` integer — Number of contacts in the upload
    - `message` string — Status message

## Other responses

- `400` — Bad Request - Invalid parameters
- `401` — Unauthorized - Invalid or missing API key
- `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)
