
Язык 🇺🇦 Русский (Украина)
Ресурсы API
Агрегации
Журналы аудита
Комментарии
Шаблоны писем
Хэштеги
Модераторы
Счётчик уведомлений
Уведомления
Страницы
Ожидающие события вебхука
SSO-пользователи
Подписки
Ежедневное использование тенанта
Тенанты
Пакеты тенанта
Пользователи тенанта
Пользователи
Голоса
Конфигурации домена
Конфигурации вопросов
Результаты вопросов
Агрегация результатов вопросов
Значки пользователей
Прогресс значка пользователя
The FastComments API
FastComments предоставляет API для взаимодействия с множеством ресурсов. Создавайте интеграции с нашей платформой или даже пишите собственных клиентов!
В этой документации вы найдёте все поддерживаемые API ресурсы с описанием типов запросов и ответов.
Для корпоративных клиентов весь доступ к API фиксируется в журнале аудита.
Generated SDKs
FastComments теперь генерирует Спецификация API из нашего кода (это ещё не завершено, но включает многие 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
Authentication
Доступ к API осуществляется путём передачи вашего API-ключа либо в заголовке X-API-KEY, либо в параметре запроса API_KEY. Для вызова API вам также понадобится ваш tenantId
— его можно получить на той же странице, что и ваш API-ключ.
Security Note
Эти маршруты предназначены для вызова с сервера. НЕ вызывайте их из браузера. В противном случае вы выставите ваш API-ключ — это даст полный доступ к вашей учётной записи любому, кто может просмотреть исходный код страницы!
Authentication Option One - Headers
- Header:
X-API-KEY - Header:
X-TENANT-ID
Authentication Option Two - Query Parameters
- Query Param:
API_KEY - Query Param:
tenantId
Ресурсы API 
Использование ресурсов
Следует учитывать, что запросы данных через API засчитываются как использование на вашем аккаунте.
Для каждого ресурса в его разделе указано, какое именно использование учитывается.
Некоторые ресурсы обходятся дороже, чем другие. Каждый endpoint имеет фиксированную стоимость в кредитах за вызов API. Для некоторых endpoint'ов количество кредитов варьируется в зависимости от опций и размера ответа.
Статистика использования API доступна на странице Аналитика биллинга и обновляется каждые несколько минут.
Примечание!
Рекомендуем сначала прочитать документацию Pages, чтобы снизить путаницу при определении значений, которые нужно передавать для urlId в Comment API.
Агрегирование данных 
Этот API агрегирует документы, группируя их (если указан groupBy) и применяя несколько операций. Поддерживаются различные операции (например, sum, countDistinct, avg и т.д.).
Стоимость — переменная. Каждые 500 просканированных объектов стоят 1 API-кредит.
По умолчанию максимально допустимый объём памяти на один вызов API — 64MB, и по умолчанию одновременно может выполняться только одна агрегация. Если вы отправите несколько агрегаций одновременно, они будут поставлены в очередь и выполнены в порядке отправки. Ожидающие агрегации будут ждать максимум 60 секунд, после этого запрос истечёт по таймауту. Отдельные агрегации могут выполняться до 5 минут.
Если у вас есть управляемые тенанты, вы можете агрегировать все ресурсы дочерних тенантов в одном вызове, передав query-параметр 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 представляет собой запись об аудируемом событии для тенантов, у которых есть доступ к этой функции.
Структура объекта AuditLog выглядит следующим образом:

Журнал аудита является неизменяемым. В него также нельзя записывать вручную. Только FastComments.com может решать, когда записывать в журнал аудита. Тем не менее, вы можете читать его через этот API.
События в журнале аудита истекают через два года.
GET /api/v1/audit-logs 
Этот API использует пагинацию, обеспечиваемую параметрами skip, before и after. AuditLogs возвращаются страницами по 1000, отсортированными по when и id.
Получение каждых 1000 логов стоит 10 кредитов.
По умолчанию вы получите список с самыми новыми элементами первыми. Так вы можете опрашивать, начиная с skip=0, переходя по страницам до тех пор, пока не найдёте последнюю запись, которую вы уже обработали.
В качестве альтернативы можно сортировать по старым записям сначала и постранично получать записи, пока они не закончатся.
Сортировку можно задать установкой order в ASC или DESC. По умолчанию ASC.
Запросы по дате возможны с помощью before и after в виде меток времени с миллисекундами. before и after НЕ включительны.



Структура комментария 
Объект 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 используется для получения комментариев для отображения пользователю. Например, он автоматически фильтрует неподтверждённые или спам-комментарии.
Pagination
Пагинация может выполняться одним из двух способов, в зависимости от требований к производительности и сценария использования:
- Fastest: Precalculated Pagination:
- Так работает FastComments, когда вы используете наши предустановленные виджеты и клиенты.
- Нажатие "next" просто увеличивает номер страницы.
- Вы можете думать об этом как о получении из key-value хранилища.
- Таким образом, просто определите параметр
page, начиная с0, и направление сортировки вdirection. - Размеры страниц можно настраивать через правила кастомизации.
- Most Flexible: 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 дочерних. - Example image here illustrating multiple pages.
- Таким образом, треды могут определяться на клиенте по
- При использовании
Flexible Paginationвы можете задать параметрparentId.- Установите его в null, чтобы получить только комментарии верхнего уровня.
- Затем, чтобы просмотреть треды, вызовите API снова и передайте
parentId. - Распространённое решение — вызвать API для получения комментариев верхнего уровня, а затем параллельно сделать вызовы API для получения комментариев для детей каждого комментария.
- NEW As of Feb 2023! Fetch as a tree using
&asTree=true.- Вы можете рассматривать это как
Flexible Pagination as a Tree. - В пагинацию учитываются только комментарии верхнего уровня.
- Установите
parentId=null, чтобы начать дерево с корня (вы должны задатьparentId). - Установите
skipиlimitдля пагинации. - Установите
asTreeвtrue. - Стоимость в кредитах увеличивается в
2x, так как наш бэкенд должен выполнить гораздо больше работы в этом сценарии. - Задайте
maxTreeDepth,limitChildrenиskipChildrenпо необходимости.
- Вы можете рассматривать это как
Trees Explained
При использовании asTree иногда сложно понять, как работает пагинация. Вот наглядная схема:
Fetching Comments in The Context of a User
API /comments может использоваться в двух контекстах, для разных сценариев использования:
- Для возврата комментариев с сортировкой и метаданными для построения собственного клиента.
- В этом случае определите параметр запроса
contextUserId.
- В этом случае определите параметр запроса
- Для получения комментариев с вашего бэкенда для кастомных интеграций.
- Платформа по умолчанию будет использовать этот сценарий без
contextUserId.
- Платформа по умолчанию будет использовать этот сценарий без




Get Comments as a Tree
Возможно получить комментарии в виде дерева, при этом в пагинацию учитываются только комментарии верхнего уровня.

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

Однако в вашем UI может понадобиться знать, показывать ли кнопку "показать ответы" для каждого комментария. При получении комментариев в виде дерева к комментариям добавляется свойство hasChildren, когда это применимо.
Get Comments as a Tree, Searching by Hash Tag
Можно выполнять поиск по хештегу через API по всему вашему тенанту (не ограничиваясь одной страницей или urlId).
В этом примере мы опускаем urlId и ищем по нескольким хештегам. API вернёт только комментарии, которые содержат все запрошенные хештеги.

All Request Params

The Response

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



POST /api/v1/comments 
This API endpoint provides the ability to create comments.
Common use cases are custom UIs, integrations, or imports.
Notes:
- This API can update the comment widget "live" if desired (this increases
creditsCostfrom1to2). - This API will automatically create user objects in our system if email is provided.
- Trying to save two comments with different emails, but the same username, will result in an error for the second comment.
- If you are specifying
parentId, and a child comment hasnotificationSentForParentas false, we will send notifications for the parent comment. This is done every hour (we batch the notifications together to decrease the number of emails sent). - If you want to send welcome emails when creating users, or comment verification emails, set
sendEmailstotruein query parameters. - Comments created via this API will show up in the Analytics and Moderation pages of the admin app.
- "bad words" are still masked in the commenter names and comment text if the setting is turned on.
- Comments created via this API can still be checked for spam if desired.
- Configuration such as max comment length, if configured via the Customization Rule admin page, will apply here.
The minimum data required to submit that will show in the comment widget, is as follows:

A more realistic request may look like:



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



DELETE /api/v1/comments/:id 
Этот конечный пункт API позволяет удалить комментарий.
Примечания:
- Этот API может обновлять виджет комментариев "live", если требуется (это увеличивает
creditsCostс1до2). - Этот API удалит все дочерние комментарии.



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

Для анонимной пометки необходимо указать 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 Users, SSO Users и Tenant Users.
Поддерживается параметр тела 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. - Полностью анонимные комментарии (без идентификатора пользователя и без e-mail) не могут быть заблокированы — будет возвращена ошибка.




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

Примечания
- Вы можете получить допустимые значения
emailTemplateIdчерез endpoint/definitions. - Endpoint
/definitionsтакже содержит переводы по умолчанию и тестовые данные. - Сохранение шаблона не удастся при неверной структуре или некорректных тестовых данных.
GET /api/v1/email-templates/:id 
Отдельные EmailTemplate можно получить по соответствующему 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 времени рендеринга <5 мс, поэтому если вы достигаете 500 мс — что-то не так.
- Ваш шаблон должен успешно рендериться с заданным
testData, чтобы его можно было сохранить. Ошибки рендеринга агрегируются и отображаются на панели управления (скоро будет доступно через API).
Минимальные данные, необходимые для добавления шаблона, приведены ниже:

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



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



DELETE /api/v1/email-templates/:id 
Этот маршрут обеспечивает удаление одного EmailTemplate по id.



Структура хэштега 
Объект HashTag представляет собой метку, которую может оставить пользователь. HashTags могут использоваться для ссылки на внешний фрагмент контента или для
объединения связанных комментариев.
The structure for the HashTag object is as follows:

Notes:
- In some API endpoints you will see that the hashtag is used in the URL. Remember to URI-Encoded values. For example,
#should instead be represented as%23. - Some of these fields are marked
READONLY- these are returned by the API but cannot be set.
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 не отключено, хэштеги могут быть воссозданы пользователем, указавшим хэштег при комментировании.



Структура модератора 
Объект Moderator представляет конфигурацию модератора.
Существует три типа модераторов:
- Пользователи-администраторы, у которых установлен флаг
isCommentModeratorAdmin. - Пользователи SSO с флагом
isCommentModeratorAdmin. - Обычные комментаторы или пользователи FastComments.com, приглашённые в качестве модераторов.
Структура Moderator используется для представления состояния модерации в случае использования 3.
Если вы хотите пригласить пользователя в качестве модератора через API, используйте API Moderator, создав объект Moderator и отправив им приглашение.
Если у пользователя нет аккаунта FastComments.com, письмо с приглашением поможет им зарегистрироваться. Если у них уже есть аккаунт, им будет предоставлен доступ модерации к вашему tenant, и свойство 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 кредит за каждые 10 возвращённых модераторов.



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



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

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



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

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


DELETE /api/v1/moderators/:id 
Этот маршрут позволяет удалить Moderator по id.



Структура счётчика уведомлений 
Объект 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 представляет уведомление для пользователя.
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 представляет страницу, к которой могут относиться многие комментарии. Эта связь определяется
urlId.
Объект Page хранит информацию, такую как заголовок страницы, количество комментариев и urlId.
Структура объекта Page выглядит следующим образом:

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



Полезный совет
The Comment API requires a urlId. You can call the Pages API first, to see what the urlId values available to you
look like.
GET /api/v1/pages/by-url-id 
Окремі сторінки можна отримати за їх відповідним urlId. Це може бути корисно для пошуку заголовків сторінок або кількості коментарів.



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



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



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



Структура ожидающего события вебхука 
A PendingWebhookEvent object represents a queued webhook event that is pending.
PendingWebhookEvent objects are created automatically and cannot be manually created via the API. They also expire after one year.
They can be deleted which removes the task from the queue.
There are different event types - check eventType (OutboundSyncEventType) and type (OutboundSyncType).
A common use case for this API is to implement custom monitoring. You may want to call the /count endpoint periodically
to poll the outstanding count for given filters.
The structure for the PendingWebhookEvent object is as follows:

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.



Структура SSO-пользователя 
FastComments надає просте у використанні рішення SSO. Оновлення інформації користувача через інтеграцію на основі HMAC так само просте, як завантаження сторінки користувачем з оновленим payload.
Однак може бути бажаним керувати користувачем поза цим потоком, щоб підвищити узгодженість вашого застосунку.
SSO User API надає спосіб CRUD-операцій для об'єктів, які ми називаємо SSOUsers. Ці об'єкти відрізняються від звичайних Users і зберігаються окремо для типобезпеки.
Структура об'єкта SSOUser виглядає так:

Білінг для SSO користувачів
SSO users оплачуються по-різному в залежності від їхніх прапорів дозволів:
- Регулярні SSO users: Користувачі без прав адміністратора або модератора оплачуються як регулярні SSO users
- SSO Admins: Користувачі з прапорами
isAccountOwnerабоisAdminAdminоплачуються окремо як SSO Admins (така ж ставка, як для звичайних адміністраторів tenant) - SSO Moderators: Користувачі з прапором
isCommentModeratorAdminоплачуються окремо як SSO Moderators (така ж ставка, як для звичайних модераторів)
Важливо: Щоб запобігти подвійній оплаті, система автоматично дедуплікує SSO users щодо звичайних tenant users і moderators за адресою електронної пошти. Якщо SSO user має той самий адресу електронної пошти, що й звичайний tenant user або moderator, він не буде оплачений двічі.
Контроль доступу
Користувачів можна розбити на групи. Саме для цього призначено поле groupIds, і воно є необов'язковим.
@Упоминания
За замовчуванням @mentions будуть використовувати username для пошуку інших sso users, коли вводиться символ @. Якщо використовується displayName, то результати, що відповідають username, будуть ігноруватися, коли знайдено відповідність для displayName, і результати пошуку @mention будуть використовувати displayName.
Підписки
У FastComments користувачі можуть підписатися на сторінку, натиснувши іконку дзвінка у віджеті коментарів і вибравши Subscribe.
Для звичайного користувача ми відправляємо їм повідомлення електронною поштою відповідно до їхніх налаштувань повідомлень.
У випадку SSO Users ми розділяємо це для зворотної сумісності. Додаткові електронні листи з повідомленнями про підписки будуть надсилатися лише якщо ви встановите optedInSubscriptionNotifications в true.
Значки
Ви можете призначати значки SSO users за допомогою властивості badgeConfig. Значки — це візуальні індикатори, які відображаються поруч із ім'ям користувача в коментарях.
badgeIds- Масив ID бейджів, які призначаються користувачу. Ці ID повинні бути дійсними ID бейджів, створених у вашому акаунті FastComments. Обмежено 30 бейджами.override- Якщо true, всі існуючі бейджі, що відображаються в коментарях, будуть замінені на вказані. Якщо false або опущено, вказані бейджі будуть додані до будь-яких існуючих бейджів.update- Якщо true, властивості відображення бейджів будуть оновлюватися з конфігурації tenant щоразу, коли користувач входить в систему.
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. Обратите внимание, что если это правда:
- Все комментарии пользователя будут удалены в реальном времени.
- Все дочерние (теперь сиротские) комментарии будут удалены или анонимизированы в зависимости от конфигурации страницы, связанной с каждым комментарием. Например, если thread deletion mode равен "anonymize", то ответы останутся, а комментарии пользователя будут анонимизированы. Это применяется только когда
commentDeleteModeустановлен вRemove(значение по умолчанию). creditsCostстановится2.
Анонимизированные комментарии
Вы можете сохранить комментарии пользователя, но просто анонимизировать их, установив commentDeleteMode=1.
Если комментарии пользователя анонимизированы, то следующие значения устанавливаются в null:
- commenterName
- commenterEmail
- avatarSrc
- userId
- anonUserId
- mentions
- badgesisDeleted и isDeletedUser устанавливаются в true.
При рендеринге виджет комментариев будет использовать DELETED_USER_PLACEHOLDER (по умолчанию: "[deleted]") для имени пользователя и DELETED_CONTENT_PLACEHOLDER для комментария. Эти значения можно настроить через UI настройки виджета (Widget Customization UI).
Примеры



Структура подписки 
Объект Subscription представляет подписку для пользователя.
Subscription объекты создаются, когда пользователь нажимает значок уведомлений в виджете комментариев и нажимает "Подписаться на эту страницу".
Подписки также можно создавать через API.
Наличие объекта Subscription вызывает создание объектов Notification и отправку электронных писем, когда на корне связанной страницы
появляются новые комментарии, для которой предназначена подписка Subscription. Отправка писем зависит от типа пользователя. Для обычных пользователей это зависит от optedInNotifications. Для SSO-пользователей это зависит от optedInSubscriptionNotifications. Обратите внимание, что в некоторых приложениях может отсутствовать понятие веб-доступной страницы, в этом случае просто установите urlId равным
идентификатору элемента, на который вы подписываетесь (то же значение для 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 представляет собой данные об использовании для тенанта за конкретный день. Если для данного тенанта в определённый
день, у этого дня не будет объекта TenantDailyUsage.
Объект TenantDailyUsage не является данными в режиме реального времени и может отставать на несколько минут от фактического использования.
Структура объекта TenantDailyUsage выглядит следующим образом:

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



Структура тенанта 
Tenant определяет клиента FastComments.com. Их можно создать через API арендаторами с доступом white-label. Арендаторы с white-label не могут создавать других арендаторов с white-label (разрешён только один уровень вложенности).
Структура объекта 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должен быть уникален среди всех tenants FastComments.com.- Вы не можете создавать tenants, если у родительского tenant не определён действительный
TenantPackage.- Если ваш tenant был создан через FastComments.com, это не должно быть проблемой.
- Вы не можете создать больше tenants, чем указано в
maxWhiteLabeledTenantsв вашем пакете. - Вы должны указать query-параметр
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должен быть уникальным среди всех тенантов FastComments.com.- При установке
billingInfoValidвtrue,billingInfoдолжен быть предоставлен в том же запросе. - Вы не можете обновлять
packageId, связанный с вашим собственным тенантом. - Вы не можете обновлять
paymentFrequency, связанный с вашим собственным тенантом.



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



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

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



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



POST /api/v1/tenant-packages 
Этот маршрут позволяет добавить один TenantPackage.
При создании TenantPackage действуют следующие ограничения:
- Требуются следующие параметры:
nametenantIdmonthlyCostUSD- Может быть null.yearlyCostUSD- Может быть null.maxMonthlyPageLoadsmaxMonthlyAPICreditsmaxMonthlyCommentsmaxConcurrentUsersmaxTenantUsersmaxSSOUsersmaxModeratorsmaxDomainshasDebrandingforWhoTextfeatureTaglineshasFlexPricing- Если true, то все параметрыflex*обязательны.
nameне может превышать50 characters.- Каждый элемент
forWhoTextне может быть длиннее200 characters. - Каждый элемент
featureTaglinesне может быть длиннее100 characters. TenantPackageдолжен быть «меньше» родительского tenant. Например, все параметрыmax*должны иметь значения меньше, чем у родительского tenant.- У white labeled tenant может быть максимум пять пакетов.
- Только tenants с доступом white labeling могут создать
TenantPackage. - Вы не можете добавлять пакеты в свой собственный tenant. :)
Мы можем создать 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.



Структура пользователя тенанта 
TenantUser определяет User, которым управляет конкретный tenant. Их аккаунт полностью контролируется tenant'ом, с которым они связаны, и его можно обновлять или удалять через UI или API.
Пользователи tenant могут быть администраторами со всеми правами и доступом к Tenant, или их доступ может быть ограничен определёнными разрешениями для модерации комментариев, доступа к API-ключам и т.д.
The structure for the TenantUser object is as follows:

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



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



POST /api/v1/tenant-users 
Этот маршрут предоставляет возможность добавить одного TenantUser.
Создание TenantUser имеет следующие ограничения:
usernameобязателен.emailобязателен.signUpDateне может быть в будущем.localeдолжен быть в списке Supported Locales.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 следующим образом:

This will send an email like Bob at TenantName is inviting you to be a moderator...


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



DELETE /api/v1/tenant-users/:id 
Этот маршрут предоставляет возможность удаления TenantUser по id.
Удаление комментариев пользователя возможно через параметр запроса deleteComments. Обратите внимание, что если он равен true:
- Все комментарии пользователя будут удалены в реальном времени.
- Все child (теперь сиротские) комментарии будут удалены или анонимизированы в зависимости от конфигурации страницы, связанной с каждым комментарием. Например, если режим удаления ветки — "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 — это объект, который представляет собой наибольший общий знаменатель всех пользователей.
Имейте в виду, что в FastComments у нас есть несколько разных сценариев использования пользователей:
- Secure SSO
- Simple SSO
- Tenant Users (For example: Administrators)
- Commenters
Этот API предназначен для Комментаторов и пользователей, созданных через Simple SSO. По сути, любой пользователь, созданный через ваш сайт, доступен через этот API. Пользователи арендатора также могут быть получены таким образом, но вы получите больше информации, взаимодействуя с API /tenant-users/.
Для Secure SSO используйте API /sso-users/.
Вы не можете обновлять эти типы пользователей. Они создали свои аккаунты через ваш сайт, поэтому мы предоставляем лишь базовый доступ только для чтения, но вы не можете вносить изменения. Если вы хотите иметь такой поток — вам нужно настроить Secure SSO.
Структура объекта User выглядит следующим образом:

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



Структура голоса 
Объект 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-ключа.


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.
Структура конфигурации домена 
A DomainConfig object представляет конфигурацию для домена для арендатора.
The structure for the DomainConfig object is as follows:


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



GET /api/v1/domain-configs/:domain 
Отдельные DomainConfigs можно получить по соответствующему 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).



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

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



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. Затем вы можете агрегировать результаты вопросов, и также
привязывать их к комментариям для целей отчётности.

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 — это объект, представляющий бейдж, присвоенный пользователю в системе FastComments.
Бейджи могут присваиваться пользователям автоматически на основе их активности (например, количества комментариев, времени ответа, статуса Veteran) или вручную администраторами сайта.
Структура объекта UserBadge выглядит следующим образом:

GET /api/v1/user-badges 
This endpoint allows you to fetch user badges based on various criteria.
Пример запроса:
Run 
Вы можете добавить различные параметры запроса для фильтрации результатов:
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.
Пример запроса:
Run 
Пример ответа:

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


POST /api/v1/user-badges 
This endpoint позволяет вам создать новое присвоение значка пользователю.
Example Request:
Run 
The request body must contain the following parameters:
userId(обязательно) - ID пользователя, которому присвоят значокbadgeId(обязательно) - ID значка для присвоенияdisplayedOnComments(необязательно) - Должен ли значок отображаться в комментариях пользователя (по умолчанию true)
Important Notes:
- Значок должен существовать и быть включён в каталог значков вашего тенанта
- Вы можете присваивать значки только пользователям, которые принадлежат вашему тенанту или оставляли комментарии на вашем сайте
Example Response:

Possible Error Responses:





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

Possible Error Responses:



DELETE /api/v1/user-badges/:id 
Этот конечный пункт API позволяет удалить назначение значка пользователя.
Example Request:
Run 
Example Response:

Possible Error Responses:



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

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

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


GET /api/v1/user-badge-progress/:id 
This endpoint allows you to fetch a specific user badge progress record by its unique ID.
Пример запроса:
Run 
Пример ответа:

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


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

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



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