
Язык 🇷🇺 Русский
Ресурсы API
Аутентификация
Агрегации
Журналы аудита
Пакетные задания
Комментарии
Шаблоны электронной почты
Посты ленты
Хэштеги
Пользователь
Модераторы
Счетчик уведомлений
Уведомления
Реакции на страницу
Страницы
Опросы
Голоса в опросах
Ожидающие события вебхуков
Пользователи SSO
Подписки
Ежедневное использование арендатора
Арендаторы
Пакеты арендаторов
Пользователи арендатора
Пользователи
Голоса
Конфигурации домена
Конфигурации вопросов
Результаты вопросов
Агрегация результатов вопросов
Значки пользователей
Прогресс значков пользователя
API живого комментирования
API FastComments
FastComments предоставляет API для взаимодействия со множеством ресурсов. Создавайте интеграции с нашей платформой или даже разрабатывайте собственных клиентов!
В этой документации вы найдёте все поддерживаемые API‑ресурсы, задокументированные с их типами запросов и ответов.
Для корпоративных клиентов весь доступ к API фиксируется в журнале аудита.
Сгенерированные SDK
FastComments теперь генерирует API Spec из нашего кода (это ещё не полностью завершено, но уже включает многие API).
У нас также есть SDK для популярных языков:
- fastcomments-cpp
- fastcomments-go
- fastcomments-java
- fastcomments-sdk-js
- fastcomments-nim
- fastcomments-php
- fastcomments-php-sso
- fastcomments-python
- fastcomments-ruby
- fastcomments-rust
- fastcomments-swift
Аутентификация
API аутентифицируется передачей вашего api key в виде заголовка X-API-KEY или параметра запроса API_KEY. Вам также понадобится ваш tenantId для выполнения вызовов API. Его можно получить на той же странице, где находится ваш api key.
Замечание по безопасности
Эти маршруты предназначены для вызова с сервера. НЕ ДЕЛАЙТЕ вызовов из браузера. Это раскроет ваш API‑ключ, предоставив полный доступ к вашему аккаунту любому, кто сможет просмотреть исходный код страницы!
Вариант аутентификации 1 – Заголовки
- Header:
X-API-KEY - Header:
X-TENANT-ID
Вариант аутентификации 2 – Параметры запроса
- Query Param:
API_KEY - Query Param:
tenantId
Вариант аутентификации 3 – OAuth Bearer Token
- Header:
Authorization: Bearer fcat_...
Сторонние приложения, такие как Zapier, и клиенты MCP server получают токен через OAuth вместо API‑ключа. Этот токен работает со всеми эндпоинтами. tenant подразумевается токеном, поэтому tenantId является необязательным, но при указании должен соответствовать токену. Запросы GET требуют область read, а все остальные методы — область write. Полный процесс, включая регистрацию клиента, PKCE, обновление и отзыв токена, описан в разделе OAuth Authorization. Открытие начинается по адресу https://fastcomments.com/.well-known/oauth-authorization-server.
Чтение собственных записей
FastComments обеспечивает активную‑активную доступность. Запросы из вашего дата‑центра направляются к ближайшей точке присутствия относительно вас. Это происходит автоматически, и обычно вы наблюдаете семантику «чтение‑после‑записи». Если вам необходимо гарантировать чтение собственных записей, вы можете привязать запросы к определённому региону, используя этот регион в качестве хоста API (обычно это не требуется для большинства интеграций):
- gdc-oregon.fastcomments.com
- gdc-virginia.fastcomments.com
- gdc-singapore.fastcomments.com
- gdc-falkenstein2.fastcomments.com
- gdc-sao-paulo.fastcomments.com
- eudc-helsinki2.fastcomments.com
- eudc-limburg.fastcomments.com
- eudc-france.fastcomments.com
Обратите внимание, что при таком подходе может потребоваться определить резервный вариант, так как в прошлом мы отключали узлы входных точек и вводили новые имена для переключения.
API Resources 
Использование ресурсов
Следует отметить, что получение данных из API учитывается как использование вашего аккаунта.
Каждый ресурс будет перечислять, какое именно использование относится к нему, в отдельном разделе.
Некоторые ресурсы стоят дороже в обслуживании, чем другие. Каждый эндпоинт имеет фиксированную стоимость в кредитах за вызов API. Для некоторых эндпоинтов количество кредитов варьируется в зависимости от параметров и размеров ответа.
Использование API можно проверить на странице Billing Analytics, и данные обновляются каждые несколько минут.
Примечание!
Мы рекомендуем сначала ознакомиться с документацией по Pages, чтобы уменьшить путаницу при определении, какие значения передавать для urlId в Comment API.
Вебхуки
Подписки на вебхуки имеют собственное руководство. POST, GET и DELETE /api/v1/webhooks, а также GET /api/v1/webhooks/sample-payloads, задокументированы в разделе Managing Subscriptions via API, а структуры событий — в разделе Webhook Structures.
OAuth Authorization 
FastComments — это сервер авторизации OAuth 2.1. Приложение может получить токен, привязанный к одному аккаунту FastComments, и использовать его на любом эндпоинте из этого руководства вместо API-ключа. Именно так приложение Zapier, MCP-сервер и другие сторонние интеграции подключаются к сервису.
Токены выдаются через authorization code flow с PKCE. Client credentials и implicit grant не поддерживаются.
Discovery
Расположение эндпоинтов, поддерживаемые grant-типы и методы аутентификации публикуются по стандартному metadata URL:

Описываемые им эндпоинты:

Аккаунты в регионе EU используют https://eu.fastcomments.com в качестве issuer с теми же путями.
Регистрация клиента
Клиенту необходимы client_id и зарегистрированный redirect_uri, прежде чем он сможет начать flow. Есть два способа их получить:
- Dynamic Client Registration.
POST /oauth/registerс JSON-телом согласно RFC 7591 (redirect_uris,client_name,client_uri,logo_uri,token_endpoint_auth_method). В ответе возвращаютсяclient_idи, для конфиденциальных клиентов,client_secret. Регистрация не требует аутентификации и ограничена по частоте запросов на IP. - Client ID Metadata Document. Клиент использует
httpsURL, которым он владеет, в качестве своегоclient_id. FastComments загружает этот URL и читает из него те же поля метаданных. Вызов регистрации не требуется.
Партнёрские приложения, перечисленные в панели управления FastComments, такие как Zapier, регистрируются FastComments напрямую. Свяжитесь с поддержкой, если вы создаёте листинг для маркетплейса и вам нужен first-party клиент.
Scopes

Запрос без указания scope получает оба. Пользователь видит запрошенные scopes на странице согласия. Запрос scope, отличного от этих двух, завершается ошибкой invalid_scope.
Шаг 1 - Запрос авторизации
Направьте браузер пользователя на эндпоинт authorize. PKCE с методом S256 обязателен для всех клиентов.


Пользователь при необходимости входит в FastComments и видит страницу согласия, где указаны ваше приложение, аккаунт, к которому оно будет подключено, и запрошенные scopes. Пользователь должен обладать правом API Admin на этом аккаунте; все остальные видят ошибку прав доступа вместо формы согласия. Одобрение перенаправляет браузер на ваш redirect_uri с параметрами code и state. Отказ перенаправляет с error=access_denied.
Код авторизации действителен 10 минут и может быть обменян один раз. Повторный обмен того же кода отзывает все токены, выданные при первом обмене.
Шаг 2 - Запрос токена
Обменяйте код на токены. Тело запроса передаётся в формате form encoded. Конфиденциальные клиенты аутентифицируются через client_secret_basic (HTTP Basic) или client_secret_post (секрет в теле). Публичные клиенты отправляют только client_id.



Ошибки следуют RFC 6749: JSON-тело с error и error_description, HTTP 400 для invalid_request, invalid_grant, invalid_scope, invalid_target и unsupported_grant_type, HTTP 401 для invalid_client, HTTP 429 при ограничении частоты запросов.
Шаг 3 - Вызов API
Отправляйте access token как bearer token. Тенант подразумевается токеном, поэтому tenantId необязателен. Если он указан, он должен совпадать с токеном, иначе запрос завершится ошибкой.

GET /api/v1/me возвращает тенант, авторизующего пользователя и выданные scopes, что делает его подходящим вызовом для проверки соединения. Запрос с истёкшим или отозванным токеном получает HTTP 401. Запрос, метод которого требует scope, которого нет у токена, получает HTTP 403.
Шаг 4 - Обновление токенов


Ответ имеет ту же структуру, что и при обмене кода. Refresh tokens ротируются: каждое обновление возвращает новый refresh_token и отзывает старый после 30-секундного льготного окна для параллельных запросов. Предъявление refresh token, ротированного более 30 секунд назад, считается replay-атакой и отзывает весь grant. Партнёрские приложения, зарегистрированные FastComments, освобождены от ротации и получают тот же refresh token со сроком действия, продлённым ещё на 30 дней.
При обновлении также повторно проверяется, что авторизующий пользователь по-прежнему обладает правом API Admin на аккаунте. Если нет, grant отзывается, и ответом будет invalid_grant.
Отзыв токенов

Отзыв refresh token отзывает все access token, выданные из того же grant. Отзыв access token отзывает только этот токен. Эндпоинт возвращает HTTP 200 с пустым JSON-объектом независимо от того, был ли найден токен, согласно RFC 7009.
Пользователи также могут отозвать подключение через Connected Apps в панели управления FastComments. Все токены этого приложения перестают работать немедленно.
Aggregate Your Data 
Этот API агрегирует документы, группируя их (если задан groupBy) и применяя несколько операций. Поддерживаются различные операции (например, sum, countDistinct, avg и т.д.).
Стоимость является переменной. За каждые 500 просканированных объектов взимается 1 кредит API.
По умолчанию максимальный объем памяти, разрешенный для одного вызова API, составляет 64МБ, и по умолчанию у вас может выполняться только одна агрегация одновременно. Если вы отправите несколько агрегаций одновременно, они будут поставлены в очередь и выполнятся в порядке отправки. Ожидающие агрегации будут ждать максимум 60 секунд, после чего запрос завершится по таймауту. Отдельные агрегации могут выполняться до 5 минут.
Если у вас есть управляемые tenants, вы можете агрегировать все ресурсы дочерних tenants в одном вызове, передав параметр запроса parentTenantId.
Примеры
Пример: подсчет уникальных значений


Пример: подсчет количества различных значений

Ответ:

Пример: суммирование значений нескольких полей

Ответ:

Пример: вычисление среднего значения нескольких полей

Ответ:

Пример: минимальные/максимальные значения нескольких полей

Ответ:

Пример: подсчет уникальных значений нескольких полей

Ответ:

Пример: создание запроса

Ответ:

Пример: подсчет комментариев в ожидании проверки

Ответ:

Пример: распределение одобренных, проверенных и спам-комментариев

Ответ:

Структуры


Следующие ресурсы можно агрегировать:
- AffiliateEvent
- AnonymousVote
- BannedUser
- BatchJob
- BlockedUser
- Comment
- CommentDeleted
- CommentIdToSyncOutbound
- CommentScheduled
- CommentSyncLog
- CustomConfig
- CustomEmailTemplateRenderError
- EmailToSend
- EventLogEntry
- ImportedCommentScheduled
- ModerationGroup
- Moderator
- Page
- PageReact
- PendingVote
- QuestionResult
- SSOUser
- SentEmail
- SpamEvent
- Tenant
- TenantAuditLog
- TenantBadge
- TenantDailyUsage
- TenantInvoiceHistory
- TenantPackage
- User
- UserBadge
- UserBadgeProgress
- UserNotification
- UserSubscription
- UserUsage
- Vote
AuditLog Structure 
AuditLog — это объект, представляющий аудируемое событие для клиентов, у которых есть доступ к этой функции.
Структура объекта AuditLog выглядит следующим образом:

