zoho-turnstile
v1.0.2
Published
Drop-in Cloudflare Turnstile spam protection for Zoho Form HTML exports
Maintainers
Readme
zoho-turnstile
Drop-in Cloudflare Turnstile spam protection for Zoho Form HTML exports.
<script src="https://unpkg.com/[email protected]/zoho-turnstile.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
ZohoTurnstile.init({ siteKey: 'YOUR_SITE_KEY' });
});
</script>Install
CDN (recommended)
<script src="https://unpkg.com/[email protected]/zoho-turnstile.js"></script>npm
npm install zoho-turnstileDocumentation
Full setup guide, options reference, Worker deployment and troubleshooting:
👉 dev.to/sillycoder/adding-cloudflare-turnstile-to-zoho-form-html-exports-2129
Quick start
Add to your Zoho form export's index.html:
<head>
<link href="css/form.css" rel="stylesheet">
<script src="js/validation.js"></script>
<script src="https://unpkg.com/[email protected]/zoho-turnstile.js"></script>
</head>
<!-- your Zoho form HTML -->
<script>
var zf_MandArray = [...];
var zf_FieldArray = [...];
var isSalesIQIntegrationEnabled = false;
var salesIQFieldsArray = [];
document.addEventListener('DOMContentLoaded', function () {
ZohoTurnstile.init({
siteKey: 'YOUR_SITE_KEY'
});
});
</script>The
DOMContentLoadedwrapper ensures the library has fully executed beforeinitis called, regardless of the host environment (e.g. Shopify, WordPress).
Options
| Option | Type | Required | Default | Description |
|--------|------|----------|---------|-------------|
| siteKey | string | ✅ | — | Cloudflare Turnstile Site Key |
| verifyUrl | string | — | null | Cloudflare Worker URL for server-side verification |
| theme | string | — | 'light' | 'light' | 'dark' | 'auto' |
| size | string | — | 'normal' | 'normal' | 'compact' |
| errorMessage | string | — | 'Please complete the security check...' | Blocked submission message |
| containerId | string | — | null | Custom element ID to render widget into |
| onSuccess | function | — | null | Fired when token is issued |
| onError | function | — | null | Fired on Turnstile error |
| onExpire | function | — | null | Fired when token expires |
Methods
ZohoTurnstile.init(options) // initialise
ZohoTurnstile.reset() // reset the widget
ZohoTurnstile.getToken() // get current token stringModes
Client-only — blocks submissions with no token. No backend required.
document.addEventListener('DOMContentLoaded', function () {
ZohoTurnstile.init({ siteKey: 'YOUR_SITE_KEY' });
});Full verification — verifies token server-side via a Cloudflare Worker before forwarding to Zoho.
document.addEventListener('DOMContentLoaded', function () {
ZohoTurnstile.init({
siteKey: 'YOUR_SITE_KEY',
verifyUrl: 'https://your-worker.workers.dev'
});
});See the full documentation for Worker setup instructions.
Testing
Use Cloudflare's official test keys during development:
| Behaviour | Site Key |
|-----------|----------|
| Always passes | 1x00000000000000000000AA |
| Always blocks | 2x00000000000000000000AB |
| Forces interactive challenge | 3x00000000000000000000FF |
Your production sitekey is registered to a specific domain and will fail on
localhostorfile://. Use the test keys above during local development.
License
MIT © [SillyCoder]
