Proof
Don't trust the screenshot. Ask PayPal.
Every payout batch, order, authorization and capture below was created in the PayPal sandbox by SafePay, read from the audit chain itself. "Ask PayPal" re-reads each one from PayPal's own API, so the status you see is PayPal's answer, not ours.
PayPal objects named in the chain
loading…Every PayPal API SafePay calls
| PayPal surface | What SafePay does with it | Code |
|---|---|---|
| OAuth 2.0 client credentials | One token per instance, cached, sandbox host pinned | paypal_client.py |
| Payouts API (create, get batch) | Releases an ALLOW decision with an idempotency key and the seal in the note; settlement re-reads the batch | send_payout, get_payout |
| Orders v2, intent AUTHORIZE + Payments v2 (capture, void) | Mandates: authorize a judged ceiling, capture each checked draw with its own seal, void the rest | mandate.py |
| PayPal Agent Toolkit (create_order) | Runs only after the guardrail says ALLOW | agent_toolkit.py |
| PayPal MCP server (@paypal/mcp, 28 tools) | Proxied; create_order, pay_order, create_refund, accept_dispute_claim and create_subscription are judged first, with amounts read back from get_order, get_dispute and the plan price | mcp_proxy.py |
| Webhooks + verify-webhook-signature | Payout events verified with PayPal, state re-read from the API; a payout SafePay never released is chained as "outside" | /api/paypal/webhook |
| Transaction Search | Reconciliation: any debit without a SafePay decision is flagged | reconcile |