Free tools Windows power users keep installed
One-click scans. No signup required.
Use the Chrome DevTools Protocol (CDP) Network domain. Attach a CDP session before navigation or before the interaction that triggers the call, enable Network, listen for requestWillBeSent, responseReceived, loadingFinished and loadingFailed, and retain events whose resource type is XHR or Fetch. After loadingFinished, call Network.getResponseBody with the same request ID. That gives you the URL, method, headers, status, timing and (when Chrome still has it) the response body.
The example below uses headless Chromium with Puppeteer and records JSON. It observes traffic; it does not pause or modify requests. Use the Fetch domain only when you deliberately need interception.
What you are capturing
AJAX is a browser behavior rather than a separate wire protocol. Modern pages normally issue asynchronous calls through XMLHttpRequest or the Fetch API. CDP exposes those calls through the Network domain, whose resource-type values include XHR and Fetch. A request ID ties the lifecycle events together.
A typical sequence is:
Network.requestWillBeSentsupplies the outgoing URL, method, request headers, post data (when exposed), initiator and timing information.Network.responseReceivedsupplies the response URL, status, response headers, MIME type and resource type.Network.loadingFinishedindicates that Chrome has finished receiving the response. This is the safe point to request the body.Network.getResponseBodyreturns the body and abase64Encodedflag.Network.loadingFailedrecords a failed load instead of a usable response.
Enable the domain and register listeners before page.goto() or before the click, form submission or script call you want to study. Opening DevTools after a page has already loaded can miss earlier requests; a programmatic capture has the same timing requirement.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallOutdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware match#1 Best Overall
- Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
- Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
- Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
- Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
- 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.
Passive logging versus interception
| Approach | Use it for | What to watch |
|---|---|---|
| CDP Network | Observing requests, responses, metadata and response bodies | Attach early; handle failures, redirects, cache and service-worker effects. |
| CDP Fetch | Pausing, modifying, failing or fulfilling a matching request | Every paused request must be continued, failed or fulfilled. Forgetting to resolve one can stall the page. |
| HAR export | Portable request metadata and timing logs | A HAR is not automatically the response body. Body content is obtained separately. |
The word “Fetch” has two meanings here. Fetch as a Network resource type means that the page used the Fetch API. The CDP Fetch domain is an interception mechanism; enabling it is not required merely to log Fetch calls.
Prerequisites and capture plan
- A Chromium or Chrome build that supports CDP.
- An automation wrapper with access to a CDP session. The code below uses Puppeteer for Node.js.
- Permission to inspect the target page and its data. Do not collect credentials, tokens or personal data from sites you do not control.
- A definition of the event that starts the capture: initial navigation, a selector click, a form submission or another scripted action.
Decide what to store before you run. Request and response headers can contain cookies, authorization values and identifiers. Bodies can contain account data. Redact secrets, restrict file permissions and set a retention period. The sample redacts common sensitive headers but leaves bodies available for debugging, so review or sanitize them before sharing.
Node.js and Puppeteer: complete CDP capture
Install Puppeteer in a new project, then save the following as capture-ajax.mjs:
npm install puppeteer
import puppeteer from 'puppeteer';
const targetUrl = process.argv[2] || 'https://example.com';
const clickSelector = process.argv[3];
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
const client = await page.target().createCDPSession();
const records = new Map();
const bodyJobs = [];
function safeHeaders(headers = {}) {
const hidden = new Set(['authorization', 'cookie', 'set-cookie', 'proxy-authorization']);
return Object.fromEntries(Object.entries(headers).map(([name, value]) => [
name,
hidden.has(name.toLowerCase()) ? '[REDACTED]' : value
]));
}
function recordFor(requestId) {
if (!records.has(requestId)) {
records.set(requestId, {
requestId,
redirects: [],
response: null,
body: null,
bodyError: null,
failed: null
});
}
return records.get(requestId);
}
await client.send('Network.enable');
client.on('Network.requestWillBeSent', event => {
const record = recordFor(event.requestId);
if (event.redirectResponse) {
record.redirects.push({
url: event.redirectResponse.url,
status: event.redirectResponse.status,
headers: safeHeaders(event.redirectResponse.headers)
});
}
record.type = event.type;
record.isAjax = event.type === 'XHR' || event.type === 'Fetch';
record.url = event.request.url;
record.method = event.request.method;
record.requestHeaders = safeHeaders(event.request.headers);
record.postData = event.request.postData || null;
record.initiator = event.initiator || null;
record.requestTimestamp = event.timestamp;
});
client.on('Network.responseReceived', event => {
const record = recordFor(event.requestId);
if (event.type === 'XHR' || event.type === 'Fetch') record.isAjax = true;
record.type = event.type;
record.response = {
url: event.response.url,
status: event.response.status,
statusText: event.response.statusText,
mimeType: event.response.mimeType,
headers: safeHeaders(event.response.headers),
fromDiskCache: event.response.fromDiskCache,
fromServiceWorker: event.response.fromServiceWorker,
responseTimestamp: event.timestamp
};
});
client.on('Network.loadingFinished', event => {
const record = records.get(event.requestId);
if (!record || !record.isAjax) return;
const job = (async () => {
record.encodedDataLength = event.encodedDataLength;
record.finishedTimestamp = event.timestamp;
try {
const result = await client.send('Network.getResponseBody', {
requestId: event.requestId
});
record.body = result.body;
record.bodyBase64Encoded = result.base64Encoded;
} catch (error) {
record.bodyError = error.message;
}
})();
bodyJobs.push(job);
});
client.on('Network.loadingFailed', event => {
const record = records.get(event.requestId) || recordFor(event.requestId);
record.failed = {
errorText: event.errorText,
canceled: event.canceled || false,
blockedReason: event.blockedReason || null
};
});
try {
await page.goto(targetUrl, { waitUntil: 'domcontentloaded', timeout: 60000 });
if (clickSelector) {
await page.click(clickSelector);
}
// Give calls triggered by page scripts time to complete. Replace this with
// a selector- or application-specific wait in a production test.
await new Promise(resolve => setTimeout(resolve, 2000));
} finally {
await Promise.all(bodyJobs);
const output = [...records.values()].filter(record => record.isAjax);
console.log(JSON.stringify(output, null, 2));
await browser.close();
}
Run an initial-load capture with node capture-ajax.mjs https://your-site.example. To trigger a call by clicking a button, pass a CSS selector as the second argument: node capture-ajax.mjs https://your-site.example '#load-more'. Replace the fixed two-second delay with a deterministic application condition when possible, such as waiting for a known result element or an explicit test signal.
How the script associates data
The map is keyed by CDP’s request ID. Request and response data are recorded independently because the events arrive asynchronously. A redirect response is appended to redirects instead of being mistaken for the final response. The final record includes cache and service-worker indicators where Chrome provides them. A body retrieval error is kept in bodyError rather than silently dropping the request.
Rank #2
- 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
- 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
- Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
- 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
- What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.
In a long-running test, do not keep every body in memory. Stream selected records to disk or a bounded queue, impose a maximum body size, and retain only fields needed by the test. If you need the raw body exactly as returned, preserve the base64Encoded value instead of decoding it as UTF-8.
Capturing an interaction reliably
- Create the page and CDP session.
- Send
Network.enable. - Register all lifecycle listeners.
- Navigate or perform the interaction.
- Wait for the application’s completion condition, not merely an arbitrary sleep.
- Wait for pending
getResponseBodycalls before closing the browser.
For an infinite-scroll page, click or scroll in a loop and keep the same listeners active. For a login flow, capture only an authorized test account and redact credentials immediately. If a call is made by a service worker, note the fromServiceWorker context; the browser-observed record is not necessarily the same as a direct server request.
What this method does not cover
Filtering to XHR and Fetch intentionally excludes document loads, images, scripts, stylesheets and many other resource types. WebSocket messages, EventSource streams and other streaming patterns have different lifecycle views and are not ordinary response-body captures. If the application uses one of those channels, instrument its protocol-specific events instead of assuming that getResponseBody will return a complete conversation.
A capture is evidence of what Chromium observed in that run, not a complete inventory of every backend endpoint. Authentication state, feature flags, geographic routing, cache, service workers and timing can change the result. Replaying a captured request outside the browser may fail because cookies, CSRF tokens, signatures or transient state are missing.
Interception only when you need to change traffic
Use the CDP Fetch domain when the test must block an ad request, edit a header, supply a fixture response or deliberately fail a call. Configure a narrow URL or resource-type pattern and handle every paused event. The handler must continue, fail or fulfill the request; a forgotten continuation leaves the page waiting indefinitely. For ordinary logging, Network events have less risk and less code.
Rank #3
- Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
- Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
- Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
- Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
- What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.
Troubleshooting
No AJAX calls appear
Check that Network.enable and listeners run before navigation or the triggering action. Confirm that the page really uses XHR or Fetch; a WebSocket, EventSource stream, form navigation or service-worker path will not match the filter. Also verify that the action actually occurred in headless mode and that the page was not redirected to an error or consent screen.
Metadata exists but the body is missing
Request the body after loadingFinished, not immediately after responseReceived. Keep the CDP session open until the asynchronous body request resolves. Chrome can reject body retrieval for a failed, canceled or no-longer-buffered request; retain the error and use status, headers and timing as the available evidence.
Do these 3 things before closing this tab:
1Scan for outdated or missing drivers - takes under a minute2Clear out junk files and repair common Windows errors3Fix the driver behind crashes, sound loss and screen glitchesThe script hangs after enabling Fetch
This is normally an unresolved paused request. For a passive capture, remove Fetch interception entirely. If interception is required, make every branch call the appropriate continue, fail or fulfill command, including error paths.
A redirect produces confusing records
Do not assume one logical URL equals one request ID or one response. Preserve redirect responses, inspect each status and URL, and identify which response is the final one before parsing its body.
Headers look incomplete
Cached requests may not expose the original request headers, and browser security rules can produce provisional headers. Treat missing fields as unknown rather than reconstructing them. Record cache, service-worker and initiator context so a later reader understands what the browser actually observed.
Rank #4
- Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
- Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
- Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
- Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
- Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft
The captured JSON contains secrets
Stop sharing the file, rotate exposed credentials where appropriate, and add redaction before persistence. At minimum inspect authorization, cookie, set-cookie, API-key and personal-data fields in both headers and bodies. Use a dedicated test account and a short retention period.
The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Or skip the browser setup
If your goal is a clean visual snapshot or PDF rather than the AJAX request and response data itself, ScreenshotNeo makes a one-call capture. It is not a network-log replacement: use CDP for traffic inspection, and use ScreenshotNeo when the rendered result is what you need.
ScreenshotNeo accepts consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups and chat widgets before the shot; each cleanup step can be turned off. Bot checks, CAPTCHAs, blank pages, timeouts, failed loads and cache hits are not billed, and the response identifies the result with X-Page-Verdict and X-Billed headers. Its MCP server supplies take_screenshot, get_page_info and capture_pdf tools to Claude, Cursor and other MCP clients. The Free plan includes 1,000 shots per month without a card; paid plans start at $5 for 3,000 shots, and every feature is available on every plan.
See the ScreenshotNeo documentation for parameters and authentication. The same request can return PNG, JPEG, WebP or PDF:
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
If you need screenshots without installing Chrome or maintaining browser setup, sign up for ScreenshotNeo’s free plan to get 1,000 screenshots a month with no card.
Operational and cost considerations
CDP itself has no separate per-request charge; your cost is the machine and automation runtime you operate. Capturing every body increases memory, disk and serialization work, especially on pages with large JSON responses. Filter early, capture only the interactions under test and avoid printing sensitive or megabyte-scale payloads to CI logs.
Best Value
- 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
- Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
- Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
- HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
- What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.
For repeatability, pin the browser and automation-wrapper versions in your project and keep a small compatibility test for CDP commands. The tip-of-tree CDP protocol changes without a guaranteed backwards-compatibility promise, so verify event names and command parameters when upgrading Chromium or Puppeteer. Store the browser version, target URL, timestamp, cache/service-worker context and failure information beside the captured records.
Frequently Asked Questions
Is the Network resource type `Fetch` the same thing as the CDP Fetch domain?
No. The resource type labels a page request made through the Fetch API. The Fetch domain is the separate CDP interception API that pauses matching requests.
Can I treat a captured request as a guaranteed replay recipe?
No. A record describes one browser run. Replay can depend on cookies, CSRF tokens, authorization, signatures, feature flags and short-lived server state.
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Clear out junk files and repair common Windows errorsFree Scan →Will headless and headed Chrome always produce identical traffic?
They use the same CDP model, but page code can branch on browser conditions and timing. Validate the capture mode used by your test and record the browser version with the log.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

