Wow! Redução de 65% no preço para clientes brasileiros! Registre-se agora
Check-in remoto de hotel · caso de uso da WhatsApp API

Responda com um código da porta no WhatsApp após o envio do documento de identidade

Os hóspedes concluem o check-in remoto quando o código de acesso à porta chega no mesmo chat depois de enviarem o passaporte ou o documento de identidade. Quando esse documento chega ao canal do hotel, o seu backend pode recuperar o ficheiro, aceitá-lo face à reserva e enviar o código como texto de chat normal através do Whapi.Cloud. Este caso mostra aos integradores como implementar esse fluxo com a WhatsApp API.

Disparado por documento de entrada em messages.post Código da porta enviado como texto de chat ao hóspede
Portátil de hotel com um registo de reserva ao lado de um telemóvel com chat WhatsApp onde o documento de passaporte do hóspede aparece acima da resposta com o código de acesso à porta.
Caso de utilização

Quando usar este fluxo

O passaporte ou o ID chega como documento do WhatsApp

Use este fluxo quando um hóspede com reserva envia o scan ou a foto como documento de entrada no canal da propriedade, e não quando a equipa ainda recolhe papel na receção para cada chegada.

O código da porta deve esperar a aceitação do documento

Use este fluxo quando o seu backend deve gerar e enviar o código de acesso só depois de recuperar o ficheiro e o associar à reserva — não um código enviado antes de aceitar a identidade.

Chegadas tardias ou sem atendimento ainda precisam de acesso

Use este fluxo quando a propriedade deve libertar um código da porta no chat para check-in fora de horas ou remoto sem manter uma receção completa online para cada chegada.

Chat de WhatsApp num telemóvel a mostrar o documento de passaporte do hóspede acima de uma resposta com o código de acesso à porta do hotel.
Experiência do cliente

O hóspede recebe o código da porta no chat

Antes da automatização, o hóspede espera à porta ou escreve à receção enquanto alguém encontra a reserva, verifica o passaporte e escreve um código de acesso à mão — muitas vezes fora de horas.

Depois de o fluxo correr, o hóspede vê o código de acesso à porta no mesmo chat de WhatsApp onde enviou o documento de identidade. Os integradores constroem este resultado com a WhatsApp API.

Fluxo

Do documento de identidade ao código da porta

1

Documento de entrada do hóspede

O canal publica um webhook messages.post com type document (passaporte ou ID). O payload traz document.id como MediaID, um document.link opcional quando o Auto Download está ativo, e o from / chat_id do hóspede. O Whapi.Cloud não executa a lógica de reserva nem da fechadura.

2

Recupere o ficheiro de identidade enviado

GET /media/{MediaID}

getMedia descarrega o ficheiro do armazenamento na cloud por MediaID para que o seu backend o possa aceitar face à reserva. Se o Auto Download já expôs um link utilizável, pode obter esse URL em vez disso, mas este trabalho continua a nomear o passo de recuperação por MediaID.

3

Envie o código de acesso à porta

POST /messages/text

Depois de own_backend aceitar o documento e gerar o código, sendMessageText publica esse código como texto normal para o telefone ou chat id do hóspede.

Precisa de acompanhamento de entrega? Uma resposta de envio bem-sucedida não prova que o hóspede já tem o código da porta. Acompanhe os acks posteriores nos webhooks de entrega. Saiba mais sobre o estado de entrega →

Pré-requisitos

Antes de executar o fluxo

Ligue o número de WhatsApp que os hóspedes usam para documentos de check-in e autentique cada pedido com o token de API desse número. O emparelhamento de reservas, a geração do código da porta e os alertas à receção ficam no seu backend.

Opcional — aprofunde este fluxo

  • Formatos de payload de webhooks de entrada: Ver os formatos
  • Resumo do envio de mensagens de texto e media: Abrir o guia
  • Modelo evento → reação para webhook de entrada e envio REST de saída: Ler o artigo
