# OnPage API 요약

**API:** Data API

**Endpoint:** `GET /v1/beta/dataforseo/on_page/summary/{id}`

**Tags:** DataForSEO

`id`로 크롤링 하나의 상태와 주요 지표를 조회합니다. `crawl_progress`, `crawl_status`, `crawl_gateway_address`, `crawl_stop_reason`, `domain_info`, `page_metrics`를 반환합니다. DataForSEO 응답 봉투로 감싸집니다. 데이터는 `tasks[0].result`, 처리 결과는 `tasks[0].status_code`에 있으며, 거부된 요청도 HTTP 200을 반환합니다. **크롤링 완료 여부도 이 엔드포인트로 확인합니다.** 여기서 다른 엔드포인트를 읽기 전에 `crawl_progress`가 `finished`가 될 때까지 폴링하세요. 그렇지 않으면 실제 결과처럼 보이는 부분 결과를 읽게 됩니다. 💰 업스트림 무료: 완료된 크롤링 조회에는 비용이 들지 않으며, 크롤링 자체에만 비용이 발생합니다.

### 가격 참고

- 과금 기준: 응답에 보고된 비용.
- 참고 요청 추정치: USD 0.012.
- 참고 고객 배수: 1.0. 정산된 고객 금액에 다시 적용하지 마세요.

참고용 메타데이터일 뿐이며, 계정 견적 또는 보장된 가격 또는 지출 한도가 아닙니다. 리소스 크레딧은 Felo 크레딧이 아닙니다. 최종 청구는 Felo 청구 기록을 따릅니다.

## Base URL

- `https://openapi.felo.ai`

## Authentication

- `FeloBearerAuth` (http bearer, bearer format Felo API Key)
- `FeloApiKey` (apiKey in header `X-API-Key`)

## Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `id` | path | yes | string | <em>작업 식별자</em><br><strong>필수 필드</strong><br>이 ID는 <a href="/v3/on_page/task_post/" target="_blank" rel="noopener noreferrer">Task POST</a> 엔드포인트의 응답에서 얻을 수 있습니다<br>예:<br>“07131248-1535-0216-1000-17384017ad04” |

## Responses

### 200 — 작업 성공

Headers:
- `X-Request-Id` (string) — Felo 지원팀에 문의할 때 포함할 요청 식별자입니다.

**application/json**

Schema: object | null

```json
{
  "type": [
    "object",
    "null"
  ],
  "oneOf": [
    {
      "$ref": "#/components/schemas/Response36Afe1097B20_OnPageSummaryResponseInfo"
    }
  ]
}
```

### 400 — 요청을 처리할 수 없습니다. 요청 매개변수를 확인하세요.

### 401 — 유효한 Felo API 키가 필요합니다.

### 402 — 청구 요건이 충족되지 않아 요청을 진행할 수 없습니다.

### 403 — 이 계정에는 이 작업을 수행할 권한이 없습니다.

### 429 — 요청 또는 지출 한도에 도달했습니다.

### 502 — 서비스가 요청을 완료할 수 없습니다.

### 503 — API 또는 청구 서비스를 일시적으로 사용할 수 없습니다.

### 504 — 요청을 처리하는 동안 서비스 시간이 초과되었습니다.

### default — 오류 응답. 업스트림 패스스루 응답은 공급자 형식을 사용할 수 있습니다.

**application/json**

Schema:

```json
{}
```

## Schema definitions

### Response36Afe1097B20_BaseResponseInfo

`#/components/schemas/Response36Afe1097B20_BaseResponseInfo`

```json
{
  "properties": {
    "version": {
      "type": [
        "string",
        "null"
      ],
      "description": "API의 현재 버전"
    },
    "status_code": {
      "type": [
        "integer",
        "null"
      ],
      "description": "일반 상태 코드입니다.\n응답 코드 전체 목록은 여기에서 확인할 수 있습니다."
    },
    "status_message": {
      "type": [
        "string",
        "null"
      ],
      "description": "일반 정보 메시지입니다.\n일반 정보 메시지 전체 목록은 여기에서 확인할 수 있습니다."
    },
    "time": {
      "type": [
        "string",
        "null"
      ],
      "description": "총 실행 시간(초)"
    },
    "cost": {
      "type": [
        "number",
        "null"
      ],
      "description": "전체 작업 비용, USD",
      "format": "double"
    },
    "tasks_count": {
      "type": [
        "integer",
        "null"
      ],
      "description": "tasks 배열의 작업 수",
      "format": "int64"
    },
    "tasks_error": {
      "type": [
        "integer",
        "null"
      ],
      "description": "오류와 함께 반환된 tasks 배열의 작업 수",
      "format": "int64"
    }
  }
}
```

