Sandbox
Help

Integrate SDK for React application

Mount, manage, and control Revolut ID authentication buttons in React applications.

React button component

Basic React component with button mounting:

import { useEffect, useRef, useState } from 'react'
import { RevolutIdLoader, ButtonClient, ButtonStyle } from '@revolut/revolut-id'

type Props = {
  buttonStyle: ButtonStyle
}

export function RevolutAuthButton({ buttonStyle }: Props) {
  const containerRef = useRef<HTMLDivElement>(null)
  const buttonClientRef = useRef<ButtonClient | null>(null)
  const [isLoading, setIsLoading] = useState(true)
  const [error, setError] = useState<string | null>(null)

  useEffect(() => {
    async function mountButton() {
      if (!containerRef.current) return

      try {
        const revolutId = await RevolutIdLoader({ mode: 'production' }) // mode is optional, defaults to 'production'; use 'sandbox' for testing

        const { mountButton } = revolutId.initialise({
          clientId: 'your-client-id',
          redirectUri: window.location.origin + '/auth/callback',
          scope: ['profile', 'email'],
          displayMode: 'popup', // Explicit popup mode
          onAuthSuccess: ({ code, codeVerifier }) => {
            // exchange code for user token on your BE side
          },
          onAuthFailure: (e) => {
            console.error('Authentication failed:', e.error)
          },
        })

        buttonClientRef.current = mountButton(
          containerRef.current,
          buttonStyle
        )
        setIsLoading(false)
      } catch (e) {
        setError('Failed to load revolut-id-sdk')
        setIsLoading(false)
      }
    }

    mountButton()

    // Cleanup on unmount
    return () => {
      if (buttonClientRef.current) {
        buttonClientRef.current.unmount()
      }
    }
  }, [buttonStyle])

  if (isLoading) return <div>Loading authentication...</div>
  if (error) return <div>Error: {error}</div>

  return <div ref={containerRef} />
}

API reference

The Revolut ID Web SDK provides the RevolutId interface, which is returned by RevolutIdLoader (NPM installation) or available in the global window scope via window.revolut.revolutId (CDN script).

export interface ButtonClient {
  mount: (container: HTMLElement, params?: ButtonStyle) => ButtonClient
  unmount: () => void
}

export interface RevolutId {
  initialise: (config: Config) => {
    mountButton: (container: HTMLElement, params?: ButtonStyle) => ButtonClient
  }

  processRedirectParams: () => SuccessResult | ErrorResult | null
}

Config - initialisation parameters (required)

ParameterTypeDescriptionRequired
clientIdstringYour Revolut application client IDYes
redirectUristringURI to redirect to after authenticationYes
scopeOpenIdScope[]Array of requested OpenID scopes (openid included by default)Yes
displayModepopup | redirectAuthentication display modeNo (defaults to redirect)
modeproduction | sandboxEnvironment modeNo (defaults to 'production')
uiColorSchemelight | dark | systemUI theme preferenceNo
uiBackgroundblue | deep-blue | green | orange | teal | purple | holo | minimalAuthentication page backgroundNo
countryCodesstring[]Array of allowed country codesNo
localestringLanguage/locale codeNo
onAuthSuccess(result: SuccessResult) => voidSuccess callback functionYes (popup mode only)
onAuthFailure(result: ErrorResult) => voidError callback functionNo (popup mode only)

For complete configuration documentation and advanced options, see Config API reference.

ButtonStyle - button styling parameters (optional)

ParameterTypeDescriptionDefaultRequired
kindcontinue | sign_in | sign_up | verify | iconButton text and purposesign_inNo
sizelarge | smallButton sizelargeNo
variantdark | light | light-outlinedVisual styledarkNo
radiusnone | default | roundCorner roundingdefaultNo

For complete button styling documentation and usage examples, see ButtonStyle API reference.

Environment setup

The environment you use must match your client environment configuration.

  • Use production mode with your production client ID for live applications
  • Use sandbox mode with your sandbox client ID for development and testing

See environment configuration for more details.

React integration best practices
  • Use useEffect cleanup: Always return cleanup functions from useEffect
  • Manage refs properly: Use useRef for DOM elements and button clients
  • Handle loading states: Show loading indicators while the SDK Initialises
  • Error boundaries: Wrap components in error boundaries to catch SDK failures
  • Memoize callbacks: Use useCallback for functions passed to useEffect dependencies
  • Custom hooks: Create reusable hooks for common authentication patterns
  • TypeScript: Use proper typing for better development experience

Next steps

Learn how to exchange code for user ID token - code exchange.

Rate this page