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.
{
"_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:
{
"_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.
{
"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
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.
{
"_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.
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.