x402 · MPP · UCP · ACP · AP2 · open format

Agents can pay.
Now they can pick up.

agentPickup turns a payment into a signed pickup pass. An agent pays over x402, or a person pays by card, and the buyer gets a QR. The merchant's scan proves the right person collected the order, and only then does the payment settle. It's an open format and a drop-in library for facilitators, agent wallets and ordering platforms.

Integrate it ↗ Run the live demo
~250 Bsigned pass in the QR
Ed25519checkable offline
1 scanverifies and settles
agent → demo-cafe● live
08:38:02402 requiredPOST /api/orders/ord_7Hk…/pay4.00 USDC
08:38:04order.paidx402 · base · tx 0x9f3c…e21a✓
08:38:04pass.emailedEdDSA · 252 B · QR + code✓
08:41:17order.readysecond email sent✓
08:44:03order.collectedcounter scan · sig ok · single usesettled
Pickup code
K7P4QX
Ed25519 · single use · expires 10:38
collected · proof signed

/gap

Agents can pay for physical things.
Nobody can prove they collected them.

The payment and shopping standards each stop one step short of the counter.

LayerWho covers itWhat's therePickup proof
Payx402 · MPPMoney moves per request, in USDC or by card through Stripe. Signed receipts prove a payment happened.✕ none
ShopUCP · ACPUCP lets an agent choose a pickup store at checkout, and ACP has fulfilment options. Neither says how collection is proven.✕ none
Platformsordering appsPickup codes exist, but each one is a closed app tied to its own accounts and saved cards.✕ closed
Hand overagentPickupA signed pass the merchant scans. It proves the right person collected, and the payment settles on that scan.✓ open

/how

From 402 to hand-over

What happens on the wire, start to finish.

#StepWhat happensOn the wire
01QuoteThe agent creates an order and asks to pay. The price comes from the merchant's catalog, never from the request.402 Payment Required
02PayUSDC over x402 exact today. Holds through auth-capture as facilitators add it. Cards through Stripe are held until the scan.x402 · Stripe
03IssueThe pass is an Ed25519 JWS of about 250 bytes, emailed as a QR with a six-letter backup code. Public keys sit at /.well-known.pass.emailed
04VerifyAny phone camera or USB scanner reads it. The signature checks offline, and single use is enforced against the merchant's store.sig ok · single use
05SettleThe hold is captured on the scan, or released if nobody collects. A signed webhook goes to the platform.order.collected

/standards

Speaks every agent checkout

Whichever way the agent pays, the order ends in the same signed pickup pass. Every path is covered by the test suite.

StandardWhat agentPickup doesEndpoint
x402USDC per order, with bazaar discovery, signed offers and receipts, retry-safe payment ids, and Sign-In-With-X so the paying wallet can fetch its pass again./api/orders/:id/pay
MPPStripe and Tempo's Machine Payments Protocol: card or Link through a Shared Payment Token, straight into the merchant's Stripe./api/orders/:id/mpp
UCPGoogle's Universal Commerce Protocol: checkout with the pickup method, and the pickup pass as the order's link./.well-known/ucp
AP2Every checkout is signed by the shop, and the platform's SD-JWT mandate proving the buyer approved those exact terms is verified and kept as evidence.UCP mandates
ACPOpenAI and Stripe's Agentic Commerce Protocol: checkout sessions with in-store pickup, delegated payment and signed order webhooks./.well-known/acp.json
Visa TAP · MastercardRFC 9421 agent signatures (Trusted Agent Protocol, Agent Pay, Web Bot Auth), checked on every agent payment route.signed agents

/spec

An open pickup pass

A small, signed token that any facilitator, wallet or platform can issue and check. It carries no names, items or amounts, so a leaked screenshot gives nothing away.

  • Compact JWS, EdDSA. It fits in a QR that a normal phone camera opens.
  • Checkable offline. Keys come from the merchant's JWKS, so a locker or kiosk can verify one with no network.
  • Built for x402. It's designed to sit next to x402's offer-and-receipt extension: the receipt proves payment, and the pass proves collection.
  • Maps to UCP. The pass fills in the proof of collection that UCP's pickup fulfilment method leaves open.

