FastComments.com

FastComments API

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

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

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

Сгенерированные SDK

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

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

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

API аутентифицируется путём передачи вашего ключа API либо в заголовке X-API-KEY, либо в параметре запроса API_KEY. Вам также понадобится ваш tenantId для выполнения вызовов API. Его можно получить на той же странице, что и ваш ключ API.

Примечание по безопасности

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

Вариант аутентификации №1 - Заголовки

  • Заголовок: X-API-KEY
  • Заголовок: X-TENANT-ID

Вариант аутентификации №2 - Параметры запроса

  • Параметр запроса: API_KEY
  • Параметр запроса: 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 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Устанавливается в 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 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Текст комментария, распарсенный в HTML. **/
14 commentHTML?: string
15 /** Email автора комментария. Обязателен, если анонимные комментарии отключены. **/
16 commenterEmail?: string
17 /** Ссылка автора комментария (например, их блог). **/
18 commenterLink?: string
19 /** Имя автора комментария. Всегда обязательно. Если недоступно, установите что-то вроде "Аноним". **/
20 commenterName: string
21 /** Дата оставления комментария, в формате UTC epoch. **/
22 date: number
23 /** "Отображаемая метка" для комментария - например "Admin", "Moderator", или что-то вроде "VIP User". **/
24 displayLabel?: string
25 /** Домен, на котором был опубликован комментарий. **/
26 domain?: string
27 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Количество раз, когда комментарий был помечен флагом. **/
28 flagCount?: number
29 /** #хэштеги, написанные в комментарии и успешно распознанные. Вы также можете вручную добавить хэштеги для поиска, но они не будут автоматически отображаться в тексте комментария. **/
30 hashTags?: CommentHashTag[]
31 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Содержит ли комментарий изображения? **/
32 hasImages?: boolean
33 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Содержит ли комментарий ссылки? **/
34 hasLinks?: boolean
35 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Уникальный идентификатор комментария. **/
36 id: string
37 /** Только при создании! Для хранения это хешируется. **/
38 ip?: string
39 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Заблокировал ли текущий пользователь автора этого комментария? **/
40 isBlocked?: boolean
41 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Является ли комментарий написанным администратором? Устанавливается автоматически на основе userId. **/
42 isByAdmin?: boolean
43 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Является ли комментарий написанным модератором? Устанавливается автоматически на основе userId. **/
44 isByModerator?: boolean
45 /** Устанавливается в true, если комментарий был мягко удалён (пришлось оставить заполнитель из-за другой конфигурации). **/
46 isDeleted?: boolean
47 /** Устанавливается в true, если аккаунт пользователя был удалён, а комментарий нужно было сохранить. **/
48 isDeletedUser?: boolean
49 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Был ли комментарий помечен текущим вошедшим пользователем (contextUserId)? **/
50 isFlagged?: boolean
51 /** Закреплён ли комментарий? **/
52 isPinned?: boolean
53 /** Заблокирован ли комментарий для новых ответов (модераторы по-прежнему могут отвечать)? **/
54 isLocked?: boolean
55 /** Является ли комментарий спамом? **/
56 isSpam?: boolean
57 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Проголосовал ли текущий пользователь (contextUserId) против комментария? **/
58 isVotedDown?: boolean
59 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Проголосовал ли текущий пользователь (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 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: @упоминания, написанные в комментарии и успешно распарсенные. **/
64 mentions?: CommentUserMention[]
65 /** Необязательные метаданные, связанные с комментарием. **/
66 meta?: Record<string, string | number | boolean>
67 /** Необязательный список идентификаторов групп модерации, связанных с этим комментарием. **/
68 moderationGroupIds?: string[]|null
69 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Идентификатор объекта голоса, соответствующий голосу текущего пользователя (contextUserId) по этому комментарию. **/
70 myVoteId?: string
71 /** Были ли отправлены уведомления об этом комментарии авторам. Чтобы предотвратить отправку уведомлений при импорте, установите в true. **/
72 notificationSentForParent?: boolean
73 /** Были ли отправлены уведомления об этом комментарии пользователям арендатора (tenant users). Чтобы предотвратить отправку уведомлений при импорте, установите в 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 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Исходный urlId, который вы передали. **/
90 urlIdRaw?: string
91 /** Подтверждены ли пользователь и этот комментарий? **/
92 verified: boolean
93 /** Количество голосов «за». **/
94 votesUp?: number
95 /** Количество голосов «против». **/
96 votesDown?: number
97 /** "Карма" комментария (= голоса за - голоса против). **/
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 через эндпоинт /definitions.
  • Эндпоинт /definitions также включает переводы по умолчанию и тестовые данные.
  • Шаблоны не сохранятся при недопустимой структуре или тестовых данных.

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


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:

Структура 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 /** Если за ваш комментарий проголосовали за (up-vote). **/
14 VotedMyComment = 2,
15 /** Если на корне страницы, на которую вы подписаны, оставлен новый комментарий. **/
16 SubscriptionReplyRoot = 3,
17 /** Если кто-то прокомментировал ваш профиль. **/
18 CommentedOnProfile = 4,
19 /** Если у вас личное сообщение (DM). **/
20 DirectMessage = 5,
21 /** TrialLimits предназначен только для пользователей арендатора (tenant). **/
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 почти всегда определён. Он является необязательным только для уведомлений уровня арендатора (tenant), которые встречаются редко. **/
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


Объект 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:

Структура 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 // Admin permission - SSO users with this flag are billed as SSO Admins (separate from regular SSO users)
16 isAdminAdmin?: boolean // Admin permission - SSO users with this flag are billed as SSO Admins (separate from regular SSO users)
17 isCommentModeratorAdmin?: boolean // Moderator permission - SSO users with this flag are billed as SSO Moderators (separate from regular SSO users)
18 /** If null, Access Control will not be applied to the user. If an empty list, this user will not be able to see any pages or @mention other users. **/
19 groupIds?: string[] | null
20 createdFromSimpleSSO?: boolean
21 /** Don't let other users see this user's activity, including comments, on their profile. Default is true to provide secure profiles by default. **/
22 isProfileActivityPrivate?: boolean
23 /** Don't let other users leave comments on the user's profile, or see existing profile comments. Default false. **/
24 isProfileCommentsPrivate?: boolean
25 /** Don't let other users send direct messages to this user. Default false. **/
26 isProfileDMDisabled?: boolean
27 karma?: number
28 /** Optional configuration for user badges. **/
29 badgeConfig?: {
30 /** Array of badge IDs to assign to the user. Limited to 30 badges. Order is respected. **/
31 badgeIds: string[]
32 /** If true, replaces all existing displayed badges with the provided ones. If false, adds to existing badges. **/
33 override?: boolean
34 /** If true, updates badge display properties from tenant configuration. **/
35 update?: boolean
36 }
37}
38

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

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


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

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

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

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

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

The structure for the Tenant object is as follows:

Структура 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 /** You can store a key value pair with the tenant which you can use to query. Keys cannot contain "." or "$", or be longer than 100 chars. Values may not be longer than 2k chars. **/
71 meta?: Record<string, string | null>
72}
73

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

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

Структура User
Copy Copy
1
2export interface User {
3 /** Это также идентификатор, используемый как 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 представляет собой голос, оставленный пользователем.

Связь между комментариями и 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 /** Для значков типа Veteran — порог времени в миллисекундах */
43 veteranUserThresholdMillis?: number
44 /** Отображается ли этот значок в комментариях пользователя */
45 displayedOnComments: boolean
46 /** Порядок отображения значка */
47 order?: number
48}
49
---

Структура прогресса значка пользователя 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 /** Дата первого комментария пользователя (миллисекунды с эпохи) */
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 подробной и понятной. Если вы обнаружите какие-либо пробелы, сообщите нам ниже.