Linear
The Linear integration lets Helios agents query and change your Linear workspace through its GraphQL API, and run agents automatically when issues, comments, projects, cycles, documents, initiatives, customers, or releases are created, updated, or removed.
What your agents can do
Linear exposes a GraphQL API. Helios agents run GraphQL queries and mutations with your API key or OAuth token attached to API calls. Your connection's permissions determine which data and operations they can access.
- Create issues from a bug report, an alert, or a Slack thread, with labels, priority, and assignee
- Search the backlog and summarize a cycle or project
- Move issues between states, and change priority or assignee
- Comment on issues, project updates, and documents, and reply to comments
- Post project updates and read initiatives and customer requests
Agents can download files stored in Linear, such as images and files linked from issues, from uploads.linear.app. To add an image, an agent puts its URL in the markdown of an issue, comment or document, and Linear copies it into its own storage.
Authentication
| Method | Type | Description |
|---|---|---|
| Linear API Key | API Key | A personal API key from a Linear workspace member |
| Your own Linear OAuth app | OAuth 2.0 | An OAuth app you register in Linear |
See Integration authentication for how credentials are stored and injected.
Linear API Key
You need a Linear account that can create personal API keys. Admins can always create them, and members can if the workspace allows it. Triggers also need the key to belong to a workspace admin.
- In Linear, open Settings → Account → Security & Access.
- Under Personal API keys, create a key. Give it full access, or at least the Read, Write, and Admin permissions.
- In Helios, choose Linear API Key and paste the key into Linear API Key.
- Optional: to watch one team for triggers, enter its key, such as
ENG, in Team. - Save.
Linear only lets admins create webhooks, so triggers need the Admin permission. A key without it can still make API calls within its permissions.
Linear records every change made with the key as the member who owns it. A separate Linear member for Helios keeps the agent's changes apart from yours.
Your own Linear OAuth app
You need to be a workspace admin to create OAuth applications in Linear.
-
In Linear, open Settings → Administration → API and create a new OAuth application.
-
Add this callback URL to the application:
https://api.heliosapp.com/integrations/linear/oauth_callback -
In Helios, choose Your own Linear OAuth app and enter the application's Client ID and Client Secret. To use triggers, turn on Admin access. Optional: enter a team key in Team.
-
Save, then approve access in Linear. With Admin access, a workspace admin must approve it.
Helios asks for these scopes:
| Scope | What it's for |
|---|---|
read | Read everything the approving member can see |
write | Create and change issues, comments, projects, and other data |
issues:create | Create issues and their attachments |
comments:create | Create comments |
timeSchedule:write | Create and change time schedules |
admin | Only with Admin access. Use admin endpoints, and create the webhook for triggers |
Linear only lets admins and apps with the admin scope create webhooks. Without Admin access, Helios doesn't ask for admin, registers no webhook, and shows every event as unavailable. Agents can still make API calls. Linear's app scopes, such as app:assignable and app:mentionable, are for apps installed as their own user. Helios connects as the member who approves the app, so it doesn't ask for them.
Linear records changes as the member who approved the app. Helios uses the refresh token Linear issues to renew expired access tokens. Deleting the connection revokes both tokens in Linear.
If you rotate the client secret in Linear, enter the new one in Helios through Manage and connect again. Connect again after you change Admin access too. If you turn off Admin access, Helios rejects deliveries from the webhooks it registered before but can't remove them. Delete the Helios webhooks in Linear under Settings → Administration → API.
Triggers
Linear can start a Workflow when something happens in your workspace. Helios registers webhooks named Helios in Linear when you save the connection, so there is nothing to set up in Linear. This needs the Admin permission on the API key, or Admin access on an OAuth app connection. Saving the connection again updates its webhooks instead of adding more. Deleting the connection removes them.
Helios registers one webhook for all public teams, and one for each private team that the connecting member belongs to. Each webhook subscribes to every event below. Save the connection again to cover a private team that the member joins later. To watch one team only, set Team to the team's key, such as ENG.
| Event | Description | Filters |
|---|---|---|
issue.created | An issue was created | team, label (pattern) |
issue.updated | An issue was updated | team, label (pattern), moved to state (pattern) |
issue.removed | An issue was removed | team, label (pattern) |
attachment.created | An issue attachment was created | None |
attachment.updated | An issue attachment was updated | None |
attachment.removed | An issue attachment was removed | None |
comment.created | A comment on an issue, document or update was created | team |
comment.updated | A comment on an issue, document or update was updated | team |
comment.removed | A comment on an issue, document or update was removed | team |
issue_label.created | An issue label was created | team |
issue_label.updated | An issue label was updated | team |
issue_label.removed | An issue label was removed | team |
reaction.created | An emoji reaction was created | team |
reaction.updated | An emoji reaction was updated | team |
reaction.removed | An emoji reaction was removed | team |
project.created | A project was created | team |
project.updated | A project was updated | team |
project.removed | A project was removed | team |
project_update.created | A project update was created | None |
project_update.updated | A project update was updated | None |
project_update.removed | A project update was removed | None |
document.created | A document was created | None |
document.updated | A document was updated | None |
document.removed | A document was removed | None |
initiative.created | An initiative was created | None |
initiative.updated | An initiative was updated | None |
initiative.removed | An initiative was removed | None |
initiative_update.created | An initiative update was created | None |
initiative_update.updated | An initiative update was updated | None |
initiative_update.removed | An initiative update was removed | None |
cycle.created | A cycle was created | team |
cycle.updated | A cycle was updated | team |
cycle.removed | A cycle was removed | team |
customer.created | A customer was created | None |
customer.updated | A customer was updated | None |
customer.removed | A customer was removed | None |
customer_need.created | A customer request was created | team |
customer_need.updated | A customer request was updated | team |
customer_need.removed | A customer request was removed | team |
user.created | A user was created | None |
user.updated | A user was updated | None |
user.removed | A user was removed | None |
issue_sla.set | An SLA was set on an issue | team, label (pattern) |
issue_sla.high_risk | An issue's SLA is at high risk of being breached | team, label (pattern) |
issue_sla.breached | An issue's SLA was breached | team, label (pattern) |
project_label.created | A project label was created | None |
project_label.updated | A project label was updated | None |
project_label.removed | A project label was removed | None |
release.created | A release was created | None |
release.updated | A release was updated | None |
release.removed | A release was removed | None |
release_note.created | A release note was created | None |
release_note.updated | A release note was updated | None |
release_note.removed | A release note was removed | None |
- Team lists the teams the connection watches. That is the team set in Team on the connection. When Team is empty, it is every public team and the connecting member's private teams. It matches when the event belongs to one of the chosen teams. Comments, reactions, customer requests, and Issue SLA events belong to their issue's team, and a project matches if any of its teams is chosen. Events without a team, such as a comment on a document, a reaction to a comment, or a workspace label, don't match when Team is set.
- Label is a pattern. It matches when any label on the issue matches, such as
bugorcustomer-*. Case matters. - Moved to state is a pattern. It matches only updates that changed the issue's state, when the new state's name matches, such as
In ProgressorDone. Case matters.
All filters are optional.
Issue SLA events need a Linear plan with SLAs, and release and release note events need a plan with Releases. Linear refuses webhooks for a type that your plan doesn't include. Helios then subscribes to every other type and marks the refused type's events as unavailable in the trigger picker, with Linear's reason, such as "Release events need Linear's Business plan."
Deliveries are verified with the HMAC-SHA256 Linear-Signature header, and deliveries more than a minute old are rejected. Save the connection again in Helios to re-enable its webhook if Linear disables it after failed deliveries.
An agent's own changes can start new runs. Editing an issue fires issue.updated, a comment or reply fires comment.created, an emoji reaction fires reaction.created, and a project update fires project_update.created. Say in the prompt which events to ignore, such as comments the agent wrote. See Guarding against events you don't want.
Not covered
Helios doesn't subscribe to these Linear webhook types:
| Type | Why |
|---|---|
AgentSessionEvent, AppUserNotification, PermissionChange | Linear sends them only to apps installed as their own user. Helios connects as a member, because those apps can't ask for the admin scope that webhooks need |
OAuth app revoked, OAuthAuthorization | Linear sends them only to the webhook URL in the OAuth app's own settings, which is set once for the app, not for each connection. Helios finds a revoked app on its next API call and shows the connection as Error |
| Audit log entries | Linear streams them through the audit log settings on the Enterprise plan, not through API webhooks |
Agents can't use Linear's GraphQL subscriptions. Subscriptions need a WebSocket connection, and agents call the API over HTTP.
Check that it works
- The connection: after you save, the connection's status shows Connected. Error means Linear rejected the key or token.
- The webhook: in Linear, open Settings → Administration → API. A webhook named Helios should be listed, plus one for each private team that Helios watches.
- A trigger:
- Add
issue.createdto a workflow with no filters. - Create a test issue in Linear.
- 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 |
|---|---|---|
| The connection's status shows Error | The key was revoked, or the OAuth app's access was removed | Create a new key, or connect the OAuth app again |
Every event shows as unavailable with No Linear team has the key "…" | Team doesn't match any team key | Use the key shown in the team's settings, such as ENG, or leave Team empty. Then save the connection again |
Every event shows as unavailable with Turn on Admin access and connect again. | The OAuth app connection doesn't have Admin access | Turn on Admin access through Manage, then connect again and approve as a workspace admin |
| No Helios webhook in Linear, and every event shows as unavailable with Linear's reason | The key or the approving member isn't an admin, or the key lacks the Admin permission | Use an admin's key with Admin, or approve the OAuth app as an admin, then save the connection again |
| Events from one private team never arrive | The connecting member isn't in the team or joined it after the connection was saved. Or Linear refused the webhook for that team, and Helios skipped it | Add the member to the team, then save the connection again |
Access token not found. Please complete the OAuth flow first. | The OAuth approval wasn't finished | Open the connection and connect again |
| No run starts after an event | The webhook wasn't registered, Linear disabled it after failed deliveries, the filters don't match, or the plan doesn't include SLAs or releases | Check for the Helios webhook in Linear and save the connection again. Then remove the filters and try again |
| Some events show as unavailable, such as release events | Linear refused that event type for the workspace, usually because the plan doesn't include it | Read the reason in the trigger picker. After upgrading the Linear plan, save the connection again to subscribe to those events |
Last updated on
Plain
The Plain integration lets Helios agents query and mutate your Plain workspace through its GraphQL API, and run agents automatically when customer threads are created.
PagerDuty
The PagerDuty integration lets Helios agents call PagerDuty's REST API, Events API, and its Slack, Microsoft Teams, Jira Cloud and SCIM APIs, and start workflows on supported incident and service events.