# List action revisions (/en/docs/api/native/automation/listActionRevisions)





List revisions newest first with rollback eligibility. Results include the current marker and compatibility issues. Lists omit source by default; only expand=source includes full source, and other values return 400. Detail endpoints retain full source.

`GET /automation/v1/actions/{ns}/{name}/revisions`

## Authentication [#authentication]

`Authorization: Bearer $PRAXIS_API_KEY`

## Request fields [#request-fields]

| Parameter | Type | Description |
| --- | --- | --- |
| path: ns | `string` | required; Namespace, folded to lowercase; matches [a-z0-9][a-z0-9._-]&#123;0,63&#125;. praxis is read-only. |
| path: name | `string` | required; Name, folded to lowercase; matches [a-z0-9][a-z0-9._-]&#123;0,63&#125;. |
| query: limit | `integer` | optional; Page size: integer 1–100, default 20. minimum: 1; maximum: 100 |
| query: cursor | `string` | optional; Opaque next_cursor from the previous page; keep the original filters when paging. |
| query: expand | `"source"` | optional; Only source is accepted; source is omitted by default and other values return 400. |

## Examples [#examples]

[SDK installation and example environment](/en/docs/api/native/automation)

Set these environment variables to your own resources:

| Variable | Source |
| --- | --- |
| ACTION_NAME | [name returned by creating an action](/en/docs/api/native/automation/createAction) |

```bash
: "${ACTION_NAME:?Set ACTION_NAME}"
curl --fail-with-body -X GET "https://api.deepraxis.ai/automation/v1/actions/docs-samples/${ACTION_NAME}/revisions" \
  -H "Authorization: Bearer $PRAXIS_API_KEY"
```

```typescript
import { createAutomationClient } from '@deepraxis/sdk/automation';

function env(name: string): string {
  const value = process.env[name];
  if (!value) throw new Error(`Set ${name}`);
  return value;
}
const automation = createAutomationClient({
  apiKey: env('PRAXIS_API_KEY'),
  baseUrl: 'https://api.deepraxis.ai',
  maxRetries: 0,
  timeoutMs: 90_000,
});
const result = await automation.actions.revisions.list({
  "path": {
    "ns": "docs-samples",
    "name": env("ACTION_NAME")
  }
});
console.log(result);
```

## Response [#response]

### HTTP 200 [#http-200]

Success

`application/json`

| Field | Type | Description |
| --- | --- | --- |
| data | `object[]` | required; Action revisions (implementation source only with expand=source) on this page, ordered by created_at descending, then id descending. |
| data[].current | `boolean` | required; true when this is the action's current revision. |
| data[].rollback | `object` | required; Whether rolling back to this revision is possible, judged by the server against the current revision. no additional fields. |
| data[].rollback.allowed | `boolean` | required; true when rolling back to this revision is allowed; when false, issues explains why. |
| data[].rollback.issues | `object[]` | required; Incompatibilities a rollback would cause, each with pointer and reason; empty when allowed is true. |
| data[].rollback.issues[].pointer | `string` | required; JSON Pointer (RFC 6901) to the incompatible location, relative to the action's input_schema or output_schema. |
| data[].rollback.issues[].reason | `string` | required; Why this location is incompatible with earlier revisions (inputs may only widen, outputs may only narrow). |
| data[].id | `string` | required; Revision id, prefixed actr_; used for display and as the revision of a rollback, and cannot be referenced directly by scripts. |
| data[].digest | `string` | required; Content digest of the contract and implementation; an update with identical content does not create a new revision. |
| data[].input_schema | `object` | required; Any JSON object whose keys are strings and whose values are any JSON value. |
| data[].input_schema.* (variant 5) | `object` | Recursive JSON value. |
| data[].input_schema.* (variant 6)[] | `null` / `string` / `number` / `boolean` / `object` / `JSON[]` | Recursive JSON value. |
| data[].output_schema | `object` | required; Any JSON object whose keys are strings and whose values are any JSON value. |
| data[].output_schema.* (variant 5) | `object` | Recursive JSON value. |
| data[].output_schema.* (variant 6)[] | `null` / `string` / `number` / `boolean` / `object` / `JSON[]` | Recursive JSON value. |
| data[].errors | `object[]` | required; Errors the action declares it may raise, each with type, code and description. |
| data[].errors[].type | `string` | required; Error type: a stable URI or a standard Open Workflow type such as validation, timeout, communication or runtime. |
| data[].errors[].code | `string` | optional; Optional stable error code callers can branch on. |
| data[].errors[].description | `string` | required; What this error means and when it occurs, written for callers. |
| data[].annotations | `object` | required; Declared action behaviour &#123;read_only, idempotent&#125;; keys not supplied at creation default to false. no additional fields. |
| data[].annotations.read_only | `boolean` | required; true declares that the action does not change external state and only reads data. |
| data[].annotations.idempotent | `boolean` | required; true declares that repeating a call with the same input has the same effect as calling once; retries of such a action reuse one idempotency key (run_id plus step path, without the attempt number). |
| data[].timeout_ms | `number` | required; Timeout of one execution in milliseconds; when not supplied it defaults to 30000 for code and 600000 for container or shell implementations. |
| data[].implementation | `object` / `object` / `object` / `object` | required; Implementation information: the full implementation or only its kind; lists omit source, so use expand=source or read a single revision. |
| data[].implementation (variant 1) (variant 1).kind | `"code"` | required; Always code: implemented by source code. |
| data[].implementation (variant 1) (variant 1).language | `"ts"` | required; Source language; only ts (TypeScript) is supported now. |
| data[].implementation (variant 1) (variant 1).source | `string` | required; Complete TypeScript source of the action; empty for built-in actions. |
| data[].implementation (variant 1) (variant 2).kind | `"container"` | required; Always container: implemented as a container image (not yet available). |
| data[].implementation (variant 1) (variant 2).image | `string` | required; Container image reference. |
| data[].implementation (variant 1) (variant 2).command | `string[]` | required; Command and arguments to execute in the container. |
| data[].implementation (variant 1) (variant 3).kind | `"shell"` | required; Always shell: implemented as a shell script (not yet available). |
| data[].implementation (variant 1) (variant 3).script | `string` | required; Full text of the shell script to run. |
| data[].implementation (variant 2).kind | `"code"` / `"container"` / `"shell"` | required; How an action is implemented. code is a source-code implementation (only language=ts is available now); container is an image plus command and is not yet available; shell is a shell script and is not yet available. |
| data[].host | `"builtin"` / `"isolate"` / `"sandbox"` | required; Where an action runs, computed at publication. builtin is a platform-provided action; isolate runs user code in an isolated Worker isolate; sandbox runs in a sandbox (container and shell implementations). |
| data[].platform_apis | `string[]` | required; Platform APIs derived from the code; also the scopes of the action's run token (least privilege). |
| data[].created_by | `object` | required; Principal &#123;type, id&#125; injected by the gateway that says who initiated or acted. This service does not resolve names; the console resolves them in batches. no additional fields. |
| data[].created_by.type | `"user"` / `"api_key"` / `"agent"` / `"run"` / `"trigger"` | required; Principal type. user is a signed-in user; api_key is a platform API key; agent is an agent; run is an action performed by a run itself (for example a parent run); trigger is a trigger. |
| data[].created_by.id | `string` | required; Principal identifier whose meaning follows type: a user, API key, agent, run or trigger id. Treat it as an opaque string. |
| data[].message | `null` / `string` | required; Note supplied when this revision was created, or null. |
| data[].created_at | `string` | required; Time this revision was created (RFC 3339 UTC). |
| next_cursor | `null` / `string` | required; Cursor for the next page: pass it unchanged as cursor with the same filters; null when there are no more pages. No total is returned. |

