> ## 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 실행 시간 백분위(p50/p90/p95/p99/max). 차원 내역 가능.

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

인증: API 키 필요(`Authorization: Bearer <API Key>`).

내 App의 실행 소요 시간: 제한된 기간 동안 `finished_at - started_at`(밀리초)의 p50 / p90 / p95 / p99 / 최댓값이며, App별 또는 버전별로 나눌 수 있습니다(p95가 느린 순). 소유권, 기간, 필터 의미는 <a href="/docs/ko/datahub/api/reference/publishing/get-publisher-usage">Publisher usage</a>와 같습니다. 샘플은 시작 시각이 있는 모든 종료된 실행입니다(실패와 취소 포함. 분포는 성공만이 아니라 실행 자체를 나타냅니다). 샘플이 없으면 백분위수는 `null`입니다. 백분위수에는 실행 상세가 필요하므로 시작과 끝 경계가 모두 필요하며 기간은 최대 92일입니다.

## 요청

### 쿼리 파라미터

<ParamField query="group_by" type="string">
  선택적 단일 차원: `data_app`은 App별, `version`은 버전별. 기본값은 기간 합계만 반환합니다.
</ParamField>

<ParamField query="data_app" type="string[]">
  이 App들로 제한합니다. 반복 지정 가능.
</ParamField>

<ParamField query="created_from" type="string">
  시작(포함). 필수.
</ParamField>

<ParamField query="created_to" type="string">
  끝(제외). 필수.
</ParamField>

<ParamField query="triggered_by" type="string">
  하나의 호출 채널로 제한합니다.
</ParamField>

<ParamField query="include_test" type="boolean" default="False">
  작성자의 디버그 실행을 포함할지 여부.
</ParamField>

### 요청 예시

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

## 응답

### 200 성공

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

페이로드는 `data`로 감쌉니다. 필드:

<ResponseField name="range" type="object" required>
  실제로 사용된 범위.

  <Expandable title="fields">
    <ResponseField name="created_from" type="string">
      실제로 적용된 시작(포함).
    </ResponseField>

    <ResponseField name="created_to" type="string">
      실제로 적용된 끝(제외).
    </ResponseField>

    <ResponseField name="tz_offset" type="integer">
      일/시간 오프셋이 적용될 때만 존재합니다. 이 엔드포인트에서는 실제로 사용되지 않습니다.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="totals" type="object" required>
  기간 합계: `samples`와 각 백분위수(밀리초).

  <Expandable title="fields">
    <ResponseField name="samples" type="integer">
      샘플 수.
    </ResponseField>

    <ResponseField name="p50_ms" type="integer">
      소요 시간의 50번째 백분위수(밀리초). 샘플이 없으면 `null`.
    </ResponseField>

    <ResponseField name="p90_ms" type="integer">
      소요 시간의 90번째 백분위수(밀리초).
    </ResponseField>

    <ResponseField name="p95_ms" type="integer">
      소요 시간의 95번째 백분위수(밀리초).
    </ResponseField>

    <ResponseField name="p99_ms" type="integer">
      소요 시간의 99번째 백분위수(밀리초).
    </ResponseField>

    <ResponseField name="max_ms" type="integer">
      최대 소요 시간(밀리초).
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="group_by" type="string">
  실제로 사용된 차원. 합계만 있을 때는 생략되거나 비어 있습니다.
</ResponseField>

<ResponseField name="groups" type="object[]">
  같은 지표와 차원 키를 가진 그룹 행.

  <Expandable title="fields">
    <ResponseField name="samples" type="integer">
      그룹 내 샘플 수.
    </ResponseField>

    <ResponseField name="p50_ms" type="integer">
      소요 시간의 50번째 백분위수(밀리초).
    </ResponseField>

    <ResponseField name="p90_ms" type="integer">
      소요 시간의 90번째 백분위수(밀리초).
    </ResponseField>

    <ResponseField name="p95_ms" type="integer">
      소요 시간의 95번째 백분위수(밀리초).
    </ResponseField>

    <ResponseField name="p99_ms" type="integer">
      소요 시간의 99번째 백분위수(밀리초).
    </ResponseField>

    <ResponseField name="max_ms" type="integer">
      최대 소요 시간(밀리초).
    </ResponseField>

    <ResponseField name="namespace" type="string">
      App별로 그룹화할 때의 게시자 사용자 이름.
    </ResponseField>

    <ResponseField name="app_name" type="string">
      App별로 그룹화할 때의 App 이름.
    </ResponseField>

    <ResponseField name="version" type="string">
      버전별로 그룹화할 때의 Release 버전.
    </ResponseField>
  </Expandable>
</ResponseField>

### 오류

| HTTP | `code`           | `category`      | 설명                                                                      |
| ---- | ---------------- | --------------- | ----------------------------------------------------------------------- |
| 401  | `unauthorized`   | `forbidden`     | API 키 누락 또는 무효.                                                         |
| 400  | `range-too-wide` | `invalid_input` | 이 차원에는 `created_from`과 `created_to`가 모두 필요하며, 간격은 최대 92일입니다.            |
| 404  | `app-not-found`  | `not_found`     | App이 존재하지 않거나, 이름이 변경되었거나, 현재 자격 증명으로는 보이지 않습니다(private / shared 범위 밖). |

오류 응답은 `{"error": {code, category, message, retryable}}`입니다. <a href="/docs/ko/datahub/api/reference/introduction#errors">오류</a> 참고.

## 클라이언트 라이브러리

Python / JavaScript SDK는 아직 이 엔드포인트를 감싸지 않습니다. REST를 직접 호출하세요.
