Catch the bad call before the provider does
Engine runs approved operations with declared parameters, so undeclared inputs and unsupported behaviour get rejected on the way out—rather than coming back as a provider error at an unsociable hour.
Turn integration logic into a Unified App your backend calls through API or SDK. Keep a stable input and output contract as the services behind it change. The same capability is available to your agents.
Describe the integration you need. Fused generates a Unified App with an input and output contract, backed by TypeScript you review and deploy to Engine.
Call it directly through API or add it to a new or existing SDK. Attach the same app to MCP when an agent needs that capability too.
See the code and saved resultsemailcustomer, invoicesReviewed TypeScript defines the integration flow. Engine handles service access and records execution.
Agents and backends call the same deployed app, with one integration implementation to maintain.
Preserve the app’s input and output contract as you change providers, so callers can keep their code.
Call services, process their responses, and save the data your team needs to find later.
import * as z from "zod/mini";
import { buildUnifiedApp } from "@fused/unified-app";
import { fused } from "@fused/operations";
export default buildUnifiedApp({
input: z.object({ email: z.string() }),
output: z.object({ customerIds: z.array(z.string()) }),
fetch: { searchable: ["email"] },
// Look up customers and save the processed result.
async execute({ input }) {
const { data } = await fused.stripe.getCustomers(input);
// Return only the IDs callers need.
const customerIds = data.map((customer) => customer.id);
await fused.db.set({ email: input.email, customerIds });
return { customerIds };
},
});
fused.db.set(...) chooses the data saved with this execution. Return the result your caller needs; Engine persists the final data document when the run completes.
Fetch a retained result by execution ID, or search by declared fields such as email. Reading a saved result does not call Stripe again. Result access remains permission-controlled.
{
"email": "sam@example.com",
"customerIds": ["cus_example"]
}Execution results and saved data are currently retained for 24 hours after completion. Each run has its own data document.
What Engine takes off your plate
Product teams stay on the experiences customers actually see. The repeated work underneath moves into the runtime, where improving it once improves it for everything.
Engine runs approved operations with declared parameters, so undeclared inputs and unsupported behaviour get rejected on the way out—rather than coming back as a provider error at an unsociable hour.
Engine resolves secrets and the right connected-user account when an approved operation runs. Your application passes the task, never the token.
Retries, pagination, timeouts, concurrency caps, and shared provider rate limits are handled by the runtime, so no single feature needs its own recovery layer.
Central logs and service-use analytics show what happened, how integrations are performing, and which services the product has quietly come to depend on.
A Unified App runs authored TypeScript against approved service operations while Engine handles credentials, routing, and execution records.
Use a generated SDK when you want to compose service calls inside your backend. When that logic should be shared with another backend or an agent, package it in a Unified App.
const issue = await fused.Linear.issues.getIssue({ id });
const customer = await fused.Stripe.customers.retrieve({ customerId });
await fused.Slack.messages.send({ channel, text: issue.summary });Individual service calls through a typed SDK