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.ir.all and all.
Overview
A problem records the underlying cause behind one or more incidents and tracks the work to remove it. The Problems API covers the full lifecycle:
Requests and responses use JSON:API with
Content-Type: application/vnd.api+json and the problems resource type. Authentication, pagination, and filter syntax match the rest of the API; see the API overview. Action items and role assignments on a problem have their own endpoints; see Problem Action Items and Problem Roles.
Your role’s Problems permissions control access: read to list and view, create to create, update to edit, transition, and link incidents, and delete to delete.
Creating a Problem
POST /v1/problems creates a problem. Only title is required. The authenticated user is recorded as the creator and, when your organization has an enabled Problem Manager role, is assigned that role on the new problem.
201 with the new problem, including display_id (for example PROB-12) and url, a link to the problem in Rootly.
Fields
string
required
The problem’s title.
string
Longer description of the problem.
string
One of
P0, P1, P2, or P3.string
When the problem should be resolved, as an ISO 8601 date (
YYYY-MM-DD).string
What the investigation covers. Some statuses can require this field before a problem moves into them; see Changing Status.
string
What must be true for the problem to be considered resolved. Some statuses can require this field before a problem moves into them; see Changing Status.
string
The impact the problem has caused so far. Some statuses can require this field before a problem moves into them; see Changing Status.
string
The underlying cause, once identified. Some statuses can require this field before a problem moves into them; see Changing Status.
string
How the problem was resolved. Some statuses can require this field before a problem moves into them; see Changing Status.
string[]
Incidents to link when the problem is created. Every ID must be an incident the caller can read; test incidents can’t be linked. One unknown or inaccessible ID fails the request with
404.object[]
Values for your organization’s custom problem fields, one entry per field. Each entry needs a
form_field_id and either a value or the selected_*_ids array that matches the field:valueis for text, textarea, rich text, number, date, datetime, checkbox, and tags fields. Date and datetime values are ISO 8601 strings, numbers are numeric strings, checkboxes are"true"or"false", and tags are an array of strings.- Select, multi-select, and record fields use
selected_option_ids,selected_user_ids(integers),selected_group_ids,selected_service_ids,selected_functionality_ids,selected_catalog_entity_ids,selected_environment_ids,selected_cause_ids, orselected_incident_type_ids.
Updating a Problem
PUT /v1/problems/{id} changes only the attributes you send. Omitted attributes keep their current values, and an explicit null clears a nullable attribute. The nullable attributes are description, priority, due_date, scope, exit_criteria, impact_so_far, root_cause, resolution, deferral_reason, cancellation_reason, and next_review_at.
Updating Custom Field Values
Sendform_field_selections on PUT to change custom field values. Rootly matches each entry to the field’s existing value by form_field_id, so you don’t need the selection id. Fields you leave out keep their values.
- To change a value, send the field with its new
valueorselected_*_ids. - To clear a value, send a blank
valueor set_destroytotrue.
Changing Status
A problem moves throughcreated, in_progress, completed, deferred, and cancelled. To change it, send the target status in the same PUT request:
- Your organization’s status forms can require fields before a problem enters a status, for example a
resolutionbefore it is completed. Send those fields in the same request. - Other attributes in the request are saved together with the status change. If the transition is rejected, the API returns
422and none of the request is saved. expected_statusis optional. When you send it, the transition is rejected unless the problem is currently in that status, so two clients can’t both move the same problem.
string
Why the problem is deferred and the risk you’re accepting by not fixing it now.
string
When a deferred problem should be looked at again, as an ISO 8601 date and time, for example
2026-12-01T09:00:00Z. A date without a time is rejected. A timestamp without an offset is read in the caller’s time zone. Seconds are dropped, and the result must be later than the current time, otherwise the request fails with 422. When the time arrives, the problem moves back to created automatically.string
Why the problem is cancelled.
Linking Incidents
POST /v1/problems/{id}/incidents links one or more incidents. Send incident_id for one incident or incident_ids for several:
400. An incident the caller can’t read, or a test incident, returns 404.
DELETE /v1/problems/{id}/incidents/{incident_id} removes one incident from the problem and returns 404 if it isn’t linked.
Reading Custom Field Values
Problem responses include aform_field_selections array with every custom field value saved on the problem. Cleared values are left out. Each entry includes the form_field it belongs to, so you can match values by field slug instead of ID:
selected_*_ids array, empty when it doesn’t apply. Checkbox values come back as "1" (checked) or "0" (unchecked).
Setting Up Problem Fields and Forms
Custom problem fields and the forms they appear on are managed with the same endpoints as incident fields. Passproblem as the resource_type:
A problem field’s
kind is custom, or one of the built-in problem kinds: problem_services, problem_environments, problem_functionalities, or problem_teams. Posting a built-in kind your organization already has returns the existing field with 200. problem_environments and problem_functionalities need the matching environments or functionalities field turned on for your organization.
Problem fields go on these forms, which a problem form set accepts exclusively:
The four status forms hold the fields Rootly asks for on each transition. See Changing Status.
If your organization has no default problem form set yet, creating a problem field or a
problem form set sets one up with the standard fields, provided the API key can create form sets. Without Problem Management enabled, creating a problem field returns 422.
The Workflows API doesn’t manage problem workflows. They are left out of workflow lists, and requests for one return 403.
Listing Problems
GET /v1/problems is paginated with page[number] and page[size], and sorted newest first by default.
sort accepts title, status, priority, sequential_id, due_date, incidents_count, action_items_count, subscribers_count, users_assigned_count, created_at, and updated_at. Prefix with - for descending order. Sorting by incidents_count requires permission to read incidents and returns 400 without it.
Without permission to read incidents, the response also leaves out a problem’s linked incidents.
Errors
Errors use the JSON:APIerrors array: