FastComments.com

API живого комментирования

API FastComments

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

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

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

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

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

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

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

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

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

Эти маршруты предназначены для вызова с сервера. НЕ ДЕЛАЙТЕ вызовов из браузера. Это раскроет ваш API‑ключ, предоставив полный доступ к вашему аккаунту любому, кто сможет просмотреть исходный код страницы!

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

  • Header: X-API-KEY
  • Header: X-TENANT-ID

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

  • Query Param: API_KEY
  • Query Param: tenantId

Вариант аутентификации 3 – OAuth Bearer Token

  • Header: Authorization: Bearer fcat_...

Сторонние приложения, такие как Zapier, и клиенты MCP server получают токен через OAuth вместо API‑ключа. Этот токен работает со всеми эндпоинтами. tenant подразумевается токеном, поэтому tenantId является необязательным, но при указании должен соответствовать токену. Запросы GET требуют область read, а все остальные методы — область write. Полный процесс, включая регистрацию клиента, PKCE, обновление и отзыв токена, описан в разделе OAuth Authorization. Открытие начинается по адресу https://fastcomments.com/.well-known/oauth-authorization-server.

Чтение собственных записей

FastComments обеспечивает активную‑активную доступность. Запросы из вашего дата‑центра направляются к ближайшей точке присутствия относительно вас. Это происходит автоматически, и обычно вы наблюдаете семантику «чтение‑после‑записи». Если вам необходимо гарантировать чтение собственных записей, вы можете привязать запросы к определённому региону, используя этот регион в качестве хоста API (обычно это не требуется для большинства интеграций):

  • gdc-oregon.fastcomments.com
  • gdc-virginia.fastcomments.com
  • gdc-singapore.fastcomments.com
  • gdc-falkenstein2.fastcomments.com
  • gdc-sao-paulo.fastcomments.com
  • eudc-helsinki2.fastcomments.com
  • eudc-limburg.fastcomments.com
  • eudc-france.fastcomments.com

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

AuditLog Structure Internal Link

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

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

Структура AuditLog
Copy Copy
1
2interface AuditLog {
3 id: string;
4 /** Кто выполнил событие. **/
5 userId?: string;
6 username?: string;
7 resourceName: string;
8 crudType: 'c' | 'r' | 'u' | 'd' | 'login';
9 from: string;
10 url?: string;
11 ip?: string;
12 /** Браузер, из которого было выполнено событие, если оно пришло из браузера. **/
13 ua?: string;
14 /** Хэш сессии, из которой пришло событие, для соотнесения действий одного человека. Никогда сама сессия. **/
15 sIdHashed?: string;
16 when: string;
17 description?: string;
18 serverStartDate: string;
19 /** Идентификатор объекта, над которым было выполнено событие, в отличие от того, кто его выполнил. **/
20 targetId?: string;
21 /** Понятная человеку метка этого объекта, например "jsmith (jsmith@example.com)". **/
22 targetLabel?: string;
23 objectDetails?: object;
24}
25

targetId и targetLabel описывают, над чем было выполнено событие; userId и username описывают, кто его выполнил. Для обновлений objectDetails.changes содержит карту {field: {from, to}} того, что фактически изменилось.

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

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

BatchJob Structure Internal Link

A BatchJob — это длительная задача, например импорт, экспорт или миграция страниц. Задачи ставятся в очередь, затем берутся и выполняются в фоновом режиме.

processedCount и totalCount показывают прогресс. Их единица измерения зависит от type:

  • migrate-pages: завершённые миграции из запрошенных миграций.
  • undo-page-migration: восстановленные записи. totalCount отсутствует.
  • import, export и другие задачи: обработанные строки.

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

Структура BatchJob
Copy Copy
1
2interface BatchJob {
3 id: string
4 /** Например migrate-pages, undo-page-migration, migrate-domains, import, export, users-export или copy-comments. **/
5 type: string
6 status: 'requested' | 'running' | 'success' | 'failed'
7 createdAt: string
8 completedAt?: string
9 processedCount: number
10 /** Общее количество работы, если оно известно заранее. **/
11 totalCount?: number
12 /** migrate-pages: одна запись на каждую завершённую миграцию, в порядке запроса. **/
13 pageMigrationResults?: Array<PageMigrationSuccess | PageMigrationFailure>
14 /**
15 * migrate-pages: устанавливается после завершения задачи (успешно или с ошибкой). Передайте в POST /api/v1/pages/migrations/:undoId/undo в течение 90 дней.
16 * undo-page-migration: миграция, которую нужно отменить.
17 **/
18 undoId?: string
19 /** undo-page-migration: устанавливается после завершения задачи. **/
20 pageMigrationUndoResult?: PageMigrationUndoResult
21}
22
23interface PageMigrationSuccess {
24 from: string
25 to: string
26 type: 'urlId' | 'domain'
27 status: 'success'
28 commentsMigrated: number
29}
30
31interface PageMigrationFailure {
32 from: string
33 to: string
34 type: 'urlId' | 'domain'
35 status: 'failed'
36 code: string
37 reason: string
38}
39
40interface PageMigrationUndoResult {
41 /** Записи, возвращённые к их значениям до миграции. **/
42 restored: number
43 /** Записи, оставленные без изменений, потому что они изменились после миграции или больше не существуют. **/
44 skipped: number
45 /** Записи миграции, удалённые при объединении страниц. Их нельзя восстановить. **/
46 notRestorable: number
47}
48

Повторы

Если сервер, выполняющий задачу миграции страниц, перезапускается, задача возвращается в очередь и продолжается после последней завершённой миграции. Задача пытается выполниться до 3 раз, после чего её status становится failed.

Comment Structure 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 /** Дочерние комментарии. Не заполняется во всех сценариях. Используется, когда asTree установлено в true через API. **/
10 children: Comment[]
11 /** Исходный текст комментария. **/
12 comment: string
13 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Текст комментария, преобразованный в 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 /** ТОЛЬКО ДЛЯ ЧТЕНИЯ: Количество раз, когда комментарий был помечен. **/
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 /** Заблокирован ли комментарий? Если true, никто (включая модераторов) не может отвечать, редактировать или удалять его, пока он не будет разблокирован. **/
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 /** Были ли отправлены уведомления об этом комментарии пользователям арендатора. Чтобы предотвратить отправку уведомлений при импорте, установите это в true. **/
74 notificationSentForParentTenant?: boolean
75 /** Заголовок страницы, на которой был оставлен комментарий. **/
76 pageTitle?: string
77 /** Если мы отвечаем на комментарий, это идентификатор, на который мы отвечаем. **/
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 /** «Карма» комментария (= 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. Каждый объект в этом списке имеет следующую структуру.

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

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

Email Template Structure 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 также включает переводы по умолчанию и тестовые данные.
  • Шаблоны не сохранятся при недопустимой структуре или тестовых данных.

FeedPost Structure Internal Link

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

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

Структура FeedPost
Copy Copy
1
2interface FeedPost {
3 /** READONLY **/
4 _id: string
5 /** READONLY **/
6 tenantId: string
7 title?: string
8 /** Идентификатор пользователя FastComments или SSO, который является автором записи. **/
9 fromUserId?: string
10 /** Заполняется из данных пользователя, если не задано. **/
11 fromUserDisplayName?: string | null
12 /** READONLY. Заполняется из данных пользователя. **/
13 fromUserAvatar?: string | null
14 /** Используется для фильтрации ленты. **/
15 tags?: string[]
16 /** Вес сортировки внутри ленты. Более высокие значения сортируются первыми. **/
17 weight?: number
18 /** Свободные пары ключ/значение для вашего собственного использования. **/
19 meta?: Record<string, string>
20 /** Очищенный HTML. **/
21 contentHTML?: string
22 media?: FeedPostMediaItem[]
23 links?: FeedPostLink[]
24 /** READONLY **/
25 createdAt: string
26 /** READONLY. Тип реакции для подсчёта. **/
27 reacts?: Record<string, number>
28 /** READONLY **/
29 commentCount?: number | null
30}
31
32interface FeedPostMediaItem {
33 title?: string
34 /** Куда ведёт медиа‑элемент при клике. **/
35 linkUrl?: string
36 /** Одна запись для каждой версии. Виджет выбирает наиболее подходящую. **/
37 sizes: FeedPostMediaItemAsset[]
38}
39
40interface FeedPostMediaItemAsset {
41 w: number
42 h: number
43 src: string
44}
45
46interface FeedPostLink {
47 /** Текст ссылки, например «Зарегистрироваться сейчас». **/
48 text?: string
49 /** Заголовок, отображаемый вместе со ссылкой. **/
50 title?: string
51 /** Описание, отображаемое вместе со ссылкой. **/
52 description?: string
53 url?: string
54}
55

Примечания:

  • Некоторые из этих полей помечены READONLY — они возвращаются API, но не могут быть установлены.
  • Комментарии к записи являются обычными комментариями, чей urlId имеет вид post: + _id записи. Используйте это значение с API комментариев, чтобы читать или создавать комментарии к записи.

HashTag Structure Internal Link

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

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

Структура HashTag
Copy Copy
1
2interface HashTag {
3 /** Should start with the "#" or desired character. **/
4 tag: string
5 /** An optional URL that the hashtag can point to. Instead of filtering comments by hashtag, the UI will redirect to this upon click. **/
6 url?: string
7 /** READONLY **/
8 createdAt: string
9}
10

Примечания:

  • В некоторых конечных точках API вы увидите, что хэштег используется в URL. Не забудьте кодировать значения в URI. Например, # следует представлять как %23.
  • Некоторые из этих полей помечены как READONLY — они возвращаются API, но не могут быть заданы.

Notification Count Structure 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

Notification Structure 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

Page Structure 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

Poll Structure Internal Link

A Poll привязан к комментарию, а не является отдельным объектом. Он создаётся вместе с комментарием (см. POST /api/v1/comments), или позже добавляется к существующему комментарию с помощью PUT /api/v1/polls/:commentId.

Подсчёты голосов хранятся непосредственно в опросе, поэтому чтение опроса сразу даёт результаты без необходимости суммировать данные. Отдельные голоса, лежащие в основе этих подсчётов, являются объектами PollVote.

Каждый вариант имеет id, генерируемый при создании опроса. Этот id используется для голосования, переименования варианта и сохранения варианта (и его голосов) при PUT опроса с добавленными или удалёнными вариантами. Это единственный надёжный способ ссылки на вариант — никогда не используйте его позицию в списке.

Структура опроса
Copy Copy
1
2interface CommentPollOption {
3 id: string
4 label: string
5 votes: number
6}
7
8interface CommentPoll {
9 question: string
10 options: CommentPollOption[]
11 totalVotes: number
12 /** Если установлено и находится в прошлом, опрос закрыт и больше не принимает голоса. **/
13 closesAt?: string | null
14 /** 0 — анонимный (по умолчанию), 1 — администраторы и модераторы, 2 — все. Отсутствие означает анонимный. **/
15 privacy?: 0 | 1 | 2 | null
16 /** Если true, подсчёты скрыты от всех, кто ещё не проголосовал. Отсутствие означает false. **/
17 requireVoteToSeeResults?: boolean | null
18}
19

Ограничения

  • Вопрос обязателен и может содержать не более 200 символов.
  • Опрос должен содержать от 2 до 10 вариантов.
  • Метка варианта обязательна, может содержать не более 100 символов и должна быть уникальной в рамках опроса (без учёта регистра).
  • closesAt должен указывать на будущее время при создании опроса. Чтобы закрыть опрос немедленно, выполните PATCH с датой в прошлом.

Настройки сайта

Опросы подчиняются конфигурации вашего сайта, которую можно изменить в разделе Customize Widget:

  • Опросы должны быть включены, прежде чем можно создать опрос, иначе API вернёт polls-disabled.
  • Голосование может быть ограничено только авторизованными пользователями; в этом случае голос, отправленный только с anonUserId, будет отклонён с ошибкой poll-login-required.

PollVote Structure Internal Link

A PollVote — это ответ одного человека на опрос. Счётчики, отображаемые непосредственно в опросе, синхронны с этими записями, поэтому они нужны только тогда, когда вам нужно знать кто за что проголосовал, а не общие итоги.

У избирателя может быть не более одного голоса в опросе. При повторном голосовании его существующий голос перемещается к новому варианту вместо того, чтобы добавить второй, а updatedAt фиксирует, когда это произошло.

voterId — это userId, если избиратель был авторизован, иначе используется anonUserId.

Структура PollVote
Copy Copy
1
2interface PollVote {
3 id: string
4 tenantId: string
5 commentId: string
6 urlId: string
7 /** userId, когда избиратель был авторизован, иначе anonUserId. **/
8 voterId: string
9 optionId: string
10 createdAt: string
11 /** Когда избиратель в последний раз переместил свой голос на другой вариант. **/
12 updatedAt?: string
13}
14

Privacy

Настройка privacy опроса применяется к этому API так же, как и в виджете комментариев:

  • Anonymous (по умолчанию): никто не может увидеть, как кто‑то проголосовал, поэтому голоса недоступны для чтения. GET /api/v1/poll-votes и GET /api/v1/poll-votes/:id отвечают poll-anonymous. Счётчики опроса всё ещё доступны через GET /api/v1/polls/:commentId.
  • Admins and moderators: ваш API‑ключ принадлежит администратору вашего сайта, поэтому он может читать голоса.
  • Everyone: голоса могут быть прочитаны.

Настройки конфиденциальности опроса можно сузить, но нельзя расширить после того, как в нём появились голоса.

PendingWebhookEvent Structure Internal Link

Объект PendingWebhookEvent представляет событие вебхука в очереди, ожидающее обработки.

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

Существуют разные типы событий — проверьте eventType (OutboundSyncEventType) и type (OutboundSyncType).

Распространенный вариант использования этого API — реализация пользовательского мониторинга. Возможно, вы захотите периодически вызывать эндпоинт /count, чтобы опрашивать количество ожидающих событий по заданным фильтрам.

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

Структура 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

