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
WhereThe site, /api/*, /mcp, Skills/x402/* only
Listed on the siteYesNo — never appears in any listing or feed
Image URLPermanent, embeddableExpires in 300 seconds
Paid toThe 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/itemsFreeCatalog: ids, descriptions, price, payout address. Carries no images.
GET/x402/randomPaidA random premium image
GET/x402/item/:idPaidOne specific premium image

Payment terms

Price0.01 USD Coin per request
Networkeip155:8453 (Base mainnet)
Asset0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
Schemeexact — EIP-3009 transferWithAuthorization
RecipientPer 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

  1. The client calls the endpoint with no payment and gets 402. The terms arrive base64-encoded in a PAYMENT-REQUIRED header.
  2. The client signs an authorization for exactly that amount and retries the same URL with a PAYMENT-SIGNATURE header.
  3. 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

  1. Sign in, then go to Submit.
  2. Tick Premium under the upload button and enter the EVM address you want to be paid at.
  3. 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.