---
title: "Befehl im Workspace ausführen"
description: "Einen Shell-Befehl in einer Arbeitskopie des Website-Entwurfs in einem eigenen Container ausführen."
canonical: "https://atelier201.com/docs/de/api/workspace/run"
updated: "2026-11-06"
---

# Befehl im Workspace ausführen

Erfordert `sites:write`. Kostet keine Credits. Der Pfad endet mit `/workspace:run`.

Der Workspace ist eine Shell in einer Arbeitskopie des Website-Entwurfs, offline im eigenen Container der Website. Verwende ihn für Aufgaben, die sich gut in einer Shell erledigen lassen: `rg`, `grep`, `find`, `cat`, `sed -i`, `node` und `npx astro build`, um in Sekunden einen Build zu testen. Der Befehl wird als nicht privilegierter Benutzer im Stammverzeichnis des Projekts ausgeführt. Es gibt keine Netzwerkverbindung.

Änderungen durch den Befehl bleiben uncommitted. Die Antwort führt diese Änderungen in `uncommitted` auf, eine pro Zeile im Stil von `git status` (`M src/pages/index.astro`). In den Verlauf gelangt nichts, bis du den [Workspace committest](/docs/api/workspace/commit), und Besucher sehen erst etwas, wenn du veröffentlichst.

`command` darf höchstens 8000 Zeichen lang sein. `timeout_ms` liegt zwischen 1000 und 300000 und ist standardmäßig auf 60000 gesetzt: Läuft ein Befehl zu diesem Zeitpunkt noch, wird er angehalten und `timed_out` ist `true`. Ein fehlgeschlagener Befehl ist kein API-Fehler: Der Aufruf ist erfolgreich und `exit_code` ist nicht 0. `output` enthält zusammen stdout und stderr. Bei mehr als 8 KB bleiben Anfang und Ende erhalten und `truncated` ist `true`.

Der Workspace folgt dem Entwurf. Hat eine andere Änderung den Entwurf seit deinem letzten Befehl verändert, werden deine uncommitted Änderungen übernommen und `note` weist darauf hin. Dasselbe gilt, wenn der Workspace neu erstellt werden musste.

Eine Website, die noch erstellt wird, antwortet mit `result_not_ready`. Bei einer ausgesetzten oder gerade gelöschten Website lautet die Antwort `conflict`.

```http
POST https://api.atelier201.com/v1/sites/{site_id}/workspace:run
```

## Authorizations

- `Authorization` (bearer, in header, required)

## Path parameters

- `site_id` (`string`, required): ID der Website oder ihr Slug (die Adresse vor .atelier201.page).

## Body

`application/json`, required

- `command` (`string`, required, length: `1–8000 chars`): Ein Bash-Befehl im Stammverzeichnis des Projekts, in einer Arbeitskopie des Entwurfs: rg, grep, sed, find, cat, node... Kein Netzwerkzugriff. Geänderte Dateien bleiben uncommitted, bis `workspace:commit` sie erstellt und Build-Fehler meldet. Ein Build des Projekts wird hier abgelehnt: Er dauerte 30 s und hätte den Build doppelt ausgeführt.
- `timeout_ms` (`integer`, range: `1000–300000`): Standardwert 60000. Danach wird der Befehl abgebrochen.

## Response

**200**: Einen Shell-Befehl im Workspace der Website ausführen

- `data` (`object`, required)
- `data.revision` (`string`, required, length: `40–40 chars`): Die Revision des Entwurfs, von der der Workspace ausgegangen ist.
- `data.exit_code` (`integer`, required, range: `-9007199254740991–9007199254740991`)
- `data.timed_out` (`boolean`, required)
- `data.output` (`string`, required): stdout und stderr zusammen. Bei mehr als 8 KB werden Anfang und Ende ausgegeben.
- `data.truncated` (`boolean`, required)
- `data.uncommitted` (`string[]`, required): Die uncommitted Änderungen des Workspace nach dem Befehl, im Stil von git status ("M src/pages/index.astro").
- `data.note` (`string,null`, required): Wird angegeben, wenn der Workspace vor dem Befehl neu erstellt oder auf einen neueren Entwurf umgestellt wurde.
- `request_id` (`string`, required)

```json
{
  "data": {
    "revision": "<string>",
    "exit_code": 123,
    "timed_out": true,
    "output": "<string>",
    "truncated": true,
    "uncommitted": [
      "<string>"
    ],
    "note": null
  },
  "request_id": "<string>"
}
```

**400**: Mögliche Codes: invalid_request, unknown_field, invalid_parameter, invalid_cursor

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**401**: Mögliche Codes: authentication_required, invalid_api_key, api_key_expired, api_key_revoked

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**402**: Mögliche Codes: insufficient_credits

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**403**: Mögliche Codes: insufficient_scope, feature_not_available, admin_required

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**404**: Mögliche Codes: resource_not_found

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**409**: Mögliche Codes: conflict, result_not_ready, idempotency_key_reused

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**410**: Mögliche Codes: result_expired

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**413**: Mögliche Codes: request_too_large

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**422**: Mögliche Codes: request_too_large_for_plan

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**429**: Mögliche Codes: rate_limited

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**500**: Mögliche Codes: internal_error

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**503**: Mögliche Codes: service_unavailable

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**Example request**

```bash
curl --request POST \
  --url 'https://api.atelier201.com/v1/sites/<site_id>/workspace:run' \
  --header 'Authorization: <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
  "command": "<string>"
}'
```
