# Несколько надстроек сразу

> Как складывается счёт, в каком порядке всё собирается и что делает include=all

Источник: https://docs.parreq.com/fetch-combined/

Отдельных «комбинированных» надстроек нет: перечислите нужные, счёт сложится
сам. Ниже — реальные суммы, а не примерные.

## Что сколько стоит вместе

| заказ | кредитов | разбивка |
|---|---|---|
| только разметка | 1 | `html` 1 |
| `include=css` | 2 | `html` 1 + `css` 1 |
| `include=iframe` | 2 | `html` 1 + `iframe` 1 |
| `include=js` | 3 | `html` 1 + `js` 2 |
| `include=network` | 3 | `html` 1 + `network` 2 |
| `include=js,css` | 4 | `html` 1 + `js` 2 + `css` 1 |
| `include=screenshot` | 5 | `html` 1 + `screenshot` 4 |
| `headless=false` | 7 | `html` 1 + `headful` 6 |
| `include=all` | 11 | всё содержимое, без окна |
| `include=all` + `headless=false` | 17 | всё сразу |

`include=all` включает пять надстроек содержимого — `js`, `css`, `network`,
`screenshot`, `iframe`. Браузер с окном в `all` не входит: это режим сбора, а не
содержимое ответа.

## JS и CSS вместе

```python Python
from parreq import Parreq

client = Parreq("pr_ВАШКЛЮЧ")
res = client.fetch("https://developer.mozilla.org/en-US/", include=["js", "css"])
print(res.metadata["credits_breakdown"])   # {'html': 1, 'js': 2, 'css': 1}
```

```javascript Node

const client = new Parreq({ apiKey: "pr_ВАШКЛЮЧ" });
const res = await client.fetch({
  url: "https://developer.mozilla.org/en-US/",
  include: ["js", "css"],
});
console.log(res.metadata.credits_breakdown);
```

```bash cURL
curl -H "Authorization: Bearer pr_ВАШКЛЮЧ" \
  "https://api.parreq.com/v1/fetch?url=https://developer.mozilla.org/en-US/&include=js,css"
```

## Всё сразу

```python Python
res = client.fetch(
    "https://developer.mozilla.org/en-US/",
    include="all",
    network_ms=1500,
    text=True,
)

print(res.metadata["credits"], res.metadata["credits_breakdown"])
print(len(res.js), len(res.css), len(res.network))
print(res.screenshot_url, res.iframe_url)
```

```javascript Node
const res = await client.fetch({
  url: "https://developer.mozilla.org/en-US/",
  include: "all",
  networkMs: 1500,
  text: true,
});

console.log(res.metadata.credits, res.metadata.credits_breakdown);
console.log(res.js.length, res.css.length, res.network.length);
console.log(res.screenshotUrl, res.iframeUrl);
```

```bash cURL
curl -H "Authorization: Bearer pr_ВАШКЛЮЧ" \
  "https://api.parreq.com/v1/fetch?url=https://developer.mozilla.org/en-US/&include=all&network_ms=1500&text=true"
```

```json
{
  "credits": 11,
  "credits_breakdown": {
    "html": 1,
    "js": 2,
    "css": 1,
    "network": 2,
    "screenshot": 4,
    "iframe": 1
  }
}
```

## В каком порядке всё собирается

Порядок фиксирован и от порядка параметров не зависит:

1. навигация, `wait_for` или `wait_ms`, затем `scroll`, затем окно `network_ms`;
2. **снимки** — скриншот и копия для `iframe`, по целой странице;
3. выгрузка тел скриптов и стилей, текст страницы;
4. подрезка: `exclude`, `strip`, затем `select` или `start_at`.

Отсюда главное следствие: снимок и копия всегда показывают **всю** страницу,
даже если в `html` приехал один блок. Иначе заказавший и то и другое получал бы
картинку обрезка, чего не просил.

## Чего не приходит в JSON

Скриншот и копия для `iframe` в ответ не кладутся — только ссылки. Картинка
весит сотни килобайт, а base64 в JSON раздул бы её ещё на треть и заставил
платить за трафик даже тех, кому нужна была одна ссылка.

## Если надстройка не подключена

Права на платные позиции живут на ключе. Отказ приходит **до** похода в браузер,
и запрос при этом ничего не стоит:

```json
{
  "error": {
    "code": "feature_not_enabled",
    "message": "возможность 'screenshot' (Скриншот) не подключена этому ключу",
    "request_id": "56bb5e7f66ca4042",
    "details": { "feature": "screenshot", "credits": 4 }
  }
}
```

Как подключить — [Кредиты и права](https://docs.parreq.com/pricing).

## Если артефакт не сохранился

Заказали скриншот, а хранилище легло — ссылки в ответе не будет, а надстройка
**вычитается из счёта**: в `credits_breakdown` строки `screenshot` не окажется.
Не доставили — не берём.
