RFC-79: Jira Cloud REST API Endpoints for Plans

RFCs are a way for Atlassian to share what we’re working on with our valued developer community.

It’s a document for building shared understanding of a topic. It expresses a technical solution, but can also communicate how it should be built or even document standards. The most important aspect of an RFC is that a written specification facilitates feedback and drives consensus. It is not a tool for approving or committing to ideas, but more so a collaborative practice to shape an idea and to find serious flaws early.

Please respect our community guidelines: keep it welcoming and safe by commenting on the idea not the people (especially the author); keep it tidy by keeping on topic; empower the community by keeping comments constructive. Thanks!

Project Summary

We’re introducing Jira Cloud REST API endpoints for Plans to allow Jira admins to programmatically manage plan configurations and their team configurations.

  • Publish: 18 December 2024
  • Discuss : 3 February 2025
  • Resolve : 3 March 2025

Problem

The Jira Cloud REST API currently doesn’t provide any endpoints for Plans. As a result, organizations face the following challenges:

  • High manual effort: As organizations grow, plan management becomes burdensome, particularly due to its current manual nature without any automation. Handling different facets of plans, such as their creation, updates, and configurations, is labor-intensive and susceptible to mistakes. This issue is exacerbated in large organizations that experience frequent changes.
  • Lack of automation: Without an API, project managers and admins can’t automate repetitive tasks related to plan management. This lack of automation leads to inefficiencies, affects their productivity, and increases their workload.
  • Scalability: As organizations grow, the complexity and volume of their plans increase. Managing this data at scale without an API can be cumbersome and hinder the scalability of their project management processes.

Proposed Solution

We’re introducing the following Jira Cloud REST API endpoints for Plans to allow Jira admins to programmatically manage plan configurations and their team configurations:

  • Plans:
    • Get plans paginated: GET /rest/api/{2|3|latest}/plans/planlink
    • Create plan: POST /rest/api/{2|3|latest}/plans/planlink
    • Duplicate plan: POST /rest/api/{2|3|latest}/plans/plan/{planId}/duplicatelink
    • Get plan: GET /rest/api/{2|3|latest}/plans/plan/{planId}link
    • Update plan: PUT /rest/api/{2|3|latest}/plans/plan/{planId}link
    • Trash plan: PUT /rest/api/{2|3|latest}/plans/plan/{planId}/trashlink
    • Archive plan: PUT /rest/api/{2|3|latest}/plans/plan/{planId}/archivelink
  • Teams in plan:
    • Get teams in plan paginated: GET /rest/api/{2|3|latest}/plans/plan/{planId}/teamlink
    • Create plan-only team: POST /rest/api/{2|3|latest}/plans/plan/{planId}/team/planonlylink
    • Add Atlassian team to plan: POST /rest/api/{2|3|latest}/plans/plan/{planId}/team/atlassianlink
    • Get plan-only team: GET /rest/api/{2|3|latest}/plans/plan/{planId}/team/planonly/{planOnlyTeamId}link
    • Get Atlassian team in plan: GET /rest/api/{2|3|latest}/plans/plan/{planId}/team/atlassian/{atlassianTeamId}link
    • Update plan-only team: PUT /rest/api/{2|3|latest}/plans/plan/{planId}/team/planonly/{planOnlyTeamId}link
    • Update Atlassian team in plan: PUT /rest/api/{2|3|latest}/plans/plan/{planId}/team/atlassian/{atlassianTeamId}link
    • Delete plan-only team: DELETE /rest/api/{2|3|latest}/plans/plan/{planId}/team/planonly/{planOnlyTeamId}link
    • Remove Atlassian team from plan: DELETE /rest/api/{2|3|latest}/plans/plan/{planId}/team/atlassian/{atlassianTeamId}link

Design Principles

