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 histórico sob demanda de um chat
Solicita ao WhatsApp um sync sob demanda de mensagens antigas de um chat, para trás a partir de uma mensagem de referência (âncora).
Para recuperar uma mensagem salva que não abriu (messageType: "error" no
/message/find), use POST /message/reload.
Regras:
- envie
number counté opcional e limitado a 100messageidé opcional; quando informado, a API usa essa mensagem como referência para buscar mensagens mais antigas do chat
Observação:
- Importante: a recuperação pode só acontecer depois de abrir o WhatsApp no celular ou deixá-lo ativo em segundo plano
messageiddefine a mensagem de referência para carregar histórico anterior; esse campo não serve para buscar essa mensagem específica- se você quiser recuperar apenas uma mensagem específica
Xvia histórico, informe comomessageida mensagem logo depois deXe usecount=1 - se
messageidnão for informado, a API usa a mensagem mais antiga conhecida localmente desse chat como referência para buscar histórico anterior - as mensagens retornam depois via webhook/SSE em eventos do tipo
historye também ficam disponíveis em/message/find
Resultado
A resposta traz o request_id do pedido. As mensagens chegam no webhook/SSE history com event: "messages" e o request_id em cada mensagem. Ele também vem no topo dos lotes messages e chats quando todo o lote pertence ao mesmo pedido; lotes mistos podem omiti-lo no topo. O pedido termina com um único lote event: "status" com o mesmo request_id:
status:completedquando o WhatsApp confirma a conclusão do pedido,timeoutquando não houve resposta conclusiva em 2 minutos,blockedquando o celular indica mais mensagens, mas não entregou uma página que avancesuccesseerror: só quando não há próxima página possível;success: falsee o motivo emerror(pagination_no_progress,anchor_unavailable,history_access_unavailableoucursor_lookup_failed). Sempre vêm comblockedhas_more: o que o celular declarou.truehá mais mensagens no celular,falsechegou ao início da conversa,nullnão foi confirmado. Alguns aparelhos declaramtrueem toda resposta sob demanda, inclusive na vazia: com eles, a paginação termina emblockedcompagination_no_progress, nunca emhas_more: falsehistory_access:unavailablequando há mais mensagens, mas o WhatsApp não dá acesso a elasnext_request: corpo pronto para pedir as mensagens anteriores; reenvie como veio.nullquando não há uma próxima requisição utilizável
Para paginar, reenvie next_request do resultado final até ele vir null, aguardando o resultado de cada pedido. completed encerra o pedido, não toda a conversa. next_request: null sem has_more: false não comprova o início da conversa. Silêncio ou um lote com menos mensagens que count não indicam o fim do histórico: só has_more: false indica.
Com blocked e error: "pagination_no_progress", encerre a paginação desse chat sem repetir o pedido automaticamente: é o fim do que o celular entrega a partir daquela âncora, e repetir dá o mesmo resultado.
Cada chat tem um pedido ativo por vez. Repetir o pedido com a mesma mensagem de referência antes do status devolve o mesmo request_id (details.reused: true), sem novo envio ao celular. Um pedido com outra referência encerra o anterior, que recebe o próprio status final (em geral timeout), e segue normalmente. 409 só ocorre quando o requestId informado já está em uso.
O resultado final chega por webhook/SSE em até 2 minutos após enviar o pedido ao WhatsApp (details.result_timeout_ms). Mensagens atrasadas podem continuar chegando com o mesmo request_id por cerca de 5 minutos após o pedido, sem um segundo status final.
Modo síncrono (sync: true)
sync: true segura a resposta até o resultado, por até timeoutMs (padrão e máximo 25000). As mensagens vêm em messages, e o topo da resposta traz os mesmos campos do status final (status, has_more, history_access, received_messages, next_request), além de received, timed_out e partial:
- resultado final dentro do prazo:
200com esse resultado; - chegaram mensagens, mas não o resultado:
200comstatus: "pending", cerca de 2 segundos depois da última mensagem; - nada chegou no prazo:
202comstatus: "pending",timed_out: trueemessagesvazio.
Com status: "pending", o resultado final chega depois pelo webhook/SSE history, com o mesmo request_id. O webhook e o SSE são enviados também no modo síncrono, e as mensagens são salvas do mesmo jeito.
Mensagem de referência apagada
Se a âncora foi apagada, a API tenta usar a próxima mensagem válida desse chat. details.requested_anchor_messageid informa a referência solicitada, details.anchor_messageid a usada e details.anchor_replaced indica a substituição. Sem alternativa, retorna HTTP 400 com status: "anchor_unavailable"; tente sem messageid para usar a mensagem mais antiga salva.
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
}
}Autorizações
Corpo
JID completo do chat.
"5511999999999@s.whatsapp.net"
ID da mensagem de referência usada para buscar mensagens mais antigas do chat.
"3EB01234567890ABCDEF"
Quantidade desejada de mensagens no sync.
1 <= x <= 10020
Timestamp da mensagem de referência, em milissegundos ou segundos. Opcional; vem no next_request para a referência funcionar mesmo antes de a mensagem estar salva.
1706350400000
Indica se a mensagem de referência foi enviada pela conta conectada. Opcional; vem no next_request.
false
Identificador opcional escolhido pelo cliente; quando omitido, a API gera um UUID. Retorna como request_id. Use um id novo por pedido: um id já em uso recebe 409.
"5f0c2a8e-6d1b-4c3a-9e7f-1a2b3c4d5e6f"
Para onde o pedido é enviado. try_alternates (padrão): em conversa individual, envia pelo número e pelo LID do chat, porque o celular guarda cada conversa por um dos dois endereços e ignora o pedido enviado pelo outro; a resposta chega uma vez só. exact: envia só pelo endereço preferido do chat (o LID, quando conhecido). Em grupos, o pedido vai sempre só para o grupo.
try_alternates, exact Segura a resposta até o resultado do pedido, por até timeoutMs. Veja "Modo síncrono".
Só com sync: true: espera máxima em milissegundos. Valores maiores viram 25000.
x <= 25000Resposta
Solicitação enviada com sucesso. As mensagens e o resultado chegam depois por webhook/SSE. Com sync: true, traz também as mensagens e o resultado do pedido.
true
Identifica o pedido. Aparece nas mensagens correlacionadas e no status final do webhook/SSE history.
"5f0c2a8e-6d1b-4c3a-9e7f-1a2b3c4d5e6f"
"History sync request sent. Messages will be received as history sync events."
Metadados adicionais da operação
Show child attributes
Show child attributes
true quando a resposta esperou o resultado (sync: true).
Só no modo síncrono: resultado do pedido; pending quando ainda não chegou e virá pelo webhook/SSE; blocked quando o celular indica mais mensagens, mas não entregou uma página que avance (o motivo vem em error).
completed, timeout, pending, blocked Só no modo síncrono: chat do pedido.
Só no modo síncrono: o que o celular declarou. true há mais mensagens, false início da conversa, null não confirmado. Alguns aparelhos declaram true em toda resposta sob demanda, inclusive na vazia: com eles, a paginação termina em blocked com pagination_no_progress, nunca em has_more: false.
Só no modo síncrono: unavailable quando há mais mensagens sem acesso.
available, unavailable, unknown Só no modo síncrono: quantidade de mensagens em messages.
Só no modo síncrono: corpo pronto para pedir as mensagens anteriores, ou null.
Só no modo síncrono: chegaram mensagens ou o pedido foi concluído.
Só no modo síncrono: o prazo de timeoutMs acabou.
Só no modo síncrono: ainda pode haver mais mensagens (has_more diferente de false).
Só no modo síncrono: mensagens do pedido, no formato do evento history.
Com status: "blocked" (e success: false): por que não há next_request. pagination_no_progress: a partir da mesma âncora, o celular não entregou uma página que avance nem no maior count (a cada página sem avanço, o next_request dobra o count, até 100): veio vazia, sem mensagem que sirva de âncora ou repetida. É o fim do que o celular entrega a partir dessa âncora, mas o WhatsApp não confirma que é o início da conversa; repetir o pedido dá o mesmo resultado; anchor_unavailable: a mensagem de referência não está mais disponível, peça com outra; history_access_unavailable: o restante não está acessível; cursor_lookup_failed: falha ao montar o próximo pedido, tente de novo.
pagination_no_progress, anchor_unavailable, history_access_unavailable, cursor_lookup_failed 