> ## Documentation Index
> Fetch the complete documentation index at: https://docs.browserbase.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Contexts

> Reuse cookies, authentication, and application data across browser sessions.

Contexts allow you to **persist user data across multiple browser sessions**, enabling smoother automation, seamless authentication, and faster end-to-end workflows.

By default, each Browserbase session starts with a fresh user data directory, so cookies and application data reset between sessions. With Contexts, you can reuse this data across sessions, making automation workflows more reliable and eliminating repeated logins. Browser cookies are stored in the [user data directory](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/user_data_dir.md).

**Contexts are configured by:**

1. Creating a Context via the [Contexts API](/reference/api/create-a-context)
2. Passing the Context ID into the [Create Sessions API](/reference/api/create-a-session)

<Callout icon="code" color="#6ec202" iconType="regular">View or run the example template [here](https://www.browserbase.com/templates/context)</Callout>

### Why use Contexts?

* **Reusing cookies & session data**: Maintain login states across multiple sessions without needing to log in repeatedly.
* **Preserving authentication**: Store and reuse authentication tokens, reducing the need to re-enter credentials.
* **Retaining application data**: Persist localStorage, IndexedDB, and other site-specific data written by web applications.
* **Faster workflows**: Skip login flows and re-authentication steps, reducing the total time of your automation runs.

<Accordion title="What data does a Context store?">
  A Context persists the contents of the Chromium user data directory, including:

  * **Cookies** — including session cookies, explicitly backed up and restored between sessions
  * **localStorage** — per-origin key-value storage
  * **IndexedDB** — structured client-side databases
  * **Session Storage** — tab-scoped storage
  * **Service Workers** — site-controlled caching and offline support
  * **Web Data** — form autofill entries and saved form data
  * **Browser preferences** — site-level settings, permissions, and security state (e.g., HSTS)

  Contexts don't include the browser's HTTP cache (images, CSS, JS, fonts) — each session fetches page assets fresh from the network. However, sites that use Service Workers to cache assets can see improved page load times, since the Service Worker and its cache are persisted across sessions.
</Accordion>

<Note>
  Context data can include stored credentials and other sensitive browsing
  data. Because of this, Contexts are uniquely encrypted at rest to ensure
  security.
</Note>

## Create a Context

To create a Context, use the Create Context API. This returns a **unique Context ID** that you can pass into new sessions to persist data.

<Tabs>
  <Tab title="Node.js">
    <CodeGroup>
      ```ts SDK theme={null}
      import { Browserbase } from "@browserbasehq/sdk";

      const bb = new Browserbase({ apiKey: process.env.BROWSERBASE_API_KEY! });
      const context = await bb.contexts.create();

      console.log("Context ID:", context.id);
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Python">
    <CodeGroup>
      ```python SDK theme={null}
      from browserbase import Browserbase
      import os

      bb = Browserbase(api_key=os.environ["BROWSERBASE_API_KEY"])
      context = bb.contexts.create()

      print("Context ID:", context.id)
      ```
    </CodeGroup>
  </Tab>

  <Tab title="cURL">
    <CodeGroup>
      ```bash cURL theme={null}
      curl -X POST https://api.browserbase.com/v1/contexts \
        -H "Content-Type: application/json" \
        -H "X-BB-API-Key: $BROWSERBASE_API_KEY" \
        -d '{}'
      ```
    </CodeGroup>
  </Tab>
</Tabs>

## Use a Context

After creating a Context, use it in a new session to reuse cookies, authentication, and application data. This creates a returning user experience, speeding up your workflow and eliminating repeated logins.

<Note>
  After closing a session with `persist: true`, wait a few seconds before reusing the Context to ensure data is synchronized.
</Note>

Here's an example of how to use a Context in a new session, **this example uses the Context ID from the previous example**.

<Tabs>
  <Tab title="Node.js">
    <CodeGroup>
      ```ts SDK theme={null}
      import { Browserbase } from "@browserbasehq/sdk";

      const bb = new Browserbase({ apiKey: process.env.BROWSERBASE_API_KEY! });

      // Use the context ID from the previous example
      const contextId = "<context-id>";

      const session = await bb.sessions.create({
        browserSettings: {
          context: {
            id: contextId,
            persist: true,
          },
        },
      });

      console.log("Session URL: https://browserbase.com/sessions/" + session.id);
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Python">
    <CodeGroup>
      ```python SDK theme={null}
      from browserbase import Browserbase
      import os

      bb = Browserbase(api_key=os.environ["BROWSERBASE_API_KEY"])

      # Use the context ID from the previous example
      context_id = "<context-id>"

      session = bb.sessions.create(
        browser_settings={
          "context": {
            "id": context_id,
            "persist": True
          }
        }
      )

      print("Session URL: https://browserbase.com/sessions/" + session.id)
      ```
    </CodeGroup>
  </Tab>
</Tabs>

### Set persist

If you need to store new cookies, authentication tokens, or application data, you must set `persist: true` when creating a session. This ensures that any changes made during the session—such as logging in or saving site preferences—are retained for future sessions instead of being lost when the session ends. The data will be saved when the session closes.

`persist: false` prevents changes from being saved to the Context. It's useful for less common use cases, such as:

* **Read-only session**: If you need to access saved cookies or data without modifying them.
* **Prevent session state changes**: Avoids overwriting stored login tokens or user data.

## Login workflow

A typical flow to persist a website login across Browserbase sessions would be as follows:

1. **Create a Context** (get a `contextId`).
2. **Start a first Browserbase session** with that `contextId` and `persist: true`.
3. **Log in** to a website inside this first session, either manually through the [live view feature](/platform/browser/observability/session-live-view#getting-started) or programmatically.
4. **End this session**.
5. **Wait a few seconds** to ensure that the Context is updated.
6. **Start a second Browserbase session** (and future sessions) with the **same** `contextId` and visit the same website — you should now be signed in automatically without having to repeat the login process.

### Login best practices

Browserbase Contexts don't expire (see [Context expiration](#context-expiration)), but sites can still force a log out. Here are a few additional best practices:

* **Avoid simultaneous logins** — Avoid having multiple sessions using the same Context at once. Sites may force a log out.
* **Use a consistent geolocation** — Some sites check user location, use a [geolocated proxy](/platform/identity/proxies#set-proxy-geolocation) for these cases.
* **One Context per site, per login** — Prevent an individual Context from becoming too large, which can slow down your session.

## Context expiration

Contexts **live indefinitely** on Browserbase's infrastructure. Once created, a Context persists until you explicitly delete it or it becomes invalidated. You can create a Context once and reuse it across sessions for weeks or months.

However, there are several ways a Context can become invalid or unusable:

### Client-side invalidation

* **Explicit deletion**: Calling the [Delete Context API](/reference/api/delete-a-context) permanently removes the Context
* **Project deletion**: If the parent project is deleted, all associated Contexts are removed
* **Account changes**: Account suspension or deletion will invalidate all Contexts

### Application-level invalidation

While the context itself persists, the **data stored within it** can become stale or invalid due to external factors:

* **Session expiration**: Websites may expire authentication cookies after a set period (e.g., 30 days), requiring re-authentication even with a persisted Context
* **Password changes**: If you change your password on a website, stored session cookies may be invalidated by that website
* **Server-side logout**: Websites can invalidate sessions server-side (e.g., "log out of all devices")
* **Token revocation**: OAuth tokens or API keys stored in cookies may be revoked by the service provider
* **Security events**: Websites may force re-authentication after detecting suspicious activity

<Note>
  To handle application-level invalidation, implement checks in your automation
  to detect logged-out states and re-authenticate when necessary.
</Note>

## Delete a Context

When you no longer need a Context, delete it using the [Delete Context API](/reference/api/delete-a-context). Once deleted, a Context can't be used to create new sessions.

<Note>
  Deleting a Context is permanent and can't be undone.
</Note>

<Tabs>
  <Tab title="Node.js">
    <CodeGroup>
      ```typescript SDK theme={null}
      import { Browserbase } from "@browserbasehq/sdk";

      const bb = new Browserbase({ apiKey: process.env.BROWSERBASE_API_KEY! });

      const contextId = "<context-id>";
      await bb.contexts.delete(contextId);

      console.log("Context deleted");
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Python">
    <CodeGroup>
      ```python SDK theme={null}
      from browserbase import Browserbase
      import os

      bb = Browserbase(api_key=os.environ["BROWSERBASE_API_KEY"])

      context_id = "<context-id>"
      bb.contexts.delete(context_id)

      print("Context deleted")
      ```
    </CodeGroup>
  </Tab>

  <Tab title="cURL">
    <CodeGroup>
      ```bash cURL theme={null}
      curl -X DELETE https://api.browserbase.com/v1/contexts/<context-id> \
        -H "X-BB-API-Key: $BROWSERBASE_API_KEY"
      ```
    </CodeGroup>
  </Tab>
</Tabs>

<Card title="Handling authentication" icon="lock" href="/platform/identity/authentication">
  Once you set up Contexts, follow the authentication guide to easily log into
  websites.
</Card>
