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

# Overview

> A real browser your agent drives directly, over plain CDP.

export const OutcrawlStyles = () => {
  if (typeof document !== 'undefined' && !document.getElementById('outcrawl-overrides')) {
    const s = document.createElement('style');
    s.id = 'outcrawl-overrides';
    s.textContent = `
      /* Match the product's radius grid (4 / 6 / 8 / 9999), not Mintlify's default. */
      .rounded-sm { border-radius: 0.375rem !important; } /* 6px, --r-ctl */
      .rounded-md { border-radius: 0.375rem !important; } /* 6px, --r-ctl */
      .rounded-lg { border-radius: 0.5rem !important; }   /* 8px, --r-panel */
      .rounded-l-sm { border-top-left-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; }
      .rounded-r-sm { border-top-right-radius: 0.375rem !important; border-bottom-right-radius: 0.375rem !important; }
      .rounded-l-md { border-top-left-radius: 0.375rem !important; border-bottom-left-radius: 0.375rem !important; }
      .rounded-r-md { border-top-right-radius: 0.375rem !important; border-bottom-right-radius: 0.375rem !important; }
      .rounded-l-lg { border-top-left-radius: 0.5rem !important; border-bottom-left-radius: 0.5rem !important; }
      .rounded-r-lg { border-top-right-radius: 0.5rem !important; border-bottom-right-radius: 0.5rem !important; }

      /* Cards: never pure white in light mode, matching the one-big-card surface tone. */
      .card { background-color: #fcfcfc !important; border-radius: 0.5rem !important; }
      html.dark .card { background-color: #141311 !important; }

      /* Docs hero box */
      .oc-hero { background-color: #fcfcfc; border: 1px solid #e5e2dc; }
      html.dark .oc-hero { background-color: #141311; border-color: #26241f; }
      html.dark .oc-hero h1 { color: #edeae4; }

      /* Thin, transparent-track, hide-until-hover scrollbar. */
      ::-webkit-scrollbar { width: 6px; height: 6px; background-color: transparent; }
      ::-webkit-scrollbar-track { background-color: transparent; }
      ::-webkit-scrollbar-thumb { background-color: rgba(155, 155, 155, 0.5); border-radius: 10px; transition: opacity 0.3s ease; opacity: 0; }
      ::-webkit-scrollbar-thumb:hover { background-color: rgba(155, 155, 155, 0.7); }
      *:hover::-webkit-scrollbar-thumb,
      *:focus::-webkit-scrollbar-thumb,
      *:active::-webkit-scrollbar-thumb { opacity: 1; }
      * { scrollbar-width: thin; scrollbar-color: rgba(155, 155, 155, 0.5) transparent; }
    `;
    document.head.appendChild(s);
  }
  return null;
};

<OutcrawlStyles />

Live browser control is **TypeScript-SDK only**. Not Python, not the CLI, not MCP. It needs a CDP connection held open in the caller's own process, so it is the one capability that cannot be a REST endpoint; the API, MCP and CLI reach the same underlying page work through [agents](/docs/agents/overview) and [scrape](/docs/scrape/overview) instead, which run the loop on our side. That is a difference in kind, not a missing feature.

The rate is **1 credit per minute** of session time, plus proxy usage at 2,000 credits per GB. An agent driving the browser adds its model's usage on top, see [pricing](/docs/billing/pricing).

```typescript theme={"theme":{"light":"github-light","dark":"catppuccin-mocha"}}
import { Outcrawl } from '@outcrawl/sdk';

const oc = new Outcrawl();
const profile = await oc.profiles.create({ label: 'demo-user-42' }); // minted once, reused by id
const browser = await oc.browser({ profile: profile.id });           // its cookies and logins persist
const page = await browser.newPage();
await page.goto('https://practicetestautomation.com/practice-test-login/'); // a public demo login
await page.fill('#username', 'student');     // human input model, the default
await page.fill('#password', 'Password123');
await page.click('#submit');
await page.raw.waitForURL('**/logged-in-successfully/');
console.log(await page.title());             // "Logged In Successfully | Practice Test Automation"
await browser.close();
```

`BrowserOptions` is exactly `{ profile, proxy, record }`. `profile` is a profile from [account/profiles](/docs/account/profiles), pass one to keep a login across sessions. `record` is on by default, every session gets a replay, see [sessions](/docs/browsers/sessions).

**You bring no infrastructure.** There are no proxies to buy or browsers to run yourself. `oc.browser()` allocates a session on the fleet and connects to it over CDP, nothing launches locally, and every request already leaves from a residential exit. You name a geography, not an exit list.

<CardGroup cols={2}>
  <Card title="Human input model" icon="pointer" href="/docs/browsers/human-input">
    Why `click`, `fill` and `type` behave the way they do by default.
  </Card>

  <Card title="Sessions" icon="player-play" href="/docs/browsers/sessions">
    Every browser run produces a replay you can watch or export.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.