
Idioma 🇧🇷 Português (Brasil)
Recursos de API
Autenticação
Agregações
Registros de Auditoria
Trabalhos em Lote
Comentários
Modelos de Email
Postagens de Feed
Hashtags
Eu
Moderadores
Contagem de Notificações
Notificações
Reações de Página
Páginas
Enquetes
Votos de Enquete
Eventos de Webhook Pendentes
Usuários SSO
Assinaturas
Uso Diário do Inquilino
Inquilinos
Pacotes de Inquilino
Usuários de Inquilino
Usuários
Votos
Configurações de Domínio
Configurações de Pergunta
Resultados de Pergunta
Agregação de Resultados de Pergunta
Emblemas de Usuário
Progresso de Emblema de Usuário
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:
- fastcomments-cpp
- fastcomments-go
- fastcomments-java
- fastcomments-sdk-js
- fastcomments-nim
- fastcomments-php
- fastcomments-php-sso
- fastcomments-python
- fastcomments-ruby
- fastcomments-rust
- fastcomments-swift
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.
Recursos de API 
Uso de Recursos
Deve‑se observar que a obtenção de dados da API é contabilizada como uso em sua conta.
Cada recurso listará qual é esse uso em sua própria seção.
Alguns recursos custam mais para servir do que outros. Cada endpoint tem um custo fixo de créditos por chamada de API. Para alguns endpoints, o número de créditos varia com base nas opções e nos tamanhos das respostas.
O uso da API pode ser verificado na página Análise de Faturamento e é atualizado a cada poucos minutos.
Nota!
Recomendamos ler a documentação de Pages primeiro, para ajudar a limitar a confusão ao determinar quais valores passar para urlId na API de Comentários.
Webhooks
As assinaturas de Webhook têm seu próprio guia. POST, GET e DELETE /api/v1/webhooks, e GET /api/v1/webhooks/sample-payloads, estão documentados em Gerenciando Assinaturas via API, e as cargas úteis de eventos em Estruturas de Webhook.
Autorização OAuth 
O FastComments é um servidor de autorização OAuth 2.1. Um aplicativo pode obter um token vinculado a uma conta do FastComments e usá-lo em todos os endpoints deste guia no lugar de uma chave de API. É assim que o aplicativo Zapier, o servidor MCP e outras integrações de terceiros se conectam.
Os tokens são emitidos por meio do fluxo de código de autorização com PKCE. Não há client credentials nem grant implícito.
Discovery
As localizações dos endpoints, os grants suportados e os métodos de autenticação são publicados na URL de metadados padrão:

Os endpoints que ele descreve:

Contas na região da UE usam https://eu.fastcomments.com como issuer, com os mesmos caminhos.
Registrando um cliente
Um cliente precisa de um client_id e de um redirect_uri registrado antes de poder iniciar o fluxo. Há duas maneiras de obter um:
- Registro Dinâmico de Cliente.
POST /oauth/registercom um corpo JSON conforme a RFC 7591 (redirect_uris,client_name,client_uri,logo_uri,token_endpoint_auth_method). A resposta contém oclient_ide, para clientes confidenciais, oclient_secret. O registro não é autenticado e tem limite de taxa por IP. - Documento de Metadados de Client ID. O cliente usa uma URL
httpsque ele controla como seuclient_id. O FastComments busca essa URL e lê os mesmos campos de metadados dela. Nenhuma chamada de registro é necessária.
Aplicativos parceiros listados no painel do FastComments, como o Zapier, são registrados pelo FastComments diretamente. Entre em contato com o suporte se você estiver criando um anúncio de marketplace e precisar de um cliente de primeira parte.
Scopes

Uma solicitação que não pede nenhum scope recebe ambos. O usuário vê os scopes solicitados na página de consentimento. Uma solicitação de um scope diferente desses dois falha com invalid_scope.
Etapa 1 - Solicitação de autorização
Envie o navegador do usuário para o endpoint de autorização. PKCE com o método S256 é obrigatório para todos os clientes.


O usuário faz login no FastComments, se necessário, e vê uma página de consentimento que nomeia seu aplicativo, a conta à qual ele será conectado e os scopes solicitados. O usuário deve ter a permissão API Admin nessa conta; qualquer outra pessoa vê um erro de permissão em vez do formulário de consentimento. Aprovar redireciona o navegador para o seu redirect_uri com code e state. Recusar redireciona com error=access_denied.
O código de autorização é válido por 10 minutos e pode ser trocado uma vez. Uma segunda troca do mesmo código revoga todos os tokens produzidos pela primeira troca.
Etapa 2 - Solicitação de token
Troque o código por tokens. O corpo é codificado como form. Clientes confidenciais se autenticam com client_secret_basic (HTTP Basic) ou client_secret_post (segredo no corpo). Clientes públicos enviam apenas client_id.



Os erros seguem a RFC 6749: um corpo JSON com error e error_description, HTTP 400 para invalid_request, invalid_grant, invalid_scope, invalid_target e unsupported_grant_type, HTTP 401 para invalid_client, HTTP 429 quando há limite de taxa.
Etapa 3 - Chamando a API
Envie o access token como um bearer token. O tenant é implícito pelo token, então tenantId é opcional. Quando fornecido, deve corresponder ao token ou a solicitação falha.

GET /api/v1/me retorna o tenant, o usuário autorizante e os scopes concedidos, o que o torna a chamada certa para um teste de conexão. Uma solicitação com um token expirado ou revogado recebe HTTP 401. Uma solicitação cujo método precisa de um scope que o token não possui recebe HTTP 403.
Etapa 4 - Atualizando


A resposta tem a mesma forma da troca de código. Os refresh tokens rotacionam: cada refresh retorna um novo refresh_token e revoga o antigo após uma janela de carência de 30 segundos para solicitações concorrentes. Apresentar um refresh token que foi rotacionado há mais de 30 segundos é tratado como replay e revoga todo o grant. Aplicativos parceiros registrados pelo FastComments são isentos da rotação e recebem de volta o mesmo refresh token com sua validade estendida por mais 30 dias.
Um refresh também verifica novamente se o usuário autorizante ainda possui API Admin na conta. Caso contrário, o grant é revogado e a resposta é invalid_grant.
Revogação

Revogar um refresh token revoga todos os access tokens emitidos a partir do mesmo grant. Revogar um access token revoga apenas esse token. O endpoint retorna HTTP 200 com um objeto JSON vazio, independentemente de o token ter sido encontrado ou não, conforme a RFC 7009.
Os usuários também podem revogar uma conexão em Connected Apps no painel do FastComments. Todos os tokens desse aplicativo param de funcionar imediatamente.
Agregue Seus Dados 
Esta API agrega documentos agrupando-os (se groupBy for fornecido) e aplicando múltiplas operações. Diferentes operações (por exemplo sum, countDistinct, avg, etc.) são suportadas.
O custo é variável. A cada 500 objetos analisados custa 1 crédito de API.
O uso máximo de memória permitido por chamada de API por padrão é 64MB, e por padrão você pode ter apenas uma agregação em execução por vez. Se você enviar múltiplas agregações simultaneamente, elas serão enfileiradas e executadas na ordem em que foram submetidas. Agregações pendentes aguardarão no máximo 60 segundos, após isso a solicitação expirará. Agregações individuais podem executar por até 5 minutos.
Se você tem tenants gerenciados, pode agregar todos os recursos de tenants filhos em uma única chamada passando o parâmetro de query parentTenantId.
Exemplos
Exemplo: Contar valores únicos


Exemplo: Contar distintos

Resposta:

Exemplo: Somar valores de múltiplos campos

Resposta:

Exemplo: Média dos valores de múltiplos campos

Resposta:

Exemplo: Valores mínimos/máximos de múltiplos campos

Resposta:

Exemplo: Contar valores únicos de múltiplos campos

Resposta:

Exemplo: Criação de consulta

Resposta:

Exemplo: Contar comentários pendentes de revisão

Resposta:

Exemplo: Distribuição de comentários aprovados, revisados e spam

Resposta:

Estruturas


Os seguintes recursos podem ser agregados:
- AffiliateEvent
- AnonymousVote
- BannedUser
- BatchJob
- BlockedUser
- Comment
- CommentDeleted
- CommentIdToSyncOutbound
- CommentScheduled
- CommentSyncLog
- CustomConfig
- CustomEmailTemplateRenderError
- EmailToSend
- EventLogEntry
- ImportedCommentScheduled
- ModerationGroup
- Moderator
- Page
- PageReact
- PendingVote
- QuestionResult
- SSOUser
- SentEmail
- SpamEvent
- Tenant
- TenantAuditLog
- TenantBadge
- TenantDailyUsage
- TenantInvoiceHistory
- TenantPackage
- User
- UserBadge
- UserBadgeProgress
- UserNotification
- UserSubscription
- UserUsage
- Vote
Estrutura de Registro de Auditoria 
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:

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.
GET /api/v1/audit-logs 
Esta API usa paginação, fornecida pelos parâmetros skip, limit, before e after. AuditLogs são retornados em páginas de 1000 por padrão, até um limit máximo de 10000, ordenados por when e id. As páginas são grandes porque este endpoint geralmente é usado para exportar o histórico em vez de paginar interativamente.
Cada 100 logs retornados tem um custo de crédito de 1.
Por padrão, você receberá uma lista com os itens mais recentes primeiro. Dessa forma, você pode fazer polling começando com skip=0, paginando até encontrar o último registro que consumiu.
Alternativamente, você pode ordenar do mais antigo para o mais recente e paginar até que não haja mais registros.
A ordenação pode ser feita definindo order como ASC ou DESC. O padrão é DESC.
Consultar por data é possível via before e after como timestamps em milissegundos. before e after NÃO são inclusivos, e cada um pode ser usado isoladamente.
Encontrando o que aconteceu com uma pessoa
Cada evento registra quem o realizou (username, userId, ip) e, separadamente, sobre o que ele foi realizado. targetLabel é um rótulo legível para aquele objeto, por exemplo jsmith (jsmith@example.com), e targetId é seu id. Use target para uma correspondência de substring sem distinção entre maiúsculas e minúsculas no rótulo quando você conhece o nome ou e‑mail de uma pessoa, mas não seu id.
Exclusões capturam o rótulo no momento do evento, de modo que um usuário ou moderador removido ainda pode ser identificado após o registro subjacente ser excluído.
Inquilinos gerenciados
Se o seu inquilino gerencia outros inquilinos, defina includeManagedTenants=true para retornar eventos do seu inquilino e de todos os inquilinos que ele gerencia em uma única resposta. O tenantId de cada log retornado indica de qual inquilino ele provém.



