GET

Get plans paginatedExperimental

Returns a paginated list of plans.

Permissions required: Administer Jira global permission.

Data Security Policy: Exempt from app access rules
Scopes
read:jira-work

Connect app scope requiredADMIN

Request

Query parameters

includeTrashed

boolean

includeArchived

boolean

cursor

string

maxResults

integer

Responses

Returned if the request is successful.

application/json

PageWithCursorGetPlanResponseForPage
GET/rest/api/3/plans/plan
1 2 3 4 5 6 7 8 9 10 11 12 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; const response = await api.asUser().requestJira(route`/rest/api/3/plans/plan`, { headers: { 'Accept': 'application/json' } }); console.log(`Response: ${response.status} ${response.statusText}`); console.log(await response.json());
200Response
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 { "cursor": "", "isLast": true, "maxResults": 2, "nextPageCursor": "2", "total": 10, "values": [ { "id": "100", "issueSources": [ { "type": "Project", "value": 10000 } ], "name": "Plan 1", "status": "Active" }, { "id": "200", "issueSources": [ { "type": "Board", "value": 20000 } ], "name": "Plan 2", "status": "Trashed" } ] }
POST

Create planExperimental

Creates a plan.

Permissions required: Administer Jira global permission.

Data Security Policy: Exempt from app access rules
Scopes
write:jira-work

Connect app scope requiredADMIN

Request

Query parameters

useGroupId

boolean

Request bodyapplication/json

crossProjectReleases

array<CreateCrossProjectReleaseRequest>

customFields

array<CreateCustomFieldRequest>

exclusionRules

CreateExclusionRulesRequest

issueSources

array<CreateIssueSourceRequest>

Required
leadAccountId

string

name

string

Required
permissions

array<CreatePermissionRequest>

scheduling

CreateSchedulingRequest

Required

Responses

Returned if the request is successful.

application/json

integer

POST/rest/api/3/plans/plan
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; var bodyData = `{ "crossProjectReleases": [ { "name": "AB and BC merge", "releaseIds": [ 29, 39 ] } ], "customFields": [ { "customFieldId": 2335, "filter": true } ], "exclusionRules": { "issueIds": [ 2, 3 ], "issueTypeIds": [ 32, 33 ], "numberOfDaysToShowCompletedIssues": 50, "releaseIds": [ 42, 43 ], "workStatusCategoryIds": [ 22, 23 ], "workStatusIds": [ 12, 13 ] }, "issueSources": [ { "type": "Project", "value": 12 }, { "type": "Board", "value": 462 } ], "leadAccountId": "abc-12-rbji", "name": "ABC Quaterly plan", "permissions": [ { "holder": { "type": "AccountId", "value": "234-tgj-343" }, "type": "Edit" } ], "scheduling": { "dependencies": "Sequential", "endDate": { "type": "DueDate" }, "estimation": "Days", "inferredDates": "ReleaseDates", "startDate": { "type": "TargetStartDate" } } }`; const response = await api.asUser().requestJira(route`/rest/api/3/plans/plan`, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: bodyData }); console.log(`Response: ${response.status} ${response.statusText}`); console.log(await response.json());
GET

Get planExperimental

Returns a plan.

Permissions required: Administer Jira global permission.

Data Security Policy: Exempt from app access rules
Scopes
read:jira-work

Connect app scope requiredADMIN

Request

Path parameters

planId

integer

Required

Query parameters

useGroupId

boolean

Responses

Returned if the request is successful.

application/json

GetPlanResponse
GET/rest/api/3/plans/plan/{planId}
1 2 3 4 5 6 7 8 9 10 11 12 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; const response = await api.asUser().requestJira(route`/rest/api/3/plans/plan/{planId}`, { headers: { 'Accept': 'application/json' } }); console.log(`Response: ${response.status} ${response.statusText}`); console.log(await response.json());
200Response
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 { "crossProjectReleases": [ { "name": "x-plr", "releaseIds": [ 345 ] } ], "customFields": [ { "customFieldId": 34, "filter": false }, { "customFieldId": 39, "filter": true } ], "exclusionRules": { "issueIds": [ 1, 2 ], "issueTypeIds": [ 13, 23 ], "numberOfDaysToShowCompletedIssues": 50, "releaseIds": [ 14, 24 ], "workStatusCategoryIds": [ 12, 22 ], "workStatusIds": [ 11, 21 ] }, "id": 23, "issueSources": [ { "type": "Project", "value": 12 }, { "type": "Filter", "value": 10293 } ], "lastSaved": "2024-10-03T10:15:30Z", "leadAccountId": "628f5e86d5ec1f006ne7363x2s", "name": "Onset TBJ Plan", "permissions": [ { "holder": { "type": "AccountId", "value": "04jekw86d5jjje006ne7363x2s" }, "type": "Edit" } ], "scheduling": { "dependencies": "Concurrent", "endDate": { "dateCustomFieldId": 1098, "type": "DateCustomField" }, "estimation": "Hours", "inferredDates": "ReleaseDates", "startDate": { "type": "TargetStartDate" } }, "status": "Active" }
PUT

