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

> Run-Dauer-Perzentile Ihrer Apps (p50 / p90 / p95 / p99 / max), optional nach App oder Version.

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

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

Ausführungsdauer für Ihre Apps: p50 / p90 / p95 / p99 / max von `finished_at - started_at` (Millisekunden) über einen begrenzten Bereich, optional aufgeschlüsselt nach App oder nach Version (langsamster p95 zuerst). Besitz, Reichweite und Filtersemantik stimmen mit ⟦2 überein⟧. Proben sind jeder fertige Lauf, der eine Startzeit hat (einschließlich Ausfälle und Stornierungen - die Verteilung beschreibt die Läufe selbst, nicht nur Erfolge). Perzentile sind `null`, wenn keine Stichproben vorhanden sind. Perzentile benötigen Laufdetails, daher sind beide Grenzen erforderlich und die Spanne muss höchstens 92 Tage betragen.

## Anfrage

### Abfrageparameter

<ParamField query="group_by" type="string">
  Optionale Einzeldimension: `data_app` nach App, `version` nach Version. Standard liefert nur Range-Totals.
</ParamField>

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

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

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

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

<ParamField query="include_test" type="boolean" default="False">
  Ob Autor-Debug-Runs einbezogen werden.
</ParamField>

### Beispielanfrage

```bash theme={null}
curl \
  -H "Authorization: Bearer $OCTOPARSE_API_KEY" \
  "https://api-datahub.octoparse.com/v1/publisher/usage/latency?created_from=2026-09-01T00:00:00Z&created_to=2026-09-15T00:00:00Z&group_by=data_app"
```

## Antwort

### 200 Erfolg

```json theme={null}
{
  "data": {
    "range": {
      "created_from": "2026-09-01T00:00:00Z",
      "created_to": "2026-09-15T00:00:00Z"
    },
    "totals": {
      "samples": 128,
      "p50_ms": 410,
      "p90_ms": 980,
      "p95_ms": 1420,
      "p99_ms": 3100,
      "max_ms": 5200
    },
    "group_by": "data_app",
    "groups": [
      {
        "namespace": "carol",
        "app_name": "reviews-query",
        "version": null,
        "samples": 128,
        "p50_ms": 410,
        "p90_ms": 980,
        "p95_ms": 1420,
        "p99_ms": 3100,
        "max_ms": 5200
      }
    ]
  }
}
```

Payload ist in `data` gewrappt. Felder:

<ResponseField name="range" type="object" required>
  Der tatsächlich verwendete Bereich.

  <Expandable title="fields">
    <ResponseField name="created_from" type="string">
      Tatsächlich angewendeter Beginn (inklusiv).
    </ResponseField>

    <ResponseField name="created_to" type="string">
      Tatsächlich angewendetes Ende (exklusiv).
    </ResponseField>

    <ResponseField name="tz_offset" type="integer">
      Nur vorhanden, wenn ein Tages-/Stunden-Offset greift; auf diesem Endpoint praktisch ungenutzt.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="totals" type="object" required>
  Range-Totals: `samples` und jedes Perzentil in Millisekunden.

  <Expandable title="fields">
    <ResponseField name="samples" type="integer">
      Anzahl der Stichproben.
    </ResponseField>

    <ResponseField name="p50_ms" type="integer">
      50. Perzentil der Dauer in Millisekunden. `null`, wenn keine Stichproben vorhanden sind.
    </ResponseField>

    <ResponseField name="p90_ms" type="integer">
      90. Perzentil der Dauer in Millisekunden.
    </ResponseField>

    <ResponseField name="p95_ms" type="integer">
      95. Perzentil der Dauer in Millisekunden.
    </ResponseField>

    <ResponseField name="p99_ms" type="integer">
      99. Perzentil der Dauer in Millisekunden.
    </ResponseField>

    <ResponseField name="max_ms" type="integer">
      Maximale Dauer in Millisekunden.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="group_by" type="string">
  Tatsächlich verwendete Dimension; weggelassen oder leer, wenn nur Summen geliefert werden.
</ResponseField>

<ResponseField name="groups" type="object[]">
  Gruppenzeilen mit denselben Kennzahlen plus Dimensionsschlüsseln.

  <Expandable title="fields">
    <ResponseField name="samples" type="integer">
      Anzahl der Stichproben in der Gruppe.
    </ResponseField>

    <ResponseField name="p50_ms" type="integer">
      50. Perzentil der Dauer in Millisekunden.
    </ResponseField>

    <ResponseField name="p90_ms" type="integer">
      90. Perzentil der Dauer in Millisekunden.
    </ResponseField>

    <ResponseField name="p95_ms" type="integer">
      95. Perzentil der Dauer in Millisekunden.
    </ResponseField>

    <ResponseField name="p99_ms" type="integer">
      99. Perzentil der Dauer in Millisekunden.
    </ResponseField>

    <ResponseField name="max_ms" type="integer">
      Maximale Dauer in Millisekunden.
    </ResponseField>

    <ResponseField name="namespace" type="string">
      Publisher-Benutzername bei Gruppierung nach App.
    </ResponseField>

    <ResponseField name="app_name" type="string">
      App-Name bei Gruppierung nach app.
    </ResponseField>

    <ResponseField name="version" type="string">
      Release-Version bei Gruppierung nach Version.
    </ResponseField>
  </Expandable>
</ResponseField>

### Fehler

| HTTP | `code`           | `category`      | Beschreibung                                                                                                           |
| ---- | ---------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------- |
| 401  | `unauthorized`   | `forbidden`     | Fehlender oder ungültiger API-Schlüssel.                                                                               |
| 400  | `range-too-wide` | `invalid_input` | Diese Dimension erfordert sowohl `created_from` als auch `created_to`, höchstens 92 Tage auseinander.                  |
| 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.
