FastComments.com

APIs de Comentários ao Vivo

A API do FastComments

FastComments fornece uma API para interagir com muitos recursos. Crie integrações com nossa plataforma ou até mesmo desenvolva seus próprios clientes!

Nesta documentação, você encontrará todos os recursos suportados pela API documentados com seus tipos de requisição e resposta.

Para clientes Enterprise, todo acesso à API é registrado no Log de Auditoria.

SDKs Gerados

FastComments agora gera uma Especificação de API a partir do nosso código (ainda não está completa, mas inclui muitas APIs).

Também agora temos SDKs para linguagens populares:

Autenticação

A API é autenticada passando sua chave de API como um cabeçalho X-API-KEY ou como parâmetro de consulta API_KEY. Você também precisará do seu tenantId para fazer chamadas à API. Ele pode ser obtido na mesma página da sua chave de API.

Nota de Segurança

Essas rotas devem ser chamadas a partir de um servidor. NÃO as chame a partir de um navegador. Fazer isso exporá sua chave de API – isso concederá acesso total à sua conta a qualquer pessoa que possa visualizar o código-fonte de uma página!

Opção de Autenticação Um - Cabeçalhos

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

Opção de Autenticação Dois - Parâmetros de Consulta

  • Query Param: API_KEY
  • Query Param: tenantId

Opção de Autenticação Três - Token Bearer OAuth

  • Header: Authorization: Bearer fcat_...

Aplicações de terceiros, como Zapier, e clientes do servidor MCP obtêm um token via OAuth em vez de uma chave de API. Esse token funciona em todos os endpoints aqui. O tenant é implícito pelo token, portanto tenantId é opcional, mas deve corresponder ao token quando fornecido. Requisições GET precisam do escopo read e todos os outros métodos precisam do escopo write. O fluxo completo, incluindo registro de cliente, PKCE, atualização e revogação, está documentado em Autorização OAuth. A descoberta começa em https://fastcomments.com/.well-known/oauth-authorization-server.

Lendo Suas Próprias Escritas

FastComments oferece disponibilidade Active-Active. As solicitações do seu datacenter são roteadas para o ponto de presença mais próximo do seu. Isso é automático e, normalmente, você pode observar a semântica de leitura após escrita. Se quiser garantir a leitura de suas próprias escritas, pode fixar suas solicitações a uma região específica usando essa região como host da API (embora isso geralmente não seja necessário na maioria das integrações):

  • 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

Observe que, se fizer isso, pode ser necessário definir um fallback, pois nós descontinuamos nós de ponto de entrada no passado e usamos novos nomes para a troca.

Estrutura de Registro de Auditoria Internal Link

Um AuditLog é um objeto que representa um evento auditado para locatários que têm acesso a este recurso.

A estrutura do objeto AuditLog é a seguinte:

Estrutura do AuditLog
Copy Copy
1
2interface AuditLog {
3 id: string;
4 /** Quem realizou o evento. **/
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 /** O navegador que realizou o evento, quando ele veio de um. **/
13 ua?: string;
14 /** Um hash da sessão de onde o evento veio, para correlacionar as ações de uma pessoa. Nunca a própria sessão. **/
15 sIdHashed?: string;
16 when: string;
17 description?: string;
18 serverStartDate: string;
19 /** O id do objeto no qual o evento foi realizado, em oposição a quem o realizou. **/
20 targetId?: string;
21 /** Um rótulo legível para esse objeto, por exemplo "jsmith (jsmith@example.com)". **/
22 targetLabel?: string;
23 objectDetails?: object;
24}
25

targetId e targetLabel descrevem sobre o que o evento foi realizado; userId e username descrevem quem o realizou. Para atualizações, objectDetails.changes contém um mapa {field: {from, to}} do que realmente mudou.

O registro de auditoria é imutável. Também não pode ser escrito manualmente. A FastComments.com pode decidir quando escrever no registro de auditoria. No entanto, você pode lê-lo através desta API.

Os eventos no registro de auditoria expiram após dois anos.

Estrutura de Trabalho em Lote Internal Link

Um BatchJob é uma tarefa de longa duração, como uma importação, uma exportação ou uma migração de página. Os trabalhos são enfileirados, então capturados e executados em segundo plano.

processedCount e totalCount mostram o progresso. Sua unidade depende do type:

  • migrate-pages: migrações concluídas, em relação às migrações solicitadas.
  • undo-page-migration: registros restaurados. Não há totalCount.
  • import, export e outros trabalhos: linhas processadas.

A estrutura do objeto BatchJob é a seguinte:

Estrutura do BatchJob
Copy Copy
1
2interface BatchJob {
3 id: string
4 /** Por exemplo migrate-pages, undo-page-migration, migrate-domains, import, export, users-export ou copy-comments. **/
5 type: string
6 status: 'requested' | 'running' | 'success' | 'failed'
7 createdAt: string
8 completedAt?: string
9 processedCount: number
10 /** Trabalho total, quando é conhecido antecipadamente. **/
11 totalCount?: number
12 /** migrate-pages: uma entrada por migração concluída, na ordem da solicitação. **/
13 pageMigrationResults?: Array<PageMigrationSuccess | PageMigrationFailure>
14 /**
15 * migrate-pages: definido assim que o trabalho for concluído (sucesso ou falha). Passe para POST /api/v1/pages/migrations/:undoId/undo dentro de 90 dias.
16 * undo-page-migration: a migração que está sendo desfeita.
17 **/
18 undoId?: string
19 /** undo-page-migration: definido assim que o trabalho for concluído. **/
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 /** Registros devolvidos aos seus valores de antes da migração. **/
42 restored: number
43 /** Registros deixados como estão porque foram alterados após a migração, ou não existem mais. **/
44 skipped: number
45 /** Registros da migração excluídos ao mesclar páginas. Estes não podem ser recuperados. **/
46 notRestorable: number
47}
48

Tentativas

Se o servidor que executa um trabalho de migração de página for reiniciado, o trabalho é colocado de volta na fila e retoma após a última migração concluída. Um trabalho é tentado até 3 vezes, após o que seu status passa a ser failed.

Estrutura de Comentário Internal Link

Um objeto Comment representa um comentário deixado por um usuário.

A relação entre comentários pai e filhos é definida via parentId.

A estrutura do objeto Comment é a seguinte:

Estrutura do Comment
Copy Copy
1
2interface Comment {
3 /** READONLY: Definido como true se o motor de spam determinou que o comentário era spam. **/
4 aiDeterminedSpam?: boolean
5 /** Se o comentário está aprovado para exibição. Defina como true ao salvar o comentário, caso contrário ele ficará oculto. **/
6 approved?: boolean
7 /** O avatar do usuário. **/
8 avatarSrc?: string
9 /** Comentários filhos. Não preenchido em todos os cenários. Usado quando asTree é definido como true via API. **/
10 children: Comment[]
11 /** O comentário bruto do comentarista. **/
12 comment: string
13 /** READONLY: O comentário do comentarista convertido em HTML. **/
14 commentHTML?: string
15 /** O email do comentarista. Obrigatório se comentários anônimos estiverem desativados. **/
16 commenterEmail?: string
17 /** O link do comentarista (por exemplo, o blog dele). **/
18 commenterLink?: string
19 /** O nome do comentarista. Sempre obrigatório. Se não estiver disponível, defina como algo como "Anonymous". **/
20 commenterName: string
21 /** A data em que o comentário foi deixado, em UTC epoch. **/
22 date: number
23 /** O "rótulo de exibição" do comentário - por exemplo "Admin", "Moderator", ou algo como "VIP User". **/
24 displayLabel?: string
25 /** O domínio onde o comentário foi postado. **/
26 domain?: string
27 /** READONLY: O número de vezes que o comentário foi marcado. **/
28 flagCount?: number
29 /** As #hashtags escritas no comentário que foram analisadas com sucesso. Você também pode adicionar hashtags manualmente, para consulta, mas elas não serão exibidas automaticamente no texto do comentário. **/
30 hashTags?: CommentHashTag[]
31 /** READONLY: O comentário contém imagens? **/
32 hasImages?: boolean
33 /** READONLY: O comentário contém links? **/
34 hasLinks?: boolean
35 /** READONLY: O id único do comentário. **/
36 id: string
37 /** Somente na criação! Este valor é hasheado para armazenamento. **/
38 ip?: string
39 /** READONLY: O usuário atual bloqueou o usuário que escreveu este comentário? **/
40 isBlocked?: boolean
41 /** READONLY: O comentário é de um admin? Definido automaticamente com base no userId. **/
42 isByAdmin?: boolean
43 /** READONLY: O comentário é de um moderador? Definido automaticamente com base no userId. **/
44 isByModerator?: boolean
45 /** Definido como true se o comentário foi excluído de forma suave (um placeholder precisou ser deixado devido a alguma outra configuração). **/
46 isDeleted?: boolean
47 /** Definido como true se a conta do usuário foi excluída e o comentário precisou ser mantido. **/
48 isDeletedUser?: boolean
49 /** READONLY: Foi marcado pelo usuário atualmente logado (contextUserId)? **/
50 isFlagged?: boolean
51 /** O comentário está fixado? **/
52 isPinned?: boolean
53 /** O comentário está bloqueado? Quando true, ninguém (incluindo moderadores) pode responder, editar ou excluí-lo até que seja desbloqueado. **/
54 isLocked?: boolean
55 /** O comentário é spam? **/
56 isSpam?: boolean
57 /** READONLY: O comentário recebeu voto negativo para o usuário atual (contextUserId)? **/
58 isVotedDown?: boolean
59 /** READONLY: O comentário recebeu voto positivo para o usuário atual (contextUserId)? **/
60 isVotedUp?: boolean
61 /** O locale do comentário. Se não for fornecido, será derivado do header 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: As @menções escritas no comentário que foram analisadas com sucesso. **/
64 mentions?: CommentUserMention[]
65 /** Metadados opcionais associados ao comentário. **/
66 meta?: Record<string, string | number | boolean>
67 /** A lista opcional de ids de grupos de moderação associados a este comentário. **/
68 moderationGroupIds?: string[]|null
69 /** READONLY: O id do objeto de voto que corresponde ao voto do usuário atual (contextUserId) neste comentário. **/
70 myVoteId?: string
71 /** Se notificações foram enviadas para este comentário para os comentaristas. Para evitar que notificações sejam enviadas em importações, defina isto como true. **/
72 notificationSentForParent?: boolean
73 /** Se notificações foram enviadas para este comentário para os usuários do tenant. Para evitar que notificações sejam enviadas em importações, defina isto como true. **/
74 notificationSentForParentTenant?: boolean
75 /** O título da página onde este comentário estava. **/
76 pageTitle?: string
77 /** Se estamos respondendo a um comentário, este é o ID ao qual estamos respondendo. **/
78 parentId?: string|null
79 /** Se o comentário está marcado como revisado. **/
80 reviewed: boolean
81 /** O id do tenant ao qual o comentário pertence. **/
82 tenantId: string
83 /** O usuário que escreveu o comentário. Criado automaticamente ao salvar um comentário com nome/email. **/
84 userId?: string|null
85 /** A URL do local onde este comentário é visível, como um post de blog. **/
86 url: string
87 /** Uma versão "limpa" do urlId que você nos passou. Ao salvar, você especifica este campo, mas ao buscar o comentário de volta ele estará "limpo" e seu valor original movido para "urlIdRaw". **/
88 urlId: string
89 /** READONLY: O urlId original que você nos passou. **/
90 urlIdRaw?: string
91 /** O usuário e este comentário estão verificados? **/
92 verified: boolean
93 /** Número de votos positivos. **/
94 votesUp?: number
95 /** Número de votos negativos. **/
96 votesDown?: number
97 /** O "karma" do comentário (= votos positivos - votos negativos). **/
98 votes?: number
99}
100

Alguns desses campos estão marcados como READONLY - eles são retornados pela API, mas não podem ser definidos.

Estrutura do Texto do Comentário

Os comentários são escritos em uma versão do markdown da FastComments, que é apenas markdown mais tags tradicionais no estilo bbcode para imagens, como [img]path[/img].

O texto é armazenado em dois campos. O texto que o usuário digitou é armazenado sem modificações no campo comment. Este é renderizado e armazenado no campo commentHTML.

As tags HTML permitidas são b, u, i, strike, pre, span, code, img, a, strong, ul, ol, li, and br.

É recomendado renderizar o HTML, já que é um subconjunto muito pequeno de HTML, e construir um renderizador é bem simples. Existem várias bibliotecas para React Native e Flutter, por exemplo, para ajudar com isso.

Você pode optar por renderizar o valor não normalizado do campo comment. Um exemplo de parser está aqui..

O parser de exemplo também pode ser ajustado para funcionar com HTML, transformando as tags HTML nos elementos esperados para renderizar na sua plataforma.

Marcações (Tagging)

Quando os usuários são marcados em um comentário, a informação é armazenada em uma lista chamada mentions. Cada objeto dessa lista tem a seguinte estrutura.

O Objeto de Menções do Comentário
Copy CopyRun External Link
1
2interface CommentUserMention {
3 /** O id do usuário. Para usuários SSO, este terá o id do seu tenant como prefixo. **/
4 id: string
5 /** O texto final da tag de @menção, incluindo o símbolo @. **/
6 tag: string
7 /** O texto original da tag de @menção, incluindo o símbolo @. **/
8 rawTag: string
9 /** Que tipo de usuário foi marcado. user = conta FastComments.com. sso = SSOUser. **/
10 type: 'user'|'sso'
11 /** Se o usuário desativar as notificações, isto ainda será definido como true. **/
12 sent: boolean
13}
14

HashTags

Quando hashtags são usadas e analisadas com sucesso, a informação é armazenada em uma lista chamada hashTags. Cada objeto dessa lista tem a seguinte estrutura. Hashtags também podem ser adicionadas manualmente ao array hashTags do comentário para consulta, se retain estiver definido.

O Objeto HashTag do Comentário
Copy CopyRun External Link
1
2interface CommentHashTag {
3 /** O id da hashtag. **/
4 id: string
5 /** O texto final da tag de #hashtag, incluindo o símbolo #. **/
6 tag: string
7 /** Se a hashtag estiver associada a uma URL personalizada, isto será definido. **/
8 url?: string
9 /** Se devemos manter a hashtag, mesmo que ela não exista no texto do comentário, quando o comentário for atualizado. Útil para marcar comentários sem alterar o texto do comentário. **/
10 retain?: boolean
11}
12

Estrutura de Modelo de Email Internal Link

Um objeto EmailTemplate representa a configuração para um modelo de e-mail personalizado, para um tenant.

O sistema selecionará o modelo de e-mail a ser usado via:

  • Seu identificador de tipo, chamamos isto de emailTemplateId. Estes são constantes.
  • O domain. Primeiro tentaremos encontrar um template para o domínio ao qual o objeto relacionado (como um Comment) está vinculado, e se não for encontrada uma correspondência então tentaremos encontrar um template onde domain seja null ou *.

A estrutura para o objeto EmailTemplate é a seguinte:

Estrutura do Modelo de Email
Copy Copy
1
2interface EmailTemplate {
3 id: string
4 tenantId: string
5 emailTemplateId: string
6 displayName: string
7 /** SOMENTE LEITURA **/
8 createdAt: string
9 /** SOMENTE LEITURA **/
10 updatedAt: string
11 /** SOMENTE LEITURA **/
12 updatedByUserId: string
13 /** O domínio ao qual o modelo deve estar associado. **/
14 domain?: string | '*' | null
15 /** O conteúdo do modelo de e-mail em sintaxe EJS. **/
16 ejs: string
17 /** Um mapa de chaves de tradução sobrescritas para valores, para cada localidade suportada. **/
18 translationOverridesByLocale: Record<string, Record<string, string>>
19 /** Um objeto que representa o contexto de renderização do modelo. **/
20 testData: object
21}
22

Notas

  • Você pode obter os valores válidos de emailTemplateId a partir do endpoint /definitions.
  • O endpoint /definitions também inclui as traduções padrão e os dados de teste.
  • Os modelos não serão salvos se a estrutura ou os dados de teste forem inválidos.

Estrutura de Postagem de Feed Internal Link

Um objeto FeedPost representa uma postagem em um feed do FastComments. Um feed é um fluxo de postagens com seus próprios tópicos de comentários, renderizado pelo widget Feed. Cada postagem tem um autor, conteúdo rico opcional, mídia e links, e pode ser marcada para que um feed possa ser filtrado.

A estrutura do objeto FeedPost é a seguinte:

