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

# Latence éditeur

> Percentiles de durée d’exécution de vos apps (p50 / p90 / p95 / p99 / max), optionnellement par app ou version.

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

Authentification : clé API requise (`Authorization: Bearer <API Key>`).

Durée d’exécution de vos apps : p50 / p90 / p95 / p99 / max de `finished_at - started_at` (millisecondes) sur une plage bornée, optionnellement ventilée par app ou version (p95 le plus lent d’abord). Propriété, plage et filtres suivent <a href="/docs/fr/datahub/api/reference/publishing/get-publisher-usage">Usage éditeur</a>. Les échantillons sont chaque exécution terminée avec heure de début (échecs et annulations inclus — la distribution décrit les exécutions elles-mêmes, pas seulement les succès). Les percentiles sont `null` sans échantillons. Les percentiles ont besoin des détails d’exécution, donc les deux bornes sont requises et l’écart doit être d’au plus 92 jours.

## Requête

### Paramètres de requête

<ParamField query="group_by" type="string">
  Dimension unique optionnelle : `data_app` par app, `version` par version. Par défaut totaux de plage seulement.
</ParamField>

<ParamField query="data_app" type="string[]">
  Limiter à ces apps. Répétable.
</ParamField>

<ParamField query="created_from" type="string">
  Début inclusif. Obligatoire.
</ParamField>

<ParamField query="created_to" type="string">
  Fin exclusive. Obligatoire.
</ParamField>

<ParamField query="triggered_by" type="string">
  Limiter à un canal d’appel.
</ParamField>

<ParamField query="include_test" type="boolean" default="False">
  S’il faut inclure les exécutions de débogage auteur.
</ParamField>

### Exemple de requête

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

## Réponse

### 200 succès

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

La charge utile est encapsulée dans `data`. Champs :

<ResponseField name="range" type="object" required>
  La plage réellement utilisée.

  <Expandable title="champs">
    <ResponseField name="created_from" type="string">
      Début inclusif réellement appliqué.
    </ResponseField>

    <ResponseField name="created_to" type="string">
      Fin exclusive réellement appliquée.
    </ResponseField>

    <ResponseField name="tz_offset" type="integer">
      Présent seulement si un offset jour/heure s’applique ; inutilisé en pratique sur cet endpoint.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="totals" type="object" required>
  Totaux de plage : `samples` et chaque percentile en millisecondes.

  <Expandable title="champs">
    <ResponseField name="samples" type="integer">
      Nombre d’échantillons.
    </ResponseField>

    <ResponseField name="p50_ms" type="integer">
      50e percentile de durée en millisecondes. `null` s’il n’y a pas d’échantillons.
    </ResponseField>

    <ResponseField name="p90_ms" type="integer">
      90e percentile de durée en millisecondes.
    </ResponseField>

    <ResponseField name="p95_ms" type="integer">
      95e percentile de durée en millisecondes.
    </ResponseField>

    <ResponseField name="p99_ms" type="integer">
      99e percentile de durée en millisecondes.
    </ResponseField>

    <ResponseField name="max_ms" type="integer">
      Durée maximale en millisecondes.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="group_by" type="string">
  Dimension réellement utilisée, ou omise/vide pour totaux seuls.
</ResponseField>

<ResponseField name="groups" type="object[]">
  Lignes de groupe avec les mêmes métriques plus les clés de dimension.

  <Expandable title="champs">
    <ResponseField name="samples" type="integer">
      Nombre d’échantillons dans le groupe.
    </ResponseField>

    <ResponseField name="p50_ms" type="integer">
      50e percentile de durée en millisecondes.
    </ResponseField>

    <ResponseField name="p90_ms" type="integer">
      90e percentile de durée en millisecondes.
    </ResponseField>

    <ResponseField name="p95_ms" type="integer">
      95e percentile de durée en millisecondes.
    </ResponseField>

    <ResponseField name="p99_ms" type="integer">
      99e percentile de durée en millisecondes.
    </ResponseField>

    <ResponseField name="max_ms" type="integer">
      Durée maximale en millisecondes.
    </ResponseField>

    <ResponseField name="namespace" type="string">
      Nom d’utilisateur éditeur en regroupement par app.
    </ResponseField>

    <ResponseField name="app_name" type="string">
      Nom de l’app en regroupement par app.
    </ResponseField>

    <ResponseField name="version" type="string">
      Version de release en regroupement par version.
    </ResponseField>
  </Expandable>
</ResponseField>

### Erreurs

| HTTP | `code`           | `category`      | Description                                                                                                     |
| ---- | ---------------- | --------------- | --------------------------------------------------------------------------------------------------------------- |
| 401  | `unauthorized`   | `forbidden`     | Clé API manquante ou invalide.                                                                                  |
| 400  | `range-too-wide` | `invalid_input` | Cette dimension exige `created_from` et `created_to`, au plus 92 jours d’écart.                                 |
| 404  | `app-not-found`  | `not_found`     | L’app n’existe pas, a été renommée, ou est invisible pour la credential actuelle (hors portée privée/partagée). |

Les réponses d’erreur utilisent `{"error": {code, category, message, retryable}}`. Voir <a href="/docs/fr/datahub/api/reference/introduction#errors">Erreurs</a>.

## Bibliothèques clientes

Les SDK Python et JavaScript n’encapsulent pas encore cet endpoint. Appelez REST directement.