targetId и targetLabel описывают, над чем было выполнено событие; userId и username описывают, кто его выполнил. Для обновлений objectDetails.changes содержит карту {field: {from, to}} того, что фактически изменилось.
Журнал аудита неизменяем. В него также нельзя писать вручную. Только FastComments.com решает, когда записывать данные в журнал аудита. Однако вы можете читать из него через этот API.
События в журнале аудита удаляются через два года.
GET /api/v1/audit-logs 
Этот API использует пагинацию, предоставляемую параметрами skip, limit, before и after. AuditLogs возвращаются страницами по 1000 записей по умолчанию, до максимального limit в 10000, упорядоченные по when и id. Страницы большие, потому что этот эндпоинт обычно используется для выгрузки истории, а не для интерактивного постраничного просмотра.
Каждые 100 возвращаемых записей стоят 1 кредит.
По умолчанию вы получаете список с самыми новыми элементами первыми. Таким образом, вы можете опрашивать, начиная с skip=0, постранично, пока не найдете последнюю запись, которую вы обработали.
Также можно сортировать от старых к новым и постранично получать данные, пока не останется записей.
Сортировку можно задать, установив order в ASC или DESC. По умолчанию — DESC.
Запросы по дате возможны через before и after в виде меток времени в миллисекундах. before и after НЕ включают указанные границы, и каждый из них можно использовать отдельно.
Поиск событий, связанных с человеком
Каждое событие фиксирует, кто его выполнил (username, userId, ip), а также, над чем оно было выполнено. targetLabel — человекочитаемая метка для этого объекта, например jsmith (jsmith@example.com), а targetId — его идентификатор. Используйте target для поиска подстроки в метке без учёта регистра, когда известны имя или email человека, но не его id.
При удалении сохраняется метка на момент события, поэтому удалённый пользователь или модератор могут быть идентифицированы даже после удаления исходной записи.
Управляемые арендаторы
Если ваш арендатор управляет другими арендаторами, установите includeManagedTenants=true, чтобы получить события как от вашего арендатора, так и от всех арендаторов, которыми он управляет, в одном ответе. tenantId каждой возвращённой записи указывает, от какого арендатора она пришла.



BatchJob Structure 
A BatchJob — это длительная задача, например импорт, экспорт или миграция страниц. Задачи ставятся в очередь, затем берутся и выполняются в фоновом режиме.
processedCount и totalCount показывают прогресс. Их единица измерения зависит от type:
migrate-pages: завершённые миграции из запрошенных миграций.undo-page-migration: восстановленные записи.totalCountотсутствует.import,exportи другие задачи: обработанные строки.
Структура объекта BatchJob выглядит следующим образом:

Повторы
Если сервер, выполняющий задачу миграции страниц, перезапускается, задача возвращается в очередь и продолжается после последней завершённой миграции. Задача пытается выполниться до 3 раз, после чего её status становится failed.
GET /api/v1/batch-jobs 
Этот маршрут возвращает пакетные задания арендатора всех типов, начиная с самых новых, по 100 на страницу. Используйте type и status, чтобы сузить список, и skip для постраничного перехода.



GET /api/v1/batch-jobs/:id 
Этот маршрут возвращает статус, прогресс и, после завершения, результат одного пакетного задания. Используйте его, чтобы отслеживать задание, запущенное через POST /api/v1/pages/migrations или POST /api/v1/pages/migrations/:undoId/undo.
Задание считается завершённым, когда его status равен success или failed. Каждый вызов стоит 1 кредит, поэтому опрашивайте каждые несколько секунд, а не постоянно.




Comment Structure 
Объект Comment представляет комментарий, оставленный пользователем.
Взаимоотношение между родительскими и дочерними комментариями определяется через parentId.
Структура объекта Comment выглядит следующим образом:

Некоторые из этих полей помечены READONLY — они возвращаются API, но не могут быть установлены.
Структура текста комментария
Комментарии пишутся в варианте markdown от FastComments, который представляет собой просто markdown плюс традиционные bbcode-подобные теги для изображений, например [img]path[/img].
Текст хранится в двух полях. Текст, введённый пользователем, хранится без изменений в поле comment. Он рендерится и сохраняется в поле commentHTML.
Разрешённые HTML-теги: b, u, i, strike, pre, span, code, img, a, strong, ul, ol, li, and br.
Рекомендуется рендерить HTML, так как это очень небольшое подмножество HTML, создание рендера довольно простое. Существуют несколько библиотек для React Native и Flutter, например, которые помогут с этим.
Вы можете выбрать рендеринг нормализованного значения поля comment. Пример парсера доступен здесь..
Примерный парсер также можно настроить для работы с HTML и преобразовать HTML-теги в ожидаемые элементы для рендера на вашей платформе.
Тегирование
Когда пользователи отмечаются в комментарии, информация сохраняется в списке, называемом mentions. Каждый объект в этом списке имеет следующую структуру.
Run 
Хэштеги
Когда используются хэштеги и успешно распарсены, информация сохраняется в списке, называемом hashTags. Каждый объект в этом списке имеет следующую структуру. Хэштеги также можно вручную добавить в массив hashTags комментария для запросов, если установлено retain.
Run 
GET /api/v1/comments 
Этот API используется для получения комментариев для отображения пользователю. Например, он автоматически отфильтровывает неодобренные и спам-комментарии.
Пагинация
Пагинация может выполняться одним из двух способов, в зависимости от требований к производительности и сценария использования:
- Самый быстрый: Предвычисленная пагинация (Precalculated Pagination):
- Так работает FastComments, когда вы используете наши готовые виджеты и клиенты.
- Нажатие «далее» просто увеличивает номер страницы.
- Это можно представить как получение данных из хранилища «ключ-значение».
- В этом случае просто задайте параметр
page, начиная с0, и направление сортировки какdirection. - Размеры страниц можно настраивать с помощью правил кастомизации.
- Самый гибкий: Гибкая пагинация (Flexible Pagination):
- В этом случае вы можете задать собственные параметры
limitиskip. Не передавайтеpage. - Направление сортировки
directionтакже поддерживается. limit— это общее количество возвращаемых записей после примененияskip.- Пример: задайте
skip = 200, limit = 100приpage size = 100иpage = 2.
- Пример: задайте
- Дочерние комментарии также учитываются в пагинации. Обойти это можно с помощью опции
asTree.- Дочерние комментарии можно пагинировать через
limitChildrenиskipChildren. - Глубину возвращаемых веток можно ограничить через
maxTreeDepth.
- Дочерние комментарии можно пагинировать через
- В этом случае вы можете задать собственные параметры
Ветки (Threads)
- При использовании
Precalculated Paginationкомментарии группируются по страницам, и комментарии в ветках влияют на страницу в целом.- В этом случае ветки могут определяться на клиенте на основе
parentId. - Например, для страницы с одним комментарием верхнего уровня и 29 ответами при установке
page=0в API — вы получите только комментарий верхнего уровня и 29 дочерних комментариев.
- В этом случае ветки могут определяться на клиенте на основе
- При использовании
Flexible Paginationвы можете задать параметрparentId.- Установите его в null, чтобы получить только комментарии верхнего уровня.
- Затем для просмотра веток снова вызовите API, передав
parentId. - Распространённое решение — сделать вызов API для комментариев верхнего уровня, а затем параллельные вызовы API для получения комментариев дочерних элементов каждого комментария.
- НОВОЕ с февраля 2023! Получение в виде дерева с помощью
&asTree=true.- Это можно представить как
Flexible Pagination as a Tree. - В пагинации учитываются только комментарии верхнего уровня.
- Установите
parentId=null, чтобы начать дерево с корня (вы должны установитьparentId). - Установите
skipиlimitдля пагинации. - Установите
asTreeвtrue. - Стоимость в кредитах увеличивается в
2xраза, так как наш бэкенд выполняет гораздо больше работы в этом сценарии. - Установите
maxTreeDepth,limitChildrenиskipChildrenпо мере необходимости.
- Это можно представить как
Деревья: пояснение
При использовании asTree пагинацию бывает сложно представить. Вот наглядная схема:
Получение комментариев в контексте пользователя
API /comments может использоваться в двух контекстах, для разных сценариев:
- Для возврата комментариев, отсортированных и снабжённых информацией для создания собственного клиента.
- В этом случае задайте параметр запроса
contextUserId.
- В этом случае задайте параметр запроса
- Для получения комментариев из вашего бэкенда для кастомных интеграций.
- Платформа по умолчанию использует этот режим без
contextUserId.
- Платформа по умолчанию использует этот режим без




Получение комментариев в виде дерева
Можно получить комментарии в виде дерева, где в пагинации учитываются только комментарии верхнего уровня.

Хотите получить только комментарии верхнего уровня и непосредственные ответы? Вот один из способов:

Однако в вашем интерфейсе может потребоваться знать, показывать ли кнопку «показать ответы»
на каждом комментарии. При получении комментариев в виде дерева к комментариям, где это применимо, добавляется свойство hasChildren.
Получение комментариев в виде дерева с поиском по хэштегу
С помощью API можно выполнять поиск по хэштегу во всём вашем тенанте (не ограничиваясь одной страницей или urlId).
В этом примере мы опускаем urlId и выполняем поиск по нескольким хэштегам. API вернёт только те комментарии, которые содержат все запрошенные хэштеги.

Все параметры запроса

Ответ

Полезные советы
URL ID
Вероятно, вы захотите использовать API Comment с параметром urlId. Вы можете сначала вызвать API Pages, чтобы посмотреть, как выглядят доступные вам значения urlId.
Анонимные действия
Для анонимного комментирования вам, вероятно, потребуется передавать anonUserId при получении комментариев, а также при отправке жалоб и блокировке.
(!) Это требуется во многих магазинах приложений, так как пользователи должны иметь возможность отправлять жалобы на видимый им пользовательский контент, даже если они не авторизованы. Несоблюдение этого требования может привести к удалению вашего приложения из соответствующего магазина.
Комментарии не возвращаются
Проверьте, что ваши комментарии одобрены и не помечены как спам.
GET /api/v1/comments/:id 
Этот API предоставляет возможность получить один комментарий по id.



POST /api/v1/comments 
Этот API-эндпойнт предоставляет возможность создавать комментарии.
Типичные случаи использования: кастомные интерфейсы, интеграции или импорты.
Примечания:
- Этот API может обновлять виджет комментариев "в реальном времени", если нужно (это увеличивает
creditsCostс1до2). - Этот API автоматически создаст объекты пользователей в нашей системе, если указан адрес электронной почты.
- Попытка сохранить два комментария с разными адресами электронной почты, но с одинаковым именем пользователя приведёт к ошибке для второго комментария.
- Если вы указываете
parentId, и дочерний комментарий имеетnotificationSentForParentas false, мы отправим уведомления для родительского комментария. Это делается каждый час (мы группируем уведомления вместе, чтобы уменьшить число отправляемых писем). - Если вы хотите отправлять приветственные письма при создании пользователей или письма для подтверждения комментариев, установите
sendEmailsвtrueв параметрах запроса. - Комментарии, созданные через этот API, будут отображаться на страницах Analytics и Moderation в административном приложении.
- "bad words" по-прежнему маскируются в именах комментаторов и тексте комментария, если настройка включена.
- Комментарии, созданные через этот API, по-прежнему можно проверять на спам при необходимости.
- Настройки, такие как максимальная длина комментария, если они настроены через страницу администрирования Customization Rule, будут применяться и здесь.
Минимальные данные, необходимые для отправки и отображения в виджете комментариев, выглядят следующим образом:

Более реалистичный запрос может выглядеть так:



PATCH /api/v1/comments/:id 
Этот API-эндпоинт предоставляет возможность обновить один комментарий.
Notes:
- Этот API может обновлять виджет комментариев "вживую" при желании (this increases base
creditsCostfrom1to2).- Это может сделать миграцию комментариев между страницами "вживую" (changing
urlId). - Миграции стоят дополнительные
2кредита, так как страницы предрассчитываются и это ресурсоёмко для CPU.
- Это может сделать миграцию комментариев между страницами "вживую" (changing
- В отличие от create API, этот API НЕ будет автоматически создавать объекты пользователей в нашей системе, если указан адрес электронной почты.
- Комментарии, обновлённые через этот API, по-прежнему можно проверять на спам при желании.
- Конфигурации, такие как максимальная длина комментария, если настроены через страницу администрирования Customization Rule, будут применяться здесь.
- Чтобы позволить пользователям обновлять текст своего комментария, вы можете просто указать
commentв теле запроса. Мы сгенерируем результирующийcommentHTML.- Если вы зададите и
comment, иcommentHTML, мы не будем автоматически генерировать HTML. - Если пользователь добавит упоминания или хэштеги в новом тексте, они всё равно будут обрабатываться так же, как в
POSTAPI.
- Если вы зададите и
- При обновлении
commenterEmailв комментарии лучше также указатьuserId. В противном случае вы должны убедиться, что пользователь с этим адресом электронной почты принадлежит вашему тенанту, иначе запрос завершится ошибкой. - Если целевой комментарий заблокирован (
isLocked: true), запрос отклоняется сcode: 'locked'. Сначала разблокируйте комментарий, обновите его, затем при желании снова заблокируйте.



DELETE /api/v1/comments/:id 
Этот конечный пункт API предоставляет возможность удаления комментария.
Примечания:
- Этот API может обновлять виджет комментариев "вживую", если необходимо (это увеличивает
creditsCostс1до2). - Этот API удалит все дочерние комментарии.
- Если целевой комментарий заблокирован (
isLocked: true), запрос отклоняется сcode: 'locked'. Сначала разблокируйте комментарий, затем удалите его.



POST /api/v1/comments/:id/flag 
Этот API-эндпоинт предоставляет возможность пометить комментарий для конкретного пользователя.
Примечания:
- Этот вызов всегда должен выполняться в контексте пользователя. Пользователем может быть пользователь FastComments.com, SSO-пользователь или пользователь арендатора.
- Если установлен порог для скрытия по флагам, комментарий будет автоматически скрыт в реальном времени после того, как его пометят заданное количество раз.
- После того как он автоматически снят с одобрения (скрыт) - комментарий может быть повторно одобрен только администратором или модератором. Снятие флага не восстановит одобрение комментария.

Для анонимной пометки мы должны указать anonUserId. Это может быть идентификатор, представляющий анонимную сессию, или случайный UUID.
Это позволяет поддерживать пометку и снятие пометки с комментариев, даже если пользователь не вошёл в систему. Таким образом комментарий может быть помечен как
flagged при получении комментариев с тем же anonUserId.



POST /api/v1/comments/:id/un-flag 
Этот API-эндпоинт позволяет снять флаг с комментария для конкретного пользователя.
Примечания:
- Этот вызов всегда должен выполняться в контексте пользователя. Пользователем может быть FastComments.com User, SSO User, или Tenant User.
- После того как комментарий автоматически помечается как неодобренный (скрыт) — комментарий может быть повторно одобрен только администратором или модератором. Снятие флага не приведёт к повторному одобрению комментария.

Для анонимной пометки необходимо указать anonUserId. Это может быть идентификатор, представляющий анонимную сессию, или случайный UUID.



POST /api/v1/comments/:id/block 
Этот API-эндпоинт предоставляет возможность заблокировать пользователя, который написал указанный комментарий. Поддерживается блокировка комментариев, написанных пользователями FastComments.com, SSO-пользователями и Tenant-пользователями.
Поддерживается параметр тела запроса commentIdsToCheck, который позволяет проверить, должны ли какие-либо другие потенциально видимые комментарии на клиенте быть заблокированы/разблокированы после выполнения этого действия.
Примечания:
- Этот вызов всегда должен выполняться в контексте пользователя. Пользователь может быть FastComments.com User, SSO User или Tenant User.
userIdв запросе — это пользователь, который выполняет блокировку. Например:User Aхочет заблокироватьUser B. ПередайтеuserId=User Aи идентификатор комментария, который написалUser B.- Полностью анонимные комментарии (без user id и без email) не могут быть заблокированы, и будет возвращена ошибка.

Для анонимной блокировки необходимо указать anonUserId. Это может быть идентификатор, представляющий анонимную сессию, или случайный UUID.
Это позволяет поддерживать блокировку комментариев даже если пользователь не вошёл в систему, получая комментарии с тем же anonUserId.



POST /api/v1/comments/:id/un-block 
Этот конечный пункт API предоставляет возможность разблокировать пользователя, который написал данный комментарий. Поддерживается разблокировка комментариев, написанных пользователями FastComments.com, SSO-пользователями и пользователями арендатора.
Поддерживается параметр тела commentIdsToCheck для проверки, должны ли какие-либо другие потенциально видимые комментарии на клиенте быть заблокированы/разблокированы после выполнения этого действия.
Примечания:
- Вызов всегда должен выполняться в контексте пользователя. Пользователь может быть пользователем FastComments.com, SSO-пользователем или пользователем арендатора.
- Поле
userIdв запросе — это пользователь, который выполняет разблокировку. Например:User Aхочет разблокироватьUser B. ПередайтеuserId=User Aи идентификатор комментария, который написалUser B. - Полностью анонимные комментарии (без user id, без email) не могут быть заблокированы — будет возвращена ошибка.




Email Template Structure 
Объект EmailTemplate представляет конфигурацию пользовательского шаблона письма для тенанта.
Система выберет шаблон письма следующим образом:
- По его идентификатору типа, который мы называем
emailTemplateId. Это константы. - Домен (
domain). Сначала мы попытаемся найти шаблон для домена, к которому привязан связанный объект (например,Comment), и если совпадение не найдено, то попытаемся найти шаблон, где domain равен null или*.
Структура объекта EmailTemplate выглядит следующим образом:

Примечания
- Вы можете получить допустимые значения
emailTemplateIdчерез эндпоинт/definitions. - Эндпоинт
/definitionsтакже включает переводы по умолчанию и тестовые данные. - Шаблоны не сохранятся при недопустимой структуре или тестовых данных.
GET /api/v1/email-templates/:id 
Отдельные EmailTemplates можно получить по соответствующему id (НЕ emailTemplateId).



GET /api/v1/email-templates 
Этот API использует пагинацию, задаваемую параметром запроса page. EmailTemplates возвращаются страницами по 100, отсортированными по createdAt, а затем по id.



PATCH /api/v1/email-templates/:id 
Этот API-эндпоинт позволяет обновлять шаблон письма, указывая только id и атрибуты, которые нужно изменить.
Обратите внимание, что те же проверки, что и при создании шаблона, также применяются, например:
- Шаблон должен корректно рендериться. Это проверяется при каждом обновлении.
- Нельзя иметь дублирующиеся шаблоны для одного и того же домена (в противном случае один из них будет молча игнорироваться).



POST /api/v1/email-templates 
Этот API-эндпоинт предоставляет возможность создавать шаблоны электронных писем.
Примечания:
- У вас не может быть нескольких шаблонов с одинаковым
emailTemplateIdв одном и том же домене. - Но вы можете иметь шаблон-джокер (
domain=*) и шаблон, специфичный для домена, для того жеemailTemplateId. - Указание
domainимеет значение только если у вас несколько доменов или вы хотите использовать специфичные шаблоны для тестирования (например,domain=localhost). - Если вы указываете
domain, он должен соответствоватьDomainConfig. В случае ошибки предоставляется список допустимых доменов. - Синтаксис шаблонов — EJS, и рендеринг выполняется с таймаутом 500 мс. P99 времени рендеринга <5ms, поэтому если вы достигаете 500ms — что-то не так.
- Ваш шаблон должен успешно рендериться с предоставленными
testDataдля сохранения. Ошибки рендеринга агрегируются и отображаются на панели (вскоре будет доступно через API).
Минимальные данные, необходимые для добавления шаблона, следующие:

Возможно, вы захотите иметь шаблоны для каждого сайта, в этом случае вы указываете domain:



POST /api/v1/email-templates/render 
Этот API-эндпойнт предоставляет возможность предварительного просмотра шаблонов электронной почты.



DELETE /api/v1/email-templates/:id 
Этот маршрут позволяет удалить один EmailTemplate по идентификатору.



FeedPost Structure 
FeedPost объект представляет запись в ленте FastComments. Лента — это поток записей со своими собственными ветками комментариев, отображаемый виджетом Feed. Каждая запись имеет автора, необязательный богатый контент, медиа и ссылки, и может быть помечена тегами, чтобы ленту можно было фильтровать.
Структура объекта FeedPost выглядит следующим образом:

Примечания:
- Некоторые из этих полей помечены
READONLY— они возвращаются API, но не могут быть установлены. - Комментарии к записи являются обычными комментариями, чей
urlIdимеет видpost:+_idзаписи. Используйте это значение с API комментариев, чтобы читать или создавать комментарии к записи.
GET /api/v1/feed-posts 
Получает посты в ленте, начиная с самых новых. Пагинация основана на курсоре: передайте _id последнего полученного поста в параметр afterId, чтобы получить следующую страницу.
Стоимость — один кредит за каждые десять возвращённых постов, минимум один кредит.



POST /api/v1/feed-posts 
Этот маршрут создаёт один FeedPost. Каждый пост имеет автора, поэтому fromUserId обязателен и должен быть идентификатором существующего пользователя FastComments или SSO в аккаунте.



PATCH /api/v1/feed-posts/:id 
Этот маршрут обновляет один FeedPost. Отправляйте только те поля, которые хотите изменить.



HashTag Structure 
A HashTag object представляет тег, который может быть оставлен пользователем. HashTag'и могут использоваться для ссылки на внешний контент или для связывания связанных комментариев.
Структура объекта HashTag выглядит следующим образом:

Примечания:
- В некоторых конечных точках API вы увидите, что хэштег используется в URL. Не забудьте кодировать значения в URI. Например,
#следует представлять как%23. - Некоторые из этих полей помечены как
READONLY— они возвращаются API, но не могут быть заданы.
GET /api/v1/hash-tags 
Этот API использует пагинацию, задаваемую параметром запроса page. Хэштеги возвращаются страницами по 100, отсортированные по tag.



PATCH /api/v1/hash-tags/:tag 
Этот маршрут позволяет обновить один HashTag.



POST /api/v1/hash-tags 
Этот маршрут позволяет добавить один HashTag.



POST /api/v1/hash-tags/bulk 
Этот маршрут позволяет добавить до 100 объектов HashTag за один раз.



DELETE /api/v1/hash-tags/:tag 
Этот маршрут предоставляет удаление HashTag по указанному тегу.
Обратите внимание, что если автоматическое создание HashTag не отключено, хэштеги могут быть воссозданы пользователем, указавшим хэштег при комментировании.



GET /api/v1/me 
Описывает учетные данные, выполняющие запрос: арендатора, к которому они принадлежат, и, для OAuth‑токенов доступа, пользователя, который авторизовал приложение. Интеграции используют его для тестирования соединения и маркировки его.
При использовании API‑ключа ответ идентифицирует только арендатора. При использовании OAuth‑токена он также содержит авторизующего пользователя и предоставленные области доступа.


Moderator Structure 
Объект Moderator представляет конфигурацию модератора.
Существует три типа модераторов:
- Администраторы, у которых установлен флаг
isCommentModeratorAdmin. - Пользователи SSO с флагом
isCommentModeratorAdmin. - Обычные комментаторы, или пользователи FastComments.com, приглашённые в модераторы.
Структура Moderator используется для представления состояния модерации в случае использования 3.
Если вы хотите пригласить пользователя стать модератором через API, используйте API Moderator, создав Moderator и пригласив его.
Если у пользователя нет аккаунта на FastComments.com, письмо с приглашением поможет ему настроиться. Если у него уже есть аккаунт, ему будет предоставлен доступ модератора к вашему тенанту и поле userId объекта Moderator будет обновлено, чтобы указывать на его пользователя. Вы не будете иметь доступа к их пользователю через API, так как в этом случае он принадлежит им и управляется FastComments.com.
Если вам требуется полный контроль над учётной записью пользователя, мы рекомендуем либо использовать SSO, либо добавить их в качестве Tenant User и затем добавить объект Moderator для отслеживания их статистики.
Структуру Moderator можно использовать как механизм отслеживания статистики для случаев использования 1 и 2. После создания пользователя добавьте объект Moderator с указанным userId, и их статистика будет отслеживаться на странице Comment Moderators Page.
Структура объекта Moderator выглядит следующим образом:

GET /api/v1/moderators/:id 
Этот маршрут возвращает одного модератора по его id.



GET /api/v1/moderators 
Этот API использует пагинацию, задаваемую параметром запроса skip. Модераторы возвращаются страницами по 100, упорядоченными по createdAt и id.
Стоимость основана на количестве возвращенных модераторов: 1 credit per 10 возвращенных модераторов.



PATCH /api/v1/moderators/:id 
Этот эндпоинт API позволяет обновить Moderator по id.
Обновление Moderator имеет следующие ограничения:
- Следующие значения не могут быть указаны при обновлении
Moderator:acceptedInvitemarkReviewedCountdeletedCountmarkedSpamCountapprovedCounteditedCountbannedCountverificationIdcreatedAt
- Если указан
userId, такой пользователь должен существовать. - Если указан
userId, он должен принадлежать тому жеtenantId, который указан в параметрах запроса. - Нельзя добавить двух модераторов в одном и том же
tenantс одинаковымemail. - Нельзя изменить
tenantId, связанный сModerator.



POST /api/v1/moderators 
Этот маршрут позволяет добавить одного Moderator.
Создание Moderator имеет следующие ограничения:
- Всегда необходимо указывать
nameиemail.userIdявляется необязательным. - Следующие значения не могут быть указаны при создании
Moderator:acceptedInvitemarkReviewedCountdeletedCountmarkedSpamCountapprovedCounteditedCountbannedCountverificationIdcreatedAt
- Если указан
userId, такой пользователь должен существовать. - Если указан
userId, он должен принадлежать тому жеtenantId, который указан в параметрах запроса. - Нельзя добавить двух модераторов в одном тенанте с одинаковым
email.
Мы можем создать Moderator для пользователя, о котором известен только email:

Или мы можем создать Moderator для пользователя, который принадлежит нашему тенанту, чтобы отслеживать его статистику модерации:



POST /api/v1/moderators/:id/send-invite 
Этот маршрут предоставляет возможность пригласить одного Moderator.
Существуют следующие ограничения для отправки электронного приглашения Moderator:
Moderatorдолжен уже существовать.fromNameне может быть длиннее100 characters.
Примечания:
- Если пользователь с указанным адресом электронной почты уже существует, ему будет отправлено приглашение модерировать комментарии вашего тенанта.
- Если пользователь с указанным адресом электронной почты не существует, ссылка-приглашение проведет его через процесс создания аккаунта.
- Срок действия приглашения истечет через
30 days.
Мы можем создать Moderator для пользователя, о котором известен только адрес электронной почты:

Это отправит письмо вроде Bob at TenantName is inviting you to be a moderator...


DELETE /api/v1/moderators/:id 
Этот маршрут обеспечивает удаление Moderator по id.



Notification Count Structure 
Объект NotificationCount представляет количество непрочитанных уведомлений и метаданные пользователя.
Если непрочитанных уведомлений нет, для пользователя не будет объекта NotificationCount.
Объекты NotificationCount создаются автоматически и не могут быть созданы через API. Они также истекают через год.
Вы можете сбросить количество непрочитанных уведомлений пользователя, удалив его объект NotificationCount.
Структура объекта NotificationCount выглядит следующим образом:

GET /api/v1/notification-count/:user_id 
Этот маршрут возвращает один NotificationCount по идентификатору пользователя. При SSO идентификатор пользователя имеет формат <tenant id>:<user id>.
Если нет непрочитанных уведомлений, NotificationCount не будет — вы получите 404.
Это отличается от notifications/count тем, что работает быстрее, но не позволяет фильтровать.



DELETE /api/v1/notification-count/:user_id 
Этот маршрут удаляет один NotificationCount по идентификатору пользователя. При SSO идентификатор пользователя имеет формат <tenant id>:<user id>.
Это очистит счётчик непрочитанных уведомлений пользователя (красный колокольчик в виджете комментариев исчезнет, и число уведомлений пропадёт).



Notification Structure 
Объект Notification представляет уведомление для пользователя.
Объекты Notification создаются автоматически и не могут быть созданы через API. Они также истекают через год.
Уведомления нельзя удалять. Тем не менее их можно обновить, установив viewed в false, и вы можете выполнять запросы по полю viewed.
Пользователь также может отказаться от уведомлений для конкретного комментария, установив optedOut в уведомлении в значение true. Вы можете снова подписаться, установив его в false.
Существует несколько типов уведомлений — смотрите relatedObjectType и type.
Способы создания уведомлений довольно гибкие и могут быть вызваны многими сценариями (см. NotificationType).
На сегодняшний день наличие Notification не обязательно означает, что электронное письмо было или должно быть отправлено. Уведомления используются для ленты уведомлений и связанных интеграций.
Структура объекта Notification выглядит следующим образом:

GET /api/v1/notifications 
Этот маршрут возвращает до 30 объектов Notification, отсортированных по createdAt — сначала самые новые.
Вы можете фильтровать по userId. При использовании SSO идентификатор пользователя имеет формат <tenant id>:<user id>.



GET /api/v1/notifications/count 
Этот маршрут возвращает объект, содержащий количество уведомлений в параметре count.
Он медленнее, чем /notification-count/, и требует вдвое больше кредитов, но позволяет фильтровать по большему числу параметров.
Вы можете фильтровать по тем же параметрам, что и у эндпоинта /notifications, например по userId. При SSO идентификатор пользователя имеет формат <tenant id>:<user id>.




PATCH /api/v1/notifications/:id 
Этот API-эндпоинт предоставляет возможность обновить Notification по id.
Обновление Notification имеет следующие ограничения:
- Вы можете обновлять только следующие поля:
viewedoptedOut



Page Reacts Public API 
Page Reacts позволяют вашим пользователям ставить лайк странице или реагировать на неё с помощью собственного набора изображений реакций. Виджет Page Reacts widget и виджет Floating Likes построены на этих конечных точках, и вы можете вызывать их самостоятельно, чтобы создать собственную кнопку лайка.
В отличие от остальной части руководства, конечные точки Page Reacts являются публичными. Они вызываются из браузеров ваших пользователей, не требуют API‑ключа и не тратят API‑кредиты. Каждая реакция принадлежит пользователю, сделавшему запрос, поэтому пользователь может добавлять или удалять только свои реакции.
Существует два набора конечных точек:
/page-reacts/v1/likes/:tenantId— один «лайк» на пользователя на страницу. Используйте их для кнопки лайка./page-reacts/v2/:tenantId— несколько реакций на страницу, каждая из которых идентифицируется короткимid, выбранным вами (напримерheartилиlaugh).
Обе доступны также в наших SDK в составе PublicApi, например getV1PageLikes, createV1PageReact и deleteV1PageReact в JavaScript SDK.
Показать, кто отреагировал
Передайте includeUserInfo=public в GET‑запросы, чтобы также получить пользователей, которые поставили лайк или отреагировали, с их именами пользователей и аватарами, в порядке от самых новых. Пользователи, сделавшие свою активность профиля приватной, а также анонимные пользователи, исключаются. Возвращается до 100 реакций.
Пользователи SSO создаются с приватной активностью профиля, если только ваш SSO‑payload не устанавливает isProfileActivityPrivate в false, поэтому установите его для пользователей, которых хотите видеть в этих списках.
На страницах, требующих SSO, только пользователи SSO, имеющие доступ к странице, могут получить список тех, кто отреагировал. Остальные получают 403 с кодом sso-required или page-forbidden.
С вашего сервера, GET /api/v1/pages/likes и GET /api/v1/pages/reacts возвращают те же списки с использованием API‑ключа, а также принимают includeUserInfo=include-private, чтобы включать пользователей с приватными профилями.
Идентификация пользователя
Реакции привязаны к пользователю, сделавшему запрос:
- Пользователи SSO: передайте параметр запроса
sso, содержащий URI‑закодированный JSON того же SSO‑объекта, который вы передаёте виджету комментариев. См. SSO. - Анонимные пользователи: когда параметр
ssoотсутствует и нет входа в FastComments, сервер назначает браузеру анонимный идентификатор, хранящийся в cookie сессии FastComments. Отправляйте запросы сcredentials: 'include', чтобы cookie сохранялась между запросами. Браузеры, блокирующие сторонние cookie, не сохранят анонимный идентификатор, поэтому используйте SSO, когда каждый пользователь должен быть надёжно распознан.
Идентификатор urlId
urlId идентифицирует страницу, так же как и для комментариев. Используйте тот же urlId, который вы передаёте виджету комментариев, чтобы лайки и комментарии учитывались на одной странице. Не забудьте закодировать его в URI.

GET /page-reacts/v1/likes/:tenantId 
Возвращает количество лайков на странице и то, поставил ли текущий пользователь лайк. Страницы, которые ещё не существуют, возвращают likeCount со значением 0.
Передайте includeUserInfo=public, чтобы также получить пользователей, поставивших лайк странице, в порядке от самых новых. Пользователи с приватной активностью профиля и анонимные пользователи исключаются, и ищутся до 100 лайков. Здесь принимается только public; include-private возвращает 422 и доступен через GET /api/v1/pages/likes с API‑ключом. На страницах, требующих SSO, includeUserInfo возвращает 403 для пользователей, которые не могут просматривать страницу.



POST /page-reacts/v1/likes/:tenantId 
Лайкает страницу от имени текущего пользователя. Каждый пользователь может лайкнуть страницу только один раз: повторный лайк проходит успешно с кодом already-liked и не изменяет счётчик.
Страница будет создана, если она ещё не существует. Передайте title, чтобы установить или обновить заголовок страницы.



DELETE /page-reacts/v1/likes/:tenantId 
Удаляет лайк текущего пользователя со страницы. Если пользователь не ставил лайк странице, запрос завершается успешно с кодом not-liked и количество не изменяется.



GET /page-reacts/v2/:tenantId 
Возвращает количество каждой реакции на странице и какие реакции добавил текущий пользователь.
Передайте includeUserInfo=public, чтобы также получить пользователей, которые отреагировали, в виде одной записи на реакцию с её идентификатором, самые новые первыми. Пользователи с приватной активностью профиля и анонимные пользователи исключаются, и ищется до 100 реакций. Здесь принимается только public; include-private возвращает 422 и доступен через GET /api/v1/pages/reacts с API‑ключом. На страницах, требующих SSO, includeUserInfo возвращает 403 для пользователей, которые не могут просматривать страницу.



GET /page-reacts/v2/:tenantId/list 
Возвращает имена пользователей, которые добавили реакцию к странице, отсортированные в алфавитном порядке. Просматривается до 100 реакций, а анонимные пользователи и пользователи с приватной активностью профиля не включаются. На страницах, требующих SSO, пользователи, которые не могут просмотреть страницу, получают 403 с кодом sso-required или page-forbidden.
Чтобы также получить аватары и идентификаторы пользователей, используйте GET /page-reacts/v2/:tenantId с includeUserInfo=public.



POST /page-reacts/v2/:tenantId 
Добавляет реакцию к странице от имени текущего пользователя. Пользователь может добавить каждый идентификатор реакции только один раз: повторное добавление завершается успешно с кодом already-reacted и не изменяет счётчик. Пользователь может добавить несколько разных реакций к одной и той же странице.
Идентификаторы реакций выбираются вами и могут быть длиной до 36 символов. Страница будет создана, если её ещё не существует. Передайте title, чтобы установить или обновить заголовок страницы.



DELETE /page-reacts/v2/:tenantId 
Удаляет одну из реакций текущего пользователя со страницы. Если пользователь не добавлял эту реакцию, запрос считается успешным с кодом no-react и количество реакций не изменяется.



Page Structure 
Объект Page представляет страницу, которой может принадлежать множество комментариев. Эта связь определяется
urlId.
Объект Page хранит информацию, такую как заголовок страницы, количество комментариев и urlId.
Структура объекта Page выглядит следующим образом:

GET /api/v1/pages 
Вы можете в настоящее время получать только все страницы (или одну страницу через /by-url-id), связанные с вашей учетной записью. Если вам нужна более точная фильтрация при поиске, свяжитесь с нами.



Полезный совет
API Comment требует urlId. Вы можете сначала вызвать API Pages, чтобы посмотреть, какие значения urlId доступны вам
выглядят.
GET /api/v1/pages/by-url-id 
Отдельные страницы можно получить по соответствующему urlId. Это может быть полезно для поиска заголовков страниц или количества комментариев.



Полезный совет
Помните, что значения, такие как urlId, нужно кодировать в URI.
GET /api/v1/pages/likes 
Возвращает количество лайков на странице, а при желании — список пользователей, поставивших лайк, в порядке от самых новых. Это серверная версия GET /page-reacts/v1/likes/:tenantId.
includeUserInfo контролирует, какие пользователи возвращаются:
publicисключает пользователей, сделавших свою активность профиля приватной.include-privateвключает их. Используйте только в том случае, если список не показывается публично.
Анонимные пользователи никогда не включаются, и проверяется до 100 лайков. Страницы, которые не существуют, возвращают likeCount равный 0 и пустой список users.



Полезный совет
Не забудьте URI‑кодировать значения, такие как urlId.
GET /api/v1/pages/reacts 
Возвращает количество каждой реакции на странице, а также при желании пользователей, которые отреагировали, в виде одной записи на реакцию с её идентификатором, самые новые первыми. Это серверная версия GET /page-reacts/v2/:tenantId.
includeUserInfo управляет тем, какие пользователи возвращаются:
publicисключает пользователей, сделавших свою активность профиля приватной.include-privateвключает их. Используйте это только когда список не показывается публично.
Анонимные пользователи никогда не включаются, и ищется до 100 реакций. Страницы, которые не существуют, возвращают отсутствие counts и пустой список users.



Полезный совет
Не забудьте URI‑кодировать значения, такие как urlId.
PATCH /api/v1/pages/:id 
Этот маршрут позволяет обновить один Page. Соответствующие комментарии будут обновлены.



Примечание
Некоторые параметры в объекте Page обновляются автоматически. Это счётчики и атрибуты title. Счётчики нельзя обновить через API, так как это вычисляемые значения. Значение страницы title можно задать через API, но оно будет перезаписано, если виджет комментариев используется на странице с тем же urlId и другим заголовком страницы.
POST /api/v1/pages 
Этот API-эндпоинт предоставляет возможность создавать страницы.
Распространённый сценарий использования — контроль доступа.
Примечания:
- Если вы оставляли комментарий в ветке комментариев или вызывали API для создания
Comment, вы уже создали объектPage! Вы можете попробовать получить его через маршрутPage/by-url-id, передав тот жеurlId, который был передан виджету комментариев. - Структура
Pageсодержит некоторые вычисляемые значения. В настоящее время этоcommentCountиrootCommentCount. Они заполняются автоматически и не могут быть заданы через API. Попытка сделать это приведёт к тому, что API вернёт ошибку.



DELETE /api/v1/pages/:id 
Этот маршрут удаляет одну страницу по id.
Обратите внимание, что взаимодействие с виджетом комментариев на странице с тем же urlId просто заново создаст Page.



POST /api/v1/pages/migrations 
Этот маршрут перемещает комментарии и страницы из одного urlId или домена в другой, так же как инструмент Domain Migration tool в панели управления. За один запрос можно отправить до 100 миграций. Они выполняются в указанном порядке, поэтому переход от a к b, а затем от b к c работает.
Каждая миграция имеет type:
urlIdперемещает страницу, у которойurlIdточно совпадает сfrom.post-1не совпадает сpost-10.domainищет/заменяетfromвнутри каждогоurlIdиurl, и обновляетdomainкаждого комментария. Оба значения должны быть доменом, напримерold.example.com.
Комментарии, страница, реакции к странице, голоса, уведомления и подписки также перемещаются. Если страница уже существует по адресу to, две страницы объединяются.
Миграция выполняется как пакетная задача. Ответ содержит batchJobId. Делайте опрос GET /api/v1/batch-jobs/:id, чтобы отслеживать её прогресс. После завершения задачи она имеет результат для каждой миграции и undoId, который можно передать в POST /api/v1/pages/migrations/:undoId/undo в течение 90 дней.
Запрос проверяется перед постановкой в очередь. Если какая‑либо миграция недействительна, весь запрос завершается ошибкой 422 и ничего не выполняется.
Постановка миграции в очередь не стоит ничего. Когда задача завершается, она стоит 1 кредит за каждые 1000 перемещённых комментариев, минимум 1.



Примечания
- Задачи для одного арендатора выполняются по одной, начиная с самой старой. Вторая миграция ждёт завершения первой.
PATCH /api/v1/pages/:idс новымurlIdизменяет только страницу, а не её комментарии. Используйте этот маршрут для перемещения комментариев страницы.
POST /api/v1/pages/migrations/:undoId/undo 
Этот маршрут отменяет каждую миграцию из одного задания POST /api/v1/pages/migrations. Получите undoId из завершённого задания миграции с помощью GET /api/v1/batch-jobs/:id. undoId можно использовать в течение 90 дней и только один раз.
Отмена выполняется как пакетное задание, так же как и миграция, и ответ содержит его batchJobId. После завершения задания его pageMigrationUndoResult сообщает:
restored: записи, возвращённые к значениям до миграции.skipped: записи, оставленные без изменений, потому что они изменились после миграции или больше не существуют. Позднее редактирование никогда не перезаписывается.notRestorable: записи, которые миграция удалила при объединении двух страниц или удалении дублирующих реакций страниц. Их нельзя восстановить.
Миграции отменяются в порядке от новых к старым, поэтому цепочка вроде a в b, а затем b в c разворачивается обратно к a. Задание миграции, которое завершилось с ошибкой, всё ещё можно отменить, что обратит изменения, сделанные до сбоя.
Постановка задачи отмены не стоит ничего. Когда задание завершается, стоимость составляет 1 кредит за каждые 1000 восстановленных записей, минимум 1.



Poll Structure 
A Poll привязан к комментарию, а не является отдельным объектом. Он создаётся вместе с комментарием (см. POST /api/v1/comments), или позже добавляется к существующему комментарию с помощью PUT /api/v1/polls/:commentId.
Подсчёты голосов хранятся непосредственно в опросе, поэтому чтение опроса сразу даёт результаты без необходимости суммировать данные. Отдельные голоса, лежащие в основе этих подсчётов, являются объектами PollVote.
Каждый вариант имеет id, генерируемый при создании опроса. Этот id используется для голосования, переименования варианта и сохранения варианта (и его голосов) при PUT опроса с добавленными или удалёнными вариантами. Это единственный надёжный способ ссылки на вариант — никогда не используйте его позицию в списке.

Ограничения
- Вопрос обязателен и может содержать не более 200 символов.
- Опрос должен содержать от 2 до 10 вариантов.
- Метка варианта обязательна, может содержать не более 100 символов и должна быть уникальной в рамках опроса (без учёта регистра).
closesAtдолжен указывать на будущее время при создании опроса. Чтобы закрыть опрос немедленно, выполнитеPATCHс датой в прошлом.
Настройки сайта
Опросы подчиняются конфигурации вашего сайта, которую можно изменить в разделе Customize Widget:
- Опросы должны быть включены, прежде чем можно создать опрос, иначе API вернёт
polls-disabled. - Голосование может быть ограничено только авторизованными пользователями; в этом случае голос, отправленный только с
anonUserId, будет отклонён с ошибкойpoll-login-required.
GET /api/v1/polls/:commentId 
Читает опрос, прикреплённый к комментарию, с текущими подсчётами голосов.
Опросы также возвращаются вместе с самим комментарием через API комментариев, поэтому используйте этот запрос, когда вам нужны только результаты, а не весь комментарий.



Комментарий без опроса, удалённый комментарий и несуществующий идентификатор комментария отвечают одинаково, с ошибкой poll-not-found.
PUT /api/v1/polls/:commentId 
Прикрепляет опрос к существующему комментарию или задаёт полное состояние уже существующего опроса.
Тело представляет собой полный опрос, и отправленные вами варианты становятся вариантами опроса в указанном порядке. Каждый вариант сопоставляется по его id:
- Вариант, отправленный с
idсуществующего варианта, сохраняет этот вариант и его голоса. Его метка и позиция обновляются в соответствии с отправленными данными. - Вариант, отправленный без
id, добавляется без голосов. - Существующий вариант, который вы опускаете, удаляется вместе с отданными за него голосами.
totalVotesуменьшается на то же количество.
Таким образом, чтобы добавить вариант, отправьте текущие варианты с их id и новый вариант без id. Чтобы удалить вариант, отправьте список без него. id вариантов находятся в опросе, возвращаемом запросом GET /api/v1/polls/:commentId.
Отправка без каких-либо id заменяет все варианты и удаляет все уже отданные голоса в опросе. Если в опросе есть голоса, это требует replaceVotes=true, а без него API отвечает replace-votes-required.
Другие поля также заменяются: если опустить closesAt, privacy или requireVoteToSeeResults, они сбрасываются к значениям по умолчанию. Чтобы изменить только одно поле, оставив остальные без изменений, используйте PATCH /api/v1/polls/:commentId.



Прочие замечания
id, которого нет в опросе, или одинаковыйid, указанный дважды, приводит к ошибкеpoll-invalid. У комментария без опроса ещё нетidвариантов, поэтому каждый отправляемый вариант должен опускатьid.- Приватность опроса можно сузить, но нельзя расширить после того, как в нём появились голоса.
- Этот API соблюдает настройки вашего сайта. Если опросы не включены для сайта или страницы, запрос завершится ошибкой
polls-disabled. - Заблокированный комментарий не может изменять свой опрос, и запрос завершится ошибкой
locked. - Подключённые виджеты обновляются в реальном времени, поэтому пользователи видят новый опрос без перезагрузки.
PATCH /api/v1/polls/:commentId 
Изменяет опрос, не затрагивая его голоса. Используйте это, чтобы исправить опечатку в вопросе или варианте ответа, закрыть или заново открыть опрос, а также изменить то, кто может видеть, кто проголосовал.
Варианты адресуются по их id, и PATCH переименовывает только те, которые вы указали. Чтобы добавить, удалить или изменить порядок вариантов, отправьте полный список вариантов на PUT /api/v1/polls/:commentId: варианты, отправленные с их id, также сохраняют свои голоса.
Каждое поле необязательно, но должно быть указано хотя бы одно.




Прочие примечания
- Указание id варианта, которого нет в опросе, приводит к ошибке
poll-invalid, а не к тихому игнорированию. - Названия вариантов должны оставаться уникальными в рамках опроса, с учётом вариантов, которые вы не изменяете.
- В отличие от создания опроса,
closesAtздесь может быть в прошлом — именно так опрос закрывается немедленно. - Приватность опроса можно сузить, но не расширить после того, как появились голоса.
- У опроса в заблокированном комментарии нельзя ничего изменить — будет ошибка
locked.
DELETE /api/v1/polls/:commentId 
Удаляет опрос из его комментария, вместе со всеми голосами, отданными в нём. Сам комментарий остаётся без изменений.
Удаление комментария также удаляет его опрос и голоса, поэтому это необходимо только в том случае, когда вы хотите сохранить комментарий.



PollVote Structure 
A PollVote — это ответ одного человека на опрос. Счётчики, отображаемые непосредственно в опросе, синхронны с этими записями, поэтому они нужны только тогда, когда вам нужно знать кто за что проголосовал, а не общие итоги.
У избирателя может быть не более одного голоса в опросе. При повторном голосовании его существующий голос перемещается к новому варианту вместо того, чтобы добавить второй, а updatedAt фиксирует, когда это произошло.
voterId — это userId, если избиратель был авторизован, иначе используется anonUserId.

Privacy
Настройка privacy опроса применяется к этому API так же, как и в виджете комментариев:
- Anonymous (по умолчанию): никто не может увидеть, как кто‑то проголосовал, поэтому голоса недоступны для чтения.
GET /api/v1/poll-votesиGET /api/v1/poll-votes/:idотвечаютpoll-anonymous. Счётчики опроса всё ещё доступны черезGET /api/v1/polls/:commentId. - Admins and moderators: ваш API‑ключ принадлежит администратору вашего сайта, поэтому он может читать голоса.
- Everyone: голоса могут быть прочитаны.
Настройки конфиденциальности опроса можно сузить, но нельзя расширить после того, как в нём появились голоса.
GET /api/v1/poll-votes 
Список отдельных голосов, лежащих в основе подсчётов одного опроса, в порядке от старейшего к новейшему. Один кредит за каждые 100 возвращённых голосов.
Опрос принадлежит комментарию, поэтому голоса читаются по одному опросу за раз, и параметр commentId обязателен. Можно уточнить запрос с помощью voterId, чтобы проверить, как проголосовал конкретный пользователь, или с помощью optionId, чтобы получить список всех, кто выбрал определённый вариант.
За один вызов возвращается не более 1000 голосов. Используйте skip для постраничного получения остальных.
Настройка privacy опроса учитывается: голоса в анонимном опросе нельзя прочитать, и запрос завершится ошибкой poll-anonymous. Подробнее см. структуру PollVote.



Подсчёт голосов по варианту
Вам не нужно суммировать их, чтобы получить результаты — опрос уже содержит собственные подсчёты. Вместо этого прочитайте опрос с помощью GET /api/v1/polls/:commentId, а этот API используйте, когда необходимо узнать, кто проголосовал.
Каждый опрос на странице
Список голосов по всей странице отсутствует. Чтобы собрать отчёт по всей странице, получите её комментарии с помощью GET /api/v1/comments, который возвращает опрос каждого комментария и его подсчёты, после чего можно прочитать голоса для интересующих вас опросов.
GET /api/v1/poll-votes/:id 
Читает один голос опроса по его идентификатору.
Голос в анонимном опросе нельзя прочитать, и запрос завершится ошибкой poll-anonymous. См. структуру PollVote, чтобы понять, как применяется настройка privacy опроса.



POST /api/v1/poll-votes 
Записывает голос в опрос.
У избирателя может быть не более одного голоса в опросе. Повторный вызов для того же избирателя перемещает его голос на новый вариант вместо добавления второго, а голосование за уже выбранный вариант не приводит к изменению.
Ответ включает опрос, поэтому вы получаете обновлённые подсчёты без дополнительного запроса.




Анонимные голоса
Установите anonUserId вместо userId, чтобы записать голос для пользователя, который не вошёл в систему. Этот идентификатор не обязан соответствовать какому‑либо пользователю — он просто идентифицирует сессию, поэтому один и тот же человек не будет засчитан дважды.
Анонимное голосование должно быть включено для вашего сайта. Если голосование ограничено только авторизованными пользователями, голос с единственным anonUserId завершится ошибкой poll-login-required.
Анонимные голоса также ограничены по скорости на каждый IP в каждом опросе, чтобы предотвратить заполнение опроса одним человеком путём очистки своей сессии. Передайте ip конечного пользователя, чтобы ограничение применялось к нему, а не к вашему серверу.
Прочие замечания
userIdдолжен соответствовать пользователю, существующему на вашем сайте. Голоса за пользователя, принадлежащего другому сайту, отклоняются.- Голосование в закрытом опросе завершается ошибкой
poll-closed. - Этот API обновляет подсчёты в опросе и в реальном времени передаёт их подключённым виджетам.
DELETE /api/v1/poll-votes/:id 
Отзывает голос. Опция, за которую был отдан голос, возвращает свой счёт, и избиратель может проголосовать снова.



Примечания
- Удаление того же голоса дважды возвращает
not-foundво второй раз, и счётчики остаются без изменений. - Если опрос был заменён после того, как был отдан голос, голос удаляется, но счётчики не меняются, поскольку замена началась с нуля.
PendingWebhookEvent Structure 
Объект PendingWebhookEvent представляет событие вебхука в очереди, ожидающее обработки.
Объекты PendingWebhookEvent создаются автоматически и не могут быть созданы вручную через API. Они также истекают через один год.
Их можно удалить, что уберет задачу из очереди.
Существуют разные типы событий — проверьте eventType (OutboundSyncEventType) и type (OutboundSyncType).
Распространенный вариант использования этого API — реализация пользовательского мониторинга. Возможно, вы захотите периодически вызывать эндпоинт /count,
чтобы опрашивать количество ожидающих событий по заданным фильтрам.
Структура объекта PendingWebhookEvent выглядит следующим образом:

GET /api/v1/pending-webhook-events 
Этот маршрут возвращает список ожидающих webhook-событий в параметре pendingWebhookEvents.
Этот API использует постраничную навигацию, задаваемую параметром skip. PendingWebhookEvents возвращаются страницами по 100, отсортированные по createdAt, сначала самые новые.



GET /api/v1/pending-webhook-events/count 
Этот маршрут возвращает объект, содержащий количество ожидающих webhook-событий в параметре count.
Вы можете фильтровать по тем же параметрам, что и у эндпоинта /pending-webhook-events



DELETE /api/v1/pending-webhook-events/:id 
Этот маршрут позволяет удалить один PendingWebhookEvent.
Если вам нужно выполнить массовое удаление, вызовите GET API с пагинацией, а затем последовательно вызовите этот API.



SSOUser Structure 
FastComments предоставляет простое в использовании решение SSO. Обновление информации о пользователе при интеграции на основе HMAC так же просто, как загрузка пользователем страницы с обновлённым payload.
Однако может быть желательно управлять пользователем вне этого процесса, чтобы улучшить согласованность вашего приложения.
SSO User API предоставляет способ выполнять CRUD-операции над объектами, которые мы называем SSOUsers. Эти объекты отличаются от обычных Users и хранятся отдельно для типобезопасности.
Структура объекта SSOUser выглядит следующим образом:

Тарификация SSO-пользователей
SSO-пользователи тарифицируются по-разному в зависимости от их флагов прав:
- Обычные SSO-пользователи: пользователи без прав администратора или модератора тарифицируются как обычные SSO-пользователи
- SSO Admins: пользователи с флагами
isAccountOwnerилиisAdminAdminтарифицируются отдельно как SSO Admins (по тому же тарифу, что и обычные администраторы тенанта) - SSO Moderators: пользователи с флагом
isCommentModeratorAdminтарифицируются отдельно как SSO Moderators (по тому же тарифу, что и обычные модераторы)
Важно: для предотвращения двойной тарификации система автоматически дедуплицирует SSO-пользователей против обычных пользователей и модераторов тенанта по адресу электронной почты. Если у SSO-пользователя тот же email, что у обычного пользователя или модератора тенанта, он не будет тарифицирован дважды.
Контроль доступа
Пользователи могут быть разбиты на группы. Для этого предназначено поле groupIds, и оно является необязательным.
@Упоминания
По умолчанию @mentions используют username для поиска других sso-пользователей при вводе символа @. Если используется displayName, то результаты, совпадающие с username, будут игнорироваться при наличии совпадения с displayName, а результаты поиска @mention будут использовать displayName.
Подписки
В FastComments пользователи могут подписаться на страницу, нажав на иконку колокольчика в виджете комментариев и выбрав «Подписаться».
Для обычного пользователя мы отправляем уведомления по электронной почте на основе его настроек уведомлений.
Для SSO-пользователей мы разделили это для обратной совместимости. Пользователи будут получать эти дополнительные письма с уведомлениями о подписке только если вы установите optedInSubscriptionNotifications в true.
Бейджи
Вы можете назначать бейджи SSO-пользователям с помощью свойства badgeConfig. Бейджи — это визуальные индикаторы, отображаемые рядом с именем пользователя в комментариях.
badgeIds— массив ID бейджей для назначения пользователю. Это глобальные бейджи, видимые на всех страницах. Должны быть действительными ID бейджей, созданными в вашем аккаунте FastComments. Ограничено 30 бейджами.pageBadgeIds— необязательный массив ID бейджей, привязанных к текущей странице (urlId). Эти бейджи отображаются только на странице, где они были назначены. Разные страницы могут иметь разные бейджи, привязанные к странице, для одного и того же пользователя.override— если true, все существующие отображаемые бейджи будут заменены на предоставленные. Глобальные и привязанные к странице бейджи переопределяются независимо — переопределение глобальных бейджей не влияет на бейджи, привязанные к странице, и наоборот. Если false или не указано, предоставленные бейджи будут добавлены к существующим.update— если true, свойства отображения бейджей будут обновляться из конфигурации тенанта при каждом входе пользователя.
GET /api/v1/sso-users 
Этот маршрут возвращает SSO пользователей страницами по 100. Пагинация осуществляется с помощью параметра skip. Пользователи сортируются по их signUpDate и id.



GET /api/v1/sso-users/by-id/:id 
Этот маршрут возвращает одного SSO-пользователя по его id.



GET /api/v1/sso-users/by-email/:email 
Этот маршрут возвращает одного SSO-пользователя по его адресу электронной почты.



PATCH /api/v1/sso-users/:id 
Этот маршрут позволяет обновить одного SSO-пользователя.



POST /api/v1/sso-users 
Этот маршрут обеспечивает создание одного SSO-пользователя.
Попытка создать двух пользователей с одинаковым ID приведёт к ошибке.

В этом примере мы указываем groupIds для управления доступом, но это необязательно.


Примечание по интеграции
Данные, переданные через API, могут быть переопределены просто путем передачи другого SSO User HMAC payload. Например, если вы зададите username через API, но затем передадите другой через SSO-процесс при загрузке страницы, мы автоматически обновим их username.
Мы не будем обновлять параметры пользователя в этом потоке, если вы явно не укажете их или не установите их в null (не undefined).
PUT /api/v1/sso-users/:id 
Этот маршрут позволяет обновлять одного SSO-пользователя.

В этом примере мы указываем groupIds для контроля доступа, но это необязательно.


DELETE /api/v1/sso-users/:id 
Этот маршрут обеспечивает удаление одного SSO-пользователя по его id.
Обратите внимание, что повторная загрузка виджета комментариев с payload для этого пользователя просто автоматически воссоздаст пользователя.
Удаление комментариев пользователя возможно через параметр запроса deleteComments. Обратите внимание, что если это true:
- Все комментарии пользователя будут удалены в реальном времени.
- Все дочерние (теперь сиротские) комментарии будут удалены или анонимизированы в зависимости от конфигурации страницы, связанной с каждым комментарием. Например, если режим удаления ветки — "anonymize", то ответы останутся, а комментарии пользователя будут анонимизированы. Это применяется только когда
commentDeleteModeравенRemove(значение по умолчанию). creditsCostстановится2.
Анонимизированные комментарии
Вы можете сохранить комментарии пользователя, но просто анонимизировать их, установив commentDeleteMode=1.
Если комментарии пользователя анонимизированы, то следующие значения устанавливаются в null:
- commenterName
- commenterEmail
- avatarSrc
- userId
- anonUserId
- mentions
- badges
isDeleted и isDeletedUser устанавливаются в true.
При отрисовке виджет комментариев будет использовать DELETED_USER_PLACEHOLDER (по умолчанию: "[deleted]") для имени пользователя и DELETED_CONTENT_PLACEHOLDER для комментария. Их можно настроить через интерфейс настройки виджета (Widget Customization UI).
Примеры



Subscription Structure 
Объект Subscription представляет подписку для пользователя.
Subscription объекты создаются, когда пользователь нажимает на колокольчик уведомлений в виджете комментариев и нажимает "Подписаться на эту страницу".
Подписки также можно создавать через API.
Наличие объекта Subscription приводит к генерации объектов Notification и отправке писем, когда в корне связанной страницы, на которую оформлена подписка, оставляются новые комментарии. Отправка писем зависит от типа пользователя. Для обычных пользователей это зависит от optedInNotifications. Для пользователей SSO это зависит от optedInSubscriptionNotifications. Обратите внимание, что в некоторых приложениях может отсутствовать понятие веб-доступной страницы, в таком случае просто установите urlId равным id элемента, на который вы подписываетесь (то же значение для urlId, которое вы передали бы виджету комментариев).
Структура объекта Subscription выглядит следующим образом:

GET /api/v1/subscriptions/:id 
Этот маршрут возвращает до 30 объектов Subscription, отсортированных по createdAt, в порядке от новых к старым.
Вы можете фильтровать по userId. При SSO идентификатор пользователя имеет формат <tenant id>:<user id>.



POST /api/v1/subscriptions 
Этот конечный точка API предоставляет возможность создать Subscription. Обратите внимание, что у пользователя может быть только одна подписка на страницу, поскольку несколько подписок избыточны; попытка создать более одной подписки для одного и того же пользователя на той же странице приведёт к ошибке.
Создание подписки приведёт к созданию объектов Notification, когда на корне подписанного urlId появится новый комментарий (когда parentId комментария равен null).



DELETE /api/v1/subscriptions/:id 
Этот маршрут удаляет один объект Subscription по id.



TenantDailyUsage Structure 
Объект TenantDailyUsage представляет использование для арендатора за указанный день. Если для данного арендатора в указанный
день не было активности, у этого дня не будет объекта TenantDailyUsage.
Объект TenantDailyUsage не является данными в реальном времени и может отставать от фактического использования на несколько минут.
Структура объекта TenantDailyUsage выглядит следующим образом:

GET /api/v1/tenant-daily-usage 
Этот маршрут позволяет искать использование арендатора по году, месяцу и дню. Можно вернуть до 365 объектов, а стоимость — 1 апи-кредит за 10 объектов.
Объекты ответа сортируются по дате их создания (сначала самые старые).



Tenant Structure 
Tenant определяет клиента FastComments.com. Такие объекты могут быть созданы через API тенантами с доступом к white labeling. White labeled тенанты
не могут создавать других white labeled тенантов (допускается только один уровень вложенности).
Структура объекта Tenant выглядит следующим образом:

GET /api/v1/tenants/:id 
Этот маршрут возвращает один Tenant по id.



GET /api/v1/tenants 
Этот API возвращает tenants, которыми управляет ваш tenant.
Пагинация предоставляется с помощью параметра запроса skip. Tenants возвращаются страницами по 100, упорядоченных по signUpDate и id.
Стоимость зависит от количества возвращаемых tenants, составляя 1 credit per 10 возвращенных tenants.

Вы можете задать параметры meta в объектах Tenant и выполнять запрос для соответствующих tenants. Например, для ключа someKey и значения meta some-value, мы можем сформировать JSON-объект с этой парой ключ/значение и затем URI-кодировать его как параметр запроса для фильтрации:



POST /api/v1/tenants 
Этот маршрут предоставляет возможность добавить одного Tenant.
Создание Tenant имеет следующие ограничения:
- Обязателен
name. - Обязателен
domainConfiguration. - Следующие значения не могут быть указаны при создании
Tenant:hasFlexPricinglastBillingIssueReminderDateflexLastBilledAmount
- Значение
signUpDateне может быть в будущем. nameне может быть длиннее200 characters.emailне может быть длиннее300 characters.emailдолжен быть уникальным для всех тенантов FastComments.com.- Вы не можете создавать тенанты, если у родительского тенанта не определён действительный
TenantPackage.- Если ваш тенант был создан через FastComments.com, это не должно быть проблемой.
- Вы не можете создавать больше тенантов, чем определено в
maxWhiteLabeledTenantsв вашем пакете. - Вы должны указать параметр запроса
tenantId, который является id вашегоparent tenantс включенным white labeling.
Мы можем создать Tenant с помощью лишь нескольких параметров:



PATCH /api/v1/tenants/:id 
Эта конечная точка API предоставляет возможность обновить Tenant по id.
При обновлении Tenant действуют следующие ограничения:
- Следующие значения не могут быть обновлены:
hasFlexPricinglastBillingIssueReminderDateflexLastBilledAmountmanagedByTenantId
signUpDateне может быть в будущем.nameне может быть длиннее200 characters.emailне может быть длиннее300 characters.emailдолжен быть уникален среди всех tenants FastComments.com.- При установке
billingInfoValidвtrue,billingInfoдолжен быть предоставлен в том же запросе. - Вы не можете обновить
packageId, связанный с вашим собственным tenant. - Вы не можете обновить
paymentFrequency, связанный с вашим собственным tenant.



DELETE /api/v1/tenants/:id 
Этот маршрут предоставляет удаление Tenant и всех связанных данных (пользователи, комментарии и т.д.) по id.
Существуют следующие ограничения при удалении тенантов:
- Тенант должен быть вашим собственным или white-labeled тенантом, которым вы управляете.
- Параметр запроса
sureдолжен быть установлен вtrue.



Tenant Package Structure 
TenantPackage определяет информацию о пакете, доступном для Tenant. У тенанта может быть доступно несколько пакетов, но только
один используется в данный момент.
Tenant нельзя использовать ни для каких продуктов, пока его packageId не указывает на действительный TenantPackage.
Существует два типа объектов TenantPackage:
- Пакеты с фиксированной ценой — где
hasFlexPricingравно false. - Гибкая цена — где
hasFlexPricingравно true.
В обоих случаях лимиты определяются на аккаунте, использующем пакет, однако при Flex-тарифе с тенанта взимается базовая цена плюс
то, что он использовал, что определяется параметрами flex*.
У тенанта может быть несколько пакетов, и он может сам менять пакет на странице информации о биллинге.
Если вы сами будете заниматься биллингом для тенантов, вам всё равно нужно будет определить пакет для каждого тенанта, чтобы задать их лимиты. Просто установите billingHandledExternally в true для Tenant, и они
не смогут самостоятельно менять свою платежную информацию или активный пакет.
Вы не можете создавать пакеты с лимитами выше, чем у родительского тенанта.
Структура объекта TenantPackage выглядит следующим образом:

GET /api/v1/tenant-packages/:id 
Этот маршрут возвращает один Tenant Package по идентификатору.



GET /api/v1/tenant-packages 
Этот API использует пагинацию, осуществляемую с помощью параметра запроса skip. TenantPackages возвращаются страницами по 100, упорядоченные по createdAt и id.
Стоимость рассчитывается на основе количества возвращаемых tenant packages и составляет 1 credit per 10 tenant packages.



POST /api/v1/tenant-packages 
Этот маршрут предоставляет возможность добавить один TenantPackage.
Создание TenantPackage имеет следующие ограничения:
- Требуются следующие параметры:
nametenantIdmonthlyCostUSD- Может быть null.yearlyCostUSD- Может быть null.maxMonthlyPageLoadsmaxMonthlyAPICreditsmaxMonthlyCommentsmaxConcurrentUsersmaxTenantUsersmaxSSOUsersmaxModeratorsmaxDomainshasDebrandingforWhoTextfeatureTaglineshasFlexPricing- Если true, то все параметрыflex*обязательны.
nameне может быть длиннее50 characters.- Каждый элемент
forWhoTextне может быть длиннее200 characters. - Каждый элемент
featureTaglinesне может быть длиннее100 characters. TenantPackageдолжен быть "меньше" родительского тенанта. Например, все параметрыmax*должны иметь значения меньше, чем у родительского тенанта.- У тенанта с белой маркировкой может быть максимум пять пакетов.
- Создавать
TenantPackageмогут только тенанты с доступом к белой маркировке. - Вы не можете добавлять пакеты в ваш собственный тенант. :)
Мы можем создать TenantPackage следующим образом:



PATCH /api/v1/tenant-packages/:id 
Этот API-эндпоинт предоставляет возможность обновить TenantPackage по id.
Обновление TenantPackage имеет следующие ограничения:
- Если вы устанавливаете
hasFlexPricingв true, то все параметрыflex*обязательны в том же запросе. - Значение
nameне может быть длиннее, чем50 characters. - Каждый элемент
forWhoTextне может быть длиннее, чем200 characters. - Каждый элемент
featureTaglinesне может быть длиннее, чем100 characters. TenantPackageдолжен быть "меньше" чем родительский tenant. Например, все параметрыmax*должны иметь меньшие значения, чем у родительского tenant.- Вы не можете изменить
tenantId, связанный сTenantPackage.



DELETE /api/v1/tenant-packages/:id 
Этот маршрут обеспечивает удаление TenantPackage по id.
Вы не можете удалить TenantPackage, который используется (у tenant значение packageId указывает на этот пакет). Сначала обновите Tenant.



Tenant User Structure 
TenantUser определяет User, которым управляет конкретный tenant. Их учётная запись полностью контролируется tenant'ом, с которым они связаны, и её можно обновить или удалить через UI или API.
Tenant users могут быть администраторами с полными правами и доступом к Tenant, либо иметь ограниченные права для модерирования комментариев, доступа к API-ключам и т.д.
Структура объекта TenantUser выглядит следующим образом:

GET /api/v1/tenant-users/:id 
Этот маршрут возвращает одного TenantUser по id.



GET /api/v1/tenant-users 
Этот API использует пагинацию, задаваемую параметром запроса skip. TenantUsers возвращаются страницами по 100, упорядоченными по signUpDate, username и id.
Стоимость зависит от количества возвращённых tenant users: 1 credit per 10.



POST /api/v1/tenant-users 
Этот маршрут предоставляет возможность добавить одного TenantUser.
При создании TenantUser действуют следующие ограничения:
usernameобязателен.emailобязателен.signUpDateне может быть в будущем.localeдолжен находиться в списке Поддерживаемые локали.usernameдолжен быть уникален для всего FastComments.com. Если это является проблемой, мы рекомендуем вместо этого использовать SSO.emailдолжен быть уникален для всего FastComments.com. Если это является проблемой, мы рекомендуем вместо этого использовать SSO.- Вы не можете создать больше tenant users, чем определено в
maxTenantUsersв вашем пакете.
Мы можем создать TenantUser следующим образом



POST /api/v1/tenant-users/:id/send-login-link 
Этот маршрут позволяет отправить ссылку для входа одному TenantUser.
Полезно при массовом создании пользователей, чтобы не объяснять им, как войти на FastComments.com. Это просто отправит им «магическую ссылку» для входа, которая истекает через 30 days.
Следующие ограничения действуют при отправке ссылки для входа TenantUser:
TenantUserдолжен уже существовать.- Вы должны иметь доступ к управлению
Tenant, к которому принадлежитTenantUser.
Мы можем отправить ссылку для входа TenantUser следующим образом:

