API integration & customer onboarding

Get a customer onto an API — and prove it works.

Import a provider's spec, build the call sequence, run it against their real sandbox, and keep the evidence. Every customer sits in their own isolated database schema.

The API Endpoints screen, listing thirteen imported endpoints with their methods, paths and descriptions.
01

Import

OpenAPI, a Postman collection, an Insomnia export, or plain markdown. The format is detected rather than declared, and you review the diff before anything is written.

02

Compose

Chain calls into a flow. Each step pulls values out of earlier responses, and decides for itself whether a failure stops the run or is skipped past.

03

Prove

Requests execute server-side against the real provider and are logged as they happen. A 4xx or 5xx opens an issue without anyone filing it.

Every call, kept.

Requests, responses, timings and correlation IDs are recorded as they happen — and any one of them can be opened to see exactly what went out and what came back.

The execution log, showing thirty-six runs with status codes and durations, with one execution opened to reveal its recorded request body and response headers.
Real runs against a live sandbox — including the 404 that opened an issue on its own.
The Flow Builder, showing a four-step order placement flow with the selected step's endpoint and generated request preview.
Compose

Chain the calls. Pass the values forward.

Steps run in order, and each one can pull {{variables}} out of any earlier response. When a step fails you decide whether the run stops or carries on without it — per step, not per flow.

The Copilot workspace, scoped to a single tenant and provider, offering actions it is permitted to take.
Delegate

An assistant that can act — inside an envelope.

Autonomy is off until a tenant admin turns it on, and what gets turned on is specific: which operation classes, which providers, what rate and budget, which hours. Anything outside that, it asks. Pause takes effect at the next call, not the next deploy.

How it holds

Three boundaries, each enforced somewhere you can't forget to check.

Conventions get forgotten. These are structural.

A schema per tenant, not a column.

Every tenant — including each reseller's own customers — is provisioned into a dedicated Postgres schema. Isolation sits at the schema boundary, so a forgotten WHERE clause cannot spill one customer into another. Routes resolve their database handle through a helper that throws rather than quietly falling back to the shared schema.

Schematenant_<slug>

One door, proven by the build.

All autonomous execution funnels through a single gate. That isn't a convention people have to remember — a guard walks the require graph at build time and fails if any path from autonomous code reaches the executor without passing through it. Authority lives in each tenant's own schema too, so no admin can widen another tenant's limits.

GateassertAutonomyAllowed()

The server makes the call. Always.

The browser never talks to a provider. It posts an intent, and the server builds the request, decrypts and injects the right credentials, follows redirects under SSRF checks, and returns what actually came back. Token endpoints are the interesting exception — inject a stale bearer into /oauth/token and the provider rejects it, so those receive nothing.

RoutePOST /api/execute

Scale

What it took.

Application code
164,228lines
Test code
53,672lines
Test files
324
Services
101
Route modules
76
Migrations
90

Tests are mutation-checked rather than trusted: a tool flips one token at a time in the source and reports anything the suite failed to notice. It exists because a vacuous test — one that passes whatever the code does — reviews exactly like a good one.