Linear: Query Issues
Actionaction.linear_query
Read issues out of Linear — your assigned work, the current cycle, a project, or a filtered search — as a real array a flow can loop over or hand to an AI node.
Where Linear: Create Issue and Linear: Add Comment write to Linear, this node reads from it. Point it at one of four kinds of query, narrow it with a few shared filters, and it fetches the matching issues in a single page and emits them as a structured payload. The signature use is a morning briefing: on a schedule, pull the issues that matter and let an AI node turn them into a paragraph you actually read.
This node requires a connected Linear account. Open Settings → Integrations and paste a Linear Personal API key before using it. See the Integrations guide for the full connection walkthrough. Because it only reads, it is safe to run on a timer without side effects.
Ports
| Direction | Name | Data Type | Description |
|---|---|---|---|
| Input | Input | Any | Incoming payload — passed through and available for {{var}} interpolation in the scope fields |
| Output | Output | Any | The incoming payload merged with issues, count, and hasMore |
Query Modes
The Query dropdown picks what to fetch. Every mode also honors the shared State / Priority / Updated Within filters below.
| Mode | Value | Returns | Scope needed |
|---|---|---|---|
| My assigned issues | my-assigned-issues | Issues assigned to the connected account's own user. | Account only |
| Current cycle | current-cycle | Issues in the team's active cycle. A team with no running cycle simply returns an empty array. | Account → Team |
| Project issues | project-issues | Issues belonging to a specific project. | Account → Team → Project |
| Search (filters only) | search | The whole workspace, narrowed by only the shared filters — no assignee, cycle, or project pin. | Account only |
Configuration
| Field | Type | Default | Description |
|---|---|---|---|
| mode | Dropdown | my-assigned-issues | Which of the four queries to run (see the table above). |
| scope | Account › Team › Project Picker | — | The cascading picker. Choose the connected Linear Account, then narrow to a Team (for Current cycle) and a Project (for Project issues). The team and project rows appear only for the modes that need them. |
| state | Dropdown | all | Workflow-state bucket. Open = triage, backlog, todo, in progress; Active = todo + in progress; All states applies no state filter. |
| priority | Dropdown | any | Priority floor. High or Urgent, Urgent only, or Any priority (no filter). |
| updatedAfter | Dropdown | Any time | Recency window on updatedAt: last 24 hours, 7 days, or 30 days. |
| limit | Number | 50 | Max issues to fetch in this one page. Clamped to Linear's 1…250 window. If the workspace holds more matches than the page returns, hasMore is true. |
The team and project fields accept {{var}} interpolation, so an upstream node can route the scope dynamically — the picker just writes the resolved ids for you. This node fetches a single page; there is no cursor or auto-pagination in this release.
Output Payload
The results are merged into the incoming payload under three keys. Crucially, issues is a real array of structured objects — not JSON packed into a string — so a downstream Loop, an {{issues.0.…}} template, or an AI node can iterate it directly.
| Variable | Type | Description |
|---|---|---|
| issues | Array | The matching issues. Each element is a nested object (shape below). Nothing matched → an empty array ([]), never a missing key. |
| count | Number | How many issues came back on this page (the length of issues). |
| hasMore | Boolean | true when the workspace holds more matches than this single page returned — raise limit or narrow the filters. |
Feeding a Loop? Set its arrayKey to issues.
The For Each node iterates whatever key you point its Loop Over field at — here that is issues. Each element is exposed as {{item}} (or your chosen item name), so you reach the nested fields with {{item.identifier}}, {{item.state.name}}, and so on.
Per-issue shape
Every element of issues carries this lean, nested shape. (There is no issue description — a briefing wants the shape, not the body.) Reach a field on the first result with {{issues.0.…}}, or on the current loop element with {{item.…}}.
| Field | Type | Description |
|---|---|---|
| identifier | String | Human-readable id, e.g. WAT-123 |
| title | String | Issue title |
| url | String | Web URL of the issue |
| priority | Number | Numeric priority: 0 none, 1 urgent, 2 high, 3 medium, 4 low |
| priorityLabel | String | The priority as a word, e.g. Urgent |
| state.name | String | Workflow-state name, e.g. In Progress |
| state.type | String | State category: triage, backlog, unstarted, started, completed, canceled |
| assignee.name | String | Assignee username (null if unassigned) |
| assignee.displayName | String | Assignee display name |
| assignee.email | String | Assignee email |
| project.id | String | Parent project UUID (null if none) |
| project.name | String | Parent project name |
| cycle.id | String | Cycle UUID (null if not in a cycle) |
| cycle.number | Number | Cycle number |
| cycle.name | String | Cycle name |
| cycle.endsAt | String | Cycle end timestamp (ISO 8601) |
| team.key | String | Team key, e.g. WAT |
| team.name | String | Team name |
| dueDate | String | Due date (null if unset) |
| createdAt | String | Creation timestamp (ISO 8601) |
| updatedAt | String | Last-updated timestamp (ISO 8601) |
Recommended pattern: the daily briefing
The cleanest use is one holistic AI call. A Schedule trigger fires the flow each morning, the Query node pulls your issues, and a single AI Prompt receives the whole {{issues}} array and writes a short summary — which a Notification delivers. One request, one paragraph, the full picture.
A prompt like “Here are my open Linear issues: {{issues}}. Write a two-sentence stand-up summary grouped by state.” works because {{issues}} hands the model the real array. Because the results emit under issues and not linear, you can even chain a Create Issue before the query without either clobbering the other's keys.
Alternative: act on each issue
When you need a per-issue action rather than one summary — post a comment, write a row to a log, ping a webhook — feed the array into a For Each loop. Set its Loop Over field to issues; each pass exposes one issue as {{item}}, so downstream nodes read {{item.identifier}}, {{item.state.name}}, {{item.assignee.displayName}}, and the rest.
Prefer the single AI call for anything you'd read — it costs one request and reasons over the whole set. Reach for the loop only when each issue needs its own side effect.
AI Agent tool
The same query is available to the Agent node as the read-only tool linear_query_issues, with full parity to this node's four modes and filters. It is opt-in — enable it in the Agent's Tools section (it appears once a Linear account is connected) — so an autonomous agent can pull issues mid-reasoning. Being read-only, it is not a destructive tool and needs no confirmation.