вариант

browser-to-api

browserbase/skills browserbase/skills

Сгенерировать спецификацию OpenAPI 3.1 на основе записи трафика браузера путем анализа наблюдаемого HTTP-трафика, создания шаблонов URL-адресов и вывода схем JSON на основе образцов запросов и ответов.

...Расширить все
0
Обновлено время 30 сентября 2026 г.

От браузера к API

Обнаружение API на основе воспроизведения. Обработка записи трафика браузера, сопоставление событий запросов и ответов CDP, создание шаблонов для наблюдаемых URL-адресов, вывод схем JSON на основе образцов и вывод документа OpenAPI 3.1, а также отчета о покрытии в удобном для чтения виде.

Этот с킬 не осуществляет запись трафика. Он представляет собой чисто автономную постобработку на основе контейнеров cdp/network/*.jsonl, содержащих трассировку браузера. Эти два скила комбинируются следующим образом:

browser-trace    →  .o11y//cdp/network/{requests,responses}.jsonl
browser-to-api  →  .o11y//api-spec/index.html + openapi.yaml + client.mjs

Когда использовать

  • Пользователю нужен документ OpenAPI для API стороннего или недокументированного веб-сайта.
  • У пользователя есть трассировка браузера, и он хочет извлечь из неё конечные точки и схемы.
  • Пользователь разрабатывает клиент/SDK для сайта, который не публикует спецификацию.
  • Пользователю нужен отчет о покрытии, показывающий, какие потоки расширят спецификацию.

Если пользователю требуется записать трафик, сначала направьте его на инструмент browser-trace.

Двухэтапный рабочий процесс

1. Захват с помощью browser-trace (и, по желанию, тел сообщений через функцию «Просмотр сети»)

# Локальный пример для существующей отлаживаемой цели Chrome
TARGET=9222

node ../browser-trace/scripts/start-capture.mjs "$TARGET" my-site
browse open about:blank --cdp "$TARGET"
browse network on                                    # запись тел запросов/ответов
browse open https://example.com
# ...запустите любые потоки, которые хотите охватить...

# Сделайте моментальный снимок каталога bodies ПЕРЕД отключением записи (временный каталог используется
# совместно для всех сеансов, поэтому последующие запуски `browse network on` смешают ваши тела запросов и ответов
# с тем, что запишет будущая запись, если вы пропустите этот шаг).
cp -r "$(browse network path | jq -r .path)" .o11y/my-site/cdp/network/bodies/
browse network off

node ../browser-trace/scripts/stop-capture.mjs my-site
node ../browser-trace/scripts/bisect-cdp.mjs my-site

browse network on является опциональным, но настоятельно рекомендуется — без него в спецификации отсутствуют схемы тел ответов (поток данных CDP, используемый командой browse cdp, не содержит тел). При его использовании как тела запросов (уже захваченные CDP), так и тела ответов объединяются в трассировку по идентификатору запроса CDP ( requestId).

2. Сгенерируйте спецификацию

node scripts/discover.mjs --run .o11y/my-site
# → .o11y/my-site/api-spec/index.html          ← откройте этот файл
#   .o11y/my-site/api-spec/client.mjs
#   .o11y/my-site/api-spec/openapi.yaml
#   .o11y/my-site/api-spec/openapi.json
#   .o11y/my-site/api-spec/report.md
#   .o11y/my-site/api-spec/confidence.json
#   .o11y/my-site/api-spec/samples/*.json
#   .o11y/my-site/api-spec/intermediate/*.jsonl

discover.mjs автоматически обнаруживает /cdp/network/bodies/. Чтобы использовать захваченный текст из другого источника (например, если не был сделан снимок, а требуется просмотр сетевого каталога в режиме реального времени), явно передайте параметр --bodies .

3. Откройте отчёт в формате HTML

После завершения работы discover.mjs всегда открывайте сгенерированный HTML-отчет:

open .o11y/my-site/api-spec/index.html

Отчет представляет собой автономный HTML-файл (сервер не требуется), в котором каждая обнаруженная операция отображается в виде раскрываемой карточки с переменными, информацией об использовании клиентом, примерами запросов и ответов, а также сгенерированным фрагментом кода client.mjs внизу. Это основной результат работы — всегда открывайте его для пользователя.

Параметры командной строки

Флаг Обязательный Значение
--run да Путь к каталогу запуска трассировки браузера
--out нет Каталог вывода; по умолчанию /api-spec/
--bodies нет просмотреть каталогсетевых захватов для добавления в трассировку (автоматически определяется по пути /cdp/network/bodies/, если он существует)
--include нет Включать только URL-адреса, соответствующие регулярному выражению (повторяемо)
--exclude нет Исключить URL-адреса, соответствующие регулярному выражению (повторяемо; в дополнение к значениям по умолчанию)
--origins нет Список разрешённых источников, разделённый запятыми (например, api.example.com,example.com)
--format нет Формат вывода. По умолчанию: оба
--title нет Информация OpenAPI .title. По умолчанию берется из первоисточника
--redact нет Дополнительные имена заголовков / ключи JSON для редактирования (разделены запятыми)
--min-samples нет Минимальное количество выборок на конечную точку, которые необходимо включить. По умолчанию: 1
--stage нет Выполнить только один этап: загрузка, фильтрация, нормализация, вывод, вывод результатов

Структура вывода

/api-spec/
├── index.html                визуальный отчет — откройте этот файл (самодостаточный, не требует сервера)
├── client.mjs                клиент для вызова без зависимостей с типизированными функциями для каждой операции
├── openapi.yaml              спецификация в машиночитаемом формате
├── openapi.json              зеркало
├── report.md                 сводка в формате Markdown + примеры с использованием curl
├── confidence.json           показатель достоверности по каждому коневому пункту + флаги нормализации
├── samples/                  отредактированные примеры запросов/ответов
│   └── __.json
└── intermediate/             побочные продукты конвейера (парные/отфильтрованные/конечные точки в формате jsonl)

Что вы получаете от browse cdp и browse network

Два взаимодополняющих источника данных:

Источник Предоставляет Ограничения
browse cdp (используется в browser-trace) методзапроса/URL/заголовки/данные POST, статус ответа/заголовки/MIME-тип, полную хронологию событий Не включает тела ответов. Тела ответов необходимо извлекать с помощью Network.getResponseBody, чего firehose не делает.
просмотр сетевых данных (отдельная команда) тела запросов И тела ответов на диске, с ключом по CDP requestId Каталог записей используется совместно для всех сеансов просмотра; создание моментального снимка перед запуском другой команды «browse network on» приводит к его перезаписи.

discover.mjs будет извлекать тела из каталога «browse network», если вы передадите параметр `--bodies` (или сохраните их в папке/cdp/network/bodies/, которая определяется автоматически). Сопоставление происходит по `requestId` — «browse network» записывает его в каждый файл `request.json` в качестве `id`, и мы выполняем прямой сопоставительный поиск.

Что меняется при наличии тел запросов:

  • ✅ Шаблоны путей, схемы параметров запроса, коды статуса, типы содержимого — остаются неизменными в обоих случаях.
  • ✅ Схемы тел запросов — достаточно postData из CDP; каталог тел — полезно иметь для случаев,не связанных с postData.
  • ✅ Схемы тел ответов — полностью выводятся на основе реальных образцов. Без тел вы получаете скелеты вида { description, content: }.

Отчет отмечает каждый конечный пункт, для которого отсутствует образец тела ответа.

Автоматическая фильтрация шума

Этап нормализации автоматически классифицирует и отсеивает инфраструктурный шум:

  • Отслеживание / аналитика — пути, содержащие /track, /pixel, /beacon, /impression, /pageview, /dag/v*
  • Защита от ботов — Akamai (/akam/), полезные нагрузки с отпечатками (sensor_data), запутанные многосегментные пути
  • Управление сессиями — /session, /authenticate/start, согласие на использование файлов cookie, конечные точки A/B-экспериментов
  • Отображение HTML-страниц — запросы GET, возвращающие text/html (отображаемая страница, а не API)

Обычно это позволяет отсеять 60–80 % перехваченного трафика. Флаг --include может исправить ложное срабатывание.

Разложение GraphQL / мультиплексированных конечных точек

Когда один конечный пункт (например, /dapi/fe/gql) вызывается с различными значениями operationName, система автоматически разбивает его на отдельные логические операции. Каждая из них получает собственный:

  • запись пути OpenAPI (например, /dapi/fe/gql [Автозаполнение])
  • Схему запроса/ответа, выведенную исключительно на основе образцов данной операции
  • Пример Curl и таблица переменных в отчёте

Распознавание работает с полями тела запроса (operationName, method, action) и параметрами запроса (opname, op). Это охватывает GraphQL (APQ и встроенный), JSON-RPC и аналогичные шаблоны диспетчеризации.

Ограничения

  • Охват ограничен зафиксированным потоком. Конечные точки, не задействованные в трассировке, не будут отображаться. Данная функция не может гарантировать полноту.
  • Схемы являются индуктивными, а не договорными. Поле может быть необязательным на сервере, даже если оно присутствовало во всех образцах.
  • Аутентификация наблюдается, но не задаётся явно. Навык записывает заголовки, связанные с аутентификацией, в расширении x-observed-auth, но не утверждает наличие схемы безопасности.
  • Создание шаблонов путей осуществляется эвристически. Шаблоны чисел, UUID, шестнадцатеричных значений и слагов обнаруживаются для каждого сегмента. Неоднозначные URL-адреса помечаются в файле confidence.json.
  • Редактирование осуществляется по принципу «по мере возможности». По умолчанию редактируются распространённые учетные данные, но секретные данные, специфичные для приложения, могут остаться незамеченными; используйте параметр `--redact` для известных пользовательских заголовков/ключей.

Рекомендации

  1. Направляйте потоки, которые хотите задокументировать. Чем богаче трассировка браузера, тем богаче спецификация.
  2. Используйте опцию --origins для сайтов с большим количеством отслеживаемых ресурсов. Маркетинговая страница обращается к десяткам хостов аналитики; ограничьтесь тем источником API, который вас интересует.
  3. Сначала ознакомьтесь с файлом report.md. В нём содержатся готовые к использованию с curl примеры и образцы ответов для каждой обнаруженной операции.
  4. Увеличьте значение --min-samples до 2+, если хотите, чтобы в окончательном документе были только конечные точки с достоверно установленной структурой — отбросьте «длинный хвост».
  5. Используйте в сочетании с опцией «browse network on», если важны схемы тел ответов. Сам по себе поток данных CDP содержит тела запросов, но не тела ответов.

Внутреннее устройство конвейера и справочник по форматам файлов см. в файле REFERENCE.md.

Посмотреть на GitHub
---
name: browser-to-api
description: Generate an OpenAPI 3.1 specification from a browser-trace capture by analyzing observed HTTP traffic, templating URLs, and inferring JSON schemas from request/response samples.
license: MIT
---

# Browser to API

Replay-driven API discovery. Consume a `browser-trace` capture, pair its CDP request / response events, templatize observed URLs, infer JSON schemas from samples, and emit an **OpenAPI 3.1** document plus a human-readable coverage report.

This skill **does not capture traffic**. It is purely offline post-processing on top of `browser-trace`'s `cdp/network/*.jsonl` buckets. The two skills compose:

```
browser-trace    →  .o11y/<run>/cdp/network/{requests,responses}.jsonl
browser-to-api   →  .o11y/<run>/api-spec/index.html + openapi.yaml + client.mjs
```

## When to use

- The user wants an OpenAPI document for a third-party or undocumented website API.
- The user has a `browser-trace` run and wants endpoints + schemas extracted from it.
- The user is building a client/SDK against a site that doesn't publish a spec.
- The user wants a coverage report showing which flows would broaden the spec.

If the user wants to **capture** traffic, send them to `browser-trace` first.

## Two-step workflow

### 1. Capture with `browser-trace` (and optionally bodies via `browse network on`)

```bash
# Local example against an existing debuggable Chrome target
TARGET=9222

node ../browser-trace/scripts/start-capture.mjs "$TARGET" my-site
browse open about:blank --cdp "$TARGET"
browse network on                                    # capture request/response bodies
browse open https://example.com
# ...drive whatever flows you want covered...

# Snapshot the bodies dir BEFORE turning capture off (the temp dir is shared
# per-session, so subsequent `browse network on` runs would mix your bodies
# with whatever a future capture writes if you skip this step).
cp -r "$(browse network path | jq -r .path)" .o11y/my-site/cdp/network/bodies/
browse network off

node ../browser-trace/scripts/stop-capture.mjs my-site
node ../browser-trace/scripts/bisect-cdp.mjs my-site
```

`browse network on` is **optional but strongly recommended** — without it, the spec has no response-body schemas (the CDP firehose used by `browse cdp` does not embed bodies). With it, both request bodies (already captured by CDP) *and* response bodies are joined into the trace by CDP `requestId`.

### 2. Generate the spec

```bash
node scripts/discover.mjs --run .o11y/my-site
# → .o11y/my-site/api-spec/index.html          ← open this
#   .o11y/my-site/api-spec/client.mjs
#   .o11y/my-site/api-spec/openapi.yaml
#   .o11y/my-site/api-spec/openapi.json
#   .o11y/my-site/api-spec/report.md
#   .o11y/my-site/api-spec/confidence.json
#   .o11y/my-site/api-spec/samples/*.json
#   .o11y/my-site/api-spec/intermediate/*.jsonl
```

`discover.mjs` auto-detects `<run>/cdp/network/bodies/`. To use a body capture from elsewhere (e.g. didn't snapshot, want the live `browse network` dir), pass `--bodies <path>` explicitly.

### 3. Open the HTML report

After `discover.mjs` finishes, **always open the generated HTML report**:

```bash
open .o11y/my-site/api-spec/index.html
```

The report is a self-contained HTML file (no server needed) that shows each discovered operation as an expandable card with variables, client usage, request/response examples, and a generated `client.mjs` snippet at the bottom. This is the primary deliverable — always open it for the user.

## CLI flags

| Flag | Required | Meaning |
|---|---|---|
| `--run <path>` | yes | Path to a `browser-trace` run directory |
| `--out <path>` | no | Output dir; default `<run>/api-spec/` |
| `--bodies <path>` | no | `browse network` capture dir to join into the trace (auto-detected from `<run>/cdp/network/bodies/` when present) |
| `--include <regex>` | no | Only include URLs matching regex (repeatable) |
| `--exclude <regex>` | no | Exclude URLs matching regex (repeatable; in addition to defaults) |
| `--origins <list>` | no | Comma-separated origin allow-list (e.g. `api.example.com,example.com`) |
| `--format <yaml\|json\|both>` | no | Output format. Default `both` |
| `--title <string>` | no | OpenAPI `info.title`. Default derived from primary origin |
| `--redact <list>` | no | Extra header names / JSON keys to redact (comma-separated) |
| `--min-samples <n>` | no | Minimum samples per endpoint to include. Default `1` |
| `--stage <name>` | no | Run only one stage: `load`, `filter`, `normalize`, `infer`, `emit` |


## Output layout

```
<run>/api-spec/
├── index.html                visual report — open this (self-contained, no server)
├── client.mjs                zero-dep fetch client with typed functions per operation
├── openapi.yaml              machine-readable spec
├── openapi.json              mirror
├── report.md                 markdown summary + curl examples
├── confidence.json           per-endpoint confidence + normalization flags
├── samples/                  redacted request/response examples
│   └── <method>__<path-hash>.json
└── intermediate/             pipeline byproducts (paired/filtered/endpoints jsonl)
```

## What you get from `browse cdp` and `browse network`

Two complementary capture sources:

| Source | Provides | Limitation |
|---|---|---|
| `browse cdp` (used by `browser-trace`) | request method/URL/headers/`postData`, response status/headers/mimeType, full event timing | **Does not embed response bodies.** Bodies must be pulled with `Network.getResponseBody`, which the firehose doesn't do. |
| `browse network on` (separate command) | request bodies AND response bodies on disk, keyed by CDP `requestId` | Capture dir is shared per `browse` session; snapshot before another `browse network on` overwrites it. |

`discover.mjs` will pull bodies from a `browse network` dir if you pass `--bodies <path>` (or stash them under `<run>/cdp/network/bodies/`, which is auto-detected). The matching is by `requestId` — `browse network` writes that into each `request.json` as `id`, and we join directly.

What changes when bodies are present:

- ✅ Path templating, query-param schemas, status codes, content-types — same either way.
- ✅ Request-body schemas — `postData` from CDP is enough; bodies dir is a nice-to-have for non-`postData` cases.
- ✅ **Response-body schemas** — fully inferred from real samples. Without bodies you get `{ description, content: <mimeType> }` skeletons.

The report flags every endpoint that has no response-body sample.

## Automatic noise filtering

The normalize stage automatically classifies and drops infrastructure noise:

- **Tracking / analytics** — paths containing `/track`, `/pixel`, `/beacon`, `/impression`, `/pageview`, `/dag/v*`
- **Bot defense** — Akamai (`/akam/`), fingerprint payloads (`sensor_data`), obfuscated multi-segment paths
- **Session plumbing** — `/session`, `/authenticate/start`, cookie consent, A/B experiment endpoints
- **HTML page renders** — `GET` requests returning `text/html` (the rendered page, not the API)

This typically drops 60-80% of captured traffic. The `--include` flag can rescue a false positive.

## GraphQL / multiplexed endpoint decomposition

When a single endpoint (like `/dapi/fe/gql`) is called with different `operationName` values, the skill automatically splits it into separate logical operations. Each gets its own:
- OpenAPI path entry (e.g. `/dapi/fe/gql [Autocomplete]`)
- Request/response schema inferred from only that operation's samples
- Curl example and variables table in the report

Detection works on body fields (`operationName`, `method`, `action`) and query params (`opname`, `op`). This covers GraphQL (APQ and inline), JSON-RPC, and similar dispatch patterns.

## Limitations

- **Coverage is bounded by the captured flow.** Endpoints not exercised in the trace will not appear. The skill cannot prove completeness.
- **Schemas are inductive, not contractual.** A field might be optional on the server even if every sample contained it.
- **Auth is observed, not specified.** The skill records auth-shaped headers in an `x-observed-auth` extension but won't claim a security scheme.
- **Path templating is heuristic.** Numeric / UUID / hex / slug patterns are detected per segment. Ambiguous URLs are flagged in `confidence.json`.
- **Redaction is best-effort.** Default redactions cover common credentials, but app-specific secrets may slip through; use `--redact` for known custom headers/keys.

## Best practices

1. **Drive the flows you want documented.** The richer the browser-trace, the richer the spec.
2. **Use `--origins` for noisy sites.** A marketing page hits dozens of analytics hosts; restrict to the API origin you care about.
3. **Inspect `report.md` first.** It has curl-ready examples and response samples for every discovered operation.
4. **Bump `--min-samples` to 2+** when you want only confidently-shaped endpoints in the final doc — drop the long tail.
5. **Pair with `browse network on`** when response-body schemas matter. The CDP firehose alone has request bodies but not response bodies.

For pipeline internals and the file format reference, see [REFERENCE.md](REFERENCE.md).

Установить browser-to-api

Скачайте файлы навыков и распакуйте их в каталог .claude/skills/.

Скачать ZIP

Клонируйте репозиторий и скопируйте файлы навыка в свой проект.

git clone https://github.com/browserbase/skills/tree/main/skills/browser-to-api # Copy SKILL.md to your .claude/skills/ directory

Копировать Копировать
Быстрая настройка: Скопируйте папку со скиллом в каталог .claude/skills/ Claude автоматически обнаружит и начнёт использовать этот скилл
Репозиторий browserbase/skills

Похожие навыки

agentwallet
Обновлено время 7 июля 2026 г.
brightdata-cli
Обновлено время 29 июня 2026 г.
humanize
Обновлено время 7 июля 2026 г.
korean-stock-search
Обновлено время 8 июля 2026 г.
OR