
# List configuration revisions

`GET /v1/config-revisions` · permission `config:read`

Every successful [plan apply](../config-plans/apply.md) stores a revision: the state of the resources it changed, as they were just before the apply. This lists the environment's revisions, newest first (`order=asc` reverses). An environment keeps its newest 50 revisions, each for at most 90 days. To go back to a revision, [restore it](restore.md).

Items carry only metadata. The stored resource specs are not returned, and revisions never contain secret values (secrets appear only as `secret_ref` placeholders).

## Request

| Parameter | In | Description |
|---|---|---|
| `limit` | query | Page size, 1–100. |
| `after` | query | Cursor for the next page (`list_metadata.after`). |
| `before` | query | Cursor for the previous page (`list_metadata.before`). |
| `order` | query | `desc` (default, newest first) or `asc`. |

## Response

`200 OK` with `Cache-Control: no-store`.

| Field | Description |
|---|---|
| `id` | The revision id, `cfgr_…`. |
| `plan_id` | The plan whose apply stored the revision; `null` once the plan is deleted (7 days after it expires). |
| `created_by` | The credential that applied the plan. |
| `created_at` | When the plan was applied. |
| `kinds` | The kinds the plan covered. |
| `summary` | The apply's `create`, `update`, `delete` and `no_op` counts. |

```json
{
  "data": [
    {
      "id": "cfgr_01m4qpqtywfs7930tb6kqn5rc5",
      "plan_id": "cfgp_01m4qpqtywfs7930tb6kqn5rc5",
      "created_by": "key_01m4qpqtywfs7930tb6kqn5rc5",
      "created_at": "2026-10-19T10:00:00Z",
      "kinds": ["connection"],
      "summary": {"create": 1, "update": 1, "delete": 0, "no_op": 1}
    }
  ],
  "list_metadata": {"before": null, "after": null}
}
```

## Errors

| HTTP | code | When |
|---|---|---|
| 400 | `invalid_cursor` | The cursor is malformed or belongs to another request. |
| 401 | `unauthenticated` | The credential is missing, invalid or revoked. |
| 403 | `insufficient_permissions` | The credential lacks `config:read`. |
| 422 | `validation_failed` | A query parameter is invalid (for example `limit` outside 1–100). |
| 429 | `rate_limited` | The rate limit was exceeded; retry after the `Retry-After` period. |

## Example

```bash
curl "https://api.eu.keenauth.com/v1/config-revisions?limit=20" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"

keenauth config revisions list --limit 20
```
