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.TemplateGroupworkflow.Templateworkflow.NodeTemplateworkflow.NodeTemplateSectionworkflow.NodeTemplateQuestionautomation.Eventautomation.Templateautomation.Jobautomation.JobLogautomation.WorkflowAutomationQueueautomation.ScheduledWorkflowRunautomation.Playground
Common controller intents
workflow.Template.saveNodesworkflow.Template.clearNodesworkflow.Template.updateNodeworkflow.TemplateGroup.createScheduledWorkflowworkflow.TemplateGroup.updateScheduleworkflow.TemplateGroup.runScheduledWorkflowworkflow.NodeTemplate.saveQuestionautomation.Automation.getNamespacesautomation.Automation.getNamespaceEventsautomation.Automation.getNamespaceAttributesV3automation.Automation.getActionsautomation.Automation.saveAutomationTemplateautomation.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
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
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.
kind | Meaning | Bound to |
|---|---|---|
object | A trigger workflow for a Dynamic Object | objects.TriggerWorkflow |
generic | A reusable/playground group (isPlayground) | Associated objects |
scheduled | A cronjob workflow (isScheduled) | Nothing — it runs on a recurrence |
Scheduled groups also serialise a read-only schedule object:
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
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
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
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>}}.
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}| Field | Notes |
|---|---|
status | pending, running, completed, failed |
durationSeconds | null while the run is still in flight |
isManual | true when a user triggered the run rather than the scheduler |
triggeredBy | The 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:
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.