Request Tester

Build and send HTTP requests via proxy — import/export cURL, edit headers, cookies and body

Your script gets a 403, or HTML that doesn't match what you see in the browser, and you need to know why. Send the exact request from here — with your own headers, cookies and proxy — and read the raw response, the redirect chain, and the name of the anti-bot system that answered.

via Germany · datacenter · HTTP
:
:
Parsistent Proxies
Your Proxies

Add proxies in Proxy Manager below

One proxy per line:

How to use

  1. 1Start from the request that already works — Open DevTools on the page, right-click the request, Copy as cURL, and paste it on the cURL tab. URL, method, headers, cookies and body are filled in for you. Both Chrome styles work: bash and the Windows cmd caret format. Filling the fields by hand works too.
  2. 2Choose where the request goes out from — Use the built-in proxies or add your own — HTTP, SOCKS4, SOCKS5, with or without auth. When a site has already blocked one address, swapping the proxy is often the whole experiment.
  3. 3Send it and read the whole answer — Status code, response headers, body, and the full 301/302 chain. If Cloudflare, DataDome or PerimeterX answered instead of the site, the result says so by name.
  4. 4Change one thing, send again — A User-Agent, one cookie, a different proxy — one change at a time. The difference between the two responses is the answer to why your code is blocked and your browser is not.
  5. 5Take the working request back to your code — The cURL tab regenerates a runnable command from the current state at any moment. Paste it into cURL Converter to get Python, Node, Go or PHP with the same headers.

Examples

The site returns 403 to your script, but opens in your browser
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Send the request with no User-Agent, then with a real one. If the 403 turns into a 200, the site has no real protection at all: the default header of your HTTP library was the whole problem.
You need to know what is standing in front of the site
GET https://example.com -> detected: DataDome
Before writing any code, find out whether the wall is Cloudflare, DataDome or PerimeterX. They behave differently, and the answer decides whether a couple of headers will do or you need a real browser.
The HTML you receive is not the HTML you inspected
GET https://example.com (body arrives without the price block)
The browser ran JavaScript and built the DOM; your scraper will not. This shows the raw response, exactly what your code receives. Better to hit that now than after the parser is written.
The data is not in the HTML at all
GET https://example.com/api/v1/items?page=2
The page loads its content from a JSON endpoint. Copy that request from the Network tab, replay it here, and check whether it works without cookies — often you can skip HTML parsing entirely.
A proxy works for one site and dies on another
socks5://user:pass@host:1080
Same request, same target, different proxy. Proxies carry reputations: an address blocked on one site passes on another, and the failure tells you which side gave up — see Proxy Checker for checking a whole list at once.
Copy as cURL works, your Python does not
curl 'https://example.com' -H 'cookie: session=...' -H 'accept-language: en-US'
Paste the working command here and switch headers off one at a time. The one that stops the request from going through is what your code was missing.
The session dies after the first request
Cookie: session_id=abc123; consent=1; ab_group=b
Expand the Cookie header into rows and switch cookies off one at a time. It is usually one consent or region cookie that the site quietly requires.
A short link hides where it actually goes
GET http://bit.ly/xxxx (Follow redirects: on)
See the entire 301/302 chain to the final address, with every intermediate hop — useful when a scraper keeps landing somewhere unexpected.

When to use for web scraping

The most common question when writing a scraper is "why does my code get something different from what I see in the browser?" There are three real answers: the page builds its content with JavaScript, the site serves different content by User-Agent or cookies, or an anti-bot system answered instead of the site. One request from here shows which of the three you have. Naming the anti-bot system is the part that is hard to get anywhere else. When Cloudflare, DataDome or PerimeterX intercepts the request, you usually see a bare 403 with no explanation. Here the result names the system, and that decides your next step: one of them lets you through with a User-Agent and a session cookie, another fingerprints the TLS handshake and no header will help. Requests go out through a proxy — the built-in ones or your own — not from your own address. That is not only about anonymity: half the trouble in scraping lives in the proxy itself, and a request is worth testing through the same address your real code will use. What this does not do: it does not run JavaScript. If the content appears only after the page's scripts execute, the raw response will not contain it, and no combination of headers will change that — you need Playwright, Puppeteer or a cloud browser. That is a real answer too, and getting it in one request is better than discovering it after a day of parser work. Once the response is in hand, CSS Selector Tester and XPath Tester are the next stop for pulling data out of it.

FAQ

Why does a site return 403 to my scraper but open normally in my browser?›
Almost always one of three things. Your HTTP library sends its own User-Agent (python-requests/2.31.0, axios, Go-http-client) which many sites refuse outright. The site requires a cookie your code never received. Or an anti-bot system decided the request was automated. Send the same request here with and without a real User-Agent — if the answer changes, you found it in one step. If the result names Cloudflare, DataDome or PerimeterX, the wall is the third case and headers alone may not be enough.
How do I find out which anti-bot system a site uses?›
Send any request to it here. The response is checked against the signatures of Cloudflare, DataDome and PerimeterX: response headers, cookies set, characteristic status codes and body markers. The system that matched is named in the result. This matters because they are not equivalent — one of them you get past with the right headers in five minutes, another reads the TLS handshake and cannot be fooled from a browser tool at all.
Why do I see different HTML than in the browser?›
The browser executes JavaScript and builds the DOM after loading. This tool returns the raw HTTP response — the same bytes your Python or Node scraper receives. If content is inserted by scripts, it is not in the raw response and never will be. Check whether the data comes from a JSON endpoint instead (open the Network tab, filter by Fetch/XHR): replaying that endpoint here is usually simpler and more stable than parsing HTML.
The request works in DevTools but not in my code — what is different?›
Take the Copy as cURL from DevTools, bring it over, and send it unchanged. If it works here, the difference is in the headers your code omits — most often Accept-Language, Referer, a session or consent cookie, or Accept-Encoding. Remove headers one at a time until it breaks; the last one you removed is the missing piece. Then export the working request back to cURL and convert it with cURL Converter.
How do I tell whether the proxy is broken or the site is blocking me?›
The failure is classified by whether the proxy connection was established, not by how long the request took — timing lies, a dead proxy can take eight seconds to fail and look exactly like a slow site. If the proxy never connected, the message says the proxy is at fault; if it connected and the target then refused or dropped the connection, the message says so. To check a whole list of proxies at once rather than one at a time, use Proxy Checker.
Does the tool send requests from my IP?›
No. Requests always go through a proxy: the built-in ones by default, or your own added in Proxy Manager. The target never sees your address, so your home or office IP stays off the blocklists even when you are testing a site that blocks aggressively.
What format should I use for my own proxies?›
URI format: http://host:port, http://user:pass@host:port, socks5://host:port, socks5://user:pass@host:port, and socks4:// the same way. A plain host port user pass line per proxy also works. Every accepted format with examples is listed in the Format popup in Proxy Manager.
Can I import a cURL command, and which flags are recognized?›
Yes — paste it on the cURL tab and click Fill fields. Recognized: the URL (first argument or --url), -X/--request, -H/--header, -d/--data/--data-raw/--data-binary/--data-ascii, --data-urlencode, -F/--form (multipart is simplified to a raw body, with a warning), -b/--cookie, -u/--user, -A/--user-agent, -e/--referer. Ignored: --compressed, -k, -L, -s, -i, -v, and -x/--proxy because the tool has its own proxy selector. Body type — JSON, Form or Raw — is detected from Content-Type or from the body itself.
Can I get a cURL command back out of my request?›
Yes. The cURL tab shows a runnable command regenerated live from the current URL, method, headers, cookies and body, with a Copy button. A proxy of your own is included via -x; the built-in proxies run server-side and are deliberately left out, so the command you copy works anywhere without exposing them.
How do I add a proxy to a cURL command?›
Use -x: curl -x http://user:pass@host:port 'https://target' for HTTP, or -x socks5://user:pass@host:port for SOCKS5. Use socks5h:// instead if you want DNS resolved on the proxy side rather than yours — that difference alone explains some cases where a proxy works in one tool and fails in another.
How do I pass cookies in a request?›
Add a Cookie header — for example Cookie: session_id=abc123; user_pref=dark, copied from DevTools under Network then Request Headers. You can then expand that header into per-cookie rows and toggle, edit or delete each one; only enabled cookies are sent. That is the fastest way to find which single cookie the site actually requires.
Why does my request time out?›
The timeout is 15 seconds. Slow targets, deliberately delayed responses and dead proxies all end this way. Retry through a different proxy first: if it returns immediately, the proxy was the problem; if every proxy stalls on the same address, the target is refusing to answer rather than being slow.

Related tools