{"slug": "i-made-my-website-charge-ai-agents-a-penny-per-page-then-i-watched-claude-pay-it", "title": "I made my website charge AI agents a penny per page. Then I watched Claude pay it.", "summary": "A website owner implemented x402 payments that charge AI agents one cent in testnet USDC per page, with five payments settling on 15 September, including one made through a Claude Code hook. The experiment contrasts with Google's AI contribution pilot, which pays participating publishers a monthly earnings figure in Search Console without a breakdown of how it was calculated, a programme Digiday reported Google has offered to at least dozens of publishers. All payments so far came from the site owner's own agents using testnet tokens with no real monetary value, and no search crawler currently arrives with a wallet to pay for access.", "body_md": "# I made my website charge AI agents a penny per page. Then I watched Claude pay it.\n\nGoogle is testing paying publishers when their pages feed its AI answers, on terms only Google can see. My site runs the other version over x402. It returns HTTP 402 to AI agents and unlocks for a cent in USDC, with a public receipt for every crawl, which is the loop those Cloudflare wallet handles will run.\n\nKey points\n\n- Google’s AI contribution pilot gives participating publishers a monthly earnings figure without a detailed explanation of how it was calculated.\n- My site charges one cent per page through x402. Five testnet payments settled on 15 September, including one made through a Claude Code hook during a task.\n- Paying for content use may reflect its value more closely, but a website owner can independently verify a paid fetch.\n- This is a working experiment using my own agents and test tokens. Ordinary search crawlers aren’t currently arriving with wallets to pay for access.\n\nGoogle is paying some publishers when their content helps generate its AI answers.\n\n[Barry Schwartz covered it at Search Engine Roundtable on 14 September](https://www.seroundtable.com/google-al-contribution-pilot-42076.html), following [Digiday’s report](https://digiday.com/media/google-rolls-out-pay-value-ai-licensing-program-to-publishers/) that morning. Google confirmed the programme to Digiday. It’s called the **AI contribution pilot**.\n\nPublishers who accept the terms get an earnings figure in Search Console each month. What they don’t get is a breakdown of how Google calculated it.\n\nGoogle pays when it decides a page contributed significantly to an answer while it was being generated in AI Overviews, AI Mode or the Gemini app. If the page only gets linked after the answer has been written, it doesn’t qualify.\n\nI’m not in the pilot. According to Digiday, Google has approached at least dozens of publishers, with smaller publishers showing more interest than the larger ones. One executive familiar with it described it as a black box. Barry had actually [found the help page back in April](https://www.seroundtable.com/google-search-console-ai-contribution-41153.html), but it wasn’t clear then what the feature did.\n\nI’ve been testing a different approach on my own site since August.\n\nMy page sets a price before an agent reads it. If the agent wants access, it pays.\n\nThis morning, 15 September, five payments went through. Each one settled on a blockchain and has a public transaction hash. One came from Claude Code, running on my machine and using a wallet I’d set up for it.\n\nTo be clear, all the payments so far have come from my own agents. No search crawler is turning up and paying me. The payments also use **testnet USDC**, which means the tokens have no real monetary value.\n\nBut the payment process works. An agent requests a page, checks the price, pays and receives the content. Cloudflare is building products around that same idea, and I wanted to understand how it works before it becomes another setting in a dashboard.\n\n## What that Cloudflare wallet handle is for\n\nOn 4 August, during Agents Week, Cloudflare [announced Wallets](https://blog.cloudflare.com/wallets/) and opened handle reservations.\n\nClaiming a handle is free. I suspect plenty of people grabbed theirs the way we [grab usernames](https://suganthan.com/blog/get-your-dream-handle-on-x/): quickly, before someone else gets there, with a vague intention of reading the details later.\n\nIf you did that, this is the kind of thing those wallets are being built for.\n\nCloudflare’s design has two parts:\n\n- **Account Wallets** belong to people. You add funds, set spending limits and allocate money to your agents.\n- **Virtual Wallets** are for the agents. They spend within the permissions and limits you’ve set.\n\nYour handle gives that account a recognisable identity.\n\nAs of 15 September, though, reserving a handle gets you a page displaying the name and a notification when Wallets becomes available. [Cloudflare’s documentation](https://developers.cloudflare.com/wallets/) explicitly says a reserved handle can’t yet send, receive or hold funds.\n\nThe other part is the **Monetization Gateway**, which will let sites charge agents for access to resources. Cloudflare [announced it on 1 July](https://blog.cloudflare.com/monetization-gateway/), and access is still through the waitlist linked from that announcement.\n\nSo the products are announced, but you can’t yet use a reserved wallet handle to run this whole process.\n\nMy demo shows what that process looks like today using x402. The site charges one cent per page, my agent pays, and spending limits control what it can buy. It’s the same general arrangement Cloudflare describes for Virtual Wallets.\n\n## Why charge crawlers at all?\n\nThe arrangement between search engines and websites used to be fairly straightforward. Search engines crawled your content, showed it in their results and sent visitors back.\n\nPublishers got traffic. Search engines got something useful to show their users.\n\nAI answers have changed that arrangement. An agent can read your page, use the information in its response and answer the user without sending them to your site.\n\nI’ve spent months looking at [what these systems actually fetch](https://suganthan.com/blog/how-chatgpt-picks-sources-part-2/). There’s plenty of crawling. The traffic coming back often doesn’t reflect it.\n\nPublishers have responded in different ways, partly depending on how much negotiating power they have.\n\nSmaller sites often block AI crawlers. I understand why. If someone is taking your content and you’re getting little in return, blocking them is a reasonable response. But it comes with a trade-off: restricting access can also reduce your visibility in [training datasets and AI answers](https://suganthan.com/blog/common-crawl-checker/).\n\nLarge publishers can negotiate licensing deals. News Corp, the Financial Times and Reddit all have agreements with AI companies. According to [Press Gazette’s reporting on 4 September](https://pressgazette.co.uk/platforms/cloudflare-says-bot-blocking-is-fueling-publisher-ai-deals/), People Inc’s chief executive told investors that blocking crawlers through Cloudflare had helped bring AI companies to the negotiating table.\n\nGoogle’s pilot offers another approach: paying publishers according to the value their content contributes to AI answers.\n\nIn that same Press Gazette piece, Cloudflare said it was moving its own default approach from pay per crawl towards pay per use, with pilots involving Ceramic.ai and You.com. Its reasoning was that fetching a page doesn’t prove the content was actually used.\n\nI think that distinction matters.\n\nUsing a page to answer a question is a stronger indication of value than simply downloading it. But it’s also something the website owner can’t independently observe. Once my page has left my server, I can’t see whether it influenced an answer.\n\nWith pay per use, I’m relying on the platform to tell me what happened and what it was worth. With pay per crawl, I can check the request and the payment myself.\n\nGoogle’s eligibility rules make this particularly clear. As [Search Engine Land explains](https://searchengineland.com/google-tests-paying-publishers-for-using-its-content-in-ai-mode-ai-overviews-and-gemini-488382), contributing during answer generation can earn a payment. Being linked afterwards doesn’t. The publisher sees the total, without the calculation behind it.\n\nEach approach leaves something unresolved.\n\nBlocking earns nothing directly. Individual licensing agreements don’t scale to millions of small websites. Revenue-sharing arrangements leave the platform deciding how much to pay.\n\nPutting a price into the request gives a site a standard way to sell access. An agent can accept that price and receive the content, with a receipt for the transaction. There’s no need to negotiate a separate commercial agreement with every buyer.\n\nThat’s the pay-per-crawl model I wanted to test.\n\nCloudflare already has a product called **Pay Per Crawl**, but it’s still in closed beta. On the paying side, bot operators need verification through Web Bot Auth, Stripe onboarding and programme approval.\n\nMy personal agent can’t simply join that programme.\n\nSo I built a version using the open **x402 protocol**, which Cloudflare is also using for its upcoming Monetization Gateway. My demo makes actual x402 payments independently of Cloudflare’s closed Pay Per Crawl programme.\n\n## How x402 works\n\nHTTP has included a status code called `402 Payment Required` since 1997. The specification reserved it for future use.\n\nTwenty-nine years later, x402 gives it a practical purpose.\n\nIn my setup, the exchange has four steps:\n\n1. The agent requests a page. The server responds with `402 Payment Required` , including a`PAYMENT-REQUIRED` header that describes the price and payment requirements.\n2. The agent signs an authorisation to transfer the exact amount in USDC. It then retries the request with a `PAYMENT-SIGNATURE` header.\n3. A payment facilitator verifies the signature and settles the transaction on the blockchain. My demo uses Coinbase’s facilitator at `x402.org` .\n4. The server returns the content, along with a `PAYMENT-RESPONSE` header containing the settlement receipt.\n\nHere’s the offer from my site, decoded from a live `402` response this morning:\n\n```\n{\n  \"x402Version\": 2,\n  \"accepts\": [{\n    \"scheme\": \"exact\",\n    \"network\": \"eip155:84532\",\n    \"amount\": \"10000\",\n    \"asset\": \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n    \"payTo\": \"0xEdF2444D0259BBB8aC5094216D0148938F8308ff\",\n    \"maxTimeoutSeconds\": 300,\n    \"extra\": { \"name\": \"USDC\", \"version\": \"2\" }\n  }]\n}\n```\n\nThat offer asks for one cent in testnet USDC on **Base Sepolia**, paid to the burner wallet I’m using for the demo.\n\nUSDC uses six decimal places, so `10000` represents `0.01 USDC`.\n\nA compatible client can read those payment requirements and pay without creating an account with my site or asking me for an API key.\n\nThat’s a useful difference from `robots.txt`. A rule in `robots.txt` depends on a crawler choosing to respect it. Here, the server can withhold the protected content until payment succeeds.\n\nThe buyer wallet also held **zero ETH**, yet every settlement went through. The facilitator submitted the transactions and covered the blockchain transaction fees, usually called gas. I checked the balances twice.\n\nFor this setup, the agent only needed the testnet USDC it was spending.\n\nThere’s broader industry support behind the protocol too. The [x402 Foundation became operational under the Linux Foundation on 14 July](https://www.linuxfoundation.org/press/linux-foundation-announces-operational-launch-of-x402-foundation-to-standardize-internet-native-payments-for-ai-agents-and-applications), with 40 members, including Visa, Mastercard, Google, AWS, Stripe and Cloudflare.\n\nThat’s useful context, but the actual exchange is still those four steps.\n\n## What’s running on my site\n\nThe demo is at [paid.suganthan.com](https://paid.suganthan.com/).\n\nIt runs on a Cloudflare Worker, using roughly 300 lines of Hono code and the x402 middleware. It’s been running since 8 August, and the public earnings page records every paid crawl since then.\n\nThere are three routes:\n\n- **The landing page** is free and explains the demo.\n- **`/research/agentic-seo/`** charges`$0.01` per crawl.\n- **`/earnings/`** shows the running total, timestamps, payer addresses and transaction hashes.\n\nRequest the article with `curl` and you’ll get this:\n\n``` bash\n$ curl -i https://paid.suganthan.com/research/agentic-seo/\nHTTP/2 402\npayment-required: eyJ4NDAyVmVyc2lvbiI6MiwiZXJyb3Ii...\n```\n\nOpen the same URL in a browser and you get a page explaining the charge. It still returns HTTP status `402`, but a human visitor gets something readable.\n\nThere’s also a preview button. That opens the article for free with a banner, so you can inspect the content as well as the payment screen.\n\nI built another mode that isn’t enabled in the demo. Changing one variable makes the Worker charge only requests that identify themselves as known AI crawlers, including GPTBot, ClaudeBot and PerplexityBot. Human visitors can browse for free.\n\nI tested that mode using spoofed user-agent strings, and it behaved as expected.\n\nOf course, those strings can be faked. Checking a user agent is enough to demonstrate the behaviour, but it doesn’t prove who made the request. Cloudflare’s approach uses cryptographic verification of crawler identity to address that problem.\n\n## Giving the agent a budget\n\nThe buyer is a small Node script. Before it pays, it checks whether the request fits its budget.\n\nI gave it two limits:\n\n- A maximum of **$0.05 per call** .\n- A **$0.25 daily allowance** , recorded in a spending ledger on disk.\n\nThe script decodes the payment offer and checks both limits before authorising anything.\n\nIf the request is within budget, it pays, retries the request, prints the settlement details and records the spend. If it exceeds either limit, it refuses.\n\nHere’s a refusal with the per-call cap set below the page’s price:\n\n```\n[step 3] Spending guardrails\n[refused] Price $0.0100 exceeds the per call cap of $0.0010.\n          This agent does not negotiate. Raise MAX_PER_CALL to override.\n```\n\nThat refusal is one of the most useful parts of the demo.\n\nIf an agent pays every price a server gives it, you haven’t really delegated a budget. You’ve given it a way to empty a wallet.\n\nThe spending checks happen before signing. When the request fails those checks, the script exits with code `3` without creating a payment signature.\n\nThis follows the same general design Cloudflare describes for its wallets: a person provides the funds and sets the limits, and an agent spends within them. My buyer script demonstrates that behaviour without being an actual Cloudflare Virtual Wallet.\n\nThe successful run in the screenshot settled at **07:21 UTC**. Two earlier payments went through at [06:10](https://sepolia.basescan.org/tx/0x4b4029350a064cbc187edb720dd07b745d0b608ee8192ffdbeaa3af8346fef5b) and **06:11**, with the second still within the daily allowance.\n\nAll three appeared on the [public earnings page](https://paid.suganthan.com/earnings/) within seconds of confirmation.\n\nThe seller’s balance increased, the buyer’s balance decreased, and the amounts matched. The August transactions are still listed underneath them. I haven’t touched the payment code since those earlier payments.\n\n## Watching Claude pay during a task\n\nThis was the part I was most interested in.\n\nClaude Code supports hooks: scripts that can run around tool calls. Cloudflare documents a pattern that watches `WebFetch`, and I connected that pattern to my wallet.\n\nThe process works like this:\n\n1. Claude tries to fetch a page and encounters a `402` .\n2. The hook requests the payment offer itself.\n3. It checks the price against the per-call spending cap.\n4. If the price is allowed, it pays and retrieves the content.\n5. It passes the content and receipt back to Claude as additional context.\n\nClaude can then continue with its task. I don’t have to stop what I’m doing and manually pay for the page.\n\nThat’s what happened in the session shown near the top of this article. The hook returned this receipt:\n\n```\nPaid $0.0100 for \"https://paid.suganthan.com/research/agentic-seo/\" via x402.\nSettlement tx: 0x51b5eba4fb34ddff27052d89cb79ae3d748b379800a723a6f4f020c11e2871c9\n```\n\nYou can inspect the transaction [on BaseScan](https://sepolia.basescan.org/tx/0x51b5eba4fb34ddff27052d89cb79ae3d748b379800a723a6f4f020c11e2871c9/).\n\nClaude encountered a payment requirement during a task, and the hook handled it within the budget I’d set. It paid one testnet cent, returned the article and let Claude carry on.\n\nIf the price exceeds the cap, the hook refuses and tells Claude to show the price to the human instead.\n\nI quite like that boundary. Claude can buy a page when it needs one, but it can’t decide on its own that my five-cent limit no longer applies.\n\n## Should you start charging for your pages?\n\nI wouldn’t do it this month expecting search crawlers to pay you.\n\nThe software for paying agents is developing quickly. The crawlers that most site owners care about haven’t caught up.\n\nAWS made [AgentCore payments generally available on 18 August](https://aws.amazon.com/blogs/machine-learning/amazon-bedrock-agentcore-payments-is-now-generally-available-enabling-agents-to-transact-safely-and-autonomously-at-scale/). An agent using it can encounter a `402` during a task and pay through x402, much like my Claude hook. Cloudflare’s Agents SDK also has a client that can make payments.\n\nBut that doesn’t mean GPTBot, ClaudeBot, PerplexityBot or Googlebot will arrive at your site with a wallet and pay your asking price.\n\nUntil those crawlers support the process, requiring payment prevents them from retrieving the protected content. You could lose access to the systems that surface and cite your work without earning anything in return.\n\nI’d also be careful with the transaction numbers being used to describe this market.\n\n[Decrypt reported on 13 September](https://decrypt.co/378103/ai-agents-spending-money-research) that TRM Labs had examined **198.9 million x402 settlements**. Its analysis suggested that most of the payment volume wasn’t coming from AI agents.\n\nScheduled scripts, load tests and payments between accounts controlled by the same party can all produce similar blockchain records. TRM’s methods also can’t conclusively distinguish an agent from a script, so the estimates have limits.\n\nA large number of transactions tells us that the payment infrastructure is being used. It doesn’t, by itself, tell us that autonomous agents are buying useful things from independent websites.\n\nMy own demo makes that distinction fairly obvious. The payments work, but I’m on both sides of them.\n\nWhat I would think about now is **which parts of your site you might eventually charge for**.\n\nI don’t think the answer is every page.\n\nBeing cited in an AI answer still has value. General explainers may be worth keeping freely accessible because they help people discover your work.\n\nOriginal datasets, research and useful tools are more obvious candidates for paid access. An agent may need something specific from those resources to finish a task. Charging for that individual request makes more sense than trying to fit a machine into an advertising or subscription model designed around human readers.\n\nGoogle’s pilot approaches that value question from the platform’s side. It pays when content contributes to the answer, rather than simply appearing as a link underneath it.\n\nFor a site owner, the practical questions become: what is the agent getting, what should that access cost, and who decides?\n\nMy expectation is that adoption will become easier when products such as Cloudflare’s Monetization Gateway move beyond their waitlists. Charging for a resource could become a routine configuration choice for a large number of websites.\n\nI’d rather have thought through what to charge for before that option appears in the dashboard.\n\nAnd if Google offers you a monthly payment in the meantime, ask how it was calculated. Digiday’s reporting describes limited transparency, and one publishing executive argued that accepting early terms could weaken publishers’ position in future negotiations. Those terms deserve as much attention as the payment itself.\n\n## Moving from test tokens to real money\n\nEverything in this demo has used testnet tokens. The payments haven’t cost me real money.\n\nThe code also supports the real Base network. In my setup, the `NETWORK` setting switches from `base-sepolia` to `base`, moving the payment flow to real USDC.\n\nMy next step is to run exactly one real transaction.\n\nWhen an agent pays my site its first real cent, I’ll put the transaction hash in the next post.\n\nAnd when those reserved Cloudflare handles become working wallets, this is the kind of process they’ll support: an agent finds something it needs, checks the price against its budget, pays and carries on.\n\nThe [demo is staying online](https://paid.suganthan.com/) in the meantime. Try the `curl` request, inspect the payment offer and have a look at the [public earnings page](https://paid.suganthan.com/earnings/).\n\n## You might also like\n\n[← All posts](https://suganthan.com/blog/)", "url": "https://wpnews.pro/news/i-made-my-website-charge-ai-agents-a-penny-per-page-then-i-watched-claude-pay-it", "canonical_source": "https://suganthan.com/blog/x402-pay-per-crawl/", "published_at": "2026-09-15 00:00:00+00:00", "updated_at": "2026-09-15 09:07:40.727610+00:00", "lang": "en", "topics": ["ai-agents", "ai-policy", "ai-products"], "entities": ["Google", "Cloudflare", "Claude Code", "x402", "Search Console", "Digiday", "Search Engine Roundtable", "Barry Schwartz"], "alternates": {"html": "https://wpnews.pro/news/i-made-my-website-charge-ai-agents-a-penny-per-page-then-i-watched-claude-pay-it", "markdown": "https://wpnews.pro/news/i-made-my-website-charge-ai-agents-a-penny-per-page-then-i-watched-claude-pay-it.md", "text": "https://wpnews.pro/news/i-made-my-website-charge-ai-agents-a-penny-per-page-then-i-watched-claude-pay-it.txt", "jsonld": "https://wpnews.pro/news/i-made-my-website-charge-ai-agents-a-penny-per-page-then-i-watched-claude-pay-it.jsonld"}}