Implementação da API

As chamadas que recuperam media e enviam o código

O seu webhook já nomeou o hóspede e o MediaID do documento. Estas chamadas recuperam esse ficheiro e depois entregam o código de acesso à porta que o seu backend gerou após a aceitação.

Obtenha o seu token de API gratuitamente depois de se registar em whapi.cloud e use-o no código em vez de Your_Token dos exemplos.

Recupere o ficheiro de identidade enviado

Descarregue o ficheiro de passaporte ou ID do hóspede por MediaID a partir do webhook do documento de entrada para que own_backend o possa aceitar.

curl --request GET \
     --url https://gate.whapi.cloud/media/{MediaID} \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/media/{MediaID}",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token"
  ],
]);

$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests

url = "https://gate.whapi.cloud/media/{MediaID}"
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token"
}

response = requests.get(url, headers=headers)
print(response.content)
const response = await fetch('https://gate.whapi.cloud/media/{MediaID}', {
  method: 'GET',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
  },
});

console.log(await response.arrayBuffer());
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/media/{MediaID}")
  .get()
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/media/{MediaID}");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
var response = await client.GetAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://gate.whapi.cloud/media/{MediaID}", nil)
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}

Envie o código de acesso à porta

Envie o código de acesso à porta gerado como texto de chat normal ao mesmo hóspede depois de o documento ser aceite.

curl --request POST \
     --url https://gate.whapi.cloud/messages/text \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "to": "447123456789",
  "body": "Your door access code is 482915"
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/messages/text",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"to\":\"447123456789\",\"body\":\"Your door access code is 482915\"}",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token",
    "content-type: application/json"
  ],
]);

$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests

url = "https://gate.whapi.cloud/messages/text"
payload = {
    "to": "447123456789",
    "body": "Your door access code is 482915"
}
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)
print(response.text)
const response = await fetch('https://gate.whapi.cloud/messages/text', {
  method: 'POST',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
    'content-type': 'application/json',
  },
  body: JSON.stringify({
    to: '447123456789',
    body: 'Your door access code is 482915',
  }),
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"to\":\"447123456789\",\"body\":\"Your door access code is 482915\"}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/messages/text")
  .post(body)
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .addHeader("content-type", "application/json")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/messages/text");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
request.AddHeader("content-type", "application/json");
request.AddJsonBody(new { to = "447123456789", body = "Your door access code is 482915" });
var response = await client.PostAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
)