Estrutura FeedPost
Copy Copy
1
2interface FeedPost {
3 /** APENAS LEITURA **/
4 _id: string
5 /** APENAS LEITURA **/
6 tenantId: string
7 title?: string
8 /** O id do usuário FastComments ou SSO que criou a postagem. **/
9 fromUserId?: string
10 /** Preenchido a partir do usuário quando não definido. **/
11 fromUserDisplayName?: string | null
12 /** APENAS LEITURA. Preenchido a partir do usuário. **/
13 fromUserAvatar?: string | null
14 /** Usado para filtrar um feed. **/
15 tags?: string[]
16 /** Peso de ordenação dentro de um feed. Valores maiores são exibidos primeiro. **/
17 weight?: number
18 /** Pares chave/valor de formato livre para seu próprio uso. **/
19 meta?: Record<string, string>
20 /** HTML sanitizado. **/
21 contentHTML?: string
22 media?: FeedPostMediaItem[]
23 links?: FeedPostLink[]
24 /** APENAS LEITURA **/
25 createdAt: string
26 /** APENAS LEITURA. Tipo de reação a contar. **/
27 reacts?: Record<string, number>
28 /** APENAS LEITURA **/
29 commentCount?: number | null
30}
31
32interface FeedPostMediaItem {
33 title?: string
34 /** Para onde o item de mídia aponta quando clicado. **/
35 linkUrl?: string
36 /** Uma entrada por variação. O widget escolhe a melhor opção. **/
37 sizes: FeedPostMediaItemAsset[]
38}
39
40interface FeedPostMediaItemAsset {
41 w: number
42 h: number
43 src: string
44}
45
46interface FeedPostLink {
47 /** O texto do link, como "Inscreva‑se agora". **/
48 text?: string
49 /** Um título exibido com o link. **/
50 title?: string
51 /** Uma descrição exibida com o link. **/
52 description?: string
53 url?: string
54}
55

Notas:

  • Alguns desses campos são marcados como READONLY – eles são retornados pela API, mas não podem ser definidos.
  • Os comentários em uma postagem são comentários regulares cujo urlId é post: seguido pelo _id da postagem. Use esse valor com a API de Comentários para ler ou criar comentários em uma postagem.

Estrutura de Hashtag Internal Link

Um objeto HashTag representa uma tag que pode ser deixada por um usuário. HashTags podem ser usadas para vincular a um conteúdo externo ou para conectar comentários relacionados.

A estrutura do objeto HashTag é a seguinte:

Estrutura de HashTag
Copy Copy
1
2interface HashTag {
3 /** Deve começar com o caractere "#" ou o desejado. **/
4 tag: string
5 /** Uma URL opcional para a qual a hashtag pode apontar. Em vez de filtrar comentários por hashtag, a UI redirecionará para esta URL ao clicar. **/
6 url?: string
7 /** READONLY **/
8 createdAt: string
9}
10

Notas:

  • Em alguns endpoints da API você verá que a hashtag é usada na URL. Lembre-se de usar valores com URI-Encoded. Por exemplo, # deve ser representado como %23.
  • Alguns desses campos estão marcados como READONLY - eles são retornados pela API, mas não podem ser definidos.

Estrutura de Contagem de Notificações Internal Link

Um NotificationCount object representa a contagem de notificações não lidas e os metadados de um usuário.

Se não houver notificações não lidas, não haverá um NotificationCount para o usuário.

Objetos NotificationCount são criados automaticamente e não podem ser criados via API. Eles também expiram após um ano.

Você pode limpar a contagem de notificações não lidas de um usuário excluindo o seu NotificationCount.

A estrutura do objeto NotificationCount é a seguinte:

Estrutura do NotificationCount
Copy Copy
1
2interface NotificationCount {
3 id: string // id do usuário
4 count: number
5 createdAt: string // string de data
6 expireAt: string // string de data
7}
8

Estrutura de Notificação Internal Link

Um objeto Notification representa uma notificação para um usuário.

Objetos Notification são criados automaticamente e não podem ser criados via API. Eles também expiram após um ano. Notificações não podem ser excluídas. Elas podem, no entanto, ser atualizadas para definir viewed como false, e você pode consultar por viewed.

Um usuário também pode optar por não receber notificações para um comentário específico configurando optedOut na notificação para true. Você pode optar por receber novamente definindo para false.

Existem diferentes tipos de notificação - verifique relatedObjectType e type.

As formas como notificações são criadas são bastante flexíveis e podem ser acionadas por muitos cenários (veja NotificationType).

Atualmente, a existência de uma Notification não implica necessariamente que um e-mail foi ou deve ser enviado. Em vez disso, as notificações são usadas para o feed de notificações e integrações relacionadas.

A estrutura do objeto Notification é a seguinte:

Estrutura de Notification
Copy Copy
1
2enum NotificationObjectType {
3 Comment = 0,
4 Profile = 1,
5 Tenant = 2
6}
7
8enum NotificationType {
9 /** Se alguém respondeu para você. **/
10 RepliedToMe = 0,
11 /** Se alguém respondeu em qualquer lugar de uma thread (até filhos de filhos) de uma thread na qual você comentou. **/
12 RepliedTransientChild = 1,
13 /** Se seu comentário foi votado positivamente. **/
14 VotedMyComment = 2,
15 /** Se um novo comentário for deixado na raiz de uma página à qual você está inscrito. **/
16 SubscriptionReplyRoot = 3,
17 /** Se alguém comentou no seu perfil. **/
18 CommentedOnProfile = 4,
19 /** Se você tiver uma mensagem direta (DM). **/
20 DirectMessage = 5,
21 /** TrialLimits é apenas para usuários do tenant. **/
22 TrialLimits = 6,
23 /** Se você foi mencionado com @. **/
24 Mentioned = 7
25}
26
27interface Notification {
28 id: string
29 tenantId: string
30 /** With SSO, the user id is in the format `<tenant id>:<user id>`. **/
31 userId?: string
32 /** Ao trabalhar com SSO, você só precisa se preocupar com `userId`. **/
33 anonUserId?: string
34 /** urlId quase sempre está definido. Ele é opcional apenas para notificações em nível de tenant, que são infrequentes. **/
35 urlId?: string
36 /** A URL é armazenada em cache para navegação rápida até a origem da notificação. **/
37 url?: string
38 /** O título da página é armazenado em cache para leitura rápida da origem da notificação. **/
39 pageTitle?: string
40 relatedObjectType: NotificationObjectType
41 /** Por exemplo, id do comentário. **/
42 relatedObjectId: string
43 viewed: boolean
44 createdAt: string // string de data
45 type: NotificationType
46 fromCommentId?: string
47 fromVoteId?: string
48 /** fromUserName e fromUserAvatarSrc são armazenados em cache aqui para exibição rápida da notificação. Eles são atualizados quando o usuário é atualizado. **/
49 fromUserName: string
50 fromUserId: string
51 fromUserAvatarSrc?: string
52 /** Defina isto como true para parar de receber notificações para este objeto. **/
53 optedOut?: boolean
54}
55

