Uh oh!
There was an error while loading. Please reload this page.
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. |
jklein24
commented
Jul 13, 2026
@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
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
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>
jklein24
commented
Jul 13, 2026
@greptile review |
Uh oh!
There was an error while loading. Please reload this page.
…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>
jklein24
commented
Jul 13, 2026
@greptile review |
af68ac7 to
d71d44dCompareAddress 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
2280c96Compared71d44d to
7ddda22CompareAddress 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
36e9188CompareAddress 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
0d87524CompareUh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
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
a3a6b90CompareUh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
…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
be5713dCompareb906634 to
94e5d2fCompareAddress 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
4ea44c2CompareAddress 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
b7f7e5bCompare4ea44c2 to
761678bCompareAddress 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
6bd7314CompareAddress 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
332b681Compare✱ 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. |
jklein24
commented
Jul 28, 2026
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
1e00e31Compare⚡ 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
133b813Compare
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