Prototype by Ajay Krishna

Agentic commerce · the payment-authority layer

How an agent gets authority to pay.

Agents can already find products through Klarna’s Agentic Product Protocol (APP), an open product-discovery standard (a protocol, not a mobile app). The open question is who authorises the payment. This page walks the whole mechanism: how an agent proves which agent it is (an issuer-attested credential bound to its own signing key), how it signs every request so the gate can trust it without holding its key, how a human grants it a scoped, revocable mandate with a single bank approval, and how all of that is verified before any money moves. Today that authority is defaulting to card tokens; Europe’s Open Banking consent does the same job while holding no credential at all. The two primitives, side by side. 👇 ← back to the live demo

Mechanism explainer · the consent flow below is synthetic (the live demo runs a live sandbox payment)

AI agent STEP 1 · Find it Klarna APP ✓ solved · discovery-only, 15 Dec 2025 ? STEP 2 · Pay payment-authority gap who safely says “you may pay”?
Klarna’s APP solved “find it.” It left “who may pay” open. That gap is what this is about.

Two ways to give an agent permission to pay

What the market ships today •••• 4242 Network token holds a card / BNPL credential inside
  • ⬤ Built from your card / BNPL
  • ⬤ Cancel via the card network
What Europe already has · the overlooked answer Consent token € cap · 1 payee · expiry no credentials inside
  • ⬤ You approve it (SCA)
  • ⬤ Revoke at your bank, anytime

My take For handing an AI agent authority to pay, Open Banking consent is the safer primitive: credential-blind, scoped, revocable, and holding no secret to leak. Cards still win on disputes (A2A has no chargeback), so use each for its job. The miss is making card rails the default while Europe’s purpose-built primitive sits unused.

One-line glossary
Klarna APP
Agentic Product Protocol: Klarna’s open standard for making products discoverable by AI agents. A protocol and product feed, not a mobile app.
SCA
a security check where you confirm the payment (bank app / face / code).
Open Banking / PSD2
EU law letting an approved app act on your account with your consent, via a standard bank API.
RFC 9421
HTTP Message Signatures — the agent signs its request with its own key so the bank knows which agent acted.
BNPL
Buy Now, Pay Later: pay in instalments (Klarna, Affirm).

Three identities — and why the app needs no separate human login

👤

You — the user

Who is shopping?

No app account or password. You're identified by the mandate you grant at your bank — the agent carries it, so the page knows whose agent it is.

Login: none — via the mandate
🔑

The mandate — at your bank

What may be paid, from whose account?

Granted once via your bank's SCA — a scoped, revocable allowance. The app never sees your bank credentials.

Login: bank SCA · once
🤖

The agent — the machine

Which agent is acting, for whom?

An issuer-attested credential bound to its key (RFC 7800); it signs each request (RFC 9421). No login page.

No login · cryptographic

No separate human login is needed: the page recognises the agent from its credential, and who it acts for from the mandate it carries. The only human step is the bank SCA that grants the mandate — that's where the user is established and authority to pay is given. One human moment (at the bank), no app password.

🪪 Agent identity · who’s asking?

The gate verifies the agent — not just that it holds a key

An identity authority attests the trusted agent (RFC 7800 binds the credential to its signing key). Send each agent at the gate — only the issuer-attested one whose credential is bound to its key gets through. All decided by crypto, before any payment.

Pick an agent above to watch the gate verify it, step by step.

🌐 Where the agent runs

In production, the agent comes from outside

This shopping demo embeds an agent so it runs in one page. In reality an agent is a separate party: it holds its own key, and it never lives inside the merchant or the bank. The authority already treats it that way. It trusts an issuer-attested credential and the agent's own signature, not a key the server holds.

  1. 1
    Agent holds its own keyGenerated on the agent's machine. The server never sees the private key.
  2. 2
    Enrol for a credentialThe issuer attests the agent and binds the credential to that key (Know-Your-Agent).
  3. 3
    Authenticate from outsideThe agent signs each request (RFC 9421); the gate verifies the credential, then the signature.
A brand-new agent the app never shipped with. Run it from your own machine with python3 external_agent.py.
🔌 Bring your own agent

Have an external agent? Shop here.