Estrutura de Trabalho em Lote 
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,exporte outros trabalhos: linhas processadas.
A estrutura do objeto BatchJob é a seguinte:

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.
GET /api/v1/batch-jobs 
Esta rota retorna os jobs em lote do locatário de todos os tipos, mais recentes primeiro, 100 por página. Use type e status para filtrar a lista e skip para paginar.



GET /api/v1/batch-jobs/:id 
Esta rota retorna o status, o progresso e, uma vez concluído, o resultado de um job em lote. Use-a para acompanhar um job iniciado por POST /api/v1/pages/migrations ou POST /api/v1/pages/migrations/:undoId/undo.
Um job é concluído quando seu status é success ou failed. Cada chamada custa 1 crédito, portanto faça polling a cada poucos segundos em vez de continuamente.




Estrutura de Comentário 
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:

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.
Run 
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.
Run 
GET /api/v1/comments 
Esta API é usada para obter comentários para exibição ao usuário. Por exemplo, ela filtra automaticamente comentários não aprovados ou de spam.
Paginação
Paginação pode ser feita de duas maneiras, dependendo dos requisitos de desempenho e caso de uso:
- **Mais rápido: Paginação Precalculada:
- É assim que o FastComments funciona quando você usa nossos widgets e clientes pré-construídos.
- Clicar em "next" simplesmente aumenta a contagem de páginas.
- Você pode pensar nisso como sendo recuperado por um armazenamento chave-valor.
- Dessa forma, basta definir um parâmetro
pagecomeçando em0e uma direção de ordenação comodirection. - Os tamanhos de página podem ser personalizados via regras de customização.
- **Mais flexível: Paginação Flexível:
- Dessa forma, você pode definir parâmetros personalizados
limiteskip. Não passepage. directionde ordenação também é suportado.limité o número total a ser retornado após a aplicação deskip.- Exemplo: defina
skip = 200, limit = 100quandopage size = 100epage = 2.
- Exemplo: defina
- Comentários filhos ainda contam na paginação. Você pode contornar isso usando a opção
asTree.- Você pode paginar filhos via
limitChildreneskipChildren. - Você pode limitar a profundidade dos tópicos retornados via
maxTreeDepth.
- Você pode paginar filhos via
- Dessa forma, você pode definir parâmetros personalizados
Tópicos
- Ao usar
Paginação Precalculada, os comentários são agrupados por página e os comentários nos tópicos afetam a página geral.- Dessa forma, os tópicos podem ser determinados no cliente com base em
parentId. - Por exemplo, com uma página contendo um comentário de nível superior e 29 respostas, e definindo
page=0na API – você receberá apenas o comentário de nível superior e os 29 filhos.
- Dessa forma, os tópicos podem ser determinados no cliente com base em
- Ao usar
Paginação Flexível, você pode definir um parâmetroparentId.- Defina isso como null para obter apenas comentários de nível superior.
- Então, para visualizar os tópicos, chame a API novamente e passe
parentId. - Uma solução comum é fazer uma chamada de API para os comentários de nível superior e então fazer chamadas paralelas de API para obter os comentários dos filhos de cada comentário.
- NOVO A partir de fev de 2023! Busque como árvore usando
&asTree=true.- Você pode pensar nisso como
Paginação Flexível como Árvore. - Apenas os comentários de nível superior contam na paginação.
- Defina
parentId=nullpara iniciar a árvore na raiz (você deve definirparentId). - Defina
skipelimitpara paginação. - Defina
asTreecomotrue. - O custo de créditos aumenta em
2x, pois nosso backend precisa fazer muito mais trabalho neste cenário. - Defina
maxTreeDepth,limitChildreneskipChildrenconforme desejado.
- Você pode pensar nisso como
Árvores Explicadas
Ao usar asTree, pode ser difícil raciocinar sobre paginação. Aqui está um gráfico útil:
Obtendo Comentários no Contexto de um Usuário
A API /comments pode ser usada em dois contextos, para diferentes casos de uso:
- Para retornar comentários ordenados e marcados com informações para construir seu próprio cliente.
- Neste caso, defina um parâmetro de consulta
contextUserId.
- Neste caso, defina um parâmetro de consulta
- Para buscar comentários do seu backend para integrações personalizadas.
- A plataforma usará isso por padrão sem
contextUserId.
- A plataforma usará isso por padrão sem




Comentários como Árvore
É possível obter os comentários retornados como uma árvore, com paginação contando apenas os comentários de nível superior.

Quer obter apenas os comentários de nível superior e os filhos imediatos? Aqui está uma maneira:

No entanto, na sua UI você pode precisar saber se deve mostrar um botão "mostrar respostas" em cada comentário. Ao buscar comentários via uma árvore há uma propriedade hasChildren marcada nos comentários quando aplicável.
Comentários como Árvore, Buscando por Hashtag
É possível buscar por hashtag usando a API, em todo o seu tenant (não limitado a uma página, ou urlId).
Neste exemplo, omitimos urlId e buscamos por múltiplas hashtags. A API retornará apenas comentários que possuam todas as hashtags solicitadas.

Estrutura da Requisição de Comentários

Estrutura da Resposta de Comentários

Dicas úteis
ID da URL
Provavelmente você quer usar a API Comment com o parâmetro urlId. Você pode chamar a API Pages primeiro, para ver como são os valores de urlId disponíveis para você.
Ações anônimas
Para comentários anônimos, provavelmente você quer passar anonUserId ao buscar comentários, e ao realizar sinalizações e bloqueios.
(!) Isso é obrigatório em muitas lojas de aplicativos, pois os usuários devem poder sinalizar conteúdo criado por usuários que eles podem ver, mesmo que não estejam logados. Não fazer isso pode fazer com que seu aplicativo seja removido da referida loja.
Comentários não sendo retornados
Verifique se seus comentários estão aprovados e não são spam.
GET /api/v1/comments/:id 
Esta API permite buscar um único comentário por id.



POST /api/v1/comments 
Este endpoint da API fornece a capacidade de criar comentários.
Casos de uso comuns incluem UIs personalizadas, integrações ou importações.
Notas:
- Esta API pode atualizar o widget de comentários "live" se desejado (isso aumenta o
creditsCostde1para2). - Esta API criará automaticamente objetos de usuário em nosso sistema se o email for fornecido.
- Tentar salvar dois comentários com emails diferentes, mas o mesmo nome de usuário, resultará em um erro para o segundo comentário.
- Se você estiver especificando
parentId, e um comentário filho tivernotificationSentForParentcomo false, enviaremos notificações para o comentário pai. Isso é feito a cada hora (agrupamos as notificações para diminuir o número de emails enviados). - Se você quiser enviar emails de boas-vindas ao criar usuários, ou emails de verificação de comentário, defina
sendEmailscomotruenos parâmetros de consulta. - Comentários criados via esta API aparecerão nas páginas de Analytics e Moderation do aplicativo de administração.
- Palavrões ainda são mascarados nos nomes dos comentaristas e no texto do comentário se a configuração estiver ativada.
- Comentários criados via esta API ainda podem ser verificados quanto a spam, se desejado.
- Configurações como comprimento máximo do comentário, se configuradas via a página de administração Customization Rule, serão aplicadas aqui.
Os dados mínimos necessários para enviar que serão exibidos no widget de comentários são os seguintes:

Uma requisição mais realista pode ser:



