---
title: "Change several tasks at once"
method: POST
path: "/api/v1/rest/attivita/tasks/bulk"
tags: ["Activities"]
---

# Change several tasks at once

`POST /api/v1/rest/attivita/tasks/bulk`

## Request

- Base URL: `https://api.custodo.ai`
- URL: `https://api.custodo.ai/api/v1/rest/attivita/tasks/bulk`
- Auth: HTTP bearer

Applies ONE change to up to 200 tasks — the grid’s bulk bar, without its delete. `action` picks the change and takes only its own argument: `status` with `status` (a live key, as for attivita_set_status); `assign` with `assignee_user_id` and/or `assignee_team_id` (null clears); `due` with `due_at` (null clears the deadline); `list` with `list_id` (null takes the tasks out of their grouping); `priority` with `priority`. Only OPEN tasks the member behind this credential may bulk-edit change: without `attivita:manage`, the ones they created, that are assigned to them, or that are assigned to a colleague they currently stand in for. A task left alone is not an error — the answer counts what changed and lists every other id with its reason: `not_found` (no such task, or not one they may see), `closed` (done or cancelled; reopen it with attivita_set_status), `not_editable`, `unchanged` (already in that status) or `recurring_deadline` (a recurring task keeps the deadline it repeats from). Completing a recurring task creates its next occurrence, and people are told as for a single change. Idempotent: the same call twice changes nothing more.

## Headers

- `X-Tenant-Id` string, uuid

## Request body

- object
  - `ids` string[], required: The tasks, each once — ids from attivita_list_tasks.
  - `action` 'status' | 'assign' | 'due' | 'list' | 'priority', required: status | assign | due | list | priority
  - `status` string
  - `assignee_user_id` string, uuid, nullable
  - `assignee_team_id` string, uuid, nullable
  - `due_at` string, date-time, nullable: ISO 8601 with offset; null clears the deadline.
  - `list_id` string, uuid, nullable
  - `priority` 'low' | 'normal' | 'high'

## Response `200`

Done. `data` is the tool’s own answer.

- RestResult
  - `ok` true, required
  - `data` unknown, required

## Other responses

- `400`: The arguments did not validate: `error.message` names the field, what it expects and what arrived.
- `401`: No API key, or one that is malformed, unknown, revoked or expired.
- `403`: The call never ran: the module is off for this organisation, the credential lacks the permission or the module, the tier does not cover it, or the tool is destructive and the key was not minted for that.
- `409`: The record is in a state that does not allow it — under legal hold, already sent, already closed. `error.code` says which.
- `422`: The tool ran and refused, in a sentence of its own (`TOOL_REFUSED`): the message says what to change. Retrying the same call will not help.
- `429`: The API key has spent its minute, or its day. Every request a key makes counts. See `Retry-After`.

---

[API](https://skmtc.dev/custodo/apis/custodo-integrazioni.md) · [All operations](https://skmtc.dev/custodo/apis/custodo-integrazioni/llms.txt) · [OpenAPI document](https://skmtc.dev/custodo/apis/custodo-integrazioni/revisions/16d336d3ec2a?raw)
