curl --request GET \
--url https://operator.opus.com/job/{YOUR_JOB_EXECUTION_ID}/audit \
--header 'x-service-key: {YOUR_SERVICE_KEY}'
import requests
url = "https://operator.opus.com/job/{YOUR_JOB_EXECUTION_ID}/audit"
headers = {"x-service-key": "{YOUR_SERVICE_KEY}"}
response = requests.get(url, headers=headers)
audit = response.json()
print(f"Progress: {audit['nb_executed_nodes']}/{audit['nb_nodes']} nodes")
print(f"Running: {audit['running_node'] or '(none)'}")
print(f"Failed: {audit['nb_failed_nodes']} -> {audit['failed_nodes']}")
for node_id, data in audit['audit']['nodes_execution_data'].items():
print(f"\nNode {node_id}:")
print(data)
const response = await fetch(
"https://operator.opus.com/job/{YOUR_JOB_EXECUTION_ID}/audit",
{
method: "GET",
headers: {
"x-service-key": "{YOUR_SERVICE_KEY}",
},
}
);
const audit = await response.json();
console.log(`Progress: ${audit.nb_executed_nodes}/${audit.nb_nodes} nodes`);
console.log(`Running: ${audit.running_node || "(none)"}`);
console.log(`Failed: ${audit.nb_failed_nodes} -> ${audit.failed_nodes}`);
for (const [nodeId, data] of Object.entries(audit.audit.nodes_execution_data)) {
console.log(`\nNode ${nodeId}:`, data);
}
{
"nb_nodes": 5,
"executed_nodes": ["{NODE_ID_1}", "{NODE_ID_2}"],
"nb_executed_nodes": 2,
"running_node": "{NODE_ID_3}",
"next_node_to_execute": "{NODE_ID_4}",
"remaining_nodes_to_execute": ["{NODE_ID_4}", "{NODE_ID_5}"],
"failed_nodes": [],
"nb_failed_nodes": 0,
"audit": {
"nodes_execution_data": {
"{NODE_ID_1}": {
"{KEY}": "{VALUE}"
},
"{NODE_ID_2}": {
"{KEY}": "{VALUE}"
}
}
}
}
Deprecated
Job Audit Log
Retrieve node-by-node execution data for a job
GET
/
job
/
{jobExecutionId}
/
audit
curl --request GET \
--url https://operator.opus.com/job/{YOUR_JOB_EXECUTION_ID}/audit \
--header 'x-service-key: {YOUR_SERVICE_KEY}'
import requests
url = "https://operator.opus.com/job/{YOUR_JOB_EXECUTION_ID}/audit"
headers = {"x-service-key": "{YOUR_SERVICE_KEY}"}
response = requests.get(url, headers=headers)
audit = response.json()
print(f"Progress: {audit['nb_executed_nodes']}/{audit['nb_nodes']} nodes")
print(f"Running: {audit['running_node'] or '(none)'}")
print(f"Failed: {audit['nb_failed_nodes']} -> {audit['failed_nodes']}")
for node_id, data in audit['audit']['nodes_execution_data'].items():
print(f"\nNode {node_id}:")
print(data)
const response = await fetch(
"https://operator.opus.com/job/{YOUR_JOB_EXECUTION_ID}/audit",
{
method: "GET",
headers: {
"x-service-key": "{YOUR_SERVICE_KEY}",
},
}
);
const audit = await response.json();
console.log(`Progress: ${audit.nb_executed_nodes}/${audit.nb_nodes} nodes`);
console.log(`Running: ${audit.running_node || "(none)"}`);
console.log(`Failed: ${audit.nb_failed_nodes} -> ${audit.failed_nodes}`);
for (const [nodeId, data] of Object.entries(audit.audit.nodes_execution_data)) {
console.log(`\nNode ${nodeId}:`, data);
}
{
"nb_nodes": 5,
"executed_nodes": ["{NODE_ID_1}", "{NODE_ID_2}"],
"nb_executed_nodes": 2,
"running_node": "{NODE_ID_3}",
"next_node_to_execute": "{NODE_ID_4}",
"remaining_nodes_to_execute": ["{NODE_ID_4}", "{NODE_ID_5}"],
"failed_nodes": [],
"nb_failed_nodes": 0,
"audit": {
"nodes_execution_data": {
"{NODE_ID_1}": {
"{KEY}": "{VALUE}"
},
"{NODE_ID_2}": {
"{KEY}": "{VALUE}"
}
}
}
}
Opus exposes a node-level audit for every job. The response shows you which nodes have run, which is running now, which are still queued, and which have failed — together with the per-node execution data that the workflow engine produced. Use it for debugging, compliance, or building progress visualisations on top of a running job.
Path Parameters
string
required
The ID of the job whose audit log you want to retrieve
Headers
string
required
Your API authentication key
Response
number
required
Total number of nodes in the workflow.
string[]
required
IDs of nodes that have already finished executing, in the order they ran.
number
required
Number of nodes that have finished executing. Equal to
executed_nodes.length.string
required
ID of the node currently executing. Empty string when no node is actively running (for example, between nodes or after the job finishes).
string
required
ID of the node scheduled to run next. Empty string when the job has no more nodes queued.
string[]
required
IDs of nodes that are still pending execution.
string[]
required
IDs of nodes that failed during execution.
number
required
Number of failed nodes. Equal to
failed_nodes.length.object
required
Per-node execution data captured by the engine.
Show Audit Object
Show Audit Object
object
required
Map keyed by node ID. Each value contains the inputs, outputs, and runtime metadata captured when that node executed. The exact shape varies by node type.
curl --request GET \
--url https://operator.opus.com/job/{YOUR_JOB_EXECUTION_ID}/audit \
--header 'x-service-key: {YOUR_SERVICE_KEY}'
import requests
url = "https://operator.opus.com/job/{YOUR_JOB_EXECUTION_ID}/audit"
headers = {"x-service-key": "{YOUR_SERVICE_KEY}"}
response = requests.get(url, headers=headers)
audit = response.json()
print(f"Progress: {audit['nb_executed_nodes']}/{audit['nb_nodes']} nodes")
print(f"Running: {audit['running_node'] or '(none)'}")
print(f"Failed: {audit['nb_failed_nodes']} -> {audit['failed_nodes']}")
for node_id, data in audit['audit']['nodes_execution_data'].items():
print(f"\nNode {node_id}:")
print(data)
const response = await fetch(
"https://operator.opus.com/job/{YOUR_JOB_EXECUTION_ID}/audit",
{
method: "GET",
headers: {
"x-service-key": "{YOUR_SERVICE_KEY}",
},
}
);
const audit = await response.json();
console.log(`Progress: ${audit.nb_executed_nodes}/${audit.nb_nodes} nodes`);
console.log(`Running: ${audit.running_node || "(none)"}`);
console.log(`Failed: ${audit.nb_failed_nodes} -> ${audit.failed_nodes}`);
for (const [nodeId, data] of Object.entries(audit.audit.nodes_execution_data)) {
console.log(`\nNode ${nodeId}:`, data);
}
{
"nb_nodes": 5,
"executed_nodes": ["{NODE_ID_1}", "{NODE_ID_2}"],
"nb_executed_nodes": 2,
"running_node": "{NODE_ID_3}",
"next_node_to_execute": "{NODE_ID_4}",
"remaining_nodes_to_execute": ["{NODE_ID_4}", "{NODE_ID_5}"],
"failed_nodes": [],
"nb_failed_nodes": 0,
"audit": {
"nodes_execution_data": {
"{NODE_ID_1}": {
"{KEY}": "{VALUE}"
},
"{NODE_ID_2}": {
"{KEY}": "{VALUE}"
}
}
}
}
Was this page helpful?