| Starting account | A US test-mode account, usd default currency, standard 2.9% + 30¢ card pricing — and otherwise empty, because a real Stripe account starts empty; seeds are what fill one |
| Authentication | The sk_test_… secret key as a Bearer token — what stripe-python always sends — and the legacy basic form, with Stripe’s real 401s: the missing-key message, the star-redacted echo of an unknown key, and the pk_/rk_ refusals |
| Wire | Bracket-nested form encoding exactly as stripe-python 15.6.1 sends it, the one {"error": {...}} envelope every SDK exception is built on, Request-Id on processed operation responses but not authentication, invalid-version, unsupported-content, rate-limit or unknown-URL refusals, and Stripe’s clamped-limit cursor pagination |
| Payments | Customers, payment methods from Stripe’s test tokens, payment intents through the whole status machine (manual and automatic capture, test-card declines carrying decline_code and the intent itself, retry after decline), and the charges behind them |
| Money | Balance transactions whose fee, fee_details and net always reconcile against a modelled rate, the derived available/pending balance, refunds with their reversals, disputes with real evidence deadlines, and payouts that group what became available |
| Catalog, search and events | Products and prices (one-time, recurring, zero-decimal currencies), search across customers, payment intents, charges, products and prices, and an event log with Stripe’s own type strings as the queryable read model |
| Idempotency | The SDK sends an Idempotency-Key on every POST, so replays return the original response, mismatched reuse is refused, and keys expire after Stripe’s 24-hour window when the environment advances |