> ## Documentation Index
> Fetch the complete documentation index at: https://www.octoparse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Publisher-Runs listen

> Jeder Call gegen Apps, die Sie published haben. Nur Whitelist-Felder — kein Input, keine Results, keine Caller-Identity.

**`GET`** `https://api-datahub.octoparse.com/v1/publisher/runs`

Authentifizierung: API-Schlüssel erforderlich (`Authorization: Bearer <API Key>`).

Jeder Call gegen Apps, die Sie veröffentlicht haben, neueste zuerst. Das ist die Detail-Oberfläche hinter Publisher-Nutzung: dieselbe Ownership (Apps in Ihrem Besitz, inkl. Zero-Release-Apps), dieselben Range-Prädikate und Filterwerte — jedes Aggregat kann in die gezählten Runs drill-downen.

Dies ist eine **Whitelist-Ansicht**, nicht das Run-Objekt des Aufrufers: Sie zeigt, was passiert ist (Status, Zeitstempel, zurückgeschriebene Datensätze, Fehlercode und -meldung, vom Aufrufer bezahlte Datengebühr), aber niemals, wer aufgerufen hat, was gesendet wurde (kein `input`) oder was zurückkam (keine `dataset_id`, keine Datensätze, keine Credential-ID). Aufrufer lesen weiterhin über ihre eigene Run-Liste; ein Publisher kann den Run der Gegenseite nicht mit einer `run_id` von hier öffnen. Debug-Runs des Autors sind standardmäßig ausgeschlossen; `status` akzeptiert kommagetrennte Mehrfachwerte.

## Anfrage

### Abfrageparameter

<ParamField query="data_app" type="string[]">
  Auf diese Apps beschränken. Wiederholbar.
</ParamField>

<ParamField query="status" type="string">
  Run-Status. Kommagetrennte Mehrfachwerte.
</ParamField>

<ParamField query="triggered_by" type="string">
  Auf einen Aufrufkanal begrenzen.
</ParamField>

<ParamField query="version" type="string">
  Auf Runs pinnen, die an diese Release-Version gebunden sind.
</ParamField>

<ParamField query="error_code" type="string">
  Auf Runs begrenzen, deren Fehlercode diesem Wert entspricht (`error_code` aus Publisher-Nutzung `group_by=error`).
</ParamField>

<ParamField query="run_kind" type="string" default="production">
  `production` (Standard) nur Production-Traffic; `test` nur Ihre Debug-Runs; `all` beides.
</ParamField>

<ParamField query="created_from" type="string">
  Inklusiver Start.
</ParamField>

<ParamField query="created_to" type="string">
  Exklusives Ende.
</ParamField>

<ParamField query="offset" type="integer" default="0">
  Paginierungs-Offset.

  Bereich ≥ 0.
</ParamField>

<ParamField query="limit" type="integer" default="50">
  Seitengröße.

  Bereich 1 bis 200.
</ParamField>

### Beispielanfrage

```bash theme={null}
curl \
  -H "Authorization: Bearer $OCTOPARSE_API_KEY" \
  "https://api-datahub.octoparse.com/v1/publisher/runs?data_app=carol/reviews-query&status=FAILED&limit=50"
```

## Antwort

### 200 Erfolg

```json theme={null}
{
  "data": {
    "items": [
      {
        "run_id": "run_3b750088f51c",
        "namespace": "carol",
        "app_name": "probe-b",
        "app_version": "0.1.0",
        "build_id": null,
        "run_kind": "production",
        "state": "SUCCEEDED",
        "partial": false,
        "triggered_by": "api",
        "created_at": "2026-09-15T07:45:41.876601+00:00",
        "started_at": "2026-09-15T07:45:41.883082+00:00",
        "finished_at": "2026-09-15T07:45:42.326823+00:00",
        "duration_ms": 443,
        "records": 20,
        "amount": 0.02,
        "error": null
      },
      "…"
    ],
    "pagination": {
      "offset": 0,
      "limit": 2,
      "count": 2,
      "total": 2,
      "has_more": false
    },
    "currency": "CNY"
  }
}
```

Payload ist in `data` gewrappt. Felder:

<ResponseField name="items" type="object[]" required>
  Run-Liste.

  <Expandable title="fields">
    <ResponseField name="run_id" type="string" required>
      Run-ID.
    </ResponseField>

    <ResponseField name="namespace" type="string">
      Publisher-Benutzername.
    </ResponseField>

    <ResponseField name="app_name" type="string">
      App-Name.
    </ResponseField>

    <ResponseField name="app_version" type="string">
      Gepinnte Release-Version.
    </ResponseField>

    <ResponseField name="build_id" type="string">
      Build-Snapshot, auf den ein Debug-Run gepinnt war; `null` bei Production-Runs.
    </ResponseField>

    <ResponseField name="run_kind" type="string">
      Run-Kind (`production` / `test` usw.).
    </ResponseField>

    <ResponseField name="state" type="enum" required>
      Run-Status. Werte: `PENDING` / `QUEUED` / `RUNNING` / `SUCCEEDED` / `PARTIALLY_SUCCEEDED` / `FAILED` / `CANCELLED` / `EXPIRED`.
    </ResponseField>

    <ResponseField name="partial" type="boolean">
      Ob der Run teilweise erfolgreich war oder mit Teilergebnissen abgebrochen wurde.
    </ResponseField>

    <ResponseField name="triggered_by" type="string">
      Aufrufkanal.
    </ResponseField>

    <ResponseField name="created_at" type="string">
      Zeitpunkt der Run-Erstellung.
    </ResponseField>

    <ResponseField name="started_at" type="string">
      Startzeit der Ausführung.
    </ResponseField>

    <ResponseField name="finished_at" type="string">
      Endzeit der Ausführung.
    </ResponseField>

    <ResponseField name="duration_ms" type="integer">
      Ausführungsdauer in Millisekunden.
    </ResponseField>

    <ResponseField name="records" type="integer">
      Zurückgeschriebene Datensätze.
    </ResponseField>

    <ResponseField name="amount" type="number">
      Vom Caller gezahlte Datengebühr.
    </ResponseField>

    <ResponseField name="error" type="object">
      Fehlerobjekt bei einem Fehlschlag.

      <Expandable title="fields">
        <ResponseField name="code" type="string" required>
          Stabiler Fehlercode.
        </ResponseField>

        <ResponseField name="category" type="string">
          Fehlerkategorie.
        </ResponseField>

        <ResponseField name="message" type="string">
          Entwicklerseitige Meldung.
        </ResponseField>

        <ResponseField name="retryable" type="boolean">
          Ob ein Retry derselben Anfrage erfolgreich sein kann.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="pagination" type="object">
  Paginierungsinformationen.

  <Expandable title="fields">
    <ResponseField name="offset" type="integer">
      Angefragter Offset.
    </ResponseField>

    <ResponseField name="limit" type="integer">
      Angeforderte Seitengröße.
    </ResponseField>

    <ResponseField name="count" type="integer">
      Anzahl der Einträge auf dieser Seite.
    </ResponseField>

    <ResponseField name="total" type="integer">
      Gefilterte Gesamtzahl.
    </ResponseField>

    <ResponseField name="has_more" type="boolean">
      Ob weitere Seiten vorhanden sind.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="currency" type="string">
  Währung für `amount`.
</ResponseField>

### Fehler

| HTTP | `code`             | `category`      | Beschreibung                                                                                                           |
| ---- | ------------------ | --------------- | ---------------------------------------------------------------------------------------------------------------------- |
| 401  | `unauthorized`     | `forbidden`     | Fehlender oder ungültiger API-Schlüssel.                                                                               |
| 400  | `invalid-status`   | `invalid_input` | `status` enthält einen Wert außerhalb des Vokabulars.                                                                  |
| 400  | `invalid-run-kind` | `invalid_input` | `run_kind` ist kein erlaubter Wert.                                                                                    |
| 404  | `app-not-found`    | `not_found`     | App existiert nicht, wurde umbenannt oder ist für die aktuelle Credential unsichtbar (außerhalb private/shared Scope). |

Fehlerantworten nutzen `{"error": {code, category, message, retryable}}`. Siehe <a href="/docs/de/datahub/api/reference/introduction#errors">Fehler</a>.

## Client-Bibliotheken

Die Python- und JavaScript-SDKs wrappen diesen Endpoint noch nicht. REST direkt aufrufen.