### Response36Afe1097B20_BaseResponseTaskInfo

`#/components/schemas/Response36Afe1097B20_BaseResponseTaskInfo`

```json
{
  "properties": {
    "id": {
      "type": [
        "string",
        "null"
      ],
      "description": "작업 식별자\n시스템 내 고유 작업 식별자(UUID 형식)"
    },
    "status_code": {
      "type": [
        "integer",
        "null"
      ],
      "description": "작업의 상태 코드\nDataForSEO가 생성하며 10000-60000 범위일 수 있습니다.\n응답 코드 전체 목록은 여기에서 확인할 수 있습니다."
    },
    "status_message": {
      "type": [
        "string",
        "null"
      ],
      "description": "작업의 정보 메시지\n일반 정보 메시지 전체 목록은 여기에서 확인할 수 있습니다."
    },
    "time": {
      "type": [
        "string",
        "null"
      ],
      "description": "실행 시간, 초"
    },
    "cost": {
      "type": [
        "number",
        "null"
      ],
      "description": "전체 작업 비용, USD",
      "format": "double"
    },
    "result_count": {
      "type": [
        "integer",
        "null"
      ],
      "description": "result 배열의 요소 수",
      "format": "int64"
    },
    "path": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "description": "URL 경로"
    },
    "data": {
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": {
        "type": [
          "object",
          "null"
        ]
      },
      "description": "POST 요청에 지정한 것과 동일한 매개변수를 포함합니다"
    }
  }
}
```

### Response36Afe1097B20_CrawlStatusInfo

`#/components/schemas/Response36Afe1097B20_CrawlStatusInfo`

```json
{
  "type": "object",
  "properties": {
    "max_crawl_pages": {
      "type": [
        "integer",
        "null"
      ],
      "description": "크롤링할 최대 페이지 수\n작업을 설정할 때 지정한 max_crawl_pages 한도를 나타냅니다",
      "format": "int64"
    },
    "pages_in_queue": {
      "type": [
        "integer",
        "null"
      ],
      "description": "현재 크롤링 대기열에 있는 페이지 수",
      "format": "int64"
    },
    "pages_crawled": {
      "type": [
        "integer",
        "null"
      ],
      "description": "크롤링된 페이지 수",
      "format": "int64"
    }
  }
}
```

### Response36Afe1097B20_DomainInfo

`#/components/schemas/Response36Afe1097B20_DomainInfo`

