browser-to-api
browserbase/skills
Erstellen Sie eine OpenAPI 3.1-Spezifikation aus einer Browser-Trace-Aufzeichnung, indem Sie den beobachteten HTTP-Datenverkehr analysieren, URLs in Vorlagen umwandeln und JSON-Schemas aus Anfrage-/Antwortbeispielen ableiten.
...Alle erweiternVom Browser zur API
Replay-gesteuerte API-Erkennung. Verarbeitet eine Browser-Trace- Aufzeichnung, ordnet die CDP-Anfrage- und Antwort-Ereignisse einander zu, erstellt Vorlagen für beobachtete URLs, leitet JSON-Schemas aus Beispielen ab und gibt ein OpenAPI 3.1 -Dokument sowie einen für Menschen lesbaren Abdeckungsbericht aus.
Diese Funktion erfasst keinen Datenverkehr. Es handelt sich um eine rein offline durchgeführte Nachbearbeitung auf Basis der „cdp/network/*.jsonl“- Buckets der Browser-Trace-Daten. Die beiden Funktionen lassen sich wie folgt kombinieren:
browser-trace → .o11y//cdp/network/{requests,responses}.jsonl
browser-to-api → .o11y//api-spec/index.html + openapi.yaml + client.mjs
Anwendungsfälle
- Der Benutzer benötigt ein OpenAPI-Dokument für eine API eines Drittanbieters oder einer undokumentierten Website.
- Der Benutzer hat einen
Browser-Tracedurchgeführt und möchte daraus Endpunkte und Schemata extrahieren. - Der Benutzer entwickelt einen Client/ein SDK für eine Website, die keine Spezifikation veröffentlicht.
- Der Benutzer möchte einen Abdeckungsbericht, aus dem hervorgeht, welche Abläufe die Spezifikation erweitern würden.
Wenn der Benutzer Datenverkehr erfassen möchte, leiten Sie ihn zunächst an „Browser-Trace“ weiter.
Zweistufiger Arbeitsablauf
1. Erfassung mit „browser-trace“ (und optional Datenkörpern über „browse network on“)
# Lokales Beispiel für ein bestehendes, debuggbares Chrome-Ziel
TARGET=9222
node ../browser-trace/scripts/start-capture.mjs "$TARGET" my-site
browse open about:blank --cdp "$TARGET"
browse network on # Request-/Response-Inhalte erfassen
browse open https://example.com
# ...die gewünschten Datenflüsse auslösen...
# Erstelle einen Snapshot des Verzeichnisses „bodies“, BEVOR du die Erfassung deaktivierst (das temporäre Verzeichnis wird
# pro Sitzung gemeinsam genutzt, sodass nachfolgende „browse network on“-Läufe deine Daten
# mit den Daten vermischen würden, die bei einer zukünftigen Erfassung geschrieben werden, wenn du diesen Schritt überspringst).
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“ ist optional, wird jedoch dringend empfohlen – ohne diese Option enthält die Spezifikation keine Schemata für Antwort-Body-Daten (der von „browse cdp“ verwendete CDP-Firehose bettet keine Body-Daten ein). Mit dieser Option werden sowohl Request-Body-Daten (die bereits von CDP erfasst wurden) als auch Antwort-Body-Daten anhand der CDP -Request-ID in den Trace eingefügt.
2. Spezifikation generieren
node scripts/discover.mjs --run .o11y/my-site
# → .o11y/my-site/api-spec/index.html ← Öffne diese Datei
# .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 erkennt automatisch . Um eine Body-Erfassung von einer anderen Quelle zu verwenden (z. B. wenn kein Snapshot erstellt wurde und Sie das Live-Browse-Netzwerkverzeichnis verwenden möchten), übergeben Sie explizit --bodies
3. Öffnen Sie den HTML-Bericht
Öffnen Sie nach Abschluss von discover.mjs immer den generierten HTML-Bericht:
open .o11y/my-site/api-spec/index.html
Der Bericht ist eine eigenständige HTML-Datei (kein Server erforderlich), die jede erkannte Operation als erweiterbare Karte mit Variablen, Client-Nutzung, Beispielen für Anfragen und Antworten sowie einem generierten client.mjs-Snippet am Ende anzeigt. Dies ist das wichtigste Ergebnis – öffnen Sie es immer für den Benutzer.
CLI-Flags
| Flag | Erforderlich | Bedeutung |
|---|---|---|
--run |
ja | Pfad zum Verzeichnis für die Ausführung von Browser-Trace |
--out |
nein | Ausgabeverzeichnis; Standard |
--bodies |
nein | Verzeichnis fürNetzwerk -Erfassungendurchsuchen, um diese in den Trace einzubinden (wird automatisch aus „ ermittelt, sofern vorhanden) |
--include |
nein | Nur URLs einbeziehen, die dem regulären Ausdruck entsprechen (wiederholbar) |
--exclude |
nein | URLs ausschließen, die dem regulären Ausdruck entsprechen (wiederholbar; zusätzlich zu den Standardeinstellungen) |
--origins |
nein | Durch Kommas getrennte Liste der zugelassenen Ursprünge (z. B. api.example.com,example.com) |
--format |
nein | Ausgabeformat. Standard: „both“ |
--title |
nein | OpenAPI -Info.title. Standardwert wird aus der primären Quelle abgeleitet |
--redact |
nein | Zusätzliche Header-Namen / JSON-Schlüssel, die geschwärzt werden sollen (durch Kommas getrennt) |
--min-samples |
nein | Mindestanzahl der pro Endpunkt einzubeziehenden Stichproben. Standardwert: 1 |
--stage |
nein | Nur eine Stufe ausführen: Laden, Filtern, Normalisieren, Ableiten, Ausgeben |
Ausgabelayout
/api-spec/
├── index.html visueller Bericht – hier öffnen (in sich geschlossen, kein Server erforderlich)
├── client.mjs Zero-Dep-Fetch-Client mit typisierten Funktionen pro Operation
├── openapi.yaml maschinenlesbare Spezifikation
├── openapi.json Spiegel
├── report.md Markdown-Zusammenfassung + curl-Beispiele
├── confidence.json Konfidenz pro Endpunkt + Normalisierungsflags
├── samples/ bearbeitete Anfrage-/Antwortbeispiele
│ └── __.json
└── intermediate/ Nebenprodukte der Pipeline (gepaarte/gefilterte Endpunkte als JSONL)
Was Sie von „browse cdp “ und „browse network“ erhalten
Zwei sich ergänzende Erfassungsquellen:
| Quelle | Bietet | Einschränkung |
|---|---|---|
„browse cdp“ (von „browser-trace“ verwendet) |
Anfragemethode/URL/Header/Post-Daten, Antwortstatus/Header/MIME-Typ, vollständige Ereigniszeitangaben |
Bezieht Antwortinhalte nicht ein. Diese müssen mit ` Network.getResponseBody` abgerufen werden, was der Firehose nicht tut. |
Netzwerk durchsuchen (separater Befehl) |
Anfrage- und Antwortinhalte auf der Festplatte, indiziert nach CDP -Anfrage-ID |
Das Capture-Verzeichnis wird pro „browse “-Sitzung gemeinsam genutzt; ein Snapshot vor einem weiteren „browse network on“ überschreibt es. |
discover.mjs ruft bodies aus einem „browse network“-Verzeichnis ab, wenn Sie --bodies übergeben (oder speichern Sie sie unter , was automatisch erkannt wird). Der Abgleich erfolgt anhand der requestId – „browse network“ schreibt diese als id in jede request.json, und wir führen direkt eine Verknüpfung durch.
Was sich ändert, wenn Body-Daten vorhanden sind:
- ✅ Pfadvorlagen, Schemata für Abfrageparameter, Statuscodes, Content-Typen – bleiben in beiden Fällen unverändert.
- ✅ Schemata für Request-Bodies –
„postData“aus dem CDP reicht aus; das Verzeichnis „bodies“ ist ein nützliches Extra für Fälleohne „postData“. - ✅ Schemata für Antwort-Body – werden vollständig aus echten Beispielen abgeleitet. Ohne Body-Inhalte erhält man Skelette der Form
{ description, content:.}
Der Bericht kennzeichnet jeden Endpunkt, für den kein Beispiel für den Antworttext vorliegt.
Automatische Rauschfilterung
Die Normalisierungsphase klassifiziert und filtert Infrastrukturrauschen automatisch heraus:
- Tracking/Analytik – Pfade, die
/track,/pixel,/beacon,/impression,/pageview,/dag/v*enthalten - Bot-Abwehr – Akamai (
/akam/), Fingerabdruck-Nutzdaten (sensor_data), verschleierte Mehrsegment-Pfade - Sitzungsverwaltung –
/session,/authenticate/start, Cookie-Einwilligung, Endpunkte für A/B-Experimente - Rendering von HTML-Seiten —
GET-Anfragen, die„text/html“zurückgeben (die gerenderte Seite, nicht die API)
Dadurch werden in der Regel 60–80 % des erfassten Datenverkehrs aussortiert. Das Flag „--include“ kann ein Fehlalarm beheben.
GraphQL / Zerlegung multiplexierter Endpunkte
Wenn ein einzelner Endpunkt (wie /dapi/fe/gql) mit unterschiedlichen „operationName“-Werten aufgerufen wird, teilt die Funktion ihn automatisch in separate logische Operationen auf. Jede erhält ihren eigenen:
- OpenAPI-Pfadeintrag (z. B.
/dapi/fe/gql [Autocomplete]) - Anfrage-/Antwortschema, das ausschließlich aus den Samples dieser Operation abgeleitet wird
- Curl-Beispiel und Variablentabelle im Bericht
Die Erkennung erfolgt anhand von Body-Feldern (operationName, method, action) und Abfrageparametern (opname, op). Dies umfasst GraphQL (APQ und Inline), JSON-RPC und ähnliche Dispatch-Muster.
Einschränkungen
- Der Erfassungsumfang ist auf den erfassten Ablauf beschränkt. Endpunkte, die im Trace nicht aufgerufen wurden, werden nicht angezeigt. Die Funktion kann keine Vollständigkeit garantieren.
- Schemas sind induktiv, nicht vertraglich festgelegt. Ein Feld kann auf dem Server optional sein, auch wenn es in jedem Beispiel enthalten war.
- Die Authentifizierung wird beobachtet, nicht spezifiziert. Die Funktion protokolliert authentifizierungsbezogene Header in einer
„x-observed-auth“-Erweiterung, gibt jedoch keine Aussage über ein Sicherheitsschema ab. - Die Pfadvorlagenerstellung erfolgt heuristisch. Numerische, UUID-, Hex- und Slug-Muster werden pro Segment erkannt. Mehrdeutige URLs werden in
der Datei „confidence.json“gekennzeichnet. - Die Schwärzung erfolgt nach bestem Bemühen. Standardmäßige Schwärzungen decken gängige Anmeldedaten ab, aber anwendungsspezifische Geheimnisse können durchrutschen; verwenden Sie
„--redact“für bekannte benutzerdefinierte Header/Schlüssel.
Bewährte Vorgehensweisen
- Steuern Sie die Abläufe, die Sie dokumentieren möchten. Je umfangreicher die Browser-Spur, desto umfangreicher die Spezifikation.
- Verwenden Sie
„--origins“für Websites mit hohem Datenaufkommen. Eine Marketing-Seite greift auf Dutzende von Analytics-Hosts zu; beschränken Sie sich auf den API-Ursprung, der für Sie relevant ist. - Sehen Sie sich zunächst
die Datei „report.md“an. Sie enthält „curl“-fähige Beispiele und Antwortbeispiele für jeden erkannten Vorgang. - Erhöhen Sie
„--min-samples“auf 2+, wenn Sie nur Endpunkte mit sicherer Struktur im endgültigen Dokument haben möchten – lassen Sie den Long Tail weg. - Kombiniere dies mit
„browse network on“, wenn die Schemata der Antwortkörper wichtig sind. Der CDP-Firehose allein enthält zwar Request-Körper, aber keine Antwortkörper.
Informationen zur internen Funktionsweise der Pipeline und zur Dateiformat-Referenz finden Sie in „REFERENCE.md“.
---
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).
Alle Dateien
15 Dateienbrowser-to-api installieren
Laden Sie die Skill-Dateien herunter und entpacken Sie sie in Ihr Verzeichnis „.claude/skills/“.
ZIP herunterladenKlonen Sie das Repository und kopieren Sie die Skill-Dateien in Ihr Projekt.
git clone https://github.com/browserbase/skills/tree/main/skills/browser-to-api # Copy SKILL.md to your .claude/skills/ directory
Kopieren





Heim
