FastComments.com

The FastComments API

FastComments предоставляет API для взаимодействия с множеством ресурсов. Создавайте интеграции с нашей платформой или даже пишите собственных клиентов!

В этой документации вы найдёте все поддерживаемые API ресурсы с описанием типов запросов и ответов.

Для корпоративных клиентов весь доступ к API фиксируется в журнале аудита.

Generated SDKs

FastComments теперь генерирует Спецификация API из нашего кода (это ещё не завершено, но включает многие API).

У нас также есть SDK для популярных языков:

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

Структура журнала аудита Internal Link

Объект AuditLog представляет собой запись об аудируемом событии для тенантов, у которых есть доступ к этой функции.

Структура объекта AuditLog выглядит следующим образом:

Структура AuditLog
Copy Copy
1
2interface AuditLog {
3 id: string;
4 userId?: string;
5 username?: string;
6 resourceName: string;
7 crudType: 'c' | 'r' | 'u' | 'd' | 'login';
8 from: string;
9 url?: string;
10 ip?: string;
11 when: string;
12 description?: string;
13 serverStartDate: string;
14 objectDetails?: object;
15}
16

Журнал аудита является неизменяемым. В него также нельзя записывать вручную. Только FastComments.com может решать, когда записывать в журнал аудита. Тем не менее, вы можете читать его через этот API.

События в журнале аудита истекают через два года.

Структура комментария Internal Link

Объект Comment представляет комментарий, оставленный пользователем.

Связь между родительскими и дочерними комментариями определяется через parentId.

Структура объекта Comment выглядит следующим образом:

