Skip to main content

Actions

Manage job actions (the workflow steps a job runs) and their run conditions.

Edit on a draft

Actions are validated against their driver when added to a live job. The product workflow (and the examples below) adds and edits actions on a draft created with POST /jobs/{id}/_edit, where validation is deferred until commit. The {id} in these paths is the draft job's id.

GET /api/jobs/{id}/action-templates

List the action types available for a job.

Authentication: Required

Response:

Each item's value.action is the skeleton payload (type) to POST.

List action templatesGET /api/jobs/00000000-0000-4000-8000-000000000001/action-templates
The available action types for this job, each with the skeleton action payload (value.action.type) to POST.
Response · 200
{
"_links": {
"self": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/action-templates"
}
},
"items": [
{
"detective": "00000000-0000-4000-8000-000000000002",
"id": "00000000-0000-4000-8000-000000000002:0",
"value": {
"group": "__top",
"name": "Send an email",
"action": {
"type": "email"
}
}
},
{
"detective": "00000000-0000-4000-8000-000000000003",
"id": "00000000-0000-4000-8000-000000000003:0",
"value": {
"group": "__top",
"name": "Send an email burst",
"action": {
"type": "burst"
}
}
},
{
"detective": "00000000-0000-4000-8000-000000000004",
"id": "00000000-0000-4000-8000-000000000004:0",
"value": {
"group": "__top",
"name": "Send to FTP",
"action": {
"type": "ftp"
}
}
},
"… 3 more items (6 total) — omitted from docs"
],
"start": 0,
"count": 6,
"total": 6
}
Captured from the API examples test suite; ids and timestamps are normalized.

GET /api/jobs/{id}/actions

List a job's actions.

Authentication: Required

Response:

A HAL collection ordered by index. Each action links to its attachments and uploaded file contents.

List actionsGET /api/jobs/00000000-0000-4000-8000-000000000001/actions
A HAL collection of the job’s actions ordered by index, each linking to its attachments and uploaded file contents.
Response · 200
{
"_links": {
"self": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/actions"
}
},
"start": 0,
"count": 1,
"total": 1,
"_embedded": {
"inf:job-action": [
{
"_links": {
"self": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002"
},
"inf:job-action-attachments": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002/attachments"
},
"inf:action-file-contents": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002/action-file-contents"
}
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000002",
"opts": {},
"type": "email",
"index": 0,
"data": null,
"jobId": "00000000-0000-4000-8000-000000000001",
"jobDatasetId": null,
"datasourceId": null,
"libraryId": null,
"targetFileId": null,
"integrationId": null,
"connectionOwnerId": null,
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"dataset": null,
"runConditions": [],
"_embedded": {
"inf:driver": {
"_links": {
"self": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/action-drivers/email"
}
},
"id": "email",
"name": "smart-job:email.send_an_email",
"imageSvg": "/assets/smart-job/images/email.svg",
"editorComponent": "emailActionEditor",
"optsSchema": "… optsSchema (7 fields) omitted from docs",
"supportsUserData": false
},
"inf:file": {
"_links": {
"self": {
"href": "https://informer.example.com/api/files/00000000-0000-4000-8000-000000000003"
}
},
"extension": "html",
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000003",
"filename": "email-body.html",
"embedded": true,
"contentType": "text/html",
"lobId": "16400",
"role": null,
"description": null,
"data": {},
"createdById": null,
"letterheadId": null,
"jobActionAttachmentId": null,
"jobActionId": "00000000-0000-4000-8000-000000000002",
"oauthClientId": null,
"assistantId": null,
"integrationId": null,
"directory": false,
"indexed": false,
"indexingStartedAt": null,
"indexingErroredAt": null,
"indexingErrorMessage": null,
"indexedAt": null,
"parentId": null,
"libraryId": null,
"remoteId": null,
"remoteUrl": null,
"size": "524288",
"modifiedAt": null,
"messageId": null,
"chatId": null,
"expiresAt": null,
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"ownerId": null,
"templateId": null
},
"inf:job-action-attachments": []
}
}
]
}
}
Captured from the API examples test suite; ids and timestamps are normalized.

POST /api/jobs/{id}/actions

Add an action to a job.

Authentication: Required

Permissions: Requires job:edit

Request Body:

FieldTypeRequiredDescription
typestringYesAction-driver id: email, burst, ftp, fs, cloud-publish, saved-list, drive-upload, batch-upload
optsobjectNoAction configuration (driver-specific)
jobDatasetIdstringNoJob dataset the action operates on
datasourceIdstringNoDatasource the action operates on

Example:

{ "type": "email", "opts": {} }

Response:

Responds 201 Created with the action and a Location header.

