Teach your agent to pay for what it reads.

Four HTTP calls: find the manifest, check what the site accepts, say who you are, settle the task. The protocol is open and the client library does the signing.

OPENFP v0.4, MIT licensed. No key needed to read a manifest.

GET /.well-known/ofp.json
{ "manifest": "…/site_k2p9" }
GET /api/v1/manifest/site_k2p9
{ "status": "accepting", "basis": "usage" }
GET /api/v1/whoami
{ "operator": "Acme AI", "balance": 50000 }
POST /api/v1/settlements
✓ 201 · 6 sites · paid from balance

Discovery, in the order to try it

Collect these from responses you were fetching anyway. Discovery should cost no extra requests, and a manifest is good for the length of a task.

  • Well-known fileGET https://<domain>/.well-known/ofp.json, which may point at the manifest
  • HTTP headerLink: <manifest>; rel="ofp", so a HEAD is enough
  • HTML head<link rel="ofp"> or <meta name="ofp">
  • Registry lookupGET /api/v1/lookup?domains=a.com,b.com, up to 50 at a time

Read basis before deciding what to pay: voluntary leaves it to you, usage publishes a rate, agreement means it’s handled elsewhere.

Settling a task

One call covers up to fifty sites. Send a budget with a weight per site and the registry splits it, or send explicit amounts. Anything that can’t be settled comes back with a reason and the site’s own funding links.

import { signRequest } from "@openfp/spec";

const body = JSON.stringify({
  total: 2000,
  currency: "usd",
  allocations: pagesRead.map(p => ({ domain: p.domain, weight: p.pages })),
  usage_note: "Answered a support question",
});

await fetch("https://copen.dev/api/v1/settlements", {
  method: "POST",
  headers: { "Content-Type": "application/json", ...signRequest({ method: "POST", url, body, ...key }) },
  body,
});

Unsigned requests work too. They come back with a checkout link for a human, which is usually not what you want, which is what the next section is for.

Optional: register access and skip the human

Verify your domain, register an Ed25519 key and fund a balance, and settlements complete synchronously. You also get a public record publishers can look up, which is worth more than a user-agent string when someone asks what your crawler is.

  • Pre-fundedYour exposure is the balance, never a card
  • Per-settlement capEnforced server-side, not by your agent
  • Revocable keysEffective on the next request
  • Full ledgerEvery top-up and settlement, with references

Publishing something agents read?

That’s the other half of Copen, and the one most people come for. See what publishers get.