We’ve designed the endpoints with the following principles in mind:

  • Only Plans entities: The endpoints only support CRUD operations for Plans entities, which makes them easy to use and performant and avoids overlap with existing Jira Cloud REST API endpoints. For example, the Get plan endpoint returns issue sources but not projects, filters, boards, or their issues.
  • Non-Plans entity references by ID: For the same reasons, the endpoints only reference non-Plans entities by ID. For example, the Create plan and Update plan endpoints accept a project ID, filter ID, or board ID to create an issue source.
  • JSON Patch: The Update plan, Update plan-only team, and Update Atlassian team in plan endpoints use JSON Patch to prevent accidentally deleting data and allow fine-grained modifications, which mitigates the coarse-grained nature of the Update plan endpoint. There is one caveat: add operations don’t adhere to array indexes in target locations to eliminate the need to delete and recreate data, which would result in additional database load. Call the Get plan, Get plan-only team, and Get Atlassian team in plan endpoints to find out the order of array elements.
  • No scenarios: The endpoints ignore scenarios and immediately save all changes, which makes them easy to use and performant and eliminates the need to introduce an additional endpoint that must be called after each call to the Update plan, Create plan-only team, Add Atlassian team to plan, Update plan-only team, and Update Atlassian team in plan endpoints.
  • Consistency with Plans: The endpoints are consistent with the Plans UI: they use the same names and do the same validation checks. For example, like the Plans UI, the Create plan and Update plan endpoints check that names aren’t longer than 255 characters.
  • Consistency with the Jira Cloud REST API: From a technical perspective, the endpoints are consistent with the existing Jira Cloud REST API endpoints. For example, the Update plan, Update plan-only team, and Update Atlassian team in plan endpoints require PUT instead of PATCH as HTTP request method.

Further Changes

We currently don’t plan to make any further changes, but we’ll consider refining the endpoints or adding new ones.

Asks

While we would appreciate any reactions you have to this RFC, we’re especially interested in learning more about:

  • Do you see any challenges that the endpoints fail to address?
  • Do you have any concerns about the endpoints?
  • How would you like us to refine the endpoints, and why?
  • Would you like us to make any other changes to the endpoints, and why?
  • Would you like us to introduce any other endpoints, and why?
1 Like
  1. Why is a PUT method being used to move the Plan to the trash? Other endpoints for moving things to the trash, such as Move custom field to trash use a POST method.

  2. Why is a PUT method being used to archive the Plan? Other endpoints for moving things to archive, such as Archive Project, use a POST method.

  3. The extra word in the request path /rest/api/[version]/plans/plan seems like pointless redundancy. Why not make it either just:
    /rest/api/[version]/plan , or
    /rest/api/[version]/plans
    so that the request paths are contextually consistent with the other API endpoint paths?

1 Like

It looks like these APIs have already been rolled out today. Is that for all instances?

The API Methods Added Today are:
:green-plus: /rest/api/3/plans/plan
:green-plus: /rest/api/3/plans/plan/{planId}
:green-plus: /rest/api/3/plans/plan/{planId}/archive
:green-plus: /rest/api/3/plans/plan/{planId}/duplicate
:green-plus: /rest/api/3/plans/plan/{planId}/team
:green-plus: /rest/api/3/plans/plan/{planId}/team/atlassian
:green-plus: /rest/api/3/plans/plan/{planId}/team/atlassian/{atlassianTeamId}
:green-plus: /rest/api/3/plans/plan/{planId}/team/planonly
:green-plus: /rest/api/3/plans/plan/{planId}/team/planonly/{planOnlyTeamId}
:green-plus: /rest/api/3/plans/plan/{planId}/trash

As already mentioned on JSWCLOUD-20360:

  • Please include required Connect scopes (it works, but the docs say “Connect apps cannot access this REST resource”)
  • Please make it work for legacy plans (which seems to be in progress already)

Thanks!

The detailed information about the team (Planning Style, Sprint Length, Capacity) is available only when querying an individual team. Would it be possible to add this information already when querying all teams, for example, with an additional parameter to request them?

1 Like