curl --request POST \
--url https://api.revem.ai/webchat/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"channelId": "b7e3d2a1-4c5f-4e6d-9a8b-7c6d5e4f3a2b",
"contact": {
"email": "camila@ejemplo.cl",
"name": "Camila Rojas"
},
"body": "Hola, ¿tienen horas disponibles esta semana?"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
channelId: 'b7e3d2a1-4c5f-4e6d-9a8b-7c6d5e4f3a2b',
contact: {email: 'camila@ejemplo.cl', name: 'Camila Rojas'},
body: JSON.stringify('Hola, ¿tienen horas disponibles esta semana?')
})
};
fetch('https://api.revem.ai/webchat/messages', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.revem.ai/webchat/messages"
payload = {
"channelId": "b7e3d2a1-4c5f-4e6d-9a8b-7c6d5e4f3a2b",
"contact": {
"email": "camila@ejemplo.cl",
"name": "Camila Rojas"
},
"body": "Hola, ¿tienen horas disponibles esta semana?"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"conversationId": "a1d2c3b4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"messageId": 482
}{
"ok": false,
"error": "contact_identity_required",
"message": "Para abrir una conversación hace falta un id de contacto, un email o un teléfono."
}{
"error": "Unauthorized",
"message": "Invalid API key"
}{
"ok": false,
"error": "<string>",
"message": "<string>"
}{
"ok": false,
"error": "channel_not_found",
"message": "El canal de webchat no existe."
}{
"ok": false,
"error": "<string>",
"message": "<string>"
}{
"ok": false,
"error": "Too many requests. Retry in 1 minute."
}Enviar un mensaje del visitante
Registra un mensaje entrante — lo que escribió el visitante en tu sitio — y dispara la atención del equipo o del agente de IA según la configuración del canal.
Primer mensaje: omite conversationId, indica en contact quién escribe (al menos id, email o phone) y opcionalmente channelId. La respuesta trae el conversationId nuevo.
Mensajes siguientes: envía ese conversationId; channelId y contact se ignoran.
La identidad del visitante la afirma tu backend y Revem le cree: el contacto resuelto recibe el historial, los tickets y el contexto del agente. Autentica a tu usuario antes de llamar a esta ruta y nunca la expongas directamente desde el navegador.
Las respuestas del equipo o del agente llegan de forma asíncrona: léelas con GET /webchat/conversations/{id}/messages.
curl --request POST \
--url https://api.revem.ai/webchat/messages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"channelId": "b7e3d2a1-4c5f-4e6d-9a8b-7c6d5e4f3a2b",
"contact": {
"email": "camila@ejemplo.cl",
"name": "Camila Rojas"
},
"body": "Hola, ¿tienen horas disponibles esta semana?"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
channelId: 'b7e3d2a1-4c5f-4e6d-9a8b-7c6d5e4f3a2b',
contact: {email: 'camila@ejemplo.cl', name: 'Camila Rojas'},
body: JSON.stringify('Hola, ¿tienen horas disponibles esta semana?')
})
};
fetch('https://api.revem.ai/webchat/messages', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.revem.ai/webchat/messages"
payload = {
"channelId": "b7e3d2a1-4c5f-4e6d-9a8b-7c6d5e4f3a2b",
"contact": {
"email": "camila@ejemplo.cl",
"name": "Camila Rojas"
},
"body": "Hola, ¿tienen horas disponibles esta semana?"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"conversationId": "a1d2c3b4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"messageId": 482
}{
"ok": false,
"error": "contact_identity_required",
"message": "Para abrir una conversación hace falta un id de contacto, un email o un teléfono."
}{
"error": "Unauthorized",
"message": "Invalid API key"
}{
"ok": false,
"error": "<string>",
"message": "<string>"
}{
"ok": false,
"error": "channel_not_found",
"message": "El canal de webchat no existe."
}{
"ok": false,
"error": "<string>",
"message": "<string>"
}{
"ok": false,
"error": "Too many requests. Retry in 1 minute."
}Authorizations
La API key de tu organización, con la forma rvm_<prefijo>.<secreto>, enviada como Authorization: Bearer rvm_…. Revem la emite y sólo se muestra una vez; si la pierdes se reemplaza, no se recupera.
Body
Un mensaje necesita body, attachments o ambos. Para abrir una conversación nueva se omite conversationId y se indica quién escribe en contact.
Conversación existente en la que escribe el visitante. Es el valor que devolvió el primer mensaje. Cuando viene, channelId y contact se ignoran.
Canal de webchat en el que abrir la conversación. Si se omite se usa el webchat más antiguo del tenant. Sólo se lee cuando no hay conversationId.
Quién escribe, para una conversación nueva. Hace falta al menos id, email o phone. Se prueban en ese orden: id manda y no crea contactos; email y phone buscan un contacto existente o lo crean.
Show child attributes
Show child attributes
Texto del mensaje, hasta 4000 caracteres. Obligatorio si no hay adjuntos.
1 - 4000Adjuntos subidos previamente con POST /webchat/media, hasta 20 por mensaje. Obligatorio si no hay body.
20Show child attributes
Show child attributes
