Autenticación
Cómo obtener y usar la API key de tu organización. Toda solicitud lleva la API key de tu organización como bearer token:Obtener una key
Las API keys las emite el equipo de Revem para tu organización. Escríbenos a soporte@revem.ai indicando para qué sistema es; te entregamos la key por un canal seguro.Forma de la key
Una key tiene la formarvm_<prefijo>.<secreto>. El prefijo identifica la key en nuestros
registros y puedes mencionarlo en un correo de soporte sin riesgo; el secreto nunca debe salir de
tu servidor.
Buenas prácticas
- Guárdala como secreto en tu backend (variables de entorno, gestor de secretos). Nunca en el código fuente, en un repositorio ni en el navegador.
- Una key por sistema. Si tienes más de un servicio que hablan con Revem, pide una key para cada uno: revocar una no interrumpe al otro.
- Rotación. Pide la nueva key, cámbiala en tu sistema y avísanos para revocar la anterior. La key vieja sigue funcionando hasta que se revoca, así que no hay corte.
- Nunca desde el navegador. Las rutas de webchat en particular confían en la identidad del visitante que tu backend afirma; expuestas al cliente, cualquiera podría escribir como cualquiera dentro de tu organización. Ver Webchat.
Respuestas de autenticación
401
403
Errores y límites
Códigos de estado, forma de los errores y límite de solicitudes.Códigos de estado
Forma de los errores
Todo error es un objeto JSON conok: false y una clave error. Qué contiene error depende del
módulo, así que no lo uses para tomar decisiones sin mirar la tabla:
- Errores de contactos
- Errores de tickets
- Errores de webchat
error es la etiqueta del código HTTP y message explica el problema. El 422 por atributos
desconocidos agrega unknownAttributes con los nombres que no existen.400) describen el campo con la notación de la API: body/phone_number,
querystring/limit, params/id.
Límite de solicitudes
Cada API key puede hacer 600 solicitudes por minuto, sumando todos los endpoints. Al superarlo, la API responde429 y no procesa la solicitud.
Idempotencia y reintentos
GETyPATCHson seguros de reintentar.POST /contacts/public/v1es un upsert: repetir la misma solicitud deja el mismo resultado.POST /webchat/messagesno es idempotente: cada llamada registra un mensaje nuevo. Reintenta sólo si no recibiste respuesta, y evita duplicar un mensaje que sí llegó.
Contactos
Cómo mantener tu base de clientes al día en Revem desde tu CRM, tu tienda o tu ERP. Los endpoints de contactos viven bajo/contacts/public/v1. Un contacto tiene cuatro campos fijos
—phone_number, first_name, last_name, email— y cualquier cantidad de atributos
personalizados, que van al mismo nivel identificados por su nombre en Revem.
El teléfono identifica, el id persiste
Hay dos formas de escribir un contacto y conviene entender cuándo usar cada una:1
Crear o actualizar por teléfono
POST /contacts/public/v1 recibe el teléfono y decide: si ya hay un contacto con ese número lo
actualiza, si no lo crea. Es la llamada para una carga inicial y para sistemas que no guardan
ids de Revem.id del contacto y si fue creado (created: true) o actualizado.2
Guardar el id y actualizar por id
Guarda ese Con el upsert, ese mismo cambio habría creado un segundo contacto con la mitad del historial.
id junto al cliente en tu sistema. Desde ahí, actualiza con
PATCH /contacts/public/v1/{id}: acepta los mismos campos y aquí el teléfono es un campo más,
así que un cliente que cambia de número sigue siendo el mismo contacto.Reglas que conviene saber
Una clave ausente no borra nada
Una clave ausente no borra nada
Varios sistemas escriben sobre el mismo contacto (tu integración, el equipo desde la app, el
agente). Por eso una solicitud parcial es una actualización parcial: sólo cambian las claves
que envías. Enviar
{"first_name": "Camila"} corrige el nombre y deja el apellido como estaba.Por la misma razón esta API no vacía campos: un email o un apellido en blanco se trata como
ausente. Limpiar un dato es una acción deliberada desde la app.Los atributos personalizados se identifican por nombre
Los atributos personalizados se identifican por nombre
Cualquier clave del cuerpo que no sea uno de los cuatro campos fijos se interpreta como un
atributo personalizado y se busca por nombre entre los definidos para contactos en tu
organización, sin distinguir mayúsculas.
- Un nombre que no existe responde
422con la lista enunknownAttributes. La API nunca crea definiciones por su cuenta: un error de tipeo sería un campo permanente. - Un valor que no calza con el tipo declarado (texto en un atributo numérico, por ejemplo)
también responde
422. - Los valores pueden venir como texto aunque el atributo sea numérico o booleano; Revem los convierte según la definición.
- Hasta 100 atributos por solicitud.
id, created_at y updated_at están reservados para la lectura: enviarlos en un
cuerpo responde 422.El email es dato, no identidad
El email es dato, no identidad
Si el email que envías ya pertenece a otro contacto, la solicitud sí se aplica —nombre,
apellido y atributos se guardan— y el email queda sin escribir, con un aviso en
warnings.
Revisa ese arreglo en tu integración: una respuesta 200 con avisos es información, no ruido.Un contacto en la papelera sigue siendo dueño de su número
Un contacto en la papelera sigue siendo dueño de su número
Si el teléfono pertenece a un contacto que el equipo envió a la papelera, el upsert responde
409 en vez de resucitarlo en silencio. Restaurarlo o eliminarlo definitivamente se hace desde
Contactos en la app. PATCH /{id} sobre ese contacto responde 404, igual que GET /{id}: la
API key no ve la papelera.Formato del teléfono
Formato del teléfono
Recomendamos E.164 (
+56912345678). Revem normaliza las grafías habituales al guardar y al
buscar, así que el número con que creaste un contacto también lo encuentra en ?phone=. Un
número que no se puede normalizar se guarda tal cual.Leer contactos
GET /contacts/public/v1/{id} devuelve un contacto en la misma forma plana que acepta la
escritura, con sus atributos personalizados por nombre. Un campo sin valor se omite; la
excepción es phone_number, que siempre viene y puede ser null para un contacto que llegó por un
canal sin teléfono.
GET /contacts/public/v1 lista los contactos del más reciente al más antiguo según su fecha de
creación, paginados con limit (hasta 200) y offset, y acepta filtros por phone, email y
updated_since. La respuesta trae has_more en lugar de un total.
Sincronización incremental
Para traer a tu sistema lo que cambió en Revem, recorre la lista conupdated_since:
Lo que la API no hace
- No elimina contactos. Enviar un contacto a la papelera es una acción deliberada desde la app.
- No une contactos duplicados. Dos contactos partidos por un cambio de número antes de usar
PATCH /{id}se unen desde Contactos. - No expone el nombre compuesto. Publica
first_nameylast_nametal como están guardados; compón el nombre completo en tu lado si lo necesitas.
Tickets
Cómo leer y actualizar los tickets de tu embudo desde un sistema externo. Los endpoints de tickets viven bajo/tickets/public/v1. Un ticket es una oportunidad o un caso
dentro de un embudo: tiene una etapa, un estado, un responsable, contactos vinculados y atributos
personalizados.
Una API key ve todos los tickets de la organización. Las reglas de visibilidad por dueño o
por grupo aplican a las personas del equipo dentro de la app, no a las integraciones.
Listar y filtrar
GET /tickets/public/v1 pagina con limit (hasta 200) y offset, y acepta filtros combinables:
tickets y hasMore.
Leer un ticket
pointOfContact y account son ids de contacto: puedes resolverlos con
GET /contacts/public/v1/{id}. conversations es una lista porque un ticket puede tener más de
una conversación (por ejemplo una de WhatsApp y una de webchat).
Actualizar un ticket
PATCH /tickets/public/v1/{id} recibe sólo los campos que quieres cambiar:
title,funnelStageId,status,assignedToProfileId,pointOfContact,account,lossReasonycustomAttributesson editables. Los ids de contactos, perfiles y etapas deben pertenecer a tu organización; si no, la respuesta es400.assignedToProfileId,pointOfContact,accountylossReasonaceptannullpara vaciarlos.customAttributesreemplaza el conjunto completo: envía todos los que quieras conservar.- La respuesta normal es
200con el ticket actualizado. Un204significa que el cambio se aplicó pero quien llama ya no puede leer el resultado; con una API key no ocurre en la práctica.
Lo que la API no hace
- No crea tickets. Un ticket nace de una conversación con un contacto, para que conserve ese
contexto. Si necesitas abrir uno desde tu sistema, el camino es una conversación (por ejemplo un
mensaje de webchat con
createTicketOnConversationactivo en el canal). - No elimina tickets. Se conservan para auditoría.
- No lee los mensajes de las conversaciones de un ticket, salvo las de webchat con
GET /webchat/conversations/{id}/messages.
Webchat
Cómo registrar los mensajes del chat de tu sitio en Revem y mostrar las respuestas del equipo o del agente de IA. El canal Webchat conecta un chat que tú controlas —el widget de tu sitio, tu app— con la bandeja de entrada de Revem. Tu backend registra lo que escribe el visitante; el equipo o el agente de IA responden desde Revem; tu backend lee esas respuestas y las muestra.Antes de empezar
- En Revem, crea un canal de tipo Webchat en Canales y configúralo: etapa del embudo, modo de conversación (autónomo, asistido o manual) y si cada conversación abre un ticket.
- Toma el id del canal desde esa pantalla. Es opcional en las llamadas si tienes un solo webchat; si tienes varios, envíalo siempre.
- Pide tu API key.
El flujo
1
El visitante escribe: registra el primer mensaje
Sin Guarda el
conversationId, POST /webchat/messages abre una conversación. Indica quién escribe en
contact con al menos una identidad —id, email o phone— y opcionalmente su name.conversationId asociado a la sesión del visitante.2
Mensajes siguientes: envía el conversationId
A partir del segundo mensaje envía sólo
conversationId y el contenido. channelId y
contact se ignoran cuando la conversación ya existe.3
Lee las respuestas
Las respuestas del equipo o del agente se generan de forma asíncrona. Léelas con
Mientras la conversación está abierta en el widget, consulta esta ruta periódicamente (cada
pocos segundos) y muestra los mensajes con
GET /webchat/conversations/{id}/messages, que devuelve los mensajes del más reciente al más
antiguo. Los que escribió el visitante vienen con origin: "INBOUND"; las respuestas, con
origin: "OUTBOUND".id mayor al último que ya mostraste. Para
historial más antiguo, pasa nextCursor en cursor.Identificar al visitante
contact acepta tres identidades y se prueban en este orden, de la más firme a la menos:
Un visitante anónimo necesita al menos una identidad: sin ninguna, la respuesta es
400
contact_identity_required. Si tu chat permite escribir sin identificarse, pide el email o el
teléfono antes del primer mensaje, o genera un identificador propio y guárdalo como atributo del
contacto por la API de contactos.
name es opcional y se usa al crear el contacto o al titular el ticket; no sobrescribe el nombre
de un contacto existente.
Adjuntos
Un mensaje puede llevar texto, adjuntos o ambos, con hasta 20 adjuntos y 4000 caracteres.1
Sube el archivo
POST /webchat/media recibe multipart/form-data con un archivo y devuelve su mediaId.Content-Type de la parte. Imágenes PNG y JPEG hasta 5 MB; video
MP4 y 3GP hasta 16 MB; PDF, Word, Excel y texto plano hasta 25 MB.2
Referencia el adjunto en el mensaje
url firmada que expira en una hora, además de
fileName y mimeType. No guardes esas URLs: vuelve a pedir la página cuando las necesites.
Qué pasa en Revem con cada mensaje
- Un contacto nuevo nace confirmado (visible en Contactos y elegible para tickets y campañas) si el canal tiene activo crear contacto al recibir, que es el valor por defecto.
- Si el canal tiene activo crear ticket por conversación, cada conversación tiene un ticket en el embudo configurado, y se vuelve a abrir uno si el anterior se cerró.
- En modo autónomo responde el agente de IA del canal; en asistido o manual responde el
equipo desde la bandeja de entrada. El agente puede escalar a manual; tu integración no necesita
distinguirlo, sólo leer los mensajes
OUTBOUND.
Lo que la API no hace todavía
- No hay webhook de salida. Hoy las respuestas se leen consultando la conversación. Si tu caso necesita entrega inmediata en el servidor, escríbenos.
- El agente no envía adjuntos por este canal; sólo el equipo.
- No crea canales. Los webchats se crean y configuran desde la app.
