# Show progress of a workflow

> How far a workflow is that another route started, by its workflow_token.

- Effect: Read - Changes nothing.
- Idempotent: yes
- Stability: beta
- MCP tool: `manitu_workflow_get` on https://mcp.manitu.de/mcp
- REST: `POST https://api.manitu.de/v1/workflow/get`
- Page: /reference/workflow/get/

## MCP tool

`manitu_workflow_get`

### Description for the model

Tells how far a workflow is that a manitu tool started in the manitu customer account this connection works in - a restart or snapshot of a virtual server, a database copy and the like - by the workflow_token that tool answered, passed as it is. status pending or running: not done yet - wait and ask again, not more often than about once a minute; some take many minutes. done: finished. error: it failed - tell the customer, do not simply start it again (result.error_list may say why). result has what it left for the customer once finished - an installed application's administrator and where to log in, the versions of an update. Refused (forbidden) when this access may not see the package or server the workflow works on. The token is a secret of this workflow: never show it.

### Arguments

- `workflow_token` (string, required, write-only) - The workflow_token the starting tool answered - passed as it is, never built. (minLength `1`; maxLength `255`)

### Example

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "manitu_workflow_get",
    "arguments": {
      "workflow_token": "eyJwYWdlIjoyfQ"
    }
  }
}
```

## REST

`POST https://api.manitu.de/v1/workflow/get`

### Authentication

One of `X-API-Key`, `Authorization: Bearer …` - never more than one in a request.

### Request body

JSON; unknown fields are refused.

- `workflow_token` (string, required, write-only) - The workflow_token the starting tool answered - passed as it is, never built. (minLength `1`; maxLength `255`)

### Response

In `data`; the rest of the body as on every call.

- `workflow` (string | null, required) - What is being done, e.g. power_reboot or ngcobalt_site_web_database_copy. (one of `"create"`, `"destroy"`, `"power_start"`, `"power_stop"`, `"power_reboot"`, `"reinstall"`, `"ptr_set"`, `"vnc_enable"`, `"vnc_disable"`, `"rescuesystem_enable"`, `"rescuesystem_disable"`, `"snapshot_create"`, `"snapshot_delete"`, `"snapshot_delete_all"`, `"snapshot_revert"`, `"telemetry_await"`, `"iso_eject"`, `"none"`, `"account_contract_termination_finish"`, `"ngcobalt_site_web_application_installation_set"`, `"ngcobalt_site_web_application_installation_update"`, `"ngcobalt_site_web_permission_set"`, `"ngcobalt_site_web_database_copy"`, `"network_librenms_discover"`, `null`)
- `workflow_id` (string | null, required) - The id of this run, as vserver/workflow/list names it; null for a workflow not kept as tasks.
- `status` (string, required) - pending: waiting to start; running: started, not finished (can take a while); done: finished, everything went through; error: finished, but it or part of it failed. (one of `"pending"`, `"running"`, `"done"`, `"error"`)
- `created_at` (string | null, required) - When it was asked for. (format `date-time`)
- `started_at` (string | null, required) - When it started; null while pending, and for a workflow that does not record it. (format `date-time`)
- `ended_at` (string | null, required) - When it finished; null until then. (format `date-time`)
- `updated_at` (string | null, required) - When it last changed. (format `date-time`)
- `result` (object | null, required) - What it left for the customer, when it is finished - null for a workflow that keeps none.
  - `result.admin` (object | null, required) - The administrator of an application manitu installed.
    - `result.admin.username` (string, required)
    - `result.admin.password` (string | null, required) - A secret; null where it is withheld (secrets_withheld).
    - `result.admin.mail_address` (string, required)
  - `result.administration_url` (string | null, required) - Where an installed application is administered.
  - `result.version` (object | null, required) - The versions of an application update.
    - `result.version.old` (string | null, required)
    - `result.version.new` (string | null, required)
  - `result.dump` (object | null, required) - The dump files a database copy wrote, relative to the package.
    - `result.dump.source` (string | null, required)
    - `result.dump.target` (string | null, required)
  - `result.error_list` (array of string, required) - Why it failed, as codes - e.g. quota_exceeded, extra_files_found, nextcloud_too_old.
- `secrets_withheld` (boolean, required) - A secret in result is left out here (an answer to an agent).

### Statuses

- `200` Success.
- `400` The request does not match the declared input schema.
- `401` No credential was presented, or it was not recognised.
- `403` The credential is not permitted to use this operation.
- `500` The server failed. Nothing about the request was wrong. Whether a change took effect is not known - check before trying it again.
- `503` The channel this operation forwards through is unavailable.

### Example

```sh
curl -X POST 'https://api.manitu.de/v1/workflow/get' \
  -H 'X-API-Key: $API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"workflow_token":"eyJwYWdlIjoyfQ"}'
```

## Example result

```json
{
  "workflow": "create",
  "workflow_id": "string",
  "status": "pending",
  "created_at": "2026-10-23T12:00:00+02:00",
  "started_at": "2026-10-23T12:00:00+02:00",
  "ended_at": "2026-10-23T12:00:00+02:00",
  "updated_at": "2026-10-23T12:00:00+02:00",
  "result": {
    "admin": {
      "username": "string",
      "password": "correct-horse-battery",
      "mail_address": "info@example.com"
    },
    "administration_url": "https://www.example.com/",
    "version": {
      "old": "string",
      "new": "string"
    },
    "dump": {
      "source": "string",
      "target": "string"
    },
    "error_list": [
      "string"
    ]
  },
  "secrets_withheld": true
}
```
