For agent builders

Your agents ask your customer before they act

Your customers will ask who approved what your agent did. Give them an answer they hold themselves: one call before the action, a person at their company decides when it matters, and a signed record comes back.

Eóin Forker, Immiscible

Why not your own approvals?

You may already have them, and they may be good. But a company that runs your agent also runs Claude Code, a ChatGPT workspace, a Copilot Studio bot and something its own engineers wrote. Its finance team cannot read five approval logs, and an approval kept by the agent that asked for it is the agent marking its own homework.

Immiscible is the layer the customer owns. Their rules, their approvers, their record, across every agent they run, yours included. You keep your product; they get one place to see it.

The integration is one call

Before your agent pays, shares data or does anything it cannot undo, ask. The answer is allow with a signed receipt, deny with reasons in plain English, or approval_required: a person at your customer has been asked, in Slack or Microsoft Teams if they have connected one, or by email and on their phone if not.

import { Immiscible } from '@immiscible/sdk';

// One customer's workspace token, and the agent you added for them.
const immiscible = new Immiscible({ apiKey: workspaceToken, agentId });

const d = await immiscible.authorize({
  type: 'payment',
  summary: 'Pay Northwind invoice 2231',
  payment: { amount: 1840000, currency: 'GBP',
    merchant: { name: 'Northwind', domain: 'northwind.example' } },
  provenance: [{ source: 'email', detail: 'Supplier email, 3 Oct' }],
});

if (d.decision === 'approval_required') {
  // A person at your customer decides, in their Slack or Teams.
  const final = await immiscible.waitForDecision(d.id);
}
// allow comes with d.receipt: a signed record anyone can check.

The same request works without the SDK as POST /v1/actions/authorize with the header immiscible-agent. If you would rather be called than poll, register a callback URL on the action. Tell us afterwards what actually happened with settle, and the record closes.

How a customer connects

Register your product once, in your own Immiscible workspace under Settings, Connections. You get a client id and a secret. Then put a Connect button in your product that sends the customer here:

GET https://immiscible.fly.dev/oauth/platform/authorize
  ?response_type=code&client_id=ipc_...
  &redirect_uri=https://app.yours.example/immiscible/callback
  &scope=agents:write actions:write actions:read
  &code_challenge=...&code_challenge_method=S256&state=...

POST https://immiscible.fly.dev/oauth/token
  grant_type=authorization_code, code, code_verifier,
  client_id=ipc_..., client_secret=ips_...
  -> access_token ipt_... (an hour), refresh_token ipr_...

An owner or admin of their workspace reads what you are asking for, in words, and allows it for one workspace. You swap the code for a workspace token. With it you can add an agent with a rule chosen from the same list their console uses, and ask for decisions as that agent. You cannot approve anything, change a rule, see their other agents or open their console. They can disconnect you at any time, and the token stops on the next request.

If you are not ready to build the button, a customer can add the agent themselves with npx immiscible init or in the console, and paste you its key. That works today too, one key per agent.

What your customer sees

Your agent appears in their console beside every other agent they run, with its rule in one sentence, everything it asked for, who approved it and when. Their finance team reads it in one place. Each decision is signed with keys published at /.well-known/immiscible-keys.json, so their auditor can check a receipt without asking us, or you.

What we have not built

There is no approval card to embed inside your product yet: approvals reach people in Slack, Teams, email, the phone app and the console. There is no white-labelling for a platform; a self-hosted deployment can carry its own name and colours, but the hosted service is Immiscible. A no-code builder can still connect through our OpenAPI description or the MCP server with an agent key.

We have not published platform pricing. What will not change: we never take a share of what your agents or your customers spend. If you want to build this in, write to me and tell me what your agents do.