• Announcement banner
  • App data policies (EAP)
  • Application roles
  • Audit records
  • Avatars
  • Classification levels
  • Dashboards
  • Filters
  • Filter sharing
  • Group and user picker
  • Groups
  • Issues
  • UI modifications (apps)
  • Issue attachments
  • Issue comments
  • Issue comment properties
  • Issue fields
  • Issue field configurations
  • Issue custom field contexts
  • Issue custom field options
  • Issue custom field options (apps)
  • Issue custom field values (apps)
  • Issue custom field configuration (apps)
  • Issue navigator settings
  • Issue notification schemes
  • Issue priorities
  • Issue properties
  • Issue resolutions
  • Issue security level
  • Issue security schemes
  • Issue types
  • Issue type schemes
  • Issue type screen schemes
  • Issue type properties
  • Issue votes
  • Issue watchers
  • Issue worklogs
  • Issue worklog properties
  • Jira expressions
  • Jira settings
  • JQL
  • JQL functions (apps)
  • Labels
  • License metrics
  • Myself
  • Permissions
  • Permission schemes
  • Projects
  • Project avatars
  • Project categories
  • Project classification levels
  • Project components
  • Project email
  • Project features
  • Project key and name validation
  • Project permission schemes
  • Project properties
  • Project roles
  • Project role actors
  • Project types
  • Project versions
  • Screens
  • Screen tabs
  • Screen tab fields
  • Screen schemes
  • Server info
  • Status
  • Tasks
  • Time tracking
  • Users
  • User properties
  • Webhooks
  • Workflows
  • Workflow transition rules
  • Workflow schemes
  • Workflow scheme project associations
  • Workflow scheme drafts
  • Workflow statuses
  • Workflow status categories
  • Workflow transition properties
  • App properties
  • Dynamic modules
  • App migration
  • Service Registry
Cloud
Jira Cloud platform / Reference / REST API v2

Issues

Postman Collection
OpenAPI
GET

Get eventsExperimental

Returns all issue events.

Permissions required: Administer Jira global permission.

Data Security Policy: Exempt from app access rules
Scopes

Connect app scope requiredADMIN

ClassicRECOMMENDED:manage:jira-configuration
Granular:read:issue-event:jira

Request

This request has no parameters.

Responses

Returned if the request is successful.

application/json

array<IssueEvent>