Estrutura de Página Internal Link

Um Page object representa a página à qual muitos comentários podem pertencer. Esse relacionamento é definido por urlId.

Um Page armazena informações como o título da página, a contagem de comentários e urlId.

A estrutura do objeto Page é a seguinte:

Estrutura da Página
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 /** Definir isto como null significa que todos os usuários SSO podem ver a página. Uma lista vazia significa que está fechada para todos os usuários. **/
11 accessibleByGroupIds?: string[] | null
12 /** Esta página está fechada para novos comentários? **/
13 isClosed?: boolean
14}
15

Estrutura de Enquete Internal Link

Uma Poll está anexada a um comentário, em vez de ser um objeto independente. Ela é criada junto com o comentário (veja POST /api/v1/comments), ou adicionada a um comentário existente posteriormente com PUT /api/v1/polls/:commentId.

As contagens de votos são mantidas na própria enquete, portanto ler uma enquete fornece os resultados sem precisar somar nada. Os votos individuais por trás dessas contagens são objetos PollVote.

Cada opção tem um id que é gerado quando a enquete é criada. Esse id é usado para registrar um voto, renomear uma opção e manter uma opção (e seus votos) quando você PUT a enquete com opções adicionadas ou removidas. É a única forma segura de referir‑se a uma opção – nunca sua posição na lista.

Estrutura da Enquete
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 /** When set and in the past, the poll is closed and no longer accepts votes. **/
13 closesAt?: string | null
14 /** 0 anonymous (the default), 1 admins and moderators, 2 everyone. Absent means anonymous. **/
15 privacy?: 0 | 1 | 2 | null
16 /** When true, the counts are hidden from anyone who has not voted yet. Absent means false. **/
17 requireVoteToSeeResults?: boolean | null
18}
19

Limites

  • Uma pergunta é obrigatória e tem no máximo 200 caracteres.
  • Uma enquete tem entre 2 e 10 opções.
  • Um rótulo de opção é obrigatório, tem no máximo 100 caracteres e deve ser exclusivo dentro da enquete (ignorando maiúsculas/minúsculas).
  • closesAt deve estar no futuro quando a enquete é criada. Para fechar uma enquete imediatamente, faça PATCH com uma data no passado.

Configurações do Site

Enquetes obedecem à configuração do seu site, que pode ser alterada em Personalizar Widget:

  • As enquetes devem estar habilitadas antes que uma enquete possa ser criada, ou a API responderá com polls-disabled.
  • A votação pode ser limitada a usuários autenticados, caso em que um voto enviado apenas com um anonUserId será rejeitado com poll-login-required.

Estrutura de Voto de Enquete Internal Link

A PollVote é a resposta de uma pessoa a uma enquete. As contagens exibidas na própria enquete são mantidas em sincronia com estas, então você só precisa delas quando quiser saber quem votou em quê, em vez dos totais.

Um eleitor tem no máximo um voto por enquete. Votar novamente move o voto existente para a nova opção em vez de adicionar um segundo, e updatedAt registra quando isso aconteceu.

voterId é o userId quando o eleitor estava logado, e o anonUserId caso contrário.

Estrutura de PollVote
Copy Copy
1
2interface PollVote {
3 id: string
4 tenantId: string
5 commentId: string
6 urlId: string
7 /** O userId quando o eleitor estava logado, caso contrário o anonUserId. **/
8 voterId: string
9 optionId: string
10 createdAt: string
11 /** Quando o eleitor moveu seu voto pela última vez para uma opção diferente. **/
12 updatedAt?: string
13}
14

Privacidade

A configuração de privacy da enquete se aplica a esta API da mesma forma que se aplica no widget de comentários:

  • Anônima (o padrão): ninguém pode ver como alguém votou, então os votos não podem ser lidos. GET /api/v1/poll-votes e GET /api/v1/poll-votes/:id respondem com poll-anonymous. As contagens da enquete ainda estão disponíveis em GET /api/v1/polls/:commentId.
  • Administradores e moderadores: sua chave de API pertence ao administrador do seu site, então ela pode ler os votos.
  • Todos: os votos podem ser lidos.

A privacidade da enquete pode ser restringida, mas não ampliada, depois que ela tiver votos.

Estrutura de Evento de Webhook Pendente Internal Link

Um objeto PendingWebhookEvent representa um evento de webhook enfileirado que está pendente.

Objetos PendingWebhookEvent são criados automaticamente e não podem ser criados manualmente via API. Eles também expiram após um ano. Eles podem ser excluídos, o que remove a tarefa da fila.

Existem diferentes tipos de evento - verifique eventType (OutboundSyncEventType) e type (OutboundSyncType).

Um caso de uso comum para esta API é implementar monitoramento personalizado. Você pode querer chamar periodicamente o endpoint /count para consultar a contagem pendente para filtros dados.

A estrutura do objeto PendingWebhookEvent é a seguinte:

