> ## Documentation Index
> Fetch the complete documentation index at: https://docs-staging-docs-event-stream-action-templates.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# useMfaPolling

<ParamField body="useMfaPolling(options?: MfaPollingOptions)" type={<span><a href="/docs/libraries/acul/react-sdk/API-Reference/Types/interfaces/MfaPollingResult">MfaPollingResult</a></span>}>
  React hook to manage MFA push polling (e.g., waiting for a push notification approval)
  on an Auth0 Advanced Customization of Universal Login (ACUL) screen.

  This hook sets up and controls a long-running polling loop that repeatedly checks
  the MFA push challenge endpoint until one of the following occurs:

  * The challenge is **approved or denied** by the user, triggering `options.onCompleted`.
  * An **error** occurs (network error, non-200/429 response), triggering `options.onError`.
  * The **component unmounts** or `stopPolling()` is called, which cancels polling.

  ### Key Features

  * `isRunning` is **reactive** — it updates automatically if the polling loop
    stops internally or is canceled.
  * Uses a **stable single polling instance** (`useRef`) to prevent
    duplicate network calls and unintended restarts during React re-renders.
  * **Automatic cleanup** on unmount: no orphan timers or leaked XHR requests.

  ## Parameters

  <ParamField body="options" type={<span><a href='/docs/libraries/acul/react-sdk/API-Reference/Types/type-aliases/MfaPollingOptions'>MfaPollingOptions</a></span>}>
    Specifies the polling interval, success callback (`onCompleted`), and optional error handler (`onError`).
  </ParamField>

  ## Returns

  [`MfaPollingResult`](/docs/libraries/acul/react-sdk/API-Reference/Types/interfaces/MfaPollingResult) containing:

  * `isRunning` — `true` while polling is active.
  * `startPolling()` — starts or resumes polling.
  * `stopPolling()` — stops polling immediately.

  ## Supported Screens

  * `mfa-push-challenge-push`
  * `reset-password-mfa-push-challenge-push`
  * `mfa-push-enrollment-qr`

  ```tsx Example theme={null}
  import { useMfaPolling } from '@auth0/auth0-acul-react/mfa-push-challenge-push';

  export function MfaPushStatus() {
    const { isRunning, startPolling, stopPolling } = useMfaPolling({
      intervalMs: 5000,
      onCompleted: () => console.log('Push approved!/denied'),
      onError: (error) => console.error('Polling error:', error)
    });

    return (
      <div>
        <button onClick={startPolling} disabled={isRunning}>
          {isRunning ? 'Waiting for approval…' : 'Start MFA Polling'}
        </button>
        {isRunning && <button onClick={stopPolling}>Cancel</button>}
      </div>
    );
  }
  ```

  ## Remarks

  * The `onError` callback receives an [ULError](/docs/libraries/acul/react-sdk/API-Reference/Types/interfaces/Error) object
    with `status` and `responseText` describing the server response.
  * Internal rate-limit responses (`429`) are automatically handled:
    polling waits for the reset window before retrying.
  * Calling `startPolling()` repeatedly while running is safe and idempotent.
</ParamField>