The gate is public and credential-based, so any agent can transact against the live sandbox API at agent-payment-authority.vercel.app. Where your agent runs does not matter; only what it carries does. Here is what it brings and how it connects.

What your agent brings

Prerequisites: Python 3 with the cryptography package and outbound HTTPS. No account, no API key, no login page.

How it connects

  1. 1
    Enrol · POST /agent/enrollSend your base64url public key; receive a keyid and an issuer-attested credential.
  2. 2
    Authenticate · POST /agent/verifySend an RFC 9421-signed request plus the credential. The gate verifies identity, then the signature → ALLOW.
  3. 3
    Get a mandate · POST /agent/mandateReturns a bank authorisation URL; your human completes one SCA (test_authorised + any 3 digits).
  4. 4
    Pay · POST /agent/payThe agent draws real sandbox payments off the mandate, each signed, with no further approval.

Run the reference agent from your own machine:

python3 external_agent.py https://agent-payment-authority.vercel.app

It generates a fresh key, walks all four steps, waits for the one-time SCA, then draws a live sandbox payment. A rogue that presents a stolen credential but signs with a different key is denied at the signature check, before any bank call.

🔗 Verifiable Intent · AP2-aligned

The same trust model the card networks use, on Open Banking rails

Verifiable Intent (Mastercard) and Google AP2 bind a human’s intent to an agent’s action with a layered SD-JWT chain (RFC 7800 key-binding plus selective disclosure): Layer 1 credential provider → user, Layer 2 user → agent (the mandate and its constraints), and Layer 3 the agent’s execution, split into a payment credential (L3a) and a checkout credential (L3b). The spec defines two modes: Immediate (the user confirms the final values) and Autonomous (the user sets constraints and the agent runs on a delegated key).

This demo issues spec-conformant Verifiable Intent credentials (Apache 2.0): ES256, the spec’s vct and typ, KB-style layer binding, delegate_payload, and the L3a/L3b cross-binding — verified to parse and verify with the official reference decoder. Layer 2 (human intent) is met by a bank SCA and it settles over Open Banking instead of cards. Read the spec →

Build the chain to see L1 → L2 → L3a/L3b, signed and key-bound.

🏦 Network sees · L3a payment

🛍️ Merchant sees · L3b checkout

Selective disclosure: the network never sees the cart; the merchant never sees the payment account.

EU-native

Open Banking consent authority

Scoped · SCA-backed · revocable · credential-blind

  1. TPP creates a scoped consent (cap + single payee + expiry)
  2. PSU completes SCA directly at the bank
  3. Agent pays within scope (bank enforces)
  4. Agent tries over cap → bank denies
  5. PSU revokes → token dies
authority token: not issued yet
Market default

Payment-network token

Stripe SPT / Mastercard Agentic Token · card + BNPL

  1. Token minted from a tokenised card / BNPL credential
  2. Authentication delegated to issuer/network
  3. Merchant + amount scoped (network-defined)
  4. Revocation via issuer/network, not the bank
  5. Carries a derived credential
token: not minted yet

Side by side

DimensionOpen Banking consentNetwork tokenWhy it matters
Credential exposure None: token carries no PAN/secret/login Derived from a tokenised card PAN / BNPL line An agent holding no credential can't leak one.
Authentication PSU does SCA directly at the bank Delegated to issuer/network at provisioning SCA keeps a human in the loop for the mandate.
Scope Explicit: amount cap + single payee + expiry Merchant + amount (network-defined) Per-payment scope limits blast radius of a rogue agent.
Revocation PSU, anytime, at the bank dashboard Issuer/network: no direct PSU bank-side kill switch The payer can pull authority instantly.
Dispute / chargeback Weak: A2A has no chargeback; PSR refund is fraud-only Strong: card scheme chargeback rights THE honest counterpoint: cards win on buyer protection.
Rails Account-to-account (SEPA / instant) Card network + BNPL Different settlement, different economics.

One row keeps cards ahead: dispute / chargeback (A2A has none; the PSR refund is fraud-only). Everywhere authority itself is concerned (credentials, scope, revocation, who authenticates), the consent column is stronger. That’s the column Europe already ships, and the one agentic commerce is walking past.

← back to the live demo