Comparison

Looking for HumanLayer's approvals API?

HumanLayer moved on to coding tools. If you came here for an API that pauses an agent's dangerous tool calls until a human decides, that is the thing Anlyon does.

What actually happened

HumanLayer built the best-known human-in-the-loop approvals API for AI agents. It was a good product and the category is better for having existed.

As of our last check, humanlayer.dev sells a multiplayer coding agent workspace: an IDE and cloud platform for running agent sessions, design review, and multi-repo work. The approvals API is no longer the product on the front page.

That is a pivot, not a shutdown, and their open-source work is still out there. If it still does what you need, keep using it. This page is for people who wanted the approvals product and found an IDE.

humanlayer.dev checked 2026-09-02. If this page has gone stale, tell us at support@anlyon.com and we will fix it.

What you probably came here for

Each of these is a thing the approvals API was used for, and how Anlyon does it today.

Pause a dangerous function until a human says yes
Wrap the function in `approvals.gate()`. The call creates an approval, waits for the decision, and runs the original function only if someone approves. Denied throws, expired throws, and a wait that elapses while the decision is still pending throws without running the function. The approval stays decidable in the inbox.
Get told when something is waiting
Approval requests notify over Slack, email, Discord, or a webhook. An approval waiting on a human is never silently dropped.
Require more than one person
Approval policies support N-of-M: a rule can require two of three named reviewers before the call runs, and the dashboard shows the progress and which policy required it.
Stop the agent approving its own work
Deciding needs a separate `approvals:decide` scope, and self-approval is blocked by policy rather than convention. An agent cannot wave its own request through.
Prove to someone what was decided
Every decision records the decider, the timestamp, the note, and the governing policy version, on the same trace as the rest of the run. Traces export as OpenTelemetry JSON, so the record leaves in a standard format.
Keep the credential out of the agent entirely
This is the part a wrapper cannot do. Define the call as an action once, with the key referenced as `{{secret:STRIPE_KEY}}`, and your agent invokes it by name. Anlyon resolves the credential at dispatch and makes the request, so the key is never in the process the model is driving. The gate below is the drop-in; this is the upgrade.
Stop everything, right now
Halting an environment stops the agent acting and stops anything leaving, at once: tool calls block, deliveries defer, workflows pause, the agent's writes are refused, and even already-approved calls do not run. Resume releases them.

The drop-in

No framework change. The function your agent calls is the same function; it now has a person in front of it. Be clear about what this is: your process still runs your function with your credential, so it buys you the decision and the record, not credential isolation. When you are ready for that, move the call into an action and invoke it by name.

agent.ts
import { Client } from '@anlyonhq/sdk';

const client = new Client({ apiKey: process.env.ANLYON_API_KEY! });

// Wrap the function you already have.
const refund = client.approvals.gate(
  { title: 'Refund a customer?', timeoutMs: 10 * 60_000 },
  async (orderId: string, amount: number) => stripe.refunds.create({
    payment_intent: orderId,
    amount: Math.round(amount * 100),
  }),
);

// Creates an approval, waits for a human, then runs, or throws.
await refund('ord_42', 129.99);

Where we are not a drop-in

If one of these is a dealbreaker, it is better that you find out here than three days into an integration.

More detail in Approvals, or the approvals docs.

Give your agent a way to act

Free tier, no credit card. One command if you use Claude or Cursor.

$claude mcp add anlyon -- npx -y @anlyonhq/mcp-server