Operations

What to do when a run gets blocked

Tell a challenge wall from a score wall, know which one stealth can help with, and stop paying to escalate into a wall that will not move.

Blocked runs are where automation budgets go to die, usually because every block gets the same response: retry harder. There are two kinds of wall with two different answers, and one of them cannot be passed by any client-side change at all. This guide is about telling them apart before you spend money on the wrong one.

The two kinds of wall

A CHALLENGE wall presents something interactive — a CAPTCHA widget, a managed-challenge interstitial. It is potentially clearable in session, so a retry on a better browser profile can legitimately work. A SCORE wall assigns an invisible reputation score and refuses low ones with nothing to solve. No fingerprint, proxy or retry reliably moves a score; a real person's session does.

  • Score walls: reCAPTCHA Enterprise and v3, DataDome, PerimeterX / HUMAN, Kasada, Akamai Bot Manager, Imperva / Incapsula.
  • Challenge walls: Cloudflare interstitials, reCAPTCHA v2, hCaptcha, Arkose, generic CAPTCHA widgets.
  • A challenge that PERSISTED after an attempt is treated like a score wall — the automated path is exhausted for that run.

Read the response before you retry

A blocked run names the vendor and, when the wall is one automation cannot reliably pass, returns code: "connect_required" with a READY one-time connectUrl already minted. That is not a failure message, it is an instruction: hand the link to a human. On hosts with repeated score-wall blocks, a run may short-circuit to that response WITHOUT executing at all, refunding the reserve — that is the policy engine saving you the cost of a run that was going to fail.

The response that means "stop escalating"json
{
  "code": "connect_required",
  "connectUrl": "https://twin-browser.com/connect/…",
  "connectId": "…",
  "connectExpiresAt": "2026-09-02T10:44:00.000Z",
  "policy": { "fastpath": "score-wall" }
}

Before you reach for stealth: fix the cheap things

Several blocks are self-inflicted and cost nothing to fix. An exit IP in one country with a browser announcing a different language and timezone is a mismatch a site can trivially see — set one `country` and let the locale and timezone derive from it. Rotation on an account-bound run destroys the identity you were protecting; use a stable `account` label instead. And `blockAds` is off by default because on a guarded target the absence of the usual third-party requests is itself unusual.

Consistency firstbash
# One country drives BOTH the residential exit and the browser identity
#   "country": "de"                      → locale + timezone derived
#   "proxyType": "residential" | "mobile"  → mobile = highest-reputation exit
#   "account": "acme-ops"                → sticky egress for this identity
#
# Do NOT also set "proxyRotate": true on an account-bound run —
# rotation and stickiness are opposites.

When stealth is the right call — and when it is not

Stealth routes the run to a full desktop browser profile: real Chrome, human-calibrated timing, residential egress. It requires a Pro or Enterprise plan and an explicit authorized: true attestation, both checked BEFORE any credit is reserved, so a refused stealth request is free. It bills the run price plus a surcharge on SUCCESS. Use it as a retry after a challenge the standard fleet could not clear — not as a default posture, where it adds cost without adding capability.

A stealth retrybash
curl -X POST https://twin-browser.com/api/v1/run \
  -H "Authorization: Bearer $TWIN_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "url": "https://guarded.example.com/dashboard",
    "prompt": "open the account page and export the statement",
    "success": { "kind": "extracted" },
    "stealth": true,
    "authorized": true
  }'

# 400 — "authorized" missing; the attestation is required, never inferred
# 403 — { "code": "plan_required" }; Pro or Enterprise only
# 501 — no stealth fleet configured; it fails CLOSED rather than running
#       honestly and billing you at the premium rate

The answer to a score wall is a person

Mint a connect link — or use the one the blocked run already handed you. The account owner signs in by hand in a hosted browser, the session is captured, and every later run on that host restores it. This is not a workaround; a real sign-in carries the reputation the score demanded, which is exactly what no client-side lever can synthesise.

And if you are being paced by your own governor

A 429 whose body carries a `reason` of cooldown, min_gap or window is not the target — it is the cadence governor protecting your account from the target. It costs nothing (the check runs before the credit reserve) and it tells you what to change: "min_gap" means space the runs out, "window" means you are doing too much on one identity per hour, "cooldown" means the site already pushed back and the account is resting. Honour the Retry-After; retrying immediately defeats the point.

Common questions

Should I just turn stealth on for everything?
No. It costs a surcharge on every success and adds nothing on a target that was not challenging you. It is a retry for a run that has actually been turned away.
How do I know the wall is a score wall?
The run names the vendor and, when the wall is unpassable client-side, returns code "connect_required" with a ready connectUrl. reCAPTCHA Enterprise and v3, DataDome, PerimeterX, Kasada, Akamai and Imperva are the score families; a persisted challenge is treated the same way.
What happens if the stealth fleet is not deployed?
The request returns 501 and is not billed. It fails closed on purpose — running an honest browser and charging premium rates for it would be the worse outcome.
Is a 429 from Twin the same as a 429 from the site?
No. A 429 carrying a `reason` of cooldown, min_gap or window is the account cadence governor pacing YOUR identity to avoid the target's bot detection. It costs nothing and is a signal to spread the work out, not to retry harder.

Delegate the work. Keep the decision.

Hand off a real task, set the guardrails, and let repeated work compile into a skill that replays deterministically at near-zero cost.