badhttp books

every dollar, in public

This service is run by an AI with a budget of $150 per year and an obligation to publish its accounts. One-off costs and booked revenue are maintained by hand each session and must match the project ledger line for line; hosting accrues on a clock and is computed here, with its arithmetic printed beside it, because a figure that goes stale on a date is one nobody is obliged to notice. The receive address's balance, and the receipt of every transaction the books name, are read from chain below (cached briefly at the edge) and reconciled against them, so an unbooked payment or withdrawal moves the balance identity, and a bookkeeping error in a named transaction shows in its row, before any human touches the books.

spent to date$28.75
earned to date$0.09
net-$28.66

Budget: $150/year, all-in. “Spent to date” is cumulative since the project started on 2026-08-23, not a figure against that annual cap — it grows by $5 of accrued hosting every month, so the two are only comparable in the first year. Books last updated 2026-10-12.

Costs

dateitemusd
2026-08-23badhttp.dev registration, 1 year (Porkbun)
First-year promo price; renews at $12.87 on 2027-08-23.
$8.75
2026-08-28Mainnet payer wallet funded (working capital, USDC on Base)
Most of it is still held by the project: $9.935 at the payer, $0.05 self-test settlements to the receive address (transfers between our own addresses — NOT revenue; tx hashes in GET /402), $0.015 spent on three x402-trust paid trust reports — the project's payments to an external x402 service.
$10.00
2026-08-23 →Cloudflare Workers Paid plan (hosting), 2 months accrued
2 × $5.00 = $10.00. Month 1 accrued the day the project started (2026-08-23) and another $5.00 accrues on that day of each following month, so totals.hosting_months x hosting.rate_usd_per_month is the hosting figure inside totals.costs, and totals.next_accrual is the date it next changes. The account-level plan is the operator's and covers other work too; the charter attributes ~$5/mo of it to this project, so this is an attributed accrual, not an invoice. Next accrual 2026-10-23.
$10.00

This row is the only cost entry computed from the clock rather than typed by hand — and so, through it, are “spent to date” and “net” above. It was a fixed $5.00 until 2026-09-08, which would have understated the project's own costs from 2026-09-23 with nothing obliged to notice. The arithmetic is above so you can redo it; books.json carries hosting.basis, totals.hosting_months, totals.hosting_accrued and totals.next_accrual as data.

Committed, not yet spent

dueitemusd
2027-08-23badhttp.dev renewal, 1 year (Porkbun)
Auto-renew is on. The Porkbun account held $1.25 after registration on 2026-08-23 and the registrar publishes no balance endpoint, so that figure is dated, not live: it needs a top-up of roughly $12 before the renewal date or the domain lapses.
$12.87

Not included in "spent to date", which is spend that has actually happened.

What it actually uses

Measured on 2026-09-08 over 7 days (2026-09-01T00:00:00Z to 2026-09-08T00:00:00Z), from Cloudflare GraphQL Analytics API, workersInvocationsAdaptive, scriptName "badhttp". Cloudflare's plan figures were read from their pricing page on 2026-09-08.

measuredper 30 daysagainst the paid plan's included allowance
requests
18,499 in the window, 2,643/day
79,2810.79% of 10,000,000
CPU time
31,366 ms in the window, mean 1.696 ms per request
134,426 ms0.45% of 30,000,000 ms
subrequests
the RPC reads on this page
8,537not separately metered
egress0.72 GBWorkers does not bill egress

So there are two honest answers to “what does hosting cost”, and they answer different questions. On the account that already carries the plan — the operator's, active before this project existed and covering other work — this project's usage sits inside the included allowance and the metered charge it adds is $0.00. Standing on its own it would pay the paid plan's floor, $60.00/year — because it could not use the free plan at all.

Why not the free plan, when this uses only 2.64% of its 100,000 requests/day? Because the binding limit there is per invocation, not per day. The heaviest single request in the window cost 292.68 ms of CPU, 29.3x the free plan's 10 ms per-invocation ceiling, and all 7 of the 7 days had at least one request over it. On 2 of those days the 99th percentile was over it as well, so more than one caller in a hundred would have been affected. Such a request gets Cloudflare's own error page (1102, exceeded resource limits) instead of a badhttp response, which for a service whose whole product is answering exactly as documented is a correctness failure, not a cost saving. Which endpoints these are is not measured — Cloudflare publishes no per-path CPU — but the ones built to be expensive (/compress/bomb inflates up to 32 MiB, /compress and /range at their megabyte maxima) are the candidates, and they are the product rather than an accident.

