# Annotation Tasks

## Update or assign annotation tasks in bulk

`client.AnnotationTasks.BatchUpdate(ctx, body) (*AnnotationTaskBatchUpdateResponse, error)`

**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.

### Parameters

- `body AnnotationTaskBatchUpdateParams`

  - `AssignedTo param.Field[string]`

  - `AuditAssignment param.Field[AnnotationTaskBatchUpdateParamsAuditAssignment]`

    - `EvaluationID string`

    - `EvaluationItemIDs []string`

    - `QueueID string`

    - `Level1AssignedTo string`

    - `Level2AssignedTo string`

  - `IDs param.Field[[]string]`

  - `Status param.Field[AnnotationTaskBatchUpdateParamsStatus]`

    - `const AnnotationTaskBatchUpdateParamsStatusPendingRedo AnnotationTaskBatchUpdateParamsStatus = "PENDING_REDO"`

    - `const AnnotationTaskBatchUpdateParamsStatusCompleted AnnotationTaskBatchUpdateParamsStatus = "COMPLETED"`

### Returns

- `type AnnotationTaskBatchUpdateResponse struct{…}`

  - `Items []AnnotationTask`

    - `ID string`

    - `EvaluationID string`

    - `EvaluationItemID string`

    - `Priority int64`

    - `QueueID string`

    - `Status AnnotationTaskStatus`

      - `const AnnotationTaskStatusNotReady AnnotationTaskStatus = "NOT_READY"`

      - `const AnnotationTaskStatusPending AnnotationTaskStatus = "PENDING"`

      - `const AnnotationTaskStatusPendingRedo AnnotationTaskStatus = "PENDING_REDO"`

      - `const AnnotationTaskStatusCompleted AnnotationTaskStatus = "COMPLETED"`

      - `const AnnotationTaskStatusFixed AnnotationTaskStatus = "FIXED"`

    - `TaskType AnnotationTaskTaskType`

      - `const AnnotationTaskTaskTypeEvaluationAnnotation AnnotationTaskTaskType = "EVALUATION_ANNOTATION"`

      - `const AnnotationTaskTaskTypeEvaluationAudit AnnotationTaskTaskType = "EVALUATION_AUDIT"`

      - `const AnnotationTaskTaskTypeContributorAnnotation AnnotationTaskTaskType = "CONTRIBUTOR_ANNOTATION"`

      - `const AnnotationTaskTaskTypeContributorAudit AnnotationTaskTaskType = "CONTRIBUTOR_AUDIT"`

    - `UpdatedAt Time`

    - `AssignedTo string`

    - `AssignmentExpiresAt Time`

    - `DurationSeconds int64`

    - `FlaggedForReview bool`

    - `Object AnnotationTaskObject`

      - `const AnnotationTaskObjectAnnotationTask AnnotationTaskObject = "annotation_task"`

    - `ReviewComment string`

  - `Object AnnotationTaskBatchUpdateResponseObject`

    - `const AnnotationTaskBatchUpdateResponseObjectList AnnotationTaskBatchUpdateResponseObject = "list"`

### Example

```go
package main

import (
  "context"
  "fmt"

  "github.com/scaleapi/sgp-dev-go"
  "github.com/scaleapi/sgp-dev-go/option"
)

func main() {
  client := sgpdev.NewClient(
    option.WithAPIKey("My API Key"),
    option.WithAccountID("My Account ID"),
  )
  response, err := client.AnnotationTasks.BatchUpdate(context.TODO(), sgpdev.AnnotationTaskBatchUpdateParams{

  })
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", response.Items)
}
```

#### 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"
}
```

## Domain Types

### Annotation Task

- `type AnnotationTask struct{…}`

  - `ID string`

  - `EvaluationID string`

  - `EvaluationItemID string`

  - `Priority int64`

  - `QueueID string`

  - `Status AnnotationTaskStatus`

    - `const AnnotationTaskStatusNotReady AnnotationTaskStatus = "NOT_READY"`

    - `const AnnotationTaskStatusPending AnnotationTaskStatus = "PENDING"`

    - `const AnnotationTaskStatusPendingRedo AnnotationTaskStatus = "PENDING_REDO"`

    - `const AnnotationTaskStatusCompleted AnnotationTaskStatus = "COMPLETED"`

    - `const AnnotationTaskStatusFixed AnnotationTaskStatus = "FIXED"`

  - `TaskType AnnotationTaskTaskType`

    - `const AnnotationTaskTaskTypeEvaluationAnnotation AnnotationTaskTaskType = "EVALUATION_ANNOTATION"`

    - `const AnnotationTaskTaskTypeEvaluationAudit AnnotationTaskTaskType = "EVALUATION_AUDIT"`

    - `const AnnotationTaskTaskTypeContributorAnnotation AnnotationTaskTaskType = "CONTRIBUTOR_ANNOTATION"`

    - `const AnnotationTaskTaskTypeContributorAudit AnnotationTaskTaskType = "CONTRIBUTOR_AUDIT"`

  - `UpdatedAt Time`

  - `AssignedTo string`

  - `AssignmentExpiresAt Time`

  - `DurationSeconds int64`

  - `FlaggedForReview bool`

  - `Object AnnotationTaskObject`

    - `const AnnotationTaskObjectAnnotationTask AnnotationTaskObject = "annotation_task"`

  - `ReviewComment string`