```json
{
  "type": "object",
  "properties": {
    "name": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>도메인 이름</em>"
    },
    "cms": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>콘텐츠 관리 시스템</em><br>웹사이트에서 식별된 콘텐츠 관리 시스템<br><code>generator</code> 메타 태그의 콘텐츠<br>데이터는 200 응답 코드를 반환하는 첫 번째 무작위 페이지에서 가져옵니다<br>크롤러가 CMS를 식별할 수 없으면 값은 <code>null</code>입니다"
    },
    "ip": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>도메인 IP 주소</em>"
    },
    "server": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>웹사이트 서버</em><br>웹사이트에서 감지된 서버 버전<br><code class=\"prettyprint\">server</code> 헤더의 콘텐츠<br>정보는 응답 코드가 200인 첫 번째 페이지에서 가져옵니다"
    },
    "crawl_start": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>크롤링이 시작된 시간</em><br>웹사이트가 크롤링을 위해 전송된 날짜와 시간<br>UTC 형식: “yyyy-mm-dd hh-mm-ss +00:00”<br>예:<br><code class=\"long-string\">2019-11-15 12:57:46 +00:00</code>"
    },
    "crawl_end": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>크롤링이 종료된 시간</em><br>크롤링이 완료된 날짜와 시간<br>UTC 형식: “yyyy-mm-dd hh-mm-ss +00:00”<br>예:<br><code class=\"long-string\">2019-11-15 12:57:46 +00:00</code><br><strong>참고:</strong> <code>\"crawl_progress\"</code>가 <code>\"finished\"</code>인 경우에만 유효합니다<br><code>\"crawl_progress\"</code>가 <code>in_progress</code>이면 값은 <code>null</code>입니다"
    },
    "extended_crawl_status": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>크롤링 상태 및 오류</em><br>웹사이트가 크롤링되지 않은 이유를 나타냅니다;<br>가능한 값:<br><code>no_errors</code> - 크롤링 오류가 감지되지 않았습니다;<br><code>site_unreachable</code> - 크롤러가 웹사이트에 연결할 수 없어 상태 코드를 가져올 수 없었습니다;<br><code>invalid_page_status_code</code> - 처음 크롤링한 페이지의 상태 코드가 400 이상입니다;<br><code>forbidden_meta_tag</code> - 처음 크롤링한 페이지에 &lt;meta robots=\"noindex\"&gt; 태그가 있습니다;<br><code>forbidden_robots</code> - robots.txt가 페이지 크롤링을 금지합니다;<br><code>forbidden_http_header</code> - 페이지의 HTTP 헤더에 \"X-Robots-Tag: noindex\"가 있습니다;<br><code>too_many_redirects</code> - 처음 크롤링한 페이지의 리디렉션이 10개를 초과합니다;<br><code>unknown</code> - 이유를 알 수 없습니다"
    },
    "ssl_info": {
      "type": [
        "object",
        "null"
      ],
      "oneOf": [
        {
          "$ref": "#/components/schemas/Response36Afe1097B20_SslInfo"
        }
      ],
      "description": "<em>SSL 인증서 정보</em><br>웹사이트에서 감지된 Secure Sockets Layer 프로토콜에 관한 정보"
    },
    "checks": {
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": {
        "type": [
          "boolean",
          "null"
        ]
      },
      "description": "<em>웹사이트 검사</em><br>웹사이트와 관련된 기타 온페이지 검사"
    },
    "total_pages": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>총 크롤링 페이지 수</em><br>크롤링된 총 페이지 수",
      "format": "int64"
    },
    "total_uncrawlable_resources": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>크롤링할 수 없는 총 리소스 수</em><br>크롤링할 수 없었던 총 리소스 수;<br>리소스의 실제 콘텐츠 유형이 크롤러가 기대하는 콘텐츠 유형과 일치하지 않으면 크롤링할 수 없는 것으로 간주됩니다",
      "format": "int64"
    },
    "page_not_found_status_code": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>존재하지 않는 페이지에서 반환된 상태 코드</em><br>대부분의 경우 서버는 404 응답 코드를 반환하는 것이 권장됩니다"
    },
    "canonicalization_status_code": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>정규화된 페이지에서 반환된 상태 코드</em><br>크롤러가 IP를 통해 웹사이트에 액세스하려 할 때의 서버 동작 검사;<br>대부분의 경우 정규화된 페이지는 <code>301</code> 또는 <code>302</code> 상태 코드로 응답하는 것이 권장됩니다"
    },
    "directory_browsing_status_code": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>디렉터리에서 반환된 상태 코드</em><br>대상 웹사이트의 디렉터리 페이지에서 반환된 상태 코드<br>대부분의 경우 디렉터리는 <code>403</code> 또는 <code>401</code> 상태 코드로 응답하는 것이 권장됩니다"
    },
    "www_redirect_status_code": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>리디렉션 상태 코드</em><br>www에서 비www로의 리디렉션 상태 코드<br>대부분의 경우 리디렉션은 <code>301</code> 상태 코드를 반환하는 것이 권장됩니다"
    },
    "main_domain": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>루트 도메인 이름</em>"
    }
  }
}
```

### Response36Afe1097B20_OnPageSummaryResponseInfo

`#/components/schemas/Response36Afe1097B20_OnPageSummaryResponseInfo`

