Namespace Reference

Workflow and automation

Curated JQL namespaces and examples for workflow and automation.

Workflow and automation namespaces describe reusable workflow templates, node templates, automation events, jobs, logs, queues, and playground runs.

Key namespaces and models

  • workflow.TemplateGroup
  • workflow.Template
  • workflow.NodeTemplate
  • workflow.NodeTemplateSection
  • workflow.NodeTemplateQuestion
  • automation.Event
  • automation.Template
  • automation.Job
  • automation.JobLog
  • automation.WorkflowAutomationQueue
  • automation.ScheduledWorkflowRun
  • automation.Playground

Common controller intents

  • workflow.Template.saveNodes
  • workflow.Template.clearNodes
  • workflow.Template.updateNode
  • workflow.TemplateGroup.createScheduledWorkflow
  • workflow.TemplateGroup.updateSchedule
  • workflow.TemplateGroup.runScheduledWorkflow
  • workflow.NodeTemplate.saveQuestion
  • automation.Automation.getNamespaces
  • automation.Automation.getNamespaceEvents
  • automation.Automation.getNamespaceAttributesV3
  • automation.Automation.getActions
  • automation.Automation.saveAutomationTemplate
  • automation.Automation.processZapierAction

Common model intents

Most listed model namespaces support retrieve, retrieveOne, retrieveV2, create, update/patch, deleteOne, metadata, and aggregate subject to model permissions. Use consequence only for models that implement an on_<consequence> hook.

Retrieve example

json
1{ 2 "__meta__": { 3 "schema": "model", 4 "namespace": "automation.Job", 5 "intent": "retrieve", 6 "authenticationClass": "jwt", 7 "ordering": "-created", 8 "limit": 20 9 }, 10 "id": null, 11 "created": null 12}

Create example

json
1{ 2 "__meta__": { 3 "schema": "model", 4 "namespace": "workflow.TemplateGroup", 5 "intent": "create", 6 "authenticationClass": "jwt", 7 "return": { 8 "id": null, 9 "name": null, 10 "alias": null 11 } 12 }, 13 "name": "Ticket workflows", 14 "alias": "ticket-workflows" 15}

For examples that include foreign keys, numeric ids must refer to records in the same tenant and visible to the authenticated user.

Template group kinds

workflow.TemplateGroup serves three kinds of workflow. Read kind rather than combining the underlying booleans.

kindMeaningBound to
objectA trigger workflow for a Dynamic Objectobjects.TriggerWorkflow
genericA reusable/playground group (isPlayground)Associated objects
scheduledA cronjob workflow (isScheduled)Nothing — it runs on a recurrence

Scheduled groups also serialise a read-only schedule object:

json
1{ 2 "nodeId": "scheduled_trigger", 3 "recurrenceRules": { 4 "timeUnit": "day", 5 "period": 1, 6 "periods": [], 7 "time": "06:00" 8 }, 9 "description": "Every day at 06:00", 10 "nextRun": "2026-08-08T05:00:00Z", 11 "lastRun": "2026-08-07T05:00:04Z", 12 "isConfigured": true 13}

The recurrence itself is stored on the group's periodic trigger node (workflow.NodeTemplate.triggerData.recurrenceRules); schedule is a projection of it, so there is a single source of truth.

Scheduled workflows

Create

json
1{ 2 "__meta__": { 3 "schema": "controller", 4 "namespace": "workflow.TemplateGroup", 5 "intent": "createScheduledWorkflow", 6 "authenticationClass": "jwt" 7 }, 8 "name": "Nightly overdue invoice sweep", 9 "description": "Chases invoices past their due date", 10 "recurrenceRules": { 11 "timeUnit": "day", 12 "period": 1, 13 "periods": [], 14 "time": "02:00" 15 } 16}

Creates the template group, its first version, and the periodic trigger node in one call. Returns { "templateGroup": <id>, "template": <id> }.

recurrenceRules accepts timeUnit of day, week, month or year. periods holds lowercase weekday names for week and day numbers for month; year uses a month field such as "August 20". Invalid recurrences are rejected with a validation error.

Change the recurrence

json
1{ 2 "__meta__": { 3 "schema": "controller", 4 "namespace": "workflow.TemplateGroup", 5 "intent": "updateSchedule", 6 "authenticationClass": "jwt" 7 }, 8 "templateGroup": 110, 9 "recurrenceRules": { 10 "timeUnit": "week", 11 "period": 1, 12 "periods": ["monday"], 13 "time": "09:00" 14 } 15}

Run one immediately

json
1{ 2 "__meta__": { 3 "schema": "controller", 4 "namespace": "workflow.TemplateGroup", 5 "intent": "runScheduledWorkflow", 6 "authenticationClass": "jwt" 7 }, 8 "templateGroup": 110 9}

Fires the workflow outside its recurrence and returns { "run": <id> }. The run is recorded against the calling user.

Read the run history

Each firing creates an automation.ScheduledWorkflowRun. It is also the pivot instance the workflow graph executes against, so merge templates can read {{instance.scheduled_for}} and {{instance.context.<key>}}.

json
1{ 2 "__meta__": { 3 "schema": "model", 4 "namespace": "automation.ScheduledWorkflowRun", 5 "intent": "retrieve", 6 "authenticationClass": "jwt", 7 "filter": { "templateGroup": { "id": 110 } }, 8 "ordering": ["-scheduledFor"], 9 "limit": 25 10 }, 11 "id": null, 12 "status": null, 13 "failed": null, 14 "scheduledFor": null, 15 "startedAt": null, 16 "completedAt": null, 17 "durationSeconds": null, 18 "isManual": null, 19 "error": null, 20 "triggeredBy": { "id": null, "fqn": null } 21}
FieldNotes
statuspending, running, completed, failed
durationSecondsnull while the run is still in flight
isManualtrue when a user triggered the run rather than the scheduler
triggeredByThe user for a manual run; null for a scheduler run

Scheduling is driven by two Celery beat tasks that run every minute: src.automation.tasks.process_periodic_workflow_automation_templates buffers due slots into automation.WorkflowAutomationQueue, and src.automation.tasks.process_workflow_automation_queue claims and fires them.

Data-producing nodes

workflow.NodeTemplate carries per-node configuration in a JSON field named after the node type — taskData, decisionMeta, actionMeta, loopData, filterData, and so on.

The Filter node (filterNode) uses filterData:

json
1{ 2 "filterName": "overdue_invoices", 3 "sourceType": "namespace", 4 "namespace": "finance.Invoice", 5 "q": { 6 "logicalOperator": "$and", 7 "conditions": [ 8 { "field": "status", "operator": "$eq", "value": "overdue" } 9 ] 10 }, 11 "ordering": "-created", 12 "limit": 100 13}

sourceType accepts namespace (any tenant-scoped namespace), object (Dynamic Object records), csv, array and memory. The fetched rows are published on the run context under filterName and the downstream branch runs once per row. See Node reference for the full merge-key list and the per-tier fan-out ceiling.