PATCH /api/v1/comments/:id 
Este endpoint de API fornece a capacidade de atualizar um único comentário.
Observações:
- Esta API pode atualizar o widget de comentários "ao vivo" se desejado (isso aumenta o
creditsCostbase de1para2).- Isso pode tornar a migração de comentários entre páginas "ao vivo" (alterando
urlId). - Migrações custam
2créditos adicionais, pois as páginas são pré-calculadas e isso é intensivo em CPU.
- Isso pode tornar a migração de comentários entre páginas "ao vivo" (alterando
- Diferente da API de criação, esta API NÃO criará automaticamente objetos de usuário em nosso sistema se o email for fornecido.
- Comentários atualizados via esta API ainda podem ser verificados quanto a spam, se desejado.
- Configurações como comprimento máximo do comentário, se configuradas através da página de administração de Regras de Personalização, serão aplicadas aqui.
- Para permitir que os usuários atualizem o texto de seus comentários, você pode simplesmente especificar
commentno corpo da requisição. Nós geraremos ocommentHTMLresultante.- Se você definir tanto
commentquantocommentHTML, não geraremos o HTML automaticamente. - Se o usuário adicionar menções ou hashtags em seu novo texto, elas ainda serão processadas como na API
POST.
- Se você definir tanto
- Ao atualizar
commenterEmailem um comentário, é melhor também especificaruserId. Caso contrário, você deve garantir que o usuário com este email pertença ao seu tenant, ou a requisição falhará. - Se o comentário de destino estiver bloqueado (
isLocked: true), a requisição será rejeitada comcode: 'locked'. Desbloqueie o comentário primeiro, atualize-o e, se desejado, bloqueie novamente.



DELETE /api/v1/comments/:id 
Este endpoint da API permite excluir um comentário.
Notas:
- Esta API pode atualizar o widget de comentários "ao vivo" se desejado (isso aumenta
creditsCostde1para2). - Esta API excluirá todos os comentários filhos.
- Se o comentário alvo estiver bloqueado (
isLocked: true), a requisição é rejeitada comcode: 'locked'. Desbloqueie o comentário primeiro, então exclua.



POST /api/v1/comments/:id/flag 
Este endpoint da API permite sinalizar um comentário para um usuário específico.
Notas:
- Essa chamada deve sempre ser feita no contexto de um usuário. O usuário pode ser um FastComments.com User, SSO User, ou Tenant User.
- Se um limite de sinalizações-para-ocultar estiver definido, o comentário será automaticamente ocultado ao vivo depois de ter sido sinalizado o número de vezes definido.
- Depois que for automaticamente desaprovado (oculto) - o comentário só poderá ser re-aprovado por um administrador ou moderador. Remover a sinalização não re-aprovará o comentário.

Para sinalização anônima, devemos especificar um anonUserId. Isso pode ser um ID que representa a sessão anônima, ou um UUID aleatório.
Isso nos permite suportar a sinalização e a remoção da sinalização de comentários mesmo que um usuário não esteja logado. Dessa forma, o comentário pode ser marcado como
sinalizado quando os comentários são buscados com o mesmo anonUserId.



POST /api/v1/comments/:id/un-flag 
Este endpoint da API fornece a capacidade de remover a sinalização (un-flag) de um comentário para um usuário específico.
Observações:
- Esta chamada deve sempre ser feita no contexto de um usuário. O usuário pode ser um FastComments.com User, SSO User, ou Tenant User.
- Após um comentário ser desaprovado automaticamente (oculto) - o comentário só pode ser reaprovado por um administrador ou moderador. Remover a sinalização (un-flagging) não irá reaprovar o comentário.

Para sinalização anônima, devemos especificar um anonUserId. Isso pode ser um ID que representa a sessão anônima, ou um UUID aleatório.



POST /api/v1/comments/:id/block 
Este endpoint da API fornece a capacidade de bloquear um usuário que escreveu um determinado comentário. Ele suporta bloqueio de comentários escritos por FastComments.com Users, SSO Users e Tenant Users.
Ele suporta um parâmetro de corpo commentIdsToCheck para verificar se quaisquer outros comentários potencialmente visíveis no cliente devem ser bloqueados/desbloqueados após esta ação ser realizada.
Notas:
- Esta chamada deve sempre ser feita no contexto de um usuário. O usuário pode ser um FastComments.com User, SSO User ou Tenant User.
- O
userIdna requisição é o usuário que está fazendo o bloqueio. Por exemplo:User Aquer bloquearUser B. PasseuserId=User Ae o id do comentário queUser Bescreveu. - Comentários completamente anônimos (sem user id, sem email) não podem ser bloqueados e um erro será retornado.

Para bloqueio anônimo, devemos especificar um anonUserId. Isso pode ser um ID que representa a sessão anônima, ou um UUID aleatório.
Isso nos permite suportar o bloqueio de comentários mesmo que um usuário não esteja logado, buscando os comentários com o mesmo anonUserId.



POST /api/v1/comments/:id/un-block 
Este endpoint da API fornece a capacidade de desbloquear um usuário que escreveu um determinado comentário. Ele suporta o desbloqueio de comentários escritos por FastComments.com Users, SSO Users, and Tenant Users.
Ele suporta um parâmetro de corpo commentIdsToCheck para verificar se quaisquer outros comentários potencialmente visíveis no cliente devem ser bloqueados/desbloqueados após esta ação ser executada.
Notas:
- Esta chamada deve sempre ser feita no contexto de um usuário. O usuário pode ser um FastComments.com User, SSO User, ou Tenant User.
- O
userIdna requisição é o usuário que está realizando o desbloqueio. Por exemplo:User Aquer desbloquearUser B. PasseuserId=User Ae o id do comentário queUser Bescreveu. - Comentários completamente anônimos (sem user id, sem email) não podem ser bloqueados e um erro será retornado.




Estrutura de Modelo de Email 
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 umComment) 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:

Notas
- Você pode obter os valores válidos de
emailTemplateIda partir do endpoint/definitions. - O endpoint
/definitionstambé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.
GET /api/v1/email-templates/:id 
EmailTemplates individuais podem ser obtidos pelo seu id correspondente (NÃO emailTemplateId).



GET /api/v1/email-templates 
Esta API usa paginação, fornecida pelo parâmetro de consulta page. EmailTemplates são retornados em páginas de 100, ordenados por createdAt e depois por id.



PATCH /api/v1/email-templates/:id 
Este endpoint da API permite atualizar um modelo de e-mail especificando apenas o id e os atributos a serem atualizados.
Observe que todas as mesmas validações para criar um modelo também se aplicam, por exemplo:
- O modelo deve renderizar. Isso é verificado a cada atualização.
- Não é permitido ter modelos duplicados para o mesmo domínio (caso contrário, um deles seria ignorado silenciosamente).



POST /api/v1/email-templates 
Este endpoint de API fornece a capacidade de criar modelos de e-mail.
Observações:
- Você não pode ter vários modelos com o mesmo
emailTemplateIdno mesmo domínio. - Mas você pode ter um modelo curinga (
domain=*e um modelo específico de domínio para o mesmoemailTemplateId). - Especificar
domainsó é relevante se você tiver domínios diferentes, ou quiser usar modelos específicos para testes (domaindefinido comolocalhostetc). - Se você especificar
domain, ele deve corresponder a umDomainConfig. Em caso de erro, uma lista de domínios válidos é fornecida. - A sintaxe do modelo é EJS e é renderizada com um tempo limite de 500ms. O P99 de renderização é <5ms, então se você atingir 500ms algo está errado.
- Seu modelo deve renderizar com o
testDatafornecido para ser salvo. Erros de renderização são agregados e reportados no painel (em breve disponível via API).
Os dados mínimos necessários para adicionar um modelo são os seguintes:

Você pode querer ter modelos por site, nesse caso você define domain:



POST /api/v1/email-templates/render 
Este endpoint da API permite visualizar modelos de e-mail.



DELETE /api/v1/email-templates/:id 
Esta rota remove um único EmailTemplate por id.



Estrutura de Postagem de Feed 
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:

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_idda postagem. Use esse valor com a API de Comentários para ler ou criar comentários em uma postagem.
GET /api/v1/feed-posts 
Busca posts em um feed, mais recentes primeiro. A paginação é baseada em cursor: passe o _id do último post que você recebeu como
afterId para obter a próxima página.
Custa um crédito por cada dez posts retornados, com um mínimo de um crédito.



POST /api/v1/feed-posts 
Esta rota cria um único FeedPost. Cada postagem tem um autor, portanto fromUserId é obrigatório e deve ser o ID de um usuário FastComments ou SSO existente na conta.



PATCH /api/v1/feed-posts/:id 
Esta rota atualiza um único FeedPost. Envie apenas os campos que você deseja alterar.



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

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.
GET /api/v1/hash-tags 
Esta API usa paginação, fornecida pelo parâmetro de consulta page. HashTags são retornadas em páginas de 100, ordenadas por tag.



PATCH /api/v1/hash-tags/:tag 
Esta rota permite atualizar um único HashTag.



POST /api/v1/hash-tags 
Esta rota permite adicionar uma única HashTag.



POST /api/v1/hash-tags/bulk 
Esta rota fornece a capacidade de adicionar até 100 HashTag objects de uma só vez.



DELETE /api/v1/hash-tags/:tag 
Esta rota permite a remoção de um usuário HashTag pelo tag fornecido.
Observe que, a menos que a criação automática de HashTag esteja desativada, hashtags podem ser recriadas por um usuário que fornecer a hashtag ao comentar.



GET /api/v1/me 
Descreve a credencial que faz a requisição: o tenant ao qual pertence e, para tokens de acesso OAuth, o usuário que autorizou a aplicação. Integrações a utilizam para testar uma conexão e rotulá‑la.
Com uma chave de API a resposta identifica apenas o tenant. Com um token bearer OAuth também inclui o usuário autorizador e os escopos que foram concedidos.


Estrutura de Moderador 
Um objeto Moderator representa a configuração para um moderador.
Existem três tipos de moderadores:
- Usuários administradores que possuem a flag
isCommentModeratorAdmin. - Usuários SSO com a flag
isCommentModeratorAdmin. - Comentadores regulares, ou usuários do FastComments.com, que são convidados como Moderadores.
A estrutura Moderator é usada para representar o Estado de Moderação do caso de uso 3.
Se você quiser convidar um usuário para ser moderador via API, use a API Moderator criando um Moderator e inviting o usuário.
Se o usuário não tiver uma conta no FastComments.com, o e-mail de convite ajudará a configurá-la. Se já tiverem uma conta, eles receberão acesso de moderação ao seu tenant e o userId do objeto Moderator será atualizado para apontar para o usuário deles. Você não terá acesso via API ao usuário deles, pois nesse caso a conta pertence a eles e é gerenciada pelo FastComments.com.
Se você precisar de gerenciamento completo da conta do usuário, recomendamos usar SSO ou adicioná-los como um Tenant User e então adicionar um objeto Moderator para rastrear suas estatísticas.
A estrutura Moderator pode ser usada como um mecanismo de rastreamento de estatísticas para os casos de uso 1 e 2. Após criar o usuário, adicione um objeto Moderator com o userId dele definido e suas estatísticas serão rastreadas na Página de Moderadores de Comentários.
A estrutura do objeto Moderator é a seguinte:

GET /api/v1/moderators/:id 
Esta rota retorna um único moderador pelo seu id.



GET /api/v1/moderators 
Esta API usa paginação, fornecida pelo parâmetro de consulta skip. Moderadores são retornados em páginas de 100, ordenados por createdAt e id.
O custo é baseado no número de moderadores retornados, custando 1 credit per 10 moderadores retornados.



PATCH /api/v1/moderators/:id 
Este endpoint da API fornece a habilidade de atualizar um Moderator por id.
A atualização de um Moderator tem as seguintes restrições:
- Os seguintes valores não podem ser fornecidos ao atualizar um
Moderator:acceptedInvitemarkReviewedCountdeletedCountmarkedSpamCountapprovedCounteditedCountbannedCountverificationIdcreatedAt
- Quando um
userIdfor especificado, esse usuário deve existir. - Quando um
userIdfor especificado, esse usuário deve pertencer ao mesmotenantIdespecificado nos parâmetros de consulta. - Dois moderadores no mesmo tenant não podem ser adicionados com o mesmo
email. - Você não pode alterar o
tenantIdassociado a umModerator.