```json
{
  "type": "object",
  "allOf": [
    {
      "$ref": "#/components/schemas/Response36Afe1097B20_BaseResponseInfo"
    },
    {
      "type": "object",
      "properties": {
        "tasks": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": [
              "object",
              "null"
            ],
            "oneOf": [
              {
                "$ref": "#/components/schemas/Response36Afe1097B20_OnPageSummaryTaskInfo"
              }
            ]
          },
          "description": "<em>작업 배열</em>"
        }
      }
    }
  ]
}
```

### Response36Afe1097B20_OnPageSummaryResultInfo

`#/components/schemas/Response36Afe1097B20_OnPageSummaryResultInfo`

```json
{
  "type": "object",
  "properties": {
    "crawl_progress": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>크롤링 세션 상태</em><br>가능한 값: <code>in_progress</code>, <code>finished</code>"
    },
    "crawl_status": {
      "type": [
        "object",
        "null"
      ],
      "oneOf": [
        {
          "$ref": "#/components/schemas/Response36Afe1097B20_CrawlStatusInfo"
        }
      ],
      "description": "<em>크롤링 세션 세부 정보</em>"
    },
    "crawl_gateway_address": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>크롤러 IP 주소</em><br>현재 크롤링 세션을 시작하는 데 사용된 IP 주소를 표시합니다<br>크롤러가 사용하는 전체 IP 목록은 <a href=\"/v3/on_page/overview\" target=\"_blank\" rel=\"noopener noreferrer\">개요 섹션</a>에서 확인할 수 있습니다"
    },
    "crawl_stop_reason": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>크롤링이 중지된 이유</em><br>크롤링 프로세스가 중지된 이유에 대한 정보입니다;<br>가능한 값:<br><code>limit_exceeded</code> - <code>max_crawl_pages</code>에 설정된 한도를 초과했습니다;<br><code>empty_queue</code> - 대기열의 모든 URL이 크롤링되었습니다;<br><code>force_stopped</code> - <a href=\"/v3/on_page/force_stop\" target=\"_blank\" rel=\"noopener noreferrer\"> On Page API Force Stop</a> 기능을 사용하여 크롤링 프로세스가 중단되었습니다;<br><code>unexpected_exception</code> - <code>target</code>을 크롤링하는 중 내부 오류가 발생했습니다. 자세한 내용은 지원팀에 문의하세요"
    },
    "domain_info": {
      "type": [
        "object",
        "null"
      ],
      "oneOf": [
        {
          "$ref": "#/components/schemas/Response36Afe1097B20_DomainInfo"
        }
      ],
      "description": "<em>도메인 전체 정보</em><br>대상 도메인과 크롤링 프로세스에 대한 페이지 내 정보"
    },
    "page_metrics": {
      "type": [
        "object",
        "null"
      ],
      "oneOf": [
        {
          "$ref": "#/components/schemas/Response36Afe1097B20_PageMetrics"
        }
      ],
      "description": "<em>페이지별 정보</em><br>대상 웹사이트 페이지의 지표 정보"
    }
  }
}
```

### Response36Afe1097B20_OnPageSummaryTaskInfo

`#/components/schemas/Response36Afe1097B20_OnPageSummaryTaskInfo`

```json
{
  "type": "object",
  "allOf": [
    {
      "$ref": "#/components/schemas/Response36Afe1097B20_BaseResponseTaskInfo"
    },
    {
      "type": "object",
      "properties": {
        "result": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": [
              "object",
              "null"
            ],
            "oneOf": [
              {
                "$ref": "#/components/schemas/Response36Afe1097B20_OnPageSummaryResultInfo"
              }
            ]
          },
          "description": "<em>결과 배열</em>"
        }
      }
    }
  ]
}
```

### Response36Afe1097B20_PageMetrics

`#/components/schemas/Response36Afe1097B20_PageMetrics`

