Everything an AI agent can do with the Jira API.

A reference guide for building AI agents: every method, how to authenticate, and the permissions each one needs.

Endpoints27
API version3
Last updated23 June 2026
Orientation

How the Jira API works.

The Jira API is how an app or AI agent works with a Jira site: reading and creating issues, moving them through their workflow with transitions, searching with the Jira Query Language, and posting comments. Access is granted through an OAuth token and a set of scopes that decide which areas a call can read or write, and a token never reaches past the permissions of the person who authorized it. Jira can also push events, like an issue being created or updated, to a registered webhook URL.

27Endpoints
9Capability groups
16Read
11Write
5Permissions
Authentication
Most integrations authenticate with OAuth 2.0 (3LO): a user consents at auth.atlassian.com to a set of scopes, the app exchanges the code for an access token, and offline_access adds a refresh token. Each call goes to a per-site base address that includes the site's cloud ID, found from the token's accessible resources. A script can instead use an email and API token over basic auth, acting as that one user. Forge and Connect apps authenticate through their own app frameworks.
Permissions
Two scope models run side by side. Classic scopes are broad buckets: read:jira-work and write:jira-work cover issue, comment, and worklog reads and writes; read:jira-user covers user data; manage:jira-project and manage:jira-configuration cover project and site administration; and manage:jira-webhook covers dynamic webhooks. Granular scopes are the fine-grained alternative, like read:issue:jira or write:comment:jira, and Atlassian recommends using them only where a classic scope cannot express what is needed. A scope never grants more than the acting user's own Jira permissions, so a 403 can mean either a missing scope or a missing permission.
Versioning
Version 3 is the latest REST API and the one to build on. It offers the same operations as version 2, with one real difference: version 3 represents rich text fields, such as an issue description or a comment body, as the Atlassian Document Format, a JSON structure, where version 2 uses wiki markup strings. There is no dated version scheme; the version is the path segment, /rest/api/3 or /rest/api/2, and both are live.
Data model
Jira is organized around issues inside projects. An issue holds fields, moves through a workflow by transitions, and carries comments, worklogs, and attachments. Users are identified by an account ID, since usernames and keys are no longer accepted. Issues are queried with the Jira Query Language through the search method. A state change, like an issue being created or updated, can be pushed to a registered webhook URL.
Connect & authenticate

Connection & authentication methods.

How an app or AI agent connects to Jira determines what it can reach. There is a route for making calls, a route for receiving events, a hosted server that exposes Jira to agents, and two app frameworks, and each is governed by the token or grant behind it and the permissions it carries.

Ways to connect

REST API

The Jira Cloud platform REST API is reached per site through a base address that includes the site's cloud ID, found by calling the accessible-resources endpoint after authentication. A call authenticates with an OAuth 2.0 (3LO) access token, or with an email and API token over basic auth for a script acting as one user. Version 3 is the current API.

Best forConnecting an app or AI agent to Jira.
Governed byThe token or grant and the scopes it carries.
Docs ↗

Rovo MCP server (Model Context Protocol)

Atlassian's official Rovo MCP server lets an AI agent reach Jira through the Model Context Protocol. The remote server is at https://mcp.atlassian.com/v1/mcp and reached general availability on 4 February 2026. It uses OAuth 2.1, so every action runs within the signed-in user's existing Jira permissions, and it can search and read issues and create or update work items. It also covers Confluence, Bitbucket, and Jira Service Management.

Best forConnecting an AI agent to Jira through MCP.
Governed byThe OAuth grant and the signed-in user's permissions.
Docs ↗

Webhooks

Jira posts an event payload to a registered URL when a chosen event happens, like an issue being created or a comment added. A dynamic webhook is registered through the REST API and filtered by a JQL query, and expires 30 days after it is created or refreshed. Connect and Forge apps can instead declare webhooks in their app definition.

Best forReceiving Jira events at an app or AI agent.
Governed byThe scope and the registering user's permissions.
Docs ↗

Forge

Forge is Atlassian's app platform, where the app runs inside Atlassian's own infrastructure rather than on a vendor's servers, so customer data does not leave Atlassian. Since 17 September 2025 only Forge apps can be submitted to the Atlassian Marketplace. A Forge app declares the scopes it needs and can call the REST API and receive webhooks.

Best forApps that run inside Atlassian's infrastructure.
Governed byThe scopes declared in the app's manifest.
Docs ↗

Connect

Connect is Atlassian's older app framework, where the app is hosted on the vendor's own infrastructure and Jira sends data out to it. It is being superseded by Forge for new Marketplace apps, but remains in use. A Connect app can call the REST API and declare webhook modules.

