The wall now sells the door.
Every rate limit answers overload the same way: 429 Too Many Requests — no memory, no price, no commitment. x429 answers with a signed admission ticket instead: a guaranteed slot the caller can hold, pay to move up, or decline.
- ticket
- tkt_9f2c81d4
- key id
- x429-protocol-demo
- nonce
- n_u4vX29aa4q
- bound to
- client-key ed25519:demo…
a real ticket, minted by this page from x429.dev/429 — one redemption, then the nonce is spent
01 · the problem
A 429 with no promise creates the storm.
Reject a machine and it comes back at machine speed. Hand the same demand a signed slot and the storm becomes a schedule.
02 · the mechanism
One response, read two ways.
The entire protocol is carried by an ordinary 429. Hover the notes to see which bytes do the work.
HTTP/2 429 retry-after: 47 x429-version: 1 link: </.well-known/x429.json>; rel="service-desc" { "x429": 1, "ticket": { "id": "tkt_9f2c81d4", "scope": "GET /429", "notBefore": "…T14:03:47Z", "notAfter": "…T14:04:17Z", "nonce": "n_u4vX29aa4q", "sig": "ed25519:MEUCIQ…" }, "upgrades": [ { "class": "immediate", "price": { "amount": "0.004", "asset": "USDC", "rail": "mock" } } ], "redeem": { "header": "X429-Ticket" } }
A legacy client sees an honest Retry-After and behaves like it always has. Turning x429 on breaks nobody.
Scope, window, signature — verifiable with the public key at /.well-known/x429.json. No account, no lookup.
The nonce is spent on redemption. Present the same ticket twice and the second presentation bounces.
Priority is a standard x402 payment payload. The rail is mock today; real settlement is roadmap, and the response says so.
Retry inside the window with X429-Ticket. The server verifies with three stateless checks, sub-millisecond.
invariants: binding, not advisory · degrades to plain 429 · stateless verify · x402-native · auditable ordering · pseudonymous — the full spec is one page →
03 · the decision
Wait, pay, or walk — by arithmetic.
The client compares the promised wait against its deadline, and the price against what the deadline is worth. Policy, not vibes:
wait ≤ deadline → hold ticketprice ≤ budget → pay x402else → abort, informed
Scalping? The fee goes to the resource owner, the free lane keeps its guarantee, and issuance order is auditable. Today the priority market exists anyway — it is just run by whoever writes the fastest retry bot, and pays nobody.
scheduled agents
Every promise gets a row.
free lane boards in issued order · priority inserts ahead, paid · a spent nonce never boards twice
04 · the proof
Don't trust the pitch. Reproduce it.
git clone https://github.com/x429-protocol/x429 && cd x429 && npm run check
One command re-runs the 100-agent simulator and the signature / replay / tamper tests that produced every number above. No dashboard screenshots to take on faith.
05 · the action
Two integrations, one afternoon.
import { x429, x429WellKnown } from "@x429/hono";
app.use("/v1/*", x429({
issuer: "https://api.example.com",
privateKey: env.X429_PRIVATE_KEY, // ed25519
capacity: { limit: 5, intervalMs: 1000 }, // your policy
ticket: { freeDelayMs: 10_000,
redeemWindowMs: 30_000 }
}));
app.get("/.well-known/x429.json",
x429WellKnown({ /* keys, docs */ }));
import { x429Fetch } from "@x429/client";
const res = await x429Fetch(
"https://api.example.com/v1/infer", {
deadlineMs: 30_000,
maxSpend: { amount: "0.01", asset: "USDC" },
clientKey: agentPublicKey
});
// verifies the offer, sleeps to notBefore,
// redeems once — pays only within budget
- Quickstartrun the proof locally in ten minutes→
- Server guideissue tickets from your scarce route→
- Agent clientteach a retry loop to hold a promise→
- Pilot guidemeasure it on one overloaded endpoint→
v0.1 ships: signed tickets · Hono/Workers middleware · agent client · simulator · paid priority with mock receipts
roadmap: real x402 settlement · transparency log · more frameworks