Skip to main content
Parameters, customizations, and advanced features for all Web SDK flows. See Quickstart guide and Choose the Right Integration for You for introductory information.

TypeScript support

TypeScript: Yuno provides a TypeScript library for all available methods.

Subresource Integrity (SRI)

This browser security feature lets you ensure a loaded script has not been tampered with. You provide a cryptographic hash alongside the script URL. The browser verifies the downloaded bytes match the declared hash before executing the code.
  • Integrity: Guarantees the exact code built and published is what runs in the browser.
  • Immutability: When paired with full semantic version URLs, it ensures stable, reproducible integrations.
  • Defense-in-depth: Mitigates risks from supply-chain or transport-layer compromise.

URL formats

When implementing SRI, use the full semantic version URL format to ensure immutable, tamper-evident integrations.
  • Full (immutable) URL with SRI: Full semantic version path used for locked, tamper-evident integrations with an SRI hash.
  • Partial (mutable) URL: Version with major and minor (for example, v1.9). This version will receive patch improvements. This is useful if you like to avoid updates in your code base.

How to integrate the SDK with SRI

Replace src and integrity with the environment/version you target. crossorigin="anonymous" lets the browser validate the SRI for cross-origin scripts. The hash can be found in versions-sri.json at latest.integrity or within the history array.
The example above targets sandbox. For production, use the url published alongside the hash in versions-sri.json — each entry pairs a full-version url with the integrity that matches it, for example https://prod.y.uno/sdk-static-bundles-ms/sdk-web/v1.10.6/main.js.
SRI only works with these full-version URLs. The global paths such as https://sdk-web.y.uno/v1.10/main.js are republished on every patch release, so no hash stays valid for them and none is published.

Using NPM package

Validation notes

  • Open DevTools Network tab and confirm main.js returns 200 from the full-version path.
  • Verify the response headers allow cross-origin fetches for static assets if served from a distinct origin (crossorigin="anonymous" is set).
  • Ensure the integrity attribute exactly matches the generated hash, including the sha384- prefix.
  • Any change to main.js changes the hash. When changing versions, always regenerate or retrieve the new sha384 value and update the integrity attribute.

SRI troubleshooting

  • Hash mismatchs cause the script to fail execution with an integrity error (for example, you updated the file but not the hash). To fix, rebuild, retrieve the new sha384 from versions-sri.json, and update integrity.
  • Browser blocks SRI on cross-origin request when the crossorigin attribute is missing or CORS is restrictive. To fix, add crossorigin="anonymous" and configure the static hosting to allow cross-origin fetches for JS assets.

Preload the SDK script

When you use the NPM package, the browser only starts downloading main.js when your app calls loadScript(). In a single-page app that call often runs seconds after navigation, once your own bundle has downloaded and executed. On a slow mobile connection that delay, plus the download itself, can add several seconds before the SDK runs. Tell the browser about the script and the Yuno hosts from your HTML <head>, so the download and the connections start while the page is still being parsed. Add these tags as the first elements in <head>, before your app bundle. This example is for a production account in the US region, using @yuno-payments/sdk-web 9.x:
Keep your loadScript() call as it is:
loadScript() still injects the <script> tag. Because the file is already in the browser’s preload cache, the browser uses that copy instead of downloading it again.

Match the preload URL to your loadScript options

The preload only helps when its href is exactly the URL loadScript() requests. That URL depends on the options you pass. For @yuno-payments/sdk-web 9.x (SDK v1.11): The API host follows the environment and region of your public API key, so it is the same host your backend calls. The card form host follows the host main.js was loaded from. With sri: true, the preload tag looks like this:
With sri: true, the package pins a specific SDK version and its hash. Use that version in the preload, not the latest entry in versions-sri.json, which is usually newer than the version your package loads.
To find the exact URL and hash your app requests, open DevTools, go to Elements, and inspect the <script id="sdk-payments-script"> tag that loadScript() adds. Copy its src, and its integrity when present. Rules:
  • Keep crossorigin on the API preconnect. The SDK opens the same preconnect when it initializes. Without the attribute, the browser opens a connection that its CORS requests to the API cannot reuse.
  • With sri: true, add crossorigin="anonymous" to the preload. The injected script uses that mode. If the preload and the script use different modes, the browser downloads the file twice.
  • A mismatch does not break anything. If the URL or mode does not match, the browser downloads main.js twice and DevTools logs a warning that the preloaded resource was not used. You lose the speed-up, nothing else.

Keep the preload URL up to date

