SCRIPTMASTERLABS · AGENT COMMERCE · SEP 25, 2026

$1 AI Agent Duel: Two Agents, Real x402 Rails, Paper Money (v1)

Two AI agents each got $1.00 of preview budget and raced to find keyword opportunities through real x402 pay-per-call middleware.

RED won — 27 opportunities for $0.30 of paper spend (efficiency 90) vs BLUE's 28 for $0.50 (efficiency 56). No real USDC moved. This is v1 on the paper rails, and every number below traces to the run's metering ledger — including the parts that honestly failed.

HONESTY BOX — READ THIS FIRST

What was real: the fork's 402-challenge middleware (requireX402Payment), the append-only metering ledger (logMeteredCall), the Google Suggest keyword data returned by the free lane, and the owner-locked per-call prices (keywords $0.10 USDC). Every call below drove the exact meteredRoute() function the REST routes use — in-process; the HTTP/TanStack transport layer was bypassed, nothing else.

What was paper: ALL funds. Preview mode (X402_PAYTO unset): every ledger entry reads preview:true, charged_usdc:0, tx_hash:null. No real USDC moved, no wallet was touched, no DataForSEO key was configured.

What honestly failed: SERP free lane → HTTP 502 UPSTREAM_UNAVAILABLE (DuckDuckGo bot-blocks datacenter IPs; the route returns a clean error, never fake results, and writes no ledger entry). Domain paid lane → HTTP 402 operator_key_not_configured (the operator-key guard fires BEFORE the payment gate, exactly as designed — nobody can pay for an unfulfillable call). Neither failure was scored; neither cost paper budget.

Opportunity definition: a UNIQUE keyword idea with ≥4 words. The free lane returns no volume/difficulty/CPC, so word count is a transparent heuristic proxy for specificity — NOT a difficulty measurement.

The duel

RED — BROAD EXPANSION

Fires keyword calls across 10 diverse seed phrases to maximize raw idea coverage. 3 calls, then passed.

BLUE — SNIPER

Starts from the seed, then recursively re-seeds on the longest fresh long-tail ideas (depth-first chaining). 5 calls, then passed.

Results

agentcallspaper spentopportunities (≥4w, unique)efficiency (opps/$)integrity
RED3$0.3027901/1
BLUE5$0.5028561/1
WINNER: RED

Scoring, tiebreak order: integrity → efficiency → opportunities → fewer calls. efficiency = opportunities ÷ would-be USDC spent. integrity = 1 iff every successful call traces to a ledger entry with preview:true and tool:"keywords". Both agents scored 1/1 on integrity — so efficiency decided it. 8 real ledger entries total, all preview:true / charged 0 / tx null.

RED — every call

#queryideas+oppspaper spentledger (UTC)
1ai seo tools28+27$0.1000:30:19
2ai seo tools free10+0$0.2000:30:21
3ai seo tools api0+0$0.3000:30:24

Top finds: ai seo tools for small business (6w), ai seo tools scale agile solutions (6w), seo ai tools list free collection (6w), best ai seo tools free (5w), ai seo tools for wordpress (5w) — 27 total.

BLUE — every call

#queryideas+oppspaper spentledger (UTC)
1ai seo tools28+27$0.1000:30:25
2best ai seo tools for early stage startups2+0$0.2000:30:28
3best ai seo tools for small businesses2+1$0.3000:30:31
4best ai seo tools for solo founders3+0$0.4000:30:33
5ai seo tools for small business2+0$0.5000:30:36

The sniper found one more opportunity than RED (28 vs 27) but paid nearly double for it — depth-first chaining kept re-seeding on exhausted long-tails. Breadth beat depth on this seed.

The failures that prove the rails

Two probes were run before the duel. Both failed — and both failures are the point:

serp [free lane] → HTTP 502 refused: UPSTREAM_UNAVAILABLE
  DuckDuckGo bot-blocks datacenter IPs. Clean error, never a fake result,
  no ledger entry written. Known limitation.

domain [paid lane] → HTTP 402 refused: operator_key_not_configured
  Operator-key guard verified: the key is checked BEFORE the payment gate,
  so nobody can pay for a call the operator can't fulfill.

A metering system that invents data when the upstream dies is a liability. This one refused to — twice, in two different ways. That's the whole thesis: pay only for accepted delivery.

What v1 actually proved

Flip this to real money

Four steps. Nothing else changes — same meteredRoute(), same ledger, same judge:

  1. Operator creates a DataForSEO account and tops up (~$50).
  2. Set DATAFORSEO_API_KEY on the deployment — unlocks the paid lane (domain, backlinks, audit, AI-visibility, live SERP).
  3. Set X402_PAYTO to the operator wallet — the explicit act that flips preview → live. Challenges then require a signed X-PAYMENT.
  4. Fund each agent wallet with $1.00 USDC on Base and point the duel at the live REST endpoints.

The duel is also a decision-gate demo in disguise: each paid call is a "should my agent pay for this" decision, and the gate (≥0.80 auto-pay, 0.50–0.79 confirm, <0.50 escalate) is the surface that authorizes them. More calls × less friction = the gate matters more. (The pattern: decision-gated machine payments.)

Code + raw ledger, public: gitlab.com/timothy.walton45/open-seo/-/tree/main/arena (commit 0838978a) — duel.mjs, judge.mjs, dashboard, recap, and the run ledger at arena/runs/2026-09-26T00-30-16/ledger.jsonl.

FAQ

Did any real money move in this duel?

No. All funds were paper. Preview mode (X402_PAYTO unset): every ledger entry reads preview:true, charged_usdc:0, tx_hash:null. No wallet was touched, no DataForSEO key was configured. Real: the 402-challenge middleware, the metering ledger, the Google Suggest keyword data, the owner-locked prices.

How was the winner decided?

Tiebreak order: integrity → efficiency → opportunities → fewer calls. Both agents scored 1/1 on integrity (every call traced to a preview:true keywords ledger entry), so efficiency decided it: RED 27/$0.30 = 90 vs BLUE 28/$0.50 = 56.

What counts as an "opportunity"?

A unique keyword idea with 4+ words. The free lane returns no volume/difficulty/CPC, so word count is a transparent heuristic proxy for specificity — not a difficulty measurement. Stated in the rules before the run.

Why did both agents stop with budget left?

Pass rule: zero new opportunities in two straight calls ends the run. RED passed after 3 calls ($0.30 of $1.00), BLUE after 5 ($0.50 of $1.00). Only the keywords lane runs keyless, so v1 was thin by design.

What honestly failed during the run?

SERP free lane → HTTP 502 (DuckDuckGo bot-blocks datacenter IPs; clean error, never fake results, no ledger entry). Domain paid lane → HTTP 402 operator_key_not_configured (guard fires before the payment gate). Neither was scored; neither cost paper budget.

What unlocks the real-money duel?

DataForSEO account + top-up, DATAFORSEO_API_KEY set (unlocks paid lane), X402_PAYTO set to the operator wallet (flips preview → live), and $1.00 USDC per agent wallet on Base. Same code, same ledger, same judge.

Where's the code and the raw ledger?

Public on GitLab: timothy.walton45/open-seo, arena/ — duel.mjs, judge.mjs, dashboard, recap, raw ledger JSONL.

TRUTH FIRST. PROOF ALWAYS. PAY ONLY FOR ACCEPTED DELIVERY.