{"openapi":"3.1.0","info":{"title":"Adzgrup API","version":"1.0.0","description":"API para ler os dados do Adzgrup (grupos, conversas, pendências de resposta, assuntos, insights e métricas) e receber eventos por webhook.\n\n**Autenticação.** Crie uma chave em *Configurações → API* (só o dono da empresa). Envie em `Authorization: Bearer adz_live_…`. A chave age com o acesso de quem a criou: se essa pessoa perder o acesso de dono/gestor, a chave para de funcionar. Guarde-a como segredo; ela aparece uma única vez.\n\n**Formato.** Toda resposta é `{ \"success\": true, \"data\": … }` ou `{ \"success\": false, \"treatedReason\": \"…\" }`. Trate pelo `treatedReason`, nunca pelo texto.\n\n**Limites.** 120 requisições por minuto por chave. Datas em ISO 8601 (UTC). Tempos de resposta em minutos **úteis** (horário de atendimento da empresa).\n\n**Mídia.** Mensagens com anexo trazem `media.url`: link assinado que vale 1–2 horas. Os arquivos ficam disponíveis por 90 dias; depois disso só o texto derivado (`media.text`).\n\n**Webhooks.** Em *Configurações → Integrações*, crie uma integração do tipo *Webhook* para receber `alert.created`, `alert.resolved` e `insight.high` no seu sistema. Verifique a assinatura (ver seção Webhooks).\n\n**Para assistentes de IA:** a mesma API em texto em [/llms.txt](https://adzgrup-web.mon-pipeline.workers.dev/llms.txt).\n\n## Primeira chamada\n```bash\ncurl https://api.adzgrup.com.br/v1/pending \\\n  -H \"Authorization: Bearer adz_live_SUA_CHAVE\"\n```\nTempo de 1ª resposta por colaborador (30 dias):\n```bash\ncurl -X POST https://api.adzgrup.com.br/v1/metrics/query \\\n  -H \"Authorization: Bearer adz_live_SUA_CHAVE\" -H \"Content-Type: application/json\" \\\n  -d '{\"metric\":\"first_response_median\",\"dimensions\":[\"collaborator\"],\"period\":\"30d\"}'\n```\n## Validar um webhook\n```js\nimport crypto from 'node:crypto'\n// corpo CRU da requisição (string), antes de qualquer JSON.parse\nfunction webhookValido(corpo, headers, segredo) {\n  const ts = headers['x-adzgrup-timestamp']\n  const assinatura = headers['x-adzgrup-signature'] // \"sha256=…\"\n  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false // recusa reenvio antigo\n  const esperada = 'sha256=' + crypto.createHmac('sha256', segredo).update(`${ts}.${corpo}`).digest('hex')\n  return crypto.timingSafeEqual(Buffer.from(esperada), Buffer.from(assinatura))\n}\n```"},"servers":[{"url":"https://api.adzgrup.com.br/v1"}],"security":[{"apiKey":[]}],"tags":[{"name":"Conversas","description":"Grupos acompanhados e mensagens."},{"name":"Atendimento","description":"Pendências de resposta e equipe."},{"name":"Análise","description":"Assuntos, insights, métricas e assistente."}],"paths":{"/groups":{"get":{"summary":"Listar grupos","description":"Grupos acompanhados, com a última mensagem e desde quando o cliente espera resposta (`waitingSince`).","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Group"}}}}}}},"400":{"description":"Requisição inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave ausente, inválida ou revogada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não encontrado (ou fora do seu acesso)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de 120 requisições/minuto por chave","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Conversas"]}},"/groups/{id}":{"get":{"summary":"Conversa de um grupo","description":"Mensagens em ordem de leitura, de 80 em 80. Para páginas anteriores, passe `before` = `sentAt` da primeira mensagem recebida.","parameters":[{"name":"id","in":"path","required":true,"description":"ID do grupo","schema":{"type":"string","format":"uuid"}},{"name":"before","in":"query","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"$ref":"#/components/schemas/GroupDetail"}}}}}},"400":{"description":"Requisição inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave ausente, inválida ou revogada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não encontrado (ou fora do seu acesso)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de 120 requisições/minuto por chave","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Conversas"]}},"/pending":{"get":{"summary":"Pendências de resposta","description":"Grupos em que um cliente pediu algo e a equipe ainda não respondeu, com o último aviso (resumo e sugestão).","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Pending"}}}}}}},"400":{"description":"Requisição inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave ausente, inválida ou revogada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não encontrado (ou fora do seu acesso)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de 120 requisições/minuto por chave","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Atendimento"]}},"/team":{"get":{"summary":"Equipe e sugestões","description":"Pessoas presentes nos grupos, papel atual (equipe/cliente) e sugestão por presença.","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"$ref":"#/components/schemas/Team"}}}}}},"400":{"description":"Requisição inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave ausente, inválida ou revogada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não encontrado (ou fora do seu acesso)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de 120 requisições/minuto por chave","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Atendimento"]}},"/topics":{"get":{"summary":"Listar assuntos","description":"Assuntos (threads) dos grupos, mais recentes primeiro.","parameters":[{"name":"group","in":"query","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Topic"}}}}}}},"400":{"description":"Requisição inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave ausente, inválida ou revogada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não encontrado (ou fora do seu acesso)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de 120 requisições/minuto por chave","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Análise"]}},"/topics/{id}":{"get":{"summary":"Assunto com os trechos","description":"Mensagens do assunto em ordem e o histórico de mudanças.","parameters":[{"name":"id","in":"path","required":true,"description":"ID do assunto","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"$ref":"#/components/schemas/TopicDetail"}}}}}},"400":{"description":"Requisição inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave ausente, inválida ou revogada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não encontrado (ou fora do seu acesso)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de 120 requisições/minuto por chave","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Análise"]}},"/insights":{"get":{"summary":"Insights","description":"Achados das lentes (risco de churn, oportunidade, reclamação, qualidade do atendimento), sempre com as mensagens de evidência.","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Insight"}}}}}}},"400":{"description":"Requisição inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave ausente, inválida ou revogada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não encontrado (ou fora do seu acesso)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de 120 requisições/minuto por chave","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Análise"]}},"/metrics":{"get":{"summary":"Catálogo de métricas","description":"Métricas disponíveis e as dimensões permitidas em cada uma.","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/Metric"}}}}}}},"400":{"description":"Requisição inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave ausente, inválida ou revogada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não encontrado (ou fora do seu acesso)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de 120 requisições/minuto por chave","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Análise"]}},"/metrics/query":{"post":{"tags":["Análise"],"summary":"Calcular métrica","description":"Calcula uma métrica do catálogo, opcionalmente quebrada por até 2 dimensões. `previous` traz o período anterior (só sem dimensão).","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["metric"],"properties":{"metric":{"type":"string","description":"Chave do catálogo (GET /metrics).","examples":["first_response_median"]},"dimensions":{"type":"array","maxItems":2,"items":{"$ref":"#/components/schemas/Dimension"},"description":"Até 2 dimensões para quebrar o número."},"period":{"type":"string","enum":["7d","30d","90d"],"default":"30d"},"filters":{"type":"object","properties":{"accountId":{"type":"string","format":"uuid"},"groupId":{"type":"string","format":"uuid"},"personId":{"type":"string","format":"uuid"}}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"$ref":"#/components/schemas/MetricResult"}}}}}},"400":{"description":"Requisição inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave ausente, inválida ou revogada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não encontrado (ou fora do seu acesso)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de 120 requisições/minuto por chave","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/metrics/drill":{"post":{"tags":["Análise"],"summary":"Mensagens por trás de um número","description":"Mesma consulta + `point` (`{ dimensão: id }` de uma linha do resultado). Devolve até 50 mensagens ou assuntos.","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"type":"object","required":["metric"],"properties":{"metric":{"type":"string","description":"Chave do catálogo (GET /metrics).","examples":["first_response_median"]},"dimensions":{"type":"array","maxItems":2,"items":{"$ref":"#/components/schemas/Dimension"},"description":"Até 2 dimensões para quebrar o número."},"period":{"type":"string","enum":["7d","30d","90d"],"default":"30d"},"filters":{"type":"object","properties":{"accountId":{"type":"string","format":"uuid"},"groupId":{"type":"string","format":"uuid"},"personId":{"type":"string","format":"uuid"}}}}},{"type":"object","required":["point"],"properties":{"point":{"type":"object","additionalProperties":{"type":["string","null"]}}}}]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"type":"array","items":{"$ref":"#/components/schemas/DrillItem"}}}}}}},"400":{"description":"Requisição inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave ausente, inválida ou revogada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não encontrado (ou fora do seu acesso)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de 120 requisições/minuto por chave","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/assistant":{"post":{"tags":["Análise"],"summary":"Perguntar ao assistente","description":"Pergunta em português sobre a operação. Usa IA (conta no uso do mês). Mande o histórico em `turns` para continuar a conversa.","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["turns"],"properties":{"turns":{"type":"array","items":{"type":"object","required":["role","content"],"properties":{"role":{"enum":["user","assistant"]},"content":{"type":"string"}}}}},"examples":[{"turns":[{"role":"user","content":"Quem da equipe demora mais para responder nos últimos 30 dias?"}]}]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["success","data"],"properties":{"success":{"const":true},"data":{"$ref":"#/components/schemas/AssistantReply"}}}}}},"400":{"description":"Requisição inválida","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Chave ausente, inválida ou revogada","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não encontrado (ou fora do seu acesso)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Limite de 120 requisições/minuto por chave","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"webhooks":{"alert.created":{"post":{"summary":"Aviso de cliente esperando","description":"Disparado em cada estágio do aviso (ex.: 15, 30 e 60 minutos úteis).","parameters":[{"name":"X-Adzgrup-Event","in":"header","schema":{"type":"string"}},{"name":"X-Adzgrup-Timestamp","in":"header","schema":{"type":"string"},"description":"Segundos desde 1970 (UTC)."},{"name":"X-Adzgrup-Signature","in":"header","schema":{"type":"string"},"description":"`sha256=` + HMAC-SHA256 hex de `\"{timestamp}.{corpo}\"` com o segredo `whsec_…` da integração."}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["event","company_id","occurred_at","title","text","data"],"properties":{"event":{"type":"string"},"company_id":{"type":"string","format":"uuid"},"occurred_at":{"type":"string","format":"date-time"},"title":{"type":"string"},"text":{"type":"string"},"url":{"type":["string","null"]},"data":{"type":"object","properties":{"alert_id":{"type":"string","format":"uuid"},"group_id":{"type":"string","format":"uuid"},"group_name":{"type":["string","null"]},"stage":{"type":"integer"},"pending_since":{"type":"string","format":"date-time"},"summary":{"type":["string","null"]},"suggestion":{"type":["string","null"]}}}}}}}},"responses":{"2XX":{"description":"Recebido. Qualquer outra resposta conta como falha (aparece em Configurações → Integrações)."}}}},"alert.resolved":{"post":{"summary":"Cliente respondido","description":"A equipe respondeu e a espera acabou (uma vez por espera).","parameters":[{"name":"X-Adzgrup-Event","in":"header","schema":{"type":"string"}},{"name":"X-Adzgrup-Timestamp","in":"header","schema":{"type":"string"},"description":"Segundos desde 1970 (UTC)."},{"name":"X-Adzgrup-Signature","in":"header","schema":{"type":"string"},"description":"`sha256=` + HMAC-SHA256 hex de `\"{timestamp}.{corpo}\"` com o segredo `whsec_…` da integração."}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["event","company_id","occurred_at","title","text","data"],"properties":{"event":{"type":"string"},"company_id":{"type":"string","format":"uuid"},"occurred_at":{"type":"string","format":"date-time"},"title":{"type":"string"},"text":{"type":"string"},"url":{"type":["string","null"]},"data":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid"},"group_name":{"type":["string","null"]},"alert_ids":{"type":"array","items":{"type":"string","format":"uuid"}}}}}}}}},"responses":{"2XX":{"description":"Recebido. Qualquer outra resposta conta como falha (aparece em Configurações → Integrações)."}}}},"insight.high":{"post":{"summary":"Insight de gravidade alta","description":"Uma lente encontrou algo grave e novo (ex.: risco de churn).","parameters":[{"name":"X-Adzgrup-Event","in":"header","schema":{"type":"string"}},{"name":"X-Adzgrup-Timestamp","in":"header","schema":{"type":"string"},"description":"Segundos desde 1970 (UTC)."},{"name":"X-Adzgrup-Signature","in":"header","schema":{"type":"string"},"description":"`sha256=` + HMAC-SHA256 hex de `\"{timestamp}.{corpo}\"` com o segredo `whsec_…` da integração."}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["event","company_id","occurred_at","title","text","data"],"properties":{"event":{"type":"string"},"company_id":{"type":"string","format":"uuid"},"occurred_at":{"type":"string","format":"date-time"},"title":{"type":"string"},"text":{"type":"string"},"url":{"type":["string","null"]},"data":{"type":"object","properties":{"insight_id":{"type":"string","format":"uuid"},"lens":{"type":"string"},"topic_id":{"type":"string","format":"uuid"},"group_id":{"type":"string","format":"uuid"},"group_name":{"type":["string","null"]}}}}}}}},"responses":{"2XX":{"description":"Recebido. Qualquer outra resposta conta como falha (aparece em Configurações → Integrações)."}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"adz_live_…","description":"Chave criada em Configurações → API."}},"schemas":{"Error":{"type":"object","required":["success","treatedReason"],"properties":{"success":{"const":false},"treatedReason":{"enum":["UNAUTHENTICATED","FORBIDDEN","INVALID_REQUEST","NOT_FOUND","DATABASE_ERROR","INTERNAL_ERROR","RATE_LIMITED"]}}},"Dimension":{"enum":["day","weekday","hour","account","group","collaborator","customer","person","role","group_type","topic_category","status","lens","severity","stage"]},"Group":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":["string","null"]},"accountId":{"type":["string","null"]},"accountName":{"type":["string","null"]},"lastAt":{"type":["string","null"],"format":"date-time"},"lastBody":{"type":["string","null"]},"lastType":{"type":["string","null"]},"lastSender":{"type":["string","null"]},"waitingSince":{"type":["string","null"],"format":"date-time","description":"Desde quando o cliente espera resposta; null = ninguém esperando."}}},"Message":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"body":{"type":["string","null"]},"type":{"type":"string","examples":["text","image","audio","video","document"]},"fromMe":{"type":"boolean"},"isDeleted":{"type":"boolean"},"editedAt":{"type":["string","null"],"format":"date-time"},"sentAt":{"type":"string","format":"date-time"},"sender":{"type":"object","properties":{"contactId":{"type":["string","null"]},"name":{"type":["string","null"]},"phone":{"type":["string","null"]},"role":{"enum":["team","customer"]}}},"reactions":{"type":"array","items":{"type":"string"}},"topics":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}}}},"media":{"type":["object","null"],"properties":{"status":{"enum":["pending","ready","failed","ignored"]},"kind":{"type":"string"},"mime":{"type":["string","null"]},"text":{"type":["string","null"],"description":"Transcrição, descrição ou resumo."},"seconds":{"type":["integer","null"]},"fileName":{"type":["string","null"]},"url":{"type":["string","null"],"description":"Link assinado (1–2 h). null depois de 90 dias."}}}}},"GroupDetail":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":["string","null"]},"accountName":{"type":["string","null"]},"teamCount":{"type":"integer"},"customerCount":{"type":"integer"},"hasMore":{"type":"boolean"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/Message"}}}},"Pending":{"type":"object","properties":{"groupId":{"type":"string"},"groupName":{"type":["string","null"]},"accountName":{"type":["string","null"]},"since":{"type":"string","format":"date-time"},"sinceText":{"type":["string","null"]},"sinceSender":{"type":["string","null"]},"reason":{"type":["string","null"]},"stage":{"type":"integer"},"alert":{"type":["object","null"],"properties":{"id":{"type":"string"},"summary":{"type":["string","null"]},"suggestion":{"type":["string","null"]},"feedback":{"enum":["util","nao_util",null]}}}}},"Team":{"type":"object","properties":{"threshold":{"type":"integer"},"trackedGroups":{"type":"integer"},"people":{"type":"array","items":{"type":"object","properties":{"contactId":{"type":"string"},"name":{"type":["string","null"]},"phone":{"type":["string","null"]},"groups":{"type":"integer"},"messages":{"type":"integer"},"role":{"enum":["team","customer"]},"status":{"enum":["suggested","confirmed","dismissed",null]},"suggested":{"type":"boolean"}}}}}},"Topic":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"category":{"enum":["suporte","atendimento","comercial","financeiro","outro"]},"status":{"enum":["aberto","andamento","resolvido","sem_fechamento"]},"summary":{"type":["string","null"]},"groupId":{"type":"string"},"groupName":{"type":["string","null"]},"firstAt":{"type":"string","format":"date-time"},"lastAt":{"type":"string","format":"date-time"},"messageCount":{"type":"integer"},"entities":{"type":"array","items":{"type":"string"}}}},"TopicDetail":{"allOf":[{"$ref":"#/components/schemas/Topic"},{"type":"object","properties":{"snippets":{"type":"array","items":{"type":"object","properties":{"messageId":{"type":"string"},"sentAt":{"type":"string","format":"date-time"},"sender":{"type":"string"},"role":{"enum":["team","customer"]},"text":{"type":"string"},"type":{"type":"string"},"source":{"enum":["agent","user"]}}}},"events":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"detail":{"type":"object"},"at":{"type":"string","format":"date-time"}}}}}}]},"Insight":{"type":"object","properties":{"id":{"type":"string"},"lens":{"type":"object","properties":{"id":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"},"subject":{"enum":["customer","team"]}}},"severity":{"enum":["baixo","medio","alto"]},"score":{"type":["number","null"]},"title":{"type":"string"},"summary":{"type":["string","null"]},"stale":{"type":"boolean"},"groupId":{"type":"string"},"groupName":{"type":["string","null"]},"topic":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}}},"updatedAt":{"type":"string","format":"date-time"},"evidence":{"type":"array","items":{"type":"object","properties":{"messageId":{"type":"string"},"quote":{"type":["string","null"]},"sender":{"type":"string"},"sentAt":{"type":"string","format":"date-time"}}}}}},"Metric":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"description":{"type":["string","null"]},"unit":{"type":"string","examples":["min","%","h",""]},"better":{"enum":["higher","lower"]},"allowedDimensions":{"type":"array","items":{"$ref":"#/components/schemas/Dimension"}}}},"MetricResult":{"type":"object","properties":{"metric":{"$ref":"#/components/schemas/Metric"},"dimensions":{"type":"array","items":{"$ref":"#/components/schemas/Dimension"}},"previous":{"type":["number","null"]},"rows":{"type":"array","items":{"type":"object","properties":{"dims":{"type":"object","additionalProperties":{"type":"object","properties":{"id":{"type":["string","null"]},"label":{"type":"string"}}}},"value":{"type":["number","null"]},"n":{"type":"integer"}}}}}},"DrillItem":{"type":"object","properties":{"at":{"type":"string","format":"date-time"},"groupId":{"type":"string"},"groupName":{"type":["string","null"]},"messageId":{"type":["string","null"]},"topicId":{"type":["string","null"]},"sender":{"type":["string","null"]},"text":{"type":"string"},"extra":{"type":["string","null"]}}},"AssistantReply":{"type":"object","properties":{"answer":{"type":"string"},"chart":{"type":["object","null"],"properties":{"query":{"type":"object","required":["metric"],"properties":{"metric":{"type":"string","description":"Chave do catálogo (GET /metrics).","examples":["first_response_median"]},"dimensions":{"type":"array","maxItems":2,"items":{"$ref":"#/components/schemas/Dimension"},"description":"Até 2 dimensões para quebrar o número."},"period":{"type":"string","enum":["7d","30d","90d"],"default":"30d"},"filters":{"type":"object","properties":{"accountId":{"type":"string","format":"uuid"},"groupId":{"type":"string","format":"uuid"},"personId":{"type":"string","format":"uuid"}}}}},"result":{"$ref":"#/components/schemas/MetricResult"}}},"sources":{"type":"array","items":{"$ref":"#/components/schemas/DrillItem"}},"toolsUsed":{"type":"array","items":{"type":"string"}}}}}}}