Best forExisting apps hosted on a vendor's own servers.
Governed byThe scopes declared in the app descriptor.
Docs ↗
Authentication

OAuth 2.0 (3LO)

Three-legged OAuth lets an external app act on a user's behalf. The user is sent to auth.atlassian.com to consent to a set of scopes, the app exchanges the returned code for an access token, and adding offline_access yields a refresh token to keep access alive. Each call goes to the site's base address, found from the access token's accessible resources.

TokenOAuth access token (per user, per site)
Best forExternal apps and AI agents acting for a user
Docs ↗

API token (basic auth)

An email address plus an API token authenticates a request over HTTP basic auth, acting as that one user with that user's permissions. It suits a script or a direct call rather than an app many people authorize, since there is no consent flow and no per-scope grant.

TokenEmail and API token
Best forScripts and single-user integrations
Docs ↗

Forge app

A Forge app authenticates as itself or as the user, with the scopes declared in its manifest, and runs inside Atlassian's infrastructure. It is the recommended route for a Marketplace app, since only Forge apps can be submitted from 17 September 2025.

TokenForge-managed token
Best forMarketplace and in-product apps
Docs ↗
Capability map

What an AI agent can do in Jira.

The Jira API is split into areas an agent can act on, like issues, transitions, projects, comments, worklogs, and users. Each area has its own methods and its own permissions, and writes in some areas change project configuration rather than a single issue.

Issues

6 endpoints

Read, create, edit, and delete issues, and read an issue's change history and edit metadata.

Writes here change real issue data, and a delete is permanent.
View endpoints

Transitions & assignment

3 endpoints

List the transitions available on an issue, move an issue through its workflow, and set an assignee.

Writes here move an issue through its workflow or reassign it.
View endpoints

Search (JQL)

2 endpoints

Search for issues with the Jira Query Language, by URL parameter or in a request body.

Reads return every issue the token's user can see that matches the query.
View endpoints

Comments

3 endpoints

List the comments on an issue, add a comment, and update one.

Writes here post or change comments visible on the issue.
View endpoints

Projects

4 endpoints

Search projects, read a single project, read its statuses, and create a project.

Creating a project needs site administration permission.
View endpoints

Users

3 endpoints

Read the current user, read a user by account ID, and search for users.

Reads return people's names, email addresses, and avatars.
View endpoints

Worklogs

2 endpoints

List the work logged against an issue and add a worklog entry.

Writes here record time against a real issue.
View endpoints

Attachments

2 endpoints

Add a file to an issue and read an attachment's metadata.

Writes here attach a real file to an issue.
View endpoints

Fields & webhooks

2 endpoints

List the fields defined on the site and register a dynamic webhook to receive events.

Registering a webhook sends issue activity to a chosen URL.
View endpoints
Endpoint reference

Every Jira API method.

Filter by method, access, or permission, or search any path. Select a row for version detail, rate limits, the related webhook event, and the source.

MethodEndpointWhat it doesAccessPermissionVersion

Issues

Read, create, edit, and delete issues, and read an issue's change history and edit metadata.6

Granular OAuth scope: read:issue:jira (plus auxiliary read scopes for expanded fields like the changelog or vote count).

Acts onissue
Permission (capability)read:jira-work
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granular OAuth scope: write:issue:jira. Rich text fields, like the description, are sent as the Atlassian Document Format in version 3.

Acts onissue
Permission (capability)write:jira-work
VersionAvailable since the API’s base version
Webhook eventjira-issue-created
Rate limitStandard limits apply

Granular OAuth scope: write:issue:jira.

Acts onissue
Permission (capability)write:jira-work
VersionAvailable since the API’s base version
Webhook eventjira-issue-updated
Rate limitStandard limits apply

Granular OAuth scope: delete:issue:jira. The classic write:jira-work scope covers deletion too, so a classic token cannot delete without also being able to create and edit.

Acts onissue
Permission (capability)write:jira-work
VersionAvailable since the API’s base version
Webhook eventjira-issue-deleted
Rate limitStandard limits apply

Granular OAuth scope: read:issue.changelog:jira.

Acts onissue
Permission (capability)read:jira-work
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granular OAuth scope: read:issue-meta:jira. Useful before an edit, to learn which fields the user may change.

Acts onissue
Permission (capability)read:jira-work
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Transitions & assignment

List the transitions available on an issue, move an issue through its workflow, and set an assignee.3

Granular OAuth scope: read:issue.transition:jira. The available transitions depend on the issue's workflow and the user's permissions.

Acts ontransition
Permission (capability)read:jira-work
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granular OAuth scope: write:issue:jira. The transition ID comes from the Get transitions method, since transitions are workflow-specific.

