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
Cloudflare Turnstile requires Dynamic SDK version 4.92.4 or later.
- In the Dynamic Developer Console, 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 Developer Console, go to Fraud Protections → Captcha, select hCaptcha, enter both keys, and enable the toggle.
Implementation
Prerequisites
Install the captcha package andreact-native-webview:
1. Render the widget and set the token
UsegetCaptchaSettings to determine which provider is active, then render the matching challenge component. Each component loads the provider’s widget in a WebView and calls onToken with the captcha token when solved. Pass the token to setCaptchaToken before your sign-in request.
The baseUrl prop is the origin the widget document is served under. hCaptcha and Turnstile site keys only render on whitelisted hostnames, so set this to a domain you have added to your provider’s site configuration.
- Cloudflare Turnstile
- hCaptcha
onError callback fires with a typed error so you can prompt the user to retry.
Both HCaptchaChallenge and TurnstileChallenge accept an optional style prop to override the default container styling (for example, to change the height or border radius), and an optional logLevel prop to control the component’s internal logging (defaults to 'warn').