issue/create resource: issue
Create a new Jira issue in any project. Supports all standard issue types (Bug, Task, Story, Epic, Sub-task), priority, assignee, labels, and custom fields. Returns the new issue key for use in downstream workflow steps.
When to Use
- Alert-driven bug filing: A Datadog or PagerDuty alert fires on a production error. A BizFirst webhook workflow triggers
issue/createto open a Bug in theOPSproject, pre-filling the summary with the alert name, description with the stack trace, priority as Highest, and assigning it to the on-call rotation user — all without any human interaction. - Support ticket escalation: A customer support system (Zendesk, Freshdesk) detects a ticket that breaches SLA. The integration workflow creates a Jira Task in the
SUPPORTproject with customer details, ticket ID, and breach timestamp so engineering can triage the escalation immediately. - Compliance change tracking: Every infrastructure change request submitted via a web form auto-creates a Jira Task in the
CHANGEproject with the requester, affected systems, planned window, and business justification. Satisfies SOC 2 and ISO 27001 change management controls. - Sprint story intake: A product backlog refinement tool exports approved stories. A scheduled BizFirst workflow reads the export and batch-creates Story issues in the upcoming sprint project so the backlog is populated before the planning meeting.
- DevOps incident logging: When a Kubernetes pod enters a CrashLoopBackOff state, a cluster monitoring webhook creates a Jira incident with namespace, pod name, recent logs, and a direct link to Grafana — giving SREs full context in the issue without manual copy-paste.
Configuration
Connection
| Field | Required | Description |
|---|---|---|
Host | Required | Jira instance base URL. Example: https://acmecorp.atlassian.net |
Email | Required | Atlassian account email used for Basic Auth. Example: automation@acmecorp.com |
ApiToken | Required | API token from Atlassian security settings. Store in Credentials Manager. |
Operation Fields
| Field | Required | Description |
|---|---|---|
ProjectKey | Required | The key of the target project. Example: PROJ, DEV, SUPPORT. Case-insensitive; the node normalises to uppercase. |
IssueType | Required | Issue type name. Accepted values: Bug, Task, Story, Epic, Sub-task. Must exist in the project's issue type scheme. |
Summary | Required | Issue title / one-line description. Maximum 255 characters. Supports expression interpolation: {{ $json.alertTitle }}. |
Description | Optional | Detailed issue body. Plain text. Supports multi-line strings and expression interpolation for dynamic content such as stack traces. |
Priority | Optional | Issue priority. Accepted values: Lowest, Low, Medium, High, Highest. Defaults to the project's default priority if omitted. |
Assignee | Optional | Username or email of the assignee. The node resolves this to an Atlassian account ID automatically. Leave empty to leave unassigned. |
Labels | Optional | Array of label strings to apply. Example: ["production", "alert", "p1"]. Labels must already exist in the Jira instance or will be created automatically. |
CustomFields | Optional | JSON object of custom field values. Keys are Jira field IDs (e.g. customfield_10014). Values follow Jira field format. Example: {"customfield_10014": "EPIC-7"}. |
Custom field IDs: Custom field IDs are instance-specific (e.g.
customfield_10014 for Epic Link on one instance may differ on another). Discover your instance's field IDs by calling GET /rest/api/3/field on your Jira instance or by inspecting the issue create metadata endpoint.
Sample Configuration
Create a Bug from a Datadog monitoring alert:
{
"resource": "issue",
"operation": "create",
"Host": "https://acmecorp.atlassian.net",
"Email": "automation@acmecorp.com",
"ApiToken": "{{ $credentials.jiraApiToken }}",
"ProjectKey": "OPS",
"IssueType": "Bug",
"Summary": "[P1 ALERT] {{ $json.alert.title }} — {{ $json.alert.source }}",
"Description": "## Alert Details\n\n**Alert:** {{ $json.alert.title }}\n**Service:** {{ $json.alert.service }}\n**Environment:** {{ $json.alert.env }}\n**Triggered At:** {{ $json.alert.triggeredAt }}\n\n## Error\n\n```\n{{ $json.alert.message }}\n```\n\n**Runbook:** {{ $json.alert.runbookUrl }}",
"Priority": "Highest",
"Assignee": "oncall@acmecorp.com",
"Labels": ["production", "alert", "datadog", "{{ $json.alert.service }}"],
"CustomFields": {
"customfield_10014": "OPS-EPIC-42",
"customfield_10020": { "id": "{{ $json.sprint.id }}" }
}
}
Validation Errors
| Error Code | Cause |
|---|---|
VAL_MISSING_PROJECT_KEY | ProjectKey is empty or whitespace. |
VAL_MISSING_ISSUE_TYPE | IssueType is empty or not a recognised value. |
VAL_MISSING_SUMMARY | Summary is null or empty. |
VAL_SUMMARY_TOO_LONG | Summary exceeds 255 characters. |
VAL_INVALID_PRIORITY | Priority value is not in the accepted list. |
VAL_INVALID_CUSTOM_FIELDS | CustomFields is not valid JSON or contains malformed field values. |
AUTH_FAILED | Credentials are incorrect or the API token has been revoked. |
PROJECT_NOT_FOUND | The specified ProjectKey does not exist or the authenticated user lacks access. |
ISSUE_TYPE_NOT_IN_PROJECT | The specified IssueType is not configured in the project's issue type scheme. |
Output Fields
| Field | Type | Description |
|---|---|---|
status | string | "success" or "error" |
issueId | string | Internal numeric Jira ID for the new issue. Example: "10482" |
issueKey | string | Human-readable issue key. Example: "OPS-347". Use this in downstream nodes to link, comment, or transition the issue. |
self | string | Full Jira REST API URL to the created issue. Example: "https://acmecorp.atlassian.net/rest/api/3/issue/10482" |
resource | string | Always "issue" |
operation | string | Always "create" |
Sample Output
{
"status": "success",
"issueId": "10482",
"issueKey": "OPS-347",
"self": "https://acmecorp.atlassian.net/rest/api/3/issue/10482",
"resource": "issue",
"operation": "create"
}
Expression Reference
| Expression | Type | Example Value | Use |
|---|---|---|---|
{{ $output.createIssue.issueKey }} | string | "OPS-347" | Pass to Slack message, comment body, or downstream issue operations |
{{ $output.createIssue.issueId }} | string | "10482" | Internal ID for attachment or comment operations |
{{ $output.createIssue.self }} | string | Jira API URL | Embed in notification messages as a direct link |
{{ $output.createIssue.status }} | string | "success" | Guard condition before downstream steps |
Node Policies & GuardRails
- API token in Credentials Manager: Never embed
ApiTokendirectly in node configuration. Reference it as{{ $credentials.jiraApiToken }}. Rotate tokens via Credentials Manager without touching workflow definitions. - Dedup check before creation: For webhook-driven issue creation, always run
issue/getAllwith a JQL dedup query first (e.g.project = OPS AND summary ~ "{{ $json.alert.title }}" AND created >= -1h). Only create the issue if no existing match is found. This prevents duplicate issues from alert flapping or retried webhook deliveries. - Rate limit awareness: Jira Cloud limits to approximately 50 requests per 10 seconds per user. If your workflow creates many issues in a loop, insert a Delay node between batches or use a queue pattern.
- Service account principle of least privilege: Use a dedicated Jira service account with only Create Issue permissions on the required projects. Do not use a personal account — token revocation on employee offboarding will break automation.
- Custom field documentation: Document the custom field IDs used in your workflows alongside the workflow definition. Field IDs are instance-specific and cannot be inferred from field names alone.
Workflow Examples
Example 1 — Create Jira Bug from Datadog Alert
Datadog webhook fires on a P1 alert → BizFirst workflow creates the Jira issue → posts Slack notification with issue key.
// Step 1: WebhookTrigger receives Datadog alert payload
// Step 2: issue/create
{
"resource": "issue",
"operation": "create",
"ProjectKey": "OPS",
"IssueType": "Bug",
"Summary": "[P1] {{ $json.alert.title }}",
"Description": "Service: {{ $json.alert.service }}\nEnv: production\n\n{{ $json.alert.message }}",
"Priority": "Highest",
"Assignee": "{{ $json.oncallEngineer }}",
"Labels": ["p1", "production", "auto-created"]
}
// Step 3: Slack/postMessage
{
"channel": "#incidents",
"text": ":red_circle: P1 Bug created: *{{ $output.createIssue.issueKey }}* — {{ $json.alert.title }}\nhttps://acmecorp.atlassian.net/browse/{{ $output.createIssue.issueKey }}"
}
Example 2 — Create Story from Approved Backlog Item
Product tool webhook sends approved backlog item → BizFirst creates Story → assigns to team.
{
"resource": "issue",
"operation": "create",
"ProjectKey": "PROD",
"IssueType": "Story",
"Summary": "{{ $json.item.title }}",
"Description": "**Acceptance Criteria:**\n{{ $json.item.acceptanceCriteria }}\n\n**Business Value:** {{ $json.item.businessValue }}\n**Story Points:** {{ $json.item.storyPoints }}",
"Priority": "Medium",
"Labels": ["{{ $json.item.epic }}", "sprint-{{ $json.sprintNumber }}"],
"CustomFields": {
"customfield_10016": {{ $json.item.storyPoints }}
}
}
Example 3 — Compliance Change Request from Web Form
Change request form submission → creates Jira Task with full audit fields → notifies change advisory board.
{
"resource": "issue",
"operation": "create",
"ProjectKey": "CHANGE",
"IssueType": "Task",
"Summary": "Change Request: {{ $json.form.systemName }} — {{ $json.form.changeType }}",
"Description": "**Requester:** {{ $json.form.requesterEmail }}\n**System:** {{ $json.form.systemName }}\n**Change Type:** {{ $json.form.changeType }}\n**Planned Window:** {{ $json.form.plannedStart }} to {{ $json.form.plannedEnd }}\n**Justification:** {{ $json.form.justification }}\n**Rollback Plan:** {{ $json.form.rollbackPlan }}",
"Priority": "Medium",
"Labels": ["change-request", "{{ $json.form.environment }}", "{{ $json.form.riskLevel }}"]
}