Award credit automatically when a champion closes a vulnerability ticket.
This guide connects JIRA to Katilyst with no code. When a champion completes a piece of security work in JIRA, JIRA posts the event to Katilyst and the champion earns credit.The pattern applies to any work item that reaches a completed state. How you recognize that state, how you tell security work apart from everything else, and how you identify the champion all depend on how your organization models this in JIRA, so treat the specifics below as a worked example rather than a template.
A Katilyst API key. An Account Admin generates one from the Admin Portal. Have it in hand before you start (keys are shown once when generated, and a lost key cannot be recovered.)
Permission to create automation rules in the JIRA space you are working in.
Every organization runs JIRA differently, and these three choices determine how your rule is built. Work them out before you open the automation editor.
What you are deciding
Common approaches
Where it lands in the rule
What signals the work is complete
A transition to Done, Resolved, or Closed; a resolution being set; a custom status like Remediated or Verified
The trigger
What marks the work as security work
A dedicated work item type such as Vulnerability; a Bug carrying a security label; a component, a security-specific project, or a custom field
The conditions
Who earns the credit
The assignee; the reporter; a Security Champion custom field; a team or owner field
The userEmail value in the request body
The third one deserves the most thought. Credit goes to whoever your program intends to recognize, and the person who closes a ticket is sometimes an administrator rather than the engineer who did the work. If your program recognizes the fixer, the assignee is usually right. If it recognizes whoever championed the work through to completion, a dedicated field serves you better.Whatever you choose has to produce an email address that matches a User in your Katilyst Project.
In Katilyst, create an Instance action named something recognizable, such as JIRA — Vulnerability Remediated. Set the Attribute it changes, the amount, and any frequency limit.This is program configuration rather than integration work, and it is what lets you retune the reward later without touching JIRA.
Instance actions award credit every time they are logged, which is what you want for ticket closures. See Core concepts for how this differs from State actions.
2
Find your project ID
Call List projects and note the id of the program you are integrating with.
The steps below use one common setup as a worked example: a Vulnerability work item type, a transition to Done, and a Security Champion custom field. Substitute your own mappings as you go.
1
Create the rule
In the JIRA space holding your security work, go to Space settings → Automation → Create rule. Older Jira versions label this Project settings.
2
Set the trigger
Choose Work item transitioned, and set the destination to the status that means the work is finished in your workflow.In the worked example that is Done. Your workflow may use Resolved, Closed, Remediated, or a status specific to your security process. If more than one status counts as finished, list them all — the trigger accepts several.
If your workflow sets a resolution rather than moving to a distinct status, Work item resolved is the cleaner trigger and saves you maintaining a list of statuses.
3
Set the conditions
Conditions are where you control what counts. Without them, every completed work item of any kind earns credit.You need enough conditions to isolate security work and to confirm there is someone to credit. In the worked example that is a pair:
Work item type is Vulnerability
The Security Champion field is not empty
Your equivalent might instead be a Bug carrying a security label, anything in a particular component, or every item in a dedicated security space. Match whatever your teams already do rather than asking them to change for this rule — an automation that depends on a new convention stops working the moment someone forgets it.Add a condition confirming the field you are crediting is populated, whichever field that is. It costs nothing and it prevents calls that fail validation.
Frequency limits configured on an Available Action do not apply to actions logged through the API, so your conditions are the only thing limiting how often this rule awards credit. A bulk transition closing fifty tickets at once will log fifty actions. If that is a realistic scenario in your workflow, constrain the rule here rather than relying on the limit set in Katilyst.
4
Add the web request action
Choose Then: Add an action → Send web request. It sits under the Notifications category, which is easy to scroll past when you are looking for something network-shaped.
Send web request, under the Notifications category in the action picker
Set the request itself:
Field
Value
Web request URL
https://api.katilyst.com/v1/logged-actions
HTTP method
POST
Web request body
Custom data
Then add two headers. These are key and value pairs, added one at a time rather than pasted in together.
Key
Value
Authorization
API-Key followed by your key
Content-Type
application/json
The API-Key prefix is part of the header value, with a space after it. Pasting the token on its own returns a 401, and it is the most common setup mistake on this integration.
Your API key is stored in the rule configuration, where anyone who can edit automation rules in this space can read it. Treat edit access accordingly, and check whether your version of Jira offers a hidden or secret option on header values.
Screenshots in this guide show JIRA Cloud as of October 2026. Atlassian moves things occasionally, so the labels matter more than the exact layout.
Only userEmail and availableActionId are required. creator appears in the champion’s action log, so make it recognizable.{{issue.assignee.emailAddress}} reflects the worked example. Swap it for the smart value matching the field you decided to credit — {{issue.reporter.emailAddress}} for the reporter, or {{issue.customfield_XXXXX.emailAddress}} for a user picker field, where the ID comes from your JIRA custom field configuration.
Test the smart value before you rely on it. A custom field that holds free text rather than a JIRA user returns the raw string, and a field left empty returns nothing at all — both produce a 400 from Katilyst.
dateTime is left out on purpose. The field is optional, and Katilyst stamps the action when it receives the call. Because the rule fires the moment the ticket transitions, those two times are the same for practical purposes.Add it if you ever point this rule at historical tickets, where the moment of receipt and the moment of the work would differ by weeks or months.
The configured web request, with Custom data selected and the body filled in
Leave Delay execution and Validate response at their defaults.
The rule runs and no reward appears. Check status on the logged action. PENDING means the Available Action requires admin approval and is waiting for it, which is program configuration rather than an integration fault. If you see LIMIT_EXCEEDED_TIMEFRAME, that action was submitted inside the platform rather than by your rule — frequency limits do not apply to API calls.
A 409 response. The champion is not eligible for that Available Action, usually because a condition on it was not satisfied. The request was well formed and the program’s own rules declined it.
A 400 response. Usually the email does not match a User in that Katilyst Project, or the smart value resolved to something that is not an email address. Check what the audit log shows the rule actually sent, then call List a project’s users to see what Katilyst has on file.
A 401 response. The key is invalid, missing, or was pasted without the API-Key prefix on the header value. An invalid key is the most common cause — confirm it has not been rotated or revoked since the rule was built.
Nothing in the audit log. The trigger or conditions did not match. This is the most common outcome on a first attempt, and it almost always means one of the three mappings is off. Strip the rule back to the trigger alone, confirm it fires, then add conditions one at a time.
Email addresses have to match. If your JIRA accounts use a different domain than your Katilyst roster, map them before building this rule.
Instance versus State actions, guardrails, and how rewards are decided.
Log an action
Full reference for the endpoint this guide calls.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Katilyst Public API","colors":{"primary":"#157A4B","light":"#1E9E63","dark":"#157A4B"},"logo":{"light":"https://mintcdn.com/katilyst/N9IgmQufsFb4r6qE/logo/katilyst.png?fit=max\u0026auto=format\u0026n=N9IgmQufsFb4r6qE\u0026q=85\u0026s=02e2e3bcfbd6a8b81cb2ae066fac4c0b","dark":"https://mintcdn.com/katilyst/N9IgmQufsFb4r6qE/logo/katilyst.png?fit=max\u0026auto=format\u0026n=N9IgmQufsFb4r6qE\u0026q=85\u0026s=02e2e3bcfbd6a8b81cb2ae066fac4c0b"},"favicon":"https://mintcdn.com/katilyst/N9IgmQufsFb4r6qE/logo/katilyst.png?fit=max\u0026auto=format\u0026n=N9IgmQufsFb4r6qE\u0026q=85\u0026s=02e2e3bcfbd6a8b81cb2ae066fac4c0b","api":{"playground":{"display":"interactive","proxy":false}},"background":{"color":{"light":"#EEF1F6","dark":"#0B132B"}},"navbar":{"links":[{"href":"https://katilyst.com","label":"Katilyst"}]},"icons":{"library":"fontawesome"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"katilyst","hasAudioNarration":false,"actualSubdomain":"katilyst","customDomains":["docs.katilyst.com"],"gitSource":{"type":"github","owner":"katilyst","repo":"public-api-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":"","_id":"6ae0eabe8cfebfdf07edcf2e"},"chroma":{"latestBuiltDeploymentHistoryId":"6ae3691cefe63d346f6197d7","collectionId":"6fd341e3-209e-4449-a394-218ce818e531","liveDeploymentHistoryId":"6ae3691cefe63d346f6197d7","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"DISABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6ae39765356bbb5084f22e6d","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"Reading Results","count":5},{"language":"default","tag":"Getting Started","count":5},{"language":"default","tag":"Discovery","count":4},{"language":"default","tag":"Guides","count":3},{"language":"default","tag":"Logging Work","count":2}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"jira-integration","slug":"/jira-integration","pageMetadata":{"title":"Integrating to JIRA","description":"Award credit automatically when a champion closes a vulnerability ticket.","icon":{"name":"jira","style":"regular","library":"fontawesome"},"href":"/jira-integration"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Award credit automatically when a champion closes a vulnerability ticket.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Card,CardGroup,CodeBlock,Frame,Heading,Note,OptimizedImage,Step,Steps,Table,Tip,Warning}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`This guide connects JIRA to Katilyst with no code. When a champion completes a piece of security work in JIRA, JIRA posts the event to Katilyst and the champion earns credit.`}),`\n`,_jsx(_components.p,{children:`The pattern applies to any work item that reaches a completed state. How you recognize that state, how you tell security work apart from everything else, and how you identify the champion all depend on how your organization models this in JIRA, so treat the specifics below as a worked example rather than a template.`}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A Katilyst API key.`}),` An Account Admin generates one from the Admin Portal. Have it in hand before you start (keys are shown once when generated, and a lost key cannot be recovered.)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Permission to create automation rules`}),` in the JIRA space you are working in.`]}),`\n`,_jsx(_components.li,{children:_jsx(_components.strong,{children:`A decision on the three mappings below.`})}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`decide-your-three-mappings`,children:`Decide your three mappings`}),`\n`,_jsx(_components.p,{children:`Every organization runs JIRA differently, and these three choices determine how your rule is built. Work them out before you open the automation editor.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`What you are deciding`}),_jsx(_components.th,{children:`Common approaches`}),_jsx(_components.th,{children:`Where it lands in the rule`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`What signals the work is complete`})}),_jsx(_components.td,{children:`A transition to Done, Resolved, or Closed; a resolution being set; a custom status like Remediated or Verified`}),_jsx(_components.td,{children:`The trigger`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`What marks the work as security work`})}),_jsx(_components.td,{children:`A dedicated work item type such as Vulnerability; a Bug carrying a security label; a component, a security-specific project, or a custom field`}),_jsx(_components.td,{children:`The conditions`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Who earns the credit`})}),_jsx(_components.td,{children:`The assignee; the reporter; a Security Champion custom field; a team or owner field`}),_jsxs(_components.td,{children:[`The `,_jsx(_components.code,{children:`userEmail`}),` value in the request body`]})]})]})]}),`\n`,_jsx(_components.p,{children:`The third one deserves the most thought. Credit goes to whoever your program intends to recognize, and the person who closes a ticket is sometimes an administrator rather than the engineer who did the work. If your program recognizes the fixer, the assignee is usually right. If it recognizes whoever championed the work through to completion, a dedicated field serves you better.`}),`\n`,_jsx(_components.p,{children:`Whatever you choose has to produce an email address that matches a User in your Katilyst Project.`}),`\n`,_jsx(Heading,{level:`2`,id:`configure-the-action-in-katilyst`,children:`Configure the action in Katilyst`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Create an Available Action`,children:[_jsxs(_components.p,{children:[`In Katilyst, create an Instance action named something recognizable, such as `,_jsx(_components.strong,{children:`JIRA — Vulnerability Remediated`}),`. Set the Attribute it changes, the amount, and any frequency limit.`]}),_jsx(_components.p,{children:`This is program configuration rather than integration work, and it is what lets you retune the reward later without touching JIRA.`}),_jsx(Tip,{children:_jsxs(_components.p,{children:[`Instance actions award credit every time they are logged, which is what you want for ticket closures. See `,_jsx(_components.a,{href:`/core-concepts`,children:`Core concepts`}),` for how this differs from State actions.`]})})]}),_jsxs(Step,{title:`Find your project ID`,children:[_jsxs(_components.p,{children:[`Call `,_jsx(_components.a,{href:`/api-reference/v1/list-projects`,children:`List projects`}),` and note the `,_jsx(_components.code,{children:`id`}),` of the program you are integrating with.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://api.katilyst.com/v1/projects`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: API-Key your_key_here\"`})]}),`\n`]})})})]}),_jsxs(Step,{title:`Find your action ID`,children:[_jsxs(_components.p,{children:[`Call `,_jsx(_components.a,{href:`/api-reference/v1/list-a-projects-available-actions`,children:`List a project’s available actions`}),` for that project and note the `,_jsx(_components.code,{children:`id`}),` of the action you just created.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://api.katilyst.com/v1/projects/{projectId}/available-actions`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: API-Key your_key_here\"`})]}),`\n`]})})}),_jsx(Tip,{children:_jsx(_components.p,{children:`You only do these two lookups once, by hand. Paste both IDs somewhere safe before moving to JIRA.`})})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`build-the-automation-rule`,children:`Build the automation rule`}),`\n`,_jsx(_components.p,{children:`The steps below use one common setup as a worked example: a Vulnerability work item type, a transition to Done, and a Security Champion custom field. Substitute your own mappings as you go.`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Create the rule`,children:_jsxs(_components.p,{children:[`In the JIRA space holding your security work, go to `,_jsx(_components.strong,{children:`Space settings → Automation → Create rule`}),`. Older Jira versions label this `,_jsx(_components.strong,{children:`Project settings`}),`.`]})}),_jsxs(Step,{title:`Set the trigger`,children:[_jsxs(_components.p,{children:[`Choose `,_jsx(_components.strong,{children:`Work item transitioned`}),`, and set the destination to the status that means the work is finished in your workflow.`]}),_jsxs(_components.p,{children:[`In the worked example that is `,_jsx(_components.strong,{children:`Done`}),`. Your workflow may use Resolved, Closed, Remediated, or a status specific to your security process. If more than one status counts as finished, list them all — the trigger accepts several.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[`If your workflow sets a resolution rather than moving to a distinct status, `,_jsx(_components.strong,{children:`Work item resolved`}),` is the cleaner trigger and saves you maintaining a list of statuses.`]})})]}),_jsxs(Step,{title:`Set the conditions`,children:[_jsx(_components.p,{children:`Conditions are where you control what counts. Without them, every completed work item of any kind earns credit.`}),_jsx(_components.p,{children:`You need enough conditions to isolate security work and to confirm there is someone to credit. In the worked example that is a pair:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Work item type is `,_jsx(_components.strong,{children:`Vulnerability`})]}),`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.strong,{children:`Security Champion`}),` field is not empty`]}),`\n`]}),_jsxs(_components.p,{children:[`Your equivalent might instead be a Bug carrying a `,_jsx(_components.code,{children:`security`}),` label, anything in a particular component, or every item in a dedicated security space. Match whatever your teams already do rather than asking them to change for this rule — an automation that depends on a new convention stops working the moment someone forgets it.`]}),_jsx(_components.p,{children:`Add a condition confirming the field you are crediting is populated, whichever field that is. It costs nothing and it prevents calls that fail validation.`}),_jsx(Warning,{children:_jsx(_components.p,{children:`Frequency limits configured on an Available Action do not apply to actions logged through the API, so your conditions are the only thing limiting how often this rule awards credit. A bulk transition closing fifty tickets at once will log fifty actions. If that is a realistic scenario in your workflow, constrain the rule here rather than relying on the limit set in Katilyst.`})})]}),_jsxs(Step,{title:`Add the web request action`,children:[_jsxs(_components.p,{children:[`Choose `,_jsx(_components.strong,{children:`Then: Add an action → Send web request`}),`. It sits under the `,_jsx(_components.strong,{children:`Notifications`}),` category, which is easy to scroll past when you are looking for something network-shaped.`]}),_jsx(Frame,{caption:`Send web request, under the Notifications category in the action picker`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/JIRA-SS-1.png?fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=19e95430dd1a7642a622ea5a9fa87ef7`,alt:`JIRA SS 1`,title:`JIRA SS 1`,\"data-og-width\":`1200`,width:`1200`,\"data-og-height\":`600`,height:`600`,\"data-path\":`images/JIRA-SS-1.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/JIRA-SS-1.png?w=280\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=5bf8889db54b88ead88657c29a77c451 280w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/JIRA-SS-1.png?w=560\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=ccd3e27625ae0b788a00de50a167baf5 560w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/JIRA-SS-1.png?w=840\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=7d1db2f600d28e631e6b8e6502eb7d42 840w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/JIRA-SS-1.png?w=1100\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=1b6dedf8dd616a809753b36d7c801df5 1100w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/JIRA-SS-1.png?w=1650\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=e52bbd96488d16ddd01aaad9f88d222b 1650w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/JIRA-SS-1.png?w=2500\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=3f5c547d5887f9f283a62c48a09f1a8e 2500w`})}),_jsx(_components.p,{children:`Set the request itself:`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Web request URL`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`https://api.katilyst.com/v1/logged-actions`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`HTTP method`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`POST`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Web request body`}),_jsx(_components.td,{children:`Custom data`})]})]})]}),_jsx(_components.p,{children:`Then add two headers. These are key and value pairs, added one at a time rather than pasted in together.`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Key`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Authorization`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`API-Key `}),` followed by your key`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Content-Type`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`application/json`})})]})]})]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`API-Key`}),` prefix is part of the header value, with a space after it. Pasting the token on its own returns a `,_jsx(_components.code,{children:`401`}),`, and it is the most common setup mistake on this integration.`]})}),_jsx(_components.p,{children:`Your API key is stored in the rule configuration, where anyone who can edit automation rules in this space can read it. Treat edit access accordingly, and check whether your version of Jira offers a hidden or secret option on header values.`}),_jsx(Note,{children:_jsx(_components.p,{children:`Screenshots in this guide show JIRA Cloud as of October 2026. Atlassian moves things occasionally, so the labels matter more than the exact layout.`})})]}),_jsxs(Step,{title:`Build the request body`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"userEmail\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"{{issue.assignee.emailAddress}}\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"availableActionId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"1111-2222-3333-action-id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"creator\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"JIRA Automation\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"details\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"{{issue.key}} — {{issue.summary}}\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsxs(_components.p,{children:[`Only `,_jsx(_components.code,{children:`userEmail`}),` and `,_jsx(_components.code,{children:`availableActionId`}),` are required. `,_jsx(_components.code,{children:`creator`}),` appears in the champion’s action log, so make it recognizable.`]}),_jsxs(_components.p,{children:[_jsx(_components.code,{children:`{{issue.assignee.emailAddress}}`}),` reflects the worked example. Swap it for the smart value matching the field you decided to credit — `,_jsx(_components.code,{children:`{{issue.reporter.emailAddress}}`}),` for the reporter, or `,_jsx(_components.code,{children:`{{issue.customfield_XXXXX.emailAddress}}`}),` for a user picker field, where the ID comes from your JIRA custom field configuration.`]}),_jsx(Warning,{children:_jsxs(_components.p,{children:[`Test the smart value before you rely on it. A custom field that holds free text rather than a JIRA user returns the raw string, and a field left empty returns nothing at all — both produce a `,_jsx(_components.code,{children:`400`}),` from Katilyst.`]})}),_jsxs(Tip,{children:[_jsxs(_components.p,{children:[_jsx(_components.code,{children:`dateTime`}),` is left out on purpose. The field is optional, and Katilyst stamps the action when it receives the call. Because the rule fires the moment the ticket transitions, those two times are the same for practical purposes.`]}),_jsx(_components.p,{children:`Add it if you ever point this rule at historical tickets, where the moment of receipt and the moment of the work would differ by weeks or months.`})]}),_jsx(Frame,{caption:`The configured web request, with Custom data selected and the body filled in`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/JIRA-SS-2.png?fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=7fb54ff4a5f1844c604719423a1aaaa3`,alt:`JIRA SS 2`,title:`JIRA SS 2`,\"data-og-width\":`390`,width:`390`,\"data-og-height\":`600`,height:`600`,\"data-path\":`images/JIRA-SS-2.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/JIRA-SS-2.png?w=280\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=558296279539256161ecf8deeaed51ce 280w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/JIRA-SS-2.png?w=560\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=600c73ca9f66acb74c1ba375d8b2ef4a 560w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/JIRA-SS-2.png?w=840\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=7fc9d0001aad9209b3910d5fd6232549 840w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/JIRA-SS-2.png?w=1100\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=058742d4f9484e39f9e114571ab3f87a 1100w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/JIRA-SS-2.png?w=1650\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=70ae2056c6189f93db9d8cb28b73d1c8 1650w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/JIRA-SS-2.png?w=2500\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=d13f5bd2fbb606798e558cf69c7ba857 2500w`})}),_jsxs(_components.p,{children:[`Leave `,_jsx(_components.strong,{children:`Delay execution`}),` and `,_jsx(_components.strong,{children:`Validate response`}),` at their defaults.`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`verify`,children:`Verify`}),`\n`,_jsx(_components.p,{children:`Create a test work item that satisfies your conditions, populate the field you are crediting, and move it to your completed status.`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Check the rule’s `,_jsx(_components.strong,{children:`Audit log`}),` in JIRA for a successful run.`]}),`\n`,_jsxs(_components.li,{children:[`Call `,_jsx(_components.a,{href:`/api-reference/v1/list-a-users-logged-actions`,children:`List a user’s logged actions`}),` and confirm the award landed.`]}),`\n`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://api.katilyst.com/v1/projects/{projectId}/users/{userId}/logged-actions\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: API-Key your_key_here\"`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Read the `,_jsx(_components.code,{children:`status`}),` field on the result. `,_jsx(_components.code,{children:`APPROVED`}),` means the reward applied.`]}),`\n`,_jsx(Frame,{caption:`A successful run in the JIRA audit log`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/Screenshot-2026-10-07-102602.png?fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=a500ba75b0017cec2351e1c710b08eaa`,alt:`Screenshot 2026 10 07 102602`,title:`Screenshot 2026 10 07 102602`,\"data-og-width\":`1412`,width:`1412`,\"data-og-height\":`359`,height:`359`,\"data-path\":`images/Screenshot-2026-10-07-102602.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/Screenshot-2026-10-07-102602.png?w=280\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=c9f799ef39db3f6fa4ded823985402c7 280w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/Screenshot-2026-10-07-102602.png?w=560\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=d046368399758f74c0e185aa54587705 560w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/Screenshot-2026-10-07-102602.png?w=840\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=17344484637567ac21039961ac863db6 840w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/Screenshot-2026-10-07-102602.png?w=1100\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=7e23480a8972784bc816b7d1a0aa1cd5 1100w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/Screenshot-2026-10-07-102602.png?w=1650\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=690c0f265066b3b5113287e2f2d41cd9 1650w, https://mintcdn.com/katilyst/M-0XxNzKIPczQ0v4/images/Screenshot-2026-10-07-102602.png?w=2500\u0026fit=max\u0026auto=format\u0026n=M-0XxNzKIPczQ0v4\u0026q=85\u0026s=5ecddddce71e27328c8a239b26464af6 2500w`})}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`The rule runs and no reward appears.`}),` Check `,_jsx(_components.code,{children:`status`}),` on the logged action. `,_jsx(_components.code,{children:`PENDING`}),` means the Available Action requires admin approval and is waiting for it, which is program configuration rather than an integration fault. If you see `,_jsx(_components.code,{children:`LIMIT_EXCEEDED_TIMEFRAME`}),`, that action was submitted inside the platform rather than by your rule — frequency limits do not apply to API calls.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`A `,_jsx(_components.code,{children:`409`}),` response.`]}),` The champion is not eligible for that Available Action, usually because a condition on it was not satisfied. The request was well formed and the program’s own rules declined it.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`A `,_jsx(_components.code,{children:`400`}),` response.`]}),` Usually the email does not match a User in that Katilyst Project, or the smart value resolved to something that is not an email address. Check what the audit log shows the rule actually sent, then call `,_jsx(_components.a,{href:`/api-reference/v1/list-a-projects-users`,children:`List a project’s users`}),` to see what Katilyst has on file.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`A `,_jsx(_components.code,{children:`401`}),` response.`]}),` The key is invalid, missing, or was pasted without the `,_jsx(_components.code,{children:`API-Key`}),` prefix on the header value. An invalid key is the most common cause — confirm it has not been rotated or revoked since the rule was built.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Nothing in the audit log.`}),` The trigger or conditions did not match. This is the most common outcome on a first attempt, and it almost always means one of the three mappings is off. Strip the rule back to the trigger alone, confirm it fires, then add conditions one at a time.`]}),`\n`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Email addresses have to match. If your JIRA accounts use a different domain than your Katilyst roster, map them before building this rule.`})}),`\n`,_jsx(Heading,{level:`2`,id:`related`,children:`Related`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Core concepts`,icon:`layer-group`,href:`/core-concepts`,children:_jsx(_components.p,{children:`Instance versus State actions, guardrails, and how rewards are decided.`})}),_jsx(Card,{title:`Log an action`,icon:`code`,href:`/api-reference/v1/log-an-action`,children:_jsx(_components.p,{children:`Full reference for the endpoint this guide calls.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Integrating to JIRA","description":"Award credit automatically when a champion closes a vulnerability ticket.","icon":{"name":"jira","style":"regular","library":"fontawesome"},"href":"/jira-integration"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Decide your three mappings","slug":"decide-your-three-mappings","depth":2,"children":[]},{"title":"Configure the action in Katilyst","slug":"configure-the-action-in-katilyst","depth":2,"children":[]},{"title":"Build the automation rule","slug":"build-the-automation-rule","depth":2,"children":[]},{"title":"Verify","slug":"verify","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Related","slug":"related","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"katilyst","siteName":"Katilyst Public API","title":"Integrating to JIRA - Katilyst Public API","navMaps":{"firstHrefInVersion":{"v1":{"href":"/jira-integration","matchLevel":0}},"firstHrefInLanguage":{}},"lastModified":"2026-10-08T19:28:04.524Z","originalFileLocation":"jira-integration.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Award credit automatically when a champion closes a vulnerability ticket.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Katilyst Public API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/katilyst/WpDkwyBc-JWYHZde/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/katilyst/WpDkwyBc-JWYHZde/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/katilyst/WpDkwyBc-JWYHZde/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/katilyst/WpDkwyBc-JWYHZde/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/katilyst/WpDkwyBc-JWYHZde/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/katilyst/WpDkwyBc-JWYHZde/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/katilyst/WpDkwyBc-JWYHZde/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/katilyst/WpDkwyBc-JWYHZde/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/katilyst/WpDkwyBc-JWYHZde/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Integrating to JIRA - Katilyst Public API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Award credit automatically when a champion closes a vulnerability ticket.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Katilyst Public API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.katilyst.com/jira-integration\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://katilyst.mintlify.app/_mintlify/api/og/v2?division=Guides\u0026amp;title=Integrating+to+JIRA\u0026amp;description=Award+credit+automatically+when+a+champion+closes+a+vulnerability+ticket.\u0026amp;theme=cf8f70968468613d694a3fe7\u0026amp;signature=7991b18a9beed3a9825b0b48a502b1bf6466c9938f3102327b3b10c4c812e912\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Integrating to JIRA - Katilyst Public API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Award credit automatically when a champion closes a vulnerability ticket.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://katilyst.mintlify.app/_mintlify/api/og/v2?division=Guides\u0026amp;title=Integrating+to+JIRA\u0026amp;description=Award+credit+automatically+when+a+champion+closes+a+vulnerability+ticket.\u0026amp;theme=cf8f70968468613d694a3fe7\u0026amp;signature=7991b18a9beed3a9825b0b48a502b1bf6466c9938f3102327b3b10c4c812e912\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/katilyst/WpDkwyBc-JWYHZde/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Katilyst Public API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#157A4B\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.katilyst.com/jira-integration\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/jira-integration.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.katilyst.com/#organization\",\"name\":\"Katilyst Public API\",\"url\":\"https://docs.katilyst.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/katilyst/N9IgmQufsFb4r6qE/logo/katilyst.png?fit=max\u0026auto=format\u0026n=N9IgmQufsFb4r6qE\u0026q=85\u0026s=02e2e3bcfbd6a8b81cb2ae066fac4c0b\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.katilyst.com#website\",\"name\":\"Katilyst Public API\",\"url\":\"https://docs.katilyst.com\",\"publisher\":{\"@id\":\"https://docs.katilyst.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.katilyst.com/jira-integration#webpage\",\"url\":\"https://docs.katilyst.com/jira-integration\",\"name\":\"Integrating to JIRA\",\"description\":\"Award credit automatically when a champion closes a vulnerability ticket.\",\"dateModified\":\"2026-10-08T19:28:04.524Z\",\"isPartOf\":{\"@id\":\"https://docs.katilyst.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.katilyst.com/jira-integration#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.katilyst.com/jira-integration#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Getting Started\",\"item\":\"https://docs.katilyst.com/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Integrating to JIRA\",\"item\":\"https://docs.katilyst.com/jira-integration\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.katilyst.com/jira-integration#article\",\"headline\":\"Integrating to JIRA\",\"name\":\"Integrating to JIRA\",\"description\":\"Award credit automatically when a champion closes a vulnerability ticket.\",\"url\":\"https://docs.katilyst.com/jira-integration\",\"mainEntityOfPage\":{\"@id\":\"https://docs.katilyst.com/jira-integration#webpage\"},\"dateModified\":\"2026-10-08T19:28:04.524Z\",\"publisher\":{\"@id\":\"https://docs.katilyst.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.katilyst.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Katilyst Public API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Katilyst Public API","nav":{"global":null,"versions":[{"version":"v1","default":true,"groups":[{"group":"Getting Started","pages":[{"title":"Introduction","icon":{"name":"memo-circle-info","style":"regular","library":"fontawesome"},"href":"/introduction"},{"title":"Core concepts","description":"Projects, Users, Actions, and how Katilyst decides what an event is worth.","icon":"layer-group","href":"/core-concepts"},{"group":"Guides","pages":[{"title":"Integrating to JIRA","icon":{"name":"jira","style":"regular","library":"fontawesome"},"href":"/jira-integration"},{"title":"Integrating to GitHub","description":"Award credit when a champion merges security work, using a GitHub Actions workflow.","icon":{"name":"github","style":"regular","library":"fontawesome"},"href":"/github-integration"},{"title":"Connecting a training platform","icon":"graduation-cap","href":"/training-platforms"}]}]},{"group":"Discovery","pages":[{"title":"List projects","openapi":"openapi.json GET /v1/projects","href":"/api-reference/v1/list-projects"},{"title":"List a project's available actions","openapi":"openapi.json GET /v1/projects/{projectId}/available-actions","href":"/api-reference/v1/list-a-projects-available-actions"},{"title":"List a project's users","openapi":"openapi.json GET /v1/projects/{projectId}/users","href":"/api-reference/v1/list-a-projects-users"},{"title":"Get an available action","openapi":"openapi.json GET /v1/available-actions/{availableActionId}","href":"/api-reference/v1/get-an-available-action"}]},{"group":"Logging Work","pages":[{"title":"Log an action","openapi":"openapi.json POST /v1/logged-actions","href":"/api-reference/v1/log-an-action"},{"title":"Set a user's action states","openapi":"openapi.json PUT /v1/projects/{projectId}/users/{userId}/action-states","href":"/api-reference/v1/set-a-users-action-states"}]},{"group":"Reading Results","pages":[{"title":"List a project's logged actions","openapi":"openapi.json GET /v1/projects/{projectId}/logged-actions","href":"/api-reference/v1/list-a-projects-logged-actions"},{"title":"List a user's logged actions","openapi":"openapi.json GET /v1/projects/{projectId}/users/{userId}/logged-actions","href":"/api-reference/v1/list-a-users-logged-actions"},{"title":"Get a user's action states","openapi":"openapi.json GET /v1/projects/{projectId}/users/{userId}/action-states","href":"/api-reference/v1/get-a-users-action-states"},{"title":"Get a user's attributes","openapi":"openapi.json GET /v1/projects/{projectId}/users/{userId}/attributes","href":"/api-reference/v1/get-a-users-attributes"},{"title":"Get a user","openapi":"openapi.json GET /v1/users/{userId}","href":"/api-reference/v1/get-a-user"}]}]}]},"title":"Integrating to JIRA - Katilyst Public API","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-CIbhtp2j.js","DynamicMarkdown-CtpgKJwj.js","zoom-image-lightbox-CVZVK4hN.js","lightbox-handle-r17bVUz3.js"]}