Useful for showing a progress indicator while an incremental analysis is running. Returns how many BFS layers have completed out of the maximum depth, along with the latest provisional risk score.
Request
curl https://api.wavynode.com/v1/analysis/{analysisId}/progress \
-H "x-api-key: ApiKey wavy_..."
Path parameters
| Parameter | Type | Description |
|---|
analysisId | string (uuid) | The analysis ID returned by the tracker service. Available in the investigation’s analysis_id field |
Response
{
"success": true,
"data": {
"analysisId": "2912b99e-ddb7-41bf-af29-fa0136361bf7",
"status": "running",
"completedLayers": 3,
"maxDepth": 7,
"incremental": true,
"riskScore": 46,
"patternsDetected": 1,
"startedAt": "2026-04-29T16:22:26.949Z"
}
}
Response fields
| Field | Type | Description |
|---|
analysisId | string | The analysis identifier |
status | string | Current status: pending, running, completed, or failed |
completedLayers | integer | Number of BFS depth layers that have finished processing |
maxDepth | integer | Total number of layers the analysis will process |
incremental | boolean | Whether this is an incremental (layer-by-layer) analysis |
riskScore | number | Latest provisional risk score (0–100). Updates after each layer |
patternsDetected | integer | Number of suspicious patterns detected so far |
startedAt | string | ISO 8601 timestamp of when the analysis started |
The riskScore is provisional while the analysis is running. It may increase or decrease as deeper layers reveal more transaction patterns. The final score is set when status becomes completed.
Polling strategy
Poll this endpoint every 2 seconds while status is running. When completedLayers increments, fetch the new layer via Get layer result. Stop polling when status is completed or failed.
const POLL_INTERVAL = 2000;
let lastLayer = -1;
const poll = setInterval(async () => {
const res = await fetch(`/v1/analysis/${analysisId}/progress`, { headers });
const { data } = await res.json();
if (data.completedLayers > lastLayer) {
// Fetch the new layer
const layer = await fetch(`/v1/analysis/${analysisId}/layers/${data.completedLayers - 1}`, { headers });
lastLayer = data.completedLayers;
}
if (data.status === 'completed' || data.status === 'failed') {
clearInterval(poll);
}
}, POLL_INTERVAL);