# Get a project's continuous monitoring status

Requires the `compliance:read` scope.

`GET /iso/projects/{projectId}/monitoring`

Scope `compliance:read` | Plan **Scale+**

Requires the `compliance:read` scope. Needs the `continuous_monitoring` plan feature.

## Path parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `projectId` | string | yes |  |

## Returns

The `data` field of the standard `{ data, error, meta }` envelope:

- `controls`: array of object One entry per gap control of the project.
  - `collectionEnabled`: boolean Automated collection is enabled.
  - `consecutiveFailures`: integer Failed runs in a row, newest first.
  - `controlId`: string Annex A control id.
  - `freshness`: string FRESH, STALE, FAILED or MANUAL_ONLY.
  - `lastRunAt`: optional string (date-time) or null Start of the latest collection run (UTC), when any.
  - `lastRunStatus`: optional string RUNNING, COMPLETED, FAILED, SKIPPED or UNKNOWN, when a run exists.
  - No other fields.
- `projectId`: string ISO project id (iso_).
- `summary`: object Counts per freshness class.
  - `failed`: integer FAILED controls.
  - `fresh`: integer FRESH controls.
  - `manualOnly`: integer MANUAL_ONLY controls.
  - `stale`: integer STALE controls.
  - `total`: integer Controls.
  - No other fields.
- No other fields.

## Errors

| Status | Code | Retry | Meaning |
|---|---|---|---|
| 400 | - | no | The request is invalid. |
| 401 | - | no | The token is missing, malformed, expired or revoked. |
| 402 | - | no | The organisation's plan does not include the feature this route needs. |
| 403 | - | no | The token may not use this route. |
| 404 | - | no | The resource does not exist in this organisation. |
| 429 | - | yes | Rate limit or row budget exceeded; retry after the time in Retry-After. |
| 500 | - | no | Unexpected server error. |
| 503 | - | yes | A dependency is temporarily unavailable; retry later. |

## Example

### curl

```bash
curl "https://api.autociso.io/api/v1/iso/projects/<projectId>/monitoring" \
  -H "Authorization: Bearer <your-api-token>"
```

### Python

```python
import requests

response = requests.get(
    "https://api.autociso.io/api/v1/iso/projects/<projectId>/monitoring",
    headers={"Authorization": "Bearer <your-api-token>"},
)
print(response.json())
```

### JavaScript

```javascript
const response = await fetch("https://api.autociso.io/api/v1/iso/projects/<projectId>/monitoring", {
  method: "GET",
  headers: { "Authorization": "Bearer <your-api-token>" },
});
console.log(await response.json());
```

## Response (200)

```json
{
  "data": {
    "controls": [
      {
        "collectionEnabled": true,
        "consecutiveFailures": 0,
        "controlId": "A.5.15",
        "freshness": "FRESH",
        "lastRunAt": "2026-10-13T04:00:00Z",
        "lastRunStatus": "COMPLETED"
      },
      {
        "collectionEnabled": true,
        "consecutiveFailures": 0,
        "controlId": "A.8.13",
        "freshness": "STALE",
        "lastRunAt": "2026-10-06T04:00:00Z",
        "lastRunStatus": "COMPLETED"
      },
      {
        "collectionEnabled": true,
        "consecutiveFailures": 3,
        "controlId": "A.8.16",
        "freshness": "FAILED",
        "lastRunAt": "2026-10-13T04:00:00Z",
        "lastRunStatus": "FAILED"
      }
    ],
    "projectId": "iso_1hfa8m2c4x0p",
    "summary": {
      "failed": 1,
      "fresh": 1,
      "manualOnly": 0,
      "stale": 1,
      "total": 3
    }
  },
  "error": null
}
```
