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

# Elenca run publisher

> Ogni chiamata contro app che hai pubblicato. Solo campi whitelist — niente input, risultati o identity caller.

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

Autenticazione: API key obbligatoria (`Authorization: Bearer <API Key>`).

Ogni chiamata contro app che hai pubblicato, dalla più recente. È la superficie di dettaglio dietro usage publisher: stessa ownership (app che possiedi, incluse zero-release), stessi predicati di range e filtri, così ogni numero aggregato può fare drill-down nelle run contate.

Questa è una \*\* visualizzazione whitelist \*\*, non l'oggetto run del chiamante: ti dice cosa è successo (stato, timestamp, record scritti, codice di errore e messaggio, tariffa dati pagata dal chiamante), ma mai chi ha chiamato, cosa ha inviato (no `input`) o cosa ha ottenuto (no `dataset_id`, no record, no ID credenziale). I chiamanti leggono ancora la propria run list; un editore non può aprire la run dell'altra parte con un `run_id` da qui. Le esecuzioni di debug dell'autore sono escluse per impostazione predefinita; `status` accetta valori multipli separati da virgola.

## Richiesta

### Parametri di query

<ParamField query="data_app" type="string[]">
  Limita a queste app. Ripetibile.
</ParamField>

<ParamField query="status" type="string">
  Stato run. Multi-valore separato da virgole.
</ParamField>

<ParamField query="triggered_by" type="string">
  Limita a un canale di chiamata.
</ParamField>

<ParamField query="version" type="string">
  Limita alle run pinnate a questa versione release.
</ParamField>

<ParamField query="error_code" type="string">
  Limita alle run il cui codice errore è uguale a questo valore (`error_code` da usage publisher `group_by=error`).
</ParamField>

<ParamField query="run_kind" type="string" default="production">
  `production` (default) solo traffico production; `test` solo le tue run di debug; `all` entrambi.
</ParamField>

<ParamField query="created_from" type="string">
  Inizio inclusivo.
</ParamField>

<ParamField query="created_to" type="string">
  Fine esclusiva.
</ParamField>

<ParamField query="offset" type="integer" default="0">
  Offset di paginazione.

  Intervallo ≥ 0.
</ParamField>

<ParamField query="limit" type="integer" default="50">
  Dimensione pagina.

  Intervallo da 1 a 200.
</ParamField>

### Esempio di richiesta

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

## Risposta

### 200 successo

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

Il payload è wrappato in `data`. Campi:

<ResponseField name="items" type="object[]" required>
  Elenco dei run.

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

    <ResponseField name="namespace" type="string">
      Username del publisher.
    </ResponseField>

    <ResponseField name="app_name" type="string">
      Nome dell'app.
    </ResponseField>

    <ResponseField name="app_version" type="string">
      Versione release pinnata.
    </ResponseField>

    <ResponseField name="build_id" type="string">
      Snapshot di build a cui era pinnata una run di debug; `null` per run production.
    </ResponseField>

    <ResponseField name="run_kind" type="string">
      Kind run (`production` / `test`, ecc.).
    </ResponseField>

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

    <ResponseField name="partial" type="boolean">
      Se il run è riuscito parzialmente o è stato annullato con un output parziale.
    </ResponseField>

    <ResponseField name="triggered_by" type="string">
      Canale di chiamata.
    </ResponseField>

    <ResponseField name="created_at" type="string">
      Ora di creazione della run.
    </ResponseField>

    <ResponseField name="started_at" type="string">
      Ora di inizio esecuzione.
    </ResponseField>

    <ResponseField name="finished_at" type="string">
      Ora di fine esecuzione.
    </ResponseField>

    <ResponseField name="duration_ms" type="integer">
      Durata esecuzione in millisecondi.
    </ResponseField>

    <ResponseField name="records" type="integer">
      Record scritti indietro.
    </ResponseField>

    <ResponseField name="amount" type="number">
      Data fee pagata dal caller.
    </ResponseField>

    <ResponseField name="error" type="object">
      Oggetto errore in caso di fallimento.

      <Expandable title="fields">
        <ResponseField name="code" type="string" required>
          Codice di errore stabile.
        </ResponseField>

        <ResponseField name="category" type="string">
          Categoria errore.
        </ResponseField>

        <ResponseField name="message" type="string">
          Messaggio per sviluppatori.
        </ResponseField>

        <ResponseField name="retryable" type="boolean">
          Se un retry della stessa request può riuscire.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="pagination" type="object">
  Informazioni di paginazione.

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

    <ResponseField name="limit" type="integer">
      Dimensione pagina richiesta.
    </ResponseField>

    <ResponseField name="count" type="integer">
      Numero di elementi in questa pagina.
    </ResponseField>

    <ResponseField name="total" type="integer">
      Totale filtrato.
    </ResponseField>

    <ResponseField name="has_more" type="boolean">
      Se restano altre pagine.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="currency" type="string">
  Valuta per `amount`.
</ResponseField>

### Errori

| HTTP | `code`             | `category`      | Descrizione                                                                                                 |
| ---- | ------------------ | --------------- | ----------------------------------------------------------------------------------------------------------- |
| 401  | `unauthorized`     | `forbidden`     | API key mancante o non valida.                                                                              |
| 400  | `invalid-status`   | `invalid_input` | `status` contiene un valore fuori dal vocabolario.                                                          |
| 400  | `invalid-run-kind` | `invalid_input` | `run_kind` non è un valore consentito.                                                                      |
| 404  | `app-not-found`    | `not_found`     | L’app non esiste, è stata rinominata o è invisibile alla credenziale corrente (fuori scope private/shared). |

Le risposte di errore usano `{"error": {code, category, message, retryable}}`. Vedi <a href="/docs/it/datahub/api/reference/introduction#errors">Errori</a>.

## Librerie client

Gli SDK Python e JavaScript non wrappano ancora questo endpoint. Chiama REST direttamente.
