---
title: "Complete Task"
method: POST
path: "/tasks/{task_id}/complete"
---

# Complete Task

`POST /tasks/{task_id}/complete`

Mark a task as done (or refused) from a worker terminal payload.

Structured payloads (``body.payload`` or a JSON object embedded in
``result_summary``) are validated against the worker completion
contract (#2244): an invalid payload is a typed ``contract_violation``
failure carrying the schema error path, and a validated refusal lands
the task in the terminal REFUSED state instead of DONE. Legacy prose
summaries are accepted unchanged.

If ``result_summary`` is empty the task is auto-transitioned to
``FAILED`` with ``reason='completion missing summary'`` and
a 422 is returned with the failed task payload so the client knows the
slot was released.

## Path parameters

- `task_id` string, required

## Request body

- TaskCompleteRequest — Body for POST /tasks/{task_id}/complete. ``result_summary`` is the legacy free-form summary and stays accepted unchanged. ``payload`` carries a structured terminal payload under the worker completion contract (#2244) - either a completion or a typed refusal - and is schema-validated at the API boundary; an invalid payload is a typed ``contract_violation`` failure, never a silent accept. When ``payload`` is provided, ``result_summary`` is ignored.
  - `result_summary` string
  - `payload` object, nullable

## Response `200`

Successful Response

- TaskResponse — Serialised task returned by every task endpoint.
  - `id` string, required
  - `title` string, required
  - `description` string, required
  - `role` string, required
  - `tenant_id` string, required
  - `priority` integer, required
  - `scope` string, required
  - `complexity` string, required
  - `eu_ai_act_risk` string, required
  - `approval_required` boolean, required
  - `risk_level` string, required
  - `estimated_minutes` integer, nullable, required
  - `status` string, required
  - `depends_on` string[], required
  - `parent_task_id` string, nullable, required
  - `depends_on_repo` string, nullable, required
  - `owned_files` string[], required
  - `assigned_agent` string, nullable, required
  - `result_summary` string, nullable, required
  - `cell_id` string, nullable, required
  - `repo` string, nullable, required
  - `task_type` string, required
  - `upgrade_details` object, nullable, required
  - `model` string, nullable, required
  - `effort` string, nullable, required
  - `cli` string, nullable
  - `batch_eligible` boolean
  - `completion_signals` object[]
  - `slack_context` object, nullable
  - `metadata` object
  - `created_at` number, required
  - `claimed_at` number, nullable
  - `completed_at` number, nullable
  - `closed_at` number, nullable
  - `deadline` number, nullable
  - `progress_log` ProgressEntry[]
    - `timestamp` number, required
    - `message` string, required
    - `percent` integer, required
  - `version` integer
  - `parent_session_id` string, nullable
  - `retry_count` integer
  - `max_retries` integer
  - `retry_delay_s` number
  - `terminal_reason` string, nullable
  - `max_output_tokens` integer, nullable
  - `meta_messages` string[]
  - `max_turns` integer, nullable

## Other responses

- `404` — Task not found
- `409` — Invalid state transition
- `422` — Empty result_summary or contract violation - task auto-failed

---

[API](https://skmtc.net/sipyourdrink-ltd/apis/bernstein-task-server.md) · [All operations](https://skmtc.net/sipyourdrink-ltd/apis/bernstein-task-server/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/sipyourdrink-ltd/bernstein-task-server/versions/86f514b4e920/schema)
