Tessera documentation
Everything you need to run stealth browsers in the cloud, route them through residential proxies and extract structured data, from your first session to ten thousand.
Introduction
Tessera gives every agent and script a real Chromium browser in the cloud. You connect over the Chrome DevTools Protocol, so any tool that drives Chrome locally works on Tessera with a one-line change.
- Browser Cloud starts isolated browsers in 14 regions in under 200 ms.
- Proxy Network routes traffic through residential IPs in 195 countries.
- Extract API turns any rendered page into validated JSON.
- Live View streams sessions so humans can watch or take over.
Quickstart
1. Install the SDK
npm install @tessera/sdk playwright-core
pnpm add @tessera/sdk playwright-core
pip install tessera playwright
go get github.com/tessera-labs/tessera-go
2. Add your API key
Create a key in the console and export it. The SDK reads TESSERA_API_KEY automatically.
TESSERA_API_KEY=tsr_live_••••••••••••••••
3. Launch your first session
import { chromium } from "playwright-core";
import { Tessera } from "@tessera/sdk";
const tessera = new Tessera();
const session = await tessera.sessions.create({ region: "us-east", stealth: true });
const browser = await chromium.connectOverCDP(session.wsUrl);
const page = await browser.newPage();
await page.goto("https://shop.acme.dev/deals");
console.log(await page.title());
from playwright.async_api import async_playwright
from tessera import Tessera
tessera = Tessera()
session = tessera.sessions.create(region="us-east", stealth=True)
async with async_playwright() as p:
browser = await p.chromium.connect_over_cdp(session.ws_url)
page = await browser.new_page()
await page.goto("https://shop.acme.dev/deals")
print(await page.title())
4. Extract structured data
const deals = await tessera.extract(page, {
schema: { name: "string", price: "number", url: "url" },
many: true,
});
// → [{ name: "Aero Runner 2", price: 129, url: "…" }, …]liveUrl you can open in the browser or embed in your app.Authentication
All requests are authenticated with a bearer token. Keys are scoped to a project and can be limited to read-only or to specific regions.
curl https://api.tessera.dev/v1/sessions \ -H "Authorization: Bearer $TESSERA_API_KEY"
Sessions
A session is one isolated browser with its own fingerprint, cookies and network identity. Sessions close automatically after 5 minutes idle or when you call close(), whichever comes first.
- Create a session with options like region, proxy and profile.
- Connect with Playwright, Puppeteer or Selenium using the
wsUrl. - Close it to stop billing, or let the idle timeout do it for you.
To keep logins between runs, pass a profile. Cookies, local storage and IndexedDB are saved when the session closes and restored the next time you use that profile.
Stealth & fingerprints
Stealth mode is on by default. Each session gets a coherent device fingerprint (OS, GPU, fonts, screen and timezone), matching TLS and HTTP/2 signatures, and automatic CAPTCHA solving.
You can pin a fingerprint family with fingerprint: { os: "macos", browser: "chrome" }, or disable stealth for internal QA targets.
Proxies
Pass proxy: "residential" to route through our pool, optionally with country, city or asn. Set sticky: "30m" to keep the same IP across navigations.
await tessera.sessions.create({
proxy: { type: "residential", country: "DE", city: "berlin", sticky: "30m" },
});Extraction
The Extract API accepts a schema and returns JSON that matches it. Every field includes a confidence score and the DOM snippet it came from, so you can audit results.
Schemas can be plain objects, Zod, Pydantic or JSON Schema. Set many: true to extract a list.
Live view
Open session.liveUrl to watch a running browser. Add ?control=true to let a human take over input, then hand control back to your agent with session.resume().
Create session
| Parameter | Description |
|---|---|
| regionstring | One of 14 regions, or auto. Defaults to auto. |
| stealthboolean | Enables fingerprinting and CAPTCHA solving. Defaults to true. |
| proxyobject | Proxy type, country, city, ASN and stickiness. |
| profilestring | Name of a persistent profile to restore and save. |
| timeoutnumber | Idle timeout in seconds. Max 86,400. |
{
"id": "ses_8f2k1a",
"status": "running",
"region": "us-east-1",
"wsUrl": "wss://connect.tessera.dev/ses_8f2k1a",
"liveUrl": "https://live.tessera.dev/ses_8f2k1a"
}Extract
| Parameter | Description |
|---|---|
| urlstring | Page to load. Omit when passing a session. |
| sessionstring | Extract from the current page of a running session. |
| schemaobject | Shape of the data to return. |
| manyboolean | Return an array of matches instead of one object. |
Get session
Returns status, duration, region, bytes transferred and the replay URL once the session has closed.
Close session
Closes the browser immediately and stops billing. Profiles attached to the session are saved first.
SDKs
| Language | Install |
|---|---|
| Node.js | npm install @tessera/sdk |
| Python | pip install tessera |
| Go | go get github.com/tessera-labs/tessera-go |
| CLI | npx tessera init |
Errors & limits
| Code | Meaning |
|---|---|
| 401 | Missing or invalid API key. |
| 402 | Spend cap reached. Raise it in billing settings. |
| 409 | Profile is already in use by another session. |
| 429 | Concurrency limit reached for your plan. Retry with backoff. |
| 503 | Region temporarily at capacity. We retry in another region if region: "auto". |