> For the complete documentation index, see llms.txt.
Skip to main content

Check out Port for yourself ➜ 

Linear

Linear integration actions let workflows manage issues and related content through your installed Linear integration.

Prerequisites

  • A Linear integration installed in your Port organization.
  • Actions processing enabled for the integration.
  • A Linear API key with access to the teams, issues, projects, and agents used by the workflow.

Configuration

All Linear integration actions share the same node structure:

FieldTypeDescription
typestringRequired. Must be "INTEGRATION_ACTION".
installationIdstringRequired. Your Linear integration identifier (for example linear) or installation ID. Set deferIntegrationInstallation to false when binding directly to the integration.
integrationProviderstringRequired. Must be "linear".
integrationInvocationTypeenumRequired. One of the values listed in available actions.
integrationActionExecutionPropertiesobjectRequired. Properties for the selected action.

Available actions

Each action is selected with the integrationInvocationType field:

ActionInvocation typeDescription
Create an issuecreate_issueCreate an issue in a Linear team
Create a sub-issuecreate_sub_issueCreate a child of an existing issue
Update an issueupdate_issueUpdate an existing issue
Delegate to agentdelegate_issue_to_agentDelegate an issue to a Linear agent
Archive an issuearchive_issueArchive an issue
Delete an issuedelete_issueMove an issue to Linear's trash
Add an issue commentadd_issue_commentAdd Markdown content to an issue
Add an issue reactionadd_reaction_to_issueAdd an emoji reaction to an issue
Add a documentadd_documentCreate a document associated with an issue or project

The remaining sections describe the execution properties of each action.

Issue actions

Manage an issue

Create, update, create sub-issues, delegate to agent, archive, or delete an issue.

Creates an issue in a Linear team. Set integrationInvocationType to create_issue.

Execution properties

FieldTypeDescription
teamIdstringRequired. UUID of the Linear team.
titlestringRequired. Issue title.
descriptionstringIssue description in Markdown.
assigneeIdstringUUID of the user assigned to the issue.
stateIdstringUUID of the workflow state assigned to the issue.
projectIdstringUUID of the associated project.
cycleIdstringUUID of the associated cycle.
prioritystringOne of No priority, Urgent, High, Normal, or Low.
labelIdsarrayUUIDs of labels attached to the issue.

Complete workflow example

Create issue with a self-service trigger (click to expand)
{
"identifier": "linear_create_issue",
"title": "Linear: Create issue",
"nodes": [
{
"identifier": "trigger",
"config": {
"type": "SELF_SERVE_TRIGGER",
"userInputs": {
"properties": {
"team": { "type": "string", "format": "entity", "blueprint": "linearTeam" },
"title": { "type": "string" },
"description": { "type": "string", "format": "markdown" },
"priority": {
"type": "string",
"enum": ["No priority", "Urgent", "High", "Normal", "Low"],
"default": "No priority"
},
"workflowState": {
"type": "string",
"format": "entity",
"blueprint": "linearWorkflowState",
"dependsOn": ["team"],
"dataset": {
"combinator": "and",
"rules": [
{
"operator": "relatedTo",
"blueprint": "linearTeam",
"value": { "jqQuery": ".form.team.identifier" }
}
]
}
},
"labels": {
"type": "array",
"items": {
"type": "string",
"format": "entity",
"blueprint": "linearLabel",
"dataset": {
"combinator": "and",
"rules": [
{
"property": "isGroup",
"operator": "=",
"value": false
}
]
}
}
}
},
"required": ["team", "title"]
}
}
},
{
"identifier": "linear_action",
"config": {
"type": "INTEGRATION_ACTION",
"installationId": "linear",
"integrationProvider": "linear",
"integrationInvocationType": "create_issue",
"integrationActionExecutionProperties": {
"teamId": "{{ .outputs.trigger.team | if type == \"object\" then .identifier else . end }}",
"title": "{{ .outputs.trigger.title }}",
"description": "{{ .outputs.trigger.description }}",
"priority": "{{ .outputs.trigger.priority }}",
"stateId": "{{ .outputs.trigger.workflowState | if type == \"object\" then .identifier else . end }}",
"labelIds": "{{ .outputs.trigger.labels }}"
},
"deferIntegrationInstallation": false
},
"links": ["{{ .result.issueUrl }}"]
}
],
"connections": [{ "sourceIdentifier": "trigger", "targetIdentifier": "linear_action" }]
}
Changing issue status

