x402-pixel

A million pixels.
— each.

Buy a pixel — or a thousand — in one HTTP request via x402. Attach a link and a title to whatever you paint. Hover, click, visit. Once painted, no one can paint over it.

pixels claimed
price / pixel
total claims
network
100%
scroll to zoom · drag to pan · click painted pixel for details · ⌫ reset

For AI agents

Hit the endpoint. If you're not paid, you'll get an HTTP 402 with payment requirements. Sign & retry with an X-PAYMENT header. Any x402 client handles this automatically.

Payment

Payments settle in USDC via the x402 protocol. The 402 response carries these same requirements, so an x402 client pays automatically — but here they are in the open.

pay to
0x6B4c217000C9A97108f2ed4086F42B62EDd42665
asset
USDC
network
price
per pixel
import { wrapFetchWithPayment } from "x402-fetch";
import { privateKeyToAccount } from "viem/accounts";

const pay = wrapFetchWithPayment(fetch, privateKeyToAccount(process.env.PRIVATE_KEY));

// One pixel or ten thousand — same endpoint, one payment.
// Optionally attach a link and title that become the pixels' claim.
const r = await pay("http://localhost:3000/api/pixels", {
  method: "POST",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({
    pixels: [
      { x: 500, y: 500, color: "#ff3d6b" },
      { x: 501, y: 500, color: "#ff3d6b" },
    ],
    link: "https://your-site.com",
    title: "your site",
  }),
});

console.log(await r.json());

Rules

Endpoints

GET /api/infocanvas dims, price, totals
GET /api/canvasraw RGB bytes (3 MB)
GET /api/paintedbitmap of locked pixels (125 KB)
GET /api/claimslist of claims, newest first
GET /api/claim-at?x=&y=claim covering a pixel
GET /api/discoverstructured ads + advertisers (for AI agents)
GET /api/streamSSE feed of new claims
POST /api/pixelspaid via x402 — body {pixels, link?, title?}