POST /api/v1/moderators 
Esta rota permite adicionar um único Moderator.
A criação de um Moderator tem as seguintes restrições:
- Um
namee umemaildevem sempre ser fornecidos. UmuserIdé opcional. - Os seguintes valores não podem ser fornecidos ao criar um
Moderator:acceptedInvitemarkReviewedCountdeletedCountmarkedSpamCountapprovedCounteditedCountbannedCountverificationIdcreatedAt
- Quando um
userIdé especificado, esse usuário deve existir. - Quando um
userIdé especificado, ele deve pertencer ao mesmotenantIdespecificado nos parâmetros de consulta. - Dois moderadores no mesmo tenant não podem ser adicionados com o mesmo
email.
Podemos criar um Moderator para um usuário do qual conhecemos apenas o e-mail:

Ou podemos criar um Moderator para um usuário que pertence ao nosso tenant, para rastrear suas estatísticas de moderação:



POST /api/v1/moderators/:id/send-invite 
Esta rota fornece a capacidade de convidar um único Moderator.
As seguintes restrições existem para enviar um email de convite a um Moderator:
- O
Moderatordeve já existir. - O
fromNamenão pode ter mais de100 characters.
Observações:
- Se um usuário com o e-mail fornecido já existir, ele será convidado a moderar os comentários do seu tenant.
- Se um usuário com o e-mail fornecido não existir, o link de convite o guiará pelo processo de criação da conta.
- O convite expirará após
30 days.
Podemos criar um Moderator para um usuário do qual só sabemos o e-mail:

Isso enviará um e-mail como Bob at TenantName is inviting you to be a moderator...


DELETE /api/v1/moderators/:id 
Esta rota fornece a remoção de um Moderator por id.



Estrutura de Contagem de Notificações 
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:

GET /api/v1/notification-count/:user_id 
Esta rota retorna um único NotificationCount pelo id do usuário. Com SSO, o id do usuário está no formato <tenant id>:<user id>.
Se não houver notificações não lidas, não haverá um NotificationCount - portanto você receberá um 404.
Isto é diferente de notifications/count pois é muito mais rápido, mas não permite filtragem.



DELETE /api/v1/notification-count/:user_id 
Esta rota exclui um único NotificationCount pelo id do usuário. Com SSO, o id do usuário está no formato <tenant id>:<user id>.
Isso limpará a contagem de notificações não lidas do usuário (o sino vermelho no widget de comentários desaparecerá e a contagem sumirá).



Estrutura de Notificação 
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:

GET /api/v1/notifications 
Esta rota retorna até 30 objetos Notification ordenados por createdAt, do mais novo para o mais antigo.
Você pode filtrar por userId. Com SSO, o id do usuário tem o formato <tenant id>:<user id>.



GET /api/v1/notifications/count 
Esta rota retorna um objeto contendo o número de notificações no parâmetro count.
É mais lento que /notification-count/ e custa o dobro de créditos, mas permite filtragem por mais dimensões.
Você pode filtrar pelos mesmos parâmetros do endpoint /notifications, como userId. Com SSO, o id do usuário está no formato <tenant id>:<user id>.




PATCH /api/v1/notifications/:id 
Este endpoint da API permite atualizar uma Notification pelo id.
A atualização de uma Notification possui as seguintes restrições:
- Você só pode atualizar os seguintes campos:
viewedoptedOut



API Pública de Reações de Página 
Page Reacts permite que seus usuários curtam uma página, ou reajam a ela com seu próprio conjunto de imagens de reação. O widget Page Reacts e o widget Floating Likes são construídos sobre esses endpoints, e você pode chamá-los você mesmo para criar seu próprio botão de curtir.
Ao contrário do resto deste guia, os endpoints do Page Reacts são públicos. Eles são chamados a partir dos navegadores de seus usuários, não exigem chave de API e não custam créditos de API. Cada reação pertence ao usuário que faz a solicitação, portanto um usuário só pode adicionar ou remover a sua própria.
Existem dois conjuntos de endpoints:
/page-reacts/v1/likes/:tenantId- um único "like" por usuário por página. Use estes para um botão de curtir./page-reacts/v2/:tenantId- múltiplas reações por página, cada uma identificada por um curtoidque você escolhe (por exemploheartoulaugh).
Ambos também estão disponíveis em nossos SDKs como parte da PublicApi, por exemplo getV1PageLikes, createV1PageReact e deleteV1PageReact no JavaScript SDK.
Mostrando quem reagiu
Passe includeUserInfo=public para os endpoints GET para também obter os usuários que curtiram ou reagiram, com seus nomes de usuário e avatares, mais recentes primeiro. Usuários que tornaram sua atividade de perfil privada são excluídos, assim como usuários anônimos. Até 100 reações são retornadas.
Usuários SSO são criados com atividade de perfil privada, a menos que sua carga útil SSO defina isProfileActivityPrivate como false, portanto configure isso para os usuários que você deseja que apareçam nessas listas.
Em páginas que exigem SSO, somente usuários SSO que podem visualizar a página podem listar quem reagiu. Outros recebem um 403 com o código sso-required ou page-forbidden.
Do seu servidor, GET /api/v1/pages/likes e GET /api/v1/pages/reacts retornam as mesmas listas com uma chave de API, e também aceitam includeUserInfo=include-private para incluir usuários com perfis privados.
Identificando o Usuário
Reactions são vinculadas ao usuário que faz a solicitação:
- Usuários SSO: passe o parâmetro de consulta
sso, definido como o JSON codificado em URI do mesmo objeto SSO que você fornece ao widget de comentários. Veja SSO. - Usuários anônimos: quando não há parâmetro
ssoe não há login no FastComments, o servidor atribui ao navegador um id anônimo armazenado no cookie de sessão do FastComments. Envie solicitações comcredentials: 'include'para que o cookie seja mantido entre as requisições. Navegadores que bloqueiam cookies de terceiros não manterão o id anônimo, portanto use SSO quando cada usuário precisar ser reconhecido de forma confiável.
O urlId
urlId identifica a página, da mesma forma que faz para comentários. Use o mesmo urlId que você fornece ao widget de comentários para que curtidas e comentários sejam contados na mesma página. Lembre-se de codificá-lo em URI.

GET /page-reacts/v1/likes/:tenantId 
Retorna o número de curtidas em uma página e se o usuário atual a curtiu. Páginas que ainda não existem retornam um likeCount de 0.
Passe includeUserInfo=public para também obter os usuários que curtiram a página, mais recentes primeiro. Usuários com atividade de perfil privado e usuários anônimos são excluídos, e até 100 curtidas são pesquisadas. Apenas public é aceito aqui; include-private retorna um 422 e está disponível a partir de GET /api/v1/pages/likes com uma chave de API. Em páginas que exigem SSO, includeUserInfo retorna um 403 para usuários que não podem visualizar a página.



POST /page-reacts/v1/likes/:tenantId 
Curte uma página como o usuário atual. Cada usuário pode curtir uma página uma vez: curtir novamente tem sucesso com o código already-liked e não altera a contagem.
A página é criada se ainda não existir. Passe title para definir ou atualizar o título da página.



DELETE /page-reacts/v1/likes/:tenantId 
Remove o curtir do usuário atual de uma página. Se o usuário não curtiu a página, a requisição tem sucesso com o código not-liked e não altera a contagem.



GET /page-reacts/v2/:tenantId 
Retorna a contagem para cada reação em uma página e quais reações o usuário atual adicionou.
Passe includeUserInfo=public para também obter os usuários que reagiram, como uma entrada por reação com seu ID de reação, mais recentes primeiro. Usuários com atividade de perfil privado e usuários anônimos são excluídos, e até 100 reações são pesquisadas. Apenas public é aceito aqui; include-private retorna um 422 e está disponível em GET /api/v1/pages/reacts com uma chave de API. Em páginas que exigem SSO, includeUserInfo retorna um 403 para usuários que não podem visualizar a página.



GET /page-reacts/v2/:tenantId/list 
Retorna os nomes dos usuários que adicionaram uma reação a uma página, ordenados alfabeticamente. Até 100 reações são pesquisadas, e usuários anônimos e usuários com atividade de perfil privado não são incluídos. Em páginas que exigem SSO, usuários que não podem visualizar a página recebem um 403 com o código sso-required ou page-forbidden.
Para também obter avatares e IDs de usuário, use GET /page-reacts/v2/:tenantId com includeUserInfo=public.



POST /page-reacts/v2/:tenantId 
Adiciona uma reação a uma página como o usuário atual. Um usuário pode adicionar cada id de reação uma vez: adicioná-lo novamente tem sucesso com o código already-reacted e não altera a contagem. Um usuário pode adicionar várias reações diferentes à mesma página.
Os ids de reação são escolhidos por você e podem ter até 36 caracteres. A página é criada se ainda não existir. Passe title para definir ou atualizar o título da página.



DELETE /page-reacts/v2/:tenantId 
Remove uma das reações do usuário atual de uma página. Se o usuário não adicionou essa reação, a solicitação tem sucesso com o código no-react e não altera a contagem.



Estrutura de Página 
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:

GET /api/v1/pages 
Atualmente você pode apenas buscar todas as páginas (ou uma única página via /by-url-id) associadas à sua conta. Se desejar uma busca mais refinada, entre em contato conosco.



Dica Útil
A API Comment requer um urlId. Você pode chamar primeiro a API Pages, para ver como são os valores de urlId disponíveis para você.
GET /api/v1/pages/by-url-id 
Páginas individuais podem ser recuperadas pelo seu correspondente urlId. Isso pode ser útil para consultar títulos de páginas ou contagens de comentários.



