[Bug] interact() re-loads the scrape URL in a new browser from a fixed US pool, ignoring the scrape's `location` and `proxy`
Describe the Bug
The interact docs (Session Lifecycle → Creation) say: "The first POST /v2/scrape/{scrapeId}/interact continues the
scrape session and starts the interaction." On the hosted API it does not. The first interact call loads the scrape's
URL again, 4–5 s later, in another browser, from another IP. That IP is always in the same US pool (Centreville VA,
announced by AS22773). Whatever location and proxy the scrape used are lost:
| scrapeId (2026-09-28 UTC) | Scrape options | Scrape: IP, httpbin trace id | Interact page, no navigation: IP, trace id |
|---|---|---|---|
| 01a0e892-6905-744f-bfc0-9ef1b4cc2d17 | location: GB |
109.176.31.186 (GB), 1-6aba83b1-… | 5.183.90.223 (US), 1-6aba83b5-… |
| 01a0e889-7a76-7578-95f6-3cb874fbb3fb | location: GB, maxAge: 1000 |
45.138.35.145 (GB), 1-6aba8167-… | 195.64.119.206 (US), 1-6aba816c-… |
| 01a0e903-e86b-765a-a90a-8d8a7a10fdea | proxy: enhanced |
172.58.244.49 (US, AS21928 T-Mobile), 1-6abaa0be-… | 5.183.88.185 (US, AS22773), 1-6abaa0c3-… |
| 01a0e88a-9b78-746e-822d-571a8d8da82c | none | 5.183.89.116 (US), 1-6aba81b1-… | 113.30.192.167 (US), 1-6aba81b5-… |
The trace id's first hex block is the request's Unix time, so every row is a second request about 5 s after the
scrape. An undocumented location field in the body of POST /v2/scrape/{id}/interact or POST /v2/browser is
ignored silently.
This matches the open-source code: scrapeInteractController starts a new browser and runs buildReplayScript
(page.goto(targetUrl)). buildReplayContextFromScrape keeps only targetUrl, waitForMs and actions, not
location or proxy.
To Reproduce
# pip install firecrawl-py==4.27.1 ; FIRECRAWL_API_KEY=fc-... python repro.py
import json, re, uuid
from firecrawl import Firecrawl
fc = Firecrawl()
url = f"https://httpbin.org/anything?probe={uuid.uuid4().hex[:8]}"
def ip_and_trace(text):
ip = re.search(r'"origin":\s*"([^"]+)"', text or ""); trace = re.search(r"Root=([0-9a-f-]+)", text or "")
return (ip and ip.group(1)), (trace and trace.group(1))
scrape = fc.scrape(url, formats=["markdown"], location={"country": "GB"}) # or proxy="enhanced"
scrape_id = scrape.metadata.scrape_id
try:
page = fc.interact(scrape_id, code="agent-browser get text body", language="bash") # no navigation
finally:
fc.stop_interaction(scrape_id)
print(json.dumps({"scrape": ip_and_trace(scrape.markdown), "interact": ip_and_trace(page.stdout)}, indent=2))Expected Behavior One of:
- interact continues the scrape's browser (same page, same IP), as the docs say; or
- the interact session uses the scrape's
locationandproxy(includingenhanced); or POST /v2/scrape/{id}/interactandPOST /v2/browseracceptlocationandproxythemselves.
If re-loading in a new browser is intended, the docs' "continues the scrape session" should say so.
Why it matters
We check prices for users in a given country, and many sites price by the visitor's country. The pages have to be
clicked through (interact) from that country, but every click runs from the US today. The fixed pool also scores badly
with bot protection. On the same travel-site links, a plain scrape(proxy="enhanced") avoided the site's captcha on 11
of 14 loads, while interact sessions got the captcha on 26 of 34. The only difference we found is the exit network.
Environment
- Deployment type: Cloud (api.firecrawl.dev), API v2
- SDK: firecrawl-py 4.27.1, Python 3.11, Linux
Questions
- Is re-loading the URL in a new browser intended?
- Is there a supported way, today or planned, to run an interact or browser session from a chosen country, or on the enhanced proxy?
Source: firecrawl/firecrawl