Add an actionPOST /api/jobs/00000000-0000-4000-8000-000000000001/actions
type is a job-action-driver id (email, burst, ftp, fs, cloud-publish, saved-list, drive-upload, batch-upload). opts holds the action config. Add actions to a draft job: validation is deferred until commit. Responds 201 with a Location header.
Request body
{
"type": "email",
"opts": {}
}
Response · 201
{
"_links": {
"self": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002"
},
"inf:job-action-attachments": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002/attachments"
},
"inf:action-file-contents": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002/action-file-contents"
}
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000002",
"type": "email",
"opts": {},
"jobId": "00000000-0000-4000-8000-000000000001",
"updatedAt": "2026-01-15T16:20:00.000Z",
"createdAt": "2026-01-15T16:20:00.000Z",
"jobDatasetId": null,
"datasourceId": null,
"index": 0,
"libraryId": null,
"targetFileId": null,
"data": null,
"integrationId": null,
"connectionOwnerId": null,
"_embedded": {
"inf:driver": {
"_links": {
"self": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/action-drivers/email"
}
},
"id": "email",
"name": "smart-job:email.send_an_email",
"imageSvg": "/assets/smart-job/images/email.svg",
"editorComponent": "emailActionEditor",
"optsSchema": "… optsSchema (7 fields) omitted from docs",
"supportsUserData": false
}
}
}
Captured from the API examples test suite; ids and timestamps are normalized.

GET /api/jobs/{id}/actions/{jobActionId}

Get a specific action.

Authentication: Required

Response:

Get an actionGET /api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002
Response · 200
{
"_links": {
"self": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002"
},
"inf:job-action-attachments": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002/attachments"
},
"inf:action-file-contents": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002/action-file-contents"
}
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000002",
"opts": {},
"type": "email",
"index": 0,
"data": null,
"jobId": "00000000-0000-4000-8000-000000000001",
"jobDatasetId": null,
"datasourceId": null,
"libraryId": null,
"targetFileId": null,
"integrationId": null,
"connectionOwnerId": null,
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"runConditions": [],
"_embedded": {
"inf:driver": {
"_links": {
"self": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/action-drivers/email"
}
},
"id": "email",
"name": "smart-job:email.send_an_email",
"imageSvg": "/assets/smart-job/images/email.svg",
"editorComponent": "emailActionEditor",
"optsSchema": "… optsSchema (7 fields) omitted from docs",
"supportsUserData": false
},
"inf:file": {
"_links": {
"self": {
"href": "https://informer.example.com/api/files/00000000-0000-4000-8000-000000000003"
}
},
"extension": "html",
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000003",
"filename": "email-body.html",
"embedded": true,
"contentType": "text/html",
"lobId": "16400",
"role": null,
"description": null,
"data": {},
"createdById": null,
"letterheadId": null,
"jobActionAttachmentId": null,
"jobActionId": "00000000-0000-4000-8000-000000000002",
"oauthClientId": null,
"assistantId": null,
"integrationId": null,
"directory": false,
"indexed": false,
"indexingStartedAt": null,
"indexingErroredAt": null,
"indexingErrorMessage": null,
"indexedAt": null,
"parentId": null,
"libraryId": null,
"remoteId": null,
"remoteUrl": null,
"size": "524288",
"modifiedAt": null,
"messageId": null,
"chatId": null,
"expiresAt": null,
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"ownerId": null,
"templateId": null
},
"inf:job-action-attachments": []
}
}
Captured from the API examples test suite; ids and timestamps are normalized.

PUT /api/jobs/{id}/actions/{jobActionId}

Update an action (upsert). Send the fields to change, commonly opts.

Authentication: Required

Permissions: Requires job:edit

Example:

{ "opts": { "subject": "Daily Sales Summary", "to": ["ops@example.com"] } }

Response:

Responds 200 with the updated action.

