#4813·firecrawl

[Bug] interact() re-loads the scrape URL in a new browser from a fixed US pool, ignoring the scrape's `location` and `proxy`

Author: AndresPTorresCreated Sep 28, 2026Updated Sep 28, 2026

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

python
# 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:

  1. interact continues the scrape's browser (same page, same IP), as the docs say; or
  2. the interact session uses the scrape's location and proxy (including enhanced); or
  3. POST /v2/scrape/{id}/interact and POST /v2/browser accept location and proxy themselves.

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

  1. Is re-loading the URL in a new browser intended?
  2. Is there a supported way, today or planned, to run an interact or browser session from a chosen country, or on the enhanced proxy?