Dica útil
Lembre-se de codificar valores em URI, como o urlId.
GET /api/v1/pages/likes 
Retorna o número de curtidas em uma página e, opcionalmente, os usuários que a curtiram, mais recentes primeiro. Esta é a versão do lado do servidor de GET /page-reacts/v1/likes/:tenantId.
includeUserInfo controla quais usuários são retornados:
publicomite usuários que tornaram a atividade de seu perfil privada.include-privateinclui‑os. Use isso somente quando a lista não for exibida ao público.
Usuários anônimos nunca são incluídos, e até 100 curtidas são pesquisadas. Páginas que não existem retornam um likeCount de 0 e uma lista users vazia.



Dica Útil
Lembre‑se de codificar em URI valores como o urlId.
GET /api/v1/pages/reacts 
Retorna a contagem para cada reação em uma página, e opcionalmente os usuários que reagiram, como uma entrada por reação com seu ID de reação, mais recente primeiro. Esta é a versão do lado do servidor de GET /page-reacts/v2/:tenantId.
includeUserInfo controla quais usuários são retornados:
publicomite usuários que tornaram a atividade de seu perfil privada.include-privateos inclui. Use isso apenas quando a lista não for mostrada ao público.
Usuários anônimos nunca são incluídos, e até 100 reações são pesquisadas. Páginas que não existem retornam nenhum counts e uma lista users vazia.



Dica Útil
Lembre-se de codificar em URI valores como o urlId.
PATCH /api/v1/pages/:id 
Esta rota fornece a capacidade de atualizar uma única Page. Os comentários correspondentes serão atualizados.



Nota
Alguns parâmetros no objeto Page são atualizados automaticamente. Estes são os atributos counts e title. Os counts não podem ser atualizados
via a API já que são valores calculados. O title da página pode ser definido via a API, mas seria sobrescrito se o widget de comentários for usado em
uma página com o mesmo urlId e um título de página diferente.
POST /api/v1/pages 
Este endpoint da API fornece a capacidade de criar páginas.
Um caso de uso comum é controle de acesso.
Notas:
- Se você comentou em um thread de comentários, ou chamou a API para criar um
Comment, você já criou um objetoPage! Você pode tentar recuperá-lo via a rotaPage/by-url-id, passando o mesmourlIdpassado para o widget de comentários. - A
Pagestructure contém alguns valores calculados. Atualmente, estes sãocommentCounterootCommentCount. Eles são populados automaticamente e não podem ser definidos pela API. Tentar fazê-lo fará com que a API retorne um erro.



DELETE /api/v1/pages/:id 
Esta rota permite a remoção de uma única página por id.
Observe que interagir com o widget de comentários para uma página com o mesmo urlId simplesmente recriará a Page de forma transparente.



POST /api/v1/pages/migrations 
Esta rota move comentários e páginas de um urlId ou domínio para outro, da mesma forma que a Domain Migration tool no dashboard. Até 100 migrações podem ser enviadas por requisição. Elas são executadas na ordem fornecida, portanto a para b seguido de b para c funciona.
Cada migração tem um type:
urlIdmove a página cujourlIdé exatamentefrom.post-1não corresponde apost-10.domainencontra/substituifromdentro de cadaurlIdeurl, e atualiza odomainde cada comentário. Ambos os valores devem ser um domínio, comoold.example.com.
Comentários, a página, reações da página, votos, notificações e assinaturas são todos movidos. Se uma página já existir em to, as duas páginas são mescladas.
A migração é executada como um job em lote. A resposta contém um batchJobId. Consulte GET /api/v1/batch-jobs/:id para acompanhar seu progresso. Quando o job terminar, ele terá um resultado por migração, e um undoId que pode ser passado para POST /api/v1/pages/migrations/:undoId/undo dentro de 90 dias.
A requisição é validada antes de ser enfileirada. Se alguma migração for inválida, toda a requisição falha com um 422 e nada é executado.
Enfileirar uma migração não custa nada. Quando o job termina, custa 1 crédito por 1000 comentários migrados, com um mínimo de 1.



Notes
- Os trabalhos de um mesmo tenant são executados um de cada vez, do mais antigo para o mais recente. Uma segunda migração aguarda a conclusão da primeira.
PATCH /api/v1/pages/:idcom um novourlIdaltera apenas a página, não seus comentários. Use esta rota para mover os comentários de uma página.
POST /api/v1/pages/migrations/:undoId/undo 
Esta rota reverte todas as migrações de um job POST /api/v1/pages/migrations. Obtenha o undoId do job de migração concluído com GET /api/v1/batch-jobs/:id. Um undoId pode ser usado por 90 dias e apenas uma vez.
O desfazer é executado como um job em lote, assim como a migração, e a resposta contém seu batchJobId. Quando o job termina, seu pageMigrationUndoResult relata:
restored: registros devolvidos aos seus valores anteriores à migração.skipped: registros deixados como estão porque foram alterados após a migração, ou não existem mais. Uma edição posterior nunca é sobrescrita.notRestorable: registros que a migração excluiu ao mesclar duas páginas ou ao remover reações de página duplicadas. Esses não podem ser recuperados.
As migrações são revertidas da mais recente para a mais antiga, portanto uma cadeia como a para b seguida de b para c é desfeita de volta para a. Um job de migração que falhou parcialmente ainda pode ser desfeito, o que reverte as alterações feitas antes da falha.
Enfileirar um desfazer não custa nada. Quando o job termina, custa 1 crédito por 1000 registros restaurados, com um mínimo de 1.



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

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).
closesAtdeve estar no futuro quando a enquete é criada. Para fechar uma enquete imediatamente, façaPATCHcom 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
anonUserIdserá rejeitado compoll-login-required.
GET /api/v1/polls/:commentId 
Lê a enquete anexada a um comentário, com suas contagens de votos atuais.
Enquetes também são retornadas no próprio comentário pelas APIs de comentário, portanto use isto quando você quiser apenas os resultados e não o comentário completo.



Um comentário que não tem enquete, um comentário que foi excluído e um ID de comentário que não existe respondem da mesma forma, com poll-not-found.
PUT /api/v1/polls/:commentId 
Anexa uma enquete a um comentário existente, ou define o estado completo da enquete que ele já possui.
O corpo é a enquete completa, e as opções que você envia se tornam as opções da enquete, nessa ordem. Cada opção é correspondida pelo seu id:
- Uma opção enviada com o
idde uma opção existente mantém essa opção e seus votos. Seu rótulo e posição são atualizados para o que você enviou. - Uma opção enviada sem um
idé adicionada, sem votos. - Uma opção existente que você omite é removida, juntamente com os votos lançados nela.
totalVotesdiminui na mesma quantidade.
Portanto, para adicionar uma opção, envie as opções atuais com seus ids mais a nova sem id. Para remover uma, envie a lista sem ela. Os ids das opções estão na enquete retornada por GET /api/v1/polls/:commentId.
Enviar nenhum id substitui todas as opções e exclui todos os votos já lançados na enquete. Se a enquete tem votos, isso requer replaceVotes=true, e sem isso a API responde com replace-votes-required.
Os outros campos também são substituídos: omitir closesAt, privacy ou requireVoteToSeeResults os redefine para o padrão. Para alterar um único campo e deixar o resto intacto, use PATCH /api/v1/polls/:commentId.



Outras Observações
- Um
idque não está na enquete, ou o mesmoidfornecido duas vezes, falha compoll-invalid. Um comentário sem enquete ainda não tem ids de opção, portanto toda opção enviada para ele deve omitirid. - A privacidade da enquete pode ser restringida, mas não ampliada, depois que ela tem votos.
- Esta API obedece às configurações do seu site. Se enquetes não estiverem habilitadas para o site ou página, falha com
polls-disabled. - Um comentário bloqueado não pode ter sua enquete alterada, e falha com
locked. - Widgets conectados são atualizados em tempo real, então os visualizadores veem a nova enquete sem recarregar.
PATCH /api/v1/polls/:commentId 
Edita uma enquete sem perturbar seus votos. Use isso para corrigir um erro de digitação na pergunta ou em uma opção, para fechar ou reabrir a enquete, ou para mudar quem pode ver quem votou.
As opções são referenciadas pelo seu id, e um PATCH renomeia as que você especificar. Para adicionar, remover ou reordenar opções, envie a lista completa de opções para PUT /api/v1/polls/:commentId: as opções que você enviar com seus ids mantêm seus votos também.
Cada campo é opcional, mas ao menos um deve ser fornecido.




Outras Observações
- Nomear um id de opção que não está na enquete falha com
poll-invalidem vez de simplesmente não fazer nada. - Os rótulos devem permanecer únicos dentro da enquete, contando as opções que você não está alterando.
- Ao contrário de criar uma enquete,
closesAtpode estar no passado aqui – é assim que você fecha uma enquete imediatamente. - A privacidade da enquete pode ser restringida, mas não ampliada, depois que ela tem votos.
- Um comentário bloqueado não pode ter sua enquete alterada, e falha com
locked.
DELETE /api/v1/polls/:commentId 
Remove uma enquete do seu comentário, juntamente com todos os votos lançados nela. O próprio comentário permanece intacto.
Excluir o comentário também remove sua enquete e votos, portanto isso só é necessário quando você deseja manter o comentário.



Estrutura de Voto de Enquete 
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.

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-voteseGET /api/v1/poll-votes/:idrespondem compoll-anonymous. As contagens da enquete ainda estão disponíveis emGET /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.
GET /api/v1/poll-votes 
Lista os votos individuais por trás das contagens de uma enquete, do mais antigo ao mais recente. Um crédito por cada 100 votos retornados.
Uma enquete pertence a um comentário, portanto os votos são lidos uma enquete por vez e commentId é obrigatório. Refine ainda mais
com voterId para verificar como uma pessoa votou, ou com optionId para listar todos que escolheram uma determinada opção.
No máximo 1000 votos são retornados por chamada. Use skip para paginar mais resultados.
A configuração privacy da enquete é respeitada: os votos em uma enquete anônima não podem ser lidos, e a requisição falha
com poll-anonymous. Veja a estrutura PollVote para detalhes.