Estrutura de PendingWebhookEvent
Copy Copy
1
2enum OutboundSyncEventType {
3 Create: 0,
4 Delete: 1,
5 Update: 2
6}
7
8enum OutboundSyncType {
9 /** Tarefa de sincronização específica do WordPress. **/
10 WP: 0,
11 Webhook: 1
12}
13
14interface PendingWebhookEvent {
15 id: string
16 /** O id do comentário associado ao evento. **/
17 commentId: string
18 /** O objeto de comentário para o evento no momento do evento. Começamos a adicioná-los em nov de 2023. **/
19 comment: Comment
20 /** Um id externo que pode estar associado ao comentário. **/
21 externalId: string | null
22 createdAt: Date
23 tenantId: string
24 attemptCount: number
25 /** Definido antes da primeira tentativa e após cada falha. **/
26 nextAttemptAt: Date
27 /** Se este é um evento de criação, exclusão ou atualização... **/
28 eventType: OutboundSyncEventType
29 /** O tipo de sincronização a ser executada (WordPress, chamada de API, etc). **/
30 type: OutboundSyncType
31 /** O domínio que correspondeu ao comentário. Usamos este domínio para escolher a chave de API. **/
32 domain: string
33 /** O último erro ocorrido. Este tipo não é tipado e é um "dump" do que aconteceu. Geralmente contém um objeto com statusCode, body, e um mapa de headers. **/
34 lastError: object | null
35}
36

Estrutura de Usuário SSO Internal Link

O FastComments fornece uma solução de SSO fácil de usar. Atualizar as informações de um usuário com a integração baseada em HMAC é tão simples quanto fazer o usuário carregar a página com um payload atualizado.

No entanto, pode ser desejável gerenciar um usuário fora desse fluxo, para melhorar a consistência da sua aplicação.

A API SSO User fornece uma forma de realizar CRUD em objetos que chamamos de SSOUsers. Esses objetos são diferentes dos Users regulares e são mantidos separados por segurança de tipos.

A estrutura do objeto SSOUser é a seguinte:

Estrutura do 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 // Permissão de Admin - usuários SSO com esta flag são cobrados como SSO Admins (separados dos usuários SSO regulares)
16 isAdminAdmin?: boolean // Permissão de Admin - usuários SSO com esta flag são cobrados como SSO Admins (separados dos usuários SSO regulares)
17 isCommentModeratorAdmin?: boolean // Permissão de Moderador - usuários SSO com esta flag são cobrados como SSO Moderadores (separados dos usuários SSO regulares)
18 /** Se null, o Controle de Acesso não será aplicado ao usuário. Se for uma lista vazia, este usuário não poderá ver nenhuma página nem @mencionar outros usuários. **/
19 groupIds?: string[] | null
20 createdFromSimpleSSO?: boolean
21 /** Não permite que outros usuários vejam a atividade deste usuário, incluindo comentários, em seu perfil. O padrão é true para fornecer perfis seguros por padrão. **/
22 isProfileActivityPrivate?: boolean
23 /** Não permite que outros usuários deixem comentários no perfil do usuário, ou vejam os comentários existentes do perfil. Padrão é false. **/
24 isProfileCommentsPrivate?: boolean
25 /** Não permite que outros usuários enviem mensagens diretas para este usuário. Padrão é false. **/
26 isProfileDMDisabled?: boolean
27 karma?: number
28 /** Configuração opcional para emblemas do usuário. **/
29 badgeConfig?: {
30 /** Array de IDs de emblemas a serem atribuídos ao usuário. Limitado a 30 emblemas. A ordem é respeitada. Estes são emblemas globais visíveis em todas as páginas. **/
31 badgeIds: string[]
32 /** Array de IDs de emblemas com escopo na página atual (urlId). Esses emblemas são exibidos apenas na página onde foram atribuídos. **/
33 pageBadgeIds?: string[]
34 /** Se true, substitui todos os emblemas exibidos existentes pelos fornecidos. Emblemas globais e com escopo de página são substituídos de forma independente. Se false, adiciona aos emblemas existentes. **/
35 override?: boolean
36 /** Se true, atualiza as propriedades de exibição dos emblemas a partir da configuração do tenant. **/
37 update?: boolean
38 }
39}
40

Cobrança de Usuários SSO

Os usuários SSO são cobrados de forma diferente com base em suas flags de permissão:

  • Usuários SSO Regulares: Usuários sem permissões de admin ou moderador são cobrados como usuários SSO regulares
  • SSO Admins: Usuários com as flags isAccountOwner ou isAdminAdmin são cobrados separadamente como SSO Admins (mesma tarifa que admins de tenant regulares)
  • SSO Moderadores: Usuários com a flag isCommentModeratorAdmin são cobrados separadamente como SSO Moderadores (mesma tarifa que moderadores regulares)

Importante: Para evitar cobrança duplicada, o sistema deduplica automaticamente usuários SSO em relação a usuários e moderadores de tenant regulares por endereço de e-mail. Se um usuário SSO tiver o mesmo e-mail que um usuário ou moderador de tenant regular, ele não será cobrado duas vezes.

Controle de Acesso

Os usuários podem ser divididos em grupos. É para isso que serve o campo groupIds, que é opcional.

@Menções

Por padrão, as @menções usarão username para buscar outros usuários SSO quando o caractere @ for digitado. Se displayName for usado, os resultados correspondentes a username serão ignorados quando houver uma correspondência para displayName, e os resultados da busca de @menções usarão displayName.

Assinaturas

Com o FastComments, os usuários podem assinar uma página clicando no ícone de sino no widget de comentários e clicando em Assinar.

Com um usuário regular, enviamos e-mails de notificação com base nas suas configurações de notificação.

Com Usuários SSO, separamos isso por compatibilidade com versões anteriores. Os usuários só receberão esses e-mails adicionais de notificação de assinatura se você definir optedInSubscriptionNotifications como true.

Emblemas

