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 file
GET https://<domain>/.well-known/ofp.json, which may point at the manifest - HTTP header
Link: <manifest>; rel="ofp", so a HEAD is enough - HTML head
<link rel="ofp"> or <meta name="ofp"> - Registry lookup
GET /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.
Publishing something agents read?
That’s the other half of Copen, and the one most people come for. See what publishers get.