Docs/Getting started

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.
New to Tessera? The Quickstart gets you from zero to extracted data in about five minutes.

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.

.env
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

extract.ts
const deals = await tessera.extract(page, {
  schema: { name: "string", price: "number", url: "url" },
  many: true,
});
// → [{ name: "Aero Runner 2", price: 129, url: "…" }, …]
Tip: watch the session while it runs. Every session has a 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.

shell
curl https://api.tessera.dev/v1/sessions \
  -H "Authorization: Bearer $TESSERA_API_KEY"
Keep keys server-side. Never ship a live key in client code. Use short-lived session tokens for browser embeds.

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.

  1. Create a session with options like region, proxy and profile.
  2. Connect with Playwright, Puppeteer or Selenium using the wsUrl.
  3. 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.

proxy.ts
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

POSThttps://api.tessera.dev/v1/sessions
ParameterDescription
regionstringOne of 14 regions, or auto. Defaults to auto.
stealthbooleanEnables fingerprinting and CAPTCHA solving. Defaults to true.
proxyobjectProxy type, country, city, ASN and stickiness.
profilestringName of a persistent profile to restore and save.
timeoutnumberIdle timeout in seconds. Max 86,400.
response · 201
{
  "id": "ses_8f2k1a",
  "status": "running",
  "region": "us-east-1",
  "wsUrl": "wss://connect.tessera.dev/ses_8f2k1a",
  "liveUrl": "https://live.tessera.dev/ses_8f2k1a"
}

Extract

POSThttps://api.tessera.dev/v1/extract
ParameterDescription
urlstringPage to load. Omit when passing a session.
sessionstringExtract from the current page of a running session.
schemaobjectShape of the data to return.
manybooleanReturn an array of matches instead of one object.

Get session

GEThttps://api.tessera.dev/v1/sessions/{id}

Returns status, duration, region, bytes transferred and the replay URL once the session has closed.

Close session

DELETEhttps://api.tessera.dev/v1/sessions/{id}

Closes the browser immediately and stops billing. Profiles attached to the session are saved first.

SDKs

LanguageInstall
Node.jsnpm install @tessera/sdk
Pythonpip install tessera
Gogo get github.com/tessera-labs/tessera-go
CLInpx tessera init

Errors & limits

CodeMeaning
401Missing or invalid API key.
402Spend cap reached. Raise it in billing settings.
409Profile is already in use by another session.
429Concurrency limit reached for your plan. Retry with backoff.
503Region temporarily at capacity. We retry in another region if region: "auto".
Was this page helpful?