Contando Votos Por Opção
Você não precisa somar esses votos para obter os resultados - a enquete já possui suas próprias contagens. Leia a enquete com
GET /api/v1/polls/:commentId em vez disso, e use esta API quando precisar saber quem votou.
Cada Enquete em uma Página
Não há listagem de votos em nível de página. Para relatar sobre uma página inteira, recupere seus comentários com
GET /api/v1/comments, que retorna a enquete de cada comentário e suas contagens, e então leia os votos das
enquetes que lhe interessam.
GET /api/v1/poll-votes/:id 
Lê um único voto de enquete pelo seu id.
Um voto em uma enquete anônima não pode ser lido, e a solicitação falha com poll-anonymous. Veja a estrutura PollVote para entender como a configuração privacy da enquete se aplica.



POST /api/v1/poll-votes 
Registra um voto em uma enquete.
Um eleitor tem no máximo um voto por enquete. Chamar este endpoint novamente para o mesmo eleitor move seu voto para a nova opção em vez de adicionar um segundo, e votar na opção que ele já escolheu não faz nada.
A resposta inclui a enquete, portanto você obtém as contagens atualizadas sem uma segunda solicitação.




Votos Anônimos
Defina anonUserId em vez de userId para registrar um voto para alguém que não está conectado. Esse ID não precisa
corresponder a um usuário em nenhum lugar – ele apenas identifica a sessão, de modo que a mesma pessoa não seja contada duas vezes.
A votação anônima precisa estar habilitada para o seu site. Se a votação estiver limitada a usuários conectados, um voto com apenas um
anonUserId falha com poll-login-required.
Votos anônimos também são limitados por taxa por IP por enquete, para impedir que uma pessoa manipule a enquete limpando sua
sessão. Envie o ip do usuário final para que o limite se aplique a ele em vez de ao seu servidor.
Outras Observações
- Um
userIddeve ser um usuário que exista no seu site. Votos para um usuário pertencente a outro site são rejeitados. - Votar em uma enquete fechada falha com
poll-closed. - Esta API atualiza as contagens na enquete e as envia para os widgets conectados em tempo real.
DELETE /api/v1/poll-votes/:id 
Cancela um voto. A opção em que o voto foi registrado recupera sua contagem, e o eleitor fica livre para votar novamente.



Outras Observações
- Excluir o mesmo voto duas vezes responde com
not-foundna segunda vez, e as contagens permanecem inalteradas. - Se a enquete foi substituída desde que o voto foi registrado, o voto é removido, mas nenhuma contagem é alterada, já que a substituição começou do zero.
Estrutura de Evento de Webhook Pendente 
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:

GET /api/v1/pending-webhook-events 
Esta rota retorna uma lista de eventos de webhook pendentes no parâmetro pendingWebhookEvents.
Esta API usa paginação, fornecida pelo parâmetro skip. PendingWebhookEvents são retornados em páginas de 100, ordenados por createdAt do mais novo para o mais antigo.



GET /api/v1/pending-webhook-events/count 
Esta rota retorna um objeto contendo o número de eventos de webhook pendentes no parâmetro count.
Você pode filtrar pelos mesmos parâmetros do endpoint /pending-webhook-events



DELETE /api/v1/pending-webhook-events/:id 
Esta rota permite a exclusão de um único PendingWebhookEvent.
Se você precisar excluir em lote, chame a API GET com paginação e então chame esta API sequencialmente.



Estrutura de Usuário SSO 
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:

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
isAccountOwnerouisAdminAdminsão cobrados separadamente como SSO Admins (mesma tarifa que admins de tenant regulares) - SSO Moderadores: Usuários com a flag
isCommentModeratorAdminsã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.
GET /api/v1/sso-users 
Esta rota retorna Usuários SSO em páginas de 100. A paginação é feita pelo parâmetro skip. Os usuários são ordenados por signUpDate e id.



GET /api/v1/sso-users/by-id/:id 
Esta rota retorna um único usuário SSO pelo seu id.



GET /api/v1/sso-users/by-email/:email 
Esta rota retorna um único usuário SSO pelo seu e-mail.



PATCH /api/v1/sso-users/:id 
Esta rota permite atualizar um único usuário SSO.



POST /api/v1/sso-users 
Esta rota fornece a criação de um único usuário SSO.
Tentar criar dois usuários com o mesmo ID resultará em um erro.

Neste exemplo especificamos groupIds para controle de acesso, mas isso é opcional.


Nota de Integração
Os dados enviados pela API podem ser sobrescritos simplesmente enviando um payload HMAC de SSO User diferente. Por exemplo, se você definir um username via API, mas então enviar um diferente através do fluxo SSO ao carregar a página, nós atualizaremos automaticamente o username deles.
Não atualizaremos parâmetros do usuário nesse fluxo a menos que você os especifique explicitamente ou os defina como null (não undefined).
PUT /api/v1/sso-users/:id 
Esta rota permite atualizar um único usuário SSO.

Neste exemplo especificamos groupIds para controle de acesso, mas isso é opcional.


DELETE /api/v1/sso-users/:id 
Esta rota fornece a remoção de um único usuário SSO pelo seu id.
Observe que carregar o widget de comentários novamente com um payload para este usuário simplesmente recriará o usuário de forma transparente.
É possível excluir os comentários do usuário através do parâmetro de consulta deleteComments. Observe que, se for verdadeiro:
- Todos os comentários do usuário serão excluíados em tempo real.
- Todos os comentários filhos (agora órfãos) serão excluídos ou anonimizados com base na configuração de página associada a cada comentário. Por exemplo, se o modo de exclusão de thread for "anonymize", as respostas permanecerão e os comentários do usuário serão anonimizados. Isso se aplica apenas quando
commentDeleteModeéRemove(o valor padrão). - O
creditsCostse torna2.
Comentários Anonimizados
Você pode manter os comentários do usuário, mas simplesmente anonimizá-los definindo commentDeleteMode=1.
Se os comentários do usuário forem anonimizados, os seguintes valores serão definidos como nulos:
- commenterName
- commenterEmail
- avatarSrc
- userId
- anonUserId
- mentions
- badges
isDeleted e isDeletedUser são definidos como true.
Ao renderizar, o widget de comentários usará DELETED_USER_PLACEHOLDER (padrão: "[deleted]") para o nome do usuário e DELETED_CONTENT_PLACEHOLDER para o comentário. Eles podem ser personalizados através da UI de Personalização do Widget.
Exemplos



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

GET /api/v1/subscriptions/:id 
Esta rota retorna até 30 objetos Subscription ordenados por createdAt, do mais recente para o mais antigo.
Você pode filtrar por userId. Com SSO, o id do usuário está no formato <tenant id>:<user id>.



POST /api/v1/subscriptions 
Este endpoint da API fornece a capacidade de criar uma Subscription. Note que um usuário pode ter apenas uma assinatura por página, pois mais de uma seria redundante, e tentar
criar mais de uma assinatura para o mesmo usuário na mesma página resultará em um erro.
Ao criar uma assinatura, objetos Notification serão criados quando um novo comentário for deixado na raiz do urlId assinado (quando o parentId do comentário for null).



DELETE /api/v1/subscriptions/:id 
Esta rota exclui um único objeto Subscription pelo id.



Estrutura de Uso Diário do Inquilino 
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:

GET /api/v1/tenant-daily-usage 
Esta rota permite pesquisar o uso de um tenant por ano, mês e dia. Podem ser retornados até 365 objetos, e o custo é de 1 crédito de API para cada 10 objetos.
Os objetos de resposta são ordenados pela data em que foram criados (do mais antigo para o mais recente).



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

GET /api/v1/tenants/:id 
Esta rota retorna um único Tenant por id.



GET /api/v1/tenants 
Esta API retorna tenants que são gerenciados pelo seu tenant.
A paginação é fornecida pelo parâmetro de consulta skip. Os tenants são retornados em páginas de 100, ordenados por signUpDate, e id.
O custo é baseado no número de tenants retornados, custando 1 credit per 10 tenants retornados.

Você pode definir parâmetros meta nos objetos Tenant e consultar tenants correspondentes. Por exemplo, para a chave someKey e o valor meta some-value, podemos
construir um objeto JSON com esse par chave/valor e então codificá-lo em URI como um parâmetro de consulta para filtrar:



POST /api/v1/tenants 
Esta rota fornece a capacidade de adicionar um único Tenant.
Criar um Tenant tem as seguintes restrições:
- Um
nameé obrigatório. domainConfigurationé obrigatório.- Os seguintes valores não podem ser fornecidos ao criar um
Tenant:hasFlexPricinglastBillingIssueReminderDateflexLastBilledAmount
- O
signUpDatenão pode estar no futuro. - O
namenão pode ter mais do que200 characters. - O
emailnão pode ter mais do que300 characters. - O
emaildeve ser único entre todos os tenants do FastComments.com. - Você não pode criar tenants se o tenant pai não tiver um
TenantPackageválido definido.- Se o seu tenant foi criado via FastComments.com, isso não deve ser um problema.
- Você não pode criar mais tenants do que o definido em
maxWhiteLabeledTenantsno seu pacote. - Você deve especificar o parâmetro de query
tenantId, que é o id do seuparent tenantcom white labeling habilitado.
Podemos criar um Tenant com apenas alguns parâmetros:



PATCH /api/v1/tenants/:id 
Este endpoint de API fornece a capacidade de atualizar um Tenant pelo id.
A atualização de um Tenant tem as seguintes restrições:
- Os seguintes valores não podem ser atualizados:
hasFlexPricinglastBillingIssueReminderDateflexLastBilledAmountmanagedByTenantId
- O
signUpDatenão pode estar no futuro. - O
namenão pode ter mais de200 characters. - O
emailnão pode ter mais de300 characters. - O
emaildeve ser único entre todos os tenants do FastComments.com. - Ao definir
billingInfoValidcomotrue,billingInfodeve ser fornecido na mesma requisição. - Você não pode atualizar o
packageIdassociado ao seu próprio tenant. - Você não pode atualizar o
paymentFrequencyassociado ao seu próprio tenant.



