AI agents, inside your product
The ready-to-run backend for agentic products. Each customer gets an isolated workspace and connects their own accounts. Your agents run with the tools you allow, and you hear about every step.
Your product
Move anything overdue to next sprint.
3 issues are overdue. I'll move them.
Planner wants to run update_issue ×3
ApproveDeny
Your backendholds the API key, starts runs, sends decisions
AcmeGlobexInitech+ 2,481 workspaces
- Connected accountsHosted Connect, OAuth and MCP sign-in. Tokens sealed and refreshed.
- Tool policyEvery call checked against your floor and the agent's grant.
- Durable runsThe agent loop, saved step by step. Survives restarts.
- Webhooks and auditSigned events to your backend. Every change on record.
Their apps, through MCP
- Linear
- Notion
- GitHub
- Stripe
- any MCP server
Your models, your keys
- Anthropic
- OpenAI
- OpenRouter
- 01
A workspace per customer
Each of your customers gets an isolated workspace, tied to your own ID for them. Nothing crosses between workspaces or organizations.
- 02
Their accounts, connected
A hosted Connect page signs them in to Linear, Notion or any MCP app. Zupflow seals the credentials and keeps tokens fresh.
- 03
Tools you choose
Grant an agent specific tools. Your policy decides which calls run, which wait for a person’s approval, and which are refused.
- 04
Runs you can trust
Start a run from your product. Every step is recorded, approvals pause it, and webhooks tell you when it’s done.
In your backend
Section titled “In your backend”A few calls take a customer from nothing to an agent running with their own accounts.
import { createClient, createHttpTransport } from "@zupflow/sdk";
const zupflow = createClient( createHttpTransport({ baseUrl, getToken: async () => apiKey }),);
// One workspace per customer, with your own ID for them.const ws = await zupflow.workspaces.create(orgId, { name: "Acme", slug: "acme", environment: "production", external_id: "cus_1042",});
// Link their Linear account through hosted Connect.const connect = await zupflow.connectSessions.create( ws.id, { app_id: linearId, intent: "create", label: "Linear", installation_id: null, return_url: returnUrl },);
// Run an agent with the tools you granted it.await zupflow.runs.create(ws.id, agentId, { input: "Move overdue issues to next sprint.",});Built for production
Section titled “Built for production”- Isolation by design
- Organization and workspace scopes are explicit in every query, key and test.
- Sandbox and Production
- Two environments with separate keys, apps and models. Configuration never leaks across.
- Durable runs
- Each step is saved before it’s taken. An interrupted run resumes, and a tool call is never sent twice.
- Your models
- Connect OpenAI, Anthropic or OpenRouter per environment and pick a model per agent.
- Signed webhooks
- Runs, approvals and connected accounts, delivered at least once and retried for a day.
- A full audit log
- Every change, with who made it and where, kept even after a workspace is gone.