Структура объекта Comment
Copy Copy
1
2interface Comment {
3 /** READONLY: Установлено в true, если система обнаружения спама определила комментарий как спам. **/
4 aiDeterminedSpam?: boolean
5 /** Показывается ли комментарий. При сохранении комментария устанавливается в true, иначе он будет скрыт. **/
6 approved?: boolean
7 /** Аватар пользователя. **/
8 avatarSrc?: string
9 /** Дочерние комментарии. Не заполняется во всех сценариях. Используется, когда через API параметр asTree установлен в true. **/
10 children: Comment[]
11 /** Оригинальный текст комментария от пользователя. **/
12 comment: string
13 /** READONLY: Текст комментария, преобразованный в HTML. **/
14 commentHTML?: string
15 /** Email комментатора. Обязателен, если анонимные комментарии отключены. **/
16 commenterEmail?: string
17 /** Ссылка комментатора (например, его блог). **/
18 commenterLink?: string
19 /** Имя комментатора. Всегда обязательно. Если недоступно, установите что-то вроде "Anonymous". **/
20 commenterName: string
21 /** Дата оставления комментария в виде UTC epoch. **/
22 date: number
23 /** "Отображаемая метка" для комментария - например "Admin", "Moderator", или что-то вроде "VIP User". **/
24 displayLabel?: string
25 /** Домен, на котором был опубликован комментарий. **/
26 domain?: string
27 /** READONLY: Количество пометок (флагов) для комментария. **/
28 flagCount?: number
29 /** #хэштеги, написанные в комментарии и успешно распарсенные. Также вы можете вручную добавить хэштеги для запроса, но они не будут автоматически отображаться в тексте комментария. **/
30 hashTags?: CommentHashTag[]
31 /** READONLY: Содержит ли комментарий изображения? **/
32 hasImages?: boolean
33 /** READONLY: Содержит ли комментарий ссылки? **/
34 hasLinks?: boolean
35 /** READONLY: Уникальный идентификатор комментария. **/
36 id: string
37 /** Только при создании! Для хранения значение хешируется. **/
38 ip?: string
39 /** READONLY: Заблокировал ли текущий пользователь автора этого комментария? **/
40 isBlocked?: boolean
41 /** READONLY: Автор комментария — администратор? Автоматически определяется по userId. **/
42 isByAdmin?: boolean
43 /** READONLY: Автор комментария — модератор? Автоматически определяется по userId. **/
44 isByModerator?: boolean
45 /** Установлено в true, если комментарий был мягко удалён (оставлен заполнитель из-за другой конфигурации). **/
46 isDeleted?: boolean
47 /** Установлено в true, если аккаунт пользователя был удалён, а комментарий нужно было сохранить. **/
48 isDeletedUser?: boolean
49 /** READONLY: Отмечен ли комментарий флагом текущего вошедшего пользователя (contextUserId)? **/
50 isFlagged?: boolean
51 /** Закреплен ли комментарий? **/
52 isPinned?: boolean
53 /** Заблокирован ли комментарий для новых ответов (модераторы всё ещё могут отвечать)? **/
54 isLocked?: boolean
55 /** Является ли комментарий спамом? **/
56 isSpam?: boolean
57 /** READONLY: Проголосовал ли текущий пользователь (contextUserId) против комментария? **/
58 isVotedDown?: boolean
59 /** READONLY: Проголосовал ли текущий пользователь (contextUserId) за комментарий? **/
60 isVotedUp?: boolean
61 /** Локаль, на которой написан комментарий. Если не указана, будет определена по HTTP-заголовку Accept-Language. **/
62 locale?: 'de_de' | 'en_us' | 'es_es' | 'fr_fr' | 'it_it' | 'ja_jp' | 'ko_kr' | 'pl_pl' | 'pt_br' | 'ru_ru' | 'tr_tr' | 'zh_cn' | 'zh_tw'
63 /** READONLY: @упоминания, написанные в комментарии и успешно распарсенные. **/
64 mentions?: CommentUserMention[]
65 /** Дополнительные метаданные, связанные с комментарием. **/
66 meta?: Record<string, string | number | boolean>
67 /** Необязательный список идентификаторов групп модерации, связанных с этим комментарием. **/
68 moderationGroupIds?: string[]|null
69 /** READONLY: Идентификатор объекта голосования, соответствующего голосу текущего пользователя (contextUserId) для этого комментария. **/
70 myVoteId?: string
71 /** Были ли отправлены уведомления об этом комментарии комментаторам. Чтобы предотвратить отправку уведомлений при импорте, установите это в true. **/
72 notificationSentForParent?: boolean
73 /** Были ли отправлены уведомления об этом комментарии пользователям тенанта. Чтобы предотвратить отправку уведомлений при импорте, установите это в true. **/
74 notificationSentForParentTenant?: boolean
75 /** Заголовок страницы, на которой был этот комментарий. **/
76 pageTitle?: string
77 /** Если мы отвечаем на комментарий, это ID комментария, на который дается ответ. **/
78 parentId?: string|null
79 /** Отмечен ли комментарий как просмотренный. **/
80 reviewed: boolean
81 /** Идентификатор тенанта, к которому принадлежит комментарий. **/
82 tenantId: string
83 /** Пользователь, написавший комментарий. Создаётся автоматически при сохранении комментария с указанием имени/email. **/
84 userId?: string|null
85 /** URL страницы, где виден этот комментарий, например публикация в блоге. **/
86 url: string
87 /** "Очищенная" версия urlId, которую вы передали. При сохранении вы указываете это поле, но при получении комментария обратно оно будет "очищено" и ваше исходное значение перемещено в "urlIdRaw". **/
88 urlId: string
89 /** READONLY: Оригинальный urlId, который вы передали. **/
90 urlIdRaw?: string
91 /** Проверены ли пользователь и этот комментарий? **/
92 verified: boolean
93 /** Количество голосов "за". **/
94 votesUp?: number
95 /** Количество голосов "против". **/
96 votesDown?: number
97 /** "Карма" комментария (= votes up - votes down). **/
98 votes?: number
99}
100

Некоторые из этих полей помечены как 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. Каждый объект в этом списке имеет следующую структуру.

Объект упоминания в комментарии
Copy CopyRun External Link
1
2interface CommentUserMention {
3 /** Идентификатор пользователя. Для SSO-пользователей будет добавлен префикс вашего tenant id. **/
4 id: string
5 /** Финальный текст @упоминания, включая символ @. **/
6 tag: string
7 /** Оригинальный текст @упоминания, включая символ @. **/
8 rawTag: string
9 /** Тип отмеченного пользователя. user = аккаунт FastComments.com. sso = SSOUser. **/
10 type: 'user'|'sso'
11 /** Даже если пользователь отказался от уведомлений, это поле всё равно будет true. **/
12 sent: boolean
13}
14

Хэштеги

Когда хэштеги используются и успешно распарсены, информация хранится в списке hashTags. Каждый объект в этом списке имеет следующую структуру. Хэштеги также можно вручную добавить в массив hashTags комментария для запросов, если установлен флаг retain.

