x402 — Pay-per-request images
A small premium collection sold to autonomous agents over x402, priced per request in USD Coin on Base. Everything else on LGTM.lol stays free and always will.
Two collections
| Free | Premium | |
|---|---|---|
| Where | The site, /api/*, /mcp, Skills | /x402/* only |
| Listed on the site | Yes | No — never appears in any listing or feed |
| Image URL | Permanent, embeddable | Expires in 300 seconds |
| Paid to | — | The submitter's wallet, directly |
They are separate sets of images. Nothing is moved behind the paywall, and nothing paid is given away.
Endpoints
| Method | Endpoint | Cost | Description |
|---|---|---|---|
| GET | /x402/items | Free | Catalog: ids, descriptions, price, payout address. Carries no images. |
| GET | /x402/random | Paid | A random premium image |
| GET | /x402/item/:id | Paid | One specific premium image |
Payment terms
| Price | 0.01 USD Coin per request |
|---|---|
| Network | eip155:8453 (Base mainnet) |
| Asset | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 |
| Scheme | exact — EIP-3009 transferWithAuthorization |
| Recipient | Per image, set by whoever submitted it |
Paying is gasless for the buyer: the wallet only signs an authorization, and a facilitator broadcasts the transaction. The buyer needs USD Coin, not ETH.
How a request works
- The client calls the endpoint with no payment and gets
402. The terms arrive base64-encoded in aPAYMENT-REQUIREDheader. - The client signs an authorization for exactly that amount and retries the same URL with a
PAYMENT-SIGNATUREheader. - The server verifies and settles it, then returns the image URL along with
PAYMENT-RESPONSE, which carries the settlement transaction.
The 402 is a challenge, not an error — it is the first half of the exchange. It costs nothing to ask, so reading the terms is always free.
Try it
See what is for sale, free:
curl https://lgtm.lol/x402/items
Read the terms without paying:
curl -i https://lgtm.lol/x402/random
A paid response looks like this:
{
"item": { "id": 1, "description": "A cat approving your pull request" },
"image_url": "https://s3-....amazonaws.com/...?X-Amz-Expires=300&...",
"content_type": "image/png",
"expires_in": 300,
"access": "settled"
}
The URL expires, so it cannot be pasted into a pull request and reused. That is what makes per-request pricing mean anything.
Clients
Any x402 v2 client works — the @x402/* packages (2.x). x402-fetch (1.x) implements v1 and cannot complete this handshake.
npm install @x402/core @x402/evm @x402/fetch viem
A working agent, including the spend guards you want before letting a model hold a wallet, is in x402-agent.
Selling your own images
- Sign in, then go to Submit.
- Tick Premium under the upload button and enter the EVM address you want to be paid at.
- Track requests and earnings on your Premium page.
Payments settle straight from the buyer's wallet to yours. LGTM.lol never holds the funds and takes no cut.
Discovery
Every payment challenge carries the bazaar extension, so facilitators catalog these endpoints for agents that have never heard of this site. Cataloging happens as a side effect of a real payment, not as a registration call.
Agents that already know the site can skip all of that and just read /x402/items.