> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rootly.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Problem Action Items API

> Create, update, list, and delete the action items that track work on a Rootly problem, including partial updates and error responses.

Use these endpoints to create, update, list, and delete the action items that track work on a problem.

> [!NOTE]
>
> **Beta** — Problem Management is enabled per organization. If it isn't enabled for yours, every endpoint on this page returns `404`. Contact your account team to request access.

Call these endpoints with an [API key](https://docs.rootly.com/api-reference/overview.md#how-to-generate-an-api-key). OAuth 2.0 access tokens are denied whatever their scope, including `ir.all` and `all`.

## Overview

An **action item** is a task on a [problem](https://docs.rootly.com/api-reference/problem-management/problems.md), such as a fix to ship or a follow-up to schedule. Action items are created and listed under their problem, and read, updated, and deleted by their own ID:

| Operation | Endpoint |
| - | - |
| Create an action item | `POST /v1/problems/{problem_id}/action_items` |
| List a problem's action items | `GET /v1/problems/{problem_id}/action_items` |
| List action items across problems | `GET /v1/problem_action_items` |
| Read one action item | `GET /v1/problem_action_items/{id}` |
| Update an action item | `PUT /v1/problem_action_items/{id}` |
| Delete an action item | `DELETE /v1/problem_action_items/{id}` |

Requests and responses use JSON:API with `Content-Type: application/vnd.api+json` and the `problem_action_items` resource type.

Access follows your role's **Problems** permissions: `read` to list and view action items, and `update` to create, update, and delete them. The user an action item is assigned to can also read and update it without those permissions.

***

## Creating an Action Item

```bash theme={null}
curl --request POST \
--header 'Content-Type: application/vnd.api+json' \
--header 'Authorization: Bearer YOUR-API-KEY' \
--url https://api.rootly.com/v1/problems/PROBLEM_ID/action_items \
--data '{
  "data": {
    "type": "problem_action_items",
    "attributes": {
      "summary": "Add jittered retries to the checkout client",
      "assigned_to_user_id": 1234,
      "priority": "high",
      "due_date": "2026-11-01"
    }
  }
}'
```

The response is `201` with the new action item.

### Fields

**summary** `string` *required*

Short description of the work.

**description** `string`

Longer details.

**assigned\_to\_user\_id** `integer`

The user responsible for the action item.

**priority** `string` (default: medium)

One of `high`, `medium`, or `low`.

**status** `string` (default: open)

One of `open`, `in_progress`, `cancelled`, or `done`.

**due\_date** `string`

When the action item is due, as an ISO 8601 date (`YYYY-MM-DD`).

**jira\_issue\_url** `string`

A Jira issue that tracks the same work. It must be an `https` URL that links to a single issue; anything else fails with `422`.

***

## Updating an Action Item

`PUT /v1/problem_action_items/{id}` is a partial update:

* Only the attributes you send are changed.
* Omitted attributes keep their current values. You don't need to send the whole action item.
* To clear a nullable attribute (`description`, `assigned_to_user_id`, `due_date`, or `jira_issue_url`), send it explicitly as `null`.

This request changes the summary and status, clears the Jira link, and leaves every other attribute as it was:

```bash theme={null}
curl --request PUT \
--header 'Content-Type: application/vnd.api+json' \
--header 'Authorization: Bearer YOUR-API-KEY' \
--url https://api.rootly.com/v1/problem_action_items/ACTION_ITEM_ID \
--data '{
  "data": {
    "type": "problem_action_items",
    "attributes": {
      "summary": "Updated action item summary",
      "status": "in_progress",
      "jira_issue_url": null
    }
  }
}'
```

The response is `200` with the full action item, including the attributes you didn't send:

```json theme={null}
{
  "data": {
    "id": "f060e2e1-18c2-4426-8996-c7d0893a1a09",
    "type": "problem_action_items",
    "attributes": {
      "problem_id": "aad84bd7-d322-42b0-8767-4119f6f4158c",
      "summary": "Updated action item summary",
      "description": "Deploy exponential backoff",
      "assigned_to_user_id": null,
      "assigned_to": null,
      "priority": "medium",
      "status": "in_progress",
      "due_date": null,
      "jira_issue_url": null,
      "created_by": null,
      "created_at": "2026-10-15T10:32:44.273-07:00",
      "updated_at": "2026-10-15T10:32:44.386-07:00"
    }
  }
}
```

### Update Errors

Every error uses the JSON:API `errors` array. A failed update saves nothing.

| Status | When | Example `title` |
| - | - | - |
| `401` | The API key is missing or invalid | `Invalid token` |
| `404` | The action item doesn't exist, belongs to another organization, or the caller can't update it. A caller without update access gets `404` rather than `403`, so the API doesn't reveal that the action item exists. | `Not found or unauthorized` |
| `422` | An attribute fails validation, for example a `status` outside the allowed values | `Status not_a_status is not a valid option` |

```json theme={null}
{ "errors": [{ "title": "Status not_a_status is not a valid option", "status": "422" }] }
```

***

## Listing Action Items

`GET /v1/problems/{problem_id}/action_items` lists one problem's action items. `GET /v1/problem_action_items` lists every action item you can access across problems, and accepts `problem_id` to narrow to one problem. Both are paginated with `page[number]` and `page[size]` and sorted newest first by default.

| Filter | Matches |
| - | - |
| `filter[search]` | Text search |
| `filter[status][eq]`, `[not_eq]`, `[in]`, `[not_in]` | Status |
| `filter[priority][eq]`, `[not_eq]`, `[in]`, `[not_in]` | Priority |
| `filter[assigned_to_user_id][eq]`, `[not_eq]`, `[in]`, `[not_in]` | Assignee |
| `filter[created_at][gt]`, `[gte]`, `[lt]`, `[lte]` | Creation date range |
| `filter[due_date][gt]`, `[gte]`, `[lt]`, `[lte]` | Due date range |

`sort` accepts `problem_id`, `status`, `priority`, `due_date`, `created_at`, and `updated_at`. Prefix with `-` for descending order.

***

## Errors

| Status | When |
| - | - |
| `401` | The API key is missing or invalid |
| `404` | The action item or problem doesn't exist, the caller can't access it, or Problem Management isn't enabled |
| `422` | An attribute fails validation |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.