Это отправит электронное письмо вида Bob at TenantName is inviting you to be a moderator...


PATCH /api/v1/tenant-users/:id 
Этот маршрут позволяет обновить одного TenantUser.
Обновление TenantUser имеет следующие ограничения:
signUpDateне может быть в будущем.localeдолжен быть в списке Поддерживаемые локали.usernameдолжен быть уникальным на всём FastComments.com. Если это проблема, мы рекомендуем вместо этого использовать SSO.emailдолжен быть уникальным на всём FastComments.com. Если это проблема, мы рекомендуем вместо этого использовать SSO.- Вы не можете обновлять
tenantIdпользователя.
Мы можем создать TenantUser следующим образом



DELETE /api/v1/tenant-users/:id 
Этот маршрут обеспечивает удаление TenantUser по идентификатору.
Удаление комментариев пользователя возможно через параметр запроса deleteComments. Обратите внимание, что если он установлен в true:
- Все комментарии пользователя будут удалены в реальном времени.
- Все дочерние (теперь осиротевшие) комментарии будут удалены или анонимизированы в зависимости от конфигурации страницы, связанной с каждым комментарием. Например, если режим удаления ветки — "anonymize", то ответы останутся, а комментарии пользователя будут анонимизированы. Это применяется только когда
commentDeleteModeравенRemove(значение по умолчанию). creditsCostстановится2.
Анонимизированные комментарии
Вы можете сохранить комментарии пользователя, просто анонимизировав их, установив commentDeleteMode=1.
Если комментарии пользователя анонимизированы, следующие значения устанавливаются в null:
- commenterName
- commenterEmail
- avatarSrc
- userId
- anonUserId
- mentions
- badges
isDeleted и isDeletedUser устанавливаются в true.
При отображении виджет комментариев будет использовать DELETED_USER_PLACEHOLDER (по умолчанию: "[deleted]") для имени пользователя и DELETED_CONTENT_PLACEHOLDER для комментария. Их можно настроить через интерфейс настройки виджета.
Примеры