The preload URL is written in your HTML, so it does not change when you upgrade the package. Update it yourself:
  • Without SRI, the URL contains only the major and minor SDK version (v1.11). Patch releases need no change. Update it when a package release moves to a new SDK minor version (for example 7.x loads v1.9, 8.x loads v1.10, 9.x loads v1.11); the README of the version you install states which one it loads.
  • With SRI, the URL and the hash pin the full SDK version (for example v1.11.1). Update both on every package upgrade that changes that version.
When you upgrade @yuno-payments/sdk-web, update the preload href (and integrity when you use SRI) to the URL the new version loads. The package’s README on npm states the SDK version it loads. For the hash, use the entry for that version in the history list of versions-sri.json (sandbox: sdk-web.sandbox.y.uno/versions-sri.json), or copy both values from the <script id="sdk-payments-script"> tag in DevTools.

Check that it works

Open DevTools, go to the Network panel, and reload the page. main.js should appear once, with Initiator set to the preload tag in your HTML and a start time close to the start of the page load. If main.js appears twice, or the Console shows that the preloaded resource was not used, the preload href or crossorigin mode does not match what loadScript() requests.
Do not replace the preload with your own <script id="sdk-payments-script"> tag. loadScript() then skips its own injection, but it checks only the id and never the URL, so an outdated SDK version keeps running after you upgrade the package. If that script fails to load, loadScript() also never resolves or rejects.

Key parameters (checkout session creation)

When creating a checkout session on your backend, the following parameters are commonly used across web SDKs:

Payment and checkout parameters (full reference)

Parameters for await yuno.startCheckout(), await yuno.mountCheckout(), and related payment flows. All parameters used in Payment flows (Web) are listed here with full detail.

Core parameters

Callbacks

Callback naming. These callbacks were renamed to white-label-neutral names in Web SDK v1.9.0 (see the release notes). The previous yuno-prefixed names — yunoCreatePayment, yunoPaymentMethodSelected, yunoPaymentResult, yunoError, and yunoEnrollmentStatus — still work as aliases, so existing integrations need no changes. They are deprecated and will be removed in a future major version. On SDK versions earlier than v1.9.0, use the yuno-prefixed names.

Shopper-cancelled steps

Some steps render in a modal the shopper can dismiss: the 3DS challenge (closing it with the X or pressing the browser back button), and payment-instruction screens such as vouchers or payment codes. When that happens, the SDK reports:
No error is emitted for these steps. Dismissing the modal closes the SDK UI, but it does not cancel the payment. The payment stays in flight and is resolved by the provider and by Yuno’s backend. Yuno’s backend remains the source of truth for the final status. A 3DS challenge in particular runs inside the issuer’s own iframe, so the SDK cannot determine whether authentication already completed at the moment the shopper closes the modal. Reporting a terminal cancellation there could contradict a payment that goes on to be approved.
CANCELLED_BY_USER is produced by the SDK to describe the shopper’s gesture. It is not a payment sub-status and does not appear in the Payment status reference.
Branch on subStatus to detect this case:

Card form options (card)

Render mode

Custom texts

Express button styling (externalButtons)

The externalButtons property in startCheckout and startSeamlessCheckout (SDK 1.6+) allows merchants to customize the appearance of Google Pay, Apple Pay, and PayPal express buttons. All properties are optional; sensible defaults are used when not provided. It is also accepted by mountEnrollmentLite (SDK 1.10.13+) for the PayPal enrollment button — see PayPal enrollment with element render mode, which has its own defaults.
The externalButtons configuration applies to all flows that render express buttons (including mountCheckout, mountExternalButtons, and mountSeamlessExternalButtons), as long as startCheckout or startSeamlessCheckout was called first with the configuration. For the enrollment flow, pass it directly to mountEnrollmentLite.

Google Pay

Apple Pay

PayPal

Full example

Payment retry

Payment retry lets a shopper fix and re-submit a card payment after it comes back DECLINED or ERROR, without restarting the checkout. Instead of tearing down the card form, the SDK keeps it open and surfaces the decline (field-level errors and a top error banner). It also clones the checkout session so the next attempt reuses the same flow. Retry is disabled by default. Yuno enables it per organization on request through a server-side flag — it is not a Dashboard or Checkout Builder toggle. It is a server-controlled setting, not a startCheckout() argument. It applies to non-enrolled card payments only. Enrolled cards, vaulted cards, and external-button payments are excluded. Payment retry is supported across all four Web integrations: Seamless, Full Checkout, Lite, and Secure Fields.
Retry in Lite shipped in SDK v1.9.11.

