Skip to main content
Documentação
CENTRO DE APRENDIZAGEM

Domine a moderação de conteúdo com guias completos, tutoriais e documentação da API

Links rápidos

Códigos de erro e resposta

A API Discuse sinaliza problemas de duas formas: um status de erro HTTP com uma message, ou uma resposta normal 200 cujos campos informam o que aconteceu. Esta página lista todos os casos para que você possa tratá-los corretamente — e explica aquele que costuma confundir: o esgotamento da cota de faturamento não é um erro HTTP.

Quais status HTTP a API retorna?

Status Quando O que fazer
200 Sucesso — incluindo o caso de "cota esgotada" Inspecione o corpo da resposta; um 200 nem sempre é sinal verde (veja abaixo)
400 Falha na validação da solicitação — conteúdo vazio, text com mais de 10.000 caracteres ou URLs de mídia em excesso Corrija a solicitação; não tente novamente sem alterações
401 Chave de API ausente ou inválida Verifique o cabeçalho X-API-Key; não tente novamente sem alterações
429 Limite de taxa excedido para a chave Aguarde e tente novamente após a janela de um minuto
500 Erro interno ou em um serviço downstream Tente novamente com backoff

Leia a message em qualquer resposta que não seja 2xx. Falhas de autenticação retornam 401, falhas de limite de taxa retornam 429 e falhas de validação da solicitação retornam 400; trate 5xx como transitório e tente novamente com backoff.

Por que "cota esgotada" é 200, e não um erro?

Quando um projeto esgota sua franquia mensal de solicitações à API, POST /api/v2/check ainda retorna 200 — com o conteúdo tratado como sem violações, uma message explicando que a cota está esgotada e um objeto usage mostrando zero restante:

{
  "has_violations": false,
  "message": "API quota exceeded. Current: 10000, Limit: 10000",
  "usage": {
    "api_requests_used": 10000,
    "api_requests_limit": 10000,
    "api_requests_remaining": 0
  }
}

Isso é intencional: o fim da cota não deve parecer uma falha do servidor nem bloquear seu pipeline com uma exceção. Verifique usage.api_requests_remaining (e a message) em vez de confiar no código de status. Se você liberar o fluxo com base em um 200, uma cota esgotada deixaria conteúdo passar silenciosamente sem verificação — portanto, crie ramificações explicitamente com base nesses campos.

Como devo ler uma resposta bem-sucedida?

Um 200 de /api/v2/check sempre traz has_violations e cached; o restante é opcional:

Field Type Meaning
has_violations boolean Verdadeiro se qualquer verificação habilitada sinalizou o conteúdo
cached boolean Verdadeiro se foi servido a partir de um cache recente de solicitação idêntica
message string Presente quando a cota se esgota (e em avisos semelhantes que não são erros)
request_id string Devolvido se você tiver enviado um
processing_time_ms number Presente quando a medição de tempo está habilitada para o projeto
usage object api_requests_used, api_requests_limit, api_requests_remaining
results object Detalhes por verificação (spamfinder, sentiment, images, …) e o sinalizador de nível superior hits

Use has_violations para decidir o veredito geral e, em seguida, aprofunde-se em results.<check>.hit para saber qual verificação foi acionada.

Como o cache afeta as respostas?

Solicitações idênticas para o mesmo projeto são desduplicadas: uma repetição retorna cached: true com o mesmo resultado. O cache é por projeto. Observe que uma solicitação em cache ainda conta para sua cota de solicitações à API — ele economiza tempo de processamento, não cota.

Você pode anexar um request_id a uma solicitação para sua própria correlação; ele é devolvido na resposta.

Um cliente mínimo e correto

async function check(content, settings) {
  const response = await fetch('https://api.discuse.com/api/v2/check', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': process.env.DISCUSE_API_KEY
    },
    body: JSON.stringify({ content, settings })
  });

  // 400: bad request — fix it, don't retry. 5xx: transient/auth/rate-limit — retry with backoff.
  if (response.status === 400) {
    throw new Error('Invalid request: ' + (await response.text()));
  }
  if (!response.ok) {
    throw new Error(`Discuse error ${response.status}`); // retry upstream with backoff
  }

  const data = await response.json();

  // Quota exhausted is a 200 — never treat it as "checked and clean".
  if (data.usage && data.usage.api_requests_remaining === 0 && data.message) {
    throw new Error('Quota exhausted: ' + data.message);
  }

  return data; // inspect data.has_violations and data.results
}

Relacionados

Escrito por Equipe Discuse · Última atualização em June 2026

Artigos relacionados

O que é moderação de conteúdo?

Entenda os fundamentos da moderação de conteúdo e por que ela é importante para sua plataforma

Guia de início rápido

Comece a usar a API da Discuse em menos de 5 minutos

Autenticação e chaves de API

Como autenticar solicitações e gerenciar suas chaves de API com segurança