curl --request POST \
--url https://api.wppfy.com/message/history-sync \
--header 'Content-Type: application/json' \
--header 'token: <api-key>' \
--data '
{
"number": "5511999999999@s.whatsapp.net",
"messageid": "3EB01234567890ABCDEF",
"count": 20
}
'{
"success": true,
"request_id": "5f0c2a8e-6d1b-4c3a-9e7f-1a2b3c4d5e6f",
"message": "History sync request sent. Messages will be received as history sync events.",
"details": {
"result_timeout_ms": 120000,
"requested_anchor_messageid": "3EB01234567890ABCDEF",
"anchor_messageid": "3EB01234567890ABCDEF",
"anchor_replaced": false
}
}Solicitar historial bajo demanda de un chat
Solicita a WhatsApp una sincronización bajo demanda de mensajes antiguos de un chat, hacia atrás a partir de un mensaje de referencia (ancla).
Para recuperar un mensaje guardado que no se abrió (messageType: "error" en
/message/find), use POST /message/reload.
Reglas:
- enviar
number countes opcional y está limitado a 100messageides opcional; cuando se indica, la API usa ese mensaje como referencia para buscar mensajes más antiguos del chat
Observación:
- Importante: la recuperación puede ocurrir solo después de abrir WhatsApp en el celular o dejarlo activo en segundo plano
messageiddefine el mensaje de referencia para cargar el historial anterior; este campo no sirve para buscar ese mensaje específico- si desea recuperar solo un mensaje específico
Xmediante el historial, indique comomessageidel mensaje inmediatamente posterior aXy usecount=1 - si no se indica
messageid, la API usa el mensaje más antiguo conocido localmente de ese chat como referencia para buscar el historial anterior - los mensajes se devuelven después vía webhook/SSE en eventos del tipo
historyy también quedan disponibles en/message/find
Resultado
La respuesta trae el request_id de la solicitud. Los mensajes llegan en el webhook/SSE history con event: "messages" y el request_id en cada mensaje. También viene en el nivel superior de los lotes messages y chats cuando todo el lote pertenece a la misma solicitud; los lotes mixtos pueden omitirlo en el nivel superior. La solicitud termina con un único lote event: "status" con el mismo request_id:
status:completedcuando WhatsApp confirma la conclusión de la solicitud,timeoutcuando no hubo respuesta concluyente en 2 minutos,blockedcuando el celular indica más mensajes, pero no entregó una página que avancesuccessyerror: solo cuando no hay próxima página posible;success: falsey el motivo enerror(pagination_no_progress,anchor_unavailable,history_access_unavailableocursor_lookup_failed). Siempre vienen conblockedhas_more: lo que declaró el celular.truehay más mensajes en el celular,falsese llegó al inicio de la conversación,nullno se confirmó. Algunos dispositivos declarantrueen toda respuesta bajo demanda, incluso en la vacía: con ellos, la paginación termina enblockedconpagination_no_progress, nunca enhas_more: falsehistory_access:unavailablecuando hay más mensajes, pero WhatsApp no da acceso a ellosnext_request: cuerpo listo para solicitar los mensajes anteriores; reenvíelo tal como vino.nullcuando no hay una próxima solicitud utilizable
Para paginar, reenvíe next_request del resultado final hasta que venga null, esperando el resultado de cada solicitud. completed finaliza la solicitud, no toda la conversación. next_request: null sin has_more: false no comprueba el inicio de la conversación. El silencio o un lote con menos mensajes que count no indican el fin del historial: solo has_more: false lo indica.
Con blocked y error: "pagination_no_progress", finalice la paginación de ese chat sin repetir la solicitud automáticamente: es el fin de lo que el celular entrega a partir de esa ancla, y repetirla da el mismo resultado.
Cada chat tiene una solicitud activa a la vez. Repetir la solicitud con el mismo mensaje de referencia antes del status devuelve el mismo request_id (details.reused: true), sin un nuevo envío al celular. Una solicitud con otra referencia finaliza la anterior, que recibe su propio status final (en general timeout), y continúa normalmente. 409 solo ocurre cuando el requestId indicado ya está en uso.
El resultado final llega por webhook/SSE en hasta 2 minutos después de enviar la solicitud a WhatsApp (details.result_timeout_ms). Los mensajes atrasados pueden seguir llegando con el mismo request_id durante unos 5 minutos después de la solicitud, sin un segundo status final.
Modo síncrono (sync: true)
sync: true retiene la respuesta hasta el resultado, por hasta timeoutMs (predeterminado y máximo 25000). Los mensajes vienen en messages, y el nivel superior de la respuesta trae los mismos campos del status final (status, has_more, history_access, received_messages, next_request), además de received, timed_out y partial:
- resultado final dentro del plazo:
200con ese resultado; - llegaron mensajes, pero no el resultado:
200constatus: "pending", unos 2 segundos después del último mensaje; - no llegó nada en el plazo:
202constatus: "pending",timed_out: trueymessagesvacío.
Con status: "pending", el resultado final llega después por el webhook/SSE history, con el mismo request_id. El webhook y el SSE también se envían en el modo síncrono, y los mensajes se guardan de la misma manera.
Mensaje de referencia eliminado
Si el ancla fue eliminada, la API intenta usar el siguiente mensaje válido de ese chat. details.requested_anchor_messageid informa la referencia solicitada, details.anchor_messageid la utilizada y details.anchor_replaced indica la sustitución. Sin alternativa, devuelve HTTP 400 con status: "anchor_unavailable"; intente sin messageid para usar el mensaje más antiguo guardado.
curl --request POST \
--url https://api.wppfy.com/message/history-sync \
--header 'Content-Type: application/json' \
--header 'token: <api-key>' \
--data '
{
"number": "5511999999999@s.whatsapp.net",
"messageid": "3EB01234567890ABCDEF",
"count": 20
}
'{
"success": true,
"request_id": "5f0c2a8e-6d1b-4c3a-9e7f-1a2b3c4d5e6f",
"message": "History sync request sent. Messages will be received as history sync events.",
"details": {
"result_timeout_ms": 120000,
"requested_anchor_messageid": "3EB01234567890ABCDEF",
"anchor_messageid": "3EB01234567890ABCDEF",
"anchor_replaced": false
}
}Autorizaciones
Cuerpo
JID completo del chat.
"5511999999999@s.whatsapp.net"
ID del mensaje de referencia usado para buscar mensajes más antiguos del chat.
"3EB01234567890ABCDEF"
Cantidad deseada de mensajes en el sync.
1 <= x <= 10020
Timestamp del mensaje de referencia, en milisegundos o segundos. Opcional; viene en next_request para que la referencia funcione incluso antes de que el mensaje esté guardado.
1706350400000
Indica si el mensaje de referencia fue enviado por la cuenta conectada. Opcional; viene en next_request.
false
Identificador opcional elegido por el cliente; si se omite, la API genera un UUID. Se devuelve como request_id. Use un id nuevo por solicitud: un id ya en uso recibe 409.
"5f0c2a8e-6d1b-4c3a-9e7f-1a2b3c4d5e6f"
A dónde se envía la solicitud. try_alternates (predeterminado): en una conversación individual, envía por el número y por el LID del chat, porque el teléfono guarda cada conversación con una de las dos direcciones e ignora la solicitud enviada por la otra; la respuesta llega una sola vez. exact: envía solo por la dirección preferida del chat (el LID, cuando se conoce). En grupos, la solicitud siempre va solo al grupo.
try_alternates, exact Retiene la respuesta hasta el resultado de la solicitud, por hasta timeoutMs. Vea "Modo síncrono".
Solo con sync: true: espera máxima en milisegundos. Los valores mayores se convierten en 25000.
x <= 25000Respuesta
Solicitud enviada con éxito. Los mensajes y el resultado llegan después por webhook/SSE. Con sync: true, también incluye los mensajes y el resultado de la solicitud.
true
Identifica la solicitud. Aparece en los mensajes correlacionados y en el estado final del webhook/SSE history.
"5f0c2a8e-6d1b-4c3a-9e7f-1a2b3c4d5e6f"
"Solicitud de sincronización del historial enviada. Los mensajes se recibirán como eventos de sincronización del historial."
Metadatos adicionales de la operación
Show child attributes
Show child attributes
true cuando la respuesta esperó el resultado (sync: true).
Solo en modo síncrono: resultado de la solicitud; pending cuando aún no llegó y llegará por webhook/SSE; blocked cuando el celular indica más mensajes, pero no entregó una página que avance (el motivo viene en error).
completed, timeout, pending, blocked Solo en modo síncrono: chat de la solicitud.
Solo en modo síncrono: lo que declaró el celular. true hay más mensajes, false inicio de la conversación, null no confirmado. Algunos dispositivos declaran true en toda respuesta bajo demanda, incluso en la vacía: con ellos, la paginación termina en blocked con pagination_no_progress, nunca en has_more: false.
Solo en modo síncrono: unavailable cuando hay más mensajes sin acceso.
available, unavailable, unknown Solo en modo síncrono: cantidad de mensajes en messages.
Solo en modo síncrono: cuerpo listo para solicitar los mensajes anteriores, o null.
Solo en modo síncrono: llegaron mensajes o la solicitud se completó.
Solo en modo síncrono: el plazo de timeoutMs se agotó.
Solo en modo síncrono: aún puede haber más mensajes (has_more distinto de false).
Solo en modo síncrono: mensajes de la solicitud, en el formato del evento history.
Con status: "blocked" (y success: false): por qué no hay next_request. pagination_no_progress: a partir del mismo ancla, el celular no entregó una página que avance ni siquiera con el mayor count (en cada página sin avance, el next_request duplica el count, hasta 100): llegó vacía, sin un mensaje que sirva de ancla o repetida. Es el final de lo que el celular entrega a partir de ese ancla, pero WhatsApp no confirma que sea el inicio de la conversación; repetir la solicitud da el mismo resultado; anchor_unavailable: el mensaje de referencia ya no está disponible, solicite con otro; history_access_unavailable: el resto no está accesible; cursor_lookup_failed: falla al construir la siguiente solicitud, intente de nuevo.
pagination_no_progress, anchor_unavailable, history_access_unavailable, cursor_lookup_failed 