Improved
Checkout SDK Updates — Web v1.4.1, Android v1.3.0
August 3rd, 2026
Web — v1.4.1 (2026-07-31)
Added
- Click to Pay (Mastercard SRC): New
SpreedlyClickToPayentry point (exposed from the Hosted Fields bundle) for Mastercard Click to Pay checkout — identity lookup (recognized device / OTP / new user), Mastercard<src-card-list>/<src-otp-input>components driven by the SDK, checkout in a popup or embedded drawer (checkoutPresentation), and tokenization into a standard Spreedly payment method. Single-entry integration viaconfig.fields: the SDK mounts its own hosted card fields (exposed asc2p.hostedFields), encrypts new-card PANs with MastercardencryptCardinside the number iframe, and runs all tokenization in-iframe so the PAN/CVV never touch the merchant page. Legacy kebab-case C2P event names are preserved for migration;errorevents carry a machine-routable stagecode. Seedocs/click-to-pay/. - Test SCA provider 3DS Global support: Transactions created with Spreedly's test SCA provider (
sca_provider_type: "test") now run the 3DS Global flow. These carry nomanaged_order_token, so Forter is not involved — the SDK presents the challenge when the transaction supplies one and otherwise completes authentication server-side, emitting the sameonChallenge/onSuccess/onErrorcallbacks as the Forter flow. - Mandate passthrough (AC-62): Optional
mandatefield on the tokenization APIs —SubmitParams(Hosted Fieldssubmit()and Express CheckoutsubmitParams/updateSubmitParams) and thesetupACHPaymentconfig. Forwarded verbatim to Spreedly Core atpayment_method.mandateand omitted when empty. Opaque by design via a new exportedMandatetype (Record<string, unknown>) — Spreedly Core owns the mandate schema and validation.
Android — v1.3.0 (2026-07-30)
Added
- Click to Pay (
clicktopay): Optional:clicktopayartifact with Mastercard WebView checkout (not present in the1.2.0artifact). Entry points:SpreedlyClickToPayCheckout(present,cancel,events,state,tokenize, lookup/OTP helpers), drop-inSpreedlyClickToPayButton/ClickToPayBrandedButton, andClickToPaySavedCardsDetectorfor pre-checkout Remember-me recognition (tear down beforepresent()). Sandbox new-user enrollment viaClickToPayCheckoutConfig.sandboxEnrollmentCard(in-memory only; rejected in production). Default UI uses MCsrc-card-listwith native SPL CVV/pay; sheet chrome followsSpreedly.setGlobalTheme()viaSpreedlyAdaptiveGlobalTheme(pay actions keep Mastercard SRC branding). WebView is hardened (Mastercard host allowlist, scheme deny-list, bridge method/size/forbidden-key guards, DCF popup policies); publicCheckoutCompletecarries metadata only (no PAN/CVV). See the Click to Pay Integration Guide. - Mandate passthrough on tokenization (
payments-core,paymentsheet,hostedfields): Optionalmandateon tokenize APIs and drop-in sheets, forwarded verbatim to Spreedly atpayment_method.mandateand omitted when null or empty. Accepts aMap<String, Any?>(nested values preserved; pre-parsedJsonObjectallowed). Spreedly owns schema validation; the SDK does not cap or validate mandate contents. Wire semantics follow ECMA-262JSON.stringify(NaN/Infinity→null;Date/Instant/UUID/URL/URI→ canonical string). Unrepresentable values or reference cycles fail tokenization with the offending key path. Mandate contents are never logged.
Breaking Changes
SpreedlyBottomSheet/SpreedlyBankAccountBottomSheetCompose signatures (paymentsheet): The optional trailingmandatechanges the Compose-generated method name — recompile consumers against the newpaymentsheetAAR. Kotlin callers using defaults are source-compatible; JavaPaymentSheetJavaHelper.setupContentkeeps prior overload arities.- Tokenize APIs gain trailing
mandate(payments-core):Spreedly.createCreditCard/createPaymentMethod(and matchingSpreedlyPaymentManagermethods) take an optionalmandate: Map<String, Any?>?. Kotlin defaults remain source-compatible; Java callers must passnullor a map.

