Skip to content

List recurring work items ​

GET/api/v2/workspaces/{slug}/projects/{project_id}/recurring-work-items/

Return a project's recurring work item schedules as a paginated list, newest first. Each row carries the schedule and its blueprint as one flat object. Workspace-level blueprints in a governed workspace never appear here.

Path parameters ​

slug:requiredstring

The workspace slug. It appears in your Plane URLs. In https://app.plane.so/my-team/projects/, the slug is my-team.

project_id:requiredstring (uuid)

The project whose schedules you want to list.

Query parameters ​

Filters combine with AND. The API validates filter values, so an unknown interval_type or a malformed date returns 400 invalid_request instead of an empty list.

name:optionalstring

Return schedules whose blueprint name matches exactly, compared case-insensitively.

enabled:optionalboolean

true returns active schedules. false returns schedules Plane turned off itself, because a run found that the workspace's plan no longer includes recurring work items or because the blueprint's work item type was removed from the project.

interval_type:optionalstring

Return only schedules with this interval. One of daily, weekly, monthly, or yearly.

Use interval_type__in to match several, comma-separated: ?interval_type__in=weekly,monthly.

interval_count:optionalinteger

Return only schedules with this interval count.

start_at__gte:optionalstring (date-time)

Return schedules whose start_at is at or after this time. Pair it with start_at__lte for a range.

start_at__lte:optionalstring (date-time)

Return schedules whose start_at is at or before this time.

next_scheduled_at__gte:optionalstring (date-time)

Return schedules whose next run is at or after this time. Pair it with next_scheduled_at__lte to find the schedules due in a window, for example this week.

next_scheduled_at__lte:optionalstring (date-time)

Return schedules whose next run is at or before this time.

search:optionalstring

A search term matched against the blueprint name.

Ordering ​

order_by:optionalstring

Field to sort by. Prefix with - for descending. Defaults to -created_at.

  • created_at, -created_at
  • id, -id
  • start_at, -start_at
  • next_scheduled_at, -next_scheduled_at

Pagination ​

per_page:optionalinteger

Page size. Defaults to 50, maximum 200.

offset:optionalinteger

Number of rows to skip from the start of the result set. Maximum 10000. Use the next value from the response instead of computing offsets yourself.

paginate:optionalstring

Set to cursor to switch to the keyset envelope (no COUNT query), which returns next_cursor and has_more instead of next and total_count. Cursor pagination works with the default ordering and with created_at or id. Ordering by start_at or next_scheduled_at with a cursor returns 400 ordering_not_cursor_eligible.

count:optionalboolean

Defaults to true. Set to false to skip the COUNT(*) behind total_count. The response then omits total_count.

Response shaping ​

fields:optionalstring

Comma-separated list of fields to return on each row. Fields you don't request are left out of the response instead of coming back as null, so a missing key means you didn't ask for it and null means the value is null. id is always included, whether or not you name it.

Pass all to get every requestable field. An unknown field name returns 400 with the list of valid names and the closest match, so a typo is caught instead of being silently ignored.

Requestable here: assignee_ids, created_at, created_by_id, description_html, enabled, end_at, id, interval_count, interval_type, label_ids, last_run_at, module_ids, name, next_scheduled_at, priority, schedule_description, start_at, state_id, type_id, updated_at, updated_by_id, work_item_blueprint_id.

See Sparse fields.

Scopes ​

projects.recurring_work_items:read

Errors ​

StatusCodeCause
400invalid_requestA filter value failed validation, for example an unknown interval_type.
400ordering_not_cursor_eligible?paginate=cursor with order_by set to start_at or next_scheduled_at.
401unauthorizedMissing or invalid credentials.
402payment_requiredThe workspace's plan doesn't include recurring work items.
403forbiddenYour project role or token scope can't read recurring work items.
404not_foundNo such workspace or project, or it's outside your tenant.
406not_acceptableThe Accept header asks for a representation the API can't produce.
429rate_limitedThrottled. Honor the Retry-After header before retrying.
List recurring work items
bash
curl -X GET \
  "https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/recurring-work-items/?enabled=true&order_by=next_scheduled_at" \
  -H "X-Api-Key: $PLANE_API_KEY"
Response200
json
{
  "data": [
    {
      "id": "0b5e7d29-6a1c-4f83-9d42-8e3a1c6b5f70",
      "work_item_blueprint_id": "5c1f8a3e-2d7b-4e96-b0a4-7f3e1d9c6b28",
      "name": "Rotate on-call schedule",
      "description_html": "<p></p>",
      "priority": "high",
      "state_id": null,
      "type_id": null,
      "assignee_ids": [],
      "label_ids": [],
      "module_ids": [],
      "start_at": "2026-08-01T00:05:00Z",
      "end_at": null,
      "interval_type": "daily",
      "interval_count": 1,
      "next_scheduled_at": "2026-08-06T00:05:00Z",
      "last_run_at": "2026-08-05T00:06:41.902117Z",
      "enabled": true,
      "schedule_description": "Every day at 00:05",
      "created_at": "2026-07-30T14:02:19.330871Z",
      "updated_at": "2026-08-05T00:06:41.902117Z",
      "created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
      "updated_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430"
    },
    {
      "id": "f3a8c1d6-2e5b-4a79-8c04-1b7e9d6f2a53",
      "work_item_blueprint_id": "a9d2e6f1-7c3b-4085-b4e8-2f0c6a1d9e37",
      "name": "Weekly status report",
      "description_html": "<p>Summarize progress, risks, and next steps.</p>",
      "priority": "medium",
      "state_id": "2c4d16f8-9b3e-4a52-8d71-1f0e6c9a5b48",
      "type_id": null,
      "assignee_ids": ["16c61a3a-512a-48ac-b0be-b6b46fe6f430"],
      "label_ids": ["c1b8f3d6-9a44-4e12-8f7a-2b6d5c9e1a03"],
      "module_ids": [],
      "start_at": "2026-08-03T00:05:00Z",
      "end_at": "2026-12-31T23:59:59Z",
      "interval_type": "weekly",
      "interval_count": 1,
      "next_scheduled_at": "2026-08-10T00:05:00Z",
      "last_run_at": "2026-08-03T00:07:12.418520Z",
      "enabled": true,
      "schedule_description": "Every week on Monday at 00:05",
      "created_at": "2026-07-28T09:22:41.478363Z",
      "updated_at": "2026-08-03T00:07:12.418520Z",
      "created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
      "updated_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430"
    }
  ],
  "next": null,
  "previous": null,
  "total_count": 2,
  "pagination": {
    "style": "offset"
  }
}