Use update_issue with stateId to move an issue to another workflow state. Pick a linearWorkflowState entity filtered by the issue's team.

Add an issue comment

Adds Markdown content to an issue. Set integrationInvocationType to add_issue_comment.

Execution properties

FieldTypeDescription
issueIdstringRequired. UUID or identifier of the issue.
bodystringRequired. Comment content in Markdown.

Complete workflow example

Add issue comment with a self-service trigger (click to expand)
{
"identifier": "linear_add_issue_comment",
"title": "Linear: Add issue comment",
"nodes": [
{
"identifier": "trigger",
"config": {
"type": "SELF_SERVE_TRIGGER",
"userInputs": {
"properties": {
"issue": { "type": "string", "format": "entity", "blueprint": "linearIssue" },
"body": { "type": "string", "format": "markdown" }
},
"required": ["issue", "body"]
}
}
},
{
"identifier": "linear_action",
"config": {
"type": "INTEGRATION_ACTION",
"installationId": "linear",
"integrationProvider": "linear",
"integrationInvocationType": "add_issue_comment",
"integrationActionExecutionProperties": {
"issueId": "{{ .outputs.trigger.issue | if type == \"object\" then .identifier else . end }}",
"body": "{{ .outputs.trigger.body }}"
},
"deferIntegrationInstallation": false
}
}
],
"connections": [{ "sourceIdentifier": "trigger", "targetIdentifier": "linear_action" }]
}

Add an issue reaction

Adds an emoji reaction to an issue. Set integrationInvocationType to add_reaction_to_issue.

Execution properties

FieldTypeDescription
issueIdstringRequired. UUID or identifier of the issue.
emojistringRequired. Emoji shortcode, such as +1, thumbsup, or eyes.

Complete workflow example

Add reaction to issue with a self-service trigger (click to expand)
{
"identifier": "linear_add_reaction",
"title": "Linear: Add reaction",
"nodes": [
{
"identifier": "trigger",
"config": {
"type": "SELF_SERVE_TRIGGER",
"userInputs": {
"properties": {
"issue": { "type": "string", "format": "entity", "blueprint": "linearIssue" },
"emoji": { "type": "string", "description": "Emoji shortcode, such as eyes or thumbsup" }
},
"required": ["issue", "emoji"]
}
}
},
{
"identifier": "linear_action",
"config": {
"type": "INTEGRATION_ACTION",
"installationId": "linear",
"integrationProvider": "linear",
"integrationInvocationType": "add_reaction_to_issue",
"integrationActionExecutionProperties": {
"issueId": "{{ .outputs.trigger.issue | if type == \"object\" then .identifier else . end }}",
"emoji": "{{ .outputs.trigger.emoji }}"
},
"deferIntegrationInstallation": false
}
}
],
"connections": [{ "sourceIdentifier": "trigger", "targetIdentifier": "linear_action" }]
}

Document actions

Add a document

Creates a document associated with an issue or project. Set integrationInvocationType to add_document. Provide either issueId or projectId.

Execution properties

FieldTypeDescription
titlestringRequired. Document title.
contentstringDocument content in Markdown.
issueIdstringUUID or identifier of the related issue.
projectIdstringUUID of the related project.

Complete workflow example