format v1 · draft · feedback welcome

pass.jws, decoded
// header
{ "alg": "EdDSA", "kid": "_Gmp2PH4" }

// payload
{
  "v":   1,
  "oid": "ord_7HkQ2mXc9aRt",   // order
  "pid": "Ya7qVHjkKI7bn4gU",   // pass id, single use
  "exp": 1793666330           // collect by
}

// QR content
https://shop.example/c/<header>.<payload>.<sig>

// keys
GET /.well-known/collect-keys.json  → JWKS (Ed25519)

/demo

Run an order end to end

A pretend café running the library. Pay with the test button, or hit the x402 link and see the real 402 quote. Then scan the pass the way staff would. No real money moves.

demo-cafe · menutest mode
total$0.00
order · events

$ waiting for an order▍

Add something on the left and pay. The events, the email and the scan will show up here.

/who

Built for the companies that move agent payments

facilitators · wallets

A real-world use case for agent money

Your agents can already buy API calls. Add physical goods that someone collects in person, with a signed proof of hand-over for disputes and spending policies.

  • Issue and check passes in your stack
  • Settle when the scan happens, not before
ordering · POS · delivery

Agent-ready pickup for every merchant

Accept orders from any agent, not just the ones on your app, and give every merchant on your platform the same signed hand-over under your brand.

  • White-label scanner and emails
  • Courier hand-over doubles as proof of delivery
developers

Click and collect in an afternoon

Mount one Hono app and get checkout, passes, a scanner and webhooks. SQLite out of the box, or bring your own store.

  • Free to self-host, no tracking
  • TypeScript on Node 22; swap the store for other runtimes
works forcafésretail click & collectcourierseventslockers & kiosksrentals & repairs

/developers

One mount, the whole flow

Checkout, passes, scanner, emails and webhooks, on your domain and under your brand.

  • Every way agents pay. x402, MPP, UCP and ACP for agents, and Stripe Checkout with the card held until pickup.
  • An MCP server. @agentpickup/mcp lets any agent order, pay and fetch the pass. Try ours at /mcp.
  • Your brand only. Emails, pass pages and the scanner carry the merchant's name and colours, never ours.
  • Events you can act on. Signed webhooks for paid, ready, collected and expired orders.
  • Safe by default. Prices come from the catalog, claims are atomic so two scanners can't both hand over, and staff routes sit behind a key.
server.ts
import { createCollect, SqliteStore, resendMailer } from "@agentpickup/server";

const pickup = createCollect({
  baseUrl: "https://orders.yourshop.com",
  merchant: {
    name: "Corner Café", brandColor: "#9a3412",
    fromEmail: "Corner Café <orders@yourshop.com>",
    location: { name: "Front counter" },
  },
  catalog,
  payments: {
    x402: { payTo: env.WALLET, network: "eip155:8453" },
    card: { secretKey: env.STRIPE_KEY, captureMode: "hold" },
  },
  store: new SqliteStore("./data/pickup.db"),
  mailer: resendMailer({ apiKey: env.RESEND_KEY }),
  signingKeyPem: env.PASS_SIGNING_KEY,
  staffKey: env.STAFF_KEY,
  onEvent: (e, order) => platform.notify(e.type, order),
});

app.route("/", pickup.app);

/pricing

An open format, a fair-source server

The format is open and the library is free to run yourself. We earn when we run it for platforms, and only on completed pickups.

self-host
Free

The pass format is Apache-2.0. The server and scanner are source-available under FSL, free to self-host, and turn into Apache-2.0 after two years. Your servers and your keys.

Get the code first
design partners
Free while v1 settles

Facilitators and wallets who integrate early help shape the format before it's proposed upstream.

Become a partner

/partners

Integrate agentPickup

We're looking for a few facilitators, wallets and ordering platforms to build with first. Tell us what you'd plug it into.

partners
we're a