
JSON Grabber
Chrome · Manifest V3Capture JSON API responses straight from Chrome DevTools — filter them, read them, combine them, export them.
Zero permissions · no servers · no analytics
See it work
One pass through the panel: capture, filter, expand, compose, export.
What it does
Captures response bodies
Every finished request in the inspected tab is checked, and JSON responses land in the panel — body included, exactly as the browser received it.
Filter by URL
Anything with a JSON MIME type is always kept. A case-insensitive URL substring filter widens that when an endpoint lies about its content type. The filter applies to new captures going forward.
Read without leaving DevTools
The list shows URL, status and size. Click a row to expand the pretty-printed body; anything that won't parse is shown raw rather than swallowed.
Export one or many
Each row has its own Save button. One export button follows your selection — “Export all” with nothing ticked, “Export selected (n)” once rows are — and either writes a single JSON array or one file per capture.
Compose several responses
Tick captures and hit Compose, or drag rows into a resizable side panel. Wrap them as an object or an array, watch the live preview, then Copy or Export the result.
Keys derived from the URL
In object mode each capture gets a key from its path — /v1/users/42 becomes users — editable inline, and duplicates are suffixed rather than overwritten.
How it works
JSON Grabber adds a panel to DevTools. It subscribes to chrome.devtools.network.onRequestFinished and pulls each body with getContent() — the same data the Network tab already has, handed over by the browser rather than intercepted.
No
chrome.debuggerExtensions that attach the debugger get the job done, but Chrome puts a yellow “extension is debugging this browser” banner across the top of the window for as long as they're attached. The DevTools network API needs no attach, so there is no banner.
No
fetch/XHRmonkey-patchingThe other common approach injects a script that wraps the page's network functions. It fights with app code, misses anything that fires before injection, and can mangle streamed or re-read bodies. Reading from DevTools means bodies come back intact.
Only what a capture needs
A capture is five fields. Headers, cookies and
Authorizationtokens are never read, and there is no way to replay a request — it only reads responses the browser already received.One capture{ url: "https://api.example.com/v1/users/42", status: 200, mimeType: "application/json", body: "{ … }", timestamp: 1723372800000 }
The tradeoff: DevTools has to be open
That API only delivers requests while DevTools is open on the tab being inspected. Nothing is captured in the background — open DevTools first, then reload or click around. Closing DevTools ends the session and clears the captures with it. That's the price of no permissions, no debugger banner and untouched page code.
Install
Chrome Web Store
One click, and it updates itself from then on.
Load it unpacked
Build the extension from source (see the repo README), then:
- 1Open
chrome://extensions - 2Turn on Developer mode
- 3Click Load unpacked and pick the build output folder
Then open DevTools on any tab — the JSON Grabber panel sits alongside Elements and Network.
Privacy
No permissions. Nothing leaves your machine.
There is no cloud side to this extension, so there is nothing to trust it with.
- No Chrome permissions and no host permissions are requested — the manifest asks for nothing.
- Each capture holds exactly the URL, status, MIME type, body and timestamp. Request and response headers, cookies and Authorization tokens are never read.
- Captures live in memory for the lifetime of the panel and are gone when DevTools closes. Nothing is written to disk unless you press Save or Export.
- There is no backend, no account and no analytics. The extension makes no network requests of its own.
- It only reads responses the browser already received — there is no request-replay feature.
Roadmap
Planned — not shippedNone of the below is in the extension today. It's here so you know where it's heading, not what it can do.
- Reordering captures inside the composer
- Nesting composed results instead of one flat level
- Selecting a path into a body rather than taking the whole response
- Joining two responses on a shared key
- Saved rules that re-run as new captures arrive