Acts ontransition
Permission (capability)write:jira-work
VersionAvailable since the API’s base version
Webhook eventjira-issue-updated
Rate limitStandard limits apply

Granular OAuth scope: write:issue:jira. The user is set by accountId, since usernames are no longer accepted.

Acts onissue
Permission (capability)write:jira-work
VersionAvailable since the API’s base version
Webhook eventjira-issue-updated
Rate limitStandard limits apply
Search for issues with the Jira Query Language, by URL parameter or in a request body.2

Granular OAuth scope: read:issue-details:jira. This is the current enhanced search; it replaced the older /rest/api/3/search method, which stopped responding at the end of October 2025. It pages by a continuation token rather than a result total.

Acts onsearch result
Permission (capability)read:jira-work
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granular OAuth scope: read:issue-details:jira. The body form suits long queries and explicit field lists.

Acts onsearch result
Permission (capability)read:jira-work
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Comments

List the comments on an issue, add a comment, and update one.3

Granular OAuth scope: read:comment:jira.

Acts oncomment
Permission (capability)read:jira-work
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granular OAuth scope: write:comment:jira. The comment body is sent as the Atlassian Document Format in version 3.

Acts oncomment
Permission (capability)write:jira-work
VersionAvailable since the API’s base version
Webhook eventcomment-created
Rate limitStandard limits apply

Granular OAuth scope: write:comment:jira.

Acts oncomment
Permission (capability)write:jira-work
VersionAvailable since the API’s base version
Webhook eventcomment-updated
Rate limitStandard limits apply

Projects

Search projects, read a single project, read its statuses, and create a project.4

Granular OAuth scope: read:project:jira (plus auxiliary read scopes for expanded project detail).

Acts onproject
Permission (capability)read:jira-work
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granular OAuth scope: read:project:jira.

Acts onproject
Permission (capability)read:jira-work
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granular OAuth scope: read:issue-status:jira. Useful to learn the statuses an issue can hold before transitioning it.

Acts onproject
Permission (capability)read:jira-work
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granular OAuth scope: write:project:jira. The user must also hold the Administer Jira permission, since a scope never grants more than the user's own permissions.

Acts onproject
Permission (capability)manage:jira-configuration
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Users

Read the current user, read a user by account ID, and search for users.3

Granular OAuth scope: read:user:jira. Returns the caller's name, email address, and avatar.

Acts onuser
Permission (capability)read:jira-user
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granular OAuth scope: read:user:jira. The user is identified by accountId; the older username and key parameters are no longer available.

Acts onuser
Permission (capability)read:jira-user
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granular OAuth scope: read:user:jira. Returns people's names, email addresses, and avatars.

Acts onuser
Permission (capability)read:jira-user
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Worklogs

List the work logged against an issue and add a worklog entry.2

Granular OAuth scope: read:issue-worklog:jira.

Acts onworklog
Permission (capability)read:jira-work
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granular OAuth scope: write:issue-worklog:jira. Adding a worklog can adjust the issue's remaining estimate.

Acts onworklog
Permission (capability)write:jira-work
VersionAvailable since the API’s base version
Webhook eventworklog-created
Rate limitStandard limits apply

Attachments

Add a file to an issue and read an attachment's metadata.2

Granular OAuth scope: write:attachment:jira. The request must send the file as multipart form data and carry an X-Atlassian-Token: no-check header, or it is blocked.

Acts onattachment
Permission (capability)write:jira-work
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granular OAuth scope: read:attachment:jira. This returns metadata, not the file content.

Acts onattachment
Permission (capability)read:jira-work
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Fields & webhooks

List the fields defined on the site and register a dynamic webhook to receive events.2

Granular OAuth scope: read:field:jira. The field IDs returned here are the keys used when reading or writing an issue's fields.

Acts onfield
Permission (capability)read:jira-work
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Granular OAuth scope: write:webhook:jira. Only Connect and OAuth 2.0 apps can register dynamic webhooks, and each expires 30 days after it is created or refreshed.

Acts onwebhook
Permission (capability)manage:jira-webhook
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply
No endpoints match those filters.
Webhooks

Webhook events.

Jira can notify an app or AI agent when something happens in a site, like an issue being created or a comment added, instead of the app repeatedly asking. Jira posts the event payload to a webhook URL registered for the chosen events.

