
Язык 🇷🇺 Русский
Ресурсы API
Агрегации
Журналы аудита
Комментарии
Шаблоны электронной почты
Хэштеги
Модераторы
Счётчик уведомлений
Уведомления
Страницы
Ожидающие события вебхуков
SSO-пользователи
Подписки
Ежедневное использование тенанта
Тенанты
Пакеты тенанта
Пользователи тенанта
Пользователи
Голоса
Конфигурации доменов
Конфигурации вопросов
Результаты вопросов
Агрегация результатов вопросов
Значки пользователей
Прогресс значка пользователя
FastComments API
FastComments предоставляет API для взаимодействия со множеством ресурсов. Создавайте интеграции с нашей платформой или даже разрабатывайте собственные клиенты!
В этой документации вы найдёте все ресурсы, поддерживаемые API, задокументированные с их типами запросов и ответов.
Для корпоративных клиентов весь доступ к API фиксируется в журнале аудита.
Сгенерированные SDK
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
Аутентификация
API аутентифицируется путём передачи вашего ключа API либо в заголовке X-API-KEY, либо в параметре запроса API_KEY. Вам также понадобится ваш tenantId для выполнения вызовов API. Его можно получить на той же странице, что и ваш ключ API.
Примечание по безопасности
Эти маршруты предназначены для вызова с сервера. НЕ вызывайте их из браузера. В противном случае ваш ключ API будет раскрыт — это предоставит полный доступ к вашему аккаунту любому, кто сможет просмотреть исходный код страницы!
Вариант аутентификации №1 - Заголовки
- Заголовок:
X-API-KEY - Заголовок:
X-TENANT-ID
Вариант аутентификации №2 - Параметры запроса
- Параметр запроса:
API_KEY - Параметр запроса:
tenantId
Ресурсы API 
Использование ресурсов
Следует отметить, что получение данных из API учитывается как использование на вашем аккаунте.
Каждый ресурс в своём разделе указывает, что именно считается использованием.
Некоторые ресурсы обходятся дороже, чем другие. Каждая конечная точка имеет установленную стоимость в кредитах за вызов API. Для некоторых конечных точек количество кредитов варьируется в зависимости от опций и размеров ответа.
Использование API можно проверить на странице Аналитика выставления счетов — данные обновляются каждые несколько минут.
Примечание!
Мы рекомендуем сначала прочитать документацию Pages, чтобы уменьшить путаницу при определении того, какие значения передавать для urlId в Comment API.
Агрегируйте ваши данные 
Этот 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 — объект, представляющий аудируемое событие для арендаторов, имеющих доступ к этой функции.
Структура объекта AuditLog выглядит следующим образом:

Журнал аудита неизменяем. В него также нельзя записывать вручную. FastComments.com может принимать решение только о том, когда записывать в журнал аудита. Тем не менее, вы можете считывать его через этот API.
События в журнале аудита истекают через два года.
GET /api/v1/audit-logs 
Этот API использует пагинацию, предоставляемую параметрами skip, before и after. Журналы аудита возвращаются страницами по 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 используется для получения комментариев для отображения пользователю. Например, он автоматически фильтрует неодобренные или спам-комментарии.
Пагинация
Пагинация может выполняться одним из двух способов, в зависимости от требований к производительности и сценария использования:
- Самый быстрый: Precalculated Pagination:
- Так работает FastComments, когда вы используете наши преднастроенные виджеты и клиенты.
- Нажатие "next" просто увеличивает номер страницы.
- Можно считать, что данные извлекаются из key-value хранилища.
- В этом случае просто определите параметр
page, начиная с0, и направление сортировки черезdirection. - Размеры страниц можно настраивать через правила кастомизации.
- Самый гибкий: Flexible Pagination:
- В этом случае вы можете задать пользовательские параметры
limitиskip. Не передавайтеpage. - Поддерживается также направление сортировки
direction. limit— это общее количество возвращаемых элементов после примененияskip.- Пример: установите
skip = 200, limit = 100, когдаpage size = 100иpage = 2.
- Пример: установите
- Дочерние комментарии всё ещё учитываются в пагинации. Вы можете обойти это, используя опцию
asTree.- Вы можете пагинировать дочерние комментарии через
limitChildrenиskipChildren. - Вы можете ограничить глубину возвращаемых веток через
maxTreeDepth.
- Вы можете пагинировать дочерние комментарии через
- В этом случае вы можете задать пользовательские параметры
Треды
- При использовании
Precalculated Paginationкомментарии группируются по странице, и комментарии в тредах влияют на общую страницу.- Таким образом, треды могут быть определены на клиенте на основе
parentId. - Например, на странице с одним комментарием верхнего уровня и 29 ответами, при установке
page=0в API — вы получите только корневой комментарий и 29 детей. - Примерное изображение, иллюстрирующее несколько страниц.
- Таким образом, треды могут быть определены на клиенте на основе
- При использовании
Flexible Paginationвы можете задать параметрparentId.- Установите его в null, чтобы получить только комментарии верхнего уровня.
- Затем, чтобы просмотреть треды, вызовите API снова и передайте
parentId. - Распространённое решение — сделать вызов API для комментариев верхнего уровня, а затем параллельно сделать вызовы API, чтобы получить комментарии для детей каждого комментария.
- NEW As of Feb 2023! Получайте в виде дерева, используя
&asTree=true.- Можно считать это
Flexible Pagination as a Tree. - В пагинации учитываются только комментарии верхнего уровня.
- Установите
parentId=null, чтобы начать дерево с корня (вы должны задатьparentId). - Установите
skipиlimitдля пагинации. - Установите
asTreeвtrue. - Стоимость в кредитах увеличивается в
2x, так как наш бэкенд выполняет гораздо больше работы в этом сценарии. - При необходимости задайте
maxTreeDepth,limitChildrenиskipChildren.
- Можно считать это
Объяснение деревьев
При использовании asTree может быть сложно понять пагинацию. Вот полезная графика:
Получение комментариев в контексте пользователя
API /comments можно использовать в двух контекстах, для разных сценариев использования:
- Для возврата комментариев, отсортированных и помеченных информацией для построения собственного клиента.
- В этом случае определите параметр запроса
contextUserId.
- В этом случае определите параметр запроса
- Для получения комментариев с вашего бэкенда для кастомных интеграций.
- Платформа по умолчанию будет работать в этом режиме без
contextUserId.
- Платформа по умолчанию будет работать в этом режиме без




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

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

