Introduction
What Tabstack is, what it does, and which capability fits your use case.
What Tabstack is
Section titled “What Tabstack is”Tabstack is a web intelligence API for AI agents. It gives your agent three things it usually cannot do on its own: pull structured data from a page, answer a question from across the web with citations, and act inside a live browser. Each one is a managed endpoint. You call an API and get a result. There is no browser fleet, proxy pool, or parsing pipeline to own or maintain.
The three capabilities
Section titled “The three capabilities”Pick the capability that matches what your agent needs from the web right now.
Extract
Section titled “Extract”Give Extract a URL and a JSON schema. It fetches the page and returns JSON that matches your schema, with proper types. Reach for it when the data you need is already on a page you can point at, and you want it structured rather than parsed by hand.
Endpoint: /extract/json
import Tabstack from "@tabstack/sdk";
const client = new Tabstack();
const result = await client.extract.json({ url: "https://news.ycombinator.com", json_schema: { type: "object", properties: { stories: { type: "array", items: { type: "object", properties: { title: { type: "string" }, points: { type: "number" }, }, }, }, }, },});from tabstack import Tabstack
client = Tabstack()
result = client.extract.json( url="https://news.ycombinator.com", json_schema={ "type": "object", "properties": { "stories": { "type": "array", "items": { "type": "object", "properties": { "title": {"type": "string"}, "points": {"type": "number"}, }, }, }, }, },)The response matches your schema exactly:
{ "stories": [ { "title": "New AI Model Released", "points": 342 }, { "title": "Database Performance Tips", "points": 156 } ]}Research
Section titled “Research”Give Research a question. It selects sources, reads them, and returns a synthesized answer with the sources it cited. The call streams over Server-Sent Events. Reach for it when your agent needs to answer a question from the web and your users need to verify where the answer came from.
Endpoint: /research
import Tabstack from "@tabstack/sdk";
const client = new Tabstack();
const stream = await client.agent.research({ query: "What are the main approaches to browser automation for AI agents?", mode: "fast",});
for await (const event of stream) { if (event.event === "error") { throw new Error(event.data.error?.message ?? "Research failed"); } if (event.event === "complete") { console.log(event.data.report); console.log(event.data.metadata.citedPages); }}from tabstack import Tabstack
client = Tabstack()
for event in client.agent.research( query="What are the main approaches to browser automation for AI agents?", mode="fast",): if event.event == "error": raise RuntimeError(event.data.error.message if event.data.error else "Research failed") if event.event == "complete": print(event.data.report) print(event.data.metadata.cited_pages)Progress events (start, iteration:start, and so on) stream first. The complete event carries the report and its cited sources:
{ "report": "There are three main approaches...", "metadata": { "citedPages": [ { "id": "src-1", "url": "https://example.com/browser-automation", "title": "Browser Automation Approaches", "claims": ["Playwright is commonly used for browser automation"] } ] }}Automate
Section titled “Automate”Give Automate a task in plain language and a starting URL. An agent runs it in a managed browser, navigating, clicking, and filling forms as needed, streaming its progress over SSE. Reach for it when reading the page is not enough and you need to interact with it.
Endpoint: /automate
import Tabstack from "@tabstack/sdk";
const client = new Tabstack();
const stream = await client.agent.automate({ task: "Find the top 3 trending repositories and extract their names", url: "https://github.com/trending",});
for await (const event of stream) { if (event.event === "error") { throw new Error(event.data.error?.message ?? "Automate failed"); } // `complete` carries the result; a final `done` event then closes the stream. if (event.event === "complete" && event.data.success) { console.log(event.data.finalAnswer); }}from tabstack import Tabstack
client = Tabstack()
stream = client.agent.automate( task="Find the top 3 trending repositories and extract their names", url="https://github.com/trending",)
for event in stream: if event.event == "error": raise RuntimeError(event.data.error.message if event.data.error else "Automate failed") # `complete` carries the result; a final `done` event then closes the stream. if event.event == "complete" and event.data.success: print(event.data.final_answer)The final result arrives on the complete event:
{ "success": true, "finalAnswer": "Top 3 repos: awesome-ai, web-framework, data-viz", "stats": { "iterations": 4, "durationMs": 12840 }}Where to go next
Section titled “Where to go next”- Make your first API call — the Quickstart walks you from API key to first response.
- Understand how extraction works — JSON Extraction covers schema design and the extraction model in depth.
- See real use cases — the examples show full applications built on these endpoints.