```json
{
  "type": "object",
  "properties": {
    "links_external": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>외부 링크 수</em><br>다른 웹사이트를 가리키는 링크 수"
    },
    "links_internal": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>내부 링크 수</em><br>대상 웹사이트 내 다른 페이지를 가리키는 링크 수"
    },
    "duplicate_title": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>중복 제목이 있는 페이지 수</em>"
    },
    "duplicate_description": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>중복 설명이 있는 페이지 수</em>"
    },
    "duplicate_content": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>중복 콘텐츠가 있는 페이지 수</em>"
    },
    "broken_links": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>깨진 링크 수</em><br>대상 웹사이트에서 크롤링된 모든 페이지의 깨진 링크 수"
    },
    "broken_resources": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>깨진 리소스 수</em><br>링크가 깨진 이미지 및 기타 리소스의 수"
    },
    "links_relation_conflict": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>대상 웹사이트에서 충돌 가능성이 있는 링크 수</em><br>예를 들어 <code>\"links_relation_conflict\": 2</code>이면 대상 웹사이트가 <code>rel=\"nofollow\"</code> 속성이 있는 내부 링크 <strong>와</strong> dofollow 링크를 통해 동일한 소스를 하나 이상 참조하고 있음을 의미합니다"
    },
    "redirect_loop": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>동일한 URL에서 시작하고 끝나는 리디렉션 체인 수</em><br>대상 URL이 원래 URL로 다시 리디렉션되는 리디렉션 체인 수"
    },
    "onpage_score": {
      "type": [
        "number",
        "null"
      ],
      "description": "<em>웹사이트가 100점 척도에서 얼마나 최적화되었는지 보여줍니다</em><br>이 필드는 감지된 중요한 페이지 내 문제와 경고를 고려하여 웹사이트가 얼마나 최적화되었는지 보여줍니다;<br><code>100</code>은 가능한 최고 점수로, 웹사이트에 중요한 페이지 내 문제와 주요 경고가 없음을 의미합니다;<br><strong>참고:</strong> 이 값은 크롤링된 페이지 수에 따라 달라집니다;<br>이 지표의 계산 방식에 대한 자세한 내용은 <a href=\"https://dataforseo.com/help-center/how-is-onpage-score-of-a-domain-calculated\" target=\"_blank\" rel=\"noopener noreferrer\">이 도움말 센터 문서</a>에서 확인하세요"
    },
    "non_indexable": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>색인 불가 페이지 수</em><br>robots.txt, HTTP 헤더 또는 메타 태그 설정에 의해 Google 및 기타 검색 엔진에서 색인되지 않도록 차단된 페이지 수;<br><a href=\"https://docs.dataforseo.com/v3/on_page/non_indexable/?bash\" target=\"_blank\" rel=\"noopener noreferrer\">이 엔드포인트</a>를 사용하여 색인 불가 URL 목록을 받을 수 있습니다"
    },
    "checks": {
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": {
        "type": [
          "integer",
          "null"
        ],
        "format": "int64"
      },
      "description": "<em>페이지별 페이지 내 점검</em>"
    }
  }
}
```

### Response36Afe1097B20_SslInfo

`#/components/schemas/Response36Afe1097B20_SslInfo`

```json
{
  "type": "object",
  "properties": {
    "valid_certificate": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "<em>SSL 인증서 유효성</em><br>웹사이트에서 감지된 SSL 인증서가 만료, 일시 중단, 폐기 또는 무효 상태가 아닌지 나타냅니다"
    },
    "certificate_issuer": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>SSL 인증서 발급 기관</em><br>감지된 SSL 인증서를 발급한 주체"
    },
    "certificate_subject": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>SSL 인증서 주체</em><br>공개 키와 연결된 주체"
    },
    "certificate_version": {
      "type": [
        "integer",
        "null"
      ],
      "description": "<em>SSL 인증서 버전</em><br>SSL 인증서에 사용된 <a href=\"https://en.wikipedia.org/wiki/X.509\" target=\"_blank\" rel=\"noopener noreferrer\">X.509</a> 버전을 나타냅니다"
    },
    "certificate_hash": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>SSL 인증서 해시</em><br>SSL 인증서 해시 함수의 버전"
    },
    "certificate_expiration_date": {
      "type": [
        "string",
        "null"
      ],
      "description": "<em>SSL 인증서 만료일</em><br>SSL 인증서가 만료되는 날짜와 시간<br>UTC 형식: “yyyy-mm-dd hh-mm-ss +00:00”<br>예:<br><code class=\"long-string\">2019-11-15 12:57:46 +00:00</code>"
    }
  }
}
```
