# Pipeline-Step aktualisieren

Status melden und neue Folgeschritte anhängen.

`POST /v1/event/{eventId}/step`

**Authentifizierung:** API-Token des Event-Projekts. Für Benutzer-Access-JWT gibt es [PATCH](/api/patch-step).

## Pfadparameter

`eventId`: ID aus der Pipeline-Erstellung.

## Body

| Feld | Typ | Bedeutung |
| --- | --- | --- |
| `id` | string, erforderlich | ID eines bestehenden Steps. |
| `status` | string | `waiting`, `running`, `success`, `failed`, `skipped`, `cancelled`. |
| `message` | string | Audit-Nachricht, maximal 2000 Zeichen. |
| `steps` | array | Neue Step-Definitionen anhängen, bestehende bleiben erhalten. |

Mindestens `status` oder `steps` ist erforderlich. Neue Steps brauchen `id`, `name`, `stage`; optional sind `description`, `requires`, `required`, `allowFailure`, `status`, `actions`. Für den gesamten Graphen gelten maximal 200 Steps, pro Step maximal 20 Actions. IDs sind eindeutig, höchstens 80 Zeichen und beginnen mit Buchstabe oder Ziffer; danach sind auch `_`, `.` und `-` erlaubt.

## Voraussetzungen

Vor dem Start müssen alle Vorgänger erfüllt sein. `stage` erzeugt keine Abhängigkeit. Endzustände sind grundsätzlich abgeschlossen; ein fehlgeschlagener Step kann unter den [Zustandsregeln](/docs/concepts/event-pipelines#zustandsregeln) erneut gestartet werden.

## Antwort und Fehler

HTTP `200` liefert das aktualisierte Event mit abgeleitetem Status und Pipeline-Revision. Die Antwort rechts ist ein gekürztes Beispiel. `400`: ungültiger Graph. `404`: Event oder Step fehlt. `409`: unerfüllte Vorgänger, unzulässiger Übergang, laufende Action, geschlossene Pipeline oder konkurrierende Änderung.


## SDK-Nutzung

Die SDK-Beispiele stehen neben den HTTP-Requests unter **SDKs**. Installation und Einrichtung: [JavaScript / TypeScript](/sdks/javascript), [Next.js](/sdks/nextjs) und [Swift](/sdks/swift). Projekt-Slugs werden vom Client ergänzt.

Diese Operation verwendet den Projekt-API-Token. Next.js-Beispiele gehören in eine Serverumgebung; Swift-Zugänge stammen aus deiner Laufzeitkonfiguration.

## Request

```bash
curl -X POST 'https://api.tracklytic.de/v1/event/EVENT_ID/step' \
  -H "Authorization: Bearer $TRACKLYTIC_API_TOKEN" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "id": "build",
  "status": "success",
  "message": "Build abgeschlossen"
}'
```

```js
const response = await fetch("https://api.tracklytic.de/v1/event/EVENT_ID/step", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.TRACKLYTIC_API_TOKEN}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify(
    {
      "id": "build",
      "status": "success",
      "message": "Build abgeschlossen"
    }
  )
});

if (!response.ok) throw new Error(await response.text());
const result = await response.json();
```

```python
import json
import os
from urllib.request import Request, urlopen

payload = {
  "id": "build",
  "status": "success",
  "message": "Build abgeschlossen"
}

request = Request(
    "https://api.tracklytic.de/v1/event/EVENT_ID/step",
    method="POST",
    headers={
        "Authorization": "Bearer " + os.environ["TRACKLYTIC_API_TOKEN"],
        "Content-Type": "application/json"
    },
    data=json.dumps(payload).encode("utf-8")
)

with urlopen(request) as response:
    result = json.load(response)
```

## SDKs

### JavaScript / TypeScript

```ts
import Tracklytic from 'tracklytic';

const tracklytic = new Tracklytic({
  token: process.env.TRACKLYTIC_API_TOKEN!,
  project: "my-project",
});

const event = await tracklytic.pipeline.update("EVENT_ID", {
  id: "build", status: "success", message: "Build abgeschlossen",
});
```

### Next.js

```ts
import { TracklyticServer } from 'tracklytic-next/server';

const tracklytic = new TracklyticServer({
  token: process.env.TRACKLYTIC_API_TOKEN!,
  project: "my-project",
});

const event = await tracklytic.pipeline.update("EVENT_ID", {
  id: "build", status: "success", message: "Build abgeschlossen",
});
```

### Swift

```swift
import Foundation
import Tracklytic

let tracklytic = TracklyticClient(
    project: "my-project",
    token: apiToken
)

let event = try await tracklytic.updateStep(
    eventId: "EVENT_ID",
    options: StepUpdate(id: "build", status: .success, message: "Build abgeschlossen")
)
```

## Response (200)

```json
{
  "id": "EVENT_ID",
  "status": "waiting",
  "pipeline": {
    "revision": 1
  },
  "steps": [
    {
      "id": "build",
      "name": "Build",
      "stage": "Build",
      "status": "success"
    },
    {
      "id": "deploy",
      "name": "Deployment",
      "stage": "Deploy",
      "requires": [
        "build"
      ],
      "status": "waiting"
    }
  ]
}
```