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

# Use a Browser Session

> Connect to Driver with Playwright or Puppeteer.

After creating a hosted session, connect to the returned `cdpUrl` with a CDP-compatible automation client.

## Playwright

<CodeGroup>
  ```typescript TypeScript theme={null}
  import { chromium } from "playwright";
  import BrowsercashSDK from "@browsercash/sdk";

  const client = new BrowsercashSDK({
    apiKey: process.env.DRIVER_API_KEY!,
    baseURL: "https://api.driver.dev",
  });

  const session = await client.browser.session.create({ type: "hosted" });
  const browser = await chromium.connectOverCDP(session.cdpUrl);

  const context = browser.contexts()[0] || (await browser.newContext());
  const page = context.pages()[0] || (await context.newPage());

  await page.goto("https://example.com");
  console.log(await page.title());

  await browser.close();
  await client.browser.session.stop({ sessionId: session.sessionId });
  ```

  ```python Python theme={null}
  import os
  import requests
  from playwright.sync_api import sync_playwright

  resp = requests.post(
      "https://api.driver.dev/v1/browser/session",
      headers={"Authorization": f"Bearer {os.getenv('DRIVER_API_KEY')}"},
      json={"type": "hosted"},
  )
  resp.raise_for_status()
  session = resp.json()

  try:
      with sync_playwright() as p:
          browser = p.chromium.connect_over_cdp(session["cdpUrl"])
          context = browser.contexts[0] if browser.contexts else browser.new_context()
          page = context.pages[0] if context.pages else context.new_page()
          page.goto("https://example.com")
          print(page.title())
          browser.close()
  finally:
      requests.delete(
          "https://api.driver.dev/v1/browser/session",
          headers={"Authorization": f"Bearer {os.getenv('DRIVER_API_KEY')}"},
          params={"sessionId": session["sessionId"]},
      )
  ```
</CodeGroup>

## Puppeteer

```typescript theme={null}
import puppeteer from "puppeteer-core";

const browser = await puppeteer.connect({
  browserWSEndpoint: session.cdpUrl,
});

const page = await browser.newPage();
await page.goto("https://example.com");
console.log(await page.title());

await browser.disconnect();
```

## Cleanup

Close or disconnect your automation client, then stop the Driver session through the API. Stopping the session is what releases the browser and ends billing.

```bash theme={null}
curl -X DELETE "https://api.driver.dev/v1/browser/session?sessionId=$SESSION_ID" \
  -H "Authorization: Bearer $DRIVER_API_KEY"
```
