## Update or assign annotation tasks in bulk

**patch** `/v5/annotation-tasks/batch`

Update many annotation tasks in one request, operating in one of two mutually exclusive modes.

In ids mode, provide a list of task IDs together with an `assigned_to` and/or a `status`
(limited to `pending_redo` or `completed`) to apply those field changes to each listed task;
only tasks that currently exist are affected and IDs that do not resolve are silently skipped.
In audit_assignment mode, provide an evaluation ID, queue ID, and evaluation item IDs to assign
Level 1 and/or Level 2 auditors for those items, creating the underlying audit tasks when they do
not yet exist; a Level 2 auditor cannot be assigned unless a Level 1 auditor is already present.
Exactly one of `ids` or `audit_assignment` must be supplied, and `assigned_to`/`status` are only
valid in ids mode. Access and state checks run before any write, so the request is rejected as a
whole with nothing persisted if any task is inaccessible, if a status change is attempted without
a modification role, or if an already-completed task would be reassigned; audit assignment also
requires a modification role. Reassigning a task to a new user emits a task-start lineage event,
and the response returns the affected annotation tasks.

### Body Parameters

- `assigned_to: optional string`

- `audit_assignment: optional object { evaluation_id, evaluation_item_ids, queue_id, 2 more }`

  - `evaluation_id: string`

  - `evaluation_item_ids: array of string`

  - `queue_id: string`

  - `level_1_assigned_to: optional string`

  - `level_2_assigned_to: optional string`

- `ids: optional array of string`

- `status: optional "PENDING_REDO" or "COMPLETED"`

  - `"PENDING_REDO"`

  - `"COMPLETED"`

### Returns

- `items: array of AnnotationTask`

  - `id: string`

  - `evaluation_id: string`

  - `evaluation_item_id: string`

  - `priority: number`

  - `queue_id: string`

  - `status: "NOT_READY" or "PENDING" or "PENDING_REDO" or 2 more`

    - `"NOT_READY"`

    - `"PENDING"`

    - `"PENDING_REDO"`

    - `"COMPLETED"`

    - `"FIXED"`

  - `task_type: "EVALUATION_ANNOTATION" or "EVALUATION_AUDIT" or "CONTRIBUTOR_ANNOTATION" or "CONTRIBUTOR_AUDIT"`

    - `"EVALUATION_ANNOTATION"`

    - `"EVALUATION_AUDIT"`

    - `"CONTRIBUTOR_ANNOTATION"`

    - `"CONTRIBUTOR_AUDIT"`

  - `updated_at: string`

  - `assigned_to: optional string`

  - `assignment_expires_at: optional string`

  - `duration_seconds: optional number`

  - `flagged_for_review: optional boolean`

  - `object: optional "annotation_task"`

    - `"annotation_task"`

  - `review_comment: optional string`

- `object: optional "list"`

  - `"list"`

### Example

```http
curl https://api.egp.scale.com/v5/annotation-tasks/batch \
    -X PATCH \
    -H 'Content-Type: application/json' \
    -H "x-api-key: $SGP_API_KEY" \
    -d '{}'
```

#### Response

```json
{
  "items": [
    {
      "id": "id",
      "evaluation_id": "evaluation_id",
      "evaluation_item_id": "evaluation_item_id",
      "priority": 0,
      "queue_id": "queue_id",
      "status": "NOT_READY",
      "task_type": "EVALUATION_ANNOTATION",
      "updated_at": "2019-12-27T18:11:19.117Z",
      "assigned_to": "assigned_to",
      "assignment_expires_at": "2019-12-27T18:11:19.117Z",
      "duration_seconds": 0,
      "flagged_for_review": true,
      "object": "annotation_task",
      "review_comment": "review_comment"
    }
  ],
  "object": "list"
}
```