Você pode atribuir emblemas a usuários SSO usando a propriedade badgeConfig. Emblemas são indicadores visuais que aparecem ao lado do nome de um usuário nos comentários.

  • badgeIds - Um array de IDs de emblemas a serem atribuídos ao usuário. Estes são emblemas globais visíveis em todas as páginas. Devem ser IDs de emblemas válidos criados na sua conta FastComments. Limitado a 30 emblemas.
  • pageBadgeIds - Um array opcional de IDs de emblemas com escopo na página atual (urlId). Esses emblemas são exibidos apenas na página onde foram atribuídos. Páginas diferentes podem ter emblemas com escopo de página diferentes para o mesmo usuário.
  • override - Se true, todos os emblemas exibidos existentes serão substituídos pelos fornecidos. Emblemas globais e com escopo de página são substituídos de forma independente — substituir emblemas globais não afeta emblemas com escopo de página, e vice-versa. Se false ou omitido, os emblemas fornecidos serão adicionados aos emblemas existentes.
  • update - Se true, as propriedades de exibição dos emblemas serão atualizadas a partir da configuração do tenant sempre que o usuário fizer login.

Estrutura de Assinatura Internal Link

Um objeto Subscription representa uma assinatura de um usuário.

Objetos Subscription são criados quando um usuário clica no sininho de notificações no widget de comentários e clica em "Subscribe to this page".

Assinaturas também podem ser criadas via API.

Ter um objeto Subscription faz com que objetos Notification sejam gerados e e-mails sejam enviados quando novos comentários são deixados na raiz da página associada para a qual a Subscription foi criada. O envio de e-mails depende do tipo de usuário. Para usuários regulares, isso depende de optedInNotifications. Para usuários SSO, depende de optedInSubscriptionNotifications. Observe que alguns aplicativos podem não ter o conceito de uma página acessível pela web, caso em que basta definir urlId como o id do item ao qual você está assinando (o mesmo valor de urlId que você passaria para o widget de comentários).

A estrutura do objeto Subscription é a seguinte:

Estrutura de Subscription
Copy Copy
1
2interface Subscription {
3 id: string
4 tenantId: string
5 /** Com SSO, o id do usuário está no formato `<tenant id>:<user id>`. **/
6 userId: string
7 anonUserId?: string
8 urlId: string
9 url?: string
10 pageTitle?: string
11 createdAt: string // date string
12}
13

Estrutura de Uso Diário do Inquilino Internal Link

Um objeto TenantDailyUsage representa o uso para um tenant em um determinado dia. Se não houve atividade para um tenant em um determinado dia, esse dia não terá um objeto TenantDailyUsage.

O objeto TenantDailyUsage é NÃO em tempo real e pode estar com atraso de alguns minutos em relação ao uso real.

A estrutura do objeto TenantDailyUsage é a seguinte:

Estrutura do 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 /** Ignorado para faturamento. **/
19 ignored: boolean
20}
21

Estrutura de Inquilino Internal Link

O Tenant define um cliente do FastComments.com. Eles podem ser criados via API por tenants com acesso a white labeling. Tenants white-labeled não podem criar outros tenants white-labeled (apenas um nível de aninhamento é permitido).

A estrutura para o objeto Tenant é a seguinte:

