> ## 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.

# Get analysis progress

> Returns the current progress of an analysis, including completed layers and provisional risk score.

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

```bash theme={null}
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

```json theme={null}
{
  "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                 |

<Note>
  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`.
</Note>

## Polling strategy

Poll this endpoint every **2 seconds** while `status` is `running`. When `completedLayers` increments, fetch the new layer via [Get layer result](/api-reference/endpoint/get-analysis-layer). Stop polling when `status` is `completed` or `failed`.

```javascript theme={null}
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);
```
