¡Guau! Crea tu integración de WhatsApp. Empieza gratis. Regístrate ahora
Check-in remoto de hotel · caso de uso de la WhatsApp API

Responde con un código de puerta de WhatsApp tras subir el documento de identidad

Los huéspedes completan el check-in remoto cuando el código de acceso a la puerta llega en el mismo chat después de enviar el pasaporte o el documento de identidad. Cuando ese documento llega al canal del hotel, tu backend puede recuperar el archivo, aceptarlo frente a la reserva y enviar el código como texto de chat normal a través de Whapi.Cloud. Este caso muestra a los integradores cómo implementar ese flujo con la WhatsApp API.

Se activa con un documento entrante en messages.post El código de puerta se envía como texto de chat al huésped
Portátil de hotel con una reserva junto a un teléfono con un chat de WhatsApp donde el documento de pasaporte del huésped aparece encima de la respuesta con el código de acceso a la puerta.
Caso de uso

Cuándo usar este flujo

El pasaporte o el DNI llega como documento de WhatsApp

Usa este flujo cuando un huésped con reserva envía el escaneo o la foto como documento entrante en el canal del establecimiento, no cuando el personal sigue recogiendo papel en recepción para cada llegada.

El código de puerta debe esperar a la aceptación del documento

Usa este flujo cuando tu backend deba generar y enviar el código de acceso solo después de recuperar el archivo y vincularlo a la reserva — no un código enviado antes de aceptar la identidad.

Las llegadas tardías o sin personal siguen necesitando acceso

Usa este flujo cuando el establecimiento deba liberar un código de puerta en el chat para check-in fuera de horario o remoto sin mantener recepción completa abierta para cada llegada.

Chat de WhatsApp en un teléfono con el documento de pasaporte del huésped encima de una respuesta que contiene el código de acceso a la puerta del hotel.
Experiencia del cliente

El huésped recibe el código de puerta en el chat

Antes de la automatización, el huésped espera en la puerta o escribe a recepción mientras alguien busca la reserva, revisa el pasaporte y escribe un código de acceso a mano — a menudo fuera de horario.

Cuando el flujo termina, el huésped ve el código de acceso a la puerta en el mismo chat de WhatsApp donde envió el documento de identidad. Los integradores construyen este resultado con la WhatsApp API.

Flujo

Del documento de identidad al código de puerta

1

Documento entrante del huésped

El canal publica un webhook messages.post con type document (pasaporte o documento de identidad). El payload lleva document.id como MediaID, un document.link opcional cuando Auto Download está activo, y el from / chat_id del huésped. Whapi.Cloud no ejecuta tu lógica de reserva ni de cerradura.

2

Recupera el archivo de identidad subido

GET /media/{MediaID}

getMedia descarga el archivo del almacenamiento en la nube por MediaID para que tu backend pueda aceptarlo frente a la reserva. Si Auto Download ya expuso un enlace usable, puedes obtener esa URL en su lugar, pero este trabajo sigue nombrando el paso de recuperación por MediaID.

3

Envía el código de acceso a la puerta

POST /messages/text

Cuando own_backend acepta el documento y genera el código, sendMessageText publica ese código como texto normal al teléfono o al chat id del huésped.

¿Necesitas seguimiento de entrega? Una respuesta de envío correcta no prueba que el huésped ya tenga el código de puerta. Sigue los acks posteriores en los webhooks de entrega. Ver el estado de entrega →

Requisitos previos

Antes de ejecutar el flujo

Conecta el número de WhatsApp que los huéspedes usan para documentos de check-in y autentica cada solicitud con el token de API de ese número. El emparejado de reservas, la generación del código de puerta y las alertas a recepción se quedan en tu backend.

Opcional — profundiza en este flujo

Implementación de API

Las llamadas que recuperan media y envían el código

Tu webhook ya nombró al huésped y el MediaID del documento. Estas llamadas recuperan ese archivo y luego entregan el código de acceso a la puerta que tu backend generó tras aceptarlo.

Obtén tu token de API gratis después de registrarte en whapi.cloud y úsalo en el código en lugar de Your_Token de los ejemplos.

Recupera el archivo de identidad subido

Descarga el archivo de pasaporte o documento de identidad del huésped por MediaID desde el webhook del documento entrante para que own_backend pueda aceptarlo.

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))
}

Envía el código de acceso a la puerta

Envía el código de acceso a la puerta generado como texto de chat normal al mismo huésped después de aceptar el documento.

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))
}
Estado de entrega

Cuando el texto del código de puerta sale de pending