GET/rest/api/2/events
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/2/events`, { 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 [ { "id": 1, "name": "Issue Created" }, { "id": 2, "name": "Issue Updated" } ]
POST

Create issue

Creates an issue or, where the option to create subtasks is enabled in Jira, a subtask. A transition may be applied, to move the issue or subtask to a workflow step other than the default start step, and issue properties set.

The content of the issue or subtask is defined using update and fields. The fields that can be set in the issue or subtask are determined using the Get create issue metadata. These are the same fields that appear on the issue's create screen.

Creating a subtask differs from creating an issue as follows:

  • issueType must be set to a subtask issue type (use Get create issue metadata to find subtask issue types).
  • parent must contain the ID or key of the parent issue.

Permissions required: Browse projects and Create issues project permissions for the project in which the issue or subtask is created.

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredWRITE

ClassicRECOMMENDED:write:jira-work
Granular:write:issue:jira, write:comment:jira, write:comment.property:jira, write:attachment:jira, read:issue:jira

Request

Query parameters

updateHistory

boolean

Request bodyapplication/json

fields

object

historyMetadata

HistoryMetadata

properties

array<EntityProperty>

transition

IssueTransition

update

object

Additional Properties

any

Responses

Returned if the request is successful.

application/json

CreatedIssue

Details about a created issue or subtask.

POST/rest/api/2/issue
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 89 90 91 92 93 94 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; var bodyData = `{ "fields": { "assignee": { "id": "5b109f2e9729b51b54dc274d" }, "components": [ { "id": "10000" } ], "customfield_10000": "09/Jun/19", "customfield_20000": "06/Jul/19 3:25 PM", "customfield_30000": [ "10000", "10002" ], "customfield_40000": "Occurs on all orders", "customfield_50000": "Could impact day-to-day work.", "customfield_60000": "jira-software-users", "customfield_70000": [ "jira-administrators", "jira-software-users" ], "customfield_80000": { "value": "red" }, "description": "Order entry fails when selecting supplier.", "duedate": "2019-03-11", "environment": "UAT", "fixVersions": [ { "id": "10001" } ], "issuetype": { "id": "10000" }, "labels": [ "bugfix", "blitz_test" ], "parent": { "key": "PROJ-123" }, "priority": { "id": "20000" }, "project": { "id": "10000" }, "reporter": { "id": "5b10a2844c20165700ede21g" }, "security": { "id": "10000" }, "summary": "Main order flow broken", "timetracking": { "originalEstimate": "10", "remainingEstimate": "5" }, "versions": [ { "id": "10000" } ] }, "update": { "worklog": [ { "add": { "started": "2019-07-05T11:05:00.000+0000", "timeSpent": "60m" } } ] } }`; const response = await api.asUser().requestJira(route`/rest/api/2/issue`, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: bodyData }); console.log(`Response: ${response.status} ${response.statusText}`); console.log(await response.json());
201Response
1 2 3 4 5 6 7 8 9 10 11 12 { "id": "10000", "key": "ED-24", "self": "https://your-domain.atlassian.net/rest/api/2/issue/10000", "transition": { "status": 200, "errorCollection": { "errorMessages": [], "errors": {} } } }
PUT

Archive issue(s) by issue ID/keyExperimental

Enables admins to archive up to 1000 issues in a single request using issue ID/key, returning details of the issue(s) archived in the process and the errors encountered, if any.

Note that:

  • you can't archive subtasks directly, only through their parent issues
  • you can only archive issues from software, service management, and business projects

Permissions required: Jira admin or site admin: global permission

License required: Premium or Enterprise

Signed-in users only: This API can't be accessed anonymously.

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredWRITE

ClassicRECOMMENDED:write:jira-work
Granular:write:issue:jira

Request

Request bodyapplication/json

Contains a list of issue keys or IDs to be archived.

issueIdsOrKeys

array<string>

Responses

Returned if there is at least one valid issue to archive in the request. The return message will include the count of archived issues and subtasks, as well as error details for issues which failed to get archived.

application/json

IssueArchivalSyncResponse

Number of archived/unarchived issues and list of errors that occurred during the action, if any.

PUT/rest/api/2/issue/archive
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; var bodyData = `{ "issueIdsOrKeys": [ "PR-1", "1001", "PROJECT-2" ] }`; const response = await api.asUser().requestJira(route`/rest/api/2/issue/archive`, { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: bodyData }); 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 { "errors": { "issueIsSubtask": { "count": 3, "issueIdsOrKeys": [ "ST-1", "ST-2", "ST-3" ], "message": "Issue is subtask." }, "issuesInArchivedProjects": { "count": 2, "issueIdsOrKeys": [ "AR-1", "AR-2" ], "message": "Issue exists in archived project." }, "issuesInUnlicensedProjects": { "count": 3, "issueIdsOrKeys": [ "UL-1", "UL-2", "UL-3" ], "message": "Issues with these IDs are in unlicensed projects." }, "issuesNotFound": { "count": 3, "issueIdsOrKeys": [ "PR-1", "PR-2", "PR-3" ], "message": "Issue not found." } }, "numberOfIssuesUpdated": 10 }
POST

Archive issue(s) by JQLExperimental

Enables admins to archive up to 100,000 issues in a single request using JQL, returning the URL to check the status of the submitted request.

You can use the get task and cancel task APIs to manage the request.

Note that:

  • you can't archive subtasks directly, only through their parent issues
  • you can only archive issues from software, service management, and business projects

Permissions required: Jira admin or site admin: global permission

License required: Premium or Enterprise

Signed-in users only: This API can't be accessed anonymously.

Rate limiting: Only a single request per jira instance can be active at any given time.

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredWRITE

ClassicRECOMMENDED:write:jira-work
Granular:write:issue:jira

Request

Request bodyapplication/json

A JQL query specifying the issues to archive. Note that subtasks can only be archived through their parent issues.

jql

string

Responses

Returns the URL to check the status of the submitted request.

application/json

string

POST/rest/api/2/issue/archive
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 = `{ "jql": "project = FOO AND updated < -2y" }`; const response = await api.asUser().requestJira(route`/rest/api/2/issue/archive`, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: bodyData }); console.log(`Response: ${response.status} ${response.statusText}`); console.log(await response.json());
202Response
1 "https://your-domain.atlassian.net/rest/api/2/task/1010"
POST

Bulk create issue

Creates upto 50 issues and, where the option to create subtasks is enabled in Jira, subtasks. Transitions may be applied, to move the issues or subtasks to a workflow step other than the default start step, and issue properties set.

The content of each issue or subtask is defined using update and fields. The fields that can be set in the issue or subtask are determined using the Get create issue metadata. These are the same fields that appear on the issues' create screens.

Creating a subtask differs from creating an issue as follows:

  • issueType must be set to a subtask issue type (use Get create issue metadata to find subtask issue types).
  • parent the must contain the ID or key of the parent issue.

Permissions required: Browse projects and Create issues project permissions for the project in which each issue or subtask is created.

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredWRITE

ClassicRECOMMENDED:write:jira-work
Granular:write:issue:jira, write:comment:jira, write:comment.property:jira, write:attachment:jira, read:issue:jira

Request

Request bodyapplication/json

issueUpdates

array<IssueUpdateDetails>

Additional Properties

any

Responses

Returned if any of the issue or subtask creation requests were successful. A request may be unsuccessful when it:

  • is missing required fields.
  • contains invalid field values.
  • contains fields that cannot be set for the issue type.
  • is by a user who does not have the necessary permission.
  • is to create a subtype in a project different that of the parent issue.
  • is for a subtask when the option to create subtasks is disabled.
  • is invalid for any other reason.

application/json

CreatedIssues

Details about the issues created and the errors for requests that failed.

POST/rest/api/2/issue/bulk
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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; var bodyData = `{ "issueUpdates": [ { "fields": { "assignee": { "id": "5b109f2e9729b51b54dc274d" }, "components": [ { "id": "10000" } ], "customfield_10000": "09/Jun/19", "customfield_20000": "06/Jul/19 3:25 PM", "customfield_30000": [ "10000", "10002" ], "customfield_40000": "Occurs on all orders", "customfield_50000": "Could impact day-to-day work.", "customfield_60000": "jira-software-users", "customfield_70000": [ "jira-administrators", "jira-software-users" ], "customfield_80000": { "value": "red" }, "description": "Order entry fails when selecting supplier.", "duedate": "2019-03-11", "environment": "UAT", "fixVersions": [ { "id": "10001" } ], "issuetype": { "id": "10000" }, "labels": [ "bugfix", "blitz_test" ], "parent": { "key": "PROJ-123" }, "priority": { "id": "20000" }, "project": { "id": "10000" }, "reporter": { "id": "5b10a2844c20165700ede21g" }, "security": { "id": "10000" }, "summary": "Main order flow broken", "timetracking": { "originalEstimate": "10", "remainingEstimate": "5" }, "versions": [ { "id": "10000" } ] }, "update": { "worklog": [ { "add": { "started": "2019-07-05T11:05:00.000+0000", "timeSpent": "60m" } } ] } }, { "fields": { "assignee": { "id": "5b109f2e9729b51b54dc274d" }, "components": [ { "id": "10000" } ], "customfield_10000": "09/Jun/19", "customfield_20000": "06/Jul/19 3:25 PM", "customfield_30000": [ "10000", "10002" ], "customfield_40000": "Occurs on all orders", "customfield_50000": "Could impact day-to-day work.", "customfield_60000": "jira-software-users", "customfield_70000": [ "jira-administrators", "jira-software-users" ], "customfield_80000": { "value": "red" }, "description": "Order remains pending after approved.", "duedate": "2019-04-16", "environment": "UAT", "fixVersions": [ { "id": "10001" } ], "issuetype": { "id": "10000" }, "labels": [ "new_release" ], "parent": { "id": "10034" }, "priority": { "id": "20000" }, "project": { "id": "1000" }, "reporter": { "id": "5b10a2844c20165700ede21g" }, "security": { "id": "10000" }, "summary": "Order stuck in pending", "timetracking": { "originalEstimate": "15", "remainingEstimate": "5" }, "versions": [ { "id": "10000" } ] }, "update": {} } ] }`; const response = await api.asUser().requestJira(route`/rest/api/2/issue/bulk`, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: bodyData }); console.log(`Response: ${response.status} ${response.statusText}`); console.log(await response.json());
201Response
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 { "issues": [ { "id": "10000", "key": "ED-24", "self": "https://your-domain.atlassian.net/rest/api/2/issue/10000", "transition": { "status": 200, "errorCollection": { "errorMessages": [], "errors": {} } } }, { "id": "10001", "key": "ED-25", "self": "https://your-domain.atlassian.net/rest/api/2/issue/10001" } ], "errors": [] }
GET

Get create issue metadataDeprecated

Returns details of projects, issue types within projects, and, when requested, the create screen fields for each issue type for the user. Use the information to populate the requests in Create issue and Create issues.

Deprecated, see Create Issue Meta Endpoint Deprecation Notice.

The request can be restricted to specific projects or issue types using the query parameters. The response will contain information for the valid projects, issue types, or project and issue type combinations requested. Note that invalid project, issue type, or project and issue type combinations do not generate errors.

This operation can be accessed anonymously.

Permissions required: Create issues project permission in the requested projects.

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredREAD

ClassicRECOMMENDED:read:jira-work
Granular:read:issue-meta:jira, read:avatar:jira, read:field-configuration:jira

Request

Query parameters

projectIds

array<string>

projectKeys

array<string>

issuetypeIds

array<string>

issuetypeNames

array<string>

expand

string

Responses

Returned if the request is successful.

application/json

IssueCreateMetadata

The wrapper for the issue creation metadata for a list of projects.

GET/rest/api/2/issue/createmeta
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/2/issue/createmeta`, { 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 { "projects": [ { "avatarUrls": { "16x16": "https://your-domain.atlassian.net/secure/projectavatar?size=xsmall&pid=10000&avatarId=10011", "24x24": "https://your-domain.atlassian.net/secure/projectavatar?size=small&pid=10000&avatarId=10011", "32x32": "https://your-domain.atlassian.net/secure/projectavatar?size=medium&pid=10000&avatarId=10011", "48x48": "https://your-domain.atlassian.net/secure/projectavatar?pid=10000&avatarId=10011" }, "id": "10000", "issuetypes": [ { "description": "An error in the code", "fields": { "issuetype": { "allowedValues": [ "set" ], "autoCompleteUrl": "issuetype", "hasDefaultValue": false, "key": "issuetype", "name": "Issue Type", "required": true } }, "iconUrl": "https://your-domain.atlassian.net/images/icons/issuetypes/bug.png", "id": "1", "name": "Bug", "self": "https://your-domain.atlassian.net/rest/api/2/issueType/1", "subtask": false } ], "key": "ED", "name": "Edison Project", "self": "https://your-domain.atlassian.net/rest/api/2/project/ED" } ] }
GET

Get create metadata issue types for a project

Returns a page of issue type metadata for a specified project. Use the information to populate the requests in Create issue and Create issues.

This operation can be accessed anonymously.

Permissions required: Create issues project permission in the requested projects.

Data Security Policy: Exempt from app access rules
Scopes

Connect app scope requiredREAD

ClassicRECOMMENDED:read:jira-work
Granular:read:issue-meta:jira, read:avatar:jira, read:field-configuration:jira

Request

Path parameters

projectIdOrKey

string

Required

Query parameters

startAt

integer

maxResults

integer

Responses

Returned if the request is successful.

application/json

PageOfCreateMetaIssueTypes

A page of CreateMetaIssueTypes.

GET/rest/api/2/issue/createmeta/{projectIdOrKey}/issuetypes
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/2/issue/createmeta/{projectIdOrKey}/issuetypes`, { 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 { "issueTypes": [ { "description": "An error in the code", "iconUrl": "https://your-domain.atlassian.net/images/icons/issuetypes/bug.png", "id": "1", "name": "Bug", "self": "https://your-domain.atlassian.net/rest/api/2/issueType/1", "subtask": false } ], "maxResults": 1, "startAt": 0, "total": 1 }
GET

Get create field metadata for a project and issue type id

Returns a page of field metadata for a specified project and issuetype id. Use the information to populate the requests in Create issue and Create issues.

This operation can be accessed anonymously.

Permissions required: Create issues project permission in the requested projects.

Data Security Policy: Exempt from app access rules
Scopes

Connect app scope requiredREAD

ClassicRECOMMENDED:read:jira-work
Granular:read:issue-meta:jira, read:avatar:jira, read:field-configuration:jira

Request

Path parameters

projectIdOrKey

string

Required
issueTypeId

string

Required

Query parameters

startAt

integer

maxResults

integer

Responses

Returned if the request is successful.

application/json

PageOfCreateMetaIssueTypeWithField

A page of CreateMetaIssueType with Field.

GET/rest/api/2/issue/createmeta/{projectIdOrKey}/issuetypes/{issueTypeId}
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/2/issue/createmeta/{projectIdOrKey}/issuetypes/{issueTypeId}`, { 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 { "fields": [ { "fieldId": "assignee", "hasDefaultValue": false, "key": "assignee", "name": "Assignee", "operations": [ "set" ], "required": true } ], "maxResults": 1, "startAt": 0, "total": 1 }
GET

Get issue limit reportExperimental

Returns all issues breaching and approaching per-issue limits.

Permissions required: Administer Jira global permission.

Data Security Policy: Exempt from app access rules
Scopes

Connect app scope requiredREAD

ClassicRECOMMENDED:read:jira-work
Granular:read:project:jira, read:issue:jira

Request

Request bodyapplication/json

issuesApproachingLimitParams

object

Responses

Returned if the request is successful.

application/json

IssueLimitReportResponseBean
GET/rest/api/2/issue/limit/report
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; var bodyData = `{ "issuesApproachingLimitParams": {} }`; const response = await api.asUser().requestJira(route`/rest/api/2/issue/limit/report`, { headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: bodyData }); 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 { "issuesApproachingLimit": { "attachment": { "15070": 1822, "15111": 1999 }, "comment": { "10000": 4997, "15073": 4999, "15110": 5000 }, "remoteIssueLinks": { "15107": 2000 }, "worklog": { "15101": 4342 } }, "issuesBreachingLimit": { "attachment": { "15057": 2005, "15116": 2065, "15117": 3005 }, "comment": { "15055": 5202 }, "issuelinks": { "15058": 2120 }, "remoteIssueLinks": { "15059": 2094 }, "worklog": { "15056": 5085, "15169": 120864 } }, "limits": { "attachment": 2000, "comment": 5000, "issuelinks": 2000, "remoteIssueLinks": 2000, "worklog": 5000 } }
PUT

Unarchive issue(s) by issue keys/IDExperimental

Enables admins to unarchive up to 1000 issues in a single request using issue ID/key, returning details of the issue(s) unarchived in the process and the errors encountered, if any.

Note that:

  • you can't unarchive subtasks directly, only through their parent issues
  • you can only unarchive issues from software, service management, and business projects

Permissions required: Jira admin or site admin: global permission

License required: Premium or Enterprise

Signed-in users only: This API can't be accessed anonymously.

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredWRITE

ClassicRECOMMENDED:write:jira-work
Granular:write:issue:jira

Request

Request bodyapplication/json

Contains a list of issue keys or IDs to be unarchived.

issueIdsOrKeys

array<string>

Responses

Returned if there is at least one valid issue to unarchive in the request. It will return the count of unarchived issues, which also includes the count of the subtasks unarchived, and it will show the detailed errors for those issues which are not unarchived.

application/json

IssueArchivalSyncResponse

Number of archived/unarchived issues and list of errors that occurred during the action, if any.

PUT/rest/api/2/issue/unarchive
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; var bodyData = `{ "issueIdsOrKeys": [ "PR-1", "1001", "PROJECT-2" ] }`; const response = await api.asUser().requestJira(route`/rest/api/2/issue/unarchive`, { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: bodyData }); 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 { "errors": { "issueIsSubtask": { "count": 3, "issueIdsOrKeys": [ "ST-1", "ST-2", "ST-3" ], "message": "Issue is subtask." }, "issuesInArchivedProjects": { "count": 2, "issueIdsOrKeys": [ "AR-1", "AR-2" ], "message": "Issue exists in archived project." }, "issuesNotFound": { "count": 3, "issueIdsOrKeys": [ "PR-1", "PR-2", "PR-3" ], "message": "Issue not found." } }, "numberOfIssuesUpdated": 10 }
GET

Get issue

Returns the details for an issue.

The issue is identified by its ID or key, however, if the identifier doesn't match an issue, a case-insensitive search and check for moved issues is performed. If a matching issue is found its details are returned, a 302 or other redirect is not returned. The issue key returned in the response is the key of the issue found.

This operation can be accessed anonymously.

Permissions required:

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredREAD

ClassicRECOMMENDED:read:jira-work
Granular:read:issue-meta:jira, read:issue-security-level:jira, read:issue.vote:jira, read:issue.changelog:jira, read:avatar:jira ...(Show more)

Request

Path parameters

issueIdOrKey

string

Required

Query parameters

fields

array<string>

fieldsByKeys

boolean

expand

string

properties

array<string>

updateHistory

boolean

Responses

Returned if the request is successful.

application/json

IssueBean

Details about an issue.

GET/rest/api/2/issue/{issueIdOrKey}
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/2/issue/{issueIdOrKey}`, { 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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 { "fields": { "watcher": { "isWatching": false, "self": "https://your-domain.atlassian.net/rest/api/2/issue/EX-1/watchers", "watchCount": 1, "watchers": [ { "accountId": "5b10a2844c20165700ede21g", "active": false, "displayName": "Mia Krystof", "self": "https://your-domain.atlassian.net/rest/api/2/user?accountId=5b10a2844c20165700ede21g" } ] }, "attachment": [ { "author": { "accountId": "5b10a2844c20165700ede21g", "accountType": "atlassian", "active": false, "avatarUrls": { "16x16": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=16&s=16", "24x24": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=24&s=24", "32x32": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=32&s=32", "48x48": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=48&s=48" }, "displayName": "Mia Krystof", "key": "", "name": "", "self": "https://your-domain.atlassian.net/rest/api/2/user?accountId=5b10a2844c20165700ede21g" }, "content": "https://your-domain.atlassian.net/jira/rest/api/3/attachment/content/10001", "created": "2023-06-24T19:24:50.000+0000", "filename": "debuglog.txt", "id": 10001, "mimeType": "text/plain", "self": "https://your-domain.atlassian.net/rest/api/2/attachments/10001", "size": 2460 } ], "sub-tasks": [ { "id": "10000", "outwardIssue": { "fields": { "status": { "iconUrl": "https://your-domain.atlassian.net/images/icons/statuses/open.png", "name": "Open" } }, "id": "10003", "key": "ED-2", "self": "https://your-domain.atlassian.net/rest/api/2/issue/ED-2" }, "type": { "id": "10000", "inward": "Parent", "name": "", "outward": "Sub-task" } } ], "description": "Main order flow broken", "project": { "avatarUrls": { "16x16": "https://your-domain.atlassian.net/secure/projectavatar?size=xsmall&pid=10000", "24x24": "https://your-domain.atlassian.net/secure/projectavatar?size=small&pid=10000", "32x32": "https://your-domain.atlassian.net/secure/projectavatar?size=medium&pid=10000", "48x48": "https://your-domain.atlassian.net/secure/projectavatar?size=large&pid=10000" }, "id": "10000", "insight": { "lastIssueUpdateTime": "2021-04-22T05:37:05.000+0000", "totalIssueCount": 100 }, "key": "EX", "name": "Example", "projectCategory": { "description": "First Project Category", "id": "10000", "name": "FIRST", "self": "https://your-domain.atlassian.net/rest/api/2/projectCategory/10000" }, "self": "https://your-domain.atlassian.net/rest/api/2/project/EX", "simplified": false, "style": "classic" }, "comment": [ { "author": { "accountId": "5b10a2844c20165700ede21g", "active": false, "displayName": "Mia Krystof", "self": "https://your-domain.atlassian.net/rest/api/2/user?accountId=5b10a2844c20165700ede21g" }, "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque eget venenatis elit. Duis eu justo eget augue iaculis fermentum. Sed semper quam laoreet nisi egestas at posuere augue semper.", "created": "2021-01-17T12:34:00.000+0000", "id": "10000", "self": "https://your-domain.atlassian.net/rest/api/2/issue/10010/comment/10000", "updateAuthor": { "accountId": "5b10a2844c20165700ede21g", "active": false, "displayName": "Mia Krystof", "self": "https://your-domain.atlassian.net/rest/api/2/user?accountId=5b10a2844c20165700ede21g" }, "updated": "2021-01-18T23:45:00.000+0000", "visibility": { "identifier": "Administrators", "type": "role", "value": "Administrators" } } ], "issuelinks": [ { "id": "10001", "outwardIssue": { "fields": { "status": { "iconUrl": "https://your-domain.atlassian.net/images/icons/statuses/open.png", "name": "Open" } }, "id": "10004L", "key": "PR-2", "self": "https://your-domain.atlassian.net/rest/api/2/issue/PR-2" }, "type": { "id": "10000", "inward": "depends on", "name": "Dependent", "outward": "is depended by" } }, { "id": "10002", "inwardIssue": { "fields": { "status": { "iconUrl": "https://your-domain.atlassian.net/images/icons/statuses/open.png", "name": "Open" } }, "id": "10004", "key": "PR-3", "self": "https://your-domain.atlassian.net/rest/api/2/issue/PR-3" }, "type": { "id": "10000", "inward": "depends on", "name": "Dependent", "outward": "is depended by" } } ], "worklog": [ { "author": { "accountId": "5b10a2844c20165700ede21g", "active": false, "displayName": "Mia Krystof", "self": "https://your-domain.atlassian.net/rest/api/2/user?accountId=5b10a2844c20165700ede21g" }, "comment": "I did some work here.", "id": "100028", "issueId": "10002", "self": "https://your-domain.atlassian.net/rest/api/2/issue/10010/worklog/10000", "started": "2021-01-17T12:34:00.000+0000", "timeSpent": "3h 20m", "timeSpentSeconds": 12000, "updateAuthor": { "accountId": "5b10a2844c20165700ede21g", "active": false, "displayName": "Mia Krystof", "self": "https://your-domain.atlassian.net/rest/api/2/user?accountId=5b10a2844c20165700ede21g" }, "updated": "2021-01-18T23:45:00.000+0000", "visibility": { "identifier": "276f955c-63d7-42c8-9520-92d01dca0625", "type": "group", "value": "jira-developers" } } ], "updated": 1, "timetracking": { "originalEstimate": "10m", "originalEstimateSeconds": 600, "remainingEstimate": "3m", "remainingEstimateSeconds": 200, "timeSpent": "6m", "timeSpentSeconds": 400 } }, "id": "10002", "key": "ED-1", "self": "https://your-domain.atlassian.net/rest/api/2/issue/10002" }
PUT

Edit issue

Edits an issue. Issue properties may be updated as part of the edit. Please note that issue transition will be ignored as it is not supported yet.

The edits to the issue's fields are defined using update and fields. The fields that can be edited are determined using Get edit issue metadata.

The parent field may be set by key or ID. For standard issue types, the parent may be removed by setting update.parent.set.none to true.

Connect apps having an app user with Administer Jira global permission, and Forge apps acting on behalf of users with Administer Jira global permission, can override the screen security configuration using overrideScreenSecurity and overrideEditableFlag.

This operation can be accessed anonymously.

Permissions required:

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredWRITE

ClassicRECOMMENDED:write:jira-work
Granular:write:issue:jira

Request

Path parameters

issueIdOrKey

string

Required

Query parameters

notifyUsers

boolean

overrideScreenSecurity

boolean

overrideEditableFlag

boolean

returnIssue

boolean

expand

string

Request bodyapplication/json

fields

object

historyMetadata

HistoryMetadata

properties

array<EntityProperty>

transition

IssueTransition

update

object

Additional Properties

any

Responses

Returned if the request is successful and the returnIssue parameter is true

application/json

any

PUT/rest/api/2/issue/{issueIdOrKey}
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 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; var bodyData = `{ "fields": { "customfield_10000": "Investigation underway", "customfield_10010": 1, "summary": "Completed orders still displaying in pending" }, "historyMetadata": { "activityDescription": "Complete order processing", "actor": { "avatarUrl": "http://mysystem/avatar/tony.jpg", "displayName": "Tony", "id": "tony", "type": "mysystem-user", "url": "http://mysystem/users/tony" }, "cause": { "id": "myevent", "type": "mysystem-event" }, "description": "From the order testing process", "extraData": { "Iteration": "10a", "Step": "4" }, "generator": { "id": "mysystem-1", "type": "mysystem-application" }, "type": "myplugin:type" }, "properties": [ { "key": "key1", "value": "Order number 10784" }, { "key": "key2", "value": "Order number 10923" } ], "update": { "components": [ { "set": "" } ], "labels": [ { "add": "triaged" }, { "remove": "blocker" } ], "summary": [ { "set": "Bug in business logic" } ], "timetracking": [ { "edit": { "originalEstimate": "1w 1d", "remainingEstimate": "4d" } } ] } }`; const response = await api.asUser().requestJira(route`/rest/api/2/issue/{issueIdOrKey}`, { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: bodyData }); console.log(`Response: ${response.status} ${response.statusText}`); console.log(await response.json());
DEL

Delete issue

Deletes an issue.

An issue cannot be deleted if it has one or more subtasks. To delete an issue with subtasks, set deleteSubtasks. This causes the issue's subtasks to be deleted with the issue.

This operation can be accessed anonymously.

Permissions required:

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredDELETE

ClassicRECOMMENDED:write:jira-work
Granular:delete:issue:jira

Request

Path parameters

issueIdOrKey

string

Required

Query parameters

deleteSubtasks

string

Responses

Returned if the request is successful.

DEL/rest/api/2/issue/{issueIdOrKey}
1 2 3 4 5 6 7 8 9 10 // 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/2/issue/{issueIdOrKey}`, { method: 'DELETE' }); console.log(`Response: ${response.status} ${response.statusText}`); console.log(await response.text());
PUT

Assign issue

Assigns an issue to a user. Use this operation when the calling user does not have the Edit Issues permission but has the Assign issue permission for the project that the issue is in.

If name or accountId is set to:

  • "-1", the issue is assigned to the default assignee for the project.
  • null, the issue is set to unassigned.

This operation can be accessed anonymously.

Permissions required:

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredWRITE

ClassicRECOMMENDED:write:jira-work
Granular:write:issue:jira

Request

Path parameters

issueIdOrKey

string

Required

Request bodyapplication/json

The request object with the user that the issue is assigned to.

accountId

string

key

string

name

string

Responses

Returned if the request is successful.

application/json

any

PUT/rest/api/2/issue/{issueIdOrKey}/assignee
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 = `{ "accountId": "5b10ac8d82e05b22cc7d4ef5" }`; const response = await api.asUser().requestJira(route`/rest/api/2/issue/{issueIdOrKey}/assignee`, { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: bodyData }); console.log(`Response: ${response.status} ${response.statusText}`); console.log(await response.json());
GET

Get changelogs

Returns a paginated list of all changelogs for an issue sorted by date, starting from the oldest.

This operation can be accessed anonymously.

Permissions required:

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredREAD

ClassicRECOMMENDED:read:jira-work
Granular:read:issue-meta:jira, read:avatar:jira, read:issue.changelog:jira

Request

Path parameters

issueIdOrKey

string

Required

Query parameters

startAt

integer

maxResults

integer

Responses

Returned if the request is successful.

application/json

PageBeanChangelog

A page of items.

GET/rest/api/2/issue/{issueIdOrKey}/changelog
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/2/issue/{issueIdOrKey}/changelog`, { 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 { "isLast": false, "maxResults": 2, "nextPage": "https://your-domain.atlassian.net/rest/api/2/issue/TT-1/changelog?&startAt=4&maxResults=2", "self": "https://your-domain.atlassian.net/rest/api/2/issue/TT-1/changelog?startAt=2&maxResults=2", "startAt": 2, "total": 5, "values": [ { "author": { "accountId": "5b10a2844c20165700ede21g", "active": true, "avatarUrls": { "16x16": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=16&s=16", "24x24": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=24&s=24", "32x32": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=32&s=32", "48x48": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=48&s=48" }, "displayName": "Mia Krystof", "emailAddress": "mia@example.com", "self": "https://your-domain.atlassian.net/rest/api/2/user?accountId=5b10a2844c20165700ede21g", "timeZone": "Australia/Sydney" }, "created": "1970-01-18T06:27:50.429+0000", "id": "10001", "items": [ { "field": "fields", "fieldtype": "jira", "fieldId": "fieldId", "from": null, "fromString": "", "to": null, "toString": "label-1" } ] }, { "author": { "accountId": "5b10a2844c20165700ede21g", "active": true, "avatarUrls": { "16x16": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=16&s=16", "24x24": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=24&s=24", "32x32": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=32&s=32", "48x48": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=48&s=48" }, "displayName": "Mia Krystof", "emailAddress": "mia@example.com", "self": "https://your-domain.atlassian.net/rest/api/2/user?accountId=5b10a2844c20165700ede21g", "timeZone": "Australia/Sydney" }, "created": "1970-01-18T06:27:51.429+0000", "id": "10002", "items": [ { "field": "fields", "fieldtype": "jira", "fieldId": "fieldId", "from": null, "fromString": "label-1", "to": null, "toString": "label-1 label-2" } ] } ] }
POST

Get changelogs by IDs

Returns changelogs for an issue specified by a list of changelog IDs.

This operation can be accessed anonymously.

Permissions required:

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredWRITE

ClassicRECOMMENDED:read:jira-work
Granular:read:issue-meta:jira, read:avatar:jira, read:issue.changelog:jira

Request

Path parameters

issueIdOrKey

string

Required

Request bodyapplication/json

changelogIds

array<integer>

Required

Responses

Returned if the request is successful.

application/json

PageOfChangelogs

A page of changelogs.

POST/rest/api/2/issue/{issueIdOrKey}/changelog/list
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; var bodyData = `{ "changelogIds": [ 10001, 10002 ] }`; const response = await api.asUser().requestJira(route`/rest/api/2/issue/{issueIdOrKey}/changelog/list`, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: bodyData }); 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 { "histories": [ { "author": { "accountId": "5b10a2844c20165700ede21g", "active": true, "avatarUrls": { "16x16": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=16&s=16", "24x24": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=24&s=24", "32x32": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=32&s=32", "48x48": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=48&s=48" }, "displayName": "Mia Krystof", "emailAddress": "mia@example.com", "self": "https://your-domain.atlassian.net/rest/api/2/user?accountId=5b10a2844c20165700ede21g", "timeZone": "Australia/Sydney" }, "created": "1970-01-18T06:27:50.429+0000", "id": "10001", "items": [ { "field": "fields", "fieldtype": "jira", "fieldId": "fieldId", "from": null, "fromString": "", "to": null, "toString": "label-1" } ] }, { "author": { "accountId": "5b10a2844c20165700ede21g", "active": true, "avatarUrls": { "16x16": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=16&s=16", "24x24": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=24&s=24", "32x32": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=32&s=32", "48x48": "https://avatar-management--avatars.server-location.prod.public.atl-paas.net/initials/MK-5.png?size=48&s=48" }, "displayName": "Mia Krystof", "emailAddress": "mia@example.com", "self": "https://your-domain.atlassian.net/rest/api/2/user?accountId=5b10a2844c20165700ede21g", "timeZone": "Australia/Sydney" }, "created": "1970-01-18T06:27:51.429+0000", "id": "10002", "items": [ { "field": "fields", "fieldtype": "jira", "fieldId": "fieldId", "from": null, "fromString": "label-1", "to": null, "toString": "label-1 label-2" } ] } ], "maxResults": 2, "startAt": 0, "total": 2 }
GET

Get edit issue metadata

Returns the edit screen fields for an issue that are visible to and editable by the user. Use the information to populate the requests in Edit issue.

This endpoint will check for these conditions:

  1. Field is available on a field screen - through screen, screen scheme, issue type screen scheme, and issue type scheme configuration. overrideScreenSecurity=true skips this condition.
  2. Field is visible in the field configuration. overrideScreenSecurity=true skips this condition.
  3. Field is shown on the issue: each field has different conditions here. For example: Attachment field only shows if attachments are enabled. Assignee only shows if user has permissions to assign the issue.
  4. If a field is custom then it must have valid custom field context, applicable for its project and issue type. All system fields are assumed to have context in all projects and all issue types.
  5. Issue has a project, issue type, and status defined.
  6. Issue is assigned to a valid workflow, and the current status has assigned a workflow step. overrideEditableFlag=true skips this condition.
  7. The current workflow step is editable. This is true by default, but can be disabled by setting the jira.issue.editable property to false. overrideEditableFlag=true skips this condition.
  8. User has Edit issues permission.
  9. Workflow permissions allow editing a field. This is true by default but can be modified using jira.permission.* workflow properties.

Fields hidden using Issue layout settings page remain editable.

Connect apps having an app user with Administer Jira global permission, and Forge apps acting on behalf of users with Administer Jira global permission, can return additional details using:

  • overrideScreenSecurity When this flag is true, then this endpoint skips checking if fields are available through screens, and field configuration (conditions 1. and 2. from the list above).
  • overrideEditableFlag When this flag is true, then this endpoint skips checking if workflow is present and if the current step is editable (conditions 6. and 7. from the list above).

This operation can be accessed anonymously.

Permissions required:

Note: For any fields to be editable the user must have the Edit issues project permission for the issue.

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredREAD

ClassicRECOMMENDED:read:jira-work
Granular:read:issue-meta:jira, read:field-configuration:jira

Request

Path parameters

issueIdOrKey

string

Required

Query parameters

overrideScreenSecurity

boolean

overrideEditableFlag

boolean

Responses

Returned if the request is successful.

application/json

IssueUpdateMetadata

A list of editable field details.

GET/rest/api/2/issue/{issueIdOrKey}/editmeta
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/2/issue/{issueIdOrKey}/editmeta`, { 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 { "fields": { "summary": { "allowedValues": [ "red", "blue" ], "defaultValue": "red", "hasDefaultValue": false, "key": "field_key", "name": "My Multi Select", "operations": [ "set", "add" ], "required": false, "schema": { "custom": "com.atlassian.jira.plugin.system.customfieldtypes:multiselect", "customId": 10001, "items": "option", "type": "array" } } } }
POST

Send notification for issue

Creates an email notification for an issue and adds it to the mail queue.

Permissions required:

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredWRITE

ClassicRECOMMENDED:write:jira-work
Granular:send:notification:jira

Request

Path parameters

issueIdOrKey

string

Required

Request bodyapplication/json

The request object for the notification and recipients.

htmlBody

string

restrict

NotificationRecipientsRestrictions

subject

string

textBody

string

to

NotificationRecipients

Additional Properties

any

Responses

Returned if the email is queued for sending.

application/json

any

POST/rest/api/2/issue/{issueIdOrKey}/notify
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 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; var bodyData = `{ "htmlBody": "The <strong>latest</strong> test results for this ticket are now available.", "restrict": { "groupIds": [], "groups": [ { "name": "notification-group" } ], "permissions": [ { "key": "BROWSE" } ] }, "subject": "Latest test results", "textBody": "The latest test results for this ticket are now available.", "to": { "assignee": false, "groupIds": [], "groups": [ { "name": "notification-group" } ], "reporter": false, "users": [ { "accountId": "5b10a2844c20165700ede21g", "active": false } ], "voters": true, "watchers": true } }`; const response = await api.asUser().requestJira(route`/rest/api/2/issue/{issueIdOrKey}/notify`, { 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 transitions

Returns either all transitions or a transition that can be performed by the user on an issue, based on the issue's status.

Note, if a request is made for a transition that does not exist or cannot be performed on the issue, given its status, the response will return any empty transitions list.

This operation can be accessed anonymously.

Permissions required: A list or transition is returned only when the user has:

However, if the user does not have the Transition issues project permission the response will not list any transitions.

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredREAD

ClassicRECOMMENDED:read:jira-work
Granular:read:issue.transition:jira, read:status:jira, read:field-configuration:jira

Request

Path parameters

issueIdOrKey

string

Required

Query parameters

expand

string

transitionId

string

skipRemoteOnlyCondition

boolean

includeUnavailableTransitions

boolean

sortByOpsBarAndStatus

boolean

Responses

Returned if the request is successful.

application/json

Transitions

List of issue transitions.

GET/rest/api/2/issue/{issueIdOrKey}/transitions
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/2/issue/{issueIdOrKey}/transitions`, { 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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 { "transitions": [ { "fields": { "summary": { "allowedValues": [ "red", "blue" ], "defaultValue": "red", "hasDefaultValue": false, "key": "field_key", "name": "My Multi Select", "operations": [ "set", "add" ], "required": false, "schema": { "custom": "com.atlassian.jira.plugin.system.customfieldtypes:multiselect", "customId": 10001, "items": "option", "type": "array" } } }, "hasScreen": false, "id": "2", "isAvailable": true, "isConditional": false, "isGlobal": false, "isInitial": false, "name": "Close Issue", "to": { "description": "The issue is currently being worked on.", "iconUrl": "https://your-domain.atlassian.net/images/icons/progress.gif", "id": "10000", "name": "In Progress", "self": "https://your-domain.atlassian.net/rest/api/2/status/10000", "statusCategory": { "colorName": "yellow", "id": 1, "key": "in-flight", "name": "In Progress", "self": "https://your-domain.atlassian.net/rest/api/2/statuscategory/1" } } }, { "fields": { "summary": { "allowedValues": [ "red", "blue" ], "defaultValue": "red", "hasDefaultValue": false, "key": "field_key", "name": "My Multi Select", "operations": [ "set", "add" ], "required": false, "schema": { "custom": "com.atlassian.jira.plugin.system.customfieldtypes:multiselect", "customId": 10001, "items": "option", "type": "array" } }, "colour": { "allowedValues": [ "red", "blue" ], "defaultValue": "red", "hasDefaultValue": false, "key": "field_key", "name": "My Multi Select", "operations": [ "set", "add" ], "required": false, "schema": { "custom": "com.atlassian.jira.plugin.system.customfieldtypes:multiselect", "customId": 10001, "items": "option", "type": "array" } } }, "hasScreen": true, "id": "711", "name": "QA Review", "to": { "description": "The issue is closed.", "iconUrl": "https://your-domain.atlassian.net/images/icons/closed.gif", "id": "5", "name": "Closed", "self": "https://your-domain.atlassian.net/rest/api/2/status/5", "statusCategory": { "colorName": "green", "id": 9, "key": "completed", "self": "https://your-domain.atlassian.net/rest/api/2/statuscategory/9" } } } ] }
POST

Transition issue

Performs an issue transition and, if the transition has a screen, updates the fields from the transition screen.

sortByCategory To update the fields on the transition screen, specify the fields in the fields or update parameters in the request body. Get details about the fields using Get transitions with the transitions.fields expand.

This operation can be accessed anonymously.

Permissions required:

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredWRITE

ClassicRECOMMENDED:write:jira-work
Granular:write:issue:jira, write:issue.property:jira

Request

Path parameters

issueIdOrKey

string

Required

Request bodyapplication/json

fields

object

historyMetadata

HistoryMetadata

properties

array<EntityProperty>

transition

IssueTransition

update

object

Additional Properties

any

Responses

Returned if the request is successful.

application/json

any

POST/rest/api/2/issue/{issueIdOrKey}/transitions
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 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; var bodyData = `{ "fields": { "assignee": { "name": "Will" }, "resolution": { "name": "Fixed" } }, "historyMetadata": { "activityDescription": "Complete order processing", "actor": { "avatarUrl": "http://mysystem/avatar/tony.jpg", "displayName": "Tony", "id": "tony", "type": "mysystem-user", "url": "http://mysystem/users/tony" }, "cause": { "id": "myevent", "type": "mysystem-event" }, "description": "From the order testing process", "extraData": { "Iteration": "10a", "Step": "4" }, "generator": { "id": "mysystem-1", "type": "mysystem-application" }, "type": "myplugin:type" }, "transition": { "id": "5" }, "update": { "comment": [ { "add": { "body": "Bug has been fixed." } } ] } }`; const response = await api.asUser().requestJira(route`/rest/api/2/issue/{issueIdOrKey}/transitions`, { 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

Export archived issue(s)Experimental

Enables admins to retrieve details of all archived issues. Upon a successful request, the admin who submitted it will receive an email with a link to download a CSV file with the issue details.

Note that this API only exports the values of system fields and archival-specific fields (ArchivedBy and ArchivedDate). Custom fields aren't supported.

Permissions required: Jira admin or site admin: global permission

License required: Premium or Enterprise

Signed-in users only: This API can't be accessed anonymously.

Rate limiting: Only a single request can be active at any given time.

Data Security Policy: Not exempt from app access rules
Scopes

Connect app scope requiredREAD

ClassicRECOMMENDED:read:jira-work
Granular:read:issue:jira

Request

Request bodyapplication/json

You can filter the issues in your request by the projects, archivedBy, archivedDate, issueTypes, and reporters fields. All filters are optional. If you don't provide any filters, you'll get a list of up to one million archived issues.

archivedBy

array<string>

archivedDateRange

DateRangeFilterRequest

issueTypes

array<string>

projects

array<string>

reporters

array<string>

Additional Properties

any

Responses

Returns the details of your export task. You can use the get task API to view the progress of your request.

application/json

ExportArchivedIssuesTaskProgressResponse

The response for status request for a running/completed export task.

PUT/rest/api/2/issues/archive/export
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 // This sample uses Atlassian Forge // https://developer.atlassian.com/platform/forge/ import api, { route } from "@forge/api"; var bodyData = `{ "archivedBy": [ "uuid-rep-001", "uuid-rep-002" ], "archivedDate": { "dateAfter": "2023-01-01", "dateBefore": "2023-01-12" }, "archivedDateRange": { "dateAfter": "2023-01-01", "dateBefore": "2023-01-12" }, "issueTypes": [ "10001", "10002" ], "projects": [ "FOO", "BAR" ], "reporters": [ "uuid-rep-001", "uuid-rep-002" ] }`; const response = await api.asUser().requestJira(route`/rest/api/2/issues/archive/export`, { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: bodyData }); console.log(`Response: ${response.status} ${response.statusText}`); console.log(await response.json());
202Response
1 2 3 4 5 6 7 { "payload": "{projects=[FOO, BAR], reporters=[uuid-rep-001, uuid-rep-002], issueTypes=[10001, 10002], archivedDate={dateAfterInstant=2023-01-01, dateBeforeInstant=2023-01-12}, archivedBy=[uuid-rep-001, uuid-rep-002]}", "progress": 0, "status": "ENQUEUED", "submittedTime": 1623230887000, "taskId": "10990" }

Rate this page: