> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.cloudraker.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.cloudraker.com/_mcp/server.

# Saved actions

Every capability takes its configuration inline. A **saved action** is that same configuration, stored under a name and a slug, so a call becomes `{"file": …, "action": "medical-intake"}`. Both ramps drive the same engine — inline config is the fastest way to start, saved actions are how a team keeps a configuration honest over time.

What the saved ramp buys you:

* **Reuse** — one schema or redaction policy, referenced from every call, every pipeline step, and the product UI.
* **Governance** — the configuration changes in one place, not in every caller's source.
* **Record binding** — an extract action bound to a data object (`objectDefinitionId`) can have its results imported as records when you [keep](/developers/runs#keep-a-run) the run.
* **Stable config under `keep`** — the run snapshots the configuration it ran with, so a kept result stays explainable after the action changes.

## Discover what you can save

`GET /v1/actions/catalog` is the discovery endpoint: every capability you can save an action for, the slugs behind it, and the JSON Schema of each slug's `config`.

```bash
curl https://api.cloudraker.com/v1/actions/catalog \
  -H "Authorization: Bearer $CLOUDRAKER_API_KEY"
```

```jsonc
{
  "object": "list",
  "data": [
    {
      "capability": "extract",
      "name": "Extract structured data",
      "description": "Extracts data matching your schema from processed documents and transcripts, with per-field source evidence.",
      "slugs": ["extract-structured"],
      "actions": [
        { "slug": "extract-structured", "name": "Extract structured data", "configSchema": { /* JSON Schema */ } }
      ]
    },
    {
      "capability": "redact",
      "name": "Redact PDF",
      "slugs": ["redact-pdf", "redact-audio"],
      "actions": [ /* one entry per slug, each with its own configSchema */ ]
    }
    // …fill, sign
  ]
}
```

The catalog covers the four capabilities that *have* a saved configuration: `extract`, `redact`, `fill`, and `sign`. [Parse](/capabilities/parse) has nothing to configure and [pipelines](/capabilities/pipeline) are composed per call, so neither appears.

`redact` covers two variants — documents and audio. Pass `mimeType` when you save one so the right variant is chosen.

## Save an action

```bash
curl -X POST https://api.cloudraker.com/v1/actions \
  -H "Authorization: Bearer $CLOUDRAKER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "capability": "extract",
    "name": "Medical intake",
    "config": {
      "schema": {
        "type": "object",
        "properties": {
          "patient_name": { "type": ["string", "null"] },
          "visit_date": { "type": ["string", "null"] }
        }
      },
      "instructions": "Dates are DD/MM/YYYY.",
      "unit": "per_document"
    }
  }'
```

```json
{
  "object": "action",
  "id": "21f122a6-9f8b-4f2c-8a0f-6f3e1c9b2d44",
  "slug": "medical-intake",
  "name": "Medical intake",
  "capability": "extract",
  "config": { }
}
```

| Field        | What it is                                                                                                                                                                |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `capability` | **Required.** `extract`, `redact`, `fill`, or `sign`.                                                                                                                     |
| `name`       | **Required.** ≤ 200 characters. The slug is derived from it and is unique in your organization.                                                                           |
| `config`     | The saved configuration — validated against that capability's `configSchema`. An extract `config.schema` must satisfy the [schema dialect](/capabilities/extract/schema). |
| `mimeType`   | Picks the variant when a capability has several slugs (`redact`).                                                                                                         |

## Reference it

The **id and the slug are interchangeable** everywhere an action is referenced — `action: "medical-intake"` and `action: "21f122a6-…"` do the same thing. Ids are opaque strings; treat them as such.

```bash
# a verb
curl -X POST https://api.cloudraker.com/v1/extract \
  -H "Authorization: Bearer $CLOUDRAKER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "file": { "id": "a04d6597-…" }, "action": "medical-intake" }'
```

Inline fields sent alongside `action` are **deep-merged over** the saved configuration and win, so a one-off tweak never requires a second saved action:

```json
{ "file": { "id": "a04d6597-…" }, "action": "medical-intake", "instructions": "This batch is in French." }
```

In a [pipeline](/capabilities/pipeline), a saved action is either a typed step with overrides — `{"extract": {"action": "medical-intake"}}` — or a bare `{"action": "medical-intake"}` step that runs it as-is.

Saved **sign** actions are a dead end today: `POST /v1/actions` accepts `"capability": "sign"`, but no `/v1` request path takes a reference to one — [`POST /v1/sign`](/capabilities/sign) and `{"sign": …}` pipeline steps are configured inline only. Passing a sign action as another verb's `action`, or as a bare `{"action": …}` step, returns `400 invalid_request`: only the sign path keeps the run exempt from the TTL purge while an envelope is open.

## List, read, delete

```bash
curl "https://api.cloudraker.com/v1/actions?limit=50" \
  -H "Authorization: Bearer $CLOUDRAKER_API_KEY"

curl https://api.cloudraker.com/v1/actions/medical-intake \
  -H "Authorization: Bearer $CLOUDRAKER_API_KEY"

curl -X DELETE https://api.cloudraker.com/v1/actions/medical-intake \
  -H "Authorization: Bearer $CLOUDRAKER_API_KEY"
```

`GET /v1/actions` pages with `?limit` (1–100) and `?starting_after=<id>`. Keep paging while **`has_more`** is `true` — a page can be shorter than `limit`, so the row count is not a reliable end-of-list signal.

Deleting an action does not disturb runs that already used it: each run snapshotted the configuration it ran with.

## Next steps

#### [Extraction schema dialect](/capabilities/extract/schema)

The rules a saved extract `config.schema` must satisfy.

#### [Pipelines](/capabilities/pipeline)

Compose saved actions and inline steps over one file set.

#### [Runs](/developers/runs)

Keep a result in the product — where record binding pays off.

#### [Actions in the app](/actions/overview)

The same actions, managed from the CloudRaker interface.