Однако в вашем UI может потребоваться знать, показывать ли кнопку "показать ответы" для
каждого комментария. При получении комментариев в виде дерева к комментариям добавляется свойство 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-эндпоинт предоставляет возможность обновления одного комментария.
Примечания:
- Этот 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 может обновлять виджет комментариев "в реальном времени", если требуется (это увеличивает
creditsCostс1до2). - Этот API удалит все дочерние комментарии.



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) не могут быть заблокированы — будет возвращена ошибка.




Структура шаблона электронной почты 
Объект 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 по идентификатору.



Структура хэштега 
A HashTag object represents a tag that can be left by a user. HashTags can be used to link to an external piece of content or to
tie related comments together.
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, письмо с приглашением поможет ему настроиться. Если у него уже есть аккаунт, ему будет предоставлен доступ модератора к вашему тенанту и поле 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.



Структура счётчика уведомлений 
Объект 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), связанные с вашей учетной записью. Если вам нужна более точная фильтрация при поиске, свяжитесь с нами.



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



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



Примечание
Некоторые параметры в объекте Page обновляются автоматически. Это счётчики и атрибуты title. Счётчики нельзя обновить через API, так как это вычисляемые значения. Значение страницы title можно задать через API, но оно будет перезаписано, если виджет комментариев используется на странице с тем же urlId и другим заголовком страницы.
POST /api/v1/pages 
This API endpoint provides the ability to create pages.
Одним из распространённых случаев использования является контроль доступа.
Notes:
- If you've commented on a comment thread, or called the API to create a
Comment, you've already created aPageobject! You can try fetching it via the/by-url-idPageroute, passing in the sameurlIdpassed to the comment widget. - The
Pagestructure contains some calculated values. Currently, these arecommentCountandrootCommentCount. They are populated automatically and cannot be set by the API. Attempting to do so will cause the API to return an error.



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



Структура ожидающего события вебхука 
Объект PendingWebhookEvent представляет собой поставленное в очередь событие вебхука, ожидающее обработки.
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-пользователи тарифицируются по-разному в зависимости от их флагов разрешений:
- Regular SSO Users: Пользователи без прав администратора или модератора тарифицируются как обычные SSO-пользователи
- SSO Admins: Пользователи с флагами
isAccountOwnerилиisAdminAdminтарифицируются отдельно как SSO Admins (по той же ставке, что и обычные администраторы тенанта) - SSO Moderators: Пользователи с флагом
isCommentModeratorAdminтарифицируются отдельно как SSO Moderators (по той же ставке, что и обычные модераторы)
Важно: Чтобы предотвратить двойное выставление счетов, система автоматически дедуплицирует SSO-пользователей по отношению к обычным пользователям и модераторам тенанта по адресу электронной почты. Если у SSO-пользователя тот же email, что у обычного пользователя или модератора тенанта, он не будет оплачивать дважды.
Управление доступом
Пользователей можно разделять на группы. Для этого и служит поле groupIds, и оно опционально.
@Mentions
По умолчанию при вводе символа @ поиск для @mentions использует username для поиска других sso-пользователей. Если используется displayName, то результаты, соответствующие
username, будут игнорироваться при наличии совпадения по displayName, и результаты поиска для @mention будут использовать displayName.
Подписки
В FastComments пользователи могут подписаться на страницу, нажав на значок колокольчика в виджете комментариев и выбрав Subscribe.
Для обычного пользователя мы отправляем уведомления по электронной почте в соответствии с его настройками уведомлений.
Для SSO-пользователей мы разделяем это ради обратной совместимости. Дополнительные письма с уведомлениями о подписке будут отправляться только в том случае, если вы установите optedInSubscriptionNotifications в true.
Значки
Вы можете назначать значки SSO-пользователям с помощью свойства badgeConfig. Значки — это визуальные индикаторы, которые отображаются рядом с именем пользователя в комментариях.
badgeIds- Массив ID значков, которые нужно назначить пользователю. Они должны быть действительными ID значков, созданных в вашей учётной записи FastComments. Ограничение — до 30 значков.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
- badgesisDeleted и isDeletedUser устанавливаются в true.
При отрисовке виджет комментариев будет использовать DELETED_USER_PLACEHOLDER (по умолчанию: "[deleted]") для имени пользователя и DELETED_CONTENT_PLACEHOLDER для комментария. Их можно настроить через интерфейс настройки виджета (Widget Customization UI).
Примеры



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

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