EventWhat it signalsTriggered by
jira:issue_createdFires when an issue is created./rest/api/3/issue
jira:issue_updatedFires when an issue is edited, transitioned, or reassigned./rest/api/3/issue/{issueIdOrKey}
/rest/api/3/issue/{issueIdOrKey}/transitions
/rest/api/3/issue/{issueIdOrKey}/assignee
jira:issue_deletedFires when an issue is deleted./rest/api/3/issue/{issueIdOrKey}
comment_createdFires when a comment is added to an issue./rest/api/3/issue/{issueIdOrKey}/comment
comment_updatedFires when a comment is edited./rest/api/3/issue/{issueIdOrKey}/comment/{id}
comment_deletedFires when a comment is removed from an issue.In-app only
worklog_createdFires when time is logged against an issue./rest/api/3/issue/{issueIdOrKey}/worklog
worklog_updatedFires when a worklog entry is changed.In-app only
worklog_deletedFires when a worklog entry is removed.In-app only
No events match that search.
Rate limits & pagination

Rate limits, pagination & request size.

Jira limits how fast and how much an app or AI agent can call, through a points-based cost budget rather than a fixed request count, with separate per-second and per-issue write limits on top.

Request rate

Jira Cloud does not meter by a fixed request count. It uses a points-based cost budget, where each call spends points according to its complexity and the data it returns, with separate per-second burst limits and a per-issue write limit layered on top. Going over any of these returns HTTP 429, with a Retry-After header giving the seconds to wait, a RateLimit-Reason header naming which limit was hit (such as a tenant points quota, a burst limit, or the per-issue write limit), and X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers reporting the state. Atlassian states the exact thresholds are subject to change and does not commit to fixed published numbers, so an integration should respect the headers and back off rather than assume a constant ceiling.

Pagination

List methods are paginated. Most use startAt and maxResults offset parameters and report the total available, with maxResults commonly capped around 50 to 100 depending on the method. The current JQL search method at /rest/api/3/search/jql pages differently: it returns a nextPageToken to fetch the following page and no longer reports a result total, so an integration follows the token until it is absent rather than counting pages.

Request size

Responses are JSON. Rich text fields, like an issue description or a comment body, are represented as the Atlassian Document Format, a JSON structure, in version 3, where version 2 uses wiki markup strings. Attachment uploads are sent as multipart form data and are subject to the site's configured maximum attachment size.

Errors

Status codes & error handling.

The status codes an agent should handle, and what to do about each.

StatusCodeMeaningWhat to do
400Bad RequestThe request was malformed, or a field or parameter was invalid. The body carries an errorMessages array of general messages and an errors object mapping a field name to its message.Read the errorMessages and errors in the body, correct the named field, and resend.
401UnauthorizedAuthentication is missing or invalid, so the caller is not signed in.Send a valid access token or API token, refreshing it first if it has expired.
403ForbiddenThe caller is authenticated but lacks the permission or scope the request needs.Grant the missing scope, or confirm the user holds the required Jira permission, then retry.
404Not FoundThe issue, project, or other object does not exist, or the user is not permitted to see it. Jira returns 404 rather than 403 in some cases so it does not confirm a hidden object exists.Confirm the ID or key is correct and the user has access to the object.
429Too Many RequestsA rate limit was exceeded, either the points-based cost budget, the per-second burst limit, or the per-issue write limit. A RateLimit-Reason header names which one was hit.Wait the number of seconds in the Retry-After header before retrying, and back off on repeated 429s.
Versioning & freshness

Version history.

Jira keeps version 3 as the latest REST API, offering the same operations as version 2 but representing rich text fields, like a description or a comment body, as the Atlassian Document Format instead of wiki markup.

Version history

What changed, and when

Latest version3
3Current version
Version 3, the latest REST API (Atlassian Document Format)

Version 3 of the Jira Cloud platform REST API is the latest version. It offers the same collection of operations as version 2, but represents rich text fields, like an issue description or a comment body, as the Atlassian Document Format, a JSON structure, rather than wiki markup. There is no dated version scheme; both version 2 and version 3 are live, and version 3 is the recommended one to build on. The entries below are notable dated changes to the platform that affect agents building on it.

What changed
  • Rich text fields are sent and returned as the Atlassian Document Format, not wiki markup
  • Users are identified by account ID; usernames and keys are no longer accepted
  • Both version 2 and version 3 remain supported, with version 3 recommended
2026-06-18Feature update
Resource-restricted tokens for OAuth 2.0 (3LO) apps

Atlassian announced resource-restricted tokens for OAuth 2.0 (3LO) apps, alongside a Partner Security Incident Response Program, narrowing what an access token can reach.

What changed
  • Resource-restricted tokens introduced for OAuth 2.0 (3LO) apps
  • Partner Security Incident Response Program announced
2025-10-31Requires migration
Old JQL search endpoints retired (CHANGE-2046)

