When a step needs a human, the run pauses — then resumes
Approvals, MFA on an authorized flow, or an ambiguous choice pause the run, hand off to a person, and continue from the exact same point.
status:"paused" → POST /api/v1/runs/:id/resumeWhat human-in-the-loop handoff does
Real automation hits steps a machine should not decide alone — a payment confirmation, a one-time code on a flow you are authorized to run, a judgment call. Twin resolves what it can on its own: when the blocker is a 2FA code and you have connected an email inbox or a phone number, it fetches and fills the code itself, no human in the loop. When it cannot — a payment approval, an authenticator-app code, or a code only you hold — it pauses the run, surfaces the decision to a human, and resumes deterministically once they respond. The agent keeps its place; nothing restarts.
Parks by default — never just fails
A sign-in run that hits a 2FA/approval wall it can't auto-resolve PARKS by default: it returns status:"paused" with a sessionId, resumable via POST /api/v1/runs/:id/resume, instead of failing. Pass hitl:false to opt out.
Auto-fill when connected
A connected email inbox or phone number lets Twin fetch and fill an emailed or texted 2FA code on its own — resolving the pause with no human in the loop.
Pause, don't guess
When it can't auto-resolve, the run stops and requests a human decision rather than hallucinating an action.
Resume in place
Once the code or approval arrives, the run continues from the exact step it paused on — no replay from the top, no lost state.
Fully audited
Who approved, when, and what they saw is recorded alongside the run's step list and session video.
From a goal to deterministic action
- 1Hit a 2FA / gated stepThe executor reaches a login second factor or a step flagged as requiring approval.
- 2Auto-resolve or pauseA connected email inbox or phone number resolves an emailed/texted code automatically; otherwise the run pauses and surfaces the decision via API/MCP and the dashboard.
- 3Human supplies itFor a code it can't fetch or an approval, a person supplies the input — via POST /api/v1/live/resume, the MCP submit_verification tool, or the dashboard.
- 4Resume deterministicallyTwin continues from the paused step with the code or approval folded in.
See it on a real call
A gated step pauses the run; a human supplies the input and the run resumes from step 3.
const run = await twin.agents.run({ goal, url });
if (run.status === "paused") {
// surface run.challenge to a human, then resume in place:
await twin.runs.resume(run.id, { code: otp }); // POST /api/v1/runs/:id/resume
}
// → status: "complete"
// → resumed from step 3 of 5- Hit a 2FA / gated stepdone
- Auto-resolve or pauserunning
- Human supplies itqueued
- Resume deterministicallyqueued
What human-in-the-loop handoff is
The facts — how it works, what it costs, and the signal you get back on every call.
| Property | Twin Browser |
|---|---|
| Trigger | Approval, MFA, ambiguity |
| Paused state | status:"paused" + sessionId |
| Resume | From the exact step |
| Channels | API, webhook, dashboard |
| Audit | Approver, time, context |
| Authorization | Human is the control point |
Human-in-the-loop handoff — common questions
Does the run start over after a handoff?
Is this how MFA is handled?
How is the approval recorded?
Go deeper
The rest of the platform
Credential vault
Per-tenant encrypted secrets are injected into a run when a step needs them — and never enter the model, the logs, or the skill corpus.
Live view & session video
Stream the browser session in real time, then keep a durable video of every run for debugging, audit, and proof of what happened.
Deterministic replay
A successful run compiles into a skill — an ordered, parameterized program of browser actions that replays the same way every time.
Make every run cheaper than the last.
Start free, compile your first skill, and watch the marginal cost per run trend toward zero as your agents reuse what they have already learned.