Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.wavynode.com/llms.txt

Use this file to discover all available pages before exploring further.

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

ParameterTypeDescription
analysisIdstring (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

FieldTypeDescription
analysisIdstringThe analysis identifier
statusstringCurrent status: pending, running, completed, or failed
completedLayersintegerNumber of BFS depth layers that have finished processing
maxDepthintegerTotal number of layers the analysis will process
incrementalbooleanWhether this is an incremental (layer-by-layer) analysis
riskScorenumberLatest provisional risk score (0–100). Updates after each layer
patternsDetectedintegerNumber of suspicious patterns detected so far
startedAtstringISO 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);