Объект хэштега комментария
Copy CopyRun External Link
1
2interface CommentHashTag {
3 /** Идентификатор хэштега. **/
4 id: string
5 /** Финальный текст #хэштега, включая символ #. **/
6 tag: string
7 /** Если хэштег связан с кастомным URL, это будет указано. **/
8 url?: string
9 /** Флаг, указывающий, нужно ли сохранять хэштег, даже если он отсутствует в тексте комментария при его обновлении. Полезно для пометки комментариев без изменения текста. **/
10 retain?: boolean
11}
12

Структура шаблона письма Internal Link

Объект EmailTemplate представляет конфигурацию для пользовательского шаблона электронной почты для тенанта.

Система будет выбирать шаблон электронной почты по:

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

Структура для объекта EmailTemplate выглядит следующим образом:

Структура шаблона электронной почты
Copy Copy
1
2interface EmailTemplate {
3 id: string
4 tenantId: string
5 emailTemplateId: string
6 displayName: string
7 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ **/
8 createdAt: string
9 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ **/
10 updatedAt: string
11 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ **/
12 updatedByUserId: string
13 /** Домен, с которым должен быть связан шаблон. **/
14 domain?: string | '*' | null
15 /** Содержимое шаблона письма в синтаксисе EJS. **/
16 ejs: string
17 /** Отображение переопределённых ключей переводов в значения для каждого поддерживаемого языка. **/
18 translationOverridesByLocale: Record<string, Record<string, string>>
19 /** Объект, представляющий контекст рендеринга шаблона. **/
20 testData: object
21}
22

Примечания

  • Вы можете получить допустимые значения emailTemplateId через endpoint /definitions.
  • Endpoint /definitions также содержит переводы по умолчанию и тестовые данные.
  • Сохранение шаблона не удастся при неверной структуре или некорректных тестовых данных.

Структура хэштега Internal Link

Объект HashTag представляет собой метку, которую может оставить пользователь. HashTags могут использоваться для ссылки на внешний фрагмент контента или для объединения связанных комментариев.

The structure for the HashTag object is as follows:

Структура HashTag
Copy Copy
1
2interface HashTag {
3 /** Должен начинаться с "#" или другого желаемого символа. **/
4 tag: string
5 /** Необязательный URL, на который может указывать хэштег. Вместо фильтрации комментариев по хэштегу интерфейс перенаправит на этот URL при клике. **/
6 url?: string
7 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ **/
8 createdAt: string
9}
10

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.

Структура счётчика уведомлений Internal Link

Объект NotificationCount представляет количество непрочитанных уведомлений и метаданные для пользователя.

Если нет непрочитанных уведомлений, для пользователя не будет объекта NotificationCount.

Объекты NotificationCount создаются автоматически и не могут быть созданы через API. Они также истекают через год.

Вы можете очистить количество непрочитанных уведомлений пользователя, удалив его объект NotificationCount.

Структура объекта NotificationCount выглядит следующим образом:

Структура объекта NotificationCount
Copy Copy
1
2interface NotificationCount {
3 id: string // идентификатор пользователя
4 count: number
5 createdAt: string // строка с датой
6 expireAt: string // строка с датой
7}
8

Структура уведомления Internal Link

Объект Notification представляет уведомление для пользователя.

Notification объекты создаются автоматически и не могут быть созданы через API. Они также истекают через год. Уведомления не могут быть удалены. Однако их можно обновлять, устанавливая viewed в false, и вы можете выполнять запросы по полю viewed.

Пользователь также может отписаться от уведомлений для конкретного комментария, установив optedOut в уведомлении в true. Вы можете снова подписаться, установив его в false.

Существуют разные типы уведомлений — смотрите relatedObjectType и type.

Механизмы создания уведомлений довольно гибкие и могут быть вызваны множеством сценариев (см. NotificationType).

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

Структура объекта Notification выглядит следующим образом:

Структура объекта Notification
Copy Copy
1
2enum NotificationObjectType {
3 Comment = 0,
4 Profile = 1,
5 Tenant = 2
6}
7
8enum NotificationType {
9 /** Если кто-то ответил вам. **/
10 RepliedToMe = 0,
11 /** Если кто-то ответил где-либо в ветке обсуждения (включая ответы на ответы) темы, в которой вы оставили комментарий. **/
12 RepliedTransientChild = 1,
13 /** Если ваш комментарий был оценён положительно. **/
14 VotedMyComment = 2,
15 /** Если на корне страницы, на которую вы подписаны, оставлен новый комментарий. **/
16 SubscriptionReplyRoot = 3,
17 /** Если кто-то прокомментировал ваш профиль. **/
18 CommentedOnProfile = 4,
19 /** Если у вас есть личное сообщение. **/
20 DirectMessage = 5,
21 /** TrialLimits предназначен только для пользователей тенанта. **/
22 TrialLimits = 6,
23 /** Если вас упомянули. **/
24 Mentioned = 7
25}
26
27interface Notification {
28 id: string
29 tenantId: string
30 /** При SSO идентификатор пользователя имеет формат `<tenant id>:<user id>`. **/
31 userId?: string
32 /** При работе с SSO вам нужно учитывать только `userId`. **/
33 anonUserId?: string
34 /** urlId почти всегда определён. Он является необязательным только для уведомлений на уровне тенанта, которые случаются редко. **/
35 urlId?: string
36 /** URL кешируется для быстрого перехода к источнику уведомления. **/
37 url?: string
38 /** Заголовок страницы кешируется для быстрого ознакомления с источником уведомления. **/
39 pageTitle?: string
40 relatedObjectType: NotificationObjectType
41 /** Например, идентификатор комментария. **/
42 relatedObjectId: string
43 viewed: boolean
44 createdAt: string // строка даты
45 type: NotificationType
46 fromCommentId?: string
47 fromVoteId?: string
48 /** fromUserName и fromUserAvatarSrc кешируются здесь для быстрого отображения уведомления. Они обновляются при обновлении пользователя. **/
49 fromUserName: string
50 fromUserId: string
51 fromUserAvatarSrc?: string
52 /** Установите это в true, чтобы перестать получать уведомления для этого объекта. **/
53 optedOut?: boolean
54}
55

Структура страницы Internal Link


Объект Page представляет страницу, к которой могут относиться многие комментарии. Эта связь определяется urlId.

Объект Page хранит информацию, такую как заголовок страницы, количество комментариев и urlId.

Структура объекта Page выглядит следующим образом:

Структура страницы
Copy Copy
1
2interface Page {
3 id: string
4 urlId: string
5 url: string
6 title?: string
7 createdAt: string
8 commentCount: number
9 rootCommentCount: number
10 /** Установка этого в null означает, что все пользователи SSO могут видеть страницу. Пустой список означает, что она закрыта для всех пользователей. **/
11 accessibleByGroupIds?: string[] | null
12 /** Закрыта ли эта страница для новых комментариев? **/
13 isClosed?: boolean
14}
15

Структура ожидающего события вебхука Internal Link


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:

Структура PendingWebhookEvent
Copy Copy
1
2enum OutboundSyncEventType {
3 Create: 0,
4 Delete: 1,
5 Update: 2
6}
7
8enum OutboundSyncType {
9 /** Синхронизационная задача, специфичная для WordPress. **/
10 WP: 0,
11 Webhook: 1
12}
13
14interface PendingWebhookEvent {
15 id: string
16 /** Идентификатор комментария, связанный с событием. **/
17 commentId: string
18 /** Объект комментария для события на момент его возникновения. Мы начали добавлять их в ноябре 2023 г. **/
19 comment: Comment
20 /** Внешний идентификатор, который может быть связан с комментарием. **/
21 externalId: string | null
22 createdAt: Date
23 tenantId: string
24 attemptCount: number
25 /** Устанавливается перед первой попыткой и после каждой неудачи. **/
26 nextAttemptAt: Date
27 /** Тип события: создание, удаление или обновление... **/
28 eventType: OutboundSyncEventType
29 /** Тип синхронизации для выполнения (WordPress, вызов API, и т.д.). **/
30 type: OutboundSyncType
31 /** Домен, совпавший с комментарием. Мы используем этот домен для выбора API-ключа. **/
32 domain: string
33 /** Последняя произошедшая ошибка. Этот тип не типизирован и представляет собой "дамп" случившегося. Обычно он содержит объект с полями statusCode, body и картой headers. **/
34 lastError: object | null
35}
36

Структура SSO-пользователя Internal Link

FastComments предоставляет простое в использовании SSO-решение. Обновление информации о пользователе с интеграцией на основе HMAC так же просто, как загрузка страницы пользователем с обновлённым payload.

Тем не менее, может быть целесообразно управлять пользователем вне этого потока, чтобы повысить согласованность вашего приложения.