Update an actionPUT /api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002
Upserts the action. Send the fields to change (commonly opts).
Request body
{
"opts": {
"subject": "Daily Sales Summary",
"to": [
"ops@example.com"
]
}
}
Response · 200
{
"_links": {
"self": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002"
},
"inf:job-action-attachments": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002/attachments"
},
"inf:action-file-contents": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002/action-file-contents"
}
},
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000002",
"opts": {
"subject": "Daily Sales Summary",
"to": [
"ops@example.com"
],
"cc": [],
"bcc": [],
"sendEmailToScheduleOwner": false,
"sendAttachmentsToScheduleOwner": false
},
"type": "email",
"index": 0,
"data": null,
"jobId": "00000000-0000-4000-8000-000000000001",
"jobDatasetId": null,
"datasourceId": null,
"libraryId": null,
"targetFileId": null,
"integrationId": null,
"connectionOwnerId": null,
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"file": {
"extension": "html",
"tenant": "acme",
"id": "00000000-0000-4000-8000-000000000003",
"filename": "email-body.html",
"embedded": true,
"contentType": "text/html",
"lobId": "16400",
"role": null,
"description": null,
"data": {},
"createdById": null,
"letterheadId": null,
"jobActionAttachmentId": null,
"jobActionId": "00000000-0000-4000-8000-000000000002",
"oauthClientId": null,
"assistantId": null,
"integrationId": null,
"directory": false,
"indexed": false,
"indexingStartedAt": null,
"indexingErroredAt": null,
"indexingErrorMessage": null,
"indexedAt": null,
"parentId": null,
"libraryId": null,
"remoteId": null,
"remoteUrl": null,
"size": "524288",
"modifiedAt": null,
"messageId": null,
"chatId": null,
"expiresAt": null,
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"ownerId": null,
"templateId": null
},
"runConditions": [],
"attachments": [],
"_embedded": {
"inf:driver": {
"_links": {
"self": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/action-drivers/email"
}
},
"id": "email",
"name": "smart-job:email.send_an_email",
"imageSvg": "/assets/smart-job/images/email.svg",
"editorComponent": "emailActionEditor",
"optsSchema": "… optsSchema (7 fields) omitted from docs",
"supportsUserData": false
}
}
}
Captured from the API examples test suite; ids and timestamps are normalized.

DELETE /api/jobs/{id}/actions/{jobActionId}

Delete an action.

Authentication: Required

Permissions: Requires job:edit

Response:

Responds 200 with an empty body.

Delete an actionDELETE /api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002
Responds 200 with an empty body.
Response · 200 · no body
Captured from the API examples test suite; ids and timestamps are normalized.

POST /api/jobs/{id}/_job-action-order

Reorder a job's actions.

Authentication: Required

Permissions: Requires job:edit

Request Body:

An actions array of { id, index } pairs.

{ "actions": [{ "id": "<jobActionId>", "index": 0 }] }

Response:

Responds 200 with an empty body.

Reorder actionsPOST /api/jobs/00000000-0000-4000-8000-000000000001/_job-action-order
Body is { actions: [{ id, index }] }. Responds 200 with an empty body.
Request body
{
"actions": [
{
"id": "00000000-0000-4000-8000-000000000002",
"index": 0
}
]
}
Response · 200 · no body
Captured from the API examples test suite; ids and timestamps are normalized.

POST /api/jobs/{id}/actions/{jobActionId}/_preview

Preview an action's output without running the job. The body is driver-specific.

Authentication: Required

Response:

Returns the driver's preview. Not all action types support preview, the email type, for example, responds 501 Not Implemented. (Not exercised in the captured examples.)


GET /api/jobs/{id}/actions/{jobActionId}/job-action-run-conditions

List an action's run conditions.

Authentication: Required

Response:

A HAL collection. A run condition gates the action on a job dataset's row count. New actions have none.

List an action’s run conditionsGET /api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002/job-action-run-conditions
Run conditions gate an action on a job dataset’s row count. A run condition is created with { jobDatasetId, conditionThreshold }. New actions have none.
Response · 200
{
"_links": {
"self": {
"href": "https://informer.example.com/api/jobs/00000000-0000-4000-8000-000000000001/actions/00000000-0000-4000-8000-000000000002/job-action-run-conditions"
}
},
"start": 0,
"count": 0,
"total": 0,
"_embedded": {
"inf:job-action-run-condition": []
}
}
Captured from the API examples test suite; ids and timestamps are normalized.

POST /api/jobs/{id}/actions/{jobActionId}/job-action-run-conditions

Create a run condition for an action.

Authentication: Required

Permissions: Requires job:edit

Request Body:

FieldTypeRequiredDescription
jobDatasetIdstringYesThe job dataset whose row count is evaluated
conditionThresholdnumberNoMinimum row count to run the action (default 1)

Response:

201 Created with the run condition. (Requires a configured job dataset, so it is not exercised in the captured examples.)


GET / PUT / DELETE /api/jobs/{id}/actions/{jobActionId}/job-action-run-conditions/{jobActionRunConditionId}

Read, upsert, or delete a single run condition.

Authentication: Required

Permissions (PUT/DELETE): Requires job:edit


GET /api/jobs/{id}/actions/{jobActionId}/action-file-contents

Get the action's uploaded file contents.

Authentication: Required

Response:

Binary stream with the file contents. (Not shown.)


PUT /api/jobs/{id}/actions/{jobActionId}/action-file-contents

Upload a file for the action (raw body).

Authentication: Required

Permissions: Requires job:edit

Response:

Responds 200 with an empty body.