# GET /relatorios/tempo-de-resposta — Tempo de resposta e de resolução

- URL: `GET https://chat.forsi.com.br/api/v1/relatorios/tempo-de-resposta`
- Acesso: escopo `relatorios:ler` · módulo do plano: API
- Sucesso: `200`, `{"dados": ...}` com `RelatorioTempo`; ou CSV com `formato=csv`
- Página: https://docs.forsi.com.br/api/relatorios/relatorio-tempo-de-resposta (Markdown: https://docs.forsi.com.br/api/relatorios/relatorio-tempo-de-resposta.md)

Primeira resposta e resolução das conversas: quantidade, mediana, 90% das conversas, faixas e a porcentagem respondida em até 1, 5, 15 e 60 minutos. Tempos em segundos. Por semana ou mês, a mediana é calculada de novo em cada período (não é média de medianas).

**Parâmetros de consulta (query string)**

| Campo | Tipo | Obrigatório | Notas |
| --- | --- | --- | --- |
| `de` | data AAAA-MM-DD | não | Primeiro dia (AAAA-MM-DD, no fuso da organização). Padrão: 29 dias antes de `ate`. |
| `ate` | data AAAA-MM-DD | não | Último dia, inclusive. Padrão: hoje. O período vai até 366 dias. |
| `granularidade` | "dia" \| "semana" \| "mes" | não | Tamanho de cada linha da série: `dia` (padrão), `semana` (começa na segunda) ou `mes`. |
| `caixa_id` | uuid | não | Só os números desta caixa (WhatsApp, Instagram...). Veja as caixas em GET /me. |
| `formato` | "json" \| "csv" | não | `json` (padrão) ou `csv` (UTF-8 com BOM, separado por vírgula, pronto para planilha). |

**Exemplo (curl)**

```bash
curl "https://chat.forsi.com.br/api/v1/relatorios/tempo-de-resposta?de=2026-09-01&ate=2026-09-30" \
  -H "Authorization: Bearer $FORSI_CHAVE"
```

**JavaScript (fetch)**

```js
const resposta = await fetch('https://chat.forsi.com.br/api/v1/relatorios/tempo-de-resposta?de=2026-09-01&ate=2026-09-30', {
  headers: {
    Authorization: `Bearer ${process.env.FORSI_CHAVE}`,
  },
});
const json = await resposta.json();
if (!resposta.ok) throw new Error(`${resposta.status} ${json.erro.codigo}: ${json.erro.mensagem}`);
console.log(json.dados);
```

**Python (requests)**

```python
import os
import requests

resposta = requests.get(
    "https://chat.forsi.com.br/api/v1/relatorios/tempo-de-resposta",
    headers={
        "Authorization": f"Bearer {os.environ['FORSI_CHAVE']}",
    },
    params={
        "de": "2026-09-01",
        "ate": "2026-09-30",
    },
    timeout=30,
)
corpo = resposta.json()
if not resposta.ok:
    raise RuntimeError(f"{resposta.status_code} {corpo['erro']['codigo']}: {corpo['erro']['mensagem']}")
print(corpo["dados"])
```

**Resposta `200` (exemplo)**

```json
{
  "dados": {
    "periodo": {
      "de": "2026-10-12",
      "ate": "2026-10-12",
      "dias": 30,
      "fuso": "America/Sao_Paulo",
      "granularidade": "dia",
      "caixa_id": "7a9d53e9-9d1b-4122-923b-fac67958f445"
    },
    "resumo": {
      "primeiras_respostas": 12,
      "sem_resposta": 12,
      "mediana_primeira_resposta_s": 240,
      "p90_primeira_resposta_s": 240,
      "respondidas_em_ate_1_min_pct": 87.5,
      "respondidas_em_ate_5_min_pct": 87.5,
      "respondidas_em_ate_15_min_pct": 87.5,
      "respondidas_em_ate_1_h_pct": 87.5,
      "resolvidas": 12,
      "mediana_resolucao_s": 240,
      "p90_resolucao_s": 240
    },
    "faixas_primeira_resposta": [{"faixa":"1 a 5 min","quantidade":12}],
    "faixas_resolucao": [{"faixa":"1 a 5 min","quantidade":12}],
    "linhas": [
      {
        "inicio": "2026-10-12T17:00:00.000Z",
        "fim": "2026-10-12T17:30:00.000Z",
        "primeiras_respostas": 12,
        "mediana_primeira_resposta_s": 240,
        "resolvidas": 12,
        "mediana_resolucao_s": 240
      }
    ]
  }
}
```

