Funcionários de fornecedores autenticados e compradores podem enviar um bug ou um comentário de qualquer página do aplicativo. Cada relato é armazenado com o status aberto e enviado por e-mail para Happy Webs.
Esta página é para a automação que coleta esses relatos. Não é uma chave de workspace API, e não está no documento OpenAPI.
AutenticarLink para esta seção#
A solicitação usa um token de portador. O token é o segredo do Worker FEEDBACK_REPORTS_TOKEN.
Defina-o uma vez, fora do git:
wrangler secret put FEEDBACK_REPORTS_TOKEN
Para desenvolvimento local, coloque o mesmo nome em .dev.vars. Não comite o valor.
Envie-o em cada solicitação:
GET /api/feedback-reports?since=2026-10-15T00:00:00.000Z HTTP/1.1
Host: tradecatalog.app
Authorization: Bearer <FEEDBACK_REPORTS_TOKEN>
curl "https://tradecatalog.app/api/feedback-reports?since=2026-10-15T00:00:00.000Z" \
-H "Authorization: Bearer $FEEDBACK_REPORTS_TOKEN"
Se o segredo estiver ausente, ou o cabeçalho estiver ausente ou incorreto, a resposta será 401 com WWW-Authenticate: Bearer realm="feedback-reports". Não há cookie, nenhuma chave de API de workspace e nenhuma CORS.
GET/api/feedback-reports
Listar relatos abertosLink para esta seção#
since é necessário. É uma data no formato ISO-8601 ou um tempo Unix em milissegundos. A lista é relatos abertos criados após esse tempo, do mais antigo para o mais recente, até 100.
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
since | string | sim | Limite inferior exclusivo em createdAt. |
after | string | não | ID do relato. Com since, também retorna relatos que compartilham esse tempo exato e ordena após esse ID. Use ambos quando hasMore for verdadeiro. |
Um relato que foi fechado não está nessa lista, mesmo que tenha sido criado após since.
{
"reports": [
{
"id": "…",
"kind": "bug",
"status": "open",
"message": "The price shows as zero.",
"pageUrl": "https://tradecatalog.app/s/northgate/products",
"tenantSlug": "northgate",
"userId": "…",
"role": "Owner",
"email": "owner@example.com",
"userAgent": "…",
"viewport": "1440x900",
"createdAt": "2026-10-15T12:00:00.000Z",
"hasScreenshot": true,
"screenshotUrl": "https://tradecatalog.app/api/feedback-reports/…/screenshot",
"autoReplyText": null,
"autoReplySentAt": null,
"resolvedReplyText": null,
"resolvedReplySentAt": null,
"adminUrl": "https://tradecatalog.app/admin?section=reports&report=…"
}
],
"hasMore": false
}
Armazene o createdAt e id do último relato que você salvou. A próxima verificação usa esse tempo como since. Se a página estiver cheia (hasMore for verdadeiro), também passe esse ID como after e mantenha o mesmo since, para que um relato salvo no mesmo milissegundo não seja pulado.
Captura de telaLink para esta seção#
GET/api/feedback-reports/{id}/screenshot
O mesmo token de portador. A resposta é a imagem, ou 404 quando esse relato não tem captura de tela. O ID é o ID do relato da lista. Não é uma chave de objeto.
Os administradores da plataforma também podem abrir a captura de tela enquanto estão conectados em /admin/feedback-reports/{id} e resolver um relatório em Suporte → Relatórios.
Resposta automáticaLink para esta seção#
Salvar um relatório envia uma nota curta para a pessoa conectada no seu endereço próprio. Resolver o relatório envia novamente, para informar que foi corrigido e está ativo. Cada um desses é enviado no máximo uma vez por relatório.
autoReplyText e autoReplySentAt são essa primeira nota. resolvedReplyText e resolvedReplySentAt são a nota resolvida. Eles permanecem nulos até que o e-mail tenha sido enviado.
Defina a variável Worker FEEDBACK_AUTO_REPLY como off para parar ambos. AUTO_REPLY_BCC é um segredo: o endereço copiado nos e-mails. Deixe-o não definido e nada será copiado. A redação é feita com o AI do Worker. Se esse rascunho falhar em uma verificação, um aviso fixo será enviado em vez disso.
Cada relatório também se torna um ticket numerado. Resolver esse ticket envia o mesmo e-mail fixo e ativo uma vez. E-mails para support@ ou info@tradecatalog.app são encaminhados para SUPPORT_FORWARD_TO antes de serem lidos, depois arquivados da mesma forma. Se esse endereço estiver ausente, ou o encaminhamento falhar, a mensagem será rejeitada para que o remetente possa tentar novamente. Ela é anexada a uma conta existente somente quando Authentication-Results mostra um passo DMARC, ou ambos DKIM e SPF quando o DMARC estiver ausente. Caso contrário, o ticket permanece sem ligação e nenhuma confirmação é enviada.