# Formhunt Form backend для HTML, React и Astro. Первый шаг: создайте форму в личном кабинете, скопируйте публичный access_key и добавьте его в body существующей формы. ## Материалы - Личный кабинет: https://app.formhunt.ru/ - Быстрое подключение: /docs/quickstart/ - HTML: /integrations/html/ - React: /integrations/react/ - Astro: /integrations/astro/ - Актуальный OpenAPI: https://app.formhunt.ru/openapi.json ## Публичный приём POST https://app.formhunt.ru/v1/submit JSON, application/x-www-form-urlencoded или multipart/form-data с текстовыми полями. access_key — обязательный body/hidden input, публичный и только для приёма. Он не даёт management-доступа. Management token не передавайте в browser, snippet или репозиторий. Пример JSON: {"access_key":"YOUR_ACCESS_KEY","email":"synthetic@example.test","message":"Синтетическая проверка","test":true} Accept: application/json выбирает JSON. credentials: omit. Native POST работает без JavaScript и после commit получает303 на allowed redirect либо receipt. Успех: HTTP201/200, success:true, status:accepted, submission_id, request_id, test, replay. Это durable сохранение, не подтверждение доставки. Idempotency-Key:1..128 printable ASCII, область формы,24 часа. Повтор неизменных данных с тем же ключом возвращает прежний ID; изменённые данные409. После потерянного ответа сохраняйте ключ и payload, не создавайте новую заявку автоматически. ## Ограничения и ошибки Тело65536 bytes,100 имён, имя64 ASCII символа, значение8192 UTF-8 bytes,20 значений на имя. Files/nesting/duplicate JSON control/authority поля отклоняются. botcheck отсутствует или пуст; заполненный honeypot400 без сохранения. 400 invalid_request;404 неизвестный/отозванный/отключённый ключ;409 idempotency_conflict;413 payload_too_large;415 unsupported_media_type;429 rate_limited с Retry-After:1;503 intake_unavailable. Не показывайте success при HTTP/JSON/network error. Сохраняйте ввод и используйте безопасный request_id, не логируйте payload/keys/IP. Технические shared limits: source burst60/refill1 в секунду; форма burst120/refill2 в секунду. Повторы и test также расходуют request budget; это не коммерческая квота. ## MCP проверка подключения POST https://app.formhunt.ru/mcp — stateless Streamable HTTP с Bearer управляющим токеном. Workspace определяется токеном. Не передавайте этот токен в сайт: браузеру нужен только публичный access_key. Инструменты управления: list_forms, create_form, update_form, get_integration_snippet, rotate_form_key. create_form требует request_key для безопасного повтора; ключ показывается один раз, replay его не восстанавливает. submit_test(access_key,payload,idempotency_key) требует submissions:test и сохраняет только synthetic test. Повторяйте те же поля с тем же ключом при потерянном ответе. saved/side_effects_disabled означают сохранение без обычной внешней доставки. get_test_status(submission_id) возвращает только metadata теста своего workspace, без payload и реальных заявок. correlation_id равен стабильному submission_id, это не исходный HTTP request_id. test_owner_notification(form_id,request_id UUIDv4) требует отдельного delivery:test, не выбранного по умолчанию. Он создаёт отдельный synthetic test и возвращает его submission_id/event_id со status=queued. Передайте этот ID в get_test_status: delivered показывается только после результата фонового провайдера, failed не отменяет saved. Произвольного получателя передать нельзя. canary/обычные заявки не читаются диагностикой. Ошибки token/key/idempotency/budget/storage имеют безопасный code/request_id и следующий шаг. Provider failure требует проверки настроек и фонового worker; webhook not_configured не означает доставку. ## Проверка и доставка Для synthetic проверки передавайте test:true (JSON boolean или hidden input value=true). Заявка сохраняется с kind=test, не создаёт commercial usage и обычных внешних side effects. Canary нельзя включить публичным полем. Проверьте поля сохранённой заявки в кабинете. Доставку владельцу проверяйте отдельным явным тестом на подтверждённый адрес. Не объявляйте webhook/email доставленным по одному accepted. Не читайте реальные заявки без отдельного разрешения. Не включайте server credentials в клиентский bundle.