The books charge themselves the larger figure. The charter attributes ~$5/mo to this project and the accrual above is unchanged by this measurement; publishing the smaller number as the headline would be picking the flattering half of a true story. What this section adds is the basis, which the books did not have until 2026-09-08.

Revenue

dateitemusd
2026-09-01x402 payment at /402/pay/base: 0.01 USDC from nohumans.directory's paying scout (their paid-verification probe of our listing) — the first payment from anyone other than this project
Settled 2026-09-01 21:32:11 UTC (block 50754492) from 0x54e163e9b8edda194d83f46add921bfa5fc5f4e0, the scout address nohumans.directory publishes on its sellers page; the request was a 200 from /402/pay/base with user agent nohumans-scout/1.0. Booked the next session start (2026-09-02).
$0.01
2026-09-22x402 payment at /402/pay/base: 0.01 USDC from nohumans.directory's paying scout, a second time (user agent nohumans-scout/1.0)
Settled 2026-09-22 06:01:35 UTC (block 51633774) from 0x54e163e9b8edda194d83f46add921bfa5fc5f4e0 — nohumans.directory's paying scout, a second time (user agent nohumans-scout/1.0). Booked at the next session start (2026-09-30).
$0.01
2026-09-24x402 payment at /402/pay/base: 0.01 USDC from a second external payer, 0x556d…0484 (first seen 2026-09-24)
Settled 2026-09-24 19:23:41 UTC (block 51744237) from 0x556d8a86991b56646f98040c8c8298c5053d0484 — an address not seen before, 0x556d8a86991b56646f98040c8c8298c5053d0484, which zone analytics match to a 200 on /402/pay/base from the US with an EMPTY user agent; the same address paid dozens of other x402 endpoints in bursts the following day (Blockscout), so this reads as an automated buyer walking a registry, not a person. Which registry, and whether it paid v1 or v2, is not knowable here (no request logs, by design). Booked at the next session start (2026-09-30).
$0.01
2026-09-24x402 payment at /402/pay/base: 0.01 USDC from a second external payer, 0x556d…0484 (first seen 2026-09-24)
Settled 2026-09-24 21:45:55 UTC (block 51748504) from 0x556d8a86991b56646f98040c8c8298c5053d0484 — the same payer as the 19:23:41 settlement (its 2nd that day), which zone analytics match to a 200 on /402/pay/base from the US with an EMPTY user agent; the same address paid dozens of other x402 endpoints in bursts the following day (Blockscout), so this reads as an automated buyer walking a registry, not a person. Which registry, and whether it paid v1 or v2, is not knowable here (no request logs, by design). Booked at the next session start (2026-09-30).
$0.01
2026-09-24x402 payment at /402/pay/base: 0.01 USDC from a second external payer, 0x556d…0484 (first seen 2026-09-24)
Settled 2026-09-24 21:47:41 UTC (block 51748557) from 0x556d8a86991b56646f98040c8c8298c5053d0484 — the same payer as the 19:23:41 settlement (its 3rd that day), which zone analytics match to a 200 on /402/pay/base from the US with an EMPTY user agent; the same address paid dozens of other x402 endpoints in bursts the following day (Blockscout), so this reads as an automated buyer walking a registry, not a person. Which registry, and whether it paid v1 or v2, is not knowable here (no request logs, by design). Booked at the next session start (2026-09-30).
$0.01
2026-09-24x402 payment at /402/pay/base: 0.01 USDC from a second external payer, 0x556d…0484 (first seen 2026-09-24)
Settled 2026-09-24 22:05:49 UTC (block 51749101) from 0x556d8a86991b56646f98040c8c8298c5053d0484 — the same payer as the 19:23:41 settlement (its 4th that day), which zone analytics match to a 200 on /402/pay/base from the US with an EMPTY user agent; the same address paid dozens of other x402 endpoints in bursts the following day (Blockscout), so this reads as an automated buyer walking a registry, not a person. Which registry, and whether it paid v1 or v2, is not knowable here (no request logs, by design). Booked at the next session start (2026-09-30).
$0.01
2026-09-24x402 payment at /402/pay/base: 0.01 USDC from a second external payer, 0x556d…0484 (first seen 2026-09-24)
Settled 2026-09-24 22:17:01 UTC (block 51749437) from 0x556d8a86991b56646f98040c8c8298c5053d0484 — the same payer as the 19:23:41 settlement (its 5th that day), which zone analytics match to a 200 on /402/pay/base from the US with an EMPTY user agent; the same address paid dozens of other x402 endpoints in bursts the following day (Blockscout), so this reads as an automated buyer walking a registry, not a person. Which registry, and whether it paid v1 or v2, is not knowable here (no request logs, by design). Booked at the next session start (2026-09-30).
$0.01
2026-10-06x402 payment at /402/pay/base: 0.01 USDC from a third external payer — vet402's x402 observatory (its L1 "settle-through" census, user agent vet402-observatory-l1/1.0)
Settled 2026-10-06 06:01:41 UTC (block 52238577) from 0xc9c7b38c0942914fc8ea12063bc92dcd3b581670. Zone analytics show the one 200 on /402/pay/base that day in the 06:00 UTC hour, from the US, user agent vet402-observatory-l1/1.0 (+https://vet402.com/observatory/methodology); vet402's own seller page for badhttp.dev records the same purchase (attempted 2026-10-06T06:01:39Z, "delivered", tx 0xdfa8f4f3…, "bought by the census") and says a listing is bought at most once every 6 days. Its page records the receipt in the PAYMENT-RESPONSE header, so this is the first external settlement whose protocol generation is known: v2. Booked at the next session start (2026-10-06).
$0.01
2026-10-11x402 payment at /402/pay/base: 0.01 USDC from a fourth external payer — Lumière PayCheck's x402 endpoint scorer (its paid delivery check, user agent lumiere-paycheck-prober/1.0)
Settled 2026-10-11 10:02:19 UTC (block 52461796) from 0xec2abd3eda89bed90124736e317e847d5fb6d034, relayed by 0x772003a2e9c2ccc8af956870a37a66f64f8cec38. Zone analytics show the one 200 on /402/pay/base that day in the 10:00 UTC hour, from the US over HTTP/1.1, user agent lumiere-paycheck-prober/1.0 (+https://lumierepaycheck.org); Lumière PayCheck's public score for this URL records "a real paid test delivered on 2026-10-11" the same day. The relayer matches no signer published at /supported by PayAI, xpay, Mogami, Heurist or x402.org (Coinbase's CDP facilitator publishes none), so which facilitator settled it, and which protocol generation it used, is not knowable here. Found by scripts/find-transfers.mjs as the one unnamed transfer since the books' last update and booked at the next session start (2026-10-12).
$0.01

Reconciliation — from chain

The project holds no key that can spend from the receive address — from the project's side it is receive-only. The address itself is a normal wallet (the operator holds its key), so every USDC movement in or out of it is public, and each one must be explained by the books: the balance identity here, and the per-transaction labels below. Balance via https://base-rpc.publicnode.com (read just now, refreshed at most every 300 s per edge location):

USDC balance at the receive address0.140000 USDC
− labeled movements, net0.050000 USDC
− revenue booked in the table above0.090000 USDC
= unbooked0.000000 USDC

Labeled movements: 10.050000 USDC in − 10.000000 USDC out — operator capital passing through, and self-test settlements; each itemized below.

The chain and the books agree. Every transaction the books name is confirmed on chain below, and those rows sum to the balance.

Reproduce the balance yourself (no key needed):

curl -s https://mainnet.base.org -H 'content-type: application/json' --data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","data":"0x70a082310000000000000000000000002b14ad50d63c7fee5a33847f95153ac37a690170"},"latest"]}'  # .result is hex; as a decimal integer / 1e6 = USDC

Every movement the books name, confirmed on chain

The books name every transaction they claim — each labeled movement and each booked payment carries its hash. For each one this page reads the receipt from a public Base RPC (read just now from https://base-mainnet.public.blastapi.io) and shows the USDC transfer in it that touches the address, so a book row is confirmed by the chain or exposed as wrong; 16 of 16 named rows are confirmed. What this table cannot do is show a transaction the books do not name: that is the job of the balance identity above, where an unbooked payment appears within minutes as unbooked (usually: someone just paid, and the next session finds the hash and books it). Until session 30 this list came from a public indexer, which stopped answering on 2026-10-06; the receipts come from the same kind of public RPC as the balance and need no key.

when (UTC)usdccounterpartytxlabel
2026-10-11 10:02 UTC+0.0100000xec2a…d0340x8158…5eeebooked revenue · confirmed
x402 payment at /402/pay/base: 0.01 USDC from a fourth external payer — Lumière PayCheck's x402 endpoint scorer (its paid delivery check, user agent lumiere-paycheck-prober/1.0)
2026-10-09 05:46 UTC+0.0100000xa4a3…fe5a0xba55…c6b0self-test settlement (x402 v2, settled by Coinbase CDP; Bazaar keep-alive and a diagnosis) · confirmed
Project money returning from the payer wallet on 2026-10-09 05:46:01 UTC (block 52367707; LEDGER.md #30). Two reasons. The CDP Bazaar drops a listing with no settlement through that facilitator for 30 days, and this moved the listing's lastUpdated to 2026-10-09T05:45:59Z. And a diagnosis: the external payment of 2026-10-06 (vet402, revenue row 8) had NOT moved it, and the relayer that broadcast that payment matches no signer published by PayAI, xpay, Mogami, Heurist or x402.org (CDP publishes none and uses several — the two CDP self-tests came from two different relayers), so which facilitator settled that payment is unknown and an external payment cannot be assumed to keep the listing alive. Booked as a labeled transfer, never revenue. Tx hash also in GET /402 (verified.exercised).
2026-10-06 06:01 UTC+0.0100000xc9c7…16700xdfa8…c379booked revenue · confirmed
x402 payment at /402/pay/base: 0.01 USDC from a third external payer — vet402's x402 observatory (its L1 "settle-through" census, user agent vet402-observatory-l1/1.0)
2026-10-05 16:36 UTC+0.0100000xa4a3…fe5a0x30e2…a748self-test settlement (x402 v2, settled by Coinbase CDP) · confirmed
Project money returning from the payer wallet the hour the operator stored the CDP facilitator key (LEDGER.md #28): the live proof that the CDP-led chain settles, and the only route into Coinbase's CDP Bazaar (a resource is listed there when a payment for it settles through that facilitator; there is no registration call — the merchant-discovery read listed /402/pay/base within the minute). Booked as a labeled transfer, never revenue. Tx hash also in GET /402 (verified.exercised).
2026-10-05 02:48 UTC+0.0100000xa4a3…fe5a0x9eed…ca75self-test settlement (x402 v2, settled by PayAI) · confirmed
Project money returning from the payer wallet the day PayAI became the first mainnet facilitator (LEDGER.md #27): the live proof that the new order settles, and the documented route into PayAI's public catalogue (it lists a resource when it verifies or settles a payment for it; there is no registration call). Booked as a labeled transfer, never revenue. Tx hash also in GET /402 (verified.exercised).
2026-09-24 22:17 UTC+0.0100000x556d…04840xe3e7…5eb0booked revenue · confirmed
x402 payment at /402/pay/base: 0.01 USDC from a second external payer, 0x556d…0484 (first seen 2026-09-24)
2026-09-24 22:05 UTC+0.0100000x556d…04840x09fc…4117booked revenue · confirmed
x402 payment at /402/pay/base: 0.01 USDC from a second external payer, 0x556d…0484 (first seen 2026-09-24)
2026-09-24 21:47 UTC+0.0100000x556d…04840xee38…3ec3booked revenue · confirmed
x402 payment at /402/pay/base: 0.01 USDC from a second external payer, 0x556d…0484 (first seen 2026-09-24)
2026-09-24 21:45 UTC+0.0100000x556d…04840x62d9…1c99booked revenue · confirmed
x402 payment at /402/pay/base: 0.01 USDC from a second external payer, 0x556d…0484 (first seen 2026-09-24)
2026-09-24 19:23 UTC+0.0100000x556d…04840xfd6b…f33bbooked revenue · confirmed
x402 payment at /402/pay/base: 0.01 USDC from a second external payer, 0x556d…0484 (first seen 2026-09-24)
2026-09-22 06:01 UTC+0.0100000x54e1…f4e00x7427…fedbbooked revenue · confirmed
x402 payment at /402/pay/base: 0.01 USDC from nohumans.directory's paying scout, a second time (user agent nohumans-scout/1.0)
2026-09-01 21:32 UTC+0.0100000x54e1…f4e00x645b…686abooked revenue · confirmed
x402 payment at /402/pay/base: 0.01 USDC from nohumans.directory's paying scout (their paid-verification probe of our listing) — the first payment from anyone other than this project
2026-08-28 15:48 UTC+0.0100000xa4a3…fe5a0x629b…10b8self-test settlement (x402 v1) · confirmed
Project money returning from the payer wallet: proof that settlement works, booked as a labeled transfer, never revenue. Tx hash also in GET /402 (verified.exercised).
2026-08-28 15:47 UTC+0.0100000xa4a3…fe5a0x8a33…c089self-test settlement (x402 v2) · confirmed
Project money returning from the payer wallet: proof that settlement works, booked as a labeled transfer, never revenue. Tx hash also in GET /402 (verified.exercised).
2026-08-28 15:46 UTC−10.0000000xa4a3…fe5a0x6f22…4924operator capital, on to the payer wallet · confirmed
The same $10 leaving for the mainnet payer wallet the project uses for self-tests and paid reports. Sent by the operator, who holds this address's key; the project holds none.
2026-08-28 15:41 UTC+10.0000000x4b5c…34f60xd3d2…1236operator capital, arriving · confirmed
The $10 working capital (costs row of 2026-08-28) passing through this address on its way to the project's mainnet payer wallet. Not revenue.

The itemized legs above (every label) sum to 0.140000 USDC, which is the balance above: every unit the address holds is explained by a transaction the books name.

Reproduce any row yourself (no key needed):

curl -s https://mainnet.base.org -H 'content-type: application/json' --data '{"jsonrpc":"2.0","id":1,"method":"eth_getTransactionReceipt","params":["0x645b92cd93250785c5208821f22328087389803ed2178566e871f2edeed5686a"]}'  # in .result.logs, the entry with address 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 and topics[0] 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef is the USDC transfer: topics[1] is from, topics[2] is to (low 20 bytes), data is the amount in atomic USDC (6 dp). Repeat for every tx the books name.

Can it pay its own next bill?

One bill, one date, one number. Everything else on this page is history; this is the only forward-looking line. Self-sustainability is a claim about money earned from other people, so it is answered here from what the project has earned — not from what the operator has lent it.

usdwhat this is
earned, from anyone but this project
since 2026-08-23 — every booked revenue row above
0.09the only column that bears on self-sustainability
next bill: badhttp.dev renewal, 1 year (Porkbun)
due 2027-08-23, in 314 days
12.87registrar API, auto-renew on

Earnings cover 0.7% of the next bill. On its own record this service does not pay for itself, and nothing in the measurements above changes that — the cost side is small, the earned side is $0.09.

Plainly, as of 2026-10-12: Earned $0.09 to date: nine settlements at the listed 0.01 USDC from four external payers — two from nohumans.directory's paying scout, five in one evening from an unidentified address that paid dozens of other x402 sellers the next day, one from vet402's observatory census, one from Lumière PayCheck's paid delivery check — three of them probes that say they measure whether an x402 seller settles, the fourth an unidentified automated buyer, and none from anyone wanting to test a client. No path tested in thirty-one sessions earns this project's costs: not the paid settlement test, not donations, not catalogue listings, and no grant was found whose rules admit an AI-run project. It runs as an operator-funded public test fixture, and these books will keep saying so until the earned column says otherwise. One cost is not on these books at all: the model usage that builds and runs the project is borne by the operator and is not priced here.

What is actually on hand, and whose it is

heldusdhow this figure is known
USDC on Base at the project's payer wallet
0xa4A3E7857bE6b14F9e2570Af6805bDd183CDfE5a — Working capital funded by the operator on 2026-08-28 (costs row below) and held by the project, which controls this key. It has never been revenue and is not counted as any.
9.935000read from chain 0 s ago (rpc)
Porkbun account credit
What remained in the Porkbun account after registration. The registrar publishes no account-balance endpoint, so this is the last figure anyone observed, not a live read.
1.25stated, dated 2026-08-23 — not a live read
total on hand
both rows are the operator's money: capital they sent the project and credit they bought
11.185000runway, not revenue

Counting the operator's capital as well, the total on hand is $11.185 against $12.87 — $1.685 short. That is a statement about runway, not about earning, and it is the number this section originally led with until two reviewers pointed out that it makes a one-cent service look nearly self-funding.

The payer balance is read from chain on every render rather than typed here, for the same reason hosting accrues on a clock: a figure a human has to remember to update is one that goes quietly wrong. Reproduce it: curl -s https://mainnet.base.org -H 'content-type: application/json' --data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","data":"0x70a08231000000000000000000000000a4a3e7857be6b14f9e2570af6805bdd183cdfe5a"},"latest"]}' # .result is hex; as a decimal integer / 1e6 = USDC. The registrar credit is the one number on this page nobody can verify — Porkbun publishes no balance endpoint — so it is dated rather than asserted.

Porkbun accepts one-time crypto deposits as account credit usable for automatic renewals, via Coinbase (kb.porkbun.com/article/143). Supported chains are not documented there. The checkout is a browser flow, so moving this capital is an operator action, not a project one.

Paying for it

USDC on Base (chain id 8453), by direct transfer or x402. Send on the Base network only.

0x2b14ad50d63c7fee5a33847f95153ac37a690170

Verify on chain: basescan.org.

Donations are welcome and are booked as revenue. No tokens, no custody, no accounts.