Starte Workflows aus deinem eigenen Programm oder Skript und lies ihr Ergebnis.
Alle Beispiele nutzen curl, du kannst sie also zuerst im Terminal ausprobieren.
Es funktioniert in SubKit Cloud und auf einer selbst betriebenen Engine gleich.
Was du brauchst #
- Die Adresse deiner Engine.
- Cloud:
https://subkit-cloud.mikebild.info(ohne/cockpit) - Selbst betrieben:https://<deine-engine> - Einen API-Schlüssel mit
workflow:read,workflow:runundexecution:read. Leg ihn mit der sk-CLI an, wie in diesem Kapitel gezeigt, oder im Cockpit unter API-Zugang. Für die CLI meldest du dich an wie in „Die sk-CLI auf deinem Rechner verwenden“ beschrieben. - Einen Workflow, der aktiv und freigegeben ist. Siehe „Dein erster Workflow“.
curlin deinem Terminal.
Die Engine erreichen #
/health braucht keinen Schlüssel.
- Setze die Adresse als Variable:
bash export SK_URL=https://<deine-engine> - Rufe
/healthauf:bash curl -s "$SK_URL/health"json { "status": "ok", "service": "subkit", "version": "<version>" }
Einen API-Schlüssel anlegen und prüfen #
- Leg einen Schlüssel mit genau den Berechtigungen an, die dieses Kapitel braucht:
bash sk apikeys create --name http-api-test --scopes workflow:read,workflow:run,execution:read - Kopiere
plaintext_keyaus der JSON-Antwort. Er wird nur einmal angezeigt, bewahre ihn in einem Passwortmanager auf. - Leg den Schlüssel in eine Variable:
bash export SK_KEY=<api-key> - Frag die Engine, wer du bist:
bash curl -s "$SK_URL/v1/identity/whoami" \ -H "Authorization: Bearer $SK_KEY"Die Antwort nennt dein Konto, deinen Arbeitsbereich und die Scopes des Schlüssels (gekürzt):json { "id": "<user-id>", "kind": "user", "tenant_slug": "<workspace>", "role_name": "admin", "scopes": ["workflow:read", "workflow:run", "execution:read"] }
Ohne --scopes bekommt der Schlüssel dieselben Scopes wie dein eigener Zugang.
sk apikeys revoke <key-id> widerruft den Schlüssel.
Deine Workflows auflisten #
- Rufe die aktiven Workflows ab:
bash curl -s "$SK_URL/v1/workflows?status=active&limit=20" \ -H "Authorization: Bearer $SK_KEY"Jeder Eintrag initemsträgt unter anderemid,slug,name,lifecycleundoperating_status(gekürzt):json { "items": [ { "id": "<workflow-id>", "slug": "daily-report", "name": "Daily report", "lifecycle": "active", "operating_status": "active" } ], "total": 1, "categories": [{ "category": "reporting", "count": 1 }] } - Kopiere die
id. Läufe brauchen die ID, ein Slug wird nicht angenommen.
q=<text> durchsucht Name, Slug, Beschreibung und Kategorie.
Einen Lauf starten #
- Schick die Workflow-ID und die Eingabe an
/v1/executions:bash curl -s -X POST "$SK_URL/v1/executions" \ -H "Authorization: Bearer $SK_KEY" \ -H "Content-Type: application/json" \ -d '{"source":"saved","workflow_id":"<workflow-id>","input":{}}'Der Aufruf wartet auf den Lauf und antwortet mit200,execution_id,status,outputundsteps.
input muss zur Eingabe des Workflows passen. GET /v1/workflows/<workflow-id>/input-schema zeigt, was er erwartet.
Einen langen Lauf im Hintergrund starten #
- Schick den Lauf mit
"async":true. Optional: Ergänze einen HeaderIdempotency-Key:bash curl -s -X POST "$SK_URL/v1/executions" \ -H "Authorization: Bearer $SK_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: daily-report-<date>" \ -d '{"source":"saved","workflow_id":"<workflow-id>","input":{},"async":true}'Die Engine antwortet sofort mit202:json { "execution_id": "<execution-id>", "status": "queued", "hold_writes": false } - Kopiere
execution_idund lies das Ergebnis wie im nächsten Abschnitt beschrieben.
- Der Header
Idempotency-Keynimmt 1 bis 200 Zeichen. - Schickst du denselben Schlüssel noch einmal, startet kein zweiter Lauf. Die Antwort trägt die ID des ersten Laufs und
"idempotent_replay": true.
Das Ergebnis lesen #
- Lies den Lauf:
bash curl -s "$SK_URL/v1/executions/<execution-id>" \ -H "Authorization: Bearer $SK_KEY" - Prüfe
status. - Lies bei einem Fehler
outcome.failed_stepfür den Schritt underrorfür die Ursache. - Lies die Ausgabe jedes Schritts:
bash curl -s "$SK_URL/v1/executions/<execution-id>/steps" \ -H "Authorization: Bearer $SK_KEY"Jeder Eintrag hatstep_key,statusund eine Vorschau inoutput_previewoderresult_preview. Der letzte Schritt enthält meist das Ergebnis des Workflows.
status | Bedeutung |
|---|---|
queued, running | Der Lauf arbeitet noch. |
succeeded | Der Lauf ist fertig. |
failed, timed_out, aborted | Der Lauf wurde vorzeitig beendet. |
outcome.kind fasst den Lauf zusammen, zum Beispiel succeeded, failed oder held.
sk executions result <execution-id> zeigt dasselbe Ergebnis im Terminal.
Seitenweise lesen #
Listen liefern jeweils eine Seite. total zählt alle Treffer.
| Liste | Seitengröße | Nächste Seite |
|---|---|---|
GET /v1/workflows | limit (bis 200) | offset: so viele Einträge überspringen |
GET /v1/executions | limit (bis 200) | cursor: der next_cursor der vorigen Seite |
Läufe kommen neueste zuerst. Gib next_cursor genau so zurück, wie du ihn bekommen hast. Ist er null, bist du auf der letzten Seite.
curl -s "$SK_URL/v1/executions?workflow_id=<workflow-id>&status=failed,timed_out&limit=50" \
-H "Authorization: Bearer $SK_KEY"status nimmt mehrere Werte, durch Kommas getrennt.
So ist die API aufgebaut #
- Jede Route beginnt mit
/v1, zum Beispiel/v1/workflows. - Deinen API-Schlüssel schickst du im Header
Authorizationals Bearer-Token. - Anfragen und Antworten sind JSON.
/openapi.jsonbeschreibt jede Route, jedes Feld und jeden Statuscode im OpenAPI-Format./docszeigt dieselbe Beschreibung als durchsuchbare Referenz. Öffnehttps://<deine-engine>/docsim Browser.
Fehler und Statuscodes #
Fehler sind JSON mit einem maschinenlesbaren code und einer lesbaren message:
{
"code": "not_found",
"message": "workflow not found",
"trace_id": "<trace-id>"
}Manche Fehler ergänzen hint (was zu tun ist), details (zum Beispiel die ungültigen Felder) oder retry_after (Sekunden).
Verzweige in deinem Programm nach code, nicht nach message. Heb trace_id auf, wenn du ein Problem meldest.
| Status | code (Beispiele) | Bedeutung |
|---|---|---|
200 | Erledigt. | |
202 | Angenommen. Der Lauf geht im Hintergrund weiter. | |
400 | bad_request | Die Anfrage ist ungültig. details nennt die Felder. |
401 | unauthorized | Der Schlüssel fehlt, ist falsch, abgelaufen oder widerrufen. Prüfe Authorization: Bearer <api-key> oder leg einen neuen Schlüssel an. |
403 | forbidden | Dem Schlüssel fehlt ein Scope oder deiner Rolle die Berechtigung. Leg einen Schlüssel mit workflow:read, workflow:run und execution:read an. |
404 | not_found | Die ID gibt es in deinem Arbeitsbereich nicht. |
409 | conflict | Der aktuelle Zustand erlaubt es nicht. Bei einem Lauf: keine aktive Version, oder die Freigabe fehlt oder ist aufgebraucht. |
429 | rate_limit_exceeded, rate_limited | Ein Limit ist erreicht. Warte so lange, wie der Header Retry-After sagt, und versuch es dann mit demselben Idempotency-Key erneut. |
500 | internal_error | Ein Fehler in der Engine. Melde die trace_id. |
Wenn etwas nicht klappt #
| Was du siehst | Was du tust |
|---|---|
404 Not Found als reiner Text | Den Pfad gibt es nicht. Prüfe, ob er mit /v1 beginnt. |
400 mit request validation failed | Lies details. Oft ist workflow_id keine UUID, oder input passt nicht zum Eingabeschema. |
Der Lauf antwortet mit "hold_writes": true | Die Version hat für diese Umgebung keine Freigabe. Nichts wurde geschrieben. Gib sie frei wie in „Dein erster Workflow“ beschrieben. |
| Ein anderer Fehlerstatus | Schlag den Status unter „Fehler und Statuscodes“ nach und lies message und details. |