# Сводка 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`, прежде чем читать любой другой эндпоинт здесь, иначе вы прочитаете частичные результаты, похожие на настоящие. 💰 Бесплатно на стороне upstream: запрос к завершённому обходу ничего не стоит, платить нужно только за сам обход.

### Справочные цены

- Тарификация: стоимость ответа по данным провайдера.
- Справочная оценка запроса: 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 — Требуется действительный API-ключ Felo.

### 402 — Запрос не может быть выполнен: не выполнено требование биллинга.

### 403 — Аккаунту не разрешено выполнять эту операцию.

### 429 — Достигнут лимит запросов или расходов.

### 502 — Сервис не смог выполнить запрос.

### 503 — API или сервис биллинга временно недоступны.

### 504 — Истекло время ожидания обработки запроса.

### default — Ответ с ошибкой; сквозные ответы upstream могут использовать форматы провайдера

**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": "код состояния задачи\nформируется DataForSEO, может находиться в диапазоне 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>информация OnPage о целевом домене и процессе сканирования"
    },
    "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>количество страниц, которые Google и другие поисковые системы не индексируют из-за настроек robots.txt, HTTP-заголовков или метатегов;<br>список URL, недоступных для индексации, можно получить с помощью <a href=\"https://docs.dataforseo.com/v3/on_page/non_indexable/?bash\" target=\"_blank\" rel=\"noopener noreferrer\">этого эндпоинта</a>"
    },
    "checks": {
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": {
        "type": [
          "integer",
          "null"
        ],
        "format": "int64"
      },
      "description": "<em>проверки OnPage по отдельным страницам</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>указывает версию <a href=\"https://en.wikipedia.org/wiki/X.509\" target=\"_blank\" rel=\"noopener noreferrer\">X.509</a>, используемую SSL-сертификатом"
    },
    "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>"
    }
  }
}
```
