Actions
Manage job actions (the workflow steps a job runs) and their run conditions.
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.
{
"_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
}
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.
{
"_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": []
}
}
]
}
}
POST /api/jobs/{id}/actions
Add an action to a job.
Authentication: Required
Permissions: Requires job:edit
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Action-driver id: email, burst, ftp, fs, cloud-publish, saved-list, drive-upload, batch-upload |
opts | object | No | Action configuration (driver-specific) |
jobDatasetId | string | No | Job dataset the action operates on |
datasourceId | string | No | Datasource the action operates on |
Example:
{ "type": "email", "opts": {} }
Response:
Responds 201 Created with the action and a Location header.
{
"type": "email",
"opts": {}
}
{
"_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
}
}
}
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.
{
"_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": []
}
}
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.
{
"opts": {
"subject": "Daily Sales Summary",
"to": [
"ops@example.com"
]
}
}
{
"_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
}
}
}
DELETE /api/jobs/{id}/actions/{jobActionId}
Delete an action.
Authentication: Required
Permissions: Requires job:edit
Response:
Responds 200 with an empty body.
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.
{
"actions": [
{
"id": "00000000-0000-4000-8000-000000000002",
"index": 0
}
]
}
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).
{
"_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": []
}
}
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:
| Field | Type | Required | Description |
|---|---|---|---|
jobDatasetId | string | Yes | The job dataset whose row count is evaluated |
conditionThreshold | number | No | Minimum 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.