Skip to content

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
Zupflowthe agent backend, ready to run
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
Your customers stay in your product. Your backend calls Zupflow, and Zupflow does the rest: their accounts, the tools you allow, the model loop, approvals and every event back to you.
  1. 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.

  2. 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.

  3. 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.

  4. 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.

A few calls take a customer from nothing to an agent running with their own accounts.

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