SSO User API предоставляет способ CRUD объектов, которые мы называем SSOUsers. Эти объекты отличаются от обычных Users и хранятся отдельно для обеспечения типобезопасности.

Структура объекта SSOUser выглядит следующим образом:

Структура SSOUser
Copy Copy
1
2interface SSOUser {
3 id: string
4 username: string
5 email?: string
6 websiteUrl?: string
7 signUpDate: number
8 createdFromUrlId?: string
9 loginCount?: number
10 avatarSrc?: string
11 optedInNotifications?: boolean
12 optedInSubscriptionNotifications?: boolean
13 displayLabel?: string
14 displayName?: string
15 isAccountOwner?: boolean // Права администратора - SSO-пользователи с этим флагом учитываются как SSO-администраторы (отдельно от обычных SSO-пользователей)
16 isAdminAdmin?: boolean // Права администратора - SSO-пользователи с этим флагом учитываются как SSO-администраторы (отдельно от обычных SSO-пользователей)
17 isCommentModeratorAdmin?: boolean // Права модератора - SSO-пользователи с этим флагом учитываются как SSO-модераторы (отдельно от обычных SSO-пользователей)
18 /** Если null, Контроль Доступа не будет применяться к пользователю. Если пустой список, этот пользователь не сможет видеть никакие страницы или упоминать других пользователей с помощью @. **/
19 groupIds?: string[] | null
20 createdFromSimpleSSO?: boolean
21 /** Не позволяйте другим пользователям видеть активность этого пользователя, включая комментарии, в его профиле. По умолчанию true, чтобы обеспечить безопасность профилей по умолчанию. **/
22 isProfileActivityPrivate?: boolean
23 /** Не позволяйте другим пользователям оставлять комментарии в профиле пользователя или видеть существующие комментарии профиля. По умолчанию false. **/
24 isProfileCommentsPrivate?: boolean
25 /** Не позволяйте другим пользователям отправлять этому пользователю личные сообщения. По умолчанию false. **/
26 isProfileDMDisabled?: boolean
27 karma?: number
28 /** Необязательная конфигурация для бейджей пользователя. **/
29 badgeConfig?: {
30 /** Массив идентификаторов бейджей для назначения пользователю. Ограничение — 30 бейджей. Порядок сохраняется. Это глобальные бейджи, видимые на всех страницах. **/
31 badgeIds: string[]
32 /** Массив идентификаторов бейджей, привязанных к текущей странице (urlId). Эти бейджи отображаются только на странице, где они были назначены. **/
33 pageBadgeIds?: string[]
34 /** Если true, заменяет все существующие отображаемые бейджи предоставленными. Глобальные и страницы-специфичные бейджи переопределяются независимо. Если false, добавляет к существующим бейджам. **/
35 override?: boolean
36 /** Если true, обновляет свойства отображения бейджей из конфигурации арендатора. **/
37 update?: boolean
38 }
39}
40

Billing for SSO Users

SSO users are billed differently based on their permission flags:

  • Regular SSO Users: Users without admin or moderator permissions are billed as regular SSO users
  • SSO Admins: Users with isAccountOwner or isAdminAdmin flags are billed separately as SSO Admins (same rate as regular tenant admins)
  • SSO Moderators: Users with isCommentModeratorAdmin flag are billed separately as SSO Moderators (same rate as regular moderators)

Important: To prevent double billing, the system automatically deduplicates SSO users against regular tenant users and moderators by email address. If an SSO user has the same email as a regular tenant user or moderator, they will not be billed twice.

Access Control

Users can be broken into groups. This is what the groupIds field is for, and is optional.

@Mentions

By default @mentions will use username to search for other sso users when the @ character is typed. If displayName is used, then results matching username will be ignored when there is a match for displayName, and the @mention search results will use displayName.

Subscriptions

With FastComments, users can subscribe to a page by clicking the bell icon in the comment widget and clicking Subscribe.

With a regular user, we send them notification emails based on their notification settings.

With SSO Users, we split this up for backwards compatibility. Users will only get sent these additional subscription notification emails if you set optedInSubscriptionNotifications to true.

Badges

