--- title: Introduction | Tabstack description: What Tabstack is, what it does, and which capability fits your use case. --- ## 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 Pick the capability that matches what your agent needs from the web right now. ### 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` - [TypeScript](#tab-panel-129) - [Python](#tab-panel-130) 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" }, }, }, }, }, }, }); ``` extract.py ``` 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: Response ``` { "stories": [ { "title": "New AI Model Released", "points": 342 }, { "title": "Database Performance Tips", "points": 156 } ] } ``` ### 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` - [TypeScript](#tab-panel-131) - [Python](#tab-panel-132) 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); } } ``` research.py ``` 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: 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"] } ] } } ``` ### 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` - [TypeScript](#tab-panel-133) - [Python](#tab-panel-134) 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); } } ``` automate.py ``` 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: Response (complete event) ``` { "success": true, "finalAnswer": "Top 3 repos: awesome-ai, web-framework, data-viz", "stats": { "iterations": 4, "durationMs": 12840 } } ``` ## Where to go next - **Make your first API call** — the [Quickstart](/getting-started/quick-start/index.md) walks you from API key to first response. - **Understand how extraction works** — [JSON Extraction](/guides/how-to-extract-json/index.md) covers schema design and the extraction model in depth. - **See real use cases** — the [examples](/examples/price-monitor/index.md) show full applications built on these endpoints.