Skip to content
Get started

Introduction

What Tabstack is, what it does, and which capability fits your use case.

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.

Pick the capability that matches what your agent needs from the web right now.

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

extract.ts
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" },
},
},
},
},
},
});

The response matches your schema exactly:

Response
{
"stories": [
{ "title": "New AI Model Released", "points": 342 },
{ "title": "Database Performance Tips", "points": 156 }
]
}

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

research.ts
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);
}
}

Progress events (start, iteration:start, and so on) stream first. The complete event carries the report and its cited sources:

Response (complete event)
{
"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"]
}
]
}
}

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

automate.ts
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);
}
}

The final result arrives on the complete event:

Response (complete event)
{
"success": true,
"finalAnswer": "Top 3 repos: awesome-ai, web-framework, data-viz",
"stats": { "iterations": 4, "durationMs": 12840 }
}
  • Make your first API call — the Quickstart walks you from API key to first response.
  • Understand how extraction worksJSON Extraction covers schema design and the extraction model in depth.
  • See real use cases — the examples show full applications built on these endpoints.