Skip to main content
MPP ist das Machine Payments Protocol: ein IETF-Draft (draft-httpauth-payment-00, co-authored Tempo Labs + Stripe, siehe paymentauth.org) der HTTP 402 Payment Required in eine echte, maschinenlesbare Challenge verwandelt. Ovra implementiert die card-Methode als Credential-Issuer. Wenn ein Merchant WWW-Authenticate: Payment ... returnt, kann dein Agent zahlen — ohne ein Formular zu rendern, einen Browser zu öffnen oder eine Kartennummer zu sehen.
Code-complete (Phase 7). Sandbox-only End-to-End. Das Credential-Envelope ist ein echtes JWE; Merchants liefern in ihrem MPP-Onboarding einen Private Key zum Entschlüsseln.

Wire-Flow

1

Merchant returnt 402

Der Challenge-Body deklariert Amount, Currency, Payee, Expiry und Resource-URL.
2

Agent mintet Credential

Agent ruft POST /v1/mpp/credentials/mint mit der rohen Challenge plus genehmigtem Intent und einer Karte. Ovra mintet ein JWE-wrapped Network-Token gebunden an den Intent.
3

Agent präsentiert Credential

Agent wiederholt den Request mit Authorization: Payment <credential>.
4

Merchant entschlüsselt und settlet

Merchant verwendet eigenen Private Key (RSA-OAEP-256 + A256GCM) zum Unwrap von DPAN + Cryptogram, settlet via eigenen Acquirer.
5

Merchant returnt Payment-Receipt

Der Receipt-Header ist der kanonische Settlement-Record.
6

Agent verifiziert

Agent ruft POST /v1/mpp/credentials/:id/verify (oder /by-challenge/:challengeId/verify) — Ovra führt CAS-Consume aus, treibt Intent-FSM auf completed, schreibt transactions-Row mit rail = 'mpp', feuert mpp.transaction.completed.

High-Level-Convenience: POST /v1/mpp/pay

Für die meisten Agent-Code-Pfade willst du den Roundtrip nicht selbst orchestrieren. Der High-Level-Endpoint macht alles:
Was er tut:
  1. GET die URL, erwartet 402 mit MPP-Challenge.
  2. Mintet eine Credential gebunden an intentId + cardId.
  3. Wiederholt den Request mit Authorization: Payment <cred>.
  4. Empfängt Payment-Receipt, ruft Verify, schreibt die Transaktion.
Response (200):

Low-Level: Mint + Verify

Error-Matrix

Verify-Failures nutzen RFC-9457 Problem Details (application/problem+json) mit Type-URIs invalid-challenge oder verification-failed — niemals ein Oracle. Replays returnen 402 invalid-challenge egal welche Underlying-Cause.

Merchant-Onboarding

Wenn du einen Merchant betreibst der MPP akzeptieren möchte, registriere via POST /v1/merchants mit Invite-Code:
Response (One-Shot-Reveal, speichern):
mer_sk_* zum Aufruf von /verify verwenden. Der JWK validiert ausschließlich als RSA-OAEP-256 + A256GCM; Downgrades werden zur Write-Time abgelehnt.

Webhooks

Sacred Guarantees

  • Null Card-Data im Agent-Kontext. Das Credential-Envelope ist eine base64url-nopad JWE; nur der Private Key des Merchants kann sie entschlüsseln. Selbst wenn der Agent die volle Mint-Response loggt blutet kein PAN/DPAN/Cryptogram.
  • Single-use. CAS-Consume bei Verify — Replay returnt 402.
  • Gebunden an einen Intent. Wiederverwendete Intent-IDs über Challenges hinweg werden mit E_MPP_CRED_INTENT_MISMATCH abgelehnt.

Weiter

CUA

Der andere Pay-Modus — für Merchants ohne MPP.

Pay-Übersicht

Wie MPP und CUA ein Produktnarrativ teilen.

Intents

Die Approval-Primitive an die jede Credential bindet.

Webhooks

mpp.* Events für Echtzeit-Updates abonnieren.