The older issue-search methods at /rest/api/3/search, by GET and POST, were progressively shut down through the second half of 2025 and stopped responding at the end of October 2025, replaced by the enhanced search at /rest/api/3/search/jql. The new method pages by a continuation token and no longer returns a result total, which is a behavioral change for anything that paginated on the total.

What changed
  • GET and POST /rest/api/3/search replaced by /rest/api/3/search/jql
  • Enhanced search pages by a nextPageToken instead of startAt and a total
  • The result total is no longer returned by the search method
2025-09-17Feature update
Only Forge apps accepted to the Marketplace

From 17 September 2025, only Forge apps can be submitted to the Atlassian Marketplace, and new extensibility features ship Forge-first. Connect apps remain in use but are being superseded.

What changed
  • Forge becomes the required framework for new Marketplace submissions
  • New extensibility features ship Forge-first

Version 2 and version 3 are both live; version 3 is the one to build on.

Jira platform changelog ↗
Questions

Jira API, answered.

How does an agent authenticate to Jira?+
Most apps use OAuth 2.0 (3LO). The user is sent to auth.atlassian.com to consent to a set of scopes, the app exchanges the returned code for an access token, and adding offline_access to the request yields a refresh token so access can be renewed. Each call then goes to a per-site base address that includes the site's cloud ID, which the app reads from the token's accessible-resources list. A script that acts as one user can instead send an email and API token over basic auth.
What's the difference between classic and granular scopes?+
Classic scopes are broad: read:jira-work and write:jira-work cover reading and writing issues, comments, and worklogs across the site, read:jira-user covers user data, and the manage:jira-* scopes cover administration and webhooks. Granular scopes are the fine-grained alternative, like read:issue:jira or write:comment:jira, that name a single resource and operation. Atlassian recommends classic scopes by default and granular scopes only where a classic scope cannot express the access needed. Either way, a token never reaches past the acting user's own Jira permissions.
How do the JQL search endpoints work now?+
Issues are searched with the Jira Query Language at /rest/api/3/search/jql, by GET with the query in the URL or by POST with it in the body. This is the current enhanced search; it replaced the older /rest/api/3/search method, which stopped responding at the end of October 2025. The new method pages by a continuation token rather than a result count, so an integration follows the nextPageToken until it is absent instead of relying on a total.
What are the rate limits?+
Jira Cloud does not meter by a fixed number of requests. It uses a points-based cost budget, where each call spends points by its complexity and the data it returns, plus a per-second burst limit and a per-issue write limit. Going over returns HTTP 429 with a Retry-After header saying how many seconds to wait and a RateLimit-Reason header naming which limit was hit. Atlassian states the exact thresholds can change and does not publish fixed numbers, so an integration should read the headers and back off rather than assume a constant ceiling.
How does an agent receive events instead of polling?+
Jira posts an event to a registered webhook URL when something happens, like an issue being created (jira:issue_created), updated (jira:issue_updated), or deleted (jira:issue_deleted), or a comment or worklog being added. An OAuth or Connect app registers a dynamic webhook through /rest/api/3/webhook, filtered by a JQL query, using the manage:jira-webhook scope. A dynamic webhook expires 30 days after it is created or refreshed, so it must be extended to keep firing.
Is there an official MCP server for Jira?+
Yes. Atlassian's Rovo MCP server, at https://mcp.atlassian.com/v1/mcp, lets an AI agent reach Jira through the Model Context Protocol. It reached general availability on 4 February 2026 and uses OAuth 2.1, so every action runs within the signed-in user's existing Jira permissions. It can search and read issues and create or update work items, and also covers Confluence, Bitbucket, and Jira Service Management.
Why does version 3 send rich text as JSON instead of text?+
Version 3 represents rich text fields, such as an issue description or a comment body, as the Atlassian Document Format, a JSON structure describing the content, where version 2 uses wiki markup strings. The two versions otherwise offer the same operations. Version 3 is the latest and the one to build on, though both remain live.
Related

More productivity API guides for agents

What is Bollard AI?

Control what every AI agent can do in Jira.

Bollard AI sits between a team's AI agents and Jira. Grant each agent exactly the access it needs, read or write, resource by resource, and every call is checked and logged.

  • Set read, write, or full access per agent, never a shared Jira token.
  • Denied by default, so an agent reaches only what has been explicitly allowed.
  • Every call recorded in plain English: who, what, where, and the decision.
Jira
Triage Agent
Read issues ResourceOffReadFull use
Transition issues ActionOffReadFull use
Delete issues ActionOffReadFull use
Per-agent access, set in Bollard AI, not in Jira