Create a chat
Create an Extract chat thread.
Authorizations
Organisation API key from Settings → API / /api/keys/. The secret is
shown once. Send Authorization: Bearer sk-abacus-…. One active key
per organisation. Ingest (/api/v2/ingest/*) refuses API keys — that
surface is Auth0-only with ingest:read / ingest:write scopes.
Body
Body for POST /api/v2/chats/.
All fields optional — the minimal create is an empty body, which mints a
fresh extract-workspace chat with a default title.
Fields:
workflow_type: Extract workflow slug. Validated against the Extract
whitelist in the view (lazy import of
documents.chat_views.ALLOWED_EXTRACT_WORKFLOWS to avoid pulling
that heavy module into the serializer at import time). Unknown /
non-Extract values (e.g. document-intelligence or a retired
presentation-builder slug) are rejected with 400 — the chat surface
is Extract-only. Defaults to extract-workspace when omitted.
title: Optional chat title. When omitted the helper assigns the
default "New Chat — <date>".
batch_ids: Batches to pre-attach as LLM context. Each must be visible
to the caller via _visible_batch_qs — an invisible batch rolls
the whole create back (403, no orphan chat).
attachment_ids: Existing documents to LINK into the new chat
(Decision 8). Each must be visible via authz.policy.can_view_chat_attachment
— an invisible doc rolls the whole create back (403).
Extract workflow slug (extract-workspace / extract-batch-analysis / extract-excel-assist). Defaults to 'extract-workspace'. Non-Extract values are rejected with 400.
1 - 50Optional chat title; defaults to an auto-generated 'New Chat — '.
1 - 255Batch PKs to pre-attach as LLM context (must be visible to the caller).
x >= 1Existing document PKs to LINK into the new chat (must be visible to the caller).
x >= 1Response
Response shape for a single chat (list item AND detail).
A plain Serializer (not ModelSerializer) because the
*_count fields are queryset annotations, not model fields — the
view layers them on via
:func:deckmonkey.api_v2.chats.views._annotated_chat_qs (one query,
no per-row N+1). DRF reads each field as an attribute off the model
instance, so the annotations surface transparently alongside the
real columns.
Fields:
id / thread_id / title / workflow_type / created_at / updated_at /
is_active: straight off the Chat row.
message_count: ChatMessage rows in the thread.
batch_count: attached batches (ChatBatchAttachment join rows).
attachment_count: documents uploaded directly into this chat
(ChatAttachment rows whose chat is this chat).
linked_count: documents linked in from another chat
(ChatAttachmentLink rows) — Decision 8 LINK semantics.

