Option
HeimHeim Skill API-Entwicklung browser-to-api

browser-to-api

browserbase/skills 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 erweitern
0
Zeit aktualisiert 30. September 2026

Vom 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-Trace durchgefü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 /cdp/network/bodies/ 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 /api-spec/
--bodies nein Verzeichnis fürNetzwerk -Erfassungendurchsuchen, um diese in den Trace einzubinden (wird automatisch aus „/api-spec/“ 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 /cdp/network/bodies/, 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

  1. Steuern Sie die Abläufe, die Sie dokumentieren möchten. Je umfangreicher die Browser-Spur, desto umfangreicher die Spezifikation.
  2. 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.
  3. Sehen Sie sich zunächst die Datei „report.md“ an. Sie enthält „curl“-fähige Beispiele und Antwortbeispiele für jeden erkannten Vorgang.
  4. 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.
  5. 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“.

Auf GitHub ansehen
---
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 installieren

Laden Sie die Skill-Dateien herunter und entpacken Sie sie in Ihr Verzeichnis „.claude/skills/“.

ZIP herunterladen

Klonen 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 Kopieren
Schnelle Einrichtung: Kopiere den Skill-Ordner nach .claude/skills/ Claude erkennt den Skill automatisch und nutzt ihn.
Repository browserbase/skills

Ähnliche Skills

agentwallet
Zeit aktualisiert 7. Juli 2026
brightdata-cli
Zeit aktualisiert 29. Juni 2026
humanize
Zeit aktualisiert 7. Juli 2026
korean-stock-search
Zeit aktualisiert 8. Juli 2026
OR