User Structure 
User — объект, представляющий наибольшее общее для всех пользователей.
Имейте в виду, что в FastComments у нас есть множество различных сценариев использования пользователей:
- Secure SSO
- Simple SSO
- Tenant Users (Например: Администраторы)
- Commenters
Этот API предназначен для Commenters и пользователей, созданных через Simple SSO. По сути, любой пользователь, созданный через ваш сайт, доступен через этот API. Tenant Users также можно получить таким способом, но вы получите больше информации, взаимодействуя с API /tenant-users/.
Для Secure SSO используйте API /sso-users/.
Вы не можете обновлять таких пользователей. Они создали свою учётную запись через ваш сайт, поэтому мы предоставляем лишь базовый доступ только для чтения, и вы не можете вносить изменения. Если вы хотите реализовать такой сценарий — вам нужно настроить Secure SSO.
Структура объекта User выглядит следующим образом:

GET /api/v1/users/:id 
Этот маршрут возвращает одного пользователя по id.



Vote Structure 
Объект Vote представляет собой голос, оставленный пользователем.
Связь между комментариями и vote определяется через commentId.
Структура объекта Vote следующая:

GET /api/v1/votes 
Голоса должны извлекаться по urlId.
Типы голосов
Существует три типа голосов:
- Авторизованные голоса, которые применяются к соответствующему комментарию. Вы можете создавать их через этот API.
- Авторизованные голоса, которые в ожидании подтверждения, и поэтому ещё не применены к комментарию. Они создаются, когда пользователь использует FastComments.com вход для голосования.
- Анонимные голоса, которые применяются к соответствующему комментарию. Они создаются вместе с анонимными комментариями.
Они возвращаются в отдельных списках в API для уменьшения путаницы.