Update planExperimental

Updates any of the following details of a plan using JSON Patch.

  • name

  • leadAccountId

  • scheduling

    • estimation with StoryPoints, Days or Hours as possible values

    • startDate

      • type with DueDate, TargetStartDate, TargetEndDate or DateCustomField as possible values
      • dateCustomFieldId
    • endDate

      • type with DueDate, TargetStartDate, TargetEndDate or DateCustomField as possible values
      • dateCustomFieldId
    • inferredDates with None, SprintDates or ReleaseDates as possible values

    • dependencies with Sequential or Concurrent as possible values

  • issueSources

    • type with Board, Project or Filter as possible values
    • value
  • exclusionRules

    • numberOfDaysToShowCompletedIssues
    • issueIds
    • workStatusIds
    • workStatusCategoryIds
    • issueTypeIds
    • releaseIds
  • crossProjectReleases

    • name
    • releaseIds
  • customFields

    • customFieldId
    • filter
  • permissions

    • type with View or Edit as possible values

    • holder

      • type with Group or AccountId as possible values
      • value

Permissions required: Administer Jira global permission.

Note that "add" operations do not respect array indexes in target locations. Call the "Get plan" endpoint to find out the order of array elements.

Data Security Policy: Exempt from app access rules
Scopes
write:jira-work

Connect app scope requiredADMIN

Request

Path parameters

planId

integer

Required

Query parameters

useGroupId

boolean

Request bodyapplication/json-patch+json

object

Responses

Returned if the request is successful.

application/json

any

PUT/rest/api/3/plans/plan/{planId}
1 2 3 4 5 6 7 8 9 10 11 12 13 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; const response = await api.asUser().requestJira(route`/rest/api/3/plans/plan/{planId}`, { method: 'PUT', headers: { 'Accept': 'application/json' } }); console.log(`Response: ${response.status} ${response.statusText}`); console.log(await response.json());
PUT

Archive planExperimental

Archives a plan.

Permissions required: Administer Jira global permission.

Data Security Policy: Exempt from app access rules
Scopes
write:jira-work

Connect app scope requiredADMIN

Request

Path parameters

planId

integer

Required

Responses

Returned if the request is successful.

application/json

any

PUT/rest/api/3/plans/plan/{planId}/archive
1 2 3 4 5 6 7 8 9 10 11 12 13 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; const response = await api.asUser().requestJira(route`/rest/api/3/plans/plan/{planId}/archive`, { method: 'PUT', headers: { 'Accept': 'application/json' } }); console.log(`Response: ${response.status} ${response.statusText}`); console.log(await response.json());
POST

Duplicate planExperimental

Duplicates a plan.

Permissions required: Administer Jira global permission.

Data Security Policy: Exempt from app access rules
Scopes
write:jira-work

Connect app scope requiredADMIN

Request

Path parameters

planId

integer

Required

Request bodyapplication/json

name

string

Required

Responses

Returned if the request is successful.

application/json

integer

POST/rest/api/3/plans/plan/{planId}/duplicate
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; var bodyData = `{ "name": "Copied Plan" }`; const response = await api.asUser().requestJira(route`/rest/api/3/plans/plan/{planId}/duplicate`, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: bodyData }); console.log(`Response: ${response.status} ${response.statusText}`); console.log(await response.json());
PUT

Trash planExperimental

Moves a plan to trash.

Permissions required: Administer Jira global permission.

Data Security Policy: Exempt from app access rules
Scopes
write:jira-work

Connect app scope requiredADMIN

Request

Path parameters

planId

integer

Required

Responses

Returned if the request is successful.

application/json

any

PUT/rest/api/3/plans/plan/{planId}/trash
1 2 3 4 5 6 7 8 9 10 11 12 13 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; const response = await api.asUser().requestJira(route`/rest/api/3/plans/plan/{planId}/trash`, { method: 'PUT', headers: { 'Accept': 'application/json' } }); console.log(`Response: ${response.status} ${response.statusText}`); console.log(await response.json());

Rate this page: