Build1 distinct publisher3 min readUpdated
Tek Labs got a valid x402 v2 payment challenge out of curl, then watched a discovery catalog refuse the origin for having a hostname that dies with the process.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
The refusal from x402scan is worth reading closely, because it does not mention a field. According to the Tek Labs writeup, the catalog said tunnel URLs are ephemeral and cannot be reliably discovered by agents, and told them to deploy to a permanent URL to register [8]. Nothing about `x402Version`, nothing about `accepts`. The second acceptance test is about whether the hostname will still answer next week, and the author's read is that `registerFromOrigin` was never going to stick on a name that exits with the process [9].
The first test has a trap that curl will not show you. The v2 HTTP transport wants a `PAYMENT-REQUIRED` header carrying base64 of the same JSON as the body, and the linter marks its absence as `missing_header` [6]. A cross-origin client cannot read that header at all unless `Access-Control-Expose-Headers` names it, so a server can be sending it while a JS client reports it missing [7]. Two observers, same response, opposite verdicts. The grading reflects this: a body-only 402 is still gradeable, it just loses the header points, while a mismatch between decoded header and body is a warn and a non-402 status is a hard score cut [11].
Then there is the paperwork the payment challenge does not cover. Catalogs do not only POST the paid route; per the same writeup they look for OpenAPI 3.1 at `/openapi.json` carrying `x-payment-info` and `x-discovery.ownershipProofs`, plus `GET /.well-known/x402` listing resource URLs against the same ownership address [10]. Those resource URLs are assembled from the request host and `x-forwarded-proto`, which is the only reason a proxied deploy does not publish `http://127.0.0.1:8402` to the index [12]. An ownership proof bound to a URL is a claim about a hostname, which is exactly what a tunnel cannot make.
The hosting shortlist is where the cost lands. The latest Wrangler wanted Node 22 on a Node 20.19.2 box [13]; GitHub Pages is static and cannot POST a 402 at all [14]; `*.vercel.app` is disallowed by the catalog [15]; a Cloudflare Worker on a stable `*.workers.dev` name is what worked, and that is the live origin now [16]. Three of the four candidates were ruled out for reasons that have nothing to do with payment correctness [1]: a runtime version, a hosting model, and a catalog policy.
Worth noting what is not being sold yet. The first build had no wallet keys, no facilitator and no settlement, with a missing `PAYMENT-SIGNATURE` always producing a 402 unless a local bypass header was set [5]. `POST /lint` advertises 10000 atomic USDC and `POST /health` advertises 1000, both on Base with scheme `exact` [2][3], ten times the price for the real work [2]. So the prices are advertised, not collected. The thing the build was actually buying was a durable place to be found, and that was priced in Node versions.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
Tek Labs built x402-linter, an HTTP service that speaks x402 v2 on the wire, can lint any URL for the same shape, and is itself gated by Payment Required.
POST /lint advertises 10000 atomic USDC ($0.01) and POST /health advertises 1000 atomic USDC ($0.001).
Both routes use scheme exact, network eip155:8453 (Base), asset 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 (Base USDC) and payTo 0xAe51ada17E9C47B4de6E1b2405049C79D1BBE3fA.
Unpaid POST /lint already returned HTTP 402 with a JSON PaymentRequired body, and a local smoke test against the service's own /health passed the status check.
The first build was local-only with no wallet keys, no facilitator and no settlement; a missing PAYMENT-SIGNATURE always returns 402 unless a local bypass header is set.
The team's own linter scored their 402 as incomplete: the v2 HTTP transport also wants a PAYMENT-REQUIRED header containing base64 of the same JSON as the body, and without it the report records missing_header.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Specific but single-source and self-reported
The account is unusually concrete for a build log: exact atomic amounts, CAIP-2 network, asset and payTo addresses, named finding codes, the verbatim catalog rejection message, the rejected tunnel hostname and the live workers.dev origin. All of it, however, comes from one first-person post by the builder, with no independent verification, no captured transcripts beyond quoted strings, and no confirmation of the post-migration listing outcome.
One self-built demo, no settled payments, no confirmed listing
Observed adoption is a single developer's service: deployed to a stable workers.dev origin, graded by its own linter, and refused registration by x402scan while on a tunnel hostname. There are no external users, no settled USDC transactions (no wallet keys or facilitator), and no evidence in the source that the permanent origin was subsequently listed.
Slightly understated relative to what is shown
The post's framing is self-critical rather than promotional: it labels its own 402 lint-wrong, names dropped wrong theories, and explicitly separates 'well-formed challenge' from 'listable URL'. Claims stay inside what the reported artifacts support, and the piece even withholds the one triumphant claim it could have made (a confirmed catalog listing), so if anything the result is presented more modestly than the evidence allows.
Self-promotional build log with a contest hook
The author is documenting their own product, x402-linter, whose paid routes settle to their own payTo address, and the piece is explicitly submitted to a sponsored writing contest. Both create incentive to present the build as instructive and finished. Countervailing signals are present: the post foregrounds its own failures and discloses the absence of wallet keys, facilitator and settlement.
Internally consistent, externally unverified
Details are specific and mutually consistent, and the technical mechanisms described (header exposure via CORS, catalog hostname policy, static hosting cannot answer POST) are self-explanatory. Confidence is nonetheless limited by one publisher, one self-interested source, no third-party corroboration of the x402scan behaviour or the linter's grading fidelity to the spec, and an unresolved end state.
invest
OpenAI and AWS just made agent-initiated payments a documented pattern, not a demo1 distinct publisher
build
France's e-invoicing deadline is really a bill for supplier data nobody verified1 distinct publisher
build
Nine locales, no middleware: route groups as a Cloudflare billing decision1 distinct publisher
invest
X's stablecoin creator payouts would be a plumbing decision, not a crypto bet3 distinct publishers
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 22, 2026