Estrutura do Tenant
Copy Copy
1
2export enum SiteType {
3 Unknown = 0,
4 WordPress = 1
5}
6
7/** Isso também pode ser tratado pela API DomainConfig. **/
8export interface TenantDomainConfig {
9 domain: string
10 emailFromName?: string
11 emailFromEmail?: string
12 createdAt?: string,
13 siteType?: FastCommentsSiteType, // provavelmente você quer Unknown
14 logoSrc?: string, // caminho bruto da imagem
15 logoSrc100px?: string, // redimensionado para miniaturas
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; // number por razões "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 - É calculado com base em packageId. **/
65 hasFlexPricing?: boolean
66 /** @readonly **/
67 flexLastBilledAmount?: number
68 /** @readonly - É calculado com base em 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

Estrutura de Usuário Internal Link

User é um objeto que representa o denominador mais comum entre todos os usuários.

Lembre-se que na FastComments temos diversos casos de uso diferentes para usuários:

  • Secure SSO
  • Simple SSO
  • Tenant Users (For example: Administrators)
  • Commenters

Esta API é para Commenters e usuários criados via Simple SSO. Basicamente, qualquer usuário criado através do seu site pode ser acessado por esta API. Tenant Users também podem ser obtidos desta forma, mas você obterá mais informações ao interagir com a API /tenant-users/.

Para Secure SSO por favor use a API /sso-users/.

Você não pode atualizar esses tipos de usuários. Eles criaram sua conta através do seu site, então fornecemos um acesso básico somente leitura, mas você não pode fazer alterações. Se você quiser ter esse tipo de fluxo - você precisa configurar Secure SSO.

A estrutura do objeto User é a seguinte:

Estrutura do User
Copy Copy
1
2export interface User {
3 /** Este também é o id usado como userId em objetos de comentário. **/
4 id: string
5 username: string
6 /** Um link para o blog do comentarista, por exemplo. **/
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

Estrutura de Voto Internal Link

Um objeto Vote representa um voto deixado por um usuário.

A relação entre comentários e Vote é definida via commentId.

A estrutura para o objeto Vote é a seguinte:

Estrutura do 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

Estrutura de Configuração de Pergunta Internal Link

O FastComments fornece uma forma de construir perguntas e agregar seus resultados. Um exemplo de pergunta (doravante chamada QuestionConfig) pode ser uma avaliação em estrelas, um slider ou uma pergunta NPS (determinada via type).

Os dados das perguntas podem ser agregados individualmente, em conjunto, ao longo do tempo, de forma geral, por página e assim por diante.

O framework possui todas as capacidades necessárias para construir widgets no lado do cliente (com seu servidor na frente desta API), painéis administrativos e ferramentas de relatórios.

Primeiro, temos que definir uma QuestionConfig. A estrutura é a seguinte:

Estrutura de 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 /** READONLY - incremented for each new response. **/
13 usedCount: number
14 /** A date string for when the configuration was last used (result left). **/
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

Estrutura de Resultado de Pergunta Internal Link

Para salvar resultados de perguntas, você cria um QuestionResult. Você pode então agregar resultados de perguntas, e também vinculá-los a comentários para fins de relatório.

Estrutura de 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

Estrutura de Emblema de Usuário Internal Link

UserBadge é um objeto que representa um distintivo atribuído a um usuário no sistema FastComments.

Os distintivos podem ser atribuídos a usuários automaticamente com base em sua atividade (como contagem de comentários, tempo de resposta, status de veterano) ou manualmente por administradores do site.

A estrutura do objeto UserBadge é a seguinte:

Estrutura de UserBadge
Copy Copy
1
2export interface UserBadge {
3 /** Identificador único para esta atribuição de distintivo do usuário */
4 id: string
5 /** ID do usuário a quem este distintivo foi atribuído */
6 userId: string
7 /** ID da definição do distintivo do catálogo de distintivos do tenant */
8 badgeId: string
9 /** ID do tenant que criou/atribuído este distintivo */
10 fromTenantId: string
11 /** Quando este distintivo foi criado (milissegundos desde epoch) */
12 createdAt?: number
13 /** Quando este distintivo foi recebido pelo usuário (milissegundos desde epoch) */
14 receivedAt?: number
15 /**
16 * O tipo do distintivo:
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 /** Para distintivos baseados em limiar, o valor do limiar */
25 threshold?: number
26 /** O nome/rótulo do distintivo */
27 name?: string
28 /** Descrição detalhada do distintivo */
29 description?: string
30 /** O texto exibido no distintivo */
31 displayLabel?: string
32 /** URL para uma imagem exibida no distintivo */
33 displaySrc?: string
34 /** Cor de fundo do distintivo (código hex) */
35 backgroundColor?: string
36 /** Cor da borda do distintivo (código hex) */
37 borderColor?: string
38 /** Cor do texto do distintivo (código hex) */
39 textColor?: string
40 /** Classe CSS adicional para estilização */
41 cssClass?: string
42 /** Para distintivos de veterano, o limiar de tempo em milissegundos */
43 veteranUserThresholdMillis?: number
44 /** Se este distintivo é exibido nos comentários do usuário */
45 displayedOnComments: boolean
46 /** A ordem de exibição do distintivo */
47 order?: number
48 /** Se definido, este distintivo é exibido apenas na página com o urlId correspondente. Null para distintivos globais. */
49 urlId?: string | null
50}
51

Estrutura de Progresso de Emblema de Usuário Internal Link

UserBadgeProgress é um objeto que representa o progresso de um usuário na conquista de várias insígnias no sistema FastComments.

Esse acompanhamento ajuda a determinar quando os usuários devem receber insígnias automáticas com base em sua atividade e participação na sua comunidade.

A estrutura do objeto UserBadgeProgress é a seguinte:

Estrutura UserBadgeProgress
Copy Copy
1
2export interface UserBadgeProgress {
3 /** Identificador único para este registro de progresso */
4 id: string
5 /** ID do locatário ao qual este registro de progresso pertence */
6 tenantId: string
7 /** ID do usuário que este registro de progresso rastreia */
8 userId: string
9 /** ID do primeiro comentário do usuário no sistema */
10 firstCommentId?: string
11 /** Data do primeiro comentário do usuário (milissegundos desde epoch) */
12 firstCommentDate?: number
13 /** Fator de confiança calculado automaticamente com base na atividade do usuário */
14 autoTrustFactor?: number
15 /** Fator de confiança definido manualmente pelos administradores */
16 manualTrustFactor?: number
17 /** Objeto de progresso detalhado com várias métricas, chaves correspondem ao enum BadgeType */
18 progress: {
19 /** 0: CommentCount - Contagem de comentários que o usuário fez */
20 '0'?: number
21 /** 1: CommentUpVotes - Contagem de votos positivos que o usuário recebeu */
22 '1'?: number
23 /** 2: CommentReplies - Contagem de respostas que o usuário fez */
24 '2'?: number
25 /** 3: CommentsPinned - Contagem de comentários fixados que o usuário possui */
26 '3'?: number
27 /** 4: Veteran - Idade da conta do usuário */
28 '4'?: number
29 /** 5: NightOwl - Quantas vezes o usuário postou durante horários noturnos */
30 '5'?: number
31 /** 6: FastReplyTime - Tempo médio de resposta em milissegundos */
32 '6'?: number
33 /** 7: ModeratorCommentsDeleted - Para insígnias de moderador, contagem de comentários excluídos */
34 '7'?: number
35 /** 8: ModeratorCommentsApproved - Para insígnias de moderador, contagem de comentários aprovados */
36 '8'?: number
37 /** 9: ModeratorCommentsUnapproved - Para insígnias de moderador, contagem de comentários não aprovados */
38 '9'?: number
39 /** 10: ModeratorCommentsReviewed - Para insígnias de moderador, contagem de comentários revisados */
40 '10'?: number
41 /** 11: ModeratorCommentsMarkedSpam - Para insígnias de moderador, contagem de comentários marcados como spam */
42 '11'?: number
43 /** 12: ModeratorCommentsMarkedNotSpam - Para insígnias de moderador, contagem de comentários marcados como não spam */
44 '12'?: number
45 /** 13: RepliedToSpecificPage - Para cada página, contagem de respostas */
46 '13'?: Record<string, number>
47 }
48}
49

Conclusão

Esperamos que você tenha achado nossa documentação da API completa e fácil de entender. Se encontrar alguma lacuna, avise-nos abaixo.