Подключение SDK
Три способа интеграции — выберите подходящий для вашей ситуации.
Способ 1 — Декларативный режим (ноль JS)
Добавьте атрибут data-formhook к тегу <form> и подключите скрипт-loader.
Loader найдёт форму, подключит капчу, перехватит submit и отправит данные — без единой строки JS с вашей стороны.
Атрибуты
| Атрибут | Обязательный | Описание |
|---|---|---|
data-formhook | да | Маркер для loader |
data-sitekey | да | siteKey сайта из дашборда |
data-success-redirect | нет | URL для редиректа после успешной отправки |
data-error-message | нет | Текст ошибки при сбое отправки |
<form
data-formhook
data-sitekey="ВАШ_SITE_KEY"
data-success-redirect="/thanks"
data-error-message="Не удалось отправить, попробуйте ещё раз">
<input name="name" placeholder="Имя" required />
<input name="email" type="email" placeholder="Email" required />
<textarea name="message" placeholder="Сообщение"></textarea>
<!-- Место для виджета капчи (если включена) -->
<div class="formhook-captcha"></div>
<button type="submit">Отправить</button>
</form>
<script src="https://app.form-hook.com/sdk/v3/loader.min.js" async defer></script> Способ 2 — Явный JS API (v3)
Для SPA, нестандартной UX или кастомных анимаций используйте window.formhook напрямую.
SDK v3 регистрирует глобальный объект после загрузки — используйте formhook.ready(cb) для инициализации.
API объекта window.formhook
| Метод | Описание |
|---|---|
ready(callback) | Ждёт загрузку SDK, затем вызывает callback |
render(selector, options) | Рендерит виджет капчи. Возвращает widgetId |
isSolved(widgetId) | Возвращает true если капча решена |
submit(widgetId, data) | Отправляет заявку. Возвращает Promise, при ошибке бросает с err.code |
reset(widgetId) | Сбрасывает капчу после ошибки или успешной отправки |
remove(widgetId) | Уничтожает виджет капчи (при размонтировании компонента) |
Параметры render()
| Параметр | Тип | Описание |
|---|---|---|
sitekey | string | siteKey сайта |
locale | "ru" | "en" | Язык виджета капчи |
theme | string | light, dark, dark-blue, dark-red, coffee, auto |
callback | function | Вызывается после успешного решения капчи |
expired-callback | function | Вызывается при истечении капчи |
error-callback | function | Вызывается при ошибке. Аргумент: { code, message } |
html <div id="captcha-container"></div>
<button id="send" disabled>Отправить</button>
<script src="https://app.form-hook.com/sdk/v3/loader.min.js" async defer></script>
<script>
var widgetId = null;
window.formhook.ready(function() {
widgetId = window.formhook.render('#captcha-container', {
sitekey: 'ВАШ_SITE_KEY',
locale: 'ru',
theme: 'auto',
callback: function() {
document.getElementById('send').disabled = false;
},
'expired-callback': function() {
document.getElementById('send').disabled = true;
},
'error-callback': function(err) {
console.error('captcha error:', err.code, err.message);
},
});
});
document.getElementById('send').addEventListener('click', async function() {
if (!widgetId || !window.formhook.isSolved(widgetId)) {
alert('Пожалуйста, решите капчу');
return;
}
try {
const result = await window.formhook.submit(widgetId, {
name: document.getElementById('name').value,
email: document.getElementById('email').value,
});
console.log('Заявка отправлена:', result.id);
window.formhook.reset(widgetId); // сбросить капчу после успеха
} catch (err) {
console.error(err.code, err.message);
if (err.code === 'CAPTCHA_ANSWER_INVALID' || err.code === 'CAPTCHA_NOT_SOLVED') {
window.formhook.reset(widgetId); // сбросить капчу при ошибке капчи
}
}
});
</script>
Способ 3 — Прямой HTTP (без SDK)
Если SDK не нужен (серверная интеграция, curl, Postman) — отправляйте POST напрямую.
Если на сайте включена капча, приложите captcha_challenge_id и captcha_answer.
bash curl -X POST https://app.form-hook.com/api/c1/sites/ВАШ_SITE_KEY/submissions \
-H "Content-Type: application/json" \
-d '{
"data": {
"name": "Иван Петров",
"email": "ivan@example.com",
"message": "Хочу узнать подробнее"
}
}'
Ответ при успехе:
json { "id": "01HXYZ..." }
С капчей:
json {
"data": { "name": "Иван", "email": "ivan@example.com" },
"captcha_challenge_id": "challenge-uuid",
"captcha_answer": 42
}
При прямом POST без SDK капча не рендерится автоматически. Сначала получите challenge через POST /api/c1/sites/{siteKey}/captcha/challenges — см. API Reference.
Подключение loader на разных платформах
html <!-- HTML / статический сайт -->
<script src="https://app.form-hook.com/sdk/v3/loader.min.js" async defer></script>
<!-- Next.js / app router (layout.tsx) -->
<Script src="https://app.form-hook.com/sdk/v3/loader.min.js" strategy="afterInteractive" />
<!-- Tilda — в настройках сайта: "Скрипты в <head>" или "Перед </body>" -->