stream ▸ session live 0

Watch the AI drive a live browser.

Open a live session and watch AI operate a real, logged-in browser turn by turn: read a page, fill a form, pull the result. Long-running runs you can watch and steer, with a separate tab per conversation.

A live session, watched turn by turn

chat Atab-1live

"Read the latest invoice total."

chat Btab-2live

"Export this month's orders."

Steer mid-run: send the next turn any time.

why ▸ live · steerable · signed 2
Live, not a black boxEvery turn streams as it happens: the page, the action, the result.
Steer it mid-runSend the next instruction any time; the session stays warm between turns.
Signed in as your personaIdentity, fingerprint, and 2FA are applied when the session starts.
vs ▸ cold vs warm 5
01
the ledger

Cold automation vs. a live session

A cold, per-call browser pays the login and warm-up tax on every request and loses its state. A live session authenticates once, stays logged in, and lets you watch and drive it turn by turn. Long, multi-step runs feel continuous.

CriterionLive sessionCold, per-call
Login / warm-up cost Paid once, reused Paid on every call
Page & session state Kept between turns Lost after each call
Visibility Watch each turn stream Opaque until it returns
Long, multi-step runs Continuous, steer as it goes Stitched across separate runs

Live session compared to cold per-call automation

id ▸ signed as your persona 9
02
identity

Signed in as your persona, before the first turn

Link a persona to a session and Writ applies it at start: the account identity, a consistent browser profile, and stored session state. Email and SMS one-time codes and TOTP are handled up front, so the AI lands on a page already logged in as you.

  • Identity and a consistent browser profile resolved from the persona at session start.
  • TOTP and mailbox / SMS one-time codes cleared before the run begins.
  • On your own authorized accounts: authorized-access automation, not circumvention.

Applied at session start

  • Persona identity + browser profile
  • TOTP · email / SMS OTP
  • Stored session state

The AI takes its first turn already logged in as you.

fn ▸ callable handlers 13
03
handlers

Callable handlers

Define handlers on a live session and call them by name. Each handler is a unit of browser work you control (navigate, fill, extract, click through a multi-step flow), invoked on the warm, logged-in session. Handlers are deterministic: they do exactly what you defined, on the page state that's already there.

call-handler.http
// Invoke a named handler on a warm, logged-in session.
POST /v1/streaming/{session}/handlers/extract_orders
Authorization: Bearer wt_...

{
  "since": "2026-06-01",
  "status": "shipped"
}
  • Invoke by name on a live session.
  • Operate on existing page state, with no re-login per call.
  • Compose handlers into longer flows.
oai ▸ openai-compatible 17
04
drop-in chat

OpenAI-compatible chat API

Point any OpenAI-compatible client at a Writ streaming session and chat with it like a model, except the "model" is a real browser acting on a real site. Each message lands in your own handler script — a JS handler you write — which drives the page and streams the reply. No AI model receives anything unless you put one in your handler. Use the SDKs and tools you already have; swap the base URL.

cURL
curl https://api.usewrit.app/v1/streaming/{session}/chat/completions \
  -H "Authorization: Bearer wt_..." \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [
      { "role": "user", "content": "Open the latest invoice and read the total." }
    ],
    "user": "conversation-7"
  }'
Python
from openai import OpenAI

# Drop-in: bring your existing OpenAI client, swap the base URL.
client = OpenAI(
    base_url="https://api.usewrit.app/v1/streaming/{session}",
    api_key="wt_...",
)

resp = client.chat.completions.create(
    model="writ-browser",
    messages=[{"role": "user", "content": "Open the latest invoice and read the total."}],
    user="conversation-7",  # routes to its own browser tab
)
print(resp.choices[0].message.content)

Drop-in compatible: bring your existing OpenAI client and change the base URL. The browser acts on your own authenticated accounts; this is authorized-access automation, not circumvention.

iso ▸ a tab per conversation 21
05
isolation

A tab per conversation

Run several conversations against one session and each gets its own browser tab. Conversation state stays isolated; one chat's navigation and page context never bleed into another's. A stuck turn in one conversation can't wedge the others; turns are bounded and recoverable per tab.

One live session
tab-1conversation-7
tab-2conversation-8
tab-3conversation-9
  • routingPer-conversation tab routing, so chats don't collide.
  • timeoutsPer-turn timeouts so one slow turn can't block the rest.
  • recoveryTab reload and recovery built in.
mtr ▸ real token accounting 25
06
billing

BYO-AI is unbilled. Managed AI is metered.

Bring your own AI keys on a local/BYO agent and that AI is unbilled by Writ: you pay your provider directly, or run a local model for zero per-token cost. When a session uses managed cloud AI, you see real token usage per turn, the same numbers your provider would bill.

Managed AI is billed by tokens, metered from your wallet, the same token usage your provider would report, with the price shown before you run. BYO-AI on a local/BYO agent is the unbilled path; managed cloud AI is the metered path.

How AI is billed

$3.20per million tokens
meteredmanaged token cost
unbilledBYO-AI on a local agent

Managed AI is metered purely by tokens used, with no per-call minimum. Local/BYO runs carry no compute charge. See billing & wallet.

ag ▸ built for agents 29
07
For AI agents

Built for agents

Streaming is how an AI agent operates a website as a living tool: keep a session warm, send it turns, watch each one, get structured results, hand it the next instruction. Combined with managed endpoints and MCP, your agent can call a Writ workflow as a tool and drive a live browser as a conversation, on sites that never shipped an API.

app ▸ session surface 33
tab-1 · conversation-7 tab-2 · conversation-8 session warm · authenticated
extract_orders read_invoice_total export_csv refresh_session

The Streaming surface: a live session, callable handlers, and the per-conversation tab strip.

faq ▸ questions logged 37
08
faq

Questions, answered

Can I really watch the AI work?

Yes. A streaming session logs each turn as it happens: the page it is on, the handler it called, and the result. You can send the next instruction while it runs.

How does the session sign in as me?

Link a persona and Writ applies it at session start: a stable, consistent browser identity and stored session state, with TOTP and email / SMS one-time codes handled up front. The first turn happens already logged in.

Is the chat API really OpenAI-compatible?

Yes. It exposes an OpenAI-compatible chat surface, so you can point an existing OpenAI client at a Writ streaming session by changing the base URL.

Do multiple conversations interfere with each other?

No. Each conversation runs in its own tab with isolated state, per-turn timeouts, and tab recovery.

How is AI billed in a streaming session?

Bring your own AI keys on a local/BYO agent and that AI is unbilled by Writ. Managed cloud AI is metered by tokens used, with the price shown before you run.

Does it run on my own accounts?

Yes. The browser acts on your own authenticated accounts, on sites you are authorized to use.

go ▸ open a session 41

Open a live session.

Watch AI drive a logged-in browser, and steer it turn by turn.

Writ runs on your own accounts, with your own credentials and data, on sites you are authorized to use.