No raw credentials
Delegation uses capability tokens and scoped permissions, not stored card numbers, UPI PINs, or API secrets.
The open standard for delegated AI financial actions.
DPP lets users delegate bounded payment authority to AI agents via signed capability tokens and explicit consent without giving agents raw card numbers, UPI PINs, or wallet passwords. When a payment rail requires OTP or strong authentication, agents pause and escalate; the protocol orchestrates human completion rather than bypassing it.
Foundation
Six non-negotiable guarantees built into the protocol.
Delegation uses capability tokens and scoped permissions, not stored card numbers, UPI PINs, or API secrets.
Least privilege, explicit scopes, replay protection, and cryptographic identity are baseline—not optional.
When a payment rail requires OTP or user approval, agents pause and escalate. DPP orchestrates around human steps, never bypasses them.
Merchants independently verify that an agent is authorized for a specific payment intent before accepting funds.
Every delegated action produces a traceable, attributable record for users, merchants, and regulators.
An open standard with reference schemas and SDKs. No proprietary lock-in, no single-vendor dependency.
Audience
Maintain full control over payment authority. Set spending bounds, approve linking, complete OTP challenges on your own channel. Agents act within exactly what you authorize—nothing more.
Integrate DPP via MCP tools or platform adapters (Claude, Gemini, OpenAI Actions). Store OAuth tokens in an agent vault—never in LLM context. Handle escalation handles for step-up flows.
Verify JWS capability tokens and payment intents via dpp-merchant-sdk before charging any PSP. Consult /.well-known/jwks.json + issuer allowlist for trustless verification.
Architecture
How payment authority travels from user consent to PSP settlement—and back when escalation is needed.
Local sandbox architecture
MCP payment tool (stdio)
│
├──→ wallet-issuer :3350 (OAuth + delegation issuance)
│
└──→ express-merchant :3340 (payment verification + PSP)
Scenarios
Real scenarios grounded in the reference implementations.
User links wallet via MCP link_wallet (OAuth PKCE). Agent calls preview_payment → confirm_payment → get_payment_status. Full end-to-end flow on a local three-service stack.
User grants delegation with amount and merchant constraints. Agent issues a payment intent bound to the capability. Merchant verifies JWS + intent digest before PSP charge—no charge outside the bound is possible.
Merchant returns requiresUserAction and an escalation handle. User completes OTP on wallet/issuer channel only. Agent polls get_payment_status—never sees the OTP. Protocol enforces isolation.
Same escalation pattern as card OTP. UPI PIN challenge is returned via escalation handle; user completes on wallet UI. Agents must not—and cannot—collect PIN in the chat interface per protocol rules.
Gemini model invokes DPP tools via the platform adapter. User still completes wallet link and rail challenges outside the model context. DPP's consent model is not adapter-specific—it works across Claude, Gemini, and OpenAI Actions.
Protocol
From agent registration to authorized payment—step by step.
One-time POST /v1/agents registers an OAuth client and agentSub (DID). Demo uses pre-registered client from wallet /health.
GET /login establishes a user session cookie on the wallet only. No credentials leave the wallet service.
MCP link_wallet opens GET /oauth/authorize (PKCE S256). User sees consent UI and approves or denies via POST /oauth/consent.
Callback to http://127.0.0.1:8765/oauth/callback. POST /oauth/token exchanges code. Tokens stored in agent vault—never in LLM context.
The access token authorizes POST /v1/delegations/issue only—not merchant charges alone. Delegation is still bounded by user-approved constraints.
Merchant fetches GET /.well-known/jwks.json and validates issuer against allowlist (DPP_TRUST_JWKS_URI, DPP_TRUST_ISSUER). Trustless cryptographic verification.
Card-context and OTP submission use a shared Bearer DPP_WALLET_OPERATOR_TOKEN on private path (v0.1). Capability JWS still gates delegation on payment body. Production requires ≥32-char secret.
Developer surface
Four tools. One stdio server. Full payment lifecycle.
| Tool | Purpose | Charges? |
|---|---|---|
link_wallet |
OAuth PKCE link — opens browser consent flow | No |
preview_payment |
Intent + digest preview — no charge issued | No |
confirm_payment |
Issue capability + charge merchant via wallet delegation | Yes |
get_payment_status |
Poll PSP status — handles pending_user_action escalation | No |
// 1. Link wallet (OAuth PKCE — opens browser)
link_wallet({ walletUrl: "http://localhost:3350" })
// 2. Preview intent — no charge
preview_payment({
amount: 2500, currency: "INR",
merchantId: "demo-merchant"
})
// 3. Confirm — issues capability JWS, charges merchant
confirm_payment({ intentId: "pi_…" })
// 4. Poll status (agent never receives OTP)
get_payment_status({ paymentId: "pay_…" })
Repository
Everything in the repo, organized for implementers.
DPP is an open-standards draft, not a production payment processor. Please read before integrating:
docs/operations/wallet-kms-signing.md is Draft; production HSM/KMS signing is not prescribed yet.