<!-- BusyBot node reference — https://busybot.net/tools/linear/ -->

> Node: Linear (`linear`) · Action · v1
> Category: Productivity · Credentials: Linear (`linearApi`)
> Updated: 2026-08-16

# Linear

> Create, read, update, and delete issues in Linear, add comments, and attach links.

## Overview

The Linear tool communicates with the Linear project management platform via its GraphQL API (https://api.linear.app/graphql). It supports full CRUD operations on issues (create, get, get many, update, delete), adding URL links to issues as attachments, and creating comments on issues with optional threading (parent comment replies). All requests use Bearer token authentication with the Linear API key. Issue retrieval supports cursor-based pagination with returnAll and limit parameters. GraphQL errors are extracted and surfaced with user-presentable messages when available.

**Category:** Productivity  
**Tool Name:** `linear`  
**Version:** 1

**Appearance:** Icon: `si-linear` | Color: `#5E6AD2`

## Node Type

**Action** — processes input items and produces output

## Input / Output

| Direction | Port(s) |
|-----------|--------|
| Input | `Input` |
| Output | `Output`, `Error` |

## Credentials

This tool requires **Linear** credentials.
See the [Credentials Guide](https://busybot.net/credentials/linear-api/) for setup instructions.

### Resources

| Resource | Value |
|----------|-------|
| Comment | `comment` |
| Issue | `issue` |

### Operations

**Issue** (`issue`)

| Operation | Value | Description |
|-----------|-------|-------------|
| Add Link | `addLink` | Add a link to an issue |
| Create | `create` | Create an issue |
| Delete | `delete` | Delete an issue |
| Get | `get` | Get an issue |
| Get Many | `getAll` | Get many issues |
| Update | `update` | Update an issue |

**Comment** (`comment`)

| Operation | Value | Description |
|-----------|-------|-------------|
| Add Comment | `addComment` | Add a comment to an issue |

### Parameters

#### Issue: Add Link

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Issue ID (`issueId`) | `string` | Yes | — | The ID of the issue. Supports expressions like {{ $json.issueId }}. |
| Link | `string` | Yes | — | The URL to attach to the issue. Supports expressions like {{ $json.url }}. |

#### Issue: Create

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Team ID | `string` | Yes | — | ID of the team. Find in Linear: Settings > Teams > click team > copy ID from URL, or use the Linear API to list teams. Supports expressions like {{ $json.teamId }}. |
| Title | `string` | Yes | — | The title of the issue. Supports expressions like {{ $json.title }}. |
| Additional Fields (`additionalFields`) | `collection` | No | `{}` | Optional issue fields set at creation time. |
| — Assignee ID | `string` | No | — | User ID to assign the issue to. Use the Linear API to list users and find their IDs. |
| — Description | `string` | No | — | Issue description. Supports Markdown formatting. |
| — Priority | `options` | No | `0` | The priority level for the issue. |
| | | | | Options: `0` (No Priority), `1` (Urgent), `2` (High), `3` (Normal), `4` (Low) |
| — State ID | `string` | No | — | Workflow state ID. Use the Linear API to list workflow states for a team. |

#### Issue: Delete

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Issue ID (`issueId`) | `string` | Yes | — | The ID of the issue. Supports expressions like {{ $json.issueId }}. |

#### Issue: Get

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Issue ID (`issueId`) | `string` | Yes | — | The ID of the issue. Supports expressions like {{ $json.issueId }}. |

#### Issue: Get Many

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Return All | `boolean` | No | `false` | Whether to return all results or only up to a given limit. |
| Limit | `number` | No | `50` | Max number of results to return. _(shown when Return All is `false`)_ |

#### Issue: Update

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Issue ID (`issueId`) | `string` | Yes | — | The ID of the issue to update. Supports expressions like {{ $json.issueId }}. |
| Update Fields | `collection` | No | `{}` | The issue fields to change. Only the fields you add are sent. |
| — Assignee ID | `string` | No | — | User ID to reassign the issue to. |
| — Description | `string` | No | — | New issue description. Supports Markdown formatting. |
| — Priority | `options` | No | `0` | The new priority level for the issue. |
| | | | | Options: `0` (No Priority), `1` (Urgent), `2` (High), `3` (Medium), `4` (Low) |
| — State ID | `string` | No | — | New workflow state ID. |
| — Team ID | `string` | No | — | Move the issue to a different team by providing the new team ID. |
| — Title | `string` | No | — | New title for the issue. |

#### Comment: Add Comment

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Issue ID (`issueId`) | `string` | Yes | — | The ID of the issue to add a comment to. Supports expressions like {{ $json.issueId }}. |
| Comment | `string` | Yes | — | The comment body text. Supports Markdown formatting, and expressions like {{ $json.body }}. |
| Additional Fields (`additionalFields`) | `collection` | No | `{}` | Optional comment fields. |
| — Parent Comment ID | `string` | No | — | ID of the parent comment if this is a reply. |

#### All Operations

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Max Concurrency | `number` | No | `10` | Maximum number of items to process concurrently. |

## Output Data

The API result is merged into the item JSON at the top level, so the incoming item's own fields pass through alongside it and binary data on the input item is forwarded unchanged. Every operation except `Issue: Get Many` produces exactly one output item per input item.

- **`Issue: Get Many` fans out** — it emits **one output item per issue**. Ten matching issues from a single input item become ten output items.
- **An empty result is not silently dropped.** When `Issue: Get Many` matches no issues, the node still emits one item: the input item's JSON with `_noResults: true` added. Check for that flag before treating a downstream item as a real issue.
- `Return All` pages through the whole issue list; with it off, paging stops once `Limit` issues have been collected.

The fields that land on the item depend on the operation:

| Operation | Fields merged onto the item |
|-----------|------------------------------|
| `create`, `get`, `getAll`, `update` | `id`, `identifier`, `title`, `description`, `priority`, `dueDate`, `createdAt`, `archivedAt`, `state` (`id`, `name`), `assignee` (`id`, `displayName`), `creator` (`id`, `displayName`), `cycle` (`id`, `name`) |
| `delete` | `success` |
| `addLink` | `success` |
| `addComment` | `success`, `comment` (`id`) |

Note that the priority you set through the `Priority` field comes back as `priority` on the issue.

Reference the result downstream by expression, e.g. `{{ $json.id }}` for the issue's internal ID or `{{ $json.identifier }}` for its human-readable key.

## Usage Examples

- Create a new issue in a Linear team
- Get all issues from Linear
- Update the priority of a Linear issue
- Delete a Linear issue
- Add a URL link to a Linear issue
- Add a comment to a Linear issue

## Example Configuration

Create an issue with a description, assignee, priority and starting state:

```json
{
  "type": "linear",
  "parameters": {
    "resource": "issue",
    "operation": "create",
    "teamId": "team_12345",
    "title": "Fix login bug",
    "additionalFields": {
      "description": "Users are unable to log in with their email addresses",
      "assigneeId": "user_67890",
      "priorityId": 1,
      "stateId": "state_todo"
    }
  }
}
```

Read a single issue by ID:

```json
{
  "type": "linear",
  "parameters": {
    "resource": "issue",
    "operation": "get",
    "issueId": "issue_abc123"
  }
}
```

List issues, stopping after the first 50:

```json
{
  "type": "linear",
  "parameters": {
    "resource": "issue",
    "operation": "getAll",
    "returnAll": false,
    "limit": 50
  }
}
```

List every issue the API key can see:

```json
{
  "type": "linear",
  "parameters": {
    "resource": "issue",
    "operation": "getAll",
    "returnAll": true
  }
}
```

Update an existing issue's title, description, state and priority:

```json
{
  "type": "linear",
  "parameters": {
    "resource": "issue",
    "operation": "update",
    "issueId": "issue_abc123",
    "updateFields": {
      "title": "Updated: Fix critical login bug",
      "description": "Updated description with more details",
      "stateId": "state_inprogress",
      "priorityId": 0
    }
  }
}
```

Attach a reference URL to an issue:

```json
{
  "type": "linear",
  "parameters": {
    "resource": "issue",
    "operation": "addLink",
    "issueId": "issue_abc123",
    "link": "https://docs.example.com/troubleshooting"
  }
}
```

Delete an issue:

```json
{
  "type": "linear",
  "parameters": {
    "resource": "issue",
    "operation": "delete",
    "issueId": "issue_abc123"
  }
}
```

Post a Markdown comment on an issue:

```json
{
  "type": "linear",
  "parameters": {
    "resource": "comment",
    "operation": "addComment",
    "issueId": "issue_abc123",
    "comment": "This issue has been reproduced on staging environment. **Priority:** High"
  }
}
```

Reply to an existing comment by threading under its ID:

```json
{
  "type": "linear",
  "parameters": {
    "resource": "comment",
    "operation": "addComment",
    "issueId": "issue_abc123",
    "comment": "Thanks for the update! I'll look into this.",
    "additionalFields": {
      "parentId": "comment_xyz789"
    }
  }
}
```

Create an issue with only the required fields:

```json
{
  "type": "linear",
  "parameters": {
    "resource": "issue",
    "operation": "create",
    "teamId": "team_12345",
    "title": "New feature request"
  }
}
```

Chain three nodes to create an issue, comment on it, then move it: because the created issue is merged onto the item, the following nodes address it as `{{ $json.id }}`.

```json
{
  "type": "linear",
  "parameters": {
    "resource": "issue",
    "operation": "create",
    "teamId": "team_12345",
    "title": "Implement user authentication",
    "additionalFields": {
      "description": "Add OAuth2 integration for user login",
      "assigneeId": "user_67890",
      "priorityId": 1
    }
  }
}
```

```json
{
  "type": "linear",
  "parameters": {
    "resource": "comment",
    "operation": "addComment",
    "issueId": "{{ $json.id }}",
    "comment": "Starting implementation of OAuth2 flow"
  }
}
```

```json
{
  "type": "linear",
  "parameters": {
    "resource": "issue",
    "operation": "update",
    "issueId": "{{ $json.id }}",
    "updateFields": {
      "stateId": "state_inprogress"
    }
  }
}
```

### Error Handling

| Mode | Behavior |
|------|----------|
| **stop** | Halts workflow on first error |
| **continue** | Skips failed items, passes successful ones through |
| **errorPort** | Routes failed items to Error output port |

## Tips

Manages Linear issues and comments via GraphQL API — create, read, update, delete issues, add links, and create threaded comments.

### Key Points to Remember
- All collection parameters (`additionalFields`, `updateFields`) use flat object structure - never wrap in arrays or use `_default`
- The `operation` parameter options depend entirely on the selected `resource`
- Issue IDs are required for all operations except `create` and `getAll`
- Markdown formatting is supported in comment text