### Measured response [#measured-response]

HTTP 200

```json
{
  "data": [
    {
      "id": "actr_00mv67lrt1370820a9daaa4fd3882332e4899a4c9e",
      "digest": "e35c209873c60486ca8da455878062cb7ea572a6147ce3ca03e0693b4769fa45",
      "input_schema": {
        "type": "object",
        "properties": {
          "n": {
            "type": "number"
          }
        },
        "required": [
          "n"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "answer": {
            "type": "number"
          }
        },
        "required": [
          "answer"
        ],
        "additionalProperties": false
      },
      "errors": [],
      "annotations": {
        "read_only": false,
        "idempotent": false
      },
      "timeout_ms": 30000,
      "host": "isolate",
      "platform_apis": [],
      "created_by": {
        "type": "api_key",
        "id": "key_3e00b8984967"
      },
      "message": "Sample revision",
      "created_at": "2026-10-13T04:57:12.709Z",
      "current": true,
      "rollback": {
        "allowed": true,
        "issues": []
      },
      "implementation": {
        "kind": "code"
      }
    },
    {
      "id": "actr_00mv67loz3e46938b8ecf54e57b8f31297df016a1c",
      "digest": "e35c209873c60486ca8da455878062cb7ea572a6147ce3ca03e0693b4769fa45",
      "input_schema": {
        "type": "object",
        "properties": {
          "n": {
            "type": "number"
          }
        },
        "required": [
          "n"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "answer": {
            "type": "number"
          }
        },
        "required": [
          "answer"
        ],
        "additionalProperties": false
      },
      "errors": [],
      "annotations": {
        "read_only": false,
        "idempotent": false
      },
      "timeout_ms": 30000,
      "host": "isolate",
      "platform_apis": [],
      "created_by": {
        "type": "api_key",
        "id": "key_3e00b8984967"
      },
      "message": null,
      "created_at": "2026-10-13T04:57:09.039Z",
      "current": false,
      "rollback": {
        "allowed": true,
        "issues": []
      },
      "implementation": {
        "kind": "code"
      }
    }
  ],
  "next_cursor": null
}
```

## Errors [#errors]

| HTTP | Codes and description |
| --- | --- |
| 400 | INVALID_PARAMS: Invalid request parameters, path, cursor, or body format. |
| 404 | ACTION_NOT_FOUND: The action does not exist or is not visible to this tenant; a same-name script/workflow adds a hint pointing to its endpoint. |
| default | RFC 9457 automation problem. 429 includes Retry-After. |

[Authentication and common errors](/en/docs/api/errors) · Retain the `X-Request-Id` response header for troubleshooting.