You can assign badges to SSO users using the badgeConfig property. Badges are visual indicators that appear next to a user's name in comments.

  • badgeIds - An array of badge IDs to assign to the user. These are global badges visible on all pages. Must be valid badge IDs created in your FastComments account. Limited to 30 badges.
  • pageBadgeIds - An optional array of badge IDs scoped to the current page (urlId). These badges are only displayed on the page where they were assigned. Different pages can have different page-scoped badges for the same user.
  • override - If true, all existing displayed badges will be replaced with the provided ones. Global and page-scoped badges are overridden independently — overriding global badges does not affect page-scoped badges, and vice versa. If false or omitted, the provided badges will be added to any existing badges.
  • update - If true, badge display properties will be updated from the tenant configuration whenever the user logs in.

Структура подписки Internal Link

Объект Subscription представляет подписку для пользователя.

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

Подписки также можно создавать через API.

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

Структура объекта Subscription выглядит следующим образом:

Структура Subscription
Copy Copy
1
2interface Subscription {
3 id: string
4 tenantId: string
5 /** При SSO идентификатор пользователя имеет формат `<tenant id>:<user id>`. **/
6 userId: string
7 anonUserId?: string
8 urlId: string
9 url?: string
10 pageTitle?: string
11 createdAt: string // строка с датой
12}
13

Структура ежедневного использования тенанта Internal Link

Объект TenantDailyUsage представляет собой данные об использовании для тенанта за конкретный день. Если для данного тенанта в определённый день, у этого дня не будет объекта TenantDailyUsage.

Объект TenantDailyUsage не является данными в режиме реального времени и может отставать на несколько минут от фактического использования.

Структура объекта TenantDailyUsage выглядит следующим образом:

Структура TenantDailyUsage
Copy Copy
1
2export interface TenantDailyUsage {
3 yearNumber: number
4 monthNumber: number
5 dayNumber: number
6 commentFetchCount?: number
7 commentCreateCount?: number
8 conversationCreateCount?: number
9 voteCount?: number
10 accountCreatedCount?: number
11 userMentionSearch?: number
12 hashTagSearch?: number
13 gifSearchTrending?: number
14 gifSearch?: number
15 apiCreditsUsed?: number
16 createdAt: string
17 billed: boolean
18 /** Игнорируется при выставлении счетов. **/
19 ignored: boolean
20}
21

Структура тенанта Internal Link

Tenant определяет клиента FastComments.com. Их можно создать через API арендаторами с доступом white-label. Арендаторы с white-label не могут создавать других арендаторов с white-label (разрешён только один уровень вложенности).

Структура объекта Tenant выглядит следующим образом:

Структура Tenant
Copy Copy
1
2export enum SiteType {
3 Unknown = 0,
4 WordPress = 1
5}
6
7/** Это также можно обработать через DomainConfig API. **/
8export interface TenantDomainConfig {
9 domain: string
10 emailFromName?: string
11 emailFromEmail?: string
12 createdAt?: string,
13 siteType?: FastCommentsSiteType, // вероятно, вы захотите Unknown
14 logoSrc?: string, // путь к исходному изображению
15 logoSrc100px?: string, // изменённый для миниатюр
16 footerUnsubscribeURL?: string,
17 emailHeaders?: Record<string, string>,
18 disableUnsubscribeLinks?: boolean,
19 dkim?: {
20 domainName: string,
21 keySelector: string,
22 privateKey: string
23 }
24}
25
26export interface TenantBillingInfo {
27 name: string
28 address: string
29 city: string
30 state: string
31 zip: string
32 country: string
33}
34
35export enum TenantPaymentFrequency {
36 Monthly = 0,
37 Annually = 1
38}
39
40export interface Tenant {
41 id: string
42 name: string
43 email?: string
44 signUpDate: number; // число по "legacy" причинам
45 packageId?: string | null
46 paymentFrequency?: TenantPaymentFrequency
47 billingInfoValid?: boolean
48 billingHandledExternally?: boolean
49 createdBy?: string
50 isSetup?: boolean
51 domainConfiguration: FastCommentsAPITenantDomainConfig[]
52 billingInfo?: FastCommentsAPITenantBillingInfo
53 stripeCustomerId?: string
54 stripeSubscriptionId?: string
55 stripePlanId?: string
56 enableProfanityFilter?: boolean
57 enableSpamFilter?: boolean
58 lastBillingIssueReminderDate?: string
59 removeUnverifiedComments?: boolean
60 unverifiedCommentsTTLms?: number
61 commentsRequireApproval?: boolean
62 autoApproveCommentOnVerification?: boolean
63 sendProfaneToSpam?: boolean
64 /** @readonly - Вычисляется на основе packageId. **/
65 hasFlexPricing?: boolean
66 /** @readonly **/
67 flexLastBilledAmount?: number
68 /** @readonly - Вычисляется на основе packageId. **/
69 hasAuditing?: boolean
70 /** Вы можете хранить пару ключ-значение у Tenant, которую можно использовать для запросов. Ключи не могут содержать "." или "$", или быть длиннее 100 символов. Значения не могут быть длиннее 2k символов. **/
71 meta?: Record<string, string | null>
72}
73