Примечания по анонимным голосам
Обратите внимание, что анонимные голоса, созданные через этот API, будут появляться в списке appliedAuthorizedVotes. Они считаются авторизованными, поскольку были созданы через API с использованием API-ключа.
Структура appliedAnonymousVotes предназначена для голосов, созданных без электронной почты, API-ключа и т.д.
GET /api/v1/votes/for-user 
Позволяет получить голоса, оставленные пользователем для указанного urlId. Принимает userId, который может относиться к пользователю FastComments.com или к SSO User.
Это полезно, если вы хотите показать, проголосовал ли пользователь за комментарий. При получении комментариев просто вызовите этот API одновременно для пользователя с тем же urlId.
Если вы используете анонимное голосование, то вместо этого передайте anonUserId.


Обратите внимание, что анонимные голоса будут отображаться в списке appliedAuthorizedVotes. Они считаются авторизованными, поскольку были созданы через API с использованием API key.


POST /api/v1/votes 
Этот маршрут предоставляет возможность добавить один авторизованный Vote. Голоса могут быть up (+1) или down (-1).




Создание анонимных голосов
Анонимные голоса можно создать, указав anonUserId в параметрах запроса вместо userId.
Этот идентификатор не обязательно должен соответствовать объекту пользователя где-либо (отсюда — анонимность). Он просто является идентификатором для сессии, поэтому вы можете снова получить голоса в той же сессии, чтобы проверить, был ли за комментарий отдан голос.
Если у вас нет такой вещи, как "анонимные сессии", как у FastComments, - вы можете просто задать это случайным идентификатором, например UUID (хотя мы ценим более короткие идентификаторы для экономии места).
Другие примечания
- Этот API подчиняется настройкам на уровне тенанта. Например, если вы отключите голосование для данной страницы и попытаетесь создать голос через API, это завершится ошибкой с кодом
voting-disabled. - Этот API активен по умолчанию.
- Этот API обновит поле
votesсоответствующегоComment.
DELETE /api/v1/votes/:id 
Этот маршрут предоставляет возможность удалить один Vote.



Примечания:
- Этот API соблюдает настройки на уровне арендатора. Например, если вы отключите голосование для определённой страницы, и вы попытаетесь создать голос через API, это завершится ошибкой с кодом
voting-disabled. - Этот API по умолчанию активен.
- Этот API обновит
votesсоответствующегоComment.
DomainConfig Structure 
Объект DomainConfig представляет конфигурацию домена для тенанта.
Структура объекта DomainConfig выглядит следующим образом:


Для аутентификации
Конфигурация домена используется для определения того, какие сайты могут размещать виджет FastComments для вашего аккаунта. Это базовая форма аутентификации, а это значит, что добавление или удаление любой конфигурации домена может повлиять на доступность вашей установки FastComments в продакшене.
Не удаляйте и не обновляйте свойство domain объекта Domain Config для домена, который в данный момент используется, если только вы не намерены отключить этот домен.
Это поведение аналогично удалению домена на странице /auth/my-account/configure-domains.
Также обратите внимание, что удаление домена через интерфейс My Domains удалит любую соответствующую конфигурацию для этого домена, которая могла быть добавлена через этот интерфейс.
Для настройки email
Ссылка для отписки в подвале письма, а также функция отписки в один клик, предлагаемая многими почтовыми клиентами, могут быть настроены через этот API путем определения footerUnsubscribeURL и emailHeaders соответственно.
Для DKIM
После определения ваших DKIM DNS-записей просто обновите DomainConfig вашей конфигурацией DKIM, используя определенную структуру.
GET /api/v1/domain-configs 
Этот API предоставляет возможность получить все объекты DomainConfig для тенанта.



GET /api/v1/domain-configs/:domain 
Отдельные DomainConfig можно получить по соответствующему domain.



POST /api/v1/domain-configs 
Эта конечная точка API позволяет создавать конфигурации доменов.
Добавление конфигурации для домена авторизует этот домен для аккаунта FastComments.
Типичные случаи использования этого API — начальная настройка (если требуется добавить много доменов) или кастомная конфигурация параметров отправки электронной почты.



PATCH /api/v1/domain-configs/:domain 
Этот API-эндпоинт позволяет обновить конфигурацию домена, указав только домен и атрибут, который нужно обновить.



PUT /api/v1/domain-configs/:domain 
Этот конечный пункт API предоставляет возможность заменить конфигурацию домена.



DELETE /api/v1/domain-configs/:domain 
Этот маршрут обеспечивает удаление одного объекта DomainConfig по идентификатору.
- Примечание: Удаление
DomainConfigлишит домен авторизации на использование FastComments. - Примечание: Повторное добавление домена через UI пересоздаст объект (с заполненным только полем
domain).



QuestionConfig Structure 
FastComments предоставляет способ создания вопросов и агрегации их результатов. Пример вопроса (в дальнейшем называемого QuestionConfig) может быть рейтингом в виде звезд, ползунком или вопросом NPS (определяется через type).
Данные вопросов можно агрегировать по отдельности, вместе, по времени, в целом, по странице и т.д.
Фреймворк предоставляет все возможности, необходимые для создания клиентских виджетов (с вашим сервером перед этим API), административных панелей и инструментов отчетности.
Сначала нужно определить QuestionConfig. Структура выглядит следующим образом:

GET /api/v1/question-configs 
Этот маршрут возвращает до 100 QuestionConfig объектов за раз, с пагинацией. Стоимость — 1 за каждые 100 объектов. Они отсортированы по тексту вопроса в порядке возрастания (поле question).



GET /api/v1/question-configs/:id 
Этот маршрут возвращает один QuestionConfig по его id.



POST /api/v1/question-configs 
Этот API-эндпойнт предоставляет возможность создать QuestionConfig.



PATCH /api/v1/question-configs/:id 
Этот маршрут предоставляет возможность обновить один QuestionConfig.
Ниже представлена структура со всеми значениями, которые можно изменить:




DELETE /api/v1/question-configs/:id 
Этот маршрут обеспечивает удаление QuestionConfig по id.
Это удалит все соответствующие результаты вопросов (но не комментарии). Это часть высокого расхода кредитов.



QuestionResult Structure 
Чтобы сохранить результаты по вопросам, вы создаёте QuestionResult. Затем вы можете агрегировать результаты вопросов, а также привязывать их к комментариям в целях отчётности.

GET /api/v1/question-results 
Этот маршрут возвращает до 1000 объектов QuestionResults за раз, с постраничной разбивкой. Стоимость — 1 за каждые 100 объектов. Они
отсортированы по createdAt в порядке возрастания. Вы можете фильтровать по различным параметрам.



GET /api/v1/question-results/:id 
Этот маршрут возвращает один QuestionResult по его id.



POST /api/v1/question-results 
Этот API-эндпоинт позволяет создать QuestionResult.



PATCH /api/v1/question-results/:id 
Этот маршрут предоставляет возможность обновить один QuestionResult.
Следующая структура представляет все значения, которые можно изменить:




DELETE /api/v1/question-results/:id 
Этот маршрут предоставляет удаление QuestionResult по id.



GET /api/v1/question-results-aggregate 
Это место, где выполняется агрегирование результатов.
Структура ответа агрегации выглядит следующим образом:

Ниже перечислены параметры запроса, доступные для агрегации:

Пример запроса:

Пример ответа:


Примечания по производительности
- При промахе кэша агрегация обычно занимает пять секунд на миллион результатов.
- В противном случае запросы выполняются за постоянное время.
Примечания по кэшированию и стоимости
- Когда указан
forceRecalculate, стоимость всегда равна10, вместо обычных2. - Если кэш истекает и данные пересчитываются, стоимость по-прежнему составляет постоянные
2, еслиforceRecalculateне указан. Срок жизни кэша зависит от объема агрегируемого набора данных (может варьироваться от 30 секунд до 5 минут). - Это сделано для стимулирования использования кэша.
GET /api/v1/question-results-aggregate/combine/comments 
Здесь происходит объединение результатов с комментариями. Полезно, например, для создания графика «недавних положительных и отрицательных комментариев» для продукта.
Вы можете выполнять поиск по диапазону значений (включительно), по одному или нескольким вопросам, а также по начальной дате (включительно).
Структура ответа выглядит следующим образом:

Вот параметры запроса, доступные для агрегации:

Пример запроса:

Пример ответа:


Примечания о кэшировании и стоимости
- Если указан параметр
forceRecalculate, стоимость всегда составляет10вместо обычных2. - Если кэш истёк и данные пересчитываются, стоимость остаётся постоянной —
2, еслиforceRecalculateне указан. - Это сделано для стимулирования использования кэша.
UserBadge Structure 
UserBadge — объект, который представляет бейдж, присвоенный пользователю в системе FastComments.
Бейджи могут присваиваться пользователям автоматически на основе их активности (таких как количество комментариев, время ответа, статус ветерана) или вручную администраторами сайта.
Структура объекта UserBadge следующая:

GET /api/v1/user-badges 
Этот endpoint позволяет получить пользовательские значки по различным критериям.
Пример запроса:
Run 
Вы можете добавить различные query-параметры для фильтрации результатов:
userId- Получить значки для конкретного пользователяbadgeId- Получить экземпляры определенного значкаtype- Фильтровать по типу значка (0=CommentCount, 1=CommentUpVotes, 2=CommentReplies, etc. See UserBadge structure for full list)displayedOnComments- Фильтровать по тому, отображается ли значок в комментариях (true/false)limit- Максимальное количество возвращаемых значков (по умолчанию 30, макс. 200)skip- Количество значков для пропуска (для пагинации)
Пример ответа:

Возможные ответы с ошибкой:


GET /api/v1/user-badges/:id 
Этот endpoint позволяет получить конкретный бейдж пользователя по его уникальному ID.
Example Request:
Run 
Example Response:

Possible Error Responses:


POST /api/v1/user-badges 
Этот конечный пункт API позволяет создать новое назначение значка пользователю.
Пример запроса:
Run 
Тело запроса должно содержать следующие параметры:
userId(обязательный) - ID пользователя, которому присваивается значокbadgeId(обязательный) - ID присваиваемого значкаdisplayedOnComments(необязательный) - Отображать ли значок в комментариях пользователя (по умолчанию true)
Важные примечания:
- Значок должен существовать и быть включённым в каталоге значков вашего тенанта
- Вы можете присваивать значки только пользователям, которые принадлежат вашему тенанту или оставляли комментарии на вашем сайте
Пример ответа:

Возможные ответы с ошибкой:





PUT /api/v1/user-badges/:id 
Этот endpoint позволяет обновить назначение бейджа пользователя.
В настоящее время единственное свойство, которое можно обновить — displayedOnComments, которое управляет тем, отображается ли бейдж на комментариях пользователя.
Пример запроса:
Run 
Пример ответа:

Возможные ответы с ошибками:



DELETE /api/v1/user-badges/:id 
Этот эндпоинт позволяет удалить назначение значка пользователя.
Пример запроса:
Run 
Пример ответа:

Возможные ответы об ошибках:



UserBadgeProgress Structure 
UserBadgeProgress — объект, представляющий прогресс пользователя в получении различных значков в системе FastComments.
Это отслеживание помогает определить, когда пользователи должны автоматически получать значки на основе их активности и участия в вашем сообществе.
Структура объекта UserBadgeProgress выглядит следующим образом:

GET /api/v1/user-badge-progress 
Этот endpoint позволяет получить записи прогресса значков пользователей по различным критериям.
Пример запроса:
Run 
Вы можете добавить различные параметры запроса для фильтрации результатов:
userId- Получить прогресс для конкретного пользователяlimit- Максимальное количество записей для возврата (по умолчанию 30, максимум 200)skip- Количество записей для пропуска (для постраничной навигации)
Пример ответа:

Возможные ответы с ошибками:


GET /api/v1/user-badge-progress/:id 
Этот конечный API-эндпоинт позволяет получить конкретную запись прогресса значка пользователя по её уникальному ID.
Пример запроса:
Run 
Пример ответа:

Возможные ответы об ошибках:


GET /api/v1/user-badge-progress/user/:userId 
Этот endpoint позволяет получить запись о прогрессе бейджа пользователя по его user ID.
Пример запроса:
Run 
Пример ответа:

Возможные ответы с ошибкой:



В заключение
Мы надеемся, что вы сочли нашу документацию по API подробной и понятной. Если вы обнаружите какие-либо пробелы, сообщите нам ниже.