**Campos de `RelatorioTempo`**

| Campo | Tipo | Obrigatório | Notas |
| --- | --- | --- | --- |
| `periodo` | object | não | O período que valeu na consulta (com os padrões aplicados). |
| `periodo.de` | data AAAA-MM-DD | não |  |
| `periodo.ate` | data AAAA-MM-DD | não |  |
| `periodo.dias` | integer | não |  |
| `periodo.fuso` | string | não | ex.: America/Sao_Paulo |
| `periodo.granularidade` | "dia" \| "semana" \| "mes" | não | Só nos relatórios em série. |
| `periodo.caixa_id` | uuid | não |  |
| `resumo` | object | não |  |
| `resumo.primeiras_respostas` | integer | não |  |
| `resumo.sem_resposta` | integer | não |  |
| `resumo.mediana_primeira_resposta_s` | integer ou null | não | Mediana da primeira resposta (segundos) |
| `resumo.p90_primeira_resposta_s` | integer ou null | não | 90% das conversas foram respondidas em até (segundos) |
| `resumo.respondidas_em_ate_1_min_pct` | number ou null | não |  |
| `resumo.respondidas_em_ate_5_min_pct` | number ou null | não |  |
| `resumo.respondidas_em_ate_15_min_pct` | number ou null | não |  |
| `resumo.respondidas_em_ate_1_h_pct` | number ou null | não | Porcentagem (0 a 100) das conversas com primeira resposta em até 1 hora. |
| `resumo.resolvidas` | integer | não |  |
| `resumo.mediana_resolucao_s` | integer ou null | não | Mediana até resolver (segundos) |
| `resumo.p90_resolucao_s` | integer ou null | não | 90% das conversas foram resolvidas em até (segundos) |
| `faixas_primeira_resposta` | lista de object | não |  |
| `faixas_primeira_resposta[].faixa` | string | não | ex.: 1 a 5 min |
| `faixas_primeira_resposta[].quantidade` | integer | não |  |
| `faixas_resolucao` | lista de object | não |  |
| `faixas_resolucao[].faixa` | string | não | ex.: 1 a 5 min |
| `faixas_resolucao[].quantidade` | integer | não |  |
| `linhas` | lista de object | não | Uma linha por dia, semana ou mês. |
| `linhas[].inicio` | data AAAA-MM-DD | não |  |
| `linhas[].fim` | data AAAA-MM-DD | não | Último dia da linha (nas pontas do período, a linha é cortada). |
| `linhas[].primeiras_respostas` | integer | não |  |
| `linhas[].mediana_primeira_resposta_s` | integer ou null | não | Mediana da primeira resposta (segundos) |
| `linhas[].resolvidas` | integer | não |  |
| `linhas[].mediana_resolucao_s` | integer ou null | não | Mediana até resolver (segundos) |

**Erros**

- `401`: Chave ausente ou inválida (resposta igual para qualquer motivo).
- `403`: Plano sem API, escopo insuficiente ou https/origem recusados.
- `422`: Dados inválidos ou regra de negócio (ex.: janela_fechada; conta_restrita = a Meta restringiu a conta por spam: erro traz os campos de RestricaoMeta, como ate, escopo, motivo e retry_after_s).
- `429`: Limite de requisições. Veja Retry-After.
- Códigos comuns aqui: `periodo_longo`, `periodo_invalido`, `granularidade_invalida`, `caixa_invalida`, `limite_relatorios`, `relatorio_demorou`.

---

Página: https://docs.forsi.com.br/api/relatorios/relatorio-tempo-de-resposta · Índice: https://docs.forsi.com.br/llms.txt · Tudo num arquivo: https://docs.forsi.com.br/llms-full.txt
