Документация

Публичное API

REST API для интеграции форм, страниц, воронок, оплаты и студенческого портала.

Обзор

Публичное API не требует API-ключа. Эти эндпоинты предназначены для вызова из JavaScript на сайтах — формы, страницы, checkout. Workspace определяется автоматически по домену запроса.

Где использовать

Кастомные формы на вашем сайте

Создайте форму в HTML/React и отправляйте данные через POST /forms/:id/submit. Контакт автоматически создастся в CRM.

Headless-сайты (Next.js, Nuxt, и др.)

Получайте страницы через GET /public/pages/by-path и рендерите их в своём фреймворке.

Кастомный checkout

Создавайте заказы через POST /public/checkout/create-order — получите ссылку на оплату YooKassa.

Студенческий портал (white-label)

Постройте свой интерфейс для студентов. Авторизация через /student/auth/*, курсы через /student/courses.

Базовый URL

https://funnelica.ru/api/v1

Аутентификация

Большинство эндпоинтов работают без авторизации. Исключение — студенческий портал: там требуется Bearer-токен, который студент получает после входа по коду из email.

Формат

Все запросы и ответы в формате JSON. Для POST/PUT запросов указывайте заголовок Content-Type: application/json.

Заголовки

Content-Typeheaderapplication/json для POST/PUT
x-session-idheaderID сессии для связывания событий
x-tenant-hostheaderДомен workspace (если отличается от Host)
AuthorizationheaderBearer токен (только для /student/* эндпоинтов)

Формы

Отправка данных формы. Создаёт или обновляет контакт в CRM и сохраняет заявку.

POST/forms/:formId/submit

Параметры

formId*stringID формы из конструктора

Тело запроса

payload*objectДанные полей формы
emailstringEmail (до 160 символов)
phonestringТелефон (до 40 символов)
namestringИмя (до 160 символов)
companystringКомпания (до 160 символов)
pageUrlstringURL страницы отправки
sourcestringИсточник (например, "landing")
utmobjectUTM-метки

Пример

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"
}

Страницы

Получение опубликованных страниц и отслеживание просмотров.

GET/public/pages/by-path

Получить страницу по пути.

path*queryПуть страницы (например, /landing)
workspaceIdqueryID 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"
  }
}
GET/public/pages/:pageId

Получить страницу по ID.

POST/public/pages/:path/track

Отправить событие просмотра страницы.

sessionIdstringID сессии
contactIdstringID контакта
utmobjectUTM-метки
GET/public/forms/:formId

Получить публичные данные формы для встраивания.

Воронки

Получение структуры воронки и отслеживание прохождения шагов.

GET/public/funnels/:funnelId

Получить воронку со списком шагов.

{
  "id": "funnel_abc",
  "name": "Воронка запуска",
  "status": "active",
  "steps": [
    { "id": "step_1", "type": "page", "name": "Лендинг" },
    { "id": "step_2", "type": "checkout", "name": "Оплата" }
  ]
}
POST/public/funnels/:funnelId/steps/:stepId/track

Отметить посещение шага.

contactIdstringID контакта
metadataobjectДополнительные данные
GET/public/funnels/:funnelId/next-step

Получить следующий шаг с учётом условий.

currentStepId*queryID текущего шага
contactIdqueryID контакта
POST/public/funnels/:funnelId/steps/:stepId/execute

Выполнить шаг (трекинг + переход).

Checkout

Создание заказов и обработка оплаты.

GET/public/checkout/by-path

Получить настройки checkout.

path*queryПуть checkout
POST/public/checkout/validate-coupon

Проверить промокод.

{
  "checkoutPath": "/checkout/course",
  "couponCode": "SALE20"
}

Ответ

{
  "valid": true,
  "discount": 2000,
  "finalAmount": 8000,
  "originalAmount": 10000,
  "currency": "RUB"
}
POST/public/checkout/create-order

Создать заказ и получить ссылку на оплату.

checkoutPath*stringПуть checkout
emailstringEmail покупателя
phonestringТелефон
namestringИмя
companystringКомпания
couponCodestringПромокод
referralCodestringРеферальный код
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/..."
}
GET/public/orders/:orderId/redirect-url

Получить URL редиректа после оплаты.

POST/public/orders/:orderId/upsell-response

Обработать ответ на upsell/downsell.

action*stringaccept или decline
type*stringupsell или downsell
checkoutPathstringПуть checkout (при accept)

Сертификаты

Публичные эндпоинты для просмотра и валидации сертификатов.

GET/public/certificates/:certificateId/pdf

Скачать сертификат в PDF.

GET/public/certificates/:certificateId/validate

Проверить подлинность сертификата.

Email-трекинг

Трекинг открытий и кликов в email-рассылках.

GET/emails/track/open

Пиксель открытия (возвращает GIF 1x1).

messageId*queryID сообщения
GET/emails/track/click

Трекинг клика с редиректом.

messageId*queryID сообщения
url*queryURL для редиректа
GET/unsubscribe

Страница отписки (HTML).

email*queryEmail
workspace*queryID workspace
POST/unsubscribe

One-click отписка (List-Unsubscribe-Post).

Студенческий портал

Авторизация студентов по email с кодом и доступ к курсам.

Авторизация

POST/student/auth/request-login

Запросить код для входа. Отправляет код на email.

email*stringEmail студента
workspaceIdstringID workspace
POST https://funnelica.ru/api/v1/student/auth/request-login

{ "email": "student@example.com" }
POST/student/auth/verify-code

Подтвердить код и получить токены.

email*stringEmail
code*string6-значный код
workspaceIdstringID workspace
{
  "accessToken": "eyJhbGciOiJIUzI1...",
  "refreshToken": "refresh_abc...",
  "contact": {
    "id": "contact_xyz",
    "email": "student@example.com",
    "name": "Иван"
  }
}
POST/student/auth/refresh

Обновить токен.

Защищённые эндпоинты

Требуют заголовок Authorization: Bearer <accessToken>

GET/student/me

Профиль студента.

GET/student/dashboard

Дашборд с общим прогрессом.

GET/student/courses

Список доступных курсов.

GET/student/certificates

Список сертификатов студента.

GET/student/enrollments/:enrollmentId/course

Детали курса по записи.

GET/student/enrollments/:enrollmentId/lessons/:lessonId

Контент урока.

PUT/student/enrollments/:enrollmentId/lessons/:lessonId/progress

Обновить прогресс урока.

statusstringnot_started, in_progress, completed
watchProgressnumberПрогресс просмотра (0-100)
lastPositionnumberПозиция в видео (секунды)
POST/student/enrollments/:enrollmentId/lessons/:lessonId/homework

Отправить домашнее задание.

POST/student/enrollments/:enrollmentId/lessons/:lessonId/question

Задать вопрос по уроку.

POST/student/enrollments/:enrollmentId/lessons/:lessonId/quiz

Отправить ответы на тест.

Ошибки

Формат ошибки и HTTP-коды ответов.

{
  "statusCode": 400,
  "message": "Validation failed",
  "error": "Bad Request"
}

HTTP-коды

200Успех
400Неверный запрос
401Не авторизован
403Доступ запрещён
404Не найдено
429Слишком много запросов
500Ошибка сервера

Вопросы по API?

Напишите нам — поможем с интеграцией.

Связаться