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

# Latencia del publicador

> Percentiles de duración de ejecución de sus apps (p50 / p90 / p95 / p99 / max), opcionalmente por app o versión.

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

Autenticación: se requiere API key (`Authorization: Bearer <API Key>`).

Duración de ejecución de sus apps: p50 / p90 / p95 / p99 / max de `finished_at - started_at` (milisegundos) en un rango acotado, opcionalmente desglosado por app o por versión (el p95 más lento primero). Propiedad, rango y filtros coinciden con <a href="/docs/es/datahub/api/reference/publishing/get-publisher-usage">Uso del publicador</a>. Las muestras son cada ejecución terminada con hora de inicio (incluidos fallos y cancelaciones: la distribución describe las ejecuciones en sí, no solo los éxitos). Los percentiles son `null` sin muestras. Los percentiles necesitan detalles de ejecución, así que ambos límites son obligatorios y el tramo debe ser de como máximo 92 días.

## Solicitud

### Parámetros de consulta

<ParamField query="group_by" type="string">
  Dimensión única opcional: `data_app` por app, `version` por versión. Por defecto solo totales del rango.
</ParamField>

<ParamField query="data_app" type="string[]">
  Limitar a estas apps. Repetible.
</ParamField>

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

<ParamField query="created_to" type="string">
  Fin exclusivo. Obligatorio.
</ParamField>

<ParamField query="triggered_by" type="string">
  Limitar a un canal de llamada.
</ParamField>

<ParamField query="include_test" type="boolean" default="False">
  Si incluir ejecuciones de depuración del autor.
</ParamField>

### Ejemplo de solicitud

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

## Respuesta

### 200 correcto

```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 carga útil va envuelta en `data`. Campos:

<ResponseField name="range" type="object" required>
  El rango realmente usado.

  <Expandable title="campos">
    <ResponseField name="created_from" type="string">
      Inicio inclusivo realmente aplicado.
    </ResponseField>

    <ResponseField name="created_to" type="string">
      Fin exclusivo realmente aplicado.
    </ResponseField>

    <ResponseField name="tz_offset" type="integer">
      Solo cuando aplica un offset día/hora; en la práctica no se usa en este endpoint.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="totals" type="object" required>
  Totales del rango: `samples` y cada percentil en milisegundos.

  <Expandable title="campos">
    <ResponseField name="samples" type="integer">
      Recuento de muestras.
    </ResponseField>

    <ResponseField name="p50_ms" type="integer">
      Percentil 50 de duración en milisegundos. `null` si no hay muestras.
    </ResponseField>

    <ResponseField name="p90_ms" type="integer">
      Percentil 90 de duración en milisegundos.
    </ResponseField>

    <ResponseField name="p95_ms" type="integer">
      Percentil 95 de duración en milisegundos.
    </ResponseField>

    <ResponseField name="p99_ms" type="integer">
      Percentil 99 de duración en milisegundos.
    </ResponseField>

    <ResponseField name="max_ms" type="integer">
      Duración máxima en milisegundos.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="group_by" type="string">
  Dimensión realmente usada, u omitida/vacía si solo hay totales.
</ResponseField>

<ResponseField name="groups" type="object[]">
  Filas de grupo con las mismas métricas más claves de dimensión.

  <Expandable title="campos">
    <ResponseField name="samples" type="integer">
      Recuento de muestras del grupo.
    </ResponseField>

    <ResponseField name="p50_ms" type="integer">
      Percentil 50 de duración en milisegundos.
    </ResponseField>

    <ResponseField name="p90_ms" type="integer">
      Percentil 90 de duración en milisegundos.
    </ResponseField>

    <ResponseField name="p95_ms" type="integer">
      Percentil 95 de duración en milisegundos.
    </ResponseField>

    <ResponseField name="p99_ms" type="integer">
      Percentil 99 de duración en milisegundos.
    </ResponseField>

    <ResponseField name="max_ms" type="integer">
      Duración máxima en milisegundos.
    </ResponseField>

    <ResponseField name="namespace" type="string">
      Nombre de usuario del publicador al agrupar por app.
    </ResponseField>

    <ResponseField name="app_name" type="string">
      Nombre de la app al agrupar por app.
    </ResponseField>

    <ResponseField name="version" type="string">
      Versión de release al agrupar por versión.
    </ResponseField>
  </Expandable>
</ResponseField>

### Errores

| HTTP | `code`           | `category`      | Descripción                                                                                                    |
| ---- | ---------------- | --------------- | -------------------------------------------------------------------------------------------------------------- |
| 401  | `unauthorized`   | `forbidden`     | API key ausente o no válida.                                                                                   |
| 400  | `range-too-wide` | `invalid_input` | Esta dimensión exige `created_from` y `created_to`, a lo sumo 92 días de distancia.                            |
| 404  | `app-not-found`  | `not_found`     | La app no existe, se renombró o es invisible para la credencial actual (fuera del alcance privado/compartido). |

Las respuestas de error usan `{"error": {code, category, message, retryable}}`. Véase <a href="/docs/es/datahub/api/reference/introduction#errors">Errores</a>.

## Bibliotecas cliente

Los SDK de Python y JavaScript aún no encapsulan este endpoint. Llame a REST directamente.
