Cómo extraer datos por lotes vía API (Data Extract API)
:::warning Aviso importante: esta API no seguirá evolucionando. La forma recomendada hoy para la extracción masiva de
datos es la nueva documentación: CloudHumans Data Export.
:::
Cuándo usarla
- Necesitas exportar datos históricos de tickets para BI, auditoría o un dashboard externo
- Quieres alimentar informes personalizados con datos completos de Cloud Chat
- Necesitas rastrear eventos de entrega de campañas y envíos proactivos
Requisitos previos
- API Key generada por un usuario administrador o supervisor — ver Cómo obtener tu API Key en Cloud Chat
- CLOUDCHAT_DOMAIN y ACCOUNT_ID
- Período de extracción de máximo 5 días (120 horas) por solicitud
:::warning Esta API está destinada exclusivamente a la extracción histórica por lotes. Para consultas en tiempo real o
acciones sobre tickets, usa las otras APIs de la Guía Maestra.
:::
Sobre este artículo
La Data Extract API permite exportar datos completos de tus tickets directamente desde tu cuenta en Cloud Chat — fechas,
estados, responsables, tiempos de respuesta y mucho más. Ideal para informes personalizados e integraciones externas.
Solicitud 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}'
Dónde encontrar los parámetros
- CLOUDCHAT_DOMAIN — parte de la URL al iniciar sesión en tu cuenta
- ACCOUNT_ID — después de iniciar sesión, el ID aparece en la URL como app/accounts/{id}/dashboard. Ej.: en
cloudhumans.com/app/accounts/1/conversations/6341 el account_id es 1
- API_TOKEN — genéralo desde un perfil administrador o supervisor (en "Configurações do perfil" (Configuración del
perfil), en tu propio entorno — usa el dominio de tu cuenta, ej.:
https://TU-DOMINIO.cloudhumans.com/app/accounts/{ACCOUNT_ID}/profile/settings. El dominio varía según la instancia:
cloudchat, cloudchat2, cloudchat3…)
Parámetros obligatorios
- startDate — Fecha y hora de inicio (UTC) en el formato yyyy-MM-ddTHH:mm:ss. Ej.: 2025-03-27T01:58:59
- endDate — Fecha y hora de término (UTC). Debe ser posterior a startDate y el intervalo no puede superar 5 días (120
horas). Ej.: 2025-03-28T01:59:00
- type — Tipo de datos a exportar (ver la lista abajo)
- account_id — ID de la cuenta, indicado en la ruta de la URL
Tipos disponibles
- BASE_TICKET_METRICS
- TICKET_METRICS_WITH_AGENT_INFORMATION
- TICKET_SUMMARY
- CAMPAIGN_DELIVERY_EVENTS
- SINGLE_CONTACT_DELIVERY_EVENTS
Parámetro opcional: rangeFilterProperty
Define qué campo de fecha se usa para aplicar los filtros de período.
| Valor | Comportamiento | | --- | --- | | CREATED_AT (predeterminado) | Filtra por la fecha de creación | | UPDATED_AT
| Filtra por la fecha de la última actualización |
Intervalo de fechas
:::info Para garantizar estabilidad y rendimiento, el intervalo máximo permitido por solicitud es de 5 días.
Para exportar períodos mayores (ej.: 30 días), divídelo en varias solicitudes — 6 llamadas consecutivas con ventanas
de 5 días cubren un mes entero.
:::
Límite de solicitudes (rate limit)
La Data Extract API aplica un límite de 20 solicitudes por minuto por token. Tokens distintos de la misma cuenta tienen
presupuestos independientes.
Qué pasa al superar el límite
Las solicitudes que superan el límite reciben HTTP 429 Too Many Requests:
{
"error": "Rate limit exceeded. Retry later.",
"retry_after": 42
}
Recomendaciones
:::warning
- Respeta el encabezado Retry-After antes de intentar de nuevo. Los bucles de reintento sin backoff amplifican el
bloqueo
- Para extracciones grandes (ej.: 30 días), combina ventanas de 5 días con espaciado entre solicitudes — 20/min es
holgado para el volumen típico
- Si tu integración necesita mayor throughput de forma sostenida, contacta al soporte
:::
1. BASE_TICKET_METRICS
Devuelve datos básicos de los tickets. Campos devueltos:
| Campo | Tipo | Descripción | Dato Posiblemente Sensible | | --- | --- | --- | --- | | ticketId | Entero | ID interno
del ticket | No | | displayTicketId | Entero | ID mostrado al usuario en Cloud Chat — visible en la URL y en la búsqueda
por filtros | No | | inboxId | Entero | ID de la bandeja de entrada | No | | accountId | Entero | ID de la cuenta | No |
| accountName | Texto | Nombre de la cuenta | No | | ticketStatus | Texto | Estado del ticket: open (Abierto), resolved
(Resuelto), pending (Pendiente), snoozed (Aplazado) | No | | teamName | Texto | Nombre del equipo responsable | No | |
ticketPriorityName | Texto | Prioridad: low, medium, high, urgent | No | | ticketType | Texto | Tipo del ticket (primera
etiqueta asociada) | No | | inboxName | Texto | Nombre de la bandeja de entrada | No | | ticketTitle | Texto | Título
del ticket — puede contener el nombre o el teléfono del contacto | Sí | | channel | Texto | Canal de comunicación (ej.:
Whatsapp) | No | | tags | Texto | Etiquetas del ticket separadas por comas | No | | createdAt | Timestamp | Fecha y hora
de creación del ticket | No | | firstReplyAt | Timestamp | Fecha y hora de la primera respuesta | No | | firstReplyTime
| Decimal | Tiempo hasta la primera respuesta (en minutos) | No | | resolvedAt | Timestamp | Fecha y hora de resolución
| No | | totalResolutionTimeMin | Decimal | Tiempo total de resolución (en minutos) | No | | agentId | Entero | ID del
agente responsable | No | | ticketOwner | Texto | Nombre del agente responsable | Sí | | ticketOwnerEmail | Texto |
Correo electrónico del agente responsable | Sí | | contactId | Entero | ID del contacto | No | | contactName | Texto |
Nombre del contacto | Sí | | contactEmail | Texto | Correo electrónico del contacto | Sí | | contactPhone | Texto |
Teléfono del contacto | Sí | | campaignId | Entero | ID de la campaña que originó el ticket, si aplica | No | |
proactivelyInitiated | Booleano | Indica si el ticket se inició de forma proactiva | No |
:::warning Al configurar la zona horaria de la cuenta (ej.: GMT-3), los campos de tipo timestamp (createdAt,
firstAgentAssignmentTime, firstReplyAt, firstAgentFirstReplyTime, resolvedAt, firstReplyTime,
firstReplierAgentAssignmentTime, firstReplierAgentFirstReplyTime, repliedAt, readAt, receivedAt, sentAt) se devuelven en
la zona configurada. Sin zona horaria configurada, los horarios vienen en UTC.
Configuración: Configuración de zona horaria.
:::
Ejemplo de respuesta
[
{
"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
Incluye detalles sobre el agente que respondió y resolvió. Campos adicionales:
| Campo | Tipo | Descripción | Dato Posiblemente Sensible | | --- | --- | --- | --- | | ticketLink | Texto | URL directa
al ticket en Cloud Chat | No | | agentOnResolutionId | Entero | ID del agente humano que resolvió el ticket | No | |
agentOnResolutionName | Texto | Nombre del agente humano que lo resolvió | Sí | | agentOnResolutionEmail | Texto |
Correo electrónico del agente humano que lo resolvió | Sí | | firstAgentReplyId | Entero | ID del primer agente humano
que respondió | No | | firstAgentReplyName | Texto | Nombre del primer agente humano que respondió | Sí | |
firstAgentReplyEmail | Texto | Correo electrónico del primer agente humano que respondió | Sí | |
firstAgentAssignmentTime | Timestamp | Fecha y hora en que el ticket fue asignado al primer agente | No | |
firstAgentFirstReplyTime | Timestamp | Fecha y hora de la primera respuesta del agente | No | |
firstReplierAgentAssignmentTime | Timestamp | Fecha y hora de asignación del agente que respondió primero | No | |
firstReplierAgentFirstReplyTime | Timestamp | Timestamp de la primera respuesta del agente que respondió primero | No |
| firstAgentReplyTimeMin | Decimal | Tiempo entre la asignación y la primera respuesta del agente (min) | No | |
firstAgentResolutionTimeMin | Decimal | Tiempo entre la asignación y la resolución del ticket (min) | No | | csatScore |
Numérico | Nota de satisfacción (CSAT) otorgada por el cliente | No | | csatFeedback | Texto | Comentario textual dejado
por el cliente en la encuesta CSAT | Sí | | contactCustomFields | JSON | Campos personalizados del contacto — pueden
contener datos personales | Sí | | conversationCustomFields | JSON | Campos personalizados de la conversación — pueden
contener datos personales | Sí | | conversationAdditionalFields | JSON | Metadatos adicionales de la conversación —
pueden contener datos personales | Sí |
Ejemplo de respuesta
[
{
"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 — tiempo entre firstAgentAssignmentTime y firstAgentFirstReplyTime
- firstAgentResolutionTimeMin — tiempo entre firstAgentAssignmentTime y resolvedAt
:::
3. TICKET_SUMMARY
Devuelve un resumen de la conversación del ticket. Campos devueltos:
| Campo | Tipo | Descripción | Dato Posiblemente Sensible | | --- | --- | --- | --- | | ticketId | Entero | ID interno
del ticket | No | | displayTicketId | Entero | ID mostrado al usuario en Cloud Chat — visible en la URL y en la búsqueda
por filtros | No | | ticketLink | Texto | URL directa al ticket en Cloud Chat | No | | summary | Texto | Resumen de la
conversación entre el cliente y el agente — puede venir truncado en conversaciones largas | Sí |
[
{
"ticketId": 1111,
"displayTicketId": 1111,
"ticketLink": "https://cloudchat.cloudhumans.com/app/accounts/99999/conversations/1111",
"summary": "CONTATO: Oi\nUSUÁRIO: Olá!"
}
]
:::warning El campo summary no garantiza la transcripción íntegra de la conversación: consolida fragmentos y, en
conversaciones largas, el contenido puede venir cortado. Si necesitas el historial completo, usa el envío de la
transcripción por correo electrónico desde la propia conversación, en lugar de la API.
:::
4. CAMPAIGN_DELIVERY_EVENTS
Devuelve eventos de entrega de campañas de WhatsApp, rastreando por contacto y campaña el estado de los mensajes.
Campos devueltos:
| Campo | Tipo | Descripción | Dato Posiblemente Sensible | | --- | --- | --- | --- | | id | Entero | ID único del
evento de entrega | No | | campaignId | Entero | ID de la campaña | No | | campaignTitle | Texto | Título de la campaña
| No | | audience | Texto | Audiencia/lista utilizada en la campaña | No | | contactId | Entero | ID del contacto
destinatario | No | | contactName | Texto | Nombre del contacto destinatario | Sí | | contactEmail | Texto | Correo
electrónico del contacto destinatario | Sí | | contactPhoneNumber | Texto | Teléfono del contacto destinatario | Sí | |
ticketId | Entero | ID del ticket generado por el envío, si lo hay | No | | displayTicketId | Texto | ID mostrado al
usuario en Cloud Chat — visible en la URL y en la búsqueda por filtros | No | | messageSent | Booleano | Flag que indica
si el mensaje fue enviado a la API de WhatsApp (Meta) | No | | sentAt | Timestamp | Fecha y hora del envío | No | |
messageReceived | Booleano | Flag que indica si el mensaje fue entregado al dispositivo del contacto | No | | receivedAt
| Timestamp | Fecha y hora de la entrega | No | | messageRead | Booleano | Flag que indica si el mensaje fue leído
(depende de la configuración de privacidad del contacto) | No | | readAt | Timestamp | Fecha y hora de la lectura | No |
| messageReplied | Booleano | Flag que indica si el mensaje fue respondido | No | | repliedAt | Timestamp | Fecha y hora
de la primera respuesta | No | | error | Texto | Error de entrega: número inválido, sin WhatsApp, bloqueo, etc. | No | |
createdAt | Timestamp | Fecha y hora de creación del registro | No | | updatedAt | Timestamp | Fecha y hora de la última
actualización | No |
Ejemplo de respuesta
[
{
"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
Devuelve eventos de entrega de mensajes proactivos de envío único (no campañas). Campos devueltos:
| Campo | Tipo | Descripción | Dato Posiblemente Sensible | | --- | --- | --- | --- | | id | Entero | ID único del
evento de entrega | No | | contactId | Entero | ID del contacto destinatario | No | | contactName | Texto | Nombre del
contacto destinatario | Sí | | contactEmail | Texto | Correo electrónico del contacto destinatario | Sí | |
contactPhoneNumber | Texto | Teléfono del contacto destinatario | Sí | | ticketId | Entero | ID del ticket generado por
el envío, si lo hay | No | | displayTicketId | Texto | ID mostrado al usuario en Cloud Chat — visible en la URL y en la
búsqueda por filtros | No | | messageSent | Booleano | Flag que indica si el mensaje fue enviado a la API de WhatsApp
(Meta) | No | | sentAt | Timestamp | Fecha y hora del envío | No | | messageReceived | Booleano | Flag que indica si el
mensaje fue entregado al dispositivo del contacto | No | | receivedAt | Timestamp | Fecha y hora de la entrega | No | |
messageRead | Booleano | Flag que indica si el mensaje fue leído (depende de la configuración de privacidad del
contacto) | No | | readAt | Timestamp | Fecha y hora de la lectura | No | | messageReplied | Booleano | Flag que indica
si el mensaje fue respondido | No | | repliedAt | Timestamp | Fecha y hora de la primera respuesta | No | | error |
Texto | Error de entrega: número inválido, sin WhatsApp, bloqueo, etc. | No | | createdAt | Timestamp | Fecha y hora de
creación del registro | No | | updatedAt | Timestamp | Fecha y hora de la última actualización | No |
Ejemplo de respuesta
[
{
"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"
}
]
Paso a paso práctico
1. Genera tu API Key en un perfil administrador o supervisor ("Configurações do perfil" (Configuración del perfil) →
consulta "Cómo obtener tu API Key").
2. Elige dónde ejecutarla: es una llamada HTTP GET — usa un cliente de API (Postman, Insomnia) o la terminal con curl.
No hace falta programar.
3. Arma la URL reemplazando los campos entre {}:
https://{TU_DOMINIO}/api/v2/accounts/{ACCOUNT_ID}/data_extracts?startDate=2025-03-27T00:00:00&endDate=2025-03-27T23:59:59&type=TICKET_METRICS_WITH_AGENT_INFORMATION
4. Agrega el encabezado de autenticación (obligatorio — sin él devuelve 401): api_access_token: {TU_API_KEY}
5. Envía la solicitud (botón Send en Postman, o ejecuta el curl).
6. Lee el resultado: llega un JSON con la lista de tickets; cada campo está descrito en las tablas de tipos de este
artículo.
Observaciones
- Para consultas en tiempo real (no histórico): Cómo consultar contactos, tickets y mensajes en tiempo real vía API
- Para modificar datos de tickets vía API: Cómo actualizar y actuar en tickets vía API
- Visión general de todas las APIs disponibles: Guía Maestra — Cómo acceder y operar datos de Cloud Chat vía API