Como extrair dados em lote via API (Data Extract API)
Quando usar
- Você precisa exportar dados históricos de tickets para BI, auditoria ou dashboard externo
- Você quer alimentar relatórios customizados com dados completos do Cloud Chat
- Você precisa rastrear eventos de entrega de campanhas e disparos proativos
Pré-requisitos
- API Key gerada por usuário administrador ou supervisor — ver Como encontrar sua API Key no Cloud Chat
- CLOUDCHAT_DOMAIN e ACCOUNT_ID
- Período de extração de no máximo 5 dias (120 horas) por requisição
:::warning Esta API é destinada exclusivamente para extração histórica em lote. Para consultas em tempo real ou ações em
tickets, use as outras APIs do Guia Mestre.
:::
Sobre este artigo
A Data Extract API permite exportar dados completos dos seus tickets diretamente da sua conta no Cloud Chat — datas,
status, responsáveis, tempos de resposta e muito mais. Ideal para relatórios personalizados e integrações externas.
Requisição base
curl --location 'https://{CLOUDCHAT_DOMAIN}/api/v2/accounts/{ACCOUNT_ID}/data_extracts?startDate=2025-03-27T01:58:59&endDate=2025-03-28T01:59:00&type=BASE_TICKET_METRICS' \
--header 'Accept: application/json' \
--header 'api_access_token: {API_TOKEN}'
Onde encontrar os parâmetros
- CLOUDCHAT_DOMAIN — parte da URL ao fazer login na sua conta
- ACCOUNT_ID — após o login, o ID aparece na URL como app/accounts/{id}/dashboard. Ex: em
cloudhumans.com/app/accounts/1/conversations/6341 o account_id é 1
- API_TOKEN — gere a partir de um perfil administrador ou supervisor (na configuração do perfil)
Parâmetros obrigatórios
- startDate — Data e hora de início (UTC) no formato yyyy-MM-ddTHH:mm:ss. Ex: 2025-03-27T01:58:59
- endDate — Data e hora de término (UTC). Deve ser posterior a startDate e o intervalo não pode ultrapassar 5 dias
(120 horas). Ex: 2025-03-28T01:59:00
- type — Tipo de dados a exportar (ver lista abaixo)
- account_id — ID da conta, informado no caminho da URL
Tipos disponíveis
- BASE_TICKET_METRICS
- TICKET_METRICS_WITH_AGENT_INFORMATION
- TICKET_SUMMARY
- CAMPAIGN_DELIVERY_EVENTS
- SINGLE_CONTACT_DELIVERY_EVENTS
Parâmetro opcional: rangeFilterProperty
Define qual campo de data é usado para aplicar os filtros de período.
| Valor | Comportamento | | --- | --- | | CREATED_AT (padrão) | Filtra pela data de criação | | UPDATED_AT | Filtra pela
data da última atualização |
Intervalo de datas
:::info Para garantir estabilidade e performance, o intervalo máximo permitido por requisição é de 5 dias.
Para exportar períodos maiores (ex: 30 dias), divida em múltiplas requisições — 6 chamadas consecutivas com janelas de 5
dias cobrem um mês inteiro.
:::
Limite de requisições (rate limit)
A Data Extract API aplica um limite de 20 requisições por minuto por token. Tokens distintos da mesma conta têm
orçamentos independentes.
O que acontece ao ultrapassar o limite
Requisições além do limite recebem HTTP 429 Too Many Requests:
{
"error": "Rate limit exceeded. Retry later.",
"retry_after": 42
}
Recomendações
:::warning
- Respeite o cabeçalho Retry-After antes de tentar novamente. Loops de retry sem backoff amplificam o bloqueio
- Para extrações grandes (ex: 30 dias), combine janelas de 5 dias com espaçamento entre requisições — 20/min é folgado
para o volume típico
- Se sua integração precisa de throughput maior de forma sustentada, acione o suporte
:::
1. BASE_TICKET_METRICS
Retorna dados básicos dos tickets. Campos retornados:
| Campo | Tipo | Descrição | Dado Possivelmente Sensível | | --- | --- | --- | --- | | ticketId | Inteiro | ID interno
do ticket | Não | | displayTicketId | Inteiro | ID exibido ao usuário no Cloud Chat — visível na URL e na busca por
filtros | Não | | inboxId | Inteiro | ID da caixa de entrada | Não | | accountId | Inteiro | ID da conta | Não | |
accountName | Texto | Nome da conta | Não | | ticketStatus | Texto | Status do ticket: open (Aberto), resolved
(Resolvido), pending (Pendente), snoozed (Adiado) | Não | | teamName | Texto | Nome do time responsável | Não | |
ticketPriorityName | Texto | Prioridade: low, medium, high, urgent | Não | | ticketType | Texto | Tipo do ticket
(primeira tag associada) | Não | | inboxName | Texto | Nome da caixa de entrada | Não | | ticketTitle | Texto | Título
do ticket — pode conter nome ou telefone do contato | Sim | | channel | Texto | Canal de comunicação (ex: Whatsapp) |
Não | | tags | Texto | Tags do ticket separadas por vírgula | Não | | createdAt | Timestamp | Data e hora de criação do
ticket | Não | | firstReplyAt | Timestamp | Data e hora da primeira resposta | Não | | firstReplyTime | Decimal | Tempo
até a primeira resposta (em minutos) | Não | | resolvedAt | Timestamp | Data e hora de resolução | Não | |
totalResolutionTimeMin | Decimal | Tempo total de resolução (em minutos) | Não | | agentId | Inteiro | ID do agente
responsável | Não | | ticketOwner | Texto | Nome do agente responsável | Sim | | ticketOwnerEmail | Texto | E-mail do
agente responsável | Sim | | contactId | Inteiro | ID do contato | Não | | contactName | Texto | Nome do contato | Sim |
| contactEmail | Texto | E-mail do contato | Sim | | contactPhone | Texto | Telefone do contato | Sim | | campaignId |
Inteiro | ID da campanha que originou o ticket, se aplicável | Não | | proactivelyInitiated | Booleano | Indica se o
ticket foi iniciado proativamente | Não |
:::warning Ao configurar fuso horário da conta (ex: GMT-3), os campos timestamp (createdAt, firstAgentAssignmentTime,
firstReplyAt, firstAgentFirstReplyTime, resolvedAt, firstReplyTime, firstReplierAgentAssignmentTime,
firstReplierAgentFirstReplyTime, repliedAt, readAt, receivedAt, sentAt) são retornados no fuso configurado. Sem fuso
configurado, os horários vêm em UTC.
Configuração: Configuração de fuso horário.
:::
Exemplo de resposta
[
{
"ticketId": 123456,
"displayTicketId": 7890,
"inboxId": 101,
"accountId": 42,
"accountName": "Minha Empresa",
"ticketStatus": "resolved",
"teamName": "Meu Time",
"ticketPriorityName": "High",
"ticketType": "suporte",
"inboxName": "WhatsApp",
"ticketTitle": "+5511999999999",
"channel": "Whatsapp",
"createdAt": "2025-03-27T09:53:14.791Z",
"firstReplyAt": "2025-03-27T10:09:29.225Z",
"firstReplyTime": 16.24,
"resolvedAt": "2025-03-27T13:20:15.830Z",
"totalResolutionTimeMin": 207.01,
"tags": "suporte,prioridade_alta",
"agentId": 42,
"ticketOwner": "ClaudIA",
"ticketOwnerEmail": "[email protected]",
"contactId": 998877,
"contactName": "Contact Name",
"contactEmail": "[email protected]",
"contactPhone": "+5511887774411",
"campaignId": 123,
"proactivelyInitiated": true
}
]
2. TICKET_METRICS_WITH_AGENT_INFORMATION
Inclui detalhes sobre o agente que respondeu e resolveu. Campos adicionais:
| Campo | Tipo | Descrição | Dado Possivelmente Sensível | | --- | --- | --- | --- | | ticketLink | Texto | URL direta
para o ticket no Cloud Chat | Não | | agentOnResolutionId | Inteiro | ID do agente humano que resolveu o ticket | Não |
| agentOnResolutionName | Texto | Nome do agente humano que resolveu | Sim | | agentOnResolutionEmail | Texto | E-mail
do agente humano que resolveu | Sim | | firstAgentReplyId | Inteiro | ID do primeiro agente humano que respondeu | Não |
| firstAgentReplyName | Texto | Nome do primeiro agente humano que respondeu | Sim | | firstAgentReplyEmail | Texto |
E-mail do primeiro agente humano que respondeu | Sim | | firstAgentAssignmentTime | Timestamp | Data e hora em que o
ticket foi atribuído ao primeiro agente | Não | | firstAgentFirstReplyTime | Timestamp | Data e hora da primeira
resposta do agente | Não | | firstReplierAgentAssignmentTime | Timestamp | Data e hora de atribuição do agente que
respondeu primeiro | Não | | firstReplierAgentFirstReplyTime | Timestamp | Timestamp da primeira resposta do agente que
respondeu primeiro | Não | | firstAgentReplyTimeMin | Decimal | Tempo entre atribuição e primeira resposta do agente
(min) | Não | | firstAgentResolutionTimeMin | Decimal | Tempo entre atribuição e resolução do ticket (min) | Não | |
csatScore | Numérico | Nota de satisfação (CSAT) atribuída pelo cliente | Não | | csatFeedback | Texto | Comentário
textual deixado pelo cliente na pesquisa CSAT | Sim | | contactCustomFields | JSON | Campos customizados do contato —
podem conter dados pessoais | Sim | | conversationCustomFields | JSON | Campos customizados da conversa — podem conter
dados pessoais | Sim | | conversationAdditionalFields | JSON | Metadados adicionais da conversa — podem conter dados
pessoais | Sim |
Exemplo de resposta
[
{
"ticketId": 11111,
"displayTicketId": 11111,
"accountName": "account name",
"inboxName": "WhatsApp",
"ticketLink": "https://cloudchat.cloudhumans.com/app/accounts/99999/conversations/11111",
"ticketStatus": "resolved",
"createdAt": "2025-03-27T13:00:40.897954",
"resolvedAt": "2025-03-27T15:38:02.743726",
"agentOnResolutionId": 225,
"agentOnResolutionName": "ClaudIA",
"agentOnResolutionEmail": "[email protected]",
"firstAgentReplyId": 111,
"firstAgentReplyName": "ClaudIA",
"firstAgentReplyEmail": "[email protected]",
"firstAgentAssignmentTime": "2025-03-27T13:16:13.001269",
"firstAgentFirstReplyTime": "2025-03-27T13:17:01.344971",
"firstAgentReplyTimeMin": 0.81,
"firstAgentResolutionTimeMin": 141.83,
"csatScore": null,
"csatFeedback": "",
"contactCustomFields": "{}",
"conversationCustomFields": "{}",
"conversationAdditionalFields": "{}"
}
]
:::info
- firstAgentReplyTimeMin — tempo entre firstAgentAssignmentTime e firstAgentFirstReplyTime
- firstAgentResolutionTimeMin — tempo entre firstAgentAssignmentTime e resolvedAt
:::
3. TICKET_SUMMARY
Retorna a transcrição completa da conversa do ticket. Campos retornados:
| Campo | Tipo | Descrição | Dado Possivelmente Sensível | | --- | --- | --- | --- | | ticketId | Inteiro | ID interno
do ticket | Não | | displayTicketId | Inteiro | ID exibido ao usuário no Cloud Chat — visível na URL e na busca por
filtros | Não | | ticketLink | Texto | URL direta para o ticket no Cloud Chat | Não | | summary | Texto | Transcrição
completa da conversa entre cliente e atendente | Sim |
[
{
"ticketId": 1111,
"displayTicketId": 1111,
"ticketLink": "https://cloudchat.cloudhumans.com/app/accounts/99999/conversations/1111",
"summary": "CONTATO: Oi\nUSUÁRIO: Olá!"
}
]
4. CAMPAIGN_DELIVERY_EVENTS
Retorna eventos de entrega de campanhas do WhatsApp, rastreando por contato e campanha o status das mensagens.
Campos retornados:
| Campo | Tipo | Descrição | Dado Possivelmente Sensível | | --- | --- | --- | --- | | id | Inteiro | ID único do evento
de entrega | Não | | campaignId | Inteiro | ID da campanha | Não | | campaignTitle | Texto | Título da campanha | Não |
| audience | Texto | Audiência/lista utilizada na campanha | Não | | contactId | Inteiro | ID do contato destinatário |
Não | | contactName | Texto | Nome do contato destinatário | Sim | | contactEmail | Texto | E-mail do contato
destinatário | Sim | | contactPhoneNumber | Texto | Telefone do contato destinatário | Sim | | ticketId | Inteiro | ID
do ticket gerado pelo disparo, se houver | Não | | displayTicketId | Texto | ID exibido ao usuário no Cloud Chat —
visível na URL e na busca por filtros | Não | | messageSent | Booleano | Flag que indica se a mensagem foi enviada à
API do WhatsApp (Meta) | Não | | sentAt | Timestamp | Data e hora do envio | Não | | messageReceived | Booleano | Flag
que indica se a mensagem foi entregue ao dispositivo do contato | Não | | receivedAt | Timestamp | Data e hora da
entrega | Não | | messageRead | Booleano | Flag que indica se a mensagem foi lida (depende das configurações de
privacidade do contato) | Não | | readAt | Timestamp | Data e hora da leitura | Não | | messageReplied | Booleano | Flag
que indica se a mensagem foi respondida | Não | | repliedAt | Timestamp | Data e hora da primeira resposta | Não | |
error | Texto | Erro de entrega: número inválido, sem WhatsApp, bloqueio, etc. | Não | | createdAt | Timestamp | Data e
hora de criação do registro | Não | | updatedAt | Timestamp | Data e hora da última atualização | Não |
Exemplo de resposta
[
{
"id": 103,
"campaignId": 5502,
"campaignTitle": "Natal 2025 - Promoção Especial",
"audience": "lista_fidelidade_natal",
"contactId": 9003,
"contactName": "Carla Souza",
"contactEmail": "[email protected]",
"contactPhoneNumber": "+55 31 99999-99999",
"ticketId": 78414,
"displayTicketId": "2027",
"messageSent": false,
"sentAt": null,
"messageReceived": false,
"receivedAt": null,
"messageRead": false,
"readAt": null,
"messageReplied": false,
"repliedAt": null,
"error": "Número de telefone inválido ou não registrado no WhatsApp",
"createdAt": "2025-12-10T09:00:00.000Z",
"updatedAt": "2025-12-10T09:00:00.000Z"
}
]
5. SINGLE_CONTACT_DELIVERY_EVENTS
Retorna eventos de entrega de mensagens proativas de disparo único (não campanhas). Campos retornados:
| Campo | Tipo | Descrição | Dado Possivelmente Sensível | | --- | --- | --- | --- | | id | Inteiro | ID único do evento
de entrega | Não | | contactId | Inteiro | ID do contato destinatário | Não | | contactName | Texto | Nome do contato
destinatário | Sim | | contactEmail | Texto | E-mail do contato destinatário | Sim | | contactPhoneNumber | Texto |
Telefone do contato destinatário | Sim | | ticketId | Inteiro | ID do ticket gerado pelo disparo, se houver | Não | |
displayTicketId | Texto | ID exibido ao usuário no Cloud Chat — visível na URL e na busca por filtros | Não | |
messageSent | Booleano | Flag que indica se a mensagem foi enviada à API do WhatsApp (Meta) | Não | | sentAt | Timestamp
| Data e hora do envio | Não | | messageReceived | Booleano | Flag que indica se a mensagem foi entregue ao dispositivo
do contato | Não | | receivedAt | Timestamp | Data e hora da entrega | Não | | messageRead | Booleano | Flag que indica
se a mensagem foi lida (depende das configurações de privacidade do contato) | Não | | readAt | Timestamp | Data e hora
da leitura | Não | | messageReplied | Booleano | Flag que indica se a mensagem foi respondida | Não | | repliedAt |
Timestamp | Data e hora da primeira resposta | Não | | error | Texto | Erro de entrega: número inválido, sem WhatsApp,
bloqueio, etc. | Não | | createdAt | Timestamp | Data e hora de criação do registro | Não | | updatedAt | Timestamp |
Data e hora da última atualização | Não |
Exemplo de resposta
[
{
"id": 321,
"contactId": 555777,
"contactName": "Maria Silva",
"contactEmail": "[email protected]",
"contactPhoneNumber": "+55 11 98888-7777",
"ticketId": 78414,
"displayTicketId": "2027",
"messageSent": true,
"sentAt": "2025-08-01T12:00:05.000Z",
"messageReceived": true,
"receivedAt": "2025-08-01T12:00:08.000Z",
"messageRead": true,
"readAt": "2025-08-01T12:01:30.000Z",
"messageReplied": false,
"repliedAt": null,
"error": null,
"createdAt": "2025-08-01T11:59:59.000Z",
"updatedAt": "2025-08-01T12:01:30.000Z"
}
]
Observações
- Para consultas em tempo real (não histórico): Como consultar contatos, tickets e mensagens em tempo real via API
- Para alterar dados de tickets via API: Como atualizar e agir em tickets via API
- Visão geral de todas as APIs disponíveis: Guia Mestre — Como acessar e operar dados do Cloud Chat via API