docs(sca): document Strong Customer Authentication for EU customers - #683
docs(sca): document Strong Customer Authentication for EU customers#683jklein24 wants to merge 2 commits into
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. 2 Skipped Deployments
|
This stack of pull requests is managed by Graphite. Learn more about stacking. |
|
@greptile review |
Greptile Summary⚔
Confidence Score: 5/5This looks safe to merge.
|
| Filename | Overview |
|---|---|
| mintlify/ramps/conversion-flows/fiat-crypto-conversion.mdx | Guards access to realtime-funding payment instructions while authorization is pending. |
| mintlify/snippets/sca/strong-customer-authentication.mdx | Provides shared guidance for quote authorization, challenge loops, resend behavior, and expiry. |
| mintlify/platform-overview/sca/per-transaction-authorization.mdx | Documents authorization for prefunded and realtime-funded quotes. |
| mintlify/docs.json | Adds the six SCA pages to the documentation navigation. |
Reviews (4): Last reviewed commit: "docs(sca): refresh the guide for API dri..." | Re-trigger Greptile
Address Greptile review on #683: - Document the quote resend endpoint (POST /quotes/{quoteId}/authorize/resend) alongside the transaction one, since a realtime-funding quote's SMS challenge exists before any transaction. - Note that a realtime-funding 202 withholds paymentInstructions until the challenge is authorized, so integrators authorize first, then read them. Co-Authored-By: Claude <noreply@anthropic.com>
|
@greptile review |
…CA-pending quotes The runnable displayPaymentInstructions example dereferenced quote.paymentInstructions[0] unconditionally, which throws for an EU realtime-funding quote returned as PENDING_AUTHORIZATION (instructions withheld until the scaChallenge is authorized). Guard for the pending case and point at the SCA section. Addresses Greptile P1 on #683. Co-Authored-By: Claude <noreply@anthropic.com>
|
@greptile review |
af68ac7 to
d71d44d
Compare
Address Greptile review on #683: - Document the quote resend endpoint (POST /quotes/{quoteId}/authorize/resend) alongside the transaction one, since a realtime-funding quote's SMS challenge exists before any transaction. - Note that a realtime-funding 202 withholds paymentInstructions until the challenge is authorized, so integrators authorize first, then read them. Co-Authored-By: Claude <noreply@anthropic.com>
…CA-pending quotes The runnable displayPaymentInstructions example dereferenced quote.paymentInstructions[0] unconditionally, which throws for an EU realtime-funding quote returned as PENDING_AUTHORIZATION (instructions withheld until the scaChallenge is authorized). Guard for the pending case and point at the SCA section. Addresses Greptile P1 on #683. Co-Authored-By: Claude <noreply@anthropic.com>
b6d2de5 to
2280c96
Compare
d71d44d to
7ddda22
Compare
Address Greptile review on #683: - Document the quote resend endpoint (POST /quotes/{quoteId}/authorize/resend) alongside the transaction one, since a realtime-funding quote's SMS challenge exists before any transaction. - Note that a realtime-funding 202 withholds paymentInstructions until the challenge is authorized, so integrators authorize first, then read them. Co-Authored-By: Claude <noreply@anthropic.com>
…CA-pending quotes The runnable displayPaymentInstructions example dereferenced quote.paymentInstructions[0] unconditionally, which throws for an EU realtime-funding quote returned as PENDING_AUTHORIZATION (instructions withheld until the scaChallenge is authorized). Guard for the pending case and point at the SCA section. Addresses Greptile P1 on #683. Co-Authored-By: Claude <noreply@anthropic.com>
2280c96 to
36e9188
Compare
Address Greptile review on #683: - Document the quote resend endpoint (POST /quotes/{quoteId}/authorize/resend) alongside the transaction one, since a realtime-funding quote's SMS challenge exists before any transaction. - Note that a realtime-funding 202 withholds paymentInstructions until the challenge is authorized, so integrators authorize first, then read them. Co-Authored-By: Claude <noreply@anthropic.com>
…CA-pending quotes The runnable displayPaymentInstructions example dereferenced quote.paymentInstructions[0] unconditionally, which throws for an EU realtime-funding quote returned as PENDING_AUTHORIZATION (instructions withheld until the scaChallenge is authorized). Guard for the pending case and point at the SCA section. Addresses Greptile P1 on #683. Co-Authored-By: Claude <noreply@anthropic.com>
d61ee03 to
0d87524
Compare
Address Greptile review on #683: - Document the quote resend endpoint (POST /quotes/{quoteId}/authorize/resend) alongside the transaction one, since a realtime-funding quote's SMS challenge exists before any transaction. - Note that a realtime-funding 202 withholds paymentInstructions until the challenge is authorized, so integrators authorize first, then read them. Co-Authored-By: Claude <noreply@anthropic.com>
…CA-pending quotes The runnable displayPaymentInstructions example dereferenced quote.paymentInstructions[0] unconditionally, which throws for an EU realtime-funding quote returned as PENDING_AUTHORIZATION (instructions withheld until the scaChallenge is authorized). Guard for the pending case and point at the SCA section. Addresses Greptile P1 on #683. Co-Authored-By: Claude <noreply@anthropic.com>
78c7440 to
a3a6b90
Compare
…CA-pending quotes The runnable displayPaymentInstructions example dereferenced quote.paymentInstructions[0] unconditionally, which throws for an EU realtime-funding quote returned as PENDING_AUTHORIZATION (instructions withheld until the scaChallenge is authorized). Guard for the pending case and point at the SCA section. Addresses Greptile P1 on #683. Co-Authored-By: Claude <noreply@anthropic.com>
34c3e22 to
be5713d
Compare
b906634 to
94e5d2f
Compare
Address Greptile review on #683: - Document the quote resend endpoint (POST /quotes/{quoteId}/authorize/resend) alongside the transaction one, since a realtime-funding quote's SMS challenge exists before any transaction. - Note that a realtime-funding 202 withholds paymentInstructions until the challenge is authorized, so integrators authorize first, then read them. Co-Authored-By: Claude <noreply@anthropic.com>
…CA-pending quotes The runnable displayPaymentInstructions example dereferenced quote.paymentInstructions[0] unconditionally, which throws for an EU realtime-funding quote returned as PENDING_AUTHORIZATION (instructions withheld until the scaChallenge is authorized). Guard for the pending case and point at the SCA section. Addresses Greptile P1 on #683. Co-Authored-By: Claude <noreply@anthropic.com>
be5713d to
4ea44c2
Compare
Address Greptile review on #683: - Document the quote resend endpoint (POST /quotes/{quoteId}/authorize/resend) alongside the transaction one, since a realtime-funding quote's SMS challenge exists before any transaction. - Note that a realtime-funding 202 withholds paymentInstructions until the challenge is authorized, so integrators authorize first, then read them. Co-Authored-By: Claude <noreply@anthropic.com>
…CA-pending quotes The runnable displayPaymentInstructions example dereferenced quote.paymentInstructions[0] unconditionally, which throws for an EU realtime-funding quote returned as PENDING_AUTHORIZATION (instructions withheld until the scaChallenge is authorized). Guard for the pending case and point at the SCA section. Addresses Greptile P1 on #683. Co-Authored-By: Claude <noreply@anthropic.com>
94e5d2f to
b7f7e5b
Compare
4ea44c2 to
761678b
Compare
Address Greptile review on #683: - Document the quote resend endpoint (POST /quotes/{quoteId}/authorize/resend) alongside the transaction one, since a realtime-funding quote's SMS challenge exists before any transaction. - Note that a realtime-funding 202 withholds paymentInstructions until the challenge is authorized, so integrators authorize first, then read them. Co-Authored-By: Claude <noreply@anthropic.com>
…CA-pending quotes The runnable displayPaymentInstructions example dereferenced quote.paymentInstructions[0] unconditionally, which throws for an EU realtime-funding quote returned as PENDING_AUTHORIZATION (instructions withheld until the scaChallenge is authorized). Guard for the pending case and point at the SCA section. Addresses Greptile P1 on #683. Co-Authored-By: Claude <noreply@anthropic.com>
761678b to
6bd7314
Compare
Address Greptile review on #683: - Document the quote resend endpoint (POST /quotes/{quoteId}/authorize/resend) alongside the transaction one, since a realtime-funding quote's SMS challenge exists before any transaction. - Note that a realtime-funding 202 withholds paymentInstructions until the challenge is authorized, so integrators authorize first, then read them. Co-Authored-By: Claude <noreply@anthropic.com>
…CA-pending quotes The runnable displayPaymentInstructions example dereferenced quote.paymentInstructions[0] unconditionally, which throws for an EU realtime-funding quote returned as PENDING_AUTHORIZATION (instructions withheld until the scaChallenge is authorized). Guard for the pending case and point at the SCA section. Addresses Greptile P1 on #683. Co-Authored-By: Claude <noreply@anthropic.com>
6bd7314 to
332b681
Compare
✱ Stainless preview builds for gridNo changes were made to the SDKs. This comment is auto-generated by GitHub Actions and is automatically kept up to date as you push. |
|
Implementation follow-ups from the Striga SCA parity review (docs-only corrections are in b66552e):
Reference: https://docs.striga.com/reference/strong-customer-authentication-sca and https://docs.striga.com/reference/sca-factors-implementation. |
|
Preview deployment for your docs. Learn more about Mintlify Previews.
|
b66552e to
1e00e31
Compare
|
⚡ Revision log — updated in place, latest first. Revision 2Rebased onto current Earlier revisions (1)Revision 1Rebased onto current
Validation: |
A dedicated SCA guide section under the Get started tab covering the whole SCA surface: overview, per-transaction authorization, factor enrollment, login and sessions, trusted beneficiaries, and two-factor reset, plus a shared snippet imported by the money-movement flow pages.
The SCA surface moved after this guide was written; bring it current: - SCA login complete now requires `endUserIpAddress` and returns `sessionExpiresAt` (#780); the session-scope guidance now tells integrators to prompt re-login ahead of it. - Quote authorize documents `409 SCA_SESSION_REQUIRED` and `423 ACCOUNT_LOCKED` (#761); both join the error tables, and the snippet notes authorizing requires an active login session. - A challenge left to expire unsatisfied now fails the transaction with `failureReason: SCA_NOT_COMPLETED` and no funds moved (#762). - Trusted external accounts refuse `DELETE` with `409 BENEFICIARY_TRUSTED`; untrust first (#770). - The challenge lives on the quote, not the transaction — webhook consumers route via the transaction's `quoteId` (#701). - `POST /transfer-out` is deprecated in favor of `POST /quotes` with `immediatelyExecute: true` (#856); the transfer-out tab now says so.
1e00e31 to
133b813
Compare

Summary
A full, EU-scoped Strong Customer Authentication guide in the Mintlify docs, covering the SCA surface added in #558/#600 (both merged). What began as a single per-transaction snippet is now a dedicated guide section covering the whole SCA surface the API exposes, mirroring the structure of the reference docs it wraps (Striga's SCA docs).
What's added
A new "Strong Customer Authentication" group under the Get started tab (
docs.json), with six pages underplatform-overview/sca/:overview— region scoping (EU / EUR / USDC), a "what SCA covers" table, factors + dynamic linking, a Mermaid flow diagram of the authorize loop, and lifetimes/limits + error tables.per-transaction-authorization— reuses the existingsnippets/sca/strong-customer-authentication.mdxas the single source (the three money-movement flow pages still import the same snippet, so they're unchanged):PENDING_AUTHORIZATION+scaChallenge, the status-driven authorize loop, inline vs. after-the-fact proof, resend, realtime-funding quotes, sandbox123456.factor-enrollment— TOTP + passkey enrollment (start/confirm), factor list/delete.login-and-sessions— SCA login + the session it grants, plus account-security (record-event) signals and the lockout ladder.trusted-beneficiaries— trust and untrust as start → confirm (keyed byexternalAccountId).two-factor-reset— liveness-gated start → poll → complete.Refreshed for API drift (2026-08-28)
Rebased onto current
main— the branch previously carried #600's spec commits, which are merged, so the PR is now docs-only — and updated for everything that landed on the SCA surface since the guide was written:endUserIpAddressand returnssessionExpiresAt(feat(sca): return the session expiry and require an end-user IP on SCA login complete #780); the session guidance now tells integrators to prompt a re-login ahead of the expiry instead of discovering it on a failed call.409 SCA_SESSION_REQUIREDand423 ACCOUNT_LOCKED(feat: document SCA_SESSION_REQUIRED (409) and ACCOUNT_LOCKED (423) on quote authorize #761); both join the error tables, and the snippet notes that authorizing requires an active login session.failureReason: SCA_NOT_COMPLETEDand no funds moved (Add SCA_NOT_COMPLETED outgoing transaction failure reason #762).DELETEwith409 BENEFICIARY_TRUSTED— untrust (SCA-gated) before deleting (feat: document BENEFICIARY_TRUSTED (409) on customer external-account delete #770).quoteId(docs: sync documentation with SCA schema changes #701). Fixed the "transaction (or quote) …scaChallenge" phrasing in the snippet, the flow-page blurbs, and the Mermaid authorize label.POST /transfer-outis deprecated in favor ofPOST /quoteswithimmediatelyExecute: true(docs: make /quotes the single transfer path, deprecate /transfer-in and /transfer-out #856); the transfer-out tab now says so.RESET_PASSWORD_COMPLETED).Review addressed
Incorporated the review on the guide:
expiresAt/ client timeout; restart if the window closes before liveness passes).RESET_PASSWORD_COMPLETED, not by a successful login.startBeneficiaryUntrustendpoint from feat(sca): SCA management surface — enrollment, login/session, beneficiary trust, 2FA reset #600.Prose pass: em-dashes and AI-tell phrasing removed across the pages and the shared snippet.
Validation
make build— rebundledopenapi.yaml/mintlify/openapi.yamlbyte-matchmain; the PR carries no spec changes.make lint(redocly + spectral) passes.markdownlint(repo-pinnedmarkdownlint-cli) passes clean on all SCA pages and the touched flow pages.mint broken-linksadds zero new broken links versusmain.PENDING_AUTHORIZATIONguard in the conversion example,type/factordiscriminator wording).🤖 Generated with Claude Code