Una respuesta de envío correcta no significa que el huésped ya tenga el mensaje. El primer estado visible antes de un webhook es pending. Los cambios de estado posteriores llegan solo en statuses.post y statuses.put. Si el estado se queda en pending y no pasa a sent, delivered o un ack posterior, el mensaje no se entregó: revisa el payload y el permiso de la cuenta para enviar ese tipo.

  • Trata un pending atascado como no entregado, no como un reloj ni como una cola que espera un webhook.

  • Suscríbete a statuses.post y statuses.put cuando necesites confirmar el envío, la entrega o la lectura del texto del código de puerta.

  • No desbloquees el acceso al establecimiento ni marques el check-in como completo mientras el estado de WhatsApp siga en pending.

Qué leer sobre entrega y webhooks

Contacta a soporte si algo salió mal
Cuando algo falla

Gestiona los fallos en cada paso

Si el webhook del documento no trae un MediaID usable, getMedia falla o el archivo expiró, own_backend rechaza el documento o no puede generar un código, o sendMessageText falla o no se entrega, reintenta o avisa a recepción y no trates el check-in como completo.

¿Llegó el documento, pero el huésped nunca recibió el código?

Mantén la aceptación de la reserva separada de la entrega por WhatsApp. Corrige un MediaID faltante, reintenta getMedia o sendMessageText, o avisa a recepción — no desbloquees la puerta ni marques el check-in remoto como hecho mientras el huésped siga sin código. Si el envío sigue fallando tras un reintento, contacta con el soporte de Whapi con el id del canal y el id de la solicitud fallida.

Contacta a soporte si algo salió mal

Revisa por paso de API

Estado Qué significa Qué hacer
400 Wrong request parameters Corrige los parámetros incorrectos en la ruta del MediaID antes de reintentar.
404 Specified media not found Confirma que el MediaID del webhook del documento sigue existiendo en el almacenamiento en la nube; luego reintenta o pide al huésped que reenvíe el archivo.
500 Internal Error
Estado Qué significa Qué hacer
400 Wrong request parameters Corrige los parámetros incorrectos en el cuerpo del envío antes de reintentar.
401 Need channel authorization for send message Autoriza el canal para enviar mensajes y reintenta con un token válido.
402 Trial version limit exceeded
403 It is forbidden to send to this group/recipient Confirma que se permite enviar a este destinatario y reintenta con un valor de to corregido.
413 Request body too large
429 Too many requests Reduce el ritmo y reintenta más tarde tras demasiadas solicitudes.
500 Internal Error
Preguntas frecuentes

Check-in remoto y el código de puerta

No. Emparejar el pasaporte con la reserva, generar el código de puerta, avisar a recepción y abrir la puerta se quedan en tu backend. Esta página cubre la recuperación del documento de WhatsApp y el envío del texto del código de puerta.
Del webhook del documento entrante. En el ejemplo del operador, document.id es el MediaID que se pasa a getMedia. Cuando Auto Download está activado, el mismo payload también puede incluir un document.link temporal que puedes obtener directamente.
Sigue el failure_mode del catálogo: no marques el check-in como completo, reintenta el paso fallido o avisa a recepción, y no desbloquees el acceso de ese huésped mientras falle la recuperación de media o la entrega.
No. Este trabajo es check-in remoto de hospitalidad tras un documento de identidad del huésped en un chat personal. No es una página oficial de verificación de identidad ni la entrega de un código de inicio de sesión de un solo uso.
La historia del operador permite una foto o un escaneo del pasaporte. Ajusta los filtros del webhook a los tipos de adjunto que acepte el establecimiento; el patrón de recuperación y respuesta se mantiene igual una vez que tengas un MediaID.
Funciones compatibles de WhatsApp

Todo lo que necesitas para crear automatizaciones en WhatsApp

Whapi.Cloud te da acceso a un conjunto completo de funciones de WhatsApp — mensajería, multimedia, grupos, canales, webhooks y más. Crea bots, automatizaciones e integraciones sin limitaciones de funciones.

Elegido por desarrolladores

Confiado por más de 3.300 desarrolladores y equipos SaaS

Desarrolladores de todo el mundo confían en Whapi.Cloud para crear automatizaciones, bots, integraciones con CRM, herramientas de mensajería masiva y flujos avanzados de WhatsApp. Nuestra infraestructura procesa millones de solicitudes API con alta estabilidad, y este número crece cada mes.

Icono de característica

5,5K+

canales API activos

Icono de característica

21M+

solicitudes API al mes

“Todo es simple, intuitivo y fácil de usar. La documentación es clara y toda la información está justo donde la necesito. Excelente trabajo.”

Roberto K. / Desarrollador Web

“Conectamos WhatsApp a nuestros flujos en n8n en solo unos minutos. Sin código, sin complicaciones — todo funcionó a la primera.”

Martin P. / Desarrollador

“Whapi.Cloud se convirtió en una parte clave de nuestra comunicación con clientes. Automatizamos actualizaciones de productos, notificaciones de pedidos y mensajes de soporte — sin plantillas ni aprobaciones de Meta.”

Oscar T. / CTO

Burbuja decorativa