API Reference
Публичный HTTP API для приёма заявок.
https://app.form-hook.com. Все endpoint принимают и возвращают JSON.
POST /api/c1/sites/{siteKey}/submissions
Отправить заявку. Публичный endpoint — не требует авторизации.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
siteKey | string | Уникальный ключ сайта из дашборда |
Заголовки
| Заголовок | Значение |
|---|---|
Content-Type | application/json |
Origin | Домен вашего сайта (браузер ставит автоматически) |
Тело запроса
{
"data": {
"name": "Иван Петров",
"email": "ivan@example.com",
"phone": "+7 900 000-00-00",
"message": "Произвольный текст"
},
"captcha_challenge_id": "01HXYZ...",
"captcha_answer": 42
} Поле data — произвольный JSON-объект. Ключи — имена полей формы. Поля captcha_challenge_id и captcha_answer нужны только если капча включена на сайте.
Ответ — 200 OK
{ "id": "01HXYZ..." } Пример curl
curl -X POST https://app.form-hook.com/api/c1/sites/ВАШ_SITE_KEY/submissions \
-H "Content-Type: application/json" \
-H "Origin: https://example.com" \
-d '{
"data": {
"name": "Иван Петров",
"email": "ivan@example.com"
}
}' POST /api/c1/sites/{siteKey}/captcha/challenges
Получить captcha challenge — только при прямом HTTP без SDK.
Тело запроса
Пустое (или {}).
Ответ — 200 OK
{
"challenge_id": "01HXYZ...",
"question": "3 + 7 = ?",
"expires_at": "2026-05-05T12:05:00Z"
} Передайте challenge_id и ответ на вопрос в поле captcha_answer при отправке заявки.
Коды ошибок HTTP API
| HTTP | code | Описание |
|---|---|---|
| 400 | CAPTCHA_EMPTY | Не передана капча (а она включена) |
| 400 | CAPTCHA_ANSWER_INVALID | Неверный ответ на задачу капчи |
| 400 | CAPTCHA_CHALLENGE_INVALID | Challenge истёк или не найден |
| 400 | VALIDATION_ERROR | Ошибка валидации полей. Поле fields содержит детали |
| 403 | DOMAIN_NOT_VERIFIED | Домен не верифицирован |
| 403 | SITE_SUSPENDED | Сайт заблокирован |
| 403 | CORS_FORBIDDEN | Origin не в списке разрешённых |
| 404 | SITE_NOT_FOUND | Неверный siteKey |
| 429 | RATE_LIMITED | Превышен лимит запросов |
Формат ответа с ошибкой
{
"code": "VALIDATION_ERROR",
"message": "Validation failed",
"fields": [
{ "name": "email", "message": "Обязательное поле" }
]
} Коды ошибок SDK
Метод formhook.submit() бросает с объектом { code, message } при ошибке:
| code | Описание |
|---|---|
CAPTCHA_NOT_SOLVED | Пользователь не решил капчу перед отправкой |
CAPTCHA_ANSWER_INVALID | Неверный ответ — сброс виджета обязателен |
CAPTCHA_SITE_DISABLED | Капча отключена на сайте, но виджет был отрендерен |
SUBMIT_RATE_LIMITED | Превышен лимит запросов (429) |
SUBMIT_VALIDATION | Ошибка валидации данных (400) |
SUBMIT_NETWORK | Сетевая ошибка — нет соединения |
SUBMIT_IN_FLIGHT | Предыдущая отправка ещё не завершена |
WIDGET_LOAD_TIMEOUT | Виджет капчи не загрузился за отведённое время |
CORS
Endpoint принимает запросы только с доменов из списка разрешённых в настройках сайта.
Для прямых server-side запросов (curl, backend) заголовок Origin можно не указывать —
CORS проверяется только для браузерных запросов.
Лимиты
| Параметр | Значение |
|---|---|
| Rate limit | 100 запросов / секунду с одного IP |
| Размер тела | до 1 МБ |
| TTL captcha challenge | 5 минут |