func main() {
	body := []byte(`{"to":"447123456789","body":"Your door access code is 482915"}`)
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/messages/text", bytes.NewReader(body))
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")
	req.Header.Set("content-type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}
Status de entrega

Quando o texto do código da porta sai de pending

Uma resposta de envio bem-sucedida não significa que o hóspede já tem a mensagem. O primeiro estado visível antes de um webhook é pending. Alterações de estado posteriores chegam apenas em statuses.post e statuses.put. Se o estado ficar em pending e não passar a sent, delivered ou um ack posterior, a mensagem não foi entregue — verifique o payload e a permissão da conta para enviar esse tipo.

  • Trate um pending preso como não entregue, não como um relógio nem como uma fila à espera de um webhook.

  • Subscreva statuses.post e statuses.put quando precisar de confirmação de enviado, entregue ou lido para o texto do código da porta.

  • Não desbloqueie o acesso à propriedade nem marque o check-in como completo enquanto o estado do WhatsApp permanecer pending.

O que ler sobre entrega e webhooks

Contacte o suporte se algo correu mal
Quando algo falha

Trate as falhas em cada passo

Se o webhook do documento não tiver um MediaID utilizável, getMedia falhar ou o ficheiro tiver expirado, own_backend rejeitar o documento ou não conseguir gerar um código, ou sendMessageText falhar ou ficar por entregar, tente de novo ou alerte a receção e não trate o check-in como completo.

O documento chegou, mas o hóspede nunca recebeu o código?

Mantenha a aceitação da reserva separada da entrega no WhatsApp. Corrija um MediaID em falta, tente de novo getMedia ou sendMessageText, ou alerte a receção — não desbloqueie a porta nem marque o check-in remoto como concluído enquanto o hóspede ainda não tiver código. Se o envio continuar a falhar após uma nova tentativa, contacte o suporte Whapi com o id do canal e o id do pedido falhado.

Contacte o suporte se algo correu mal

Diagnóstico por passo da API

Código O que significa O que fazer
400 Wrong request parameters Corrija parâmetros incorretos no caminho do MediaID antes de tentar de novo.
404 Specified media not found Confirme que o MediaID do webhook do documento ainda existe no armazenamento na cloud; depois tente de novo ou peça ao hóspede para reenviar o ficheiro.
500 Internal Error
Código O que significa O que fazer
400 Wrong request parameters Corrija parâmetros incorretos no corpo do envio antes de tentar de novo.
401 Need channel authorization for send message Autorize o canal para enviar mensagens e tente de novo com um token válido.
402 Trial version limit exceeded
403 It is forbidden to send to this group/recipient Confirme que é permitido enviar a este destinatário e tente de novo com um valor to corrigido.
413 Request body too large
429 Too many requests Abrande e tente mais tarde após demasiados pedidos.
500 Internal Error
Perguntas frequentes

Check-in remoto e o código da porta

Não. Emparelhar o passaporte com a reserva, gerar o código da porta, avisar a receção e abrir a porta ficam no seu backend. Esta página cobre a recuperação do documento WhatsApp e o envio do texto do código da porta.
Do webhook do documento de entrada. No exemplo do operador, document.id é o MediaID passado a getMedia. Quando o Auto Download está ativo, o mesmo payload também pode incluir um document.link temporário que pode obter diretamente.
Siga o failure_mode do catálogo — não marque o check-in como completo, tente de novo o passo falhado ou alerte a receção, e não desbloqueie o acesso desse hóspede enquanto a recuperação de media ou a entrega estiver quebrada.
Não. Este trabalho é check-in remoto de hospitalidade após um documento de identidade do hóspede num chat pessoal. Não é uma página oficial de verificação de identidade nem a entrega de um código de login de uso único.
A história do operador permite uma foto ou um scan do passaporte. Configure os filtros do webhook para os tipos de anexo que a propriedade aceita; o padrão de recuperação e resposta mantém-se igual assim que tiver um MediaID.
Recursos compatíveis do WhatsApp

Tudo o que você precisa para criar automações no WhatsApp

O Whapi.Cloud oferece acesso a um conjunto completo de recursos do WhatsApp — mensagens, mídia, grupos, canais, webhooks e muito mais. Crie bots, automações e integrações sem limitações de funcionalidades.

Escolhido por desenvolvedores

Confiado por mais de 3.300 desenvolvedores e equipes SaaS

Desenvolvedores no mundo inteiro utilizam o Whapi.Cloud para criar automações, bots, integrações com CRM, ferramentas de envio em massa e fluxos avançados de WhatsApp. Nossa infraestrutura processa milhões de requisições API com alta estabilidade — e esse número cresce a cada mês.

Ícone de recurso

5,5K+

canais de API ativos

Ícone de recurso

21M+

requisições API por mês

“Tudo é simples, intuitivo e fácil de navegar. A documentação é clara e todas as informações estão bem à mão. Trabalho excelente.”

Roberto K. / Desenvolvedor Web

“Conectamos o WhatsApp aos nossos fluxos usando o n8n em apenas alguns minutos. Sem código, sem complicações — funcionou de primeira.”

Martin P. / Desenvolvedor

“O Whapi.Cloud se tornou uma parte essencial da nossa comunicação com clientes. Automatizamos atualizações de produtos, notificações de pedidos e mensagens de suporte — tudo sem templates nem aprovações da Meta.”

Oscar T. / CTO

Balão decorativo