DELETE /api/v1/tenants/:id 
Esta rota permite a remoção de um Tenant e de todos os dados associados (usuários, comentários, etc.) por id.
As seguintes restrições existem em relação à remoção de tenants:
- O tenant deve ser seu, ou um tenant white-labeled que você gerencia.
- O parâmetro de query
suredeve estar definido comotrue.



Estrutura de Pacote de Inquilino 
O TenantPackage define as informações de pacote disponíveis para um Tenant. Um tenant pode ter vários pacotes disponíveis, mas apenas
um em uso em um determinado momento.
Um Tenant não pode ser usado para nenhum produto até que seu packageId aponte para um TenantPackage válido.
Existem dois tipos de objetos TenantPackage:
- Pacotes de preço fixo - onde
hasFlexPricingé false. - Preço flexível - onde
hasFlexPricingé true.
Em ambos os casos, os limites são definidos na conta que usa o pacote, porém com Flex o tenant é cobrado por um preço base mais
o que utilizou, definido pelos parâmetros flex*.
Um tenant pode ter vários pacotes de tenant e ter a capacidade de alterar o pacote por conta própria na Página de Informações de Cobrança.
Se você for lidar com a cobrança dos tenants por conta própria, ainda será necessário definir um pacote para cada tenant para definir seus limites. Basta definir billingHandledExternally como true no Tenant e eles
não poderão alterar suas informações de cobrança, ou o pacote ativo, por conta própria.
Você não pode criar pacotes com limites superiores aos do tenant pai.
A estrutura do objeto TenantPackage é a seguinte:

GET /api/v1/tenant-packages/:id 
Esta rota retorna um único Tenant Package pelo id.



GET /api/v1/tenant-packages 
Esta API usa paginação, fornecida pelo parâmetro de query skip. TenantPackages são retornados em páginas de 100, ordenados por createdAt e id.
O custo é baseado no número de tenant packages retornados, custando 1 credit per 10 tenant packages retornados.



POST /api/v1/tenant-packages 
Esta rota fornece a capacidade de adicionar um único TenantPackage.
Criar um TenantPackage possui as seguintes restrições:
- Os seguintes parâmetros são obrigatórios:
nametenantIdmonthlyCostUSD- Pode ser nulo.yearlyCostUSD- Pode ser nulo.maxMonthlyPageLoadsmaxMonthlyAPICreditsmaxMonthlyCommentsmaxConcurrentUsersmaxTenantUsersmaxSSOUsersmaxModeratorsmaxDomainshasDebrandingforWhoTextfeatureTaglineshasFlexPricing- Se verdadeiro, então todos os parâmetrosflex*são obrigatórios.
- O
namenão pode ser maior que50 characters. - Cada item de
forWhoTextnão pode ser maior que200 characters. - Cada item de
featureTaglinesnão pode ser maior que100 characters. - O
TenantPackagedeve ser "menor" que o tenant pai. Por exemplo, todos os parâmetrosmax*devem ter valores menores que os do tenant pai. - Um tenant com white labeling pode ter no máximo cinco pacotes.
- Apenas tenants com acesso a white labeling podem criar um
TenantPackage. - Você não pode adicionar pacotes ao seu próprio tenant. :)
Podemos criar um TenantPackage da seguinte forma:



PATCH /api/v1/tenant-packages/:id 
Este endpoint da API fornece a capacidade de atualizar um TenantPackage por id.
A atualização de um TenantPackage possui as seguintes restrições:
- Se você estiver definindo
hasFlexPricingcomo true, então todos os parâmetrosflex*são obrigatórios nessa mesma requisição. - O
namenão pode ser maior que50 characters. - Cada item
forWhoTextnão pode ser maior que200 characters. - Cada item
featureTaglinesnão pode ser maior que100 characters. - O
TenantPackagedeve ser "menor" que o tenant pai. Por exemplo, todos os parâmetrosmax*devem ter valores menores que o tenant pai. - Você não pode alterar o
tenantIdassociado com umTenantPackage.



DELETE /api/v1/tenant-packages/:id 
Esta rota permite a remoção de um TenantPackage por id.
Você não pode remover um TenantPackage que esteja em uso (o packageId do Tenant aponta para o pacote). Atualize o Tenant primeiro.



Estrutura de Usuário de Inquilino 
O TenantUser define um User que é gerenciado por um tenant específico. A conta deles está sob completo controle do tenant ao qual estão associados, e sua conta pode ser atualizada ou excluída via a UI ou API.
Os usuários do tenant podem ser administradores com todas as permissões e acesso ao Tenant, ou podem ser limitados a permissões específicas para moderar comentários, acessar chaves de API, etc.
A estrutura para o objeto TenantUser é a seguinte:

GET /api/v1/tenant-users/:id 
Esta rota retorna um único TenantUser por id.



GET /api/v1/tenant-users 
Esta API usa paginação, fornecida pelo parâmetro de consulta skip. TenantUsers são retornados em páginas de 100, ordenados por signUpDate, username e id.
O custo é baseado no número de TenantUsers retornados, custando 1 credit per 10 TenantUsers retornados.



POST /api/v1/tenant-users 
Esta rota fornece a capacidade de adicionar um único TenantUser.
Criar um TenantUser tem as seguintes restrições:
- Um
usernameé obrigatório. - Um
emailé obrigatório. - O
signUpDatenão pode estar no futuro. - O
localedeve estar na lista de Locales Suportados. - O
usernamedeve ser único em todo o FastComments.com. Se isso for um problema, sugerimos usar SSO. - O
emaildeve ser único em todo o FastComments.com. Se isso for um problema, sugerimos usar SSO. - Você não pode criar mais tenant users do que definido em
maxTenantUsersno seu pacote.
Podemos criar um TenantUser da seguinte forma



POST /api/v1/tenant-users/:id/send-login-link 
Esta rota fornece a capacidade de enviar um link de login para um único TenantUser.
Útil ao criar usuários em lote e não precisar instruí-los sobre como fazer login no FastComments.com. Isso simplesmente enviará um "link mágico" para login que expira após 30 days.
As seguintes restrições se aplicam para enviar um link de login a um TenantUser:
- O
TenantUserjá deve existir. - Você deve ter acesso para gerenciar o
Tenantao qual oTenantUserpertence.
Podemos enviar um link de login para um TenantUser da seguinte maneira:

Isso enviará um e-mail como Bob at TenantName is inviting you to be a moderator...


PATCH /api/v1/tenant-users/:id 
Esta rota permite atualizar um único TenantUser.
A atualização de um TenantUser tem as seguintes restrições:
- O
signUpDatenão pode estar no futuro. - O
localedeve constar na lista de Locales Suportados. - O
usernamedeve ser único em todo o FastComments.com. Se isso for um problema, sugerimos usar SSO. - O
emaildeve ser único em todo o FastComments.com. Se isso for um problema, sugerimos usar SSO. - Você não pode atualizar o
tenantIdde um usuário.
Podemos criar um TenantUser da seguinte forma



DELETE /api/v1/tenant-users/:id 
Esta rota fornece a remoção de um TenantUser por id.
A exclusão dos comentários do usuário é possível através do parâmetro de query deleteComments. Observe que se isso for verdadeiro:
- Todos os comentários do usuário serão excluídos imediatamente.
- Todos os child (agora órfãos) comentários serão excluídos ou anonimizados com base na configuração de página associada a cada comentário. Por exemplo se o modo de exclusão de thread for "anonymize", então as respostas permanecerão, e os comentários do usuário serão anonimizados. Isso se aplica somente quando
commentDeleteModeéRemove(o valor padrão). - O
creditsCostpassa a ser2.
Comentários anonimizados
Você pode manter os comentários do usuário, mas simplesmente anonimizá-los definindo commentDeleteMode=1.
Se os comentários do usuário forem anonimizados, então os seguintes valores serão definidos como null:
- commenterName
- commenterEmail
- avatarSrc
- userId
- anonUserId
- mentions
- badges
isDeleted e isDeletedUser são definidos como true.
Ao renderizar, o widget de comentários usará DELETED_USER_PLACEHOLDER (padrão: "[deleted]") para o nome do usuário e DELETED_CONTENT_PLACEHOLDER para o comentário. Estes podem ser personalizados através da UI de Personalização do Widget.
Exemplos



Estrutura de Usuário 
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:

GET /api/v1/users/:id 
Esta rota retorna um único User por id.



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

GET /api/v1/votes 
Os votos devem ser buscados por urlId.
Tipos de Votos
Existem três tipos de votos:
- Authenticated Votes, que são aplicados ao comentário correspondente. Você pode criar esses via esta API.
- Authenticated Votes, que estão pendentes de verificação e, portanto, ainda não foram aplicados ao comentário. Esses são criados quando um usuário usa o mecanismo login para votar do FastComments.com.
- Anonymous Votes, que são aplicados ao comentário correspondente. Eles são criados juntamente com o comentário anônimo.
Estes são retornados em listas separadas na API para reduzir confusão.



Observações sobre Votos Anônimos
Observe que votos anônimos criados via esta API aparecerão na lista appliedAuthorizedVotes. Eles são considerados autorizados, uma vez que foram criados através da API com uma API key.
A estrutura appliedAnonymousVotes é para votos criados sem um email, API key, etc.
GET /api/v1/votes/for-user 
Permite buscar votos deixados por um usuário em um determinado urlId. Recebe um userId que pode ser qualquer usuário do FastComments.com ou SSO User.
Isto é útil se você quiser mostrar se um usuário votou em um comentário. Ao buscar comentários, simplesmente chame esta API ao mesmo tempo para o usuário com o mesmo urlId.
Se você estiver usando votação anônima, então deverá passar anonUserId em vez disso.


Observe que votos anônimos aparecerão na lista appliedAuthorizedVotes. Eles são considerados autorizados pois foram criados via a API com uma API key.


POST /api/v1/votes 
Esta rota fornece a habilidade de adicionar um único Vote autorizado. Votes podem ser up (+1) ou down (-1).




