opción
HogarHogar Skill Desarrollo de API browser-to-api

browser-to-api

browserbase/skills browserbase/skills

Generar una especificación OpenAPI 3.1 a partir de una captura de trazas del navegador mediante el análisis del tráfico HTTP observado, la creación de plantillas de URL y la deducción de esquemas JSON a partir de muestras de solicitudes y respuestas.

...Expandir todo
0
Tiempo actualizado 30 de septiembre de 2026

Del navegador a la API

Descubrimiento de API basado en reproducciones. Analiza una captura de trazas del navegador, empareja sus eventos de solicitud y respuesta de CDP, crea plantillas a partir de las URL observadas, deduce esquemas JSON a partir de muestras y genera un documento OpenAPI 3.1, además de un informe de cobertura legible para los usuarios.

Esta habilidad no captura tráfico. Se trata de un procesamiento posterior puramente fuera de línea sobre los buckets cdp/network/*.jsonl de «browser-trace». Las dos habilidades se combinan así:

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

Cuándo utilizarlo

  • El usuario desea obtener un documento OpenAPI para la API de un sitio web de terceros o no documentada.
  • El usuario ha ejecutado un rastreo del navegador y quiere extraer de él los puntos finales y los esquemas.
  • El usuario está desarrollando un cliente o SDK para un sitio web que no publica una especificación.
  • El usuario desea un informe de cobertura que muestre qué flujos ampliarían la especificación.

Si el usuario quiere capturar tráfico, remítele primero a Browser-Trace.

Flujo de trabajo en dos pasos

1. Captura con browser-trace (y, opcionalmente, los cuerpos de los mensajes mediante la opción «browse network on»)

# Ejemplo local para un objetivo Chrome existente que se pueda depurar
TARGET=9222

node ../browser-trace/scripts/start-capture.mjs "$TARGET" my-site
browse open about:blank --cdp "$TARGET"
browse network on                                    # capturar los cuerpos de las solicitudes/respuestas
browse open https://example.com
# ...genera los flujos que quieras cubrir...

# Haz una instantánea del directorio de cuerpos ANTES de desactivar la captura (el directorio temporal se comparte
# por sesión, por lo que las ejecuciones posteriores de `browse network on` mezclarían tus cuerpos
# con lo que escriba una futura captura si te saltas este paso).
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 es opcional, pero muy recomendable: sin él, la especificación carece de esquemas de cuerpo de respuesta (el flujo de datos CDP utilizado por browse cdp no incluye cuerpos). Con él, tanto los cuerpos de solicitud (ya capturados por CDP) como los de respuesta se unen al rastreo mediante el requestId de CDP.

2. Generar la especificación

node scripts/discover.mjs --run .o11y/my-site
# → .o11y/my-site/api-spec/index.html          ← abre esto
#   .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 detecta automáticamente /cdp/network/bodies/. Para utilizar una captura de cuerpo procedente de otra ubicación (por ejemplo, si no se ha realizado una instantánea y se desea el directorio de red de navegación en tiempo real), pasa explícitamente --bodies .

3. Abre el informe HTML

Una vez que discover.mjs haya terminado, abre siempre el informe HTML generado:

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

El informe es un archivo HTML autónomo (no requiere servidor) que muestra cada operación detectada como una ficha expandible con variables, uso por parte del cliente, ejemplos de solicitud/respuesta y un fragmento de código client.mjs generado al final. Este es el resultado principal: ábrelo siempre para el usuario.

Opciones de la CLI

Opción Obligatorio Significado
--run sí Ruta al directorio de ejecución de browser-trace
--out no Directorio de salida; por defecto /api-spec/
--bodies no explorar el directorio de capturasde red para incluirlas en el rastreo (se detecta automáticamente en /cdp/network/bodies/ si existe)
--include no Incluir únicamente las URL que coincidan con la expresión regular (repetible)
--excluir no Excluir las URL que coincidan con la expresión regular (repetible; además de los valores predeterminados)
--origins no Lista de orígenes permitidos separados por comas (p. ej. , api.example.com,example.com)
--format no Formato de salida. Por defecto, ambos
--title no Información de OpenAPI: «info.title». Por defecto, se deriva de la fuente principal
--redact no Nombres de encabezados adicionales / claves JSON que se deben ocultar (separados por comas)
--min-samples no Número mínimo de muestras por punto final que se deben incluir. Por defecto: 1
--stage no Ejecutar solo una etapa: cargar, filtrar, normalizar, inferir, emitir

Estructura de salida

/api-spec/
├── index.html                informe visual — abrir este archivo (autónomo, sin servidor)
├── client.mjs                cliente de recuperación «zero-dep» con funciones tipadas por operación
├── openapi.yaml              especificación legible por máquina
├── openapi.json              copia
├── report.md                 resumen en Markdown + ejemplos de curl
├── confidence.json           confianza por punto de conexión + indicadores de normalización
├── samples/                  ejemplos de solicitudes y respuestas con datos ocultos
│   └── __.json
└── intermediate/             subproductos del proceso (jsonl de emparejamientos/filtros/puntos de conexión)

Lo que obtienes de «browse cdp » y «browse network»

Dos fuentes de captura complementarias:

Fuente Proporciona Limitación
Browse CDP (utilizado por Browser-Trace) método desolicitud/URL/encabezados/datos POST, estado de la respuesta/encabezados/tipo MIME, cronología completa del evento No incluye los cuerpos de las respuestas. Estos deben obtenerse con Network.getResponseBody, algo que el firehose no hace.
explorar red (comando independiente) Cuerpos de solicitud Y cuerpos de respuesta en disco, indexados por el ID de solicitud de CDP El directorio de captura se comparte por sesión de «browse»; una instantánea tomada antes de ejecutar otro «browse network on » lo sobrescribe.

discover.mjs extraerá los cuerpos de un directorio de «browse network» si se pasa --bodies (o se almacenan en /cdp/network/bodies/, que se detecta automáticamente). La coincidencia se realiza por requestId: «browse network» lo escribe en cada request.json como id, y nosotros lo unimos directamente.

Qué cambia cuando hay cuerpos presentes:

  • ✅ Plantillas de ruta, esquemas de parámetros de consulta, códigos de estado, tipos de contenido: son iguales en ambos casos.
  • ✅ Esquemas del cuerpo de la solicitud: basta con «postData » de CDP; el directorio de cuerpos es un extra útil para los casosque no sean «postData ».
  • ✅ Esquemas del cuerpo de la respuesta: se deducen por completo a partir de muestras reales. Sin cuerpos, se obtienen esqueletos del tipo { description, content: }.

El informe señala todos los puntos finales que carecen de una muestra del cuerpo de respuesta.

Filtrado automático de ruido

La etapa de normalización clasifica y elimina automáticamente el ruido de la infraestructura:

  • Seguimiento/análisis: rutas que contienen /track, /pixel, /beacon, /impression, /pageview, /dag/v*
  • Defensa contra bots: Akamai (/akam/), cargas útiles de huellas digitales (sensor_data), rutas multisegmento ofuscadas
  • Gestión de sesiones: /session, /authenticate/start, consentimiento de cookies, puntos finales de experimentos A/B
  • Representaciones de páginas HTML: solicitudes GET que devuelven text/html (la página representada, no la API)

Esto suele eliminar entre el 60 % y el 80 % del tráfico capturado. El indicador --include puede solucionar un falso positivo.

Descomposición de GraphQL y puntos finales multiplexados

Cuando se invoca un único punto final (como /dapi/fe/gql) con diferentes valores de operationName, la skill lo divide automáticamente en operaciones lógicas independientes. Cada una obtiene su propio:

  • Entrada de ruta OpenAPI (p. ej., /dapi/fe/gql [Autocompletar])
  • Esquema de solicitud/respuesta inferido únicamente a partir de las muestras de esa operación
  • Ejemplo de curl y tabla de variables en el informe

La detección funciona con los campos del cuerpo (operationName, method, action) y los parámetros de consulta (opname, op). Esto abarca GraphQL (APQ e inline), JSON-RPC y patrones de envío similares.

Limitaciones

  • La cobertura está limitada por el flujo capturado. Los puntos finales que no se hayan ejecutado en el rastreo no aparecerán. La habilidad no puede garantizar la exhaustividad.
  • Los esquemas son inductivos, no contractuales. Un campo puede ser opcional en el servidor aunque todas las muestras lo contengan.
  • La autenticación se observa, no se especifica. La habilidad registra los encabezados de autenticación en una extensión x-observed-auth, pero no afirma ningún esquema de seguridad.
  • La creación de plantillas de rutas es heurística. Los patrones numéricos, UUID, hexadecimales y slug se detectan por segmento. Las URL ambiguas se marcan en el archivo confidence.json.
  • La ocultación de datos se realiza en la medida de lo posible. Las ocultaciones predeterminadas cubren las credenciales comunes, pero pueden pasarse por alto secretos específicos de la aplicación; utiliza --redact para encabezados o claves personalizados conocidos.

Prácticas recomendadas

  1. Dirige los flujos que deseas documentar. Cuanto más completa sea la traza del navegador, más completa será la especificación.
  2. Utiliza --origins para sitios con mucho ruido. Una página de marketing accede a docenas de servidores de análisis; limítate al origen de la API que te interese.
  3. Revisa primero el archivo report.md. Contiene ejemplos listos para usar con curl y muestras de respuesta para cada operación detectada.
  4. Aumenta --min-samples a 2+ cuando solo quieras que aparezcan en el documento final los puntos finales cuya estructura se conozca con certeza; descarta la cola larga.
  5. Combínalo con la opción «browse network on» cuando los esquemas del cuerpo de la respuesta sean importantes. El «firehose» de CDP por sí solo contiene cuerpos de solicitud, pero no cuerpos de respuesta.

Para conocer el funcionamiento interno del proceso y la referencia del formato de archivo, consulta REFERENCE.md.

Ver en 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).

Instalar browser-to-api

Descarga y descomprime los archivos de habilidades en tu directorio .claude/skills/.

Descargar ZIP

Clona el repositorio y copia los archivos de la habilidad a tu proyecto.

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

Copiar Copiar
Configuración rápida: Copia la carpeta de la habilidad en .claude/skills/ Claude detectará y utilizará automáticamente la habilidad
Repositorio browserbase/skills

Habilidades relacionadas

agentwallet
Tiempo actualizado 7 de julio de 2026
brightdata-cli
Tiempo actualizado 29 de junio de 2026
humanize
Tiempo actualizado 7 de julio de 2026
korean-stock-search
Tiempo actualizado 8 de julio de 2026
OR