Публичное API
REST API для интеграции форм, страниц, воронок, оплаты и студенческого портала.
Обзор
Публичное API не требует API-ключа. Эти эндпоинты предназначены для вызова из JavaScript на сайтах — формы, страницы, checkout. Workspace определяется автоматически по домену запроса.
Где использовать
Создайте форму в HTML/React и отправляйте данные через POST /forms/:id/submit. Контакт автоматически создастся в CRM.
Получайте страницы через GET /public/pages/by-path и рендерите их в своём фреймворке.
Создавайте заказы через POST /public/checkout/create-order — получите ссылку на оплату YooKassa.
Постройте свой интерфейс для студентов. Авторизация через /student/auth/*, курсы через /student/courses.
Базовый URL
https://funnelica.ru/api/v1Аутентификация
Большинство эндпоинтов работают без авторизации. Исключение — студенческий портал: там требуется Bearer-токен, который студент получает после входа по коду из email.
Формат
Все запросы и ответы в формате JSON. Для POST/PUT запросов указывайте заголовок Content-Type: application/json.
Заголовки
Content-Type | header | application/json для POST/PUT |
x-session-id | header | ID сессии для связывания событий |
x-tenant-host | header | Домен workspace (если отличается от Host) |
Authorization | header | Bearer токен (только для /student/* эндпоинтов) |
Формы
Отправка данных формы. Создаёт или обновляет контакт в CRM и сохраняет заявку.
/forms/:formId/submitПараметры
formId* | string | ID формы из конструктора |
Тело запроса
payload* | object | Данные полей формы |
email | string | Email (до 160 символов) |
phone | string | Телефон (до 40 символов) |
name | string | Имя (до 160 символов) |
company | string | Компания (до 160 символов) |
pageUrl | string | URL страницы отправки |
source | string | Источник (например, "landing") |
utm | object | UTM-метки |
Пример
POST https://funnelica.ru/api/v1/forms/form_abc123/submit
Content-Type: application/json
{
"email": "ivan@example.com",
"name": "Иван",
"phone": "+7 999 123-45-67",
"payload": {
"message": "Вопрос по тарифам"
},
"utm": {
"utm_source": "yandex"
}
}Ответ 200
{
"submissionId": "sub_abc123",
"contactId": "contact_xyz789",
"status": "received"
}Страницы
Получение опубликованных страниц и отслеживание просмотров.
/public/pages/by-pathПолучить страницу по пути.
path* | query | Путь страницы (например, /landing) |
workspaceId | query | ID workspace (если домен не привязан) |
GET https://funnelica.ru/api/v1/public/pages/by-path?path=/landingОтвет
{
"id": "page_abc",
"name": "Лендинг",
"path": "/landing",
"status": "published",
"schema": {
"editor": "grapesjs",
"html": "...",
"css": "..."
},
"experiment": {
"experimentId": "exp_123",
"variant": "A"
}
}/public/pages/:pageIdПолучить страницу по ID.
/public/pages/:path/trackОтправить событие просмотра страницы.
sessionId | string | ID сессии |
contactId | string | ID контакта |
utm | object | UTM-метки |
/public/forms/:formIdПолучить публичные данные формы для встраивания.
Воронки
Получение структуры воронки и отслеживание прохождения шагов.
/public/funnels/:funnelIdПолучить воронку со списком шагов.
{
"id": "funnel_abc",
"name": "Воронка запуска",
"status": "active",
"steps": [
{ "id": "step_1", "type": "page", "name": "Лендинг" },
{ "id": "step_2", "type": "checkout", "name": "Оплата" }
]
}/public/funnels/:funnelId/steps/:stepId/trackОтметить посещение шага.
contactId | string | ID контакта |
metadata | object | Дополнительные данные |
/public/funnels/:funnelId/next-stepПолучить следующий шаг с учётом условий.
currentStepId* | query | ID текущего шага |
contactId | query | ID контакта |
/public/funnels/:funnelId/steps/:stepId/executeВыполнить шаг (трекинг + переход).
Checkout
Создание заказов и обработка оплаты.
/public/checkout/by-pathПолучить настройки checkout.
path* | query | Путь checkout |
/public/checkout/validate-couponПроверить промокод.
{
"checkoutPath": "/checkout/course",
"couponCode": "SALE20"
}Ответ
{
"valid": true,
"discount": 2000,
"finalAmount": 8000,
"originalAmount": 10000,
"currency": "RUB"
}/public/checkout/create-orderСоздать заказ и получить ссылку на оплату.
checkoutPath* | string | Путь checkout |
email | string | Email покупателя |
phone | string | Телефон |
name | string | Имя |
company | string | Компания |
couponCode | string | Промокод |
referralCode | string | Реферальный код |
POST https://funnelica.ru/api/v1/public/checkout/create-order
{
"checkoutPath": "/checkout/course",
"email": "ivan@example.com",
"name": "Иван",
"couponCode": "SALE20"
}Ответ
{
"orderId": "order_abc123",
"status": "pending",
"amount": 8000,
"currency": "RUB",
"paymentUrl": "https://yookassa.ru/checkout/..."
}/public/orders/:orderId/redirect-urlПолучить URL редиректа после оплаты.
/public/orders/:orderId/upsell-responseОбработать ответ на upsell/downsell.
action* | string | accept или decline |
type* | string | upsell или downsell |
checkoutPath | string | Путь checkout (при accept) |
Сертификаты
Публичные эндпоинты для просмотра и валидации сертификатов.
/public/certificates/:certificateId/pdfСкачать сертификат в PDF.
/public/certificates/:certificateId/validateПроверить подлинность сертификата.
Email-трекинг
Трекинг открытий и кликов в email-рассылках.
/emails/track/openПиксель открытия (возвращает GIF 1x1).
messageId* | query | ID сообщения |
/emails/track/clickТрекинг клика с редиректом.
messageId* | query | ID сообщения |
url* | query | URL для редиректа |
/unsubscribeСтраница отписки (HTML).
email* | query | |
workspace* | query | ID workspace |
/unsubscribeOne-click отписка (List-Unsubscribe-Post).
Студенческий портал
Авторизация студентов по email с кодом и доступ к курсам.
Авторизация
/student/auth/request-loginЗапросить код для входа. Отправляет код на email.
email* | string | Email студента |
workspaceId | string | ID workspace |
POST https://funnelica.ru/api/v1/student/auth/request-login
{ "email": "student@example.com" }/student/auth/verify-codeПодтвердить код и получить токены.
email* | string | |
code* | string | 6-значный код |
workspaceId | string | ID workspace |
{
"accessToken": "eyJhbGciOiJIUzI1...",
"refreshToken": "refresh_abc...",
"contact": {
"id": "contact_xyz",
"email": "student@example.com",
"name": "Иван"
}
}/student/auth/refreshОбновить токен.
Защищённые эндпоинты
Требуют заголовок Authorization: Bearer <accessToken>
/student/meПрофиль студента.
/student/dashboardДашборд с общим прогрессом.
/student/coursesСписок доступных курсов.
/student/certificatesСписок сертификатов студента.
/student/enrollments/:enrollmentId/courseДетали курса по записи.
/student/enrollments/:enrollmentId/lessons/:lessonIdКонтент урока.
/student/enrollments/:enrollmentId/lessons/:lessonId/progressОбновить прогресс урока.
status | string | not_started, in_progress, completed |
watchProgress | number | Прогресс просмотра (0-100) |
lastPosition | number | Позиция в видео (секунды) |
/student/enrollments/:enrollmentId/lessons/:lessonId/homeworkОтправить домашнее задание.
/student/enrollments/:enrollmentId/lessons/:lessonId/questionЗадать вопрос по уроку.
/student/enrollments/:enrollmentId/lessons/:lessonId/quizОтправить ответы на тест.
Ошибки
Формат ошибки и HTTP-коды ответов.
{
"statusCode": 400,
"message": "Validation failed",
"error": "Bad Request"
}HTTP-коды
200Успех400Неверный запрос401Не авторизован403Доступ запрещён404Не найдено429Слишком много запросов500Ошибка сервера