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

Return only running schedules (true) or only paused ones (false).

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.

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.

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. Read the next value from the response rather than computing offsets yourself.

paginate:optionalstring

Set to cursor to opt into the COUNT-free keyset envelope, 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. Unrequested keys are omitted from the response, not returned as null, so absent means "not requested" and null means "actually null". id always comes back whether or not you name it.

Pass all for every requestable field. An unknown name is a 400 that lists the valid set and suggests the closest match, so a typo can't silently cost you the saving.

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