Jira
The Jira integration lets Helios agents work in your Jira Cloud site through the Jira, Jira Software, Jira Service Management, Assets, Forms, and Jira Service Management operations and incident REST APIs, and run agents automatically when issues, comments, worklogs, sprints, boards, versions, projects, and other Jira data change.
What your agents can do
Helios agents can use the Jira Cloud platform, Jira Software, Jira Service Management, Assets, Forms, and Jira Service Management operations and incident APIs, subject to the connection's permissions.
- Create issues from a bug report, an alert, or a Slack thread, with a type, labels, priority, and assignee
- Search with JQL and summarize the results, such as the issues in an open sprint
- Transition issues through your workflow, assign them, log work, and attach files
- Plan sprints: read boards and backlogs, move issues into a sprint, and start or close it
- Answer service desk requests, add participants, and handle approvals
- Find and update Assets objects with AQL, such as the laptop assigned to the person who opened a request
- Fill in and submit the forms on an issue or request
- Acknowledge and close alerts, check who is on call, and add responders to an incident
- Comment on issues and reply to comments
The integration works with Jira Cloud sites on atlassian.net. Jira Data Center is not supported. Atlassian serves Assets, Forms, and the operations and incident APIs from its API gateway at api.atlassian.com, and Helios sends each connection's calls to them there. The stakeholder communications API, which manages status pages and their subscribers, works only with Jira API Token. Atlassian documents it only for API tokens. Assets paths include your Assets workspace ID, which an agent gets from GET /rest/servicedeskapi/assets/workspace. Helios does not support Assets imports or the Jira Software DevOps APIs, such as development information, builds, deployments, feature flags, remote links, and security information. Those accept Connect and Forge apps, and some also accept OAuth 2.0 credentials that a site admin creates for on-premises tools, which Helios doesn't support.
Authentication
| Method | Type | Description |
|---|---|---|
| Jira API Token | API Key | An Atlassian account's email and API token, and your site URL |
| Your own Jira OAuth app | OAuth 2.0 | An OAuth 2.0 (3LO) app you register in the Atlassian developer console |
Jira API Token can call the supported APIs, subject to the account's permissions, and can receive the trigger events listed below. Your own Jira OAuth app can call the APIs its scopes cover, and receives issue, comment, issue property, sprint, and version events only. See Integration authentication for how credentials are stored and injected.
Jira API Token
You need an Atlassian account that can use the Jira site. For triggers, the account also needs the Administer Jira global permission.
- Sign in to Atlassian as the account Helios should act as, and open API tokens.
- Select Create API token. Don't use Create API token with scopes. Scoped tokens only work through Atlassian's API gateway, and Helios calls your site's address.
- Give the token a name and an expiration date, and copy it.
- In Helios, choose Jira API Token. Enter the account's email address in Atlassian Account Email and the token in API Token.
- Set Base URL to your site's address, such as
https://your-site.atlassian.net. Use theatlassian.netaddress with no path. - Save.
The token has no scopes of its own. The agent can do what the account can do in Jira. For full access, give the account the Administer Jira global permission and the Administer Projects permission in the projects agents work in, and make it an agent in the service projects agents work in. Helios registers the webhook for triggers through Jira's admin webhook API, which needs Administer Jira. Without it, agents can still call APIs permitted by the account, but Helios cannot register triggers, and the trigger picker shows every event as unavailable.
An API token expires after at most 365 days. Before it expires, create a new one and enter it in Helios through Manage.
Jira records every change made with the token as the account that owns it. A separate Atlassian account for Helios keeps the agent's changes apart from yours.
Your own Jira OAuth app
You need an Atlassian account to sign in to the developer console. The person who approves access must be able to use the Jira site.
-
In the Atlassian developer console, select Create, then OAuth 2.0 integration, and give the app a name. If you're asked for a grant type, choose OAuth 2.0 (3LO).
-
Open Permissions. Select Add next to Jira API, then Configure.
-
On the Classic scopes tab, select Edit Scopes and turn on every classic scope in the first table below. On the Granular scopes tab, select Edit Scopes and turn on every granular scope in it. If you'll check Admin access in Helios, also turn on the scopes in the second table.
-
Open Authorization. Select Configure next to OAuth 2.0 (3LO), set Callback URL to this URL, and select Save changes:
https://api.heliosapp.com/integrations/jira/oauth_callback -
Open Settings and copy the Client ID and Secret.
-
In Helios, choose Your own Jira OAuth app and enter them in Client ID and Client Secret. Check Admin access if you turned on the admin scopes.
-
If the app can reach more than one Jira site, set Base URL to the site to connect, such as
https://your-site.atlassian.net. Helios reads it when Atlassian sends you back, so set it before you save. -
Save. Atlassian asks you to choose the site and approve access.
Helios asks for every scope in the first table, and Atlassian expects an app to have each scope it asks for. Turn on all of them.
| Scopes | Tab | What Helios uses them for |
|---|---|---|
read:jira-work, write:jira-work | Classic | Projects, issues, comments, worklogs, attachments, and JQL search |
read:jira-user | Classic | User details, such as when an agent looks up an assignee |
manage:jira-webhook | Classic | Registering the webhooks for triggers |
read:servicedesk-request, write:servicedesk-request | Classic | Service desks, request types, and customer requests with their comments, approvals, and participants |
read:board-scope:jira-software, write:board-scope:jira-software | Granular | Boards and backlogs, and moving issues between them |
read:sprint:jira-software, write:sprint:jira-software, delete:sprint:jira-software | Granular | Sprints and the issues in them, and sprint events |
read:epic:jira-software, write:epic:jira-software | Granular | Epics and the issues in them |
read:issue:jira-software, write:issue:jira-software | Granular | Ranking and estimating issues |
read:project:jira, read:issue-details:jira, read:jql:jira | Granular | Jira Software operations that read projects, issues, and JQL, and receiving issue events |
read:issue:jira, read:comment:jira, read:comment.property:jira, read:issue.property:jira, read:issue-type:jira, read:status:jira, read:user:jira, read:group:jira, read:project-role:jira, read:project-version:jira | Granular | Receiving comment, issue property, and version events. Jira sends an event only when the app has every scope it needs |
read:knowledgebase:jira-service-management, read:request.attachment:jira-service-management, read:request.comment:jira-service-management, read:requesttype:jira-service-management | Granular | Knowledge base articles, attachments on request comments, and request types |
read:cmdb-object:jira, write:cmdb-object:jira, delete:cmdb-object:jira | Granular | Assets objects, AQL search, and an object's history and connected issues |
read:cmdb-schema:jira, read:cmdb-type:jira, read:cmdb-attribute:jira, read:cmdb-icon:jira, read:cmdb-config:jira | Granular | Assets object schemas, object types, attributes, icons, status types, reference types, and object counts |
read:ops-alert:jira-service-management, write:ops-alert:jira-service-management, delete:ops-alert:jira-service-management | Granular | Operations alerts, with their notes, tags, and attachments |
read:ops-config:jira-service-management, write:ops-config:jira-service-management, delete:ops-config:jira-service-management | Granular | Operations teams, on-call schedules, escalations, routing rules, integrations, and maintenance windows |
read:incident:jira-service-management, write:incident:jira-service-management | Granular | Incidents, with their responders, stakeholders, affected services, linked alerts, and post-incident reviews |
offline_access | None | Get a refresh token. Helios asks for it, so you don't add it in the console |
Admin access adds these scopes. The endpoints they cover need Jira, project, or board administrator permissions, or the object schema manager role in Assets.
| Scopes | Tab | What Helios uses them for |
|---|---|---|
manage:jira-configuration | Classic | Jira settings, such as fields, workflows, screens, issue types, and schemes |
manage:jira-project | Classic | Project settings, and creating versions and components |
manage:servicedesk-customer | Classic | Customers and organizations |
read:board-scope.admin:jira-software, write:board-scope.admin:jira-software, delete:board-scope.admin:jira-software | Granular | Board configuration, features, properties, and quick filters |
write:requesttype:jira-service-management | Granular | Creating request types |
write:cmdb-schema:jira, delete:cmdb-schema:jira, write:cmdb-type:jira, delete:cmdb-type:jira, write:cmdb-attribute:jira, delete:cmdb-attribute:jira, write:cmdb-config:jira, delete:cmdb-config:jira | Granular | Creating, changing, and deleting Assets object schemas, object types, attributes, status types, and reference types |
You turn on 48 scopes in the developer console, or 63 with the admin scopes. Helios also asks for offline_access, which isn't counted. Atlassian recommends fewer than 50 scopes for each app. Helios asks for every scope its APIs need, so with the admin scopes the app has more. The developer console shows the count. The admin scopes are needed only when you check Admin access.
Jira records changes as the person who approved access, and the agent can do only what both the scopes and that person's Jira permissions allow. This method can't redact issue fields or read a user's email address regardless of their profile visibility. Those endpoints accept only an API token.
Helios renews the access token with the refresh token. Atlassian replaces the refresh token on each renewal, and a refresh token expires after 90 days without use. Helios renews it every day when it refreshes the webhooks for triggers. If it expires, open the connection and click Re-connect. After you rotate the app's secret, enter the new one through Manage. After that, or after you change the app's scopes or Admin access, click Re-connect.
A new app is private, so only you can approve access. To let other people approve it, open Distribution and turn on sharing.
Triggers
Jira can start a Workflow when something happens in your site. Helios registers the webhooks when you save the connection, so there is nothing to set up in Jira. Deleting the connection removes them.
- Jira API Token: Helios registers an admin webhook named Helios, subscribed to every event below for every project. This needs the Administer Jira global permission.
- Your own Jira OAuth app: Helios registers Jira's webhooks for OAuth apps, which needs the
manage:jira-webhookscope. Jira sends OAuth apps only theissue.*,issue_property.*,comment.*,sprint.*, andversion.*events. The trigger picker shows the other events as unavailable on the connection. The webhooks cover the projects the approving person can see, and expire after 30 days. Helios refreshes them every day and adds projects created since the last refresh. Jira allows one webhook URL for each app and Atlassian account, so one OAuth app and account can receive events on one Helios connection only.
| Event | Description | Filters |
|---|---|---|
issue.created | An issue was created | project, issue type (pattern) |
issue.updated | An issue was updated | project, issue type (pattern), moved to status (pattern), changed field (pattern) |
issue.deleted | An issue was deleted | project, issue type (pattern) |
issue_property.set | An issue property was created or updated | project, issue type (pattern), property key (pattern) |
issue_property.deleted | An issue property was deleted | project, issue type (pattern), property key (pattern) |
comment.created | A comment was added to an issue | project, issue type (pattern) |
comment.updated | A comment on an issue was edited | project, issue type (pattern) |
comment.deleted | A comment on an issue was deleted | project, issue type (pattern) |
worklog.created | A worklog was created | None |
worklog.updated | A worklog was updated | None |
worklog.deleted | A worklog was deleted | None |
attachment.created | An issue attachment was created | None |
attachment.deleted | An issue attachment was deleted | None |
issue_link.created | A link between two issues was created | link type (pattern) |
issue_link.deleted | A link between two issues was deleted | link type (pattern) |
issue_type.created | An issue type was created | issue type (pattern) |
issue_type.updated | An issue type was updated | issue type (pattern) |
issue_type.deleted | An issue type was deleted | issue type (pattern) |
project.created | A project was created | project |
project.updated | A project was updated | project |
project.deleted | A project was deleted | project |
project.archived | A project was archived | project |
project.trashed | A project was moved to the trash | project |
project.restored_from_trash | A project was restored from the trash | project |
project.restored_from_archive | A project was restored from the archive | project |
version.created | A project version was created | project |
version.updated | A project version was updated | project |
version.deleted | A project version was deleted | project |
version.released | A project version was released | project |
version.unreleased | A project version was unreleased | project |
version.merged | A project version was merged into another version | project |
version.moved | A project version was moved to another position | project |
sprint.created | A sprint was created | board |
sprint.updated | A sprint was updated | board |
sprint.deleted | A sprint was deleted | board |
sprint.started | A sprint was started | board |
sprint.closed | A sprint was closed | board |
board.created | A board was created | board |
board.updated | A board was updated | board |
board.deleted | A board was deleted | board |
board_configuration.changed | A board's configuration changed | board |
filter.created | A saved filter was created | None |
filter.updated | A saved filter was updated | None |
filter.deleted | A saved filter was deleted | None |
user.created | A user was created | None |
user.updated | A user was updated | None |
user.deleted | A user was deleted | None |
configuration.changed | A global Jira setting changed | setting (pattern) |
Every filter is optional. Patterns are case-sensitive.
- Project lists the projects the account can see. Choose one or more. Issue, issue property, and comment events match on the issue's project. Project events match on the project, and version events on the version's project.
- Issue type matches the type's name, such as
BugorStory. Forissue_type.*events, it matches the name of the issue type that changed. - Moved to status matches only updates that changed the issue's status, when the new status's name matches, such as
In ProgressorDone. - Changed field matches an update when the name or ID of any changed field matches, such as
assignee,priority, orcustomfield_10016. - Property key matches the key of the issue property that was set or deleted.
- Link type matches the name of the link type, such as
BlocksorDuplicate. - Board lists the boards the account can see. Sprint events match on the board the sprint was created on.
- Setting matches the setting that changed:
voting,watching,unassigned_issues,subtasks,issuelinks,timetracking, ortimetracking_provider. - Adding, editing, or deleting a comment does not start an
issue.updatedrun. Use thecomment.*events for comments.
Admin webhook deliveries are verified with the HMAC-SHA256 X-Hub-Signature header. OAuth app deliveries are verified with the JWT that Jira signs with the app's client secret. Deliveries more than two hours old are rejected. Jira retries a failed delivery up to five times, 5 to 15 minutes apart, and Helios ignores a delivery it has already received. After a URL fails for 30 minutes, Jira sends each event once, without retries, until a delivery succeeds.
An agent's own changes can start new runs. Editing or transitioning an issue fires issue.updated, a comment fires comment.created, logging work fires worklog.created, attaching a file fires attachment.created and issue.updated, and releasing a version fires version.released. Say in the prompt which events to ignore, such as comments the agent wrote. See Guarding against events you don't want.
Check that it works
- The connection: after you save, the connection's status shows Connected. Error means Jira rejected the credential. Click Test Connection to check again.
- The webhook: for a Jira API Token connection, open Settings → System in Jira, then WebHooks under Advanced. A webhook named Helios should be listed. Only Jira admins can open this page.
- A trigger:
- Add
issue.createdto a workflow with no filters. - Create a test issue in Jira.
- Check that a run starts. Then open the connection in Helios and click Webhook events to see the event.
- Add
Common errors
| What you see | Cause | Fix |
|---|---|---|
Set the base URL to your Jira site, such as https://your-site.atlassian.net | Base URL is empty, has a path, or isn't an atlassian.net address | Set Base URL to your site's atlassian.net address with no path |
| The connection's status shows Error | The token was revoked or expired, the email doesn't match the token, or the token has scopes | Create a new token with Create API token and enter it through Manage |
Atlassian shows an error when you approve access, or an agent gets Unauthorized; scope does not match | The OAuth app is missing a scope from the first table, or Admin access is checked and the app is missing an admin scope | Turn on every scope in the developer console, or uncheck Admin access, then click Re-connect |
The OAuth app can reach several Jira sites. Set the base URL to the site to connect. | The app was approved for more than one site and Base URL is empty | Set Base URL through Manage, then click Re-connect |
The OAuth app has no access to https://… | The site in Base URL wasn't chosen when you approved access | Click Re-connect and choose that site, or correct Base URL |
Authorize the Jira OAuth app first | Access wasn't approved in Atlassian | Open the connection and click Re-connect |
Every event shows as unavailable with Jira refused the webhook request. The account needs the Administer Jira global permission. | The token's account isn't a Jira admin | Give the account Administer Jira, then save the connection again |
| An event shows as unavailable in the trigger picker | Jira doesn't send that event to OAuth apps, or Jira refused the webhook for it. The reason is shown next to the event | Use a Jira API Token connection for that event, or add the missing scope and click Re-connect |
| No run starts after an event | The webhook wasn't registered, the OAuth app lacks manage:jira-webhook, another Helios connection uses the same OAuth app and account, the event is in a project the account can't see, or the filters don't match | Check the errors above and save the connection again. Then remove the filters and try again |
Limits
Jira answers 429 Too Many Requests with a Retry-After header when a connection sends too many requests. See Atlassian's rate limiting docs.
An OAuth app can register at most 5 webhooks for each Atlassian account on a site, and Helios uses 4. See Webhooks for Jira's limits on OAuth app webhooks.
Last updated on
GitHub
The GitHub integration lets Helios agents search and call the entire GitHub REST API to manage repositories, automate pull requests and issues, drive GitHub Actions, and run automatically on repository events.
Vercel
The Vercel integration lets Helios agents call the Vercel REST API with your access token, and run agents automatically on Vercel webhook events such as failed deployments, promotions, rollbacks, domain and certificate changes, environment variable changes, feature flag changes, alerts, and firewall attacks.