Recommended: JavaScript SDK for React Native
While this SDK is still supported, we recommend using newer JavaScript SDK, which is optimized for React Native, but also comes with a host of other benefits.
Summary
Dynamic supports two captcha providers to protect your app from bots:- Cloudflare Turnstile — Dynamic manages the keys by default, or bring your own site key and secret key.
- hCaptcha — Requires your own credentials.
Setting up Cloudflare Turnstile
The managed widget is enabled by default with no Cloudflare account required.- In the Dynamic Dashboard, go to Fraud Protections → Captcha.
- Select Cloudflare Turnstile as your provider.
- Optionally supply your own site key and secret key for widget customization.
- Toggle captcha on.
Setting up hCaptcha
hCaptcha requires your own account.- Sign up at hcaptcha.com (Pro plan recommended for passive/friction-free modes).
- Add a new site with the hostname where your app operates.
- Copy your site key (used client-side) and secret key (used server-side).
- In the Dynamic Dashboard, go to Fraud Protections → Captcha, select hCaptcha, enter both keys, and enable the toggle.
Implementation
The React Native SDK handles captcha through aCaptchaProvider that renders the challenge in a full-screen WebView modal and automatically calls setCaptchaToken on completion.
Prerequisites
react-native-webview is required to render the captcha widget:
1. Wrap your app with CaptchaProvider
AddCaptchaProvider inside your DynamicProvider. It mounts the captcha modal and manages the token lifecycle.
2. Prompt for captcha before sign-in
Use theuseCaptchaPrompt hook to show the captcha modal before sending an OTP. promptCaptchaIfRequired is a no-op when captcha is not enabled for the environment, so no extra conditional logic is needed.
catch block returns early without sending the OTP.