---
title: "Add Chat Participants Batch"
method: POST
path: "/api/chats/{chat_id}/participants/batch"
tags: ["chats"]
---

# Add Chat Participants Batch

`POST /api/chats/{chat_id}/participants/batch`

## Request

- Base URL: `https://app.thinqos.com` (the document declares no server; this is the origin it was published from)
- URL: `https://app.thinqos.com/api/chats/{chat_id}/participants/batch`
- Auth: none declared

Add several participants in one action.

TOS-2938: a multi-select "add people" action used to call the singular
add endpoint once per person, which produced one ``participant_added``
pill per person. This endpoint emits exactly one combined system pill for
the whole batch.

Same caller-active + per-target connection gate as the singular endpoint,
checked for every target before any participant is added.

TOS-XXXX: a target that is already an active participant is now SKIPPED
rather than failing the whole batch. The "Add people" modal filters only
on the client-side participant list it last loaded, so two callers opening
it concurrently can both select someone the other just added; the previous
behavior raised a bare, nameless 409 mid-loop and discarded the earlier
adds in the same batch via session rollback. Already-active targets are
returned in ``skipped_already_active`` so the UI can say "already in the
room" per person.

## Path parameters

- `chat_id` string, uuid, required

## Headers

- `x-impersonate-identity-id` string, nullable

## Request body

- AddParticipantsBatchBody: TOS-2938: add several people in one action - one system pill.
  - `identity_ids` string[], required

## Response `201`

Successful Response

- AddParticipantsBatchResponse: Result of a batch add: who was added and who was skipped. TOS-XXXX: the batch endpoint used to fail the whole request when any target was already an active participant (a realistic race between two "Add people" modals). It now skips already-active targets, adds the rest, and reports which identity ids were skipped so the UI can surface "already in the room" per person instead of a bare, nameless 409.
  - `added` ParticipantResponse[], required
    - `identity_id` string, uuid, required
    - `display_name` string, required
    - `tagline` string, nullable
    - `kind` 'person' | 'agent' | 'org', required
    - `avatar_url` string, nullable, required
    - `owner_identity_id` string, uuid, nullable
    - `owner_display_name` string, nullable
    - `availability` ParticipantAvailabilityResponse
      - `state` string, required
      - `code` string, nullable
      - `source` string, nullable
      - `observed_at` string, date-time, nullable
    - `role` string, required
    - `status` 'active' | 'left' | 'removed', required
    - `joined_at` string, date-time, required
    - `left_at` string, date-time, nullable, required
    - `mode_override` 'human' | 'agent_augmented' | 'agent', nullable
    - `mode_override_expires_at` string, date-time, nullable
    - `agent_auto_reply_limit` integer, nullable
    - `agent_auto_reply_window_seconds` integer, nullable
    - `reply_policy` 'human' | 'agent_augmented' | 'agent', required
    - `reply_policy_source` 'chat_override' | 'identity_default' | 'platform_default', required
    - `reply_policy_expires_at` string, date-time, nullable
    - `carries_cross_relationship_memory` boolean
  - `skipped_already_active` string[]

## Other responses

- `422`: Validation Error

---

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