Portal Community

When to Use

Configuration

Connection

FieldRequiredDescription
HostRequiredJira instance base URL. Example: https://acmecorp.atlassian.net
EmailRequiredAtlassian account email. Example: automation@acmecorp.com
ApiTokenRequiredAPI token from Atlassian security settings. Store in Credentials Manager.

Operation Fields

FieldRequiredDescription
IssueKeyRequiredThe key of the issue to retrieve changelog for. Example: PROJ-123. Returns all recorded field changes since issue creation.

Sample Configuration

{
  "resource": "issue",
  "operation": "getChangelog",
  "Host": "https://acmecorp.atlassian.net",
  "Email": "automation@acmecorp.com",
  "ApiToken": "{{ $credentials.jiraApiToken }}",
  "IssueKey": "{{ $json.issueKey }}"
}

Validation Errors

Error CodeCause
VAL_MISSING_ISSUE_KEYIssueKey is empty or null.
ISSUE_NOT_FOUNDNo issue exists with the given key, or the user lacks view access.
AUTH_FAILEDInvalid credentials or expired API token.

Output Fields

FieldTypeDescription
statusstring"success" or "error"
changelogarrayArray of changelog history entries, oldest first. Each entry has id, author (display name), created (ISO timestamp), and items (array of field changes with field, fromString, toString).
resourcestringAlways "issue"
operationstringAlways "getChangelog"

Sample Output

{
  "status": "success",
  "changelog": [
    {
      "id": "10101",
      "author": "Sarah Chen",
      "created": "2026-05-26T08:15:00.000Z",
      "items": [
        {
          "field": "status",
          "fromString": "To Do",
          "toString": "In Progress"
        }
      ]
    },
    {
      "id": "10102",
      "author": "Marcus Webb",
      "created": "2026-05-26T11:45:22.000Z",
      "items": [
        {
          "field": "priority",
          "fromString": "High",
          "toString": "Highest"
        },
        {
          "field": "assignee",
          "fromString": "Marcus Webb",
          "toString": "Sarah Chen"
        }
      ]
    },
    {
      "id": "10103",
      "author": "Sarah Chen",
      "created": "2026-05-26T14:30:05.000Z",
      "items": [
        {
          "field": "status",
          "fromString": "In Progress",
          "toString": "Done"
        }
      ]
    }
  ],
  "resource": "issue",
  "operation": "getChangelog"
}

Expression Reference

ExpressionTypeExample ValueUse
{{ $output.getChangelog.changelog }}arrayAll history entriesIterate for time-in-status analysis
{{ $output.getChangelog.changelog.length }}integer3Count total change events
{{ $output.getChangelog.changelog[0].author }}string"Sarah Chen"First change author
{{ $output.getChangelog.changelog[0].created }}stringISO timestampCalculate time-in-status by diffing timestamps
{{ $output.getChangelog.changelog[0].items[0].field }}string"status"Filter for specific field changes

Node Policies & GuardRails

Workflow Example — Cycle Time Reporting

// Step 1: issue/getAll — get all Done issues in sprint
// Step 2: Loop over each issue
// Step 3 per issue: issue/getChangelog
{
  "resource": "issue",
  "operation": "getChangelog",
  "IssueKey": "{{ $loopItem.key }}"
}
// Step 4: Function node — extract status transition times
// const statusChanges = $output.getChangelog.changelog
//   .flatMap(e => e.items.filter(i => i.field === "status").map(i => ({...i, at: e.created})));
// const inProgressAt = statusChanges.find(s => s.toString === "In Progress")?.at;
// const doneAt = statusChanges.find(s => s.toString === "Done")?.at;
// const cycleTimeHours = (new Date(doneAt) - new Date(inProgressAt)) / 3600000;
// return { issueKey: $loopItem.key, cycleTimeHours };
// Step 5: MongoDB/insert — store cycle time metrics