Which API should I use?
| What you need |
API |
Page |
| Search, create, update, or transition issues |
Issues |
Issues |
| Work with users, projects, fields, components, versions |
Users, Projects, Fields, Components, Versions |
Jira Entities |
| Manage boards and sprints |
Boards, Sprints |
Jira Entities |
| Access admin objects (workflows, screens, schemes, roles) or JSM Assets |
Admin, Assets |
Configuration & Assets |
| Store structured data |
tables |
Tables |
| Process messages asynchronously |
queue |
Queues |
| Trigger scripts from other scripts |
asyncEvent |
Async Events |
| Customize issue forms at runtime |
uim |
UI Modifications |
| Build rich text (ADF), work with dates, arrays, strings, CSV |
Adf, DateUtils, Arrays, Strings, CSV, Validator |
Utilities |
| Use smart value methods on strings, arrays, dates |
.capitalize(), .groupBy(), .plusDays() |
Smart Value Methods |
| Call a Jira REST endpoint not covered above |
requestJira() |
This page (below) |
Jira API
requestJira(path, options)
Low-level Jira REST API call. Use this for endpoints not covered by the high-level namespaces.
// GET request
const res = requestJira('/rest/api/3/myself')
log(res.body.displayName)
// POST request
const res = requestJira('/rest/api/3/issue', {
method: 'POST',
body: { fields: { project: { key: 'PROJ' }, summary: 'Test', issuetype: { name: 'Task' } } }
})
// Error handling
const res = requestJira(`/rest/api/3/issue/${issueKey}`)
if (!res.ok) {
log(`Error: ${res.status}`)
}
The requestJira() function returns an object with ok (boolean), status (number), and body (parsed JSON or text) properties.
Script context variables
Variables available in scripts depending on context:
| Variable |
Available when |
Description |
issueKey |
Issue key provided |
The issue key string |
issue |
Issue context loaded |
Issue data object |
context |
Always |
Execution context metadata |
event |
Event/async/workflow post function/workflow validator triggers |
Event payload |
webhook |
Webtrigger |
Webhook request data (method, path, headers, body, query, rawBody) |
event.transition |
Workflow post function/workflow validator trigger |
Transition details (from_status, to_status, transitionName) |
event.modifiedFields |
Workflow validator trigger |
Fields modified during the transition |
uim |
UIM triggers |
UI modification methods |
uimData |
UIM triggers |
Form field values and callback info |
currentUser |
Always |
Current user info |
| Global vars |
When defined |
Variables from the global script |
Domain APIs
tables
See Data Storage for full details.
| Method |
Description |
tables.get(tableName) |
Get table schema |
tables.rows(tableName, options?) |
Query rows with filtering and sorting |
tables.addRow(tableName, data) |
Add a single row |
tables.addRows(tableName, dataArray) |
Bulk insert multiple rows |
tables.updateRow(tableName, rowId, data) |
Update a row |
tables.deleteRow(tableName, rowId) |
Delete a single row |
tables.deleteRows(tableName, where) |
Delete rows matching filter (returns count) |
tables.findRow(tableName, where) |
Find first row matching filter |
tables.count(tableName, where?) |
Count rows (optionally filtered) |
queue
See Data Storage for full details.
| Method |
Description |
queue.push(queueName, payload, priority?) |
Push a message |
queue.pull(queueName, count?) |
Pull messages for processing |
queue.consume(queueName, count?) |
Pull + auto-acknowledge |
queue.peek(queueName, count?) |
Preview without changing state |
queue.ack(messageId) |
Acknowledge a processed message |
queue.reject(messageId) |
Mark message as failed |
queue.requeue(messageId) |
Move failed message back to pending |
queue.size(queueName) |
Get pending message count |
queue.stats(queueName) |
Get full queue statistics |
asyncEvent
| Method |
Description |
asyncEvent.push(scriptId, payload?, options?) |
Trigger another script asynchronously |
asyncEvent.pushSelf(payload?, options?) |
Trigger the current script asynchronously |
// Trigger another script
asyncEvent.push("550e8400-e29b-41d4-a716-446655440000", {
action: "process",
issueKey: "TEST-1"
})
// Trigger self with delay
asyncEvent.pushSelf({ step: 2 }, { delayInSeconds: 60 })
Scenarios API
Scenarios split long-running scripts into managed steps. Each step runs as a separate Forge event, avoiding execution timeouts for bulk operations. See Scenarios for the full guide.
Step functions
| Function |
Description |
step(name, fn) |
One-time step. fn receives (ctx), return value stored in ctx[name] |
loop(name, fn, initialState) |
Repeatable step. fn receives (state, ctx). Call next(newState) to repeat, or return to finish |
batch(name, config, fn) |
Process issues in pages. config is JQL string or config object. fn receives (issue, ctx) |
Batch config properties
| Property |
Type |
Default |
Description |
jql |
string |
- |
JQL query (one of jql/keys/source required) |
keys |
string[] |
- |
Array of issue keys |
source |
function |
- |
(ctx) => keys[] - dynamic source |
fields |
string[] |
all |
Fields to load per issue |
expand |
string[] |
none |
Expand options |
batchSize |
number |
100 |
Issues per page (max 100) |
maxIssues |
number |
unlimited |
Stop after this many |
continueOnError |
boolean |
true |
Continue on failure |
Data transfer functions
| Function |
Description |
emit(value) |
Save a value to the step’s data buffer (call multiple times) |
getStepData(stepName, opts?) |
Read emitted data from a previous step. Returns { items, total } |
progress(data) |
Report custom progress data visible in the UI |
next(newState) |
Continue a loop() with updated state (only inside loop()) |
Example
step('count', () => {
return { total: Issues.count('project = PROJ') }
})
batch('cleanup', 'project = PROJ AND updated < -180d', (issue) => {
issue.transition('Done')
})
step('report', (ctx) => {
log(`Done: ${ctx.cleanup.processed}/${ctx.count.total}, ${ctx.cleanup.failed} errors`)
})
API reference pages
Detailed reference for each API area:
- Issues - Search, create, update, transition issues. RichIssue properties and methods, SearchResult, Smart Field Resolution, ChainablePromise.
- Jira Entities - Users, Projects, Fields, Components, Versions, Boards, Sprints, Links. User and Project wrapper objects.
- Configuration & Assets - Administration namespaces (workflows, screens, schemes, roles) and JSM Assets (CMDB).
- Async Events - asyncEvent.push and asyncEvent.pushSelf for triggering scripts asynchronously.
- Tables - Custom Tables API - CRUD, filtering, sorting, upsert, context-aware methods.
- Queues - Message Queue API - push, pull, consume, acknowledge, priority, statistics.
- UI Modifications - UIM API for modifying form fields on issue create and transition screens.
- Utilities - Adf (builder + reader), DateUtils, Arrays, Strings, CSV, Validator.
- Smart Value Methods - String (28 methods), Array (9 methods), Date instance methods (arithmetic, navigation, formatting, comparison), Groovy date types.
Next steps