When to Use
- Status-gated workflow routing: Before transitioning an issue, call
issue/get to read the current status. If it is already "Done", skip the transition. This prevents API errors from attempting invalid state changes.
- PR-to-issue context enrichment: When a GitHub pull request is opened with a Jira key in its title or branch name, fetch the full issue to extract the assignee, priority, and description — then include that context in the PR review notification sent to Slack.
- Escalation checks: A scheduled workflow runs every 15 minutes to fetch high-priority issues that have been "In Progress" for more than 4 hours without update, then sends a manager alert if the issue is still open past SLA.
- Integration data enrichment: A deployment pipeline records a Jira issue key. Before deploying, the pipeline fetches the issue to confirm it has status "Approved for Release". If not, the deployment is blocked and the issue creator is notified.
- Report generation: A weekly report workflow fetches each issue from a curated list, extracts summary, assignee, priority, and days open, then assembles a Notion database row or email attachment with the current state of each tracked item.
Configuration
Connection
| Field | Required | Description |
Host | Required | Jira instance base URL. Example: https://acmecorp.atlassian.net |
Email | Required | Atlassian account email. Example: automation@acmecorp.com |
ApiToken | Required | API token from Atlassian security settings. Store in Credentials Manager. |
Operation Fields
| Field | Required | Description |
IssueKey | Required | The Jira issue key to retrieve. Format: {PROJECT}-{NUMBER}. Example: PROJ-123, OPS-47. Case-insensitive. |
Single-field input: issue/get requires only the issue key. All available fields are returned automatically — there is no field-selection filter. To retrieve multiple issues at once, use issue/getAll with a JQL query.
Sample Configuration
{
"resource": "issue",
"operation": "get",
"Host": "https://acmecorp.atlassian.net",
"Email": "automation@acmecorp.com",
"ApiToken": "{{ $credentials.jiraApiToken }}",
"IssueKey": "{{ $json.jiraIssueKey }}"
}
Validation Errors
| Error Code | Cause |
VAL_MISSING_ISSUE_KEY | IssueKey is empty or null. |
VAL_INVALID_ISSUE_KEY_FORMAT | IssueKey does not match the PROJ-NNN pattern. |
ISSUE_NOT_FOUND | No issue exists with the given key, or the authenticated user lacks access to it. |
AUTH_FAILED | Invalid credentials or expired API token. |
Output Fields
| Field | Type | Description |
status | string | "success" or "error" |
issueId | string | Internal Jira numeric ID. Example: "10482" |
issueKey | string | Issue key. Example: "PROJ-123" |
summary | string | Issue title / one-line summary. |
description | string | Issue description body. May be null if not set. |
status_val | string | Current workflow status name. Example: "In Progress", "To Do", "Done". |
priority | string | Priority name. Example: "High", "Medium". |
assignee | string | Display name of the current assignee. Null if unassigned. |
resource | string | Always "issue" |
operation | string | Always "get" |
Sample Output
{
"status": "success",
"issueId": "10482",
"issueKey": "PROJ-123",
"summary": "[P1 ALERT] Payment gateway timeout — checkout-service",
"description": "Service: checkout-service\nEnv: production\n\nERROR: Connection timeout after 30s to payment-gw.internal:8443",
"status_val": "In Progress",
"priority": "Highest",
"assignee": "Sarah Chen",
"resource": "issue",
"operation": "get"
}
Expression Reference
| Expression | Type | Example Value | Use |
{{ $output.getIssue.summary }} | string | "[P1 ALERT] Payment timeout" | Include in Slack message or report |
{{ $output.getIssue.status_val }} | string | "In Progress" | Gate transitions — skip if already "Done" |
{{ $output.getIssue.assignee }} | string | "Sarah Chen" | Address notifications to the current assignee |
{{ $output.getIssue.priority }} | string | "Highest" | Route high-priority issues to dedicated escalation channel |
{{ $output.getIssue.issueKey }} | string | "PROJ-123" | Build browse URL: https://acmecorp.atlassian.net/browse/{{ $output.getIssue.issueKey }} |
{{ $output.getIssue.description }} | string | Full description text | Extract context for downstream enrichment |
Node Policies & GuardRails
- Use issue/get for single known keys: When you have a specific issue key from a prior step, use
issue/get. For unknown sets, use issue/getAll with JQL — it is more efficient than calling issue/get in a loop.
- Handle null fields gracefully:
description and assignee may be null for issues created without these fields. Use null-coalescing expressions: {{ $output.getIssue.assignee ?? "Unassigned" }}.
- Status string comparison is case-sensitive: Jira status names are case-sensitive in expressions. Use exact casing from your project's workflow (e.g.
"In Progress" not "in progress").
- API token in Credentials Manager: Never hard-code the API token. Reference it as
{{ $credentials.jiraApiToken }}.
Workflow Examples
Example 1 — Status Gate Before Transition
Read current issue status before attempting a workflow transition to avoid invalid transition errors.
// Step 1: issue/get
{
"resource": "issue",
"operation": "get",
"IssueKey": "{{ $json.issueKey }}"
}
// Step 2: IfCondition — gate on status
// Condition: {{ $output.getIssue.status_val }} !== "Done"
// Step 3 (if not done): issue/executeTransition
{
"resource": "issue",
"operation": "executeTransition",
"IssueKey": "{{ $json.issueKey }}",
"TransitionId": "{{ $json.transitionId }}"
}
Example 2 — Enrich PR Notification with Jira Context
GitHub webhook triggers on PR open → extract Jira key from branch name → fetch issue → post enriched Slack alert.
// Step 1: WebhookTrigger (GitHub PR opened)
// Step 2: Extract issue key from branch name (e.g. "feature/PROJ-123-payment-fix")
// Step 3: issue/get with extracted key
{
"resource": "issue",
"operation": "get",
"IssueKey": "{{ $json.extractedKey }}"
}
// Step 4: Slack/postMessage
{
"channel": "#engineering",
"text": "PR opened: {{ $json.pr.title }}\n*Jira:* {{ $output.getIssue.summary }} ({{ $output.getIssue.status_val }})\n*Assignee:* {{ $output.getIssue.assignee }}\n*Priority:* {{ $output.getIssue.priority }}"
}