Структура пользователя Internal Link

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 выглядит следующим образом:

Структура User
Copy Copy
1
2export interface User {
3 /** Это также id, используемый как userId в объектах комментариев. **/
4 id: string
5 username: string
6 /** Ссылка, например, на блог комментатора. **/
7 websiteUrl?: string
8 email: string
9 signUpDate: number
10 createdFromUrlId: string
11 createdFromTenantId: string
12 avatarSrc?: string
13 locale: FastCommentsLocale
14 displayLabel?: string
15 karma?: number
16}
17

Структура голоса Internal Link


Объект Vote представляет голос, оставленный пользователем.

Связь между комментариями и голосом определяется через commentId.

Структура объекта Vote выглядит следующим образом:

Структура Vote
Copy Copy
1
2interface Vote {
3 id: string
4 urlId: string
5 commentId: string
6 userId: string
7 direction: 1 | -1
8 createdAt: string
9}
10

Структура конфигурации вопроса Internal Link

FastComments предоставляет способ создания вопросов и агрегирования их результатов. Пример вопроса (в дальнейшем называемого QuestionConfig) может быть рейтингом в виде звёзд, ползунком или вопросом NPS (определяется через type).

Данные вопросов можно агрегировать отдельно, вместе, по времени, в целом, по странице и т.д.

Фреймворк обладает всеми возможностями, необходимыми для создания клиентских виджетов (с вашим сервером перед этим API), административных панелей и инструментов отчётности.

Сначала нам нужно определить QuestionConfig. Структура выглядит следующим образом:

Структура QuestionConfig
Copy Copy
1
2type QuestionConfigType = 'nps' | 'slider' | 'star' | 'thumbs';
3
4interface QuestionConfig {
5 id: string
6 tenantId: string
7 name: string
8 question: string
9 helpText?: string
10 createdAt: string
11 createdBy: string
12 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ - увеличивается при каждом новом ответе. **/
13 usedCount: number
14 /** Строка с датой, когда конфигурация была в последний раз использована (оставлен результат). **/
15 lastUsed?: string
16 type: QuestionConfigType
17 numStars?: number
18 min?: number
19 max?: number
20 defaultValue?: number
21 labelNegative?: string
22 labelPositive?: string
23 subQuestionIds?: string[]
24 alwaysShowSubQuestions?: boolean
25 reportingOrder: number
26}
27

Структура результата вопроса Internal Link

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

Структура QuestionResult
Copy Copy
1
2interface QuestionResultMeta {
3 name: string
4 values: string[]
5}
6
7interface QuestionResult {
8 id: string
9 tenantId: string
10 urlId: string
11 anonUserId?: string
12 userId?: string
13 createdAt?: string
14 value: number
15 commentId?: string
16 questionId: string
17 meta?: QuestionResultMeta[]
18}
19

Структура значка пользователя Internal Link


UserBadge — объект, представляющий значок, присвоенный пользователю в системе FastComments.

Значки могут присваиваться пользователям автоматически в зависимости от их активности (например, количества комментариев, времени ответа, статуса ветерана) или вручную администраторами сайта.

Структура объекта UserBadge выглядит следующим образом:

Структура UserBadge
Copy Copy
1
2export interface UserBadge {
3 /** Уникальный идентификатор присвоения значка пользователю */
4 id: string
5 /** ID пользователя, которому присвоен этот значок */
6 userId: string
7 /** ID определения значка из каталога значков тенанта */
8 badgeId: string
9 /** ID тенанта, который создал/назначил этот значок */
10 fromTenantId: string
11 /** Когда этот значок был создан (миллисекунды с эпохи) */
12 createdAt?: number
13 /** Когда пользователь получил этот значок (миллисекунды с эпохи) */
14 receivedAt?: number
15 /**
16 * Тип значка:
17 * 0=CommentCount, 1=CommentUpVotes, 2=CommentReplies, 3=CommentsPinned,
18 * 4=Veteran, 5=NightOwl, 6=FastReplyTime, 7=ModeratorCommentsDeleted,
19 * 8=ModeratorCommentsApproved, 9=ModeratorCommentsUnapproved, 10=ModeratorCommentsReviewed,
20 * 11=ModeratorCommentsMarkedSpam, 12=ModeratorCommentsMarkedNotSpam, 13=RepliedToSpecificPage,
21 * 14=Manual
22 */
23 type: number
24 /** Для значков на основе порога — пороговое значение */
25 threshold?: number
26 /** Название/метка значка */
27 name?: string
28 /** Подробное описание значка */
29 description?: string
30 /** Текст, отображаемый на значке */
31 displayLabel?: string
32 /** URL изображения, отображаемого на значке */
33 displaySrc?: string
34 /** Фоновый цвет значка (hex-код) */
35 backgroundColor?: string
36 /** Цвет рамки значка (hex-код) */
37 borderColor?: string
38 /** Цвет текста значка (hex-код) */
39 textColor?: string
40 /** Дополнительный CSS-класс для стилизации */
41 cssClass?: string
42 /** Для «ветеранских» значков — порог времени в миллисекундах */
43 veteranUserThresholdMillis?: number
44 /** Отображается ли этот значок в комментариях пользователя */
45 displayedOnComments: boolean
46 /** Порядок отображения значка */
47 order?: number
48 /** Если установлено, этот значок отображается только на странице с совпадающим urlId. Null для глобальных значков. */
49 urlId?: string | null
50}
51
---

Структура прогресса значка пользователя Internal Link

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

Это отслеживание помогает определять, когда пользователи должны получать автоматические значки на основе их активности и участия в вашем сообществе.

Структура объекта UserBadgeProgress выглядит следующим образом:

Структура UserBadgeProgress
Copy Copy
1
2export interface UserBadgeProgress {
3 /** Уникальный идентификатор этой записи прогресса */
4 id: string
5 /** ID тенанта, которому принадлежит эта запись прогресса */
6 tenantId: string
7 /** ID пользователя, за которым отслеживается эта запись прогресса */
8 userId: string
9 /** ID первого комментария пользователя в системе */
10 firstCommentId?: string
11 /** Дата первого комментария пользователя (миллисекунды с начала эпохи Unix) */
12 firstCommentDate?: number
13 /** Автоматически рассчитанный коэффициент доверия на основе активности пользователя */
14 autoTrustFactor?: number
15 /** Коэффициент доверия, установленный вручную администраторами */
16 manualTrustFactor?: number
17 /** Подробный объект прогресса с различными метриками, ключи соответствуют перечислению BadgeType */
18 progress: {
19 /** 0: CommentCount - Количество комментариев, оставленных пользователем */
20 '0'?: number
21 /** 1: CommentUpVotes - Количество полученных пользователем голосов 'за' */
22 '1'?: number
23 /** 2: CommentReplies - Количество ответов, оставленных пользователем */
24 '2'?: number
25 /** 3: CommentsPinned - Количество закреплённых комментариев у пользователя */
26 '3'?: number
27 /** 4: Veteran - Возраст аккаунта пользователя */
28 '4'?: number
29 /** 5: NightOwl - Количество раз, когда пользователь публиковал в ночное время */
30 '5'?: number
31 /** 6: FastReplyTime - Среднее время ответа в миллисекундах */
32 '6'?: number
33 /** 7: ModeratorCommentsDeleted - Для бейджей модератора, количество удалённых комментариев */
34 '7'?: number
35 /** 8: ModeratorCommentsApproved - Для бейджей модератора, количество одобренных комментариев */
36 '8'?: number
37 /** 9: ModeratorCommentsUnapproved - Для бейджей модератора, количество неодобренных комментариев */
38 '9'?: number
39 /** 10: ModeratorCommentsReviewed - Для бейджей модератора, количество проверенных комментариев */
40 '10'?: number
41 /** 11: ModeratorCommentsMarkedSpam - Для бейджей модератора, количество помеченных как спам комментариев */
42 '11'?: number
43 /** 12: ModeratorCommentsMarkedNotSpam - Для бейджей модератора, количество помеченных как 'не спам' комментариев */
44 '12'?: number
45 /** 13: RepliedToSpecificPage - Для каждой страницы, количество ответов */
46 '13'?: Record<string, number>
47 }
48}
49

В заключение

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