← Signals

The Missing Error Code: How Agentic Commerce Needs a Standard for Payment Failures

A Hetzner client has been hitting my oracle API 8,000 times a day for weeks. It never pays. Its payment logic is broken. I can see it clearly in my logs. And there is absolutely nothing I can do to tell it.

The Situation

I run a sovereign price oracle — cryptographically signed financial data, payable per query via Lightning (L402) or USDC on Base (x402). No accounts, no API keys. You pay or you don't.

Three weeks ago a client appeared in my logs. A Hetzner server running python-requests, hitting BTC/USD and BTC/USD VWAP every 30 seconds. It paid — real sats, real USDC, both rails verified. Then something changed. The payments stopped. The polling didn't.

8,000+
Daily requests from this client
$0.00
Revenue received since Mar 18
3
Hetzner IPs now polling

The operator spun up a second instance. Then a third. All running the same broken payment logic. All getting 402s. All retrying silently forever. At some point they migrated from one IP to another — a two-minute switchover, clearly deliberate. They are actively managing this infrastructure. They have no idea it's not working.

The operator built an autonomous system to pay for data without human intervention. Now there's no human to intervene when it breaks.


What the Current Protocol Gives Me

When a client hits my API without payment, I return a standard 402 with full payment details:

{
  "error": "Payment required",
  "accepts": ["L402", "x402"],
  "l402": {
    "invoice": "lnbc...",
    "macaroon": "MDAxZ...",
    "amount_sats": 10
  },
  "x402": {
    "amount_usdc": 0.01,
    "payTo": "0xD593832C...",
    "asset": "0x833589fC...",
    "network": "base"
  }
}

This is correct. The client gets everything it needs to pay. But here's the thing — a well-functioning agent reads this, pays, and moves on. A broken agent reads this, fails to pay, and retries. Indefinitely. The 402 response gives no information about why payment isn't working — because the protocol has no vocabulary for that.


What's Missing

HTTP has a rich vocabulary for errors. 400 means your request is malformed. 401 means your credentials are wrong. 403 means you're not allowed. 404 means the resource doesn't exist. 429 means you're sending too many requests. Each code tells the client something actionable.

The agentic payment stack needs the same thing. Not just "payment required" — but why payment isn't succeeding. A diagnostic layer that agents are expected to parse and act on.

Right now the only signal I can send is the same 402 on every failed attempt. There's no way to distinguish between:

All five look identical in the current protocol. They all get the same response.


A Proposal

The 402 response body should support an optional diagnostic field — a standard vocabulary that agents are expected to parse and act on. Something like this:

Proposed 402 diagnostic extension
{
  "error": "Payment required",
  "accepts": ["L402", "x402"],
  "l402": { ... },
  "x402": { ... },
  "diagnostic": {
    "code": "PAYMENT_ATTEMPTS_EXCEEDED",
    "attempts": 8432,
    "since": "2026-03-10T00:00:00Z",
    "message": "8,432 requests received with no valid payment in 18 days.",
    "suggestion": "Check payment handler configuration. Docs: https://docs.x402.org/troubleshooting",
    "escalate": true
  }
}

The diagnostic.code field is the key — a machine-readable enum that agents universally understand and can act on:

The escalate: true flag is particularly important. A well-built agent receiving this should stop retrying and surface the issue to a human — log it, send an alert, open a ticket. The agent knows it can't fix this itself.


The Operator Alerting Problem

Even with this standard, there's a deeper issue. The diagnostic reaches the agent — but the agent is broken. It may not be reading the diagnostic field. It may not have the logic to escalate. The operator built an autonomous system precisely because they didn't want to babysit it.

What the stack really needs is an out-of-band notification mechanism — a way for the API provider to reach the human operator directly when their agent is consistently failing. Something like:

None of these exist. In the human economy, a broken customer gets a support email. In the agentic economy, a broken client gets the same 402 response forever while both sides lose value.


Why This Matters Now

The Hetzner situation is not an edge case — it's a preview of what happens at scale. As more agents start paying for API calls autonomously, payment logic will break. Wallets will empty. Credentials will expire. Code will be updated with bugs. And without a diagnostic standard, every failure looks identical to a first request.

The x402 and L402 specs have done the hard work of defining how payments work when everything goes right. The next version needs to define what happens when things go wrong — and give agents the vocabulary to communicate that failure clearly enough that someone, somewhere, can fix it.

I'm watching 8,000 daily requests from a client that wants to pay me and can't. That's not a business problem. It's a protocol gap.


Running Mycelia Signal — sovereign cryptographic oracle, 56 endpoints, L402 + x402. The Hetzner client is still polling. myceliasignal.com/demo