Behavior by integration

Triggering retry in Full Checkout, Lite, and Secure Fields

For these three flows, after your backend creates the payment you must inspect the payment response and drive the SDK accordingly:
  • Card payment that failed (payment_method.type === 'CARD' and status is DECLINED or ERROR): call continuePayment to run the retry. The card form stays open with the decline shown.
  • Additional action required (checkout.sdk_action_required === true): call continuePayment so the SDK can show the required screens (for example, 3DS or a redirect).
  • Nothing left for the SDK to do (status is not DECLINED/ERROR and checkout.sdk_action_required === false): the SDK will not tear itself down, so you must unmount it manually with unmountSdk.
If the payment method is CARD and the status is DECLINED or ERROR, you must call continuePayment. If you don’t, the card form will not close automatically. The shopper is left on the open form with no next step.When the status is anything other than DECLINED/ERROR and checkout.sdk_action_required is false, call unmountSdk to remove the SDK from the DOM. It does not unmount on its own in these flows.
Secure Fields: set the checkoutSession on the secureFields({ ... }) object, and do not pass it to generateTokenWithInformation({ ... }).Retry is armed when the SDK initializes the secure fields with a checkoutSession. On each retry, the SDK swaps in a freshly cloned session internally. If you also pass checkoutSession to generateTokenWithInformation, that fixed value overrides the cloned one and breaks the retry attempt.

Retry lifecycle and callbacks

On a retried attempt the SDK does not fire paymentResult and does not mount the status page. Instead, it delivers the cloned checkout session to your onLoading callback:
Each retry attempt flows through createPayment → your backend → continuePayment (or automatic in Seamless) without a paymentResult callback between attempts. paymentResult fires only when the flow finishes — either the payment succeeds, the shopper exits, or the payment fails without being retryable. Available since Web SDK v1.10.12. On direct-debit payment methods (ACH, SEPA Direct Debit, Bacs, PAD, and iDEAL when the account is saved), the checkout renders authorization/mandate text below the bank fields, when enabled via the Checkout Builder’s Authorization text panel.
  • One-off copy is shown by default.
  • Recurrent copy is shown instead when the account will be stored — either the shopper ticked the savePaymentMethodEnabled save checkbox, or the flow is an enrollment.
SEPA and iDEAL additionally require a mandatory acceptance checkbox alongside the authorization text. Submit is blocked with the error “Accept the mandate to continue” until the shopper checks it.

Mandate evidence in the one-time token

Whenever the authorization-text block is shown, the SDK includes the shopper’s acceptance evidence in the one-time token, regardless of whether the save checkbox was ticked. The shape below reflects what’s encoded inside that token — your backend still forwards it to Create Payment as the opaque payment_method.token string, the same as any other one-time token:

updateCheckoutSession

updateCheckoutSession(checkoutSession) replaces the active checkout session without unmounting the SDK. Use it to let the shopper switch to a different payment method after a failed payment.
The SDK keeps the current UI mounted and swaps the checkout session id in internal state. Nothing is re-fetched: the payment-method list, settings, styling, and country data are all fetched once at mount and stay on the mount-time session. If the new session exposes a different set of payment methods, styling, or country configuration, you must unmount and re-mount the SDK.
yuno.updateCheckoutSession() automatically propagates to the Secure Fields instance — there is no need to call it on the SF instance directly.

Enrollment parameters (full reference)

Parameters for await yuno.mountEnrollment(). All parameters used in Enrollment flows (Web) are listed here with full detail.

Mount external buttons

Use the mountExternalButtons method to render PayPal, Google Pay, and Apple Pay buttons in custom locations within your UI. This gives you control over where these buttons are displayed.

Parameters

Unmounting buttons

You can unmount a single external button by payment method type:
Or unmount all external buttons at once:

Enrolling payment methods

You can enroll payment methods (store cards for future use) directly during the payment flow by setting payment_method.vault_on_success = true in the checkout session creation. When vault_on_success is set to true:
  • The payment method will be automatically enrolled if the payment status is SUCCEEDED
  • If the payment does not succeed, no vaulting will occur
  • The payment response will include a vaulted_token that you can use for future transactions
Example:
To generate and receive a vaulted_token when vault_on_success = true, the payment must reference an existing Yuno customer through customer_payer.id in the checkout session. Creating or sending the customer data inline inside the payment request does not create the customer on our side. As a result, no vaulting will occur. For enrollment flows, see Enrollment flows (Web).