Skip to main content

🧠 BrowserState for Python

Auth & memory for AI agents and browser automation — now in Python.

PyPI version

BrowserState lets agents and automation tools act like real, returning users. It captures and restores full browser session state — enabling persistent identity, stable automation, and reliable behavior at scale.


🚀 Install

pip install browserstate

Or with uv:

uv pip install browserstate

🧭 Why BrowserState?

Most browser automations fail because sessions reset every run. Fingerprints drift, cookies vanish, and re-auth prompts kill workflows.

BrowserState makes browser identity portable.
It captures and restores the full browser context: cookies, storage, fingerprints, service workers, and more — across environments and tools.


✨ Key Features

  • ✅ Full browser context save & restore
  • 🔁 Portable across machines, clouds, CI pipelines
  • 🧠 Works with Playwright, Selenium, Pyppeteer, AI agents
  • 🛡️ Bot detection resistant (no more fingerprint drift)
  • ☁️ Pluggable storage (Local, Redis, S3, GCS)
  • 🐛 Capture failed sessions for debugging + rehydration

🛠️ Quickstart

1. Configure BrowserState

from browserstate import BrowserState, BrowserStateOptions

options = BrowserStateOptions(
    user_id="user-123",
    local_storage_path="./sessions"
)

state = BrowserState(options)

🔐 Example: Automating Login + Capturing State (LinkedIn)

BrowserState doesn't include login automation, but you can pair it with your own Playwright/Selenium scripts.

Here’s a simple Playwright example using hardcoded credentials:

from browserstate import BrowserState, BrowserStateOptions
from playwright.async_api import async_playwright

state = BrowserState(BrowserStateOptions(
    user_id="linkedin-user",
    local_storage_path="./sessions"
))

async def login_and_capture():
    session_id = "linkedin-session"
    session_path = await state.mount(session_id)

    async with async_playwright() as p:
        browser = await p.chromium.launch_persistent_context(
            user_data_dir=session_path,
            headless=False
        )
        page = await browser.new_page()
        await page.goto("https://www.linkedin.com/login")

        await page.fill("#username", "you@example.com")
        await page.fill("#password", "yourpassword")
        await page.click("button[type='submit']")

        await page.wait_for_url("https://www.linkedin.com/feed", timeout=10000)
        await browser.close()

    await state.unmount()

# asyncio.run(login_and_capture())

You can then reuse that session later without logging in again:

session_path = await state.mount("linkedin-session")

async with async_playwright() as p:
    browser = await p.chromium.launch_persistent_context(
        user_data_dir=session_path,
        headless=True,
    )
    page = await browser.new_page()
    await page.goto("https://www.linkedin.com/feed")
    # Should already be logged in

🔄 Other Storage Providers

# S3
BrowserStateOptions(
    user_id="agent123",
    s3_options={
        "bucket": "my-browserstate-bucket",
        "aws_access_key_id": "...",
        "aws_secret_access_key": "...",
        "region_name": "us-west-2"
    }
)

# Redis
BrowserStateOptions(
    user_id="agent123",
    redis_options={
        "host": "localhost",
        "port": 6379,
        "key_prefix": "browserstate"
    }
)

📚 Full API

await state.mount(session_id: str) -> str        # Restores session
await state.unmount() -> None                    # Uploads & cleans up session
await state.list_sessions() -> List[str]         # Lists all sessions
await state.delete_session(session_id: str)      # Deletes from storage
state.get_current_session() -> Optional[str]     # ID of mounted session
state.get_current_session_path() -> Optional[str]# Path to local session

🧪 Debugging & Reliability

BrowserState enables session capture after failed runs so you can:

  • Reproduce bugs locally
  • Test flows against known state
  • Cache login sessions across tests or agents

📫 Stay Updated

  • 🧠 Docs
  • 💬 GitHub
  • 📨 Join our waitlist or Slack for early access & support

Metadata

Release files for browserstate 0.0.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for browserstate 0.0.4
File Size Uploaded
browserstate-0.0.4.tar.gz 13.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for browserstate 0.0.4
File Interpreter ABI Platform
browserstate-0.0.4-py3-none-any.whl Python 3 none any Details

Total release size: 31.2 kB

Release files / browserstate-0.0.4.tar.gz

Download URL browserstate-0.0.4.tar.gz
Size 13.3 kB
Tags Source
SHA-256 checksum
How to use checksums
6f023cd96c32e25218f32befd77477445485b198c64a5ea37b47376a79b514b1
BLAKE2b-256 checksum
How to use checksums
4ecc8b53c9dc9ce8e6bb478a7c7a349434f37aa95a697f63b96672e47b422b37
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.10.16

Release files / browserstate-0.0.4-py3-none-any.whl

Download URL browserstate-0.0.4-py3-none-any.whl
Size 17.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
209294b355cbcd404791ba10075d336169062cbebff239f64008cb11f87f4f4a
BLAKE2b-256 checksum
How to use checksums
36f630f98319c49f2ee69c3f92a9bdedc28f32821ffe8ba623899298f9a82a95
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.10.16

Release history Release notifications | RSS feed

This release

0.0.4 This release

2 release files

0.0.3

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page