SSOUser Structure 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 Admins (отдельно от обычных SSO-пользователей)
16 isAdminAdmin?: boolean // Права администратора - SSO-пользователи с этим флагом тарифицируются как SSO Admins (отдельно от обычных SSO-пользователей)
17 isCommentModeratorAdmin?: boolean // Права модератора - SSO-пользователи с этим флагом тарифицируются как SSO Moderators (отдельно от обычных SSO-пользователей)
18 /** Если null, контроль доступа не применяется к пользователю. Если пустой список, этот пользователь не сможет видеть никакие страницы и @mention других пользователей. **/
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 /** Массив ID бейджей для назначения пользователю. Ограничено 30 бейджами. Порядок соблюдается. Это глобальные бейджи, видимые на всех страницах. **/
31 badgeIds: string[]
32 /** Массив ID бейджей, привязанных к текущей странице (urlId). Эти бейджи отображаются только на странице, где они были назначены. **/
33 pageBadgeIds?: string[]
34 /** Если true, заменяет все существующие отображаемые бейджи на предоставленные. Глобальные и привязанные к странице бейджи переопределяются независимо. Если false, добавляет к существующим бейджам. **/
35 override?: boolean
36 /** Если true, обновляет свойства отображения бейджей из конфигурации тенанта. **/
37 update?: boolean
38 }
39}
40

Тарификация SSO-пользователей

SSO-пользователи тарифицируются по-разному в зависимости от их флагов прав:

  • Обычные SSO-пользователи: пользователи без прав администратора или модератора тарифицируются как обычные SSO-пользователи
  • SSO Admins: пользователи с флагами isAccountOwner или isAdminAdmin тарифицируются отдельно как SSO Admins (по тому же тарифу, что и обычные администраторы тенанта)
  • SSO Moderators: пользователи с флагом isCommentModeratorAdmin тарифицируются отдельно как SSO Moderators (по тому же тарифу, что и обычные модераторы)

Важно: для предотвращения двойной тарификации система автоматически дедуплицирует SSO-пользователей против обычных пользователей и модераторов тенанта по адресу электронной почты. Если у SSO-пользователя тот же email, что у обычного пользователя или модератора тенанта, он не будет тарифицирован дважды.

Контроль доступа

Пользователи могут быть разбиты на группы. Для этого предназначено поле groupIds, и оно является необязательным.

@Упоминания

По умолчанию @mentions используют username для поиска других sso-пользователей при вводе символа @. Если используется displayName, то результаты, совпадающие с username, будут игнорироваться при наличии совпадения с displayName, а результаты поиска @mention будут использовать displayName.

Подписки

В FastComments пользователи могут подписаться на страницу, нажав на иконку колокольчика в виджете комментариев и выбрав «Подписаться».

Для обычного пользователя мы отправляем уведомления по электронной почте на основе его настроек уведомлений.

Для SSO-пользователей мы разделили это для обратной совместимости. Пользователи будут получать эти дополнительные письма с уведомлениями о подписке только если вы установите optedInSubscriptionNotifications в true.

Бейджи

Вы можете назначать бейджи SSO-пользователям с помощью свойства badgeConfig. Бейджи — это визуальные индикаторы, отображаемые рядом с именем пользователя в комментариях.

  • badgeIds — массив ID бейджей для назначения пользователю. Это глобальные бейджи, видимые на всех страницах. Должны быть действительными ID бейджей, созданными в вашем аккаунте FastComments. Ограничено 30 бейджами.
  • pageBadgeIds — необязательный массив ID бейджей, привязанных к текущей странице (urlId). Эти бейджи отображаются только на странице, где они были назначены. Разные страницы могут иметь разные бейджи, привязанные к странице, для одного и того же пользователя.
  • override — если true, все существующие отображаемые бейджи будут заменены на предоставленные. Глобальные и привязанные к странице бейджи переопределяются независимо — переопределение глобальных бейджей не влияет на бейджи, привязанные к странице, и наоборот. Если false или не указано, предоставленные бейджи будут добавлены к существующим.
  • update — если true, свойства отображения бейджей будут обновляться из конфигурации тенанта при каждом входе пользователя.

Subscription Structure 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

TenantDailyUsage Structure 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

Tenant Structure Internal Link

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

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

Структура Tenant
Copy Copy
1
2export enum SiteType {
3 Unknown = 0,
4 WordPress = 1
5}
6
7/** Это также можно настроить через API DomainConfig. **/
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; // число из-за "устаревших" причин
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 /** Вы можете сохранить пару ключ-значение вместе с тенантом и использовать её для запросов. Ключи не могут содержать "." или "$", а также быть длиннее 100 символов. Значения не могут быть длиннее 2 тыс. символов. **/
71 meta?: Record<string, string | null>
72}
73

User Structure 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

Vote Structure 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

QuestionConfig Structure 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

QuestionResult Structure 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

UserBadge Structure 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

UserBadgeProgress Structure 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 подробной и понятной. Если вы обнаружите какие-либо пробелы, сообщите нам ниже.