Referencia de la API de Comunidad
En qué se diferencia de la API del widget externo
La API de Comunidad y la API del widget externo atienden superficies distintas y tienen modelos de seguridad diferentes:
| Aspecto | API del widget externo | API de Comunidad |
|---|---|---|
| Autenticación | Clave de API (por agente) | Sesión autenticada del usuario del portal (sin clave de API) |
| Identidad | Usuario invitado anónimo | Usuario del portal real de Salesforce |
| Modelo de sesión | Token de sesión opaco devuelto por /init |
Conversaciones vinculadas al usuario del portal; reanudables con /init |
| CORS | Lista de permitidos de orígenes mediante Orígenes permitidos | Solicitudes del portal del mismo origen; sin configuración de CORS |
| Límite diario de créditos | Límite diario de créditos externo | Límite diario de créditos de la comunidad |
| Permisos | Perfil del usuario invitado | El perfil y las reglas de colaboración propios del usuario del portal |
Usa esta API cuando el chatbot vive detrás de un inicio de sesión de Salesforce Experience Cloud. Usa la API del widget externo cuando el chatbot está en un sitio web público.
URL base
Se sirve desde tu sitio de Experience Cloud, bajo la ruta /services/apexrest/redaai/chat/community/v1/:
https://<your-community>.my.site.com/<site-path>/services/apexrest/redaai/chat/community/v1/
El host exacto depende de tu configuración de Experience Cloud. Las llamadas hechas desde dentro del portal usan de forma natural la cookie de sesión del portal para la autenticación.
Autenticación
No hay clave de API. El endpoint confía en la cookie de sesión de Experience Cloud para identificar al usuario del portal que hace la llamada. Dos consecuencias:
- Las llamadas desde un contexto de invitado (no autenticado) se rechazan con
AUTH_REQUIRED. - Las llamadas desde fuera del portal que no llevan la cookie de sesión también se rechazan.
Por eso la API de Comunidad es del mismo origen de forma natural: la cookie de sesión estándar de Experience Cloud no acompaña a las solicitudes de origen cruzado hacia el dominio del portal.
Endpoints
Cinco endpoints, todos POST:
| Ruta | Propósito |
|---|---|
POST /chat/community/v1/init | Inicia una conversación nueva con un agente o reanuda una reciente existente. |
POST /chat/community/v1/new | Fuerza el inicio de una conversación nueva, ignorando cualquier reciente existente. |
POST /chat/community/v1/message | Envía un mensaje del usuario y recibe la respuesta del agente. |
POST /chat/community/v1/action | Ejecuta una acción confirmada que el agente propuso. |
POST /chat/community/v1/history | Obtiene los mensajes de una conversación. |
POST /chat/community/v1/continue | Pide al agente que relate el resultado de las acciones que ejecutó automáticamente en el turno anterior. No se envía ningún mensaje nuevo del usuario. |
POST /chat/community/v1/init
Resuelve el agente y reanuda la conversación más reciente del usuario del portal con ese agente (cuando existe una dentro del tiempo de espera de la sesión del agente) o crea una nueva.
Cuerpo de la solicitud
{
"agentName": "support-assistant"
}
Respuesta (200 OK)
{
"conversationId": "a0Q…",
"agentName": "support-assistant",
"displayName": "Asistente de soporte",
"welcomeMessage": "¡Hola! ¿En qué puedo ayudarte hoy?",
"mascotImage": "https://…/mascot.png",
"maxMessageLength": 2000,
"messages": [
{ "role": "user", "content": "…", "timestamp": "…" },
{ "role": "assistant", "content": "…", "timestamp": "…" }
]
}
Cuando la respuesta incluye un arreglo messages no vacío, la conversación se reanudó; representa los turnos anteriores para preservar la continuidad. De lo contrario, la conversación es completamente nueva.
Ventana de reanudación
La elegibilidad para reanudar se rige por Minutos de tiempo de espera de la sesión en la definición del agente (predeterminado: 30). La plataforma busca la conversación activa más reciente del usuario del portal con ese agente, comprueba que su última actividad esté dentro de la ventana de tiempo de espera y, de ser así, la reanuda.
POST /chat/community/v1/new
Fuerza una conversación nueva incluso si existe una reciente. Útil para controles de interfaz de tipo “Empezar de nuevo”.
Cuerpo de la solicitud
{
"agentName": "support-assistant"
}
Respuesta (200 OK)
{
"conversationId": "a0Q…",
"agentName": "support-assistant",
"displayName": "Asistente de soporte",
"welcomeMessage": "¡Hola! ¿En qué puedo ayudarte hoy?",
"mascotImage": "…",
"maxMessageLength": 2000
}
No se devuelve ningún arreglo messages porque la conversación aún no tiene historial.
POST /chat/community/v1/message
Envía un único mensaje del usuario al agente y devuelve la respuesta.
Cuerpo de la solicitud
{
"conversationId": "<de /init o /new>",
"message": "¿Qué hay abierto en mi caso 00012345?"
}
La plataforma valida que el usuario del portal que hace la llamada sea el propietario de la conversación. El acceso entre usuarios se rechaza.
Respuesta (200 OK)
{
"response": "<texto de respuesta del agente>",
"creditsUsed": 1.42,
"conversationId": "a0Q…",
"continuationPending": false,
"continuationDepth": 0
}
continuationPending es el indicador sobre el que tu cliente debe actuar. Cuando
el agente ha ejecutado una o más acciones durante este turno, devuelve true: hay un resultado que
todavía no ha narrado. Llama a /continue para obtener esa narración. Ignorar el indicador deja al
usuario ante una respuesta que se corta antes del resultado de lo que acaba de ocurrir.
POST /chat/community/v1/action
Ejecuta una acción confirmada. Solo se aceptan las herramientas de Acción asignadas al agente y con alcance para el canal de Comunidad.
Cuerpo de la solicitud
{
"conversationId": "<de /init>",
"actionTool": "create_record",
"params": {
"object_name": "Case",
"field_values": { "Subject": "Problema con el inicio de sesión", "…": "…" }
}
}
Respuesta (200 OK)
{
"success": true,
"result": "<resultado de la ejecución de la herramienta, serializado en JSON>"
}
POST /chat/community/v1/continue
Pide al agente que narre el resultado real de las acciones que ejecutó automáticamente en el turno
/message anterior. No se envía ningún mensaje nuevo del usuario. Llámalo siempre que la
respuesta anterior haya devuelto continuationPending: true.
Cuerpo de la solicitud
{
"conversationId": "a0Q…",
"continuationDepth": 0
}
Devuelve el continuationDepth que recibiste en la respuesta anterior. Si lo omites, se trata
como 0.
Respuesta (200 OK)
{
"response": "<narración del agente sobre lo ocurrido>",
"creditsUsed": 0.68,
"conversationId": "a0Q…",
"continuationPending": false,
"continuationDepth": 1
}
continuationPending sigue siendo true si el agente encadenó otra acción mientras
narraba, así que esto es un bucle, no una única llamada de seguimiento. Sigue llamando a
/continue, devolviendo cada vez el continuationDepth recibido, hasta que vuelva
como false. El ajuste Profundidad máxima de continuación del agente acota la
cadena, de modo que el bucle siempre termina.
Una continuación es una llamada real al modelo. Consume créditos y se comprueba contra
exactamente las mismas barreras que /message — límite de tasa por sesión, límite de tasa
por hora del agente y tope diario de créditos de la comunidad — por lo que puede devolver
429 con RATE_LIMITED o CREDIT_LIMIT. Trátalos igual que en
/message.
POST /chat/community/v1/history
Devuelve los mensajes de la conversación para el usuario del portal activo. Útil cuando la página del portal se recarga y necesita restaurar el hilo visible.
Cuerpo de la solicitud
{
"conversationId": "a0Q…"
}
Respuesta (200 OK)
{
"messages": [
{ "role": "user", "content": "…", "timestamp": "…" },
{ "role": "assistant", "content": "…", "timestamp": "…" }
]
}
Respuestas de error
Con la misma estructura que la API del widget externo:
{
"error": "<mensaje localizado para el usuario>",
"code": "<código legible por máquina>"
}
| HTTP | Código | Significado |
|---|---|---|
| 403 | DISABLED | El interruptor principal del bot de la comunidad está desactivado. |
| 401 | AUTH_REQUIRED | El llamador no está autenticado (invitado). Se requiere iniciar sesión en el portal. |
| 429 | RATE_LIMITED | Se superó el límite de tasa por sesión de usuario o por agente. |
| 429 | MAX_MESSAGES | La conversación alcanzó su límite de Máximo de mensajes por sesión. |
| 429 | CREDIT_LIMIT | Se agotó el límite diario de créditos de la comunidad de la organización, o el presupuesto de créditos de la licencia. |
| 400 | INVALID_INPUT | Falta un parámetro del cuerpo, el mensaje es demasiado largo, la herramienta de acción es desconocida o la conversación no pertenece al llamador. |
| 404 | GENERIC_ERROR | Subruta desconocida bajo /chat/community/v1/. |
| 500 | GENERIC_ERROR | Un error inesperado. Se captura en el Registro de incidentes; la respuesta oculta los detalles de forma intencional. |
Límites de tasa
Los mismos controles que la API del widget externo, con dos diferencias:
- Los límites por sesión se registran por cada usuario del portal, no por un token de sesión opaco.
- El límite diario de créditos es la Configuración de la plataforma Límite diario de créditos de la comunidad, no el límite externo.
| Límite | Origen | Predeterminado |
|---|---|---|
| Por sesión (por usuario del portal) | Definición de agente › Límite de tasa por sesión | 10 llamadas por sesión |
| Por hora (por agente) | Definición de agente › Límite de tasa por hora | 500 llamadas |
| Límite diario de créditos | Configuración de la plataforma › Límite diario de créditos de la comunidad | 2000 créditos |
| Máximo de mensajes por sesión | Definición de agente › Máximo de mensajes por sesión | 50 mensajes |
Para eliminar por completo el tope diario de créditos, deja Community Daily Credit Cap en
blanco o ponlo en 0: ambos significan ilimitado. Es deliberadamente un ajuste distinto del tope
del widget externo, de modo que un widget público con mucho tráfico nunca pueda agotar el presupuesto del que
dependen los miembros de tu portal.
Propiedad de la conversación
Las conversaciones pertenecen al usuario del portal que las inició. La plataforma valida la propiedad en cada llamada a /message, /action e /history: llamar con un conversationId que pertenece a otro usuario se rechaza con INVALID_INPUT.
Este es el límite de seguridad que permite que la API de Comunidad funcione sin claves de API: los propios permisos y la propiedad del usuario del portal rigen lo que puede ver y hacer.
El Contacto del usuario del portal se entrega al agente automáticamente. Los usuarios de
Experience Cloud están vinculados a un registro de Contacto mediante User.ContactId. Cuando
/init o /new crean una conversación, REDA AI resuelve ese Contacto y lo guarda como
el registro de contexto de la conversación, para luego inyectarlo en el prompt del sistema en cada turno
posterior. Así, el agente sabe con quién está hablando — nombre, cuenta y cualquier otro campo de
Contacto que hayas configurado como contexto — sin que el cliente envíe ningún dato identificativo y
sin configuración adicional por agente.
Un usuario del portal sin Contacto (poco frecuente, pero posible en algunos tipos de licencia de Experience Cloud) simplemente obtiene una conversación sin registro de contexto. No falla nada.
Configuración necesaria en el agente
| Campo | Propósito |
|---|---|
| Canal | Debe incluir Community para que se pueda acceder al agente desde el endpoint del portal. |
| Longitud máxima del mensaje | Límite de la longitud del mensaje del usuario en caracteres. |
| Minutos de tiempo de espera de la sesión | Ventana en la que /init reanuda una conversación reciente en lugar de crear una nueva. |
| Límite de tasa por sesión | Límite de llamadas por cada usuario del portal. |
| Límite de tasa por hora | Límite por hora por agente entre todos los usuarios del portal. |
| Máximo de mensajes por sesión | Límite absoluto de mensajes por conversación. |
| Mensaje de bienvenida externo | Se muestra al usuario del portal al iniciar la conversación. El mismo campo que el canal del widget externo. |
| Imagen de la mascota | Avatar que se muestra en el chat del portal. |
Postura de seguridad
- La autenticación es la del portal. No hay claves de API que emitir, rotar ni filtrar. Cada llamada hereda la sesión del usuario del portal.
- Los permisos son los del usuario del portal. Las reglas de CRUD, FLS y colaboración del perfil del usuario del portal rigen lo que el agente y cualquier herramienta pueden leer o escribir, incluidos los registros que pueden ver en el historial de la conversación.
- La propiedad se aplica en cada llamada. Un usuario del portal no puede leer las conversaciones de otro usuario del portal aunque obtenga el ID de la conversación.
- Se aplica el alcance de canal de las herramientas. Aquí solo se pueden usar las herramientas de Acción cuyos canales incluyan
Community. - El límite diario de créditos es la red de seguridad. El Límite diario de créditos de la comunidad evita que un bot del portal fuera de control agote el presupuesto de la licencia.
- Mensajes de error genéricos. Los detalles internos de los errores nunca se devuelven; las fallas se registran en el Registro de incidentes para que el administrador las investigue.
Prácticas recomendadas
Usa el componente puente de comunidad incluido. El componente Lightning para Experience Cloud se encarga de las llamadas a la API, la reanudación de la sesión y la representación de la interfaz. Crear un cliente personalizado solo tiene sentido para contextos que no son del portal.
Reanuda en lugar de reiniciar. Llamar a /init al comienzo de cada vista de página es el valor predeterminado correcto: la plataforma reanudará la conversación reciente de forma transparente. Reserva /new para los controles explícitos de tipo “Empezar de nuevo” impulsados por el usuario.
Establece un tiempo de espera de la sesión razonable. Si es demasiado corto, los usuarios pierden el contexto entre cargas de página; si es demasiado largo, se reanudan conversaciones obsoletas cuando los usuarios querían empezar de nuevo. El valor predeterminado de 30 minutos es un buen punto de partida.
Vigila el Límite diario de créditos de la comunidad. Es independiente del límite externo y ajustable según el volumen de usuarios autenticados del portal que atiendas.
Confirma el alcance de canal de las herramientas. Una herramienta de Acción que solo está asignada a Internal no se activará desde una llamada del portal, aunque el agente esté configurado para ella.
Revisar la continuidad de conversaciones
Ventana de conversación (horas) vacía utiliza ahora el valor de la organización, inicialmente 30 minutos. Un valor positivo define la ventana del agente; 0 desactiva la reanudación automática. La coincidencia depende del canal: API usa agente y registro; Interno/MCP autenticado usa agente, usuario y contexto de registro pertinente. Comunidad utiliza el ajuste compartido en lugar del tiempo de espera de sesión externa. El chat en inicio, páginas de aplicación y barra de utilidades puede retomar conversaciones válidas. Los identificadores explícitos siguen sujetos al acceso de su ruta. Si dependía de que vacío iniciara una conversación, use 0. También se corrigen permisos empaquetados de continuidad Interna y Comunidad.
Preguntas frecuentes
No. El endpoint se basa en la cookie de sesión de Experience Cloud. Los usuarios del portal autenticados pueden llamarlo directamente; los usuarios invitados no.
El endpoint devuelve AUTH_REQUIRED para cualquier llamador no autenticado. Si tu portal permite la navegación de invitados, oculta la interfaz del chatbot para los usuarios no autenticados; como alternativa, implementa el widget externo para los escenarios de invitados.
La conversación persiste. Cuando el mismo usuario vuelve a iniciar sesión dentro de la ventana de Minutos de tiempo de espera de la sesión, /init la reanuda. Fuera de esa ventana, se crea una conversación nueva.
No. Cada conversación pertenece al usuario que la inició y la propiedad se aplica en cada llamada. Un usuario del portal no puede leer la conversación de otro usuario del portal ni siquiera con el ID de la conversación.
Devuelve mensajes anteriores solo cuando reanuda una conversación existente dentro de la ventana de tiempo de espera de la sesión. Para una conversación completamente nueva, el arreglo messages está vacío.
No. Son dos límites independientes que se configuran por separado en la Configuración de la plataforma.
Agrega un botón que llame a /new en lugar de /init. El nuevo endpoint fuerza una conversación nueva sin importar si existe alguna reciente.
Próximos pasos
Lee Configuración del agente de Comunidad para conocer el recorrido de implementación, o Referencia de la API del widget externo para la contraparte sin autenticación.