---
title: "Import up to 1,000 contacts asynchronously"
method: POST
path: "/api/v1/imports/contacts"
tags: ["Jobs"]
---

# Import up to 1,000 contacts asynchronously

`POST /api/v1/imports/contacts`

## Request

- Base URL: `https://api.agendaforge.app`
- URL: `https://api.agendaforge.app/api/v1/imports/contacts`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Async job pattern: accepts the items, returns 202 Accepted immediately with a job id and statusUrl (also sent as the Location header), and processes the import in the background. Poll GET /api/v1/jobs/{id} until status is completed or failed; the job result carries created/failed counts and up to 50 per-item errors. Items behave exactly like single POST /api/v1/contacts requests.

## Headers

- `Idempotency-Key` string

## Request body

- ImportContactsRequest
  - `contacts` CreateContactRequest[], required
    - `type` string: speaker | sponsor | attendee | vendor | partner | exhibitor | other. Defaults to "attendee".
    - `firstName` string, required
    - `lastName` string, required
    - `email` string, email, required
    - `phone` string
    - `company` string
    - `jobTitle` string

## Response `202`

The job was accepted. Poll statusUrl (also in the Location header) for progress.

- ImportJobAccepted
  - `jobId` string, required: Opaque job id.
  - `type` 'contacts_import', required
  - `status` 'pending', required
  - `total` integer, required: Items accepted for processing.
  - `statusUrl` string, uri, required: Poll this URL (GET, same authentication) for progress.

## Other responses

- `400`: A required field is missing or invalid, an unknown event was supplied, or a referenced record is not owned by the key's organization.
- `401`: The API key is missing, malformed, invalid, expired, or revoked.
- `403`: The API key is valid but does not include the public_api scope. Create a key with the public_api scope in Settings > API Tokens.
- `404`: No such endpoint under /api/v1. The message lists the valid endpoints.
- `409`: The Idempotency-Key was already used on a different endpoint within the 24 hour retention window.
- `429`: The fixed window for this API key (120 requests per minute) or IP (30 per minute, unauthenticated) is exhausted. Wait Retry-After seconds and retry.
- `500`: An unexpected server failure. The body still follows the JSON error contract; retry with exponential backoff.
- `default`: Any other failure, including 404 NOT_FOUND for an unknown path and transient 5xx errors. Always the same JSON error contract.

---

[API](https://skmtc.dev/agendaforge/apis/agendaforge-public-rest-api.md) · [All operations](https://skmtc.dev/agendaforge/apis/agendaforge-public-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/agendaforge/apis/agendaforge-public-rest-api/revisions/b8956ce1e5f3?raw)
