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.

Credentials in an action's opts (for example an FTP connection's password, rawPrivateKey and passphrase) are stored encrypted and served, still encrypted, only to callers with job:edit. Anyone else who can read the job gets opts without them. expand is not accepted (400) on this route or on the single-action route.

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:

The action's credentials are served only to callers with job:edit, as in the action list.

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. The action stays on this job: an id that belongs to another job's action answers 404. Setting or changing connectionOwnerId to anyone but yourself answers 403 unless you are a superuser, and a libraryId you cannot read answers 404. A jobDatasetId that is not one of this job's datasets answers 400, and so does a credential in opts that is not a string.

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

Permissions: Requires job:edit

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. expand is not accepted (400).

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. expand is not accepted (400).

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.