--- title: Tabstack for eve | Tabstack description: Give your eve agents reliable web access with @tabstack/eve: schema-enforced extraction, research, generation, and browser automation as native eve tools. --- [`@tabstack/eve`](https://www.npmjs.com/package/@tabstack/eve) gives your [eve](https://vercel.com/eve) agents reliable web access: schema-enforced extraction, multi-source research, AI transformation, and browser automation, all as native eve tools backed by the official [`@tabstack/sdk`](https://www.npmjs.com/package/@tabstack/sdk). eve derives a tool’s name from its filename, so wiring Tabstack in is one re-export per tool file. ## Install - [npm](#tab-panel-233) - [pnpm](#tab-panel-234) - [yarn](#tab-panel-235) Terminal window ``` npm install @tabstack/eve eve zod ``` Terminal window ``` pnpm add @tabstack/eve eve zod ``` Terminal window ``` yarn add @tabstack/eve eve zod ``` `eve` (v0.24 or later) and `zod` (v3 or v4) are peer dependencies, so your app’s single instance of each is shared. ## Create and Setup Your API Key Before you can start using Tabstack API, you’ll need to create an API key and set it up in your environment. ### 1. Create Your API Key 1. Visit the [Tabstack Console](https://console.tabstack.ai/) 2. Sign in to your account (or create one if you haven’t already) 3. Navigate to the API Keys section and click the “Manage API Keys” 4. Once you are on the API Keys page, Click “Create New API Key” 5. Give your key a descriptive name (e.g., “Development”, “Production”) and click the “Create API Key” 6. Copy the generated API key and store it securely Your API key will only be shown once. Make sure to copy and store it in a secure location. ### 2. Set Up Environment Variable For security and convenience, we recommend storing your API key as an environment variable rather than hardcoding it in your scripts. macOS/Linux Terminal window ``` # Add to your shell profile (~/.bashrc, ~/.zshrc, or ~/.bash_profile) export TABSTACK_API_KEY="your_api_key_here" # Or set it temporarily for the current session export TABSTACK_API_KEY="your_api_key_here" # Reload your shell or run: source ~/.bashrc # or ~/.zshrc ``` Windows (Command Prompt) ``` # Set temporarily for current session set TABSTACK_API_KEY=your_api_key_here # Set permanently (requires restart) setx TABSTACK_API_KEY "your_api_key_here" ``` Windows (PowerShell) ``` # Set temporarily for current session $env:TABSTACK_API_KEY = "your_api_key_here" # Set permanently for current user [Environment]::SetEnvironmentVariable("TABSTACK_API_KEY", "your_api_key_here", "User") ``` ### 3. Verify Your Setup Test that your environment variable is set correctly: **macOS/Linux/Windows (Git Bash):** Terminal window ``` echo $TABSTACK_API_KEY ``` **Windows (Command Prompt):** Terminal window ``` echo %TABSTACK_API_KEY% ``` **Windows (PowerShell):** Terminal window ``` echo $env:TABSTACK_API_KEY ``` You should see your API key printed in the terminal. ## Quickstart Add a file per tool under `agent/tools/`, re-exporting a pre-built Tabstack tool as the file’s **default export**. The filename becomes the tool name: agent/tools/research\_question.ts ``` export { researchQuestionTool as default } from "@tabstack/eve"; ``` agent/tools/extract\_page\_content.ts ``` export { extractPageContentTool as default } from "@tabstack/eve"; ``` That is the whole wiring. eve auto-discovers the files, and the tools resolve `TABSTACK_API_KEY` lazily on first call, so your agent definition stays unchanged: agent/agent.ts ``` import { defineAgent } from "eve"; export default defineAgent({ model: "anthropic/claude-sonnet-4-6", }); ``` ## The tools | File name | Export | What it does | | ----------------------------- | ---------------------------- | ----------------------------------------------------------------- | | `extract_structured_data.ts` | `extractStructuredDataTool` | Pull specific fields from a URL into a JSON shape you define. | | `extract_page_content.ts` | `extractPageContentTool` | Fetch a page as clean markdown. | | `research_question.ts` | `researchQuestionTool` | Synthesize a cited answer across multiple pages. | | `generate_structured_data.ts` | `generateStructuredDataTool` | Fetch a page, then AI-transform it into derived or reshaped JSON. | | `automate_browser_task.ts` | `automateBrowserTaskTool` | Run a multi-step, natural-language browser task. | The filename must match the tool name in the table. eve’s tool identity is path-derived, so a renamed file renames the tool and breaks parity with the other Tabstack integrations. ### Tool inputs The model fills these in, but it helps to know the shapes: - `extract_structured_data`: `url`, `json_schema_json` (a JSON-encoded JSON Schema string). - `extract_page_content`: `url`. - `research_question`: `query`. - `generate_structured_data`: `url`, `instructions`, `json_schema_json`. - `automate_browser_task`: `task`, plus optional `url`, `guardrails`, `data`, `country`, `max_iterations`, `max_validation_attempts`. See [Schema design](/guides/schema-design/index.md) for writing `json_schema_json` that extracts reliably. ## Optional inputs The model can pass these for finer control; they are sent to Tabstack only when present. - `extract_structured_data`, `extract_page_content`, `generate_structured_data`: - `effort`: `"min"`, `"standard"`, or `"max"`. Use `"max"` for JS-heavy pages. See [Effort levels](/guides/effort-levels/index.md). - `nocache`: bypass the cache. - `country`: ISO 3166-1 alpha-2 code for [geotargeting](/guides/geotargeting/index.md). - `research_question`: `mode` (`"fast"` or `"balanced"`), `nocache`. - `automate_browser_task`: `guardrails` (constraints on what the agent may do), `data` (context for form filling), `country`, `max_iterations`, `max_validation_attempts`. ## Configuration For a custom API key or base URL, or to reuse one client, build the tools explicitly and re-export the one you want: agent/tools/research\_question.ts ``` import { createTabstackEveTools } from "@tabstack/eve"; const tools = createTabstackEveTools({ apiKey: process.env.MY_KEY }); // or pass an SDK client you already have: createTabstackEveTools({ client }) export default tools.research_question; ``` ## Error handling When a tool call fails it throws `TabstackToolError` (a normalized message plus an HTTP `status` for API errors). eve surfaces this in the tool result. eve hands the tool body unvalidated input, so each Tabstack tool re-validates against its own schema before the SDK call. Malformed model output fails fast as a `TabstackToolError` rather than reaching the API. Both Zod 3 and Zod 4 work: on Zod 4 the adapter advertises schemas via the built-in `z.toJSONSchema`, and on Zod 3 it falls back to `zod-to-json-schema`. ## Related - [Integrations overview](/integrations/index.md) - [Tabstack TypeScript SDK](/sdks/typescript/quickstart/index.md) - [Schema design](/guides/schema-design/index.md) - [Vercel AI SDK integration](/integrations/vercel-ai/index.md) and [Mastra integration](/integrations/mastra/index.md)