> ## 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.

# 発行者実行一覧

> 公開 App への全呼び出し。ホワイトリスト欄のみ — 入力・結果・呼び出し側識別子なし。

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

Authentication: API key required (`Authorization: Bearer <API Key>`).

Every call against apps you published, newest first. This is the detail surface behind publisher usage: the same ownership (apps you own, including zero-release apps), the same range predicates and filter values, so any aggregate number can drill into the runs it counted.

This is a **whitelist view**, not the caller’s run object: it tells you what happened (state, timestamps, records written back, error code and message, data fee the caller paid), but never who called, what they sent (no `input`), or what they got (no `dataset_id`, no records, no credential id). Callers still read through their own run list; a publisher cannot open the other party’s run with a `run_id` from here. Author debug runs are excluded by default; `status` accepts comma-separated multi-values.

## Request

### Query parameters

<ParamField query="data_app" type="string[]">
  Limit to these apps. Repeatable.
</ParamField>

<ParamField query="status" type="string">
  Run state. Comma-separated multi-value.
</ParamField>

<ParamField query="triggered_by" type="string">
  Limit to one call channel.
</ParamField>

<ParamField query="version" type="string">
  Limit to runs pinned to this release version.
</ParamField>

<ParamField query="error_code" type="string">
  Limit to runs whose error code equals this value (the `error_code` from publisher usage `group_by=error`).
</ParamField>

<ParamField query="run_kind" type="string" default="production">
  `production` (default) production traffic only; `test` your debug runs only; `all` both.
</ParamField>

<ParamField query="created_from" type="string">
  Inclusive start.
</ParamField>

<ParamField query="created_to" type="string">
  Exclusive end.
</ParamField>

<ParamField query="offset" type="integer" default="0">
  Pagination offset.

  Range ≥ 0.
</ParamField>

<ParamField query="limit" type="integer" default="50">
  Page size.

  Range 1 to 200.
</ParamField>

### Example request

```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"
```

## Response

### 200 success

```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"
  }
}
```

The payload is wrapped in `data`. Fields:

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

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

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

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

    <ResponseField name="app_version" type="string">
      Pinned release version.
    </ResponseField>

    <ResponseField name="build_id" type="string">
      Build snapshot a debug run was pinned to; `null` for production runs.
    </ResponseField>

    <ResponseField name="run_kind" type="string">
      Run kind (`production` / `test`, and so on).
    </ResponseField>

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

    <ResponseField name="partial" type="boolean">
      Whether the run partially succeeded or was cancelled with partial output.
    </ResponseField>

    <ResponseField name="triggered_by" type="string">
      Call channel.
    </ResponseField>

    <ResponseField name="created_at" type="string">
      Time the run was created.
    </ResponseField>

    <ResponseField name="started_at" type="string">
      Time execution started.
    </ResponseField>

    <ResponseField name="finished_at" type="string">
      Time execution finished.
    </ResponseField>

    <ResponseField name="duration_ms" type="integer">
      Execution duration in milliseconds.
    </ResponseField>

    <ResponseField name="records" type="integer">
      Records written back.
    </ResponseField>

    <ResponseField name="amount" type="number">
      Data fee paid by the caller.
    </ResponseField>

    <ResponseField name="error" type="object">
      Error object on failure.

      <Expandable title="fields">
        <ResponseField name="code" type="string" required>
          Stable error code.
        </ResponseField>

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

        <ResponseField name="message" type="string">
          Developer-facing message.
        </ResponseField>

        <ResponseField name="retryable" type="boolean">
          Whether a retry of the same request can succeed.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="pagination" type="object">
  Pagination info.

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

    <ResponseField name="limit" type="integer">
      Requested page size.
    </ResponseField>

    <ResponseField name="count" type="integer">
      Number of items in this page.
    </ResponseField>

    <ResponseField name="total" type="integer">
      Filtered total.
    </ResponseField>

    <ResponseField name="has_more" type="boolean">
      Whether more pages remain.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="currency" type="string">
  Currency for `amount`.
</ResponseField>

### Errors

| HTTP | `code`             | `category`      | Description                                                                                                  |
| ---- | ------------------ | --------------- | ------------------------------------------------------------------------------------------------------------ |
| 401  | `unauthorized`     | `forbidden`     | Missing or invalid API key.                                                                                  |
| 400  | `invalid-status`   | `invalid_input` | `status` contains a value outside the vocabulary.                                                            |
| 400  | `invalid-run-kind` | `invalid_input` | `run_kind` is not an allowed value.                                                                          |
| 404  | `app-not-found`    | `not_found`     | App does not exist, was renamed, or is invisible to the current credential (outside private / shared scope). |

Error responses use `{"error": {code, category, message, retryable}}`. See <a href="/docs/jp/datahub/api/reference/introduction#errors">Errors</a>.

## Client libraries

The Python and JavaScript SDKs do not wrap this endpoint yet. Call REST directly.
