When to Use
- Dynamic transition lookup: Instead of hardcoding transition IDs (which are instance-specific and can be renumbered when workflows change), always call
getTransitions first to discover the current ID for "In Review", "Done", or any custom state name.
- Multi-project workflow automation: Different Jira projects have different workflow configurations. A general-purpose automation workflow calls
getTransitions for each issue to safely identify the "close" transition regardless of which project the issue belongs to.
- Transition availability check: Before attempting to move an issue to "QA Ready", check that the transition exists from the current state. If it is not in the returned transitions, the issue cannot be moved — skip it or route to an error handler.
- Sprint end processing: At sprint close, a workflow iterates through all sprint issues and calls
getTransitions on each one to find the "Complete Sprint" transition ID before executing it.
- Developer portal integration: A developer self-service portal lets engineers trigger status changes from a UI. The portal calls
getTransitions to build the dropdown of available transitions for the selected issue, then calls executeTransition with the selected ID.
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 key of the issue to fetch transitions for. Example: PROJ-123. The returned transitions reflect what is available from the issue's current status. |
Never hardcode transition IDs: Transition IDs are numeric identifiers assigned by Jira's workflow engine. They are instance-specific (ID 21 on one instance may be "In Progress" but "Done" on another). Workflows configured to use hardcoded IDs will break silently after workflow reconfiguration. Always resolve transition names dynamically via this operation.
Sample Configuration
{
"resource": "issue",
"operation": "getTransitions",
"Host": "https://acmecorp.atlassian.net",
"Email": "automation@acmecorp.com",
"ApiToken": "{{ $credentials.jiraApiToken }}",
"IssueKey": "{{ $json.issueKey }}"
}
Validation Errors
| Error Code | Cause |
VAL_MISSING_ISSUE_KEY | IssueKey is empty or null. |
ISSUE_NOT_FOUND | No issue exists with the given key, or the user lacks access. |
AUTH_FAILED | Invalid credentials or expired API token. |
Output Fields
| Field | Type | Description |
status | string | "success" or "error" |
transitions | array | Array of transition objects. Each object has id (string) and name (string). Only includes transitions available from the current status. |
resource | string | Always "issue" |
operation | string | Always "getTransitions" |
Sample Output
{
"status": "success",
"transitions": [
{ "id": "11", "name": "To Do" },
{ "id": "21", "name": "In Progress" },
{ "id": "31", "name": "In Review" },
{ "id": "41", "name": "Done" },
{ "id": "51", "name": "Won't Fix" }
],
"resource": "issue",
"operation": "getTransitions"
}
Expression Reference
| Expression | Type | Example Value | Use |
{{ $output.getTransitions.transitions }} | array | Array of {id, name} | Find a specific transition by name |
{{ $output.getTransitions.transitions[0].id }} | string | "11" | Pass first transition ID to executeTransition |
{{ $output.getTransitions.transitions.find(t => t.name === "Done").id }} | string | "41" | Dynamically resolve transition ID by name |
{{ $output.getTransitions.transitions.map(t => t.name) }} | array | ["To Do", "In Progress", ...] | Check if a target transition is available |
Node Policies & GuardRails
- Always call getTransitions before executeTransition: Do not cache transition IDs across workflow runs or hardcode them in configuration. Call this operation dynamically on each execution to account for workflow changes.
- Validate transition availability: After calling
getTransitions, check that the desired transition name exists in the returned array before calling executeTransition. If absent, the issue is in a state that does not allow that transition — handle gracefully.
- Name matching is case-sensitive: Jira transition names are case-sensitive. Ensure your workflow uses the exact casing as configured in the Jira workflow (e.g.
"In Progress" not "in progress").
Workflow Example — Dynamic Transition with Name Resolution
// Step 1: issue/getTransitions
{
"resource": "issue",
"operation": "getTransitions",
"IssueKey": "{{ $json.issueKey }}"
}
// Step 2: Function node — find the "Done" transition ID
// const doneTransition = $output.getTransitions.transitions.find(t => t.name === "Done");
// if (!doneTransition) throw new Error("Done transition not available from current state");
// return { transitionId: doneTransition.id };
// Step 3: issue/executeTransition
{
"resource": "issue",
"operation": "executeTransition",
"IssueKey": "{{ $json.issueKey }}",
"TransitionId": "{{ $output.findTransition.transitionId }}"
}