# Browser rehearsal range for agents — TextForAgents LLC Rehearse a browser workflow on a mirrored site before the first real click. ## Start (self-serve, no operator step) 1. POST /register {"operator": "your-name"} -> {"account_id", "token"} — keep the token; it is your per-customer credential. Registering again under the same normalized operator identity (case/whitespace variants included) returns the same account and does NOT re-grant the trial. 2. POST /mirrors {"site": "portal", "shape": "cooperating"|"external", "source": "fixture"} captures a mirror of a built-in fixture site (a cooperating procurement portal with a manifest+state API, or a non-cooperating HTML shop with no cooperation API). Or {"site": "...", "shape": "external", "source": "url", "url": "https://...", "attestation": true} — a read-only GET capture of a PUBLIC url you warrant you are authorized to automate; private/loopback targets are refused, redirects are not followed, and the capture is bounded (25 pages, byte caps). Response: mirror_id, mirror_version, capture_s, js_heavy, scoring_basis. 3. POST /rehearse {"mirror_id", "agent": "your-agent-id", "task_class": "place_order", "variant": "competent"|"sloppy"} — or supply your own steps: {"actions": [{"path": "/order", "fields": {"item_id": "WIDGET-1", "qty": "1", "ship_to": "Warehouse 9"}}]} (at most 50 actions). The workflow runs against the CLONE only. Scoring: cooperating mirrors score the sandbox STATE DIFF against the permitted-effect set for the task class (place_order permits order_created / balance_debit / stock_decrement; refund_issued / record_deleted / wrong_field_value are prohibited); external mirrors score the SUBMISSION SURFACE honestly (POSTs to non-permitted paths are prohibited_submission; the receipt states scoring_basis submission_surface). A passed rehearsal returns a signed promotion receipt. 4. POST /receipts/verify {"receipt": {...}, "agent", "site", "task_class"} — the gate check: scope binding, HMAC signature (current or archived key after rotation), rehearsal passed, not expired, and CURRENT structural drift (re-measured live) within the receipt's bound. Malformed receipts are rejected, never crash the gate. 5. POST /drift {"mirror_id"} — revalidate: current structural drift vs the 0.05 bound (content-hash drift is reported as advisory only and never gates). 6. Billing: the first rehearsal is free, one time per operator; then per-rehearsal $1.50 via x402 (X-PAYMENT header), or included under an active plan — Operator $29/mo (25 rehearsals/mo), Fleet $99/mo (100 rehearsals/mo + priority mirror capture). POST /subscribe {"tier": "operator"|"fleet"} with an x402 X-PAYMENT header for $29.00 / $99.00 activates that plan for 30 days. A mirror flagged js_heavy is NOT charged: rehearsals on it return 403 js_capture_unmeasured — JS-rendered capture cost is unmeasured (the lab proof is HTML-only), and the $1.50 tier is not charged for JS-heavy sites until rendered capture is measured. 7. MCP: POST /mcp (JSON-RPC) — tools create_mirror, rehearse, verify_receipt, drift_check — same account token and billing. 8. Receipt signing keys: GET /verify-key lists accepted key fingerprints (rotation keeps archived keys verifiable, so in-window receipts are never stranded). ## Limits Receipt scope is agent × site × task class; reuse inside scope until expiry/drift invalidation is by design (clearance, not a single-use token). Cross-scope, expired, tampered, or drift-exceeded receipts are rejected. No JS-rendered-site fidelity is claimed. Support: support@textforagents.com. ## Prices Per-rehearsal API $1.50/rehearsal · Operator $29/mo per operator · Fleet $99/mo per operator. One rehearsal free, one time per operator. No perpetual free tier.