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

# Bulk upload contacts

`POST /contacts/bulk`

## Request

- Base URL: `https://api.textla.com/v1`
- URL: `https://api.textla.com/v1/contacts/bulk`
- Auth: HTTP bearer

Forwards the request body to the Contacts Service bulk upsert for the authenticated account. The format is chosen by Content-Type: application/x-ndjson (one JSON object per line), application/json (top-level array), or text/csv (header row; tags/groups/keywords columns pipe-delimited). Returns the service's per-row ingest report; a 200 can include rejected rows — check the rejected count. Requires a user-scope token; tenant-admin tokens are rejected with 403.

## Query parameters

- `skip_existing` boolean: When true, rows whose phone already exists are left untouched and counted as duplicate
- `manually_added` 'true' | 'false': Provenance flag applied to every row; service default applies when omitted
- `file_id` string: Provenance file pointer applied to every row

## Request body

- string, binary

## Response `200`

OK

- BulkUpsertReport
  - `$schema` string, uri: A URL to the JSON Schema for this object.
  - `duplicate` integer, required
  - `errors` RejectedRecord[], nullable, required
    - `index` integer, required
    - `phone` string, required
    - `reason` string, required
  - `inserted` integer, required
  - `received` integer, required
  - `rejected` integer, required
  - `updated` integer, required

## Other responses

- `412`: Precondition Failed
- `default`: Error

---

[API](https://skmtc.dev/textla/apis/textla-api.md) - [All operations](https://skmtc.dev/textla/apis/textla-api/llms.txt) - [OpenAPI document](https://skmtc.dev/textla/apis/textla-api/revisions/473f03350bc1?raw)
