[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-browserbase-browser-to-api":3,"mdc--8suk4d-key":37,"related-org-browserbase-browser-to-api":1821,"related-repo-browserbase-browser-to-api":1992},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"browser-to-api","generate OpenAPI specs from browser traffic","Turn a website's observable HTTP traffic into a best-effort OpenAPI 3.1 spec by analyzing a `browser-trace` capture. Use when the user wants to discover\u002Fextract API endpoints from a browser session, build an OpenAPI doc from network traffic, or document a third-party site's XHR\u002Ffetch surface for client integration.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"browserbase","Browserbase","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fbrowserbase.png",[12,16,17,20,23],{"name":13,"slug":14,"type":15},"HTTP","http","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"API Development","api-development",{"name":21,"slug":22,"type":15},"OpenAPI","openapi",{"name":24,"slug":25,"type":15},"Browser Automation","browser-automation",3649,"https:\u002F\u002Fgithub.com\u002Fbrowserbase\u002Fskills","2026-05-14T06:07:27.298495","MIT",232,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"Browserbase's official collection of agent skills to access the web.","https:\u002F\u002Fgithub.com\u002Fbrowserbase\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fbrowser-to-api","---\nname: browser-to-api\ndescription: Turn a website's observable HTTP traffic into a best-effort OpenAPI 3.1 spec by analyzing a `browser-trace` capture. Use when the user wants to discover\u002Fextract API endpoints from a browser session, build an OpenAPI doc from network traffic, or document a third-party site's XHR\u002Ffetch surface for client integration.\ncompatibility: \"Requires Node 18+ and a `browser-trace` run directory (`.o11y\u002F\u003Crun>\u002F`) produced by the sibling `browser-trace` skill. The scripts use only the Node standard library — no `npm install` step. `jq` is referenced in docs for ad-hoc querying but is not required by the scripts.\"\nlicense: MIT\nallowed-tools: Bash, Read, Grep\n---\n\n# Browser to API\n\nReplay-driven API discovery. Consume a `browser-trace` capture, pair its CDP request \u002F response events, templatize observed URLs, infer JSON schemas from samples, and emit an **OpenAPI 3.1** document plus a human-readable coverage report.\n\nThis skill **does not capture traffic**. It is purely offline post-processing on top of `browser-trace`'s `cdp\u002Fnetwork\u002F*.jsonl` buckets. The two skills compose:\n\n```\nbrowser-trace    →  .o11y\u002F\u003Crun>\u002Fcdp\u002Fnetwork\u002F{requests,responses}.jsonl\nbrowser-to-api   →  .o11y\u002F\u003Crun>\u002Fapi-spec\u002Findex.html + openapi.yaml + client.mjs\n```\n\n## When to use\n\n- The user wants an OpenAPI document for a third-party or undocumented website API.\n- The user has a `browser-trace` run and wants endpoints + schemas extracted from it.\n- The user is building a client\u002FSDK against a site that doesn't publish a spec.\n- The user wants a coverage report showing which flows would broaden the spec.\n\nIf the user wants to **capture** traffic, send them to `browser-trace` first.\n\n## Two-step workflow\n\n### 1. Capture with `browser-trace` (and optionally bodies via `browse network on`)\n\n```bash\n# Local example against an existing debuggable Chrome target\nTARGET=9222\n\nnode ..\u002Fbrowser-trace\u002Fscripts\u002Fstart-capture.mjs \"$TARGET\" my-site\nbrowse open about:blank --cdp \"$TARGET\"\nbrowse network on                                    # capture request\u002Fresponse bodies\nbrowse open https:\u002F\u002Fexample.com\n# ...drive whatever flows you want covered...\n\n# Snapshot the bodies dir BEFORE turning capture off (the temp dir is shared\n# per-session, so subsequent `browse network on` runs would mix your bodies\n# with whatever a future capture writes if you skip this step).\ncp -r \"$(browse network path | jq -r .path)\" .o11y\u002Fmy-site\u002Fcdp\u002Fnetwork\u002Fbodies\u002F\nbrowse network off\n\nnode ..\u002Fbrowser-trace\u002Fscripts\u002Fstop-capture.mjs my-site\nnode ..\u002Fbrowser-trace\u002Fscripts\u002Fbisect-cdp.mjs my-site\n```\n\n`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`.\n\n### 2. Generate the spec\n\n```bash\nnode scripts\u002Fdiscover.mjs --run .o11y\u002Fmy-site\n# → .o11y\u002Fmy-site\u002Fapi-spec\u002Findex.html          ← open this\n#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fclient.mjs\n#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fopenapi.yaml\n#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fopenapi.json\n#   .o11y\u002Fmy-site\u002Fapi-spec\u002Freport.md\n#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fconfidence.json\n#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fsamples\u002F*.json\n#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fintermediate\u002F*.jsonl\n```\n\n`discover.mjs` auto-detects `\u003Crun>\u002Fcdp\u002Fnetwork\u002Fbodies\u002F`. To use a body capture from elsewhere (e.g. didn't snapshot, want the live `browse network` dir), pass `--bodies \u003Cpath>` explicitly.\n\n### 3. Open the HTML report\n\nAfter `discover.mjs` finishes, **always open the generated HTML report**:\n\n```bash\nopen .o11y\u002Fmy-site\u002Fapi-spec\u002Findex.html\n```\n\nThe report is a self-contained HTML file (no server needed) that shows each discovered operation as an expandable card with variables, client usage, request\u002Fresponse examples, and a generated `client.mjs` snippet at the bottom. This is the primary deliverable — always open it for the user.\n\n## CLI flags\n\n| Flag | Required | Meaning |\n|---|---|---|\n| `--run \u003Cpath>` | yes | Path to a `browser-trace` run directory |\n| `--out \u003Cpath>` | no | Output dir; default `\u003Crun>\u002Fapi-spec\u002F` |\n| `--bodies \u003Cpath>` | no | `browse network` capture dir to join into the trace (auto-detected from `\u003Crun>\u002Fcdp\u002Fnetwork\u002Fbodies\u002F` when present) |\n| `--include \u003Cregex>` | no | Only include URLs matching regex (repeatable) |\n| `--exclude \u003Cregex>` | no | Exclude URLs matching regex (repeatable; in addition to defaults) |\n| `--origins \u003Clist>` | no | Comma-separated origin allow-list (e.g. `api.example.com,example.com`) |\n| `--format \u003Cyaml\\|json\\|both>` | no | Output format. Default `both` |\n| `--title \u003Cstring>` | no | OpenAPI `info.title`. Default derived from primary origin |\n| `--redact \u003Clist>` | no | Extra header names \u002F JSON keys to redact (comma-separated) |\n| `--min-samples \u003Cn>` | no | Minimum samples per endpoint to include. Default `1` |\n| `--stage \u003Cname>` | no | Run only one stage: `load`, `filter`, `normalize`, `infer`, `emit` |\n\n\n## Output layout\n\n```\n\u003Crun>\u002Fapi-spec\u002F\n├── index.html                visual report — open this (self-contained, no server)\n├── client.mjs                zero-dep fetch client with typed functions per operation\n├── openapi.yaml              machine-readable spec\n├── openapi.json              mirror\n├── report.md                 markdown summary + curl examples\n├── confidence.json           per-endpoint confidence + normalization flags\n├── samples\u002F                  redacted request\u002Fresponse examples\n│   └── \u003Cmethod>__\u003Cpath-hash>.json\n└── intermediate\u002F             pipeline byproducts (paired\u002Ffiltered\u002Fendpoints jsonl)\n```\n\n## What you get from `browse cdp` and `browse network`\n\nTwo complementary capture sources:\n\n| Source | Provides | Limitation |\n|---|---|---|\n| `browse cdp` (used by `browser-trace`) | request method\u002FURL\u002Fheaders\u002F`postData`, response status\u002Fheaders\u002FmimeType, full event timing | **Does not embed response bodies.** Bodies must be pulled with `Network.getResponseBody`, which the firehose doesn't do. |\n| `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. |\n\n`discover.mjs` will pull bodies from a `browse network` dir if you pass `--bodies \u003Cpath>` (or stash them under `\u003Crun>\u002Fcdp\u002Fnetwork\u002Fbodies\u002F`, which is auto-detected). The matching is by `requestId` — `browse network` writes that into each `request.json` as `id`, and we join directly.\n\nWhat changes when bodies are present:\n\n- ✅ Path templating, query-param schemas, status codes, content-types — same either way.\n- ✅ Request-body schemas — `postData` from CDP is enough; bodies dir is a nice-to-have for non-`postData` cases.\n- ✅ **Response-body schemas** — fully inferred from real samples. Without bodies you get `{ description, content: \u003CmimeType> }` skeletons.\n\nThe report flags every endpoint that has no response-body sample.\n\n## Automatic noise filtering\n\nThe normalize stage automatically classifies and drops infrastructure noise:\n\n- **Tracking \u002F analytics** — paths containing `\u002Ftrack`, `\u002Fpixel`, `\u002Fbeacon`, `\u002Fimpression`, `\u002Fpageview`, `\u002Fdag\u002Fv*`\n- **Bot defense** — Akamai (`\u002Fakam\u002F`), fingerprint payloads (`sensor_data`), obfuscated multi-segment paths\n- **Session plumbing** — `\u002Fsession`, `\u002Fauthenticate\u002Fstart`, cookie consent, A\u002FB experiment endpoints\n- **HTML page renders** — `GET` requests returning `text\u002Fhtml` (the rendered page, not the API)\n\nThis typically drops 60-80% of captured traffic. The `--include` flag can rescue a false positive.\n\n## GraphQL \u002F multiplexed endpoint decomposition\n\nWhen a single endpoint (like `\u002Fdapi\u002Ffe\u002Fgql`) is called with different `operationName` values, the skill automatically splits it into separate logical operations. Each gets its own:\n- OpenAPI path entry (e.g. `\u002Fdapi\u002Ffe\u002Fgql [Autocomplete]`)\n- Request\u002Fresponse schema inferred from only that operation's samples\n- Curl example and variables table in the report\n\nDetection works on body fields (`operationName`, `method`, `action`) and query params (`opname`, `op`). This covers GraphQL (APQ and inline), JSON-RPC, and similar dispatch patterns.\n\n## Limitations\n\n- **Coverage is bounded by the captured flow.** Endpoints not exercised in the trace will not appear. The skill cannot prove completeness.\n- **Schemas are inductive, not contractual.** A field might be optional on the server even if every sample contained it.\n- **Auth is observed, not specified.** The skill records auth-shaped headers in an `x-observed-auth` extension but won't claim a security scheme.\n- **Path templating is heuristic.** Numeric \u002F UUID \u002F hex \u002F slug patterns are detected per segment. Ambiguous URLs are flagged in `confidence.json`.\n- **Redaction is best-effort.** Default redactions cover common credentials, but app-specific secrets may slip through; use `--redact` for known custom headers\u002Fkeys.\n\n## Best practices\n\n1. **Drive the flows you want documented.** The richer the browser-trace, the richer the spec.\n2. **Use `--origins` for noisy sites.** A marketing page hits dozens of analytics hosts; restrict to the API origin you care about.\n3. **Inspect `report.md` first.** It has curl-ready examples and response samples for every discovered operation.\n4. **Bump `--min-samples` to 2+** when you want only confidently-shaped endpoints in the final doc — drop the long tail.\n5. **Pair with `browse network on`** when response-body schemas matter. The CDP firehose alone has request bodies but not response bodies.\n\nFor pipeline internals and the file format reference, see [REFERENCE.md](REFERENCE.md).\n",{"data":38,"body":41},{"name":4,"description":6,"compatibility":39,"license":29,"allowed-tools":40},"Requires Node 18+ and a `browser-trace` run directory (`.o11y\u002F\u003Crun>\u002F`) produced by the sibling `browser-trace` skill. The scripts use only the Node standard library — no `npm install` step. `jq` is referenced in docs for ad-hoc querying but is not required by the scripts.","Bash, Read, Grep",{"type":42,"children":43},"root",[44,52,75,102,114,121,153,172,178,200,521,562,568,661,696,702,721,741,754,760,1112,1118,1127,1145,1150,1269,1330,1335,1382,1387,1393,1398,1527,1540,1546,1567,1592,1633,1639,1715,1721,1803,1815],{"type":45,"tag":46,"props":47,"children":48},"element","h1",{"id":4},[49],{"type":50,"value":51},"text","Browser to API",{"type":45,"tag":53,"props":54,"children":55},"p",{},[56,58,65,67,73],{"type":50,"value":57},"Replay-driven API discovery. Consume a ",{"type":45,"tag":59,"props":60,"children":62},"code",{"className":61},[],[63],{"type":50,"value":64},"browser-trace",{"type":50,"value":66}," capture, pair its CDP request \u002F response events, templatize observed URLs, infer JSON schemas from samples, and emit an ",{"type":45,"tag":68,"props":69,"children":70},"strong",{},[71],{"type":50,"value":72},"OpenAPI 3.1",{"type":50,"value":74}," document plus a human-readable coverage report.",{"type":45,"tag":53,"props":76,"children":77},{},[78,80,85,87,92,94,100],{"type":50,"value":79},"This skill ",{"type":45,"tag":68,"props":81,"children":82},{},[83],{"type":50,"value":84},"does not capture traffic",{"type":50,"value":86},". It is purely offline post-processing on top of ",{"type":45,"tag":59,"props":88,"children":90},{"className":89},[],[91],{"type":50,"value":64},{"type":50,"value":93},"'s ",{"type":45,"tag":59,"props":95,"children":97},{"className":96},[],[98],{"type":50,"value":99},"cdp\u002Fnetwork\u002F*.jsonl",{"type":50,"value":101}," buckets. The two skills compose:",{"type":45,"tag":103,"props":104,"children":108},"pre",{"className":105,"code":107,"language":50},[106],"language-text","browser-trace    →  .o11y\u002F\u003Crun>\u002Fcdp\u002Fnetwork\u002F{requests,responses}.jsonl\nbrowser-to-api   →  .o11y\u002F\u003Crun>\u002Fapi-spec\u002Findex.html + openapi.yaml + client.mjs\n",[109],{"type":45,"tag":59,"props":110,"children":112},{"__ignoreMap":111},"",[113],{"type":50,"value":107},{"type":45,"tag":115,"props":116,"children":118},"h2",{"id":117},"when-to-use",[119],{"type":50,"value":120},"When to use",{"type":45,"tag":122,"props":123,"children":124},"ul",{},[125,131,143,148],{"type":45,"tag":126,"props":127,"children":128},"li",{},[129],{"type":50,"value":130},"The user wants an OpenAPI document for a third-party or undocumented website API.",{"type":45,"tag":126,"props":132,"children":133},{},[134,136,141],{"type":50,"value":135},"The user has a ",{"type":45,"tag":59,"props":137,"children":139},{"className":138},[],[140],{"type":50,"value":64},{"type":50,"value":142}," run and wants endpoints + schemas extracted from it.",{"type":45,"tag":126,"props":144,"children":145},{},[146],{"type":50,"value":147},"The user is building a client\u002FSDK against a site that doesn't publish a spec.",{"type":45,"tag":126,"props":149,"children":150},{},[151],{"type":50,"value":152},"The user wants a coverage report showing which flows would broaden the spec.",{"type":45,"tag":53,"props":154,"children":155},{},[156,158,163,165,170],{"type":50,"value":157},"If the user wants to ",{"type":45,"tag":68,"props":159,"children":160},{},[161],{"type":50,"value":162},"capture",{"type":50,"value":164}," traffic, send them to ",{"type":45,"tag":59,"props":166,"children":168},{"className":167},[],[169],{"type":50,"value":64},{"type":50,"value":171}," first.",{"type":45,"tag":115,"props":173,"children":175},{"id":174},"two-step-workflow",[176],{"type":50,"value":177},"Two-step workflow",{"type":45,"tag":179,"props":180,"children":182},"h3",{"id":181},"_1-capture-with-browser-trace-and-optionally-bodies-via-browse-network-on",[183,185,190,192,198],{"type":50,"value":184},"1. Capture with ",{"type":45,"tag":59,"props":186,"children":188},{"className":187},[],[189],{"type":50,"value":64},{"type":50,"value":191}," (and optionally bodies via ",{"type":45,"tag":59,"props":193,"children":195},{"className":194},[],[196],{"type":50,"value":197},"browse network on",{"type":50,"value":199},")",{"type":45,"tag":103,"props":201,"children":205},{"className":202,"code":203,"language":204,"meta":111,"style":111},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Local example against an existing debuggable Chrome target\nTARGET=9222\n\nnode ..\u002Fbrowser-trace\u002Fscripts\u002Fstart-capture.mjs \"$TARGET\" my-site\nbrowse open about:blank --cdp \"$TARGET\"\nbrowse network on                                    # capture request\u002Fresponse bodies\nbrowse open https:\u002F\u002Fexample.com\n# ...drive whatever flows you want covered...\n\n# Snapshot the bodies dir BEFORE turning capture off (the temp dir is shared\n# per-session, so subsequent `browse network on` runs would mix your bodies\n# with whatever a future capture writes if you skip this step).\ncp -r \"$(browse network path | jq -r .path)\" .o11y\u002Fmy-site\u002Fcdp\u002Fnetwork\u002Fbodies\u002F\nbrowse network off\n\nnode ..\u002Fbrowser-trace\u002Fscripts\u002Fstop-capture.mjs my-site\nnode ..\u002Fbrowser-trace\u002Fscripts\u002Fbisect-cdp.mjs my-site\n","bash",[206],{"type":45,"tag":59,"props":207,"children":208},{"__ignoreMap":111},[209,221,243,253,288,325,348,365,374,382,391,400,409,462,479,487,504],{"type":45,"tag":210,"props":211,"children":214},"span",{"class":212,"line":213},"line",1,[215],{"type":45,"tag":210,"props":216,"children":218},{"style":217},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[219],{"type":50,"value":220},"# Local example against an existing debuggable Chrome target\n",{"type":45,"tag":210,"props":222,"children":224},{"class":212,"line":223},2,[225,231,237],{"type":45,"tag":210,"props":226,"children":228},{"style":227},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[229],{"type":50,"value":230},"TARGET",{"type":45,"tag":210,"props":232,"children":234},{"style":233},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[235],{"type":50,"value":236},"=",{"type":45,"tag":210,"props":238,"children":240},{"style":239},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[241],{"type":50,"value":242},"9222\n",{"type":45,"tag":210,"props":244,"children":246},{"class":212,"line":245},3,[247],{"type":45,"tag":210,"props":248,"children":250},{"emptyLinePlaceholder":249},true,[251],{"type":50,"value":252},"\n",{"type":45,"tag":210,"props":254,"children":256},{"class":212,"line":255},4,[257,263,268,273,278,283],{"type":45,"tag":210,"props":258,"children":260},{"style":259},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[261],{"type":50,"value":262},"node",{"type":45,"tag":210,"props":264,"children":265},{"style":239},[266],{"type":50,"value":267}," ..\u002Fbrowser-trace\u002Fscripts\u002Fstart-capture.mjs",{"type":45,"tag":210,"props":269,"children":270},{"style":233},[271],{"type":50,"value":272}," \"",{"type":45,"tag":210,"props":274,"children":275},{"style":227},[276],{"type":50,"value":277},"$TARGET",{"type":45,"tag":210,"props":279,"children":280},{"style":233},[281],{"type":50,"value":282},"\"",{"type":45,"tag":210,"props":284,"children":285},{"style":239},[286],{"type":50,"value":287}," my-site\n",{"type":45,"tag":210,"props":289,"children":291},{"class":212,"line":290},5,[292,297,302,307,312,316,320],{"type":45,"tag":210,"props":293,"children":294},{"style":259},[295],{"type":50,"value":296},"browse",{"type":45,"tag":210,"props":298,"children":299},{"style":239},[300],{"type":50,"value":301}," open",{"type":45,"tag":210,"props":303,"children":304},{"style":239},[305],{"type":50,"value":306}," about:blank",{"type":45,"tag":210,"props":308,"children":309},{"style":239},[310],{"type":50,"value":311}," --cdp",{"type":45,"tag":210,"props":313,"children":314},{"style":233},[315],{"type":50,"value":272},{"type":45,"tag":210,"props":317,"children":318},{"style":227},[319],{"type":50,"value":277},{"type":45,"tag":210,"props":321,"children":322},{"style":233},[323],{"type":50,"value":324},"\"\n",{"type":45,"tag":210,"props":326,"children":328},{"class":212,"line":327},6,[329,333,338,343],{"type":45,"tag":210,"props":330,"children":331},{"style":259},[332],{"type":50,"value":296},{"type":45,"tag":210,"props":334,"children":335},{"style":239},[336],{"type":50,"value":337}," network",{"type":45,"tag":210,"props":339,"children":340},{"style":239},[341],{"type":50,"value":342}," on",{"type":45,"tag":210,"props":344,"children":345},{"style":217},[346],{"type":50,"value":347},"                                    # capture request\u002Fresponse bodies\n",{"type":45,"tag":210,"props":349,"children":351},{"class":212,"line":350},7,[352,356,360],{"type":45,"tag":210,"props":353,"children":354},{"style":259},[355],{"type":50,"value":296},{"type":45,"tag":210,"props":357,"children":358},{"style":239},[359],{"type":50,"value":301},{"type":45,"tag":210,"props":361,"children":362},{"style":239},[363],{"type":50,"value":364}," https:\u002F\u002Fexample.com\n",{"type":45,"tag":210,"props":366,"children":368},{"class":212,"line":367},8,[369],{"type":45,"tag":210,"props":370,"children":371},{"style":217},[372],{"type":50,"value":373},"# ...drive whatever flows you want covered...\n",{"type":45,"tag":210,"props":375,"children":377},{"class":212,"line":376},9,[378],{"type":45,"tag":210,"props":379,"children":380},{"emptyLinePlaceholder":249},[381],{"type":50,"value":252},{"type":45,"tag":210,"props":383,"children":385},{"class":212,"line":384},10,[386],{"type":45,"tag":210,"props":387,"children":388},{"style":217},[389],{"type":50,"value":390},"# Snapshot the bodies dir BEFORE turning capture off (the temp dir is shared\n",{"type":45,"tag":210,"props":392,"children":394},{"class":212,"line":393},11,[395],{"type":45,"tag":210,"props":396,"children":397},{"style":217},[398],{"type":50,"value":399},"# per-session, so subsequent `browse network on` runs would mix your bodies\n",{"type":45,"tag":210,"props":401,"children":403},{"class":212,"line":402},12,[404],{"type":45,"tag":210,"props":405,"children":406},{"style":217},[407],{"type":50,"value":408},"# with whatever a future capture writes if you skip this step).\n",{"type":45,"tag":210,"props":410,"children":412},{"class":212,"line":411},13,[413,418,423,428,432,437,442,447,452,457],{"type":45,"tag":210,"props":414,"children":415},{"style":259},[416],{"type":50,"value":417},"cp",{"type":45,"tag":210,"props":419,"children":420},{"style":239},[421],{"type":50,"value":422}," -r",{"type":45,"tag":210,"props":424,"children":425},{"style":233},[426],{"type":50,"value":427}," \"$(",{"type":45,"tag":210,"props":429,"children":430},{"style":259},[431],{"type":50,"value":296},{"type":45,"tag":210,"props":433,"children":434},{"style":239},[435],{"type":50,"value":436}," network path ",{"type":45,"tag":210,"props":438,"children":439},{"style":233},[440],{"type":50,"value":441},"|",{"type":45,"tag":210,"props":443,"children":444},{"style":259},[445],{"type":50,"value":446}," jq",{"type":45,"tag":210,"props":448,"children":449},{"style":239},[450],{"type":50,"value":451}," -r .path",{"type":45,"tag":210,"props":453,"children":454},{"style":233},[455],{"type":50,"value":456},")\"",{"type":45,"tag":210,"props":458,"children":459},{"style":239},[460],{"type":50,"value":461}," .o11y\u002Fmy-site\u002Fcdp\u002Fnetwork\u002Fbodies\u002F\n",{"type":45,"tag":210,"props":463,"children":465},{"class":212,"line":464},14,[466,470,474],{"type":45,"tag":210,"props":467,"children":468},{"style":259},[469],{"type":50,"value":296},{"type":45,"tag":210,"props":471,"children":472},{"style":239},[473],{"type":50,"value":337},{"type":45,"tag":210,"props":475,"children":476},{"style":239},[477],{"type":50,"value":478}," off\n",{"type":45,"tag":210,"props":480,"children":482},{"class":212,"line":481},15,[483],{"type":45,"tag":210,"props":484,"children":485},{"emptyLinePlaceholder":249},[486],{"type":50,"value":252},{"type":45,"tag":210,"props":488,"children":490},{"class":212,"line":489},16,[491,495,500],{"type":45,"tag":210,"props":492,"children":493},{"style":259},[494],{"type":50,"value":262},{"type":45,"tag":210,"props":496,"children":497},{"style":239},[498],{"type":50,"value":499}," ..\u002Fbrowser-trace\u002Fscripts\u002Fstop-capture.mjs",{"type":45,"tag":210,"props":501,"children":502},{"style":239},[503],{"type":50,"value":287},{"type":45,"tag":210,"props":505,"children":507},{"class":212,"line":506},17,[508,512,517],{"type":45,"tag":210,"props":509,"children":510},{"style":259},[511],{"type":50,"value":262},{"type":45,"tag":210,"props":513,"children":514},{"style":239},[515],{"type":50,"value":516}," ..\u002Fbrowser-trace\u002Fscripts\u002Fbisect-cdp.mjs",{"type":45,"tag":210,"props":518,"children":519},{"style":239},[520],{"type":50,"value":287},{"type":45,"tag":53,"props":522,"children":523},{},[524,529,531,536,538,544,546,552,554,560],{"type":45,"tag":59,"props":525,"children":527},{"className":526},[],[528],{"type":50,"value":197},{"type":50,"value":530}," is ",{"type":45,"tag":68,"props":532,"children":533},{},[534],{"type":50,"value":535},"optional but strongly recommended",{"type":50,"value":537}," — without it, the spec has no response-body schemas (the CDP firehose used by ",{"type":45,"tag":59,"props":539,"children":541},{"className":540},[],[542],{"type":50,"value":543},"browse cdp",{"type":50,"value":545}," does not embed bodies). With it, both request bodies (already captured by CDP) ",{"type":45,"tag":547,"props":548,"children":549},"em",{},[550],{"type":50,"value":551},"and",{"type":50,"value":553}," response bodies are joined into the trace by CDP ",{"type":45,"tag":59,"props":555,"children":557},{"className":556},[],[558],{"type":50,"value":559},"requestId",{"type":50,"value":561},".",{"type":45,"tag":179,"props":563,"children":565},{"id":564},"_2-generate-the-spec",[566],{"type":50,"value":567},"2. Generate the spec",{"type":45,"tag":103,"props":569,"children":571},{"className":202,"code":570,"language":204,"meta":111,"style":111},"node scripts\u002Fdiscover.mjs --run .o11y\u002Fmy-site\n# → .o11y\u002Fmy-site\u002Fapi-spec\u002Findex.html          ← open this\n#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fclient.mjs\n#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fopenapi.yaml\n#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fopenapi.json\n#   .o11y\u002Fmy-site\u002Fapi-spec\u002Freport.md\n#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fconfidence.json\n#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fsamples\u002F*.json\n#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fintermediate\u002F*.jsonl\n",[572],{"type":45,"tag":59,"props":573,"children":574},{"__ignoreMap":111},[575,597,605,613,621,629,637,645,653],{"type":45,"tag":210,"props":576,"children":577},{"class":212,"line":213},[578,582,587,592],{"type":45,"tag":210,"props":579,"children":580},{"style":259},[581],{"type":50,"value":262},{"type":45,"tag":210,"props":583,"children":584},{"style":239},[585],{"type":50,"value":586}," scripts\u002Fdiscover.mjs",{"type":45,"tag":210,"props":588,"children":589},{"style":239},[590],{"type":50,"value":591}," --run",{"type":45,"tag":210,"props":593,"children":594},{"style":239},[595],{"type":50,"value":596}," .o11y\u002Fmy-site\n",{"type":45,"tag":210,"props":598,"children":599},{"class":212,"line":223},[600],{"type":45,"tag":210,"props":601,"children":602},{"style":217},[603],{"type":50,"value":604},"# → .o11y\u002Fmy-site\u002Fapi-spec\u002Findex.html          ← open this\n",{"type":45,"tag":210,"props":606,"children":607},{"class":212,"line":245},[608],{"type":45,"tag":210,"props":609,"children":610},{"style":217},[611],{"type":50,"value":612},"#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fclient.mjs\n",{"type":45,"tag":210,"props":614,"children":615},{"class":212,"line":255},[616],{"type":45,"tag":210,"props":617,"children":618},{"style":217},[619],{"type":50,"value":620},"#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fopenapi.yaml\n",{"type":45,"tag":210,"props":622,"children":623},{"class":212,"line":290},[624],{"type":45,"tag":210,"props":625,"children":626},{"style":217},[627],{"type":50,"value":628},"#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fopenapi.json\n",{"type":45,"tag":210,"props":630,"children":631},{"class":212,"line":327},[632],{"type":45,"tag":210,"props":633,"children":634},{"style":217},[635],{"type":50,"value":636},"#   .o11y\u002Fmy-site\u002Fapi-spec\u002Freport.md\n",{"type":45,"tag":210,"props":638,"children":639},{"class":212,"line":350},[640],{"type":45,"tag":210,"props":641,"children":642},{"style":217},[643],{"type":50,"value":644},"#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fconfidence.json\n",{"type":45,"tag":210,"props":646,"children":647},{"class":212,"line":367},[648],{"type":45,"tag":210,"props":649,"children":650},{"style":217},[651],{"type":50,"value":652},"#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fsamples\u002F*.json\n",{"type":45,"tag":210,"props":654,"children":655},{"class":212,"line":376},[656],{"type":45,"tag":210,"props":657,"children":658},{"style":217},[659],{"type":50,"value":660},"#   .o11y\u002Fmy-site\u002Fapi-spec\u002Fintermediate\u002F*.jsonl\n",{"type":45,"tag":53,"props":662,"children":663},{},[664,670,672,678,680,686,688,694],{"type":45,"tag":59,"props":665,"children":667},{"className":666},[],[668],{"type":50,"value":669},"discover.mjs",{"type":50,"value":671}," auto-detects ",{"type":45,"tag":59,"props":673,"children":675},{"className":674},[],[676],{"type":50,"value":677},"\u003Crun>\u002Fcdp\u002Fnetwork\u002Fbodies\u002F",{"type":50,"value":679},". To use a body capture from elsewhere (e.g. didn't snapshot, want the live ",{"type":45,"tag":59,"props":681,"children":683},{"className":682},[],[684],{"type":50,"value":685},"browse network",{"type":50,"value":687}," dir), pass ",{"type":45,"tag":59,"props":689,"children":691},{"className":690},[],[692],{"type":50,"value":693},"--bodies \u003Cpath>",{"type":50,"value":695}," explicitly.",{"type":45,"tag":179,"props":697,"children":699},{"id":698},"_3-open-the-html-report",[700],{"type":50,"value":701},"3. Open the HTML report",{"type":45,"tag":53,"props":703,"children":704},{},[705,707,712,714,719],{"type":50,"value":706},"After ",{"type":45,"tag":59,"props":708,"children":710},{"className":709},[],[711],{"type":50,"value":669},{"type":50,"value":713}," finishes, ",{"type":45,"tag":68,"props":715,"children":716},{},[717],{"type":50,"value":718},"always open the generated HTML report",{"type":50,"value":720},":",{"type":45,"tag":103,"props":722,"children":724},{"className":202,"code":723,"language":204,"meta":111,"style":111},"open .o11y\u002Fmy-site\u002Fapi-spec\u002Findex.html\n",[725],{"type":45,"tag":59,"props":726,"children":727},{"__ignoreMap":111},[728],{"type":45,"tag":210,"props":729,"children":730},{"class":212,"line":213},[731,736],{"type":45,"tag":210,"props":732,"children":733},{"style":259},[734],{"type":50,"value":735},"open",{"type":45,"tag":210,"props":737,"children":738},{"style":239},[739],{"type":50,"value":740}," .o11y\u002Fmy-site\u002Fapi-spec\u002Findex.html\n",{"type":45,"tag":53,"props":742,"children":743},{},[744,746,752],{"type":50,"value":745},"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\u002Fresponse examples, and a generated ",{"type":45,"tag":59,"props":747,"children":749},{"className":748},[],[750],{"type":50,"value":751},"client.mjs",{"type":50,"value":753}," snippet at the bottom. This is the primary deliverable — always open it for the user.",{"type":45,"tag":115,"props":755,"children":757},{"id":756},"cli-flags",[758],{"type":50,"value":759},"CLI flags",{"type":45,"tag":761,"props":762,"children":763},"table",{},[764,788],{"type":45,"tag":765,"props":766,"children":767},"thead",{},[768],{"type":45,"tag":769,"props":770,"children":771},"tr",{},[772,778,783],{"type":45,"tag":773,"props":774,"children":775},"th",{},[776],{"type":50,"value":777},"Flag",{"type":45,"tag":773,"props":779,"children":780},{},[781],{"type":50,"value":782},"Required",{"type":45,"tag":773,"props":784,"children":785},{},[786],{"type":50,"value":787},"Meaning",{"type":45,"tag":789,"props":790,"children":791},"tbody",{},[792,822,850,882,903,924,952,979,1008,1029,1056],{"type":45,"tag":769,"props":793,"children":794},{},[795,805,810],{"type":45,"tag":796,"props":797,"children":798},"td",{},[799],{"type":45,"tag":59,"props":800,"children":802},{"className":801},[],[803],{"type":50,"value":804},"--run \u003Cpath>",{"type":45,"tag":796,"props":806,"children":807},{},[808],{"type":50,"value":809},"yes",{"type":45,"tag":796,"props":811,"children":812},{},[813,815,820],{"type":50,"value":814},"Path to a ",{"type":45,"tag":59,"props":816,"children":818},{"className":817},[],[819],{"type":50,"value":64},{"type":50,"value":821}," run directory",{"type":45,"tag":769,"props":823,"children":824},{},[825,834,839],{"type":45,"tag":796,"props":826,"children":827},{},[828],{"type":45,"tag":59,"props":829,"children":831},{"className":830},[],[832],{"type":50,"value":833},"--out \u003Cpath>",{"type":45,"tag":796,"props":835,"children":836},{},[837],{"type":50,"value":838},"no",{"type":45,"tag":796,"props":840,"children":841},{},[842,844],{"type":50,"value":843},"Output dir; default ",{"type":45,"tag":59,"props":845,"children":847},{"className":846},[],[848],{"type":50,"value":849},"\u003Crun>\u002Fapi-spec\u002F",{"type":45,"tag":769,"props":851,"children":852},{},[853,861,865],{"type":45,"tag":796,"props":854,"children":855},{},[856],{"type":45,"tag":59,"props":857,"children":859},{"className":858},[],[860],{"type":50,"value":693},{"type":45,"tag":796,"props":862,"children":863},{},[864],{"type":50,"value":838},{"type":45,"tag":796,"props":866,"children":867},{},[868,873,875,880],{"type":45,"tag":59,"props":869,"children":871},{"className":870},[],[872],{"type":50,"value":685},{"type":50,"value":874}," capture dir to join into the trace (auto-detected from ",{"type":45,"tag":59,"props":876,"children":878},{"className":877},[],[879],{"type":50,"value":677},{"type":50,"value":881}," when present)",{"type":45,"tag":769,"props":883,"children":884},{},[885,894,898],{"type":45,"tag":796,"props":886,"children":887},{},[888],{"type":45,"tag":59,"props":889,"children":891},{"className":890},[],[892],{"type":50,"value":893},"--include \u003Cregex>",{"type":45,"tag":796,"props":895,"children":896},{},[897],{"type":50,"value":838},{"type":45,"tag":796,"props":899,"children":900},{},[901],{"type":50,"value":902},"Only include URLs matching regex (repeatable)",{"type":45,"tag":769,"props":904,"children":905},{},[906,915,919],{"type":45,"tag":796,"props":907,"children":908},{},[909],{"type":45,"tag":59,"props":910,"children":912},{"className":911},[],[913],{"type":50,"value":914},"--exclude \u003Cregex>",{"type":45,"tag":796,"props":916,"children":917},{},[918],{"type":50,"value":838},{"type":45,"tag":796,"props":920,"children":921},{},[922],{"type":50,"value":923},"Exclude URLs matching regex (repeatable; in addition to defaults)",{"type":45,"tag":769,"props":925,"children":926},{},[927,936,940],{"type":45,"tag":796,"props":928,"children":929},{},[930],{"type":45,"tag":59,"props":931,"children":933},{"className":932},[],[934],{"type":50,"value":935},"--origins \u003Clist>",{"type":45,"tag":796,"props":937,"children":938},{},[939],{"type":50,"value":838},{"type":45,"tag":796,"props":941,"children":942},{},[943,945,951],{"type":50,"value":944},"Comma-separated origin allow-list (e.g. ",{"type":45,"tag":59,"props":946,"children":948},{"className":947},[],[949],{"type":50,"value":950},"api.example.com,example.com",{"type":50,"value":199},{"type":45,"tag":769,"props":953,"children":954},{},[955,964,968],{"type":45,"tag":796,"props":956,"children":957},{},[958],{"type":45,"tag":59,"props":959,"children":961},{"className":960},[],[962],{"type":50,"value":963},"--format \u003Cyaml|json|both>",{"type":45,"tag":796,"props":965,"children":966},{},[967],{"type":50,"value":838},{"type":45,"tag":796,"props":969,"children":970},{},[971,973],{"type":50,"value":972},"Output format. Default ",{"type":45,"tag":59,"props":974,"children":976},{"className":975},[],[977],{"type":50,"value":978},"both",{"type":45,"tag":769,"props":980,"children":981},{},[982,991,995],{"type":45,"tag":796,"props":983,"children":984},{},[985],{"type":45,"tag":59,"props":986,"children":988},{"className":987},[],[989],{"type":50,"value":990},"--title \u003Cstring>",{"type":45,"tag":796,"props":992,"children":993},{},[994],{"type":50,"value":838},{"type":45,"tag":796,"props":996,"children":997},{},[998,1000,1006],{"type":50,"value":999},"OpenAPI ",{"type":45,"tag":59,"props":1001,"children":1003},{"className":1002},[],[1004],{"type":50,"value":1005},"info.title",{"type":50,"value":1007},". Default derived from primary origin",{"type":45,"tag":769,"props":1009,"children":1010},{},[1011,1020,1024],{"type":45,"tag":796,"props":1012,"children":1013},{},[1014],{"type":45,"tag":59,"props":1015,"children":1017},{"className":1016},[],[1018],{"type":50,"value":1019},"--redact \u003Clist>",{"type":45,"tag":796,"props":1021,"children":1022},{},[1023],{"type":50,"value":838},{"type":45,"tag":796,"props":1025,"children":1026},{},[1027],{"type":50,"value":1028},"Extra header names \u002F JSON keys to redact (comma-separated)",{"type":45,"tag":769,"props":1030,"children":1031},{},[1032,1041,1045],{"type":45,"tag":796,"props":1033,"children":1034},{},[1035],{"type":45,"tag":59,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":50,"value":1040},"--min-samples \u003Cn>",{"type":45,"tag":796,"props":1042,"children":1043},{},[1044],{"type":50,"value":838},{"type":45,"tag":796,"props":1046,"children":1047},{},[1048,1050],{"type":50,"value":1049},"Minimum samples per endpoint to include. Default ",{"type":45,"tag":59,"props":1051,"children":1053},{"className":1052},[],[1054],{"type":50,"value":1055},"1",{"type":45,"tag":769,"props":1057,"children":1058},{},[1059,1068,1072],{"type":45,"tag":796,"props":1060,"children":1061},{},[1062],{"type":45,"tag":59,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":50,"value":1067},"--stage \u003Cname>",{"type":45,"tag":796,"props":1069,"children":1070},{},[1071],{"type":50,"value":838},{"type":45,"tag":796,"props":1073,"children":1074},{},[1075,1077,1083,1085,1091,1092,1098,1099,1105,1106],{"type":50,"value":1076},"Run only one stage: ",{"type":45,"tag":59,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":50,"value":1082},"load",{"type":50,"value":1084},", ",{"type":45,"tag":59,"props":1086,"children":1088},{"className":1087},[],[1089],{"type":50,"value":1090},"filter",{"type":50,"value":1084},{"type":45,"tag":59,"props":1093,"children":1095},{"className":1094},[],[1096],{"type":50,"value":1097},"normalize",{"type":50,"value":1084},{"type":45,"tag":59,"props":1100,"children":1102},{"className":1101},[],[1103],{"type":50,"value":1104},"infer",{"type":50,"value":1084},{"type":45,"tag":59,"props":1107,"children":1109},{"className":1108},[],[1110],{"type":50,"value":1111},"emit",{"type":45,"tag":115,"props":1113,"children":1115},{"id":1114},"output-layout",[1116],{"type":50,"value":1117},"Output layout",{"type":45,"tag":103,"props":1119,"children":1122},{"className":1120,"code":1121,"language":50},[106],"\u003Crun>\u002Fapi-spec\u002F\n├── index.html                visual report — open this (self-contained, no server)\n├── client.mjs                zero-dep fetch client with typed functions per operation\n├── openapi.yaml              machine-readable spec\n├── openapi.json              mirror\n├── report.md                 markdown summary + curl examples\n├── confidence.json           per-endpoint confidence + normalization flags\n├── samples\u002F                  redacted request\u002Fresponse examples\n│   └── \u003Cmethod>__\u003Cpath-hash>.json\n└── intermediate\u002F             pipeline byproducts (paired\u002Ffiltered\u002Fendpoints jsonl)\n",[1123],{"type":45,"tag":59,"props":1124,"children":1125},{"__ignoreMap":111},[1126],{"type":50,"value":1121},{"type":45,"tag":115,"props":1128,"children":1130},{"id":1129},"what-you-get-from-browse-cdp-and-browse-network",[1131,1133,1138,1140],{"type":50,"value":1132},"What you get from ",{"type":45,"tag":59,"props":1134,"children":1136},{"className":1135},[],[1137],{"type":50,"value":543},{"type":50,"value":1139}," and ",{"type":45,"tag":59,"props":1141,"children":1143},{"className":1142},[],[1144],{"type":50,"value":685},{"type":45,"tag":53,"props":1146,"children":1147},{},[1148],{"type":50,"value":1149},"Two complementary capture sources:",{"type":45,"tag":761,"props":1151,"children":1152},{},[1153,1174],{"type":45,"tag":765,"props":1154,"children":1155},{},[1156],{"type":45,"tag":769,"props":1157,"children":1158},{},[1159,1164,1169],{"type":45,"tag":773,"props":1160,"children":1161},{},[1162],{"type":50,"value":1163},"Source",{"type":45,"tag":773,"props":1165,"children":1166},{},[1167],{"type":50,"value":1168},"Provides",{"type":45,"tag":773,"props":1170,"children":1171},{},[1172],{"type":50,"value":1173},"Limitation",{"type":45,"tag":789,"props":1175,"children":1176},{},[1177,1227],{"type":45,"tag":769,"props":1178,"children":1179},{},[1180,1196,1209],{"type":45,"tag":796,"props":1181,"children":1182},{},[1183,1188,1190,1195],{"type":45,"tag":59,"props":1184,"children":1186},{"className":1185},[],[1187],{"type":50,"value":543},{"type":50,"value":1189}," (used by ",{"type":45,"tag":59,"props":1191,"children":1193},{"className":1192},[],[1194],{"type":50,"value":64},{"type":50,"value":199},{"type":45,"tag":796,"props":1197,"children":1198},{},[1199,1201,1207],{"type":50,"value":1200},"request method\u002FURL\u002Fheaders\u002F",{"type":45,"tag":59,"props":1202,"children":1204},{"className":1203},[],[1205],{"type":50,"value":1206},"postData",{"type":50,"value":1208},", response status\u002Fheaders\u002FmimeType, full event timing",{"type":45,"tag":796,"props":1210,"children":1211},{},[1212,1217,1219,1225],{"type":45,"tag":68,"props":1213,"children":1214},{},[1215],{"type":50,"value":1216},"Does not embed response bodies.",{"type":50,"value":1218}," Bodies must be pulled with ",{"type":45,"tag":59,"props":1220,"children":1222},{"className":1221},[],[1223],{"type":50,"value":1224},"Network.getResponseBody",{"type":50,"value":1226},", which the firehose doesn't do.",{"type":45,"tag":769,"props":1228,"children":1229},{},[1230,1240,1250],{"type":45,"tag":796,"props":1231,"children":1232},{},[1233,1238],{"type":45,"tag":59,"props":1234,"children":1236},{"className":1235},[],[1237],{"type":50,"value":197},{"type":50,"value":1239}," (separate command)",{"type":45,"tag":796,"props":1241,"children":1242},{},[1243,1245],{"type":50,"value":1244},"request bodies AND response bodies on disk, keyed by CDP ",{"type":45,"tag":59,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":50,"value":559},{"type":45,"tag":796,"props":1251,"children":1252},{},[1253,1255,1260,1262,1267],{"type":50,"value":1254},"Capture dir is shared per ",{"type":45,"tag":59,"props":1256,"children":1258},{"className":1257},[],[1259],{"type":50,"value":296},{"type":50,"value":1261}," session; snapshot before another ",{"type":45,"tag":59,"props":1263,"children":1265},{"className":1264},[],[1266],{"type":50,"value":197},{"type":50,"value":1268}," overwrites it.",{"type":45,"tag":53,"props":1270,"children":1271},{},[1272,1277,1279,1284,1286,1291,1293,1298,1300,1305,1307,1312,1314,1320,1322,1328],{"type":45,"tag":59,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":50,"value":669},{"type":50,"value":1278}," will pull bodies from a ",{"type":45,"tag":59,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":50,"value":685},{"type":50,"value":1285}," dir if you pass ",{"type":45,"tag":59,"props":1287,"children":1289},{"className":1288},[],[1290],{"type":50,"value":693},{"type":50,"value":1292}," (or stash them under ",{"type":45,"tag":59,"props":1294,"children":1296},{"className":1295},[],[1297],{"type":50,"value":677},{"type":50,"value":1299},", which is auto-detected). The matching is by ",{"type":45,"tag":59,"props":1301,"children":1303},{"className":1302},[],[1304],{"type":50,"value":559},{"type":50,"value":1306}," — ",{"type":45,"tag":59,"props":1308,"children":1310},{"className":1309},[],[1311],{"type":50,"value":685},{"type":50,"value":1313}," writes that into each ",{"type":45,"tag":59,"props":1315,"children":1317},{"className":1316},[],[1318],{"type":50,"value":1319},"request.json",{"type":50,"value":1321}," as ",{"type":45,"tag":59,"props":1323,"children":1325},{"className":1324},[],[1326],{"type":50,"value":1327},"id",{"type":50,"value":1329},", and we join directly.",{"type":45,"tag":53,"props":1331,"children":1332},{},[1333],{"type":50,"value":1334},"What changes when bodies are present:",{"type":45,"tag":122,"props":1336,"children":1337},{},[1338,1343,1362],{"type":45,"tag":126,"props":1339,"children":1340},{},[1341],{"type":50,"value":1342},"✅ Path templating, query-param schemas, status codes, content-types — same either way.",{"type":45,"tag":126,"props":1344,"children":1345},{},[1346,1348,1353,1355,1360],{"type":50,"value":1347},"✅ Request-body schemas — ",{"type":45,"tag":59,"props":1349,"children":1351},{"className":1350},[],[1352],{"type":50,"value":1206},{"type":50,"value":1354}," from CDP is enough; bodies dir is a nice-to-have for non-",{"type":45,"tag":59,"props":1356,"children":1358},{"className":1357},[],[1359],{"type":50,"value":1206},{"type":50,"value":1361}," cases.",{"type":45,"tag":126,"props":1363,"children":1364},{},[1365,1367,1372,1374,1380],{"type":50,"value":1366},"✅ ",{"type":45,"tag":68,"props":1368,"children":1369},{},[1370],{"type":50,"value":1371},"Response-body schemas",{"type":50,"value":1373}," — fully inferred from real samples. Without bodies you get ",{"type":45,"tag":59,"props":1375,"children":1377},{"className":1376},[],[1378],{"type":50,"value":1379},"{ description, content: \u003CmimeType> }",{"type":50,"value":1381}," skeletons.",{"type":45,"tag":53,"props":1383,"children":1384},{},[1385],{"type":50,"value":1386},"The report flags every endpoint that has no response-body sample.",{"type":45,"tag":115,"props":1388,"children":1390},{"id":1389},"automatic-noise-filtering",[1391],{"type":50,"value":1392},"Automatic noise filtering",{"type":45,"tag":53,"props":1394,"children":1395},{},[1396],{"type":50,"value":1397},"The normalize stage automatically classifies and drops infrastructure noise:",{"type":45,"tag":122,"props":1399,"children":1400},{},[1401,1452,1478,1502],{"type":45,"tag":126,"props":1402,"children":1403},{},[1404,1409,1411,1417,1418,1424,1425,1431,1432,1438,1439,1445,1446],{"type":45,"tag":68,"props":1405,"children":1406},{},[1407],{"type":50,"value":1408},"Tracking \u002F analytics",{"type":50,"value":1410}," — paths containing ",{"type":45,"tag":59,"props":1412,"children":1414},{"className":1413},[],[1415],{"type":50,"value":1416},"\u002Ftrack",{"type":50,"value":1084},{"type":45,"tag":59,"props":1419,"children":1421},{"className":1420},[],[1422],{"type":50,"value":1423},"\u002Fpixel",{"type":50,"value":1084},{"type":45,"tag":59,"props":1426,"children":1428},{"className":1427},[],[1429],{"type":50,"value":1430},"\u002Fbeacon",{"type":50,"value":1084},{"type":45,"tag":59,"props":1433,"children":1435},{"className":1434},[],[1436],{"type":50,"value":1437},"\u002Fimpression",{"type":50,"value":1084},{"type":45,"tag":59,"props":1440,"children":1442},{"className":1441},[],[1443],{"type":50,"value":1444},"\u002Fpageview",{"type":50,"value":1084},{"type":45,"tag":59,"props":1447,"children":1449},{"className":1448},[],[1450],{"type":50,"value":1451},"\u002Fdag\u002Fv*",{"type":45,"tag":126,"props":1453,"children":1454},{},[1455,1460,1462,1468,1470,1476],{"type":45,"tag":68,"props":1456,"children":1457},{},[1458],{"type":50,"value":1459},"Bot defense",{"type":50,"value":1461}," — Akamai (",{"type":45,"tag":59,"props":1463,"children":1465},{"className":1464},[],[1466],{"type":50,"value":1467},"\u002Fakam\u002F",{"type":50,"value":1469},"), fingerprint payloads (",{"type":45,"tag":59,"props":1471,"children":1473},{"className":1472},[],[1474],{"type":50,"value":1475},"sensor_data",{"type":50,"value":1477},"), obfuscated multi-segment paths",{"type":45,"tag":126,"props":1479,"children":1480},{},[1481,1486,1487,1493,1494,1500],{"type":45,"tag":68,"props":1482,"children":1483},{},[1484],{"type":50,"value":1485},"Session plumbing",{"type":50,"value":1306},{"type":45,"tag":59,"props":1488,"children":1490},{"className":1489},[],[1491],{"type":50,"value":1492},"\u002Fsession",{"type":50,"value":1084},{"type":45,"tag":59,"props":1495,"children":1497},{"className":1496},[],[1498],{"type":50,"value":1499},"\u002Fauthenticate\u002Fstart",{"type":50,"value":1501},", cookie consent, A\u002FB experiment endpoints",{"type":45,"tag":126,"props":1503,"children":1504},{},[1505,1510,1511,1517,1519,1525],{"type":45,"tag":68,"props":1506,"children":1507},{},[1508],{"type":50,"value":1509},"HTML page renders",{"type":50,"value":1306},{"type":45,"tag":59,"props":1512,"children":1514},{"className":1513},[],[1515],{"type":50,"value":1516},"GET",{"type":50,"value":1518}," requests returning ",{"type":45,"tag":59,"props":1520,"children":1522},{"className":1521},[],[1523],{"type":50,"value":1524},"text\u002Fhtml",{"type":50,"value":1526}," (the rendered page, not the API)",{"type":45,"tag":53,"props":1528,"children":1529},{},[1530,1532,1538],{"type":50,"value":1531},"This typically drops 60-80% of captured traffic. The ",{"type":45,"tag":59,"props":1533,"children":1535},{"className":1534},[],[1536],{"type":50,"value":1537},"--include",{"type":50,"value":1539}," flag can rescue a false positive.",{"type":45,"tag":115,"props":1541,"children":1543},{"id":1542},"graphql-multiplexed-endpoint-decomposition",[1544],{"type":50,"value":1545},"GraphQL \u002F multiplexed endpoint decomposition",{"type":45,"tag":53,"props":1547,"children":1548},{},[1549,1551,1557,1559,1565],{"type":50,"value":1550},"When a single endpoint (like ",{"type":45,"tag":59,"props":1552,"children":1554},{"className":1553},[],[1555],{"type":50,"value":1556},"\u002Fdapi\u002Ffe\u002Fgql",{"type":50,"value":1558},") is called with different ",{"type":45,"tag":59,"props":1560,"children":1562},{"className":1561},[],[1563],{"type":50,"value":1564},"operationName",{"type":50,"value":1566}," values, the skill automatically splits it into separate logical operations. Each gets its own:",{"type":45,"tag":122,"props":1568,"children":1569},{},[1570,1582,1587],{"type":45,"tag":126,"props":1571,"children":1572},{},[1573,1575,1581],{"type":50,"value":1574},"OpenAPI path entry (e.g. ",{"type":45,"tag":59,"props":1576,"children":1578},{"className":1577},[],[1579],{"type":50,"value":1580},"\u002Fdapi\u002Ffe\u002Fgql [Autocomplete]",{"type":50,"value":199},{"type":45,"tag":126,"props":1583,"children":1584},{},[1585],{"type":50,"value":1586},"Request\u002Fresponse schema inferred from only that operation's samples",{"type":45,"tag":126,"props":1588,"children":1589},{},[1590],{"type":50,"value":1591},"Curl example and variables table in the report",{"type":45,"tag":53,"props":1593,"children":1594},{},[1595,1597,1602,1603,1609,1610,1616,1618,1624,1625,1631],{"type":50,"value":1596},"Detection works on body fields (",{"type":45,"tag":59,"props":1598,"children":1600},{"className":1599},[],[1601],{"type":50,"value":1564},{"type":50,"value":1084},{"type":45,"tag":59,"props":1604,"children":1606},{"className":1605},[],[1607],{"type":50,"value":1608},"method",{"type":50,"value":1084},{"type":45,"tag":59,"props":1611,"children":1613},{"className":1612},[],[1614],{"type":50,"value":1615},"action",{"type":50,"value":1617},") and query params (",{"type":45,"tag":59,"props":1619,"children":1621},{"className":1620},[],[1622],{"type":50,"value":1623},"opname",{"type":50,"value":1084},{"type":45,"tag":59,"props":1626,"children":1628},{"className":1627},[],[1629],{"type":50,"value":1630},"op",{"type":50,"value":1632},"). This covers GraphQL (APQ and inline), JSON-RPC, and similar dispatch patterns.",{"type":45,"tag":115,"props":1634,"children":1636},{"id":1635},"limitations",[1637],{"type":50,"value":1638},"Limitations",{"type":45,"tag":122,"props":1640,"children":1641},{},[1642,1652,1662,1680,1697],{"type":45,"tag":126,"props":1643,"children":1644},{},[1645,1650],{"type":45,"tag":68,"props":1646,"children":1647},{},[1648],{"type":50,"value":1649},"Coverage is bounded by the captured flow.",{"type":50,"value":1651}," Endpoints not exercised in the trace will not appear. The skill cannot prove completeness.",{"type":45,"tag":126,"props":1653,"children":1654},{},[1655,1660],{"type":45,"tag":68,"props":1656,"children":1657},{},[1658],{"type":50,"value":1659},"Schemas are inductive, not contractual.",{"type":50,"value":1661}," A field might be optional on the server even if every sample contained it.",{"type":45,"tag":126,"props":1663,"children":1664},{},[1665,1670,1672,1678],{"type":45,"tag":68,"props":1666,"children":1667},{},[1668],{"type":50,"value":1669},"Auth is observed, not specified.",{"type":50,"value":1671}," The skill records auth-shaped headers in an ",{"type":45,"tag":59,"props":1673,"children":1675},{"className":1674},[],[1676],{"type":50,"value":1677},"x-observed-auth",{"type":50,"value":1679}," extension but won't claim a security scheme.",{"type":45,"tag":126,"props":1681,"children":1682},{},[1683,1688,1690,1696],{"type":45,"tag":68,"props":1684,"children":1685},{},[1686],{"type":50,"value":1687},"Path templating is heuristic.",{"type":50,"value":1689}," Numeric \u002F UUID \u002F hex \u002F slug patterns are detected per segment. Ambiguous URLs are flagged in ",{"type":45,"tag":59,"props":1691,"children":1693},{"className":1692},[],[1694],{"type":50,"value":1695},"confidence.json",{"type":50,"value":561},{"type":45,"tag":126,"props":1698,"children":1699},{},[1700,1705,1707,1713],{"type":45,"tag":68,"props":1701,"children":1702},{},[1703],{"type":50,"value":1704},"Redaction is best-effort.",{"type":50,"value":1706}," Default redactions cover common credentials, but app-specific secrets may slip through; use ",{"type":45,"tag":59,"props":1708,"children":1710},{"className":1709},[],[1711],{"type":50,"value":1712},"--redact",{"type":50,"value":1714}," for known custom headers\u002Fkeys.",{"type":45,"tag":115,"props":1716,"children":1718},{"id":1717},"best-practices",[1719],{"type":50,"value":1720},"Best practices",{"type":45,"tag":1722,"props":1723,"children":1724},"ol",{},[1725,1735,1753,1770,1788],{"type":45,"tag":126,"props":1726,"children":1727},{},[1728,1733],{"type":45,"tag":68,"props":1729,"children":1730},{},[1731],{"type":50,"value":1732},"Drive the flows you want documented.",{"type":50,"value":1734}," The richer the browser-trace, the richer the spec.",{"type":45,"tag":126,"props":1736,"children":1737},{},[1738,1751],{"type":45,"tag":68,"props":1739,"children":1740},{},[1741,1743,1749],{"type":50,"value":1742},"Use ",{"type":45,"tag":59,"props":1744,"children":1746},{"className":1745},[],[1747],{"type":50,"value":1748},"--origins",{"type":50,"value":1750}," for noisy sites.",{"type":50,"value":1752}," A marketing page hits dozens of analytics hosts; restrict to the API origin you care about.",{"type":45,"tag":126,"props":1754,"children":1755},{},[1756,1768],{"type":45,"tag":68,"props":1757,"children":1758},{},[1759,1761,1767],{"type":50,"value":1760},"Inspect ",{"type":45,"tag":59,"props":1762,"children":1764},{"className":1763},[],[1765],{"type":50,"value":1766},"report.md",{"type":50,"value":171},{"type":50,"value":1769}," It has curl-ready examples and response samples for every discovered operation.",{"type":45,"tag":126,"props":1771,"children":1772},{},[1773,1786],{"type":45,"tag":68,"props":1774,"children":1775},{},[1776,1778,1784],{"type":50,"value":1777},"Bump ",{"type":45,"tag":59,"props":1779,"children":1781},{"className":1780},[],[1782],{"type":50,"value":1783},"--min-samples",{"type":50,"value":1785}," to 2+",{"type":50,"value":1787}," when you want only confidently-shaped endpoints in the final doc — drop the long tail.",{"type":45,"tag":126,"props":1789,"children":1790},{},[1791,1801],{"type":45,"tag":68,"props":1792,"children":1793},{},[1794,1796],{"type":50,"value":1795},"Pair with ",{"type":45,"tag":59,"props":1797,"children":1799},{"className":1798},[],[1800],{"type":50,"value":197},{"type":50,"value":1802}," when response-body schemas matter. The CDP firehose alone has request bodies but not response bodies.",{"type":45,"tag":53,"props":1804,"children":1805},{},[1806,1808,1814],{"type":50,"value":1807},"For pipeline internals and the file format reference, see ",{"type":45,"tag":1809,"props":1810,"children":1812},"a",{"href":1811},"REFERENCE.md",[1813],{"type":50,"value":1811},{"type":50,"value":561},{"type":45,"tag":1816,"props":1817,"children":1818},"style",{},[1819],{"type":50,"value":1820},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1822,"total":506},[1823,1836,1859,1872,1882,1890,1904,1922,1942,1956,1968,1981],{"slug":296,"name":296,"fn":1824,"description":1825,"org":1826,"tags":1827,"stars":1833,"repoUrl":1834,"updatedAt":1835},"run Browserbase browser automation","Use the browse CLI for Browserbase browser automation, Browserbase cloud APIs, Browserbase Functions, templates, web fetch\u002Fsearch, diagnostics, and Browse.sh skill discovery\u002Finstallation. Use when the user asks to navigate pages, inspect browser state, run local or remote browser sessions, manage Browserbase resources, call Browserbase Functions, browse or scaffold Browserbase templates, fetch or search web content, diagnose browse setup, find or install a skill for a website task, discover site-specific Browse.sh skills, or install\u002Frefresh this browse skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1828,1829,1830],{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},{"name":1831,"slug":1832,"type":15},"CLI","cli",23676,"https:\u002F\u002Fgithub.com\u002Fbrowserbase\u002Fstagehand","2026-06-06T07:11:24.95733",{"slug":1837,"name":1837,"fn":1838,"description":1839,"org":1840,"tags":1841,"stars":26,"repoUrl":27,"updatedAt":1858},"agent-experience","audit developer experience with AI agents","Audit the developer experience of a product, SDK, docs site, or SKILL.md by dropping multiple Claude subagents at it with only a tiny task prompt and real tools (WebFetch, Bash, Write). Agents must discover the docs themselves, install deps, ask for credentials if needed, and attempt real execution. The skill captures each agent's trace — tool calls, retries, wall time, errors — and scores on Setup Friction, Speed, Efficiency, Error Recovery, and Doc Quality, then emits an HTML report with an A–F grade and concrete fixes. Use when the user asks to audit agent experience, test a skill, audit docs for agents, check if a SDK is agent-friendly, validate a SKILL.md, measure agent DX, or benchmark how painful onboarding is for an AI agent. Triggers: 'audit agent experience', 'test this skill', 'audit docs for agents', 'is my SDK agent-friendly', 'run a DX audit', 'agent experience test', 'test my docs', 'how do agents do with my product'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1842,1845,1848,1849,1852,1855],{"name":1843,"slug":1844,"type":15},"Agents","agents",{"name":1846,"slug":1847,"type":15},"Audit","audit",{"name":9,"slug":8,"type":15},{"name":1850,"slug":1851,"type":15},"Engineering","engineering",{"name":1853,"slug":1854,"type":15},"Multi-Agent","multi-agent",{"name":1856,"slug":1857,"type":15},"QA","qa","2026-05-29T06:58:56.259807",{"slug":1860,"name":1860,"fn":1861,"description":1862,"org":1863,"tags":1864,"stars":26,"repoUrl":27,"updatedAt":1871},"autobrowse","run self-improving browser automation","Self-improving browser automation via the auto-research loop. Iteratively runs a browsing task, reads the trace, and improves the navigation skill (strategy.md) until it reliably passes. Supports parallel runs across multiple tasks using sub-agents. Use when you want to build or improve browser automation skills for specific website tasks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1865,1866,1869,1870],{"name":1843,"slug":1844,"type":15},{"name":1867,"slug":1868,"type":15},"Automation","automation",{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},"2026-04-23T05:00:30.528336",{"slug":1873,"name":1873,"fn":1874,"description":1875,"org":1876,"tags":1877,"stars":26,"repoUrl":27,"updatedAt":1881},"browser","automate browser interactions via CLI","Automate web browser interactions using natural language via CLI commands. Use when the user asks to browse websites, navigate web pages, extract data from websites, take screenshots, fill forms, click buttons, or interact with web applications. Supports remote Browserbase sessions with Browserbase Identity, Verified browsers, automatic CAPTCHA solving, and residential proxies — ideal for protected websites and JavaScript-heavy pages.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1878,1879,1880],{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},{"name":1831,"slug":1832,"type":15},"2026-04-06T18:06:22.005051",{"slug":4,"name":4,"fn":5,"description":6,"org":1883,"tags":1884,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1885,1886,1887,1888,1889],{"name":18,"slug":19,"type":15},{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":21,"slug":22,"type":15},{"slug":64,"name":64,"fn":1891,"description":1892,"org":1893,"tags":1894,"stars":26,"repoUrl":27,"updatedAt":1903},"capture and debug browser automation traces","Capture a full DevTools-protocol trace of any browser automation — CDP firehose, screenshots, and DOM dumps — then bisect the stream into per-page searchable buckets. Use when the user wants to debug a failed run, audit network\u002Fconsole\u002FDOM activity, attach a trace to an in-progress session, or feed structured per-page summaries back into an agent loop so its next iteration learns from the last one.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1895,1896,1897,1900],{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},{"name":1898,"slug":1899,"type":15},"Debugging","debugging",{"name":1901,"slug":1902,"type":15},"Observability","observability","2026-04-28T05:41:33.024656",{"slug":1905,"name":1905,"fn":1906,"description":1907,"org":1908,"tags":1909,"stars":26,"repoUrl":27,"updatedAt":1921},"browser-use-to-stagehand","migrate browser-use scripts to Stagehand","Migrate browser-use (Python) browser-automation scripts to Stagehand v3 (TypeScript) on Browserbase. Use when the user wants to convert, port, rewrite, or migrate a browser-use Agent script to Stagehand, map browser-use features\u002FAPIs to Stagehand primitives (act\u002Fextract\u002Fobserve\u002Fagent), or move agentic browser automation onto Browserbase with more determinism. Triggers on \"browser-use\", \"browser_use\", or \"Agent(task=...)\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1910,1911,1912,1915,1918],{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},{"name":1913,"slug":1914,"type":15},"Migration","migration",{"name":1916,"slug":1917,"type":15},"Python","python",{"name":1919,"slug":1920,"type":15},"TypeScript","typescript","2026-06-26T07:57:47.428249",{"slug":1923,"name":1923,"fn":1924,"description":1925,"org":1926,"tags":1927,"stars":26,"repoUrl":27,"updatedAt":1941},"company-research","conduct deep company and product research","Company discovery and deep research skill. Researches a company's product and ICP,\ndiscovers target companies to sell to using Browserbase Search API, deeply researches\neach using a Plan→Research→Synthesize pattern, and scores ICP fit — compiled into\na scored research report and CSV. Supports depth modes (quick\u002Fdeep\u002Fdeeper) for\nbalancing scale vs intelligence.\nUse when the user wants to: (1) find companies to sell to, (2) research potential\ncustomers, (3) discover companies matching an ICP, (4) build a target company list,\n(5) do market research on prospects. Triggers: \"find companies to sell to\",\n\"company research\", \"find prospects\", \"ICP research\", \"target companies\",\n\"who should we sell to\", \"market research\", \"lead research\", \"prospect list\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1928,1929,1932,1935,1938],{"name":9,"slug":8,"type":15},{"name":1930,"slug":1931,"type":15},"Competitive Intelligence","competitive-intelligence",{"name":1933,"slug":1934,"type":15},"Marketing","marketing",{"name":1936,"slug":1937,"type":15},"Research","research",{"name":1939,"slug":1940,"type":15},"Sales","sales","2026-04-27T05:34:56.172569",{"slug":1943,"name":1943,"fn":1944,"description":1945,"org":1946,"tags":1947,"stars":26,"repoUrl":27,"updatedAt":1955},"competitor-analysis","analyze competitors across features and pricing","Competitor research and intelligence skill. Takes a user's company (with optional\nseed competitor URLs), auto-discovers additional competitors via Browserbase Search API,\ndeeply researches each using a 4-lane pattern (marketing surface, external signal,\npublic benchmarks, strategic diff vs the user's company), and compiles the results\ninto an HTML report with four views: overview, per-competitor deep dive, side-by-side\nfeature\u002Fpricing matrix, and a chronological mentions feed (news, reviews,\nsocial, comparison pages, and public benchmarks).\nUse when the user wants to: (1) analyze competitors, (2) build a competitive matrix,\n(3) extract competitor pricing \u002F features, (4) find comparison pages and online\nmentions of competitors, (5) surface public benchmarks. Triggers: \"competitor analysis\",\n\"analyze competitors\", \"competitive intel\", \"competitor research\", \"competitor pricing\",\n\"feature comparison\", \"price comparison\", \"find comparisons\", \"who's comparing us\",\n\"competitor mentions\", \"competitor benchmarks\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1948,1949,1950,1951,1952],{"name":9,"slug":8,"type":15},{"name":1930,"slug":1931,"type":15},{"name":1933,"slug":1934,"type":15},{"name":1936,"slug":1937,"type":15},{"name":1953,"slug":1954,"type":15},"Strategy","strategy","2026-06-19T09:41:33.392499",{"slug":1957,"name":1957,"fn":1958,"description":1959,"org":1960,"tags":1961,"stars":26,"repoUrl":27,"updatedAt":1967},"cookie-sync","sync Chrome cookies to a Browserbase context","Sync cookies from local Chrome to a Browserbase persistent context so the browse CLI can access authenticated sites. Use when the user wants to browse as themselves, sync cookies, or log into sites via Browserbase.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1962,1965,1966],{"name":1963,"slug":1964,"type":15},"Auth","auth",{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:06:23.3251",{"slug":1969,"name":1969,"fn":1970,"description":1971,"org":1972,"tags":1973,"stars":26,"repoUrl":27,"updatedAt":1980},"event-prospecting","research event speakers for sales prospecting","Event prospecting skill. Takes a conference \u002F event speakers URL,\nextracts the people, filters their companies against the user's\nICP, then deep-researches only the speakers at ICP-fit companies.\nOutputs a person-first HTML report where each card answers \"why\nshould the AE talk to this person?\" with all public links and a\none-click DM opener.\nUse when the user wants to: (1) find leads at a specific\nconference, (2) prep for an event, (3) research event speakers,\n(4) build a target list from a sponsor\u002Fexhibitor page,\n(5) scrape conference speakers and rank by ICP fit.\nTriggers: \"find leads at {event}\", \"research speakers at\",\n\"prospect this conference\", \"stripe sessions leads\",\n\"ai engineer summit prospects\", \"event prospecting\",\n\"scrape conference speakers\", \"who should I meet at\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1974,1975,1978,1979],{"name":9,"slug":8,"type":15},{"name":1976,"slug":1977,"type":15},"Prospecting","prospecting",{"name":1936,"slug":1937,"type":15},{"name":1939,"slug":1940,"type":15},"2026-04-28T05:41:31.770467",{"slug":1982,"name":1982,"fn":1983,"description":1984,"org":1985,"tags":1986,"stars":26,"repoUrl":27,"updatedAt":1991},"fetch","fetch URLs without a browser session","Use this skill when the user wants to retrieve a URL without a full browser session: fetch HTML or JSON from static pages, inspect status codes or headers, follow redirects, or get page source for simple scraping. Prefer it over a browser when JavaScript rendering and page interaction are not needed. Supports proxies and redirect control.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1987,1988],{"name":13,"slug":14,"type":15},{"name":1989,"slug":1990,"type":15},"Web Scraping","web-scraping","2026-04-06T18:06:19.462477",{"items":1993,"total":489},[1994,2003,2010,2016,2024,2031,2039],{"slug":1837,"name":1837,"fn":1838,"description":1839,"org":1995,"tags":1996,"stars":26,"repoUrl":27,"updatedAt":1858},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1997,1998,1999,2000,2001,2002],{"name":1843,"slug":1844,"type":15},{"name":1846,"slug":1847,"type":15},{"name":9,"slug":8,"type":15},{"name":1850,"slug":1851,"type":15},{"name":1853,"slug":1854,"type":15},{"name":1856,"slug":1857,"type":15},{"slug":1860,"name":1860,"fn":1861,"description":1862,"org":2004,"tags":2005,"stars":26,"repoUrl":27,"updatedAt":1871},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2006,2007,2008,2009],{"name":1843,"slug":1844,"type":15},{"name":1867,"slug":1868,"type":15},{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},{"slug":1873,"name":1873,"fn":1874,"description":1875,"org":2011,"tags":2012,"stars":26,"repoUrl":27,"updatedAt":1881},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2013,2014,2015],{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},{"name":1831,"slug":1832,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":2017,"tags":2018,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2019,2020,2021,2022,2023],{"name":18,"slug":19,"type":15},{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":21,"slug":22,"type":15},{"slug":64,"name":64,"fn":1891,"description":1892,"org":2025,"tags":2026,"stars":26,"repoUrl":27,"updatedAt":1903},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2027,2028,2029,2030],{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},{"name":1898,"slug":1899,"type":15},{"name":1901,"slug":1902,"type":15},{"slug":1905,"name":1905,"fn":1906,"description":1907,"org":2032,"tags":2033,"stars":26,"repoUrl":27,"updatedAt":1921},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2034,2035,2036,2037,2038],{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},{"name":1913,"slug":1914,"type":15},{"name":1916,"slug":1917,"type":15},{"name":1919,"slug":1920,"type":15},{"slug":1923,"name":1923,"fn":1924,"description":1925,"org":2040,"tags":2041,"stars":26,"repoUrl":27,"updatedAt":1941},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2042,2043,2044,2045,2046],{"name":9,"slug":8,"type":15},{"name":1930,"slug":1931,"type":15},{"name":1933,"slug":1934,"type":15},{"name":1936,"slug":1937,"type":15},{"name":1939,"slug":1940,"type":15}]