99.99% Uptimeby Solari Status ↗

Solari for Research Agents: Thousands of Pages With Proxies per Session

·

4 min read

·

Summarize with AI
ON THIS PAGE

The analyst's request landed on a Friday afternoon: read every regional supplier's pricing page, note what had changed since spring, and have a summary ready by Monday. The research agent planned the job well, then fetched the pages in a queue from a cloud server. By Saturday morning, several supplier sites were answering with challenge pages instead of prices.

A research agent at scale hits two walls at once: reading pages in sequence is too slow, and every request from the same data-centre address looks like a bot. Solari answers both with cloud browsers: each site gets a browser per task, started in parallel, and each session can carry its own proxy. This guide walks through the fan-out, the proxy settings and the plan limit that decides how wide a proxied run can go.

Why a Research Agent Needs a Browser per Task

The first design choice is the unit of work, because everything else hangs off it. A Solari session is a real browser driven with the standard Playwright API. Giving each site its own session keeps cookies, tabs and failures apart, so a page that hangs on a slow site never stalls the rest.

The Solari use-case library is built on this pattern: split a goal into a task per website, run a browser agent on each in parallel, then rank what comes back. A default session is a fast headless browser with no proxy or stealth, which suits public pages and is where the fan-out starts.

How to Fan Out Sessions in Parallel

With a session per task settled, the fan-out is a few lines of code. The sketch below reads a list of sites at once with Promise.allSettled, which waits for every task and reports each outcome, so a failed site does not sink the batch.

import { Solari } from "@solarisdk/browser"

const client = new Solari({ apiKey: process.env.SOLARI_API_KEY! })

async function readSite(task: { url: string; country?: string }) {
  const browser = await client.launch(
    task.country ? { stealth: true, proxy: { country: task.country } } : {},
  )
  try {
    const page = await browser.newPage()
    await page.goto(task.url)
    return await page.locator("main").innerText()
  } finally {
    await browser.close()
  }
}

const results = await Promise.allSettled(tasks.map(readSite))
import { Solari } from "@solarisdk/browser"

const client = new Solari({ apiKey: process.env.SOLARI_API_KEY! })

async function readSite(task: { url: string; country?: string }) {
  const browser = await client.launch(
    task.country ? { stealth: true, proxy: { country: task.country } } : {},
  )
  try {
    const page = await browser.newPage()
    await page.goto(task.url)
    return await page.locator("main").innerText()
  } finally {
    await browser.close()
  }
}

const results = await Promise.allSettled(tasks.map(readSite))
import { Solari } from "@solarisdk/browser"

const client = new Solari({ apiKey: process.env.SOLARI_API_KEY! })

async function readSite(task: { url: string; country?: string }) {
  const browser = await client.launch(
    task.country ? { stealth: true, proxy: { country: task.country } } : {},
  )
  try {
    const page = await browser.newPage()
    await page.goto(task.url)
    return await page.locator("main").innerText()
  } finally {
    await browser.close()
  }
}

const results = await Promise.allSettled(tasks.map(readSite))

Closing each browser in finally releases its slot even when a page throws, and the settled results list the sites that need a retry. Those are usually the sites that blocked the request, which is where proxies come in.

How to Give Each Session Its Own Proxy

A blocked site usually objects to where the request comes from, so the next layer is network location. A proxy server sits between the browser and the site, so the site sees the proxy's address. Solari proxies take a country code and an optional tier: rotating residential by default, static ISP for a fixed IP all session, or mobile carrier IPs for the strictest targets.

Proxies build on stealth mode, which makes the browser look like an ordinary person's and is slightly slower, so the sensible order is the default first and stealth the moment challenge pages appear, on a paid plan for both. For sites that still put up a CAPTCHA, the session's captcha option solves reCaptcha, hCaptcha and Turnstile.

Each proxied session gets its own exit IP unless it shares a proxy label: sessions with the same proxy.session label share an IP, which suits a multi-step login rather than independent research tasks. Once the right IP is in place, the next concern is what the proxy carries.

How to Keep Proxy Traffic Small

Proxy bandwidth is billed by volume, so a research run that only needs text should not download video. Solari bills proxy traffic at $4.00 per GB on the Professional plan.

The blockHeavy option set at create time refuses video and audio before any byte is requested and drops images whose declared size passes a threshold, so they never cross the proxy. Requests from service workers and cross-origin iframes are not covered, so a site that loads media that way still costs bandwidth. With bandwidth contained, the last limit is how many sessions run at once.

How Wide a Proxied Run Can Go

Plan limits set the width of the fan-out, and proxied sessions have a limit of their own. Solari runs 150 concurrent browsers on Professional and up to 100,000 on Enterprise for standard sessions, while stealth sessions, which every proxied session is, sit under a separate, lower cap counted on top of the browser limit. The figure below shows that stealth cap by plan.

Concurrent stealth sessions by plan

A stealth session over the cap is refused with a 429 even when the browser limit has room, and Enterprise keeps Team's stealth cap. The practical setup is a worker pool sized to the stealth cap for blocked sites, while open pages run as default sessions under the far larger browser limit. That split lets a run read thousands of pages without the proxied tasks setting the pace.

Choosing the Right Setup

A research agent scales when each site gets its own session, the batch settles rather than fails, and proxies go only where a site objects. Start every task as a default session, add stealth and a proxy country for sites that block, and block heavy media on proxied runs. The companion guide Cloud Browsers Explained covers profiles and recording, and the Solari introduction shows the sandboxes that share the same account.

Get Started With Solari

The first run to try is the fan-out above against a short list of sites, with a proxy country only on the ones that return challenge pages. Solari browsers are ready in 8 ms and Solari is about 2x cheaper than Browserbase per browser hour, so a wide research run starts fast and costs less. Create a free Solari account to build the fan-out on default sessions, then move to a paid plan when the agent needs proxies.

Share this article

Give every agent
a place to work

Browsers, sandboxes and desktops from one API. Start free and scale when you need to.

Planet horizon at sunrise
opsra logo

The Fastest AI Infrastructure

Unsubscribe anytime. See our Privacy Policy.

Copyright © 2026 Solari

Engineered by Pinetree

opsra logo

The Fastest AI Infrastructure

Unsubscribe anytime. See our Privacy Policy.

Copyright © 2026 Solari

Engineered by Pinetree

opsra logo

The Fastest AI Infrastructure

Unsubscribe anytime. See our Privacy Policy.

Copyright © 2026 Solari

Engineered by Pinetree