Add document with a self-service trigger (click to expand)
{
"identifier": "linear_add_document",
"title": "Linear: Add document",
"nodes": [
{
"identifier": "trigger",
"config": {
"type": "SELF_SERVE_TRIGGER",
"userInputs": {
"properties": {
"issue": { "type": "string", "format": "entity", "blueprint": "linearIssue" },
"project": { "type": "string", "format": "entity", "blueprint": "linearProject" },
"title": { "type": "string" },
"content": { "type": "string", "format": "markdown" }
},
"required": ["title"]
}
}
},
{
"identifier": "linear_action",
"config": {
"type": "INTEGRATION_ACTION",
"installationId": "linear",
"integrationProvider": "linear",
"integrationInvocationType": "add_document",
"integrationActionExecutionProperties": {
"title": "{{ .outputs.trigger.title }}",
"content": "{{ .outputs.trigger.content }}",
"issueId": "{{ .outputs.trigger.issue | if type == \"object\" then .identifier else . end }}",
"projectId": "{{ .outputs.trigger.project | if type == \"object\" then .identifier else . end }}"
},
"deferIntegrationInstallation": false
},
"links": ["{{ .result.documentUrl }}"]
}
],
"connections": [{ "sourceIdentifier": "trigger", "targetIdentifier": "linear_action" }]
}

Action run outputs

Integration action nodes can expose outputs for downstream workflow steps (for example run links and follow-up automations).

ActionOutput fields
create_issue, create_sub_issue, update_issue, delegate_issue_to_agentidentifier, issueId, issueUrl
archive_issue, delete_issueissueId
add_issue_commentcommentId, issueId, body
add_reaction_to_issuereactionId, issueId, emoji
add_documentdocumentId, documentUrl, title

Add a links array on the action node to surface URLs in the run UI, for example "{{ .result.issueUrl }}" or "{{ .result.documentUrl }}". Link expressions are evaluated when the action sets its output, typically when the run completes.

Build workflows using entity pickers

Most Linear execution properties, such as teamId or stateId, expect a raw UUID, which gives the person running the action no indication of what they're selecting (a workflow state UUID doesn't show that it resolves to "In Progress").

Define a SELF_SERVE_TRIGGER node with format: "entity" inputs so users select catalog entities by name or title instead, then use JQ in the action node to resolve the selected entity to the identifier its execution property expects. See the Complete workflow example under each action above for a full implementation of these entity-picker patterns.

Sync the relevant Linear blueprints first (linearTeam, linearIssue, linearWorkflowState, linearProject, linearCycle, linearLabel, linearUser).

Team identifiers

linearTeam entities may use a team key (for example GET) or a UUID as their identifier. Prefer passing the entity identifier from the picker rather than hard-coding team keys.

Entity input patterns

Catalog blueprintTypical trigger fieldMaps to action property
linearTeamteamteamId
linearIssueissue or parentIssueissueId or parentId
linearWorkflowStateworkflowStatestateId
linearProjectprojectprojectId
linearCyclecyclecycleId
linearLabellabels (array)labelIds
linearUserassignee or delegateassigneeId or delegateId

Use this JQ helper when a trigger field can be either an entity object or a plain identifier:

{{ .outputs.trigger.team | if type == "object" then .identifier else . end }}

Filter workflow states by team

linearWorkflowState entities are related to a linearTeam. Filter the picker with dependsOn and a relatedTo dataset rule:

{
"workflowState": {
"title": "Workflow State",
"type": "string",
"format": "entity",
"blueprint": "linearWorkflowState",
"dependsOn": ["team"],
"dataset": {
"combinator": "and",
"rules": [
{
"operator": "relatedTo",
"blueprint": "linearTeam",
"value": { "jqQuery": ".form.team.identifier" }
}
]
}
}
}

For update issue, filter by the selected issue's team:

"value": { "jqQuery": ".form.issue.relations.team" }

For create sub-issue, use the override team or inherit from the parent issue:

"value": {
"jqQuery": "if (.form.team | type) == \"object\" then .form.team.identifier else (.form.parentIssue.relations.team // \"\") end"
}

Exclude label groups from the picker

linearLabel entities include both labels and label groups. Linear only accepts child label IDs in labelIds, not group IDs. Filter the picker with isGroup = false:

{
"labels": {
"title": "Labels",
"type": "array",
"items": {
"type": "string",
"format": "entity",
"blueprint": "linearLabel",
"dataset": {
"combinator": "and",
"rules": [
{
"property": "isGroup",
"operator": "=",
"value": false
}
]
}
}
}
}