Структура тенанта 
The Tenant определяет клиента FastComments.com. Их можно создавать через API арендаторами с доступом white-label. Тенанты с white-label
не могут создавать других тенантов с white-label (разрешён только один уровень вложенности).
The structure for the Tenant object is as follows:

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.



Структура пакета тенанта 
The TenantPackage определяет информацию о пакете, доступном для Tenant. У арендатора может быть несколько доступных пакетов, но в любой момент времени используется только один.
A Tenant cannot be used for any products until its packageId points to a valid TenantPackage.
There are two types of TenantPackage objects:
- Fixed-pricing packages - where
hasFlexPricingis false. - Flexible pricing - where
hasFlexPricingis true.
In both case limits are defined on the account using the package, however with Flex the tenant is charged a base price plus
what they used, defined by the flex* parameters.
A tenant may have multiple tenant packages and have the ability to change the package themselves from the Страница сведений о биллинге.
If you will be handling billing for tenants yourselves, you will still need to define a package for each tenant to define their limits. Simply set billingHandledExternally to true on the Tenant and they
will not be able to change their billing information, or active package, themselves.
You may not create packages with higher limits than the parent tenant.
The structure for the TenantPackage object is as follows:

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.



Структура пользователя тенанта 
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 по id.
Удаление комментариев пользователя возможно через параметр запроса deleteComments. Обратите внимание, что если он установлен в true:
- Все комментарии пользователя будут удалены в реальном времени.
- Все child (теперь сиротские) комментарии будут удалены или анонимизированы в соответствии с конфигурацией страницы, связанной с каждым комментарием. Например, если режим удаления ветки установлен в "anonymize", то ответы останутся, а комментарии пользователя будут анонимизированы. Это применяется только когда
commentDeleteModeравенRemove(значение по умолчанию). creditsCostстановится2.
Anonymized Comments
Вы можете сохранить комментарии пользователя, просто анонимизировав их, установив 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 (Например: Администраторы)
- 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 представляет собой голос, оставленный пользователем.
Связь между комментариями и 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 представляет конфигурацию домена для тенанта.
Структура объекта DomainConfig выглядит следующим образом:


Для аутентификации
Конфигурация домена используется для определения, какие сайты могут размещать виджет 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 
Отдельные 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 по id.
- Note: Removing a
DomainConfigwill un-authorize that domain from using FastComments. - Note: Re-adding a domain via the UI will recreate the object (with just
domainpopulated).



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

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 
Здесь происходит объединение результатов с комментариями. Полезно, например, для создания "recent positive and negative comments" графика для продукта.
Вы можете выполнять поиск по диапазону значений (включительно), по одному или нескольким вопросам и по дате начала (включительно).
The response structure is as follows:

Here are the query parameters available for aggregation:

Here's an example request:

Example response:


Примечания по кэшированию и стоимости
- When
forceRecalculateis specified the cost is always10, instead of the normal2. - If the cache expires and data is recalculated, the cost is still a constant
2ifforceRecalculateis not specified. - Это сделано для стимулирования использования кэша.
Структура значка пользователя 
UserBadge — это объект, который представляет значок, присвоенный пользователю в системе FastComments.
Значки могут присваиваться пользователям автоматически на основе их активности (например, количества комментариев, времени ответа, статуса ветерана) или вручную администраторами сайта.
Структура объекта UserBadge выглядит следующим образом:

GET /api/v1/user-badges 
Этот endpoint позволяет получить пользовательские бейджи по различным критериям.
Пример запроса:
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.
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 — объект, представляющий прогресс пользователя в получении различных значков в системе FastComments.
Это отслеживание помогает определить, когда пользователи должны автоматически получать значки на основе их активности и участия в вашем сообществе.
Структура объекта UserBadgeProgress выглядит следующим образом:

GET /api/v1/user-badge-progress 
Эта конечная точка позволяет получать записи прогресса по значкам пользователей по различным критериям.
Пример запроса:
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 подробной и понятной. Если вы обнаружите какие-либо пробелы, сообщите нам ниже.