Criando Votos Anônimos
Votos anônimos podem ser criados definindo anonUserId nos query params em vez de userId.
Este id não precisa corresponder a um objeto de usuário em nenhum lugar (daí anônimo). É simplesmente um identificador para a sessão, para que você possa buscar votos novamente na mesma sessão, para verificar se um comentário foi votado.
Se você não tiver algo como "sessões anônimas" como a FastComments tem - você pode simplesmente definir isso para um ID aleatório, como um UUID (embora apreciemos identificadores menores para economizar espaço).
Outras Notas
- Esta API obedece às configurações em nível de tenant. Por exemplo, se você desativar a votação para uma determinada página, e tentar criar um voto via API, isso falhará com o código de erro
voting-disabled. - Esta API está ativa por padrão.
- Esta API atualizará os
votesdoCommentcorrespondente.
DELETE /api/v1/votes/:id 
Esta rota fornece a capacidade de deletar um único Vote.



Notas:
- Esta API obedece às configurações a nível de tenant. Por exemplo, se você desabilitar a votação para uma determinada página, e tentar criar um vote via a API, ela falhará com o código de erro
voting-disabled. - Esta API está ativa por padrão.
- Esta API irá atualizar os
votesdoCommentcorrespondente.
Estrutura de Configuração de Domínio 
Um objeto DomainConfig representa a configuração de um domínio para um tenant.
A estrutura do objeto DomainConfig é a seguinte:


Para Autenticação
A Configuração de Domínio é usada para determinar quais sites podem hospedar o widget do FastComments para sua conta. Esta é uma forma básica de autenticação, o que significa que adicionar ou remover qualquer Configuração de Domínio pode impactar a disponibilidade da sua instalação do FastComments em produção.
Não remova ou atualize a propriedade domain de um Domain Config para um domínio que está atualmente em uso, a menos que a intenção seja desativar esse domínio.
Isso tem o mesmo comportamento que remover um domínio de /auth/my-account/configure-domains.
Observe também que remover um domínio da interface My Domains removerá qualquer configuração correspondente para esse domínio que possa ter sido adicionada através dessa interface.
Para Personalização de E-mail
O link de cancelamento de inscrição no rodapé do e-mail e o recurso de cancelamento de inscrição com um clique oferecido por muitos clientes de e-mail podem ser configurados através desta API definindo footerUnsubscribeURL e emailHeaders, respectivamente.
Para DKIM
Após definir seus registros DNS do DKIM, basta atualizar o DomainConfig com sua configuração DKIM usando a estrutura definida.
GET /api/v1/domain-configs 
Esta API fornece a capacidade de recuperar todos os objetos DomainConfig de um tenant.



GET /api/v1/domain-configs/:domain 
DomainConfigs individuais podem ser recuperados pelo seu domain correspondente.



POST /api/v1/domain-configs 
Este endpoint da API fornece a capacidade de criar configurações de domínio.
Adicionar uma configuração para um domínio autoriza esse domínio para a conta FastComments.
Casos de uso comuns desta API são a configuração inicial, se muitos domínios precisarem ser adicionados, ou configuração personalizada para envio de e-mails.



PATCH /api/v1/domain-configs/:domain 
Este endpoint da API permite atualizar a configuração de um domínio informando apenas o domínio e o atributo a ser atualizado.



PUT /api/v1/domain-configs/:domain 
Este endpoint da API permite substituir uma configuração de domínio.



DELETE /api/v1/domain-configs/:domain 
Esta rota fornece a remoção de um único DomainConfig por id.
- Observação: Remover um
DomainConfigirá desautorizar esse domínio de usar o FastComments. - Observação: Re-adicionar um domínio pela interface do usuário (UI) recriará o objeto (com apenas
domainpreenchido).



Estrutura de Configuração de Pergunta 
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:

GET /api/v1/question-configs 
Esta rota retorna até 100 objetos QuestionConfig por vez, paginados. O custo é 1 por cada 100 objetos. Eles são
ordenados pelo texto da pergunta em ordem crescente (question field).



GET /api/v1/question-configs/:id 
Esta rota retorna um único QuestionConfig pelo seu id.



POST /api/v1/question-configs 
Este endpoint da API permite criar um QuestionConfig.



PATCH /api/v1/question-configs/:id 
Esta rota permite atualizar um único QuestionConfig.
A estrutura a seguir representa todos os valores que podem ser alterados:




DELETE /api/v1/question-configs/:id 
Esta rota fornece a remoção de um QuestionConfig por id.
Isso irá excluir todos os resultados correspondentes das perguntas (mas não os comentários). Isso faz parte do alto custo em créditos.



Estrutura de Resultado de Pergunta 
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.

GET /api/v1/question-results 
Esta rota retorna até 1000 objetos QuestionResults por vez, paginados. O custo é 1 a cada 100 objetos. Eles são ordenados por createdAt, em ordem crescente. Você pode filtrar por vários parâmetros.



GET /api/v1/question-results/:id 
Esta rota retorna um único QuestionResult pelo seu id.



POST /api/v1/question-results 
Este endpoint da API permite criar um QuestionResult.



PATCH /api/v1/question-results/:id 
Esta rota permite atualizar um único QuestionResult.
A estrutura a seguir representa todos os valores que podem ser alterados:




DELETE /api/v1/question-results/:id 
Esta rota realiza a remoção de um QuestionResult pelo id.



GET /api/v1/question-results-aggregate 
É aqui que a agregação dos resultados acontece.
A estrutura de resposta da agregação é a seguinte:

Aqui estão os parâmetros de consulta disponíveis para agregação:

Aqui está um exemplo de requisição:

Exemplo de resposta:


Observações de Desempenho
- No caso de uma falha de cache, as agregações geralmente levam cinco segundos por milhão de resultados.
- Caso contrário, as requisições têm tempo constante.
Observações sobre Cache e Custo
- Quando
forceRecalculateé especificado, o custo é sempre10, em vez do normal2. - Se o cache expirar e os dados forem recalculados, o custo ainda será um constante
2seforceRecalculatenão estiver especificado. O cache expira com base no tamanho do conjunto de dados agregado (pode variar entre 30 segundos e 5 minutos). - Isto é para incentivar o uso do cache.
GET /api/v1/question-results-aggregate/combine/comments 
Este é o ponto onde ocorre a combinação de resultados com comentários. Útil para criar um gráfico de "comentários positivos e negativos recentes" para um produto, por exemplo.
Você pode buscar por um intervalo de valores (inclusivo), por uma ou mais perguntas, e por uma data inicial (inclusiva).
A estrutura da resposta é a seguinte:

Aqui estão os parâmetros de query disponíveis para agregação:

Aqui está um exemplo de requisição:

Exemplo de resposta:


Notas sobre Cache e Custo
- Quando
forceRecalculateé especificado, o custo é sempre10, em vez do normal2. - Se o cache expirar e os dados forem recalculados, o custo ainda é constante
2seforceRecalculatenão for especificado. - Isso é para incentivar o uso do cache.
Estrutura de Emblema de Usuário 
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:

GET /api/v1/user-badges 
Este endpoint permite recuperar as insígnias de usuários com base em vários critérios.
Exemplo de requisição:
Run 
Você pode adicionar vários parâmetros de consulta para filtrar os resultados:
userId- Obter insígnias para um usuário específicobadgeId- Obter instâncias de uma insígnia específicatype- Filtrar por tipo de insígnia (0=CommentCount, 1=CommentUpVotes, 2=CommentReplies, etc. Veja a estrutura UserBadge para a lista completa)displayedOnComments- Filtrar por se a insígnia é exibida em comentários (true/false)limit- Número máximo de insígnias a retornar (padrão 30, máximo 200)skip- Número de insígnias a ignorar (para paginação)
Exemplo de resposta:

Possíveis respostas de erro:


GET /api/v1/user-badges/:id 
Este endpoint permite recuperar um distintivo de usuário específico pelo seu ID único.
Exemplo de Requisição:
Run 
Exemplo de Resposta:

Possíveis Respostas de Erro:


POST /api/v1/user-badges 
Este endpoint permite criar uma nova atribuição de selo de usuário.
Exemplo de Requisição:
Run 
O corpo da requisição deve conter os seguintes parâmetros:
userId(obrigatório) - O ID do usuário ao qual o selo será atribuídobadgeId(obrigatório) - O ID do selo a ser atribuídodisplayedOnComments(opcional) - Se o selo deve ser exibido nos comentários do usuário (o padrão é true)
Notas Importantes:
- O selo deve existir e estar habilitado no catálogo de selos do seu tenant
- Você só pode atribuir selos a usuários que pertencem ao seu tenant ou que comentaram no seu site
Exemplo de Resposta:

Possíveis Respostas de Erro:





PUT /api/v1/user-badges/:id 
Este endpoint permite que você atualize uma atribuição de distintivo de usuário.
Atualmente, a única propriedade que pode ser atualizada é displayedOnComments, que controla se o distintivo é exibido nos comentários do usuário.
Exemplo de Requisição:
Run 
Exemplo de Resposta:

Possíveis respostas de erro:



DELETE /api/v1/user-badges/:id 
Este endpoint permite excluir uma atribuição de distintivo de usuário.
Exemplo de requisição:
Run 
Exemplo de resposta:

Possíveis respostas de erro:



Estrutura de Progresso de Emblema de Usuário 
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:

GET /api/v1/user-badge-progress 
Este endpoint permite que você recupere registros de progresso de badges de usuário com base em vários critérios.
Exemplo de Requisição:
Run 
Você pode adicionar vários parâmetros de consulta para filtrar os resultados:
userId- Obter progresso para um usuário específicolimit- Número máximo de registros a retornar (padrão 30, máximo 200)skip- Número de registros a ignorar (para paginação)
Exemplo de Resposta:

Possíveis Respostas de Erro:


GET /api/v1/user-badge-progress/:id 
Este endpoint permite que você recupere um registro específico de progresso de badge de usuário pelo seu ID único.
Exemplo de requisição:
Run 
Exemplo de resposta:

Possíveis respostas de erro:


GET /api/v1/user-badge-progress/user/:userId 
Este endpoint permite que você busque o registro de progresso de badge de um usuário pelo seu user ID.
Exemplo de Requisição:
Run 
Exemplo de Resposta:

Possíveis respostas de erro:



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.