GPT Researcher searches, fetches and writes a report. It has five scrapers you can choose between and sixteen retrievers. That is a lot of surface for one question: where does a proxy go? We read release v3.6.1 on 20 September 2026.
The short answer: the project has no proxy setting at all. The word does not appear in its configuration defaults, in its scraping documentation, or in the two retrievers that fetch for themselves. What you get depends on which library does the fetching.
Which lane a link takes
The second row is the one worth staring at. Those scrapers do use your address. They simply cannot be told to use a different one.
The two scrapers that cannot
One environment variable picks the scraper, and a link ending in .pdf or containing arxiv.org overrides it:
SCRAPER value | What fetches the page | Does a proxy variable reach it |
|---|---|---|
bs, the default | a shared requests session | yes |
web_base_loader | the same session | yes |
browser | Selenium, driving Chrome | no |
nodriver | zendriver, driving Chrome | no |
tavily_extract | the vendor's servers | not yours to route |
firecrawl | the vendor's servers | not yours to route |
The static path is routed for free. One requests.Session is built with a user agent and handed to every URL, and a requests session reads HTTP_PROXY, HTTPS_PROXY and NO_PROXY by itself. Nobody wrote proxy code, and it works.
The browser paths are a different story. The Selenium scraper builds its own option list. A user agent, headless, javascript, the shared memory flag, a debugging port, no sandbox, a download restriction. There is no proxy argument, and nothing reads one from the configuration. The newer scraper configures even less. Its entire browser configuration is headless mode and a connection timeout.
That lands badly. Those two are what the documentation recommends for pages a plain request cannot read. The scrapers that exist for difficult sites cannot carry the address you bought for difficult sites.
Your options are short. Use the static scraper with your proxy, and accept that javascript heavy pages come back thin. Use a vendor scraper, where their servers fetch and your address stops mattering. Set a proxy at the operating system level and hope Chrome picks it up, which depends on your system. Or add the argument yourself. It is one line in each file.
The name that lies
The file is called nodriver_scraper.py and the class is NoDriverScraper, but the code imports zendriver, and the error message says so plainly: install zendriver.
If you read our nodriver page and were about to use the proxy option we documented there, check which package is installed first. They are different projects with a shared ancestry. Only one of them is what this scraper starts.
Fifteen at once
Before buying an address, look at two numbers in the defaults:
| Setting | Default | When to change it |
|---|---|---|
MAX_SCRAPER_WORKERS | 15 | when a source starts refusing you |
SCRAPER_RATE_LIMIT_DELAY | 0.0 | when you want a minimum gap between requests |
SCRAPER | bs | when pages need javascript, with the caveat above |
Fifteen parallel fetches with no minimum delay, from one address, is the shape that earns a rate limit. Their own comment calls the delay useful for API rate limiting. It is the cheapest setting on this page.
Worth knowing: the newer browser scraper is the polite one. It keeps a semaphore per domain and remembers when it last asked. It sleeps briefly when a domain was busy. The default static path does neither.
Which proxy type fits it?
Set the delay first. If a source still refuses you, residential is the type that changes the answer. Our own paired test is the size of that effect: 4 of 13 sites answered a residential address differently from a server one, with plain requests of the kind the default scraper sends.
Then size for the parallelism rather than the traffic. Fifteen workers is fifteen concurrent requests, so what you need is sessions, not gigabytes. The pages are text and a report is a few hundred of them. An allowed address fits this project well, because there is nowhere in its configuration to put a password. On a Residential Premium plan your machine's address can be allowed, up to 150 per plan. The residential proxies page lists the plans, and the plan API manages allowed addresses from code.
What breaks
- The proxy works for some pages and not others. A pdf link and an arxiv link take their own scraper, whatever you configured.
- The browser scraper ignores your proxy. It has no argument for one. Use the static scraper or patch the launch options.
- The nodriver scraper will not start. It wants zendriver, not nodriver.
- Sources refuse you after a few minutes. Fifteen workers with no delay. Raise the delay before buying anything.
- A vendor scraper reports a different location. Their servers fetch, so your address is not in play at all.
What this page does not cover
We read the release as text and did not run the agent, so we did not watch a scrape use an address and did not measure a run's traffic. We did not test whether a system wide proxy reaches the two browser scrapers. That depends on your operating system and desktop rather than on this project, so treat that route as untested. We read the scraper base, both browser scrapers, the static scraper, the defaults, the scraping documentation and two retrievers closely. The other fourteen retrievers we classified from their directory rather than line by line. Releases come about monthly and the one we read is four weeks old. We will read it again by 20 October 2026.
Where to go from here
Proxies for nodriver covers the library this scraper is named after, including the proxy option it does have. Proxies for Firecrawl covers the self hosted version of one vendor scraper, where the address becomes yours again. Proxies for SearXNG covers the one retriever here that searches from your own machine.
Sources
- The shared requests session and the scraper map, the Selenium scraper's option list, the newer browser scraper's configuration and its zendriver import, and the defaults for the worker count, the delay and the scraper (gpt_researcher/scraper/scraper.py, scraper/browser/browser.py, scraper/browser/nodriver_scraper.py, scraper/beautiful_soup/beautiful_soup.py, config/variables/default.py). assafelovic/gpt-researcher, release v3.6.1 of 24 August 2026, read 20 September 2026.
- The scraper values and what each one is recommended for. GPT Researcher scraping documentation, docs/docs/gpt-researcher/gptr/scraping.md, same release.
- The two retrievers that fetch from your own machine (retrievers/searx/searx.py, retrievers/duckduckgo/duckduckgo.py). Same release.
- Our paired address test of 19 September 2026: 16 URLs, plain requests, two runs from our server and two through a residential line of our house plan. Raw output is kept in the research folder of our OpenClaw page.
- Plans, allowed addresses and sticky sessions. HProxy documentation, hproxy.com/docs, 20 September 2026.


