HELIOS DOCS

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

MethodTypeDescription
Linear API KeyAPI KeyA personal API key from a Linear workspace member
Your own Linear OAuth appOAuth 2.0An 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.

  1. In Linear, open Settings → Account → Security & Access.
  2. Under Personal API keys, create a key. Give it full access, or at least the Read, Write, and Admin permissions.
  3. In Helios, choose Linear API Key and paste the key into Linear API Key.
  4. Optional: to watch one team for triggers, enter its key, such as ENG, in Team.
  5. 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.

  1. In Linear, open Settings → Administration → API and create a new OAuth application.

  2. Add this callback URL to the application:

    https://api.heliosapp.com/integrations/linear/oauth_callback
  3. 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.

  4. Save, then approve access in Linear. With Admin access, a workspace admin must approve it.

Helios asks for these scopes:

ScopeWhat it's for
readRead everything the approving member can see
writeCreate and change issues, comments, projects, and other data
issues:createCreate issues and their attachments
comments:createCreate comments
timeSchedule:writeCreate and change time schedules
adminOnly 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.

EventDescriptionFilters
issue.createdAn issue was createdteam, label (pattern)
issue.updatedAn issue was updatedteam, label (pattern), moved to state (pattern)
issue.removedAn issue was removedteam, label (pattern)
attachment.createdAn issue attachment was createdNone
attachment.updatedAn issue attachment was updatedNone
attachment.removedAn issue attachment was removedNone
comment.createdA comment on an issue, document or update was createdteam
comment.updatedA comment on an issue, document or update was updatedteam
comment.removedA comment on an issue, document or update was removedteam
issue_label.createdAn issue label was createdteam
issue_label.updatedAn issue label was updatedteam
issue_label.removedAn issue label was removedteam
reaction.createdAn emoji reaction was createdteam
reaction.updatedAn emoji reaction was updatedteam
reaction.removedAn emoji reaction was removedteam
project.createdA project was createdteam
project.updatedA project was updatedteam
project.removedA project was removedteam
project_update.createdA project update was createdNone
project_update.updatedA project update was updatedNone
project_update.removedA project update was removedNone
document.createdA document was createdNone
document.updatedA document was updatedNone
document.removedA document was removedNone
initiative.createdAn initiative was createdNone
initiative.updatedAn initiative was updatedNone
initiative.removedAn initiative was removedNone
initiative_update.createdAn initiative update was createdNone
initiative_update.updatedAn initiative update was updatedNone
initiative_update.removedAn initiative update was removedNone
cycle.createdA cycle was createdteam
cycle.updatedA cycle was updatedteam
cycle.removedA cycle was removedteam
customer.createdA customer was createdNone
customer.updatedA customer was updatedNone
customer.removedA customer was removedNone
customer_need.createdA customer request was createdteam
customer_need.updatedA customer request was updatedteam
customer_need.removedA customer request was removedteam
user.createdA user was createdNone
user.updatedA user was updatedNone
user.removedA user was removedNone
issue_sla.setAn SLA was set on an issueteam, label (pattern)
issue_sla.high_riskAn issue's SLA is at high risk of being breachedteam, label (pattern)
issue_sla.breachedAn issue's SLA was breachedteam, label (pattern)
project_label.createdA project label was createdNone
project_label.updatedA project label was updatedNone
project_label.removedA project label was removedNone
release.createdA release was createdNone
release.updatedA release was updatedNone
release.removedA release was removedNone
release_note.createdA release note was createdNone
release_note.updatedA release note was updatedNone
release_note.removedA release note was removedNone
  • 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 bug or customer-*. 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 Progress or Done. 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:

TypeWhy
AgentSessionEvent, AppUserNotification, PermissionChangeLinear 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, OAuthAuthorizationLinear 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 entriesLinear 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:
    1. Add issue.created to a workflow with no filters.
    2. Create a test issue in Linear.
    3. Check that a run starts. Then open the connection in Helios and click Webhook events to see the event.

Common errors

What you seeCauseFix
The connection's status shows ErrorThe key was revoked, or the OAuth app's access was removedCreate 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 keyUse 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 accessTurn 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 reasonThe key or the approving member isn't an admin, or the key lacks the Admin permissionUse 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 arriveThe 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 itAdd 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 finishedOpen the connection and connect again
No run starts after an eventThe webhook wasn't registered, Linear disabled it after failed deliveries, the filters don't match, or the plan doesn't include SLAs or releasesCheck 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 eventsLinear refused that event type for the workspace, usually because the plan doesn't include itRead the reason in the trigger picker. After upgrading the Linear plan, save the connection again to subscribe to those events

Last updated on