Buscar conversaciones
Busca en las conversaciones del workspace por coincidencia textual, similitud semántica o ambas. El modo híbrido fusiona las dos señales, elimina fragmentos duplicados de una misma conversación y permite controlar exactamente qué campos regresan en la respuesta.
POST https://api.platica.mx/v1/search/conversations Cuerpo de la solicitud
{
"query": "el cliente quiere cancelar porque el cobro se duplicó",
"mode": "hybrid",
"filters": {
"start_date": "2026-07-01",
"tags": { "any": ["cancelación", "facturación"], "none": ["prueba"] },
"platforms": ["whatsapp", "instagram"],
"is_finished": true
},
"page_size": 20,
"response": {
"fields": ["id", "contactName", "topic", "tags", "snippet", "score", "sources"]
}
} | Campo | Tipo | Default | Descripción |
|---|---|---|---|
query | string, máx. 2000 | "*" | Texto para la búsqueda léxica y, si no hay variantes explícitas, para la semántica. Puede omitirse al explorar por filtros. |
semantic_queries | string o string[] | — | Una consulta semántica o hasta 5 variantes; se conserva la mejor coincidencia por conversación. |
mode | hybrid, lexical o semantic | hybrid | Selecciona los motores. |
filters | object | {} | Filtros avanzados; consulta la tabla siguiente. |
page | integer ≥ 1 | 1 | Página solicitada. |
page_size | integer 1-100 | 10 | Resultados por página. |
candidate_limit | integer 25-1000 | 250 | Ventana fija de candidatos que se recuperan y fusionan antes de paginar. Usa el mismo valor al recorrer páginas. |
semantic_score_threshold | number 0-2 | 0.8 | Distancia semántica máxima. Se aceptan resultados con distancia menor al umbral; un valor menor exige mayor similitud. |
ranking | object | pesos 0.5, rrf_k: 60 | Pesos de los motores y constante RRF. |
response | object | proyección compacta | Controla campos, resultados, analítica, diagnósticos y límites de texto. |
export_csv | boolean u object | false | Genera un CSV con URL firmada. |
Modos de búsqueda
| Modo | Motor | Cuándo usarlo |
|---|---|---|
hybrid | Léxico + semántico | Recomendado. Combina coincidencias textuales y conceptuales con Reciprocal Rank Fusion (RRF). |
lexical | Léxico | Para palabras, nombres, teléfonos, correos o frases exactas. query: "*" permite explorar sólo con filtros y recencia. |
semantic | Semántico | Para encontrar conversaciones con el mismo significado aunque usen otras palabras. Requiere query distinto de "*" o semantic_queries. |
En modo hybrid, query también se usa como consulta semántica cuando no envías semantic_queries. Si no hay ninguna consulta semántica, la búsqueda continúa sólo con
la rama léxica y lo indica en warnings. Si envías semantic_queries sin query, se omite la rama
léxica para no mezclar coincidencias semánticas con un listado general por recencia.
Filtros
Cada filtro de texto acepta un string o un arreglo de hasta 50 strings. Los filtros se aplican al resultado de ambos motores.
| Campo | Tipo | Descripción |
|---|---|---|
start_date, end_date | fecha ISO 8601 | Rango inclusivo. Si se omite, busca desde los últimos 90 días hasta ahora. Una fecha YYYY-MM-DD cubre el día completo. |
date_field | lastUpdate o creationDate | Fecha usada por el rango. Default: lastUpdate. |
tags | string, string[] u object | String/lista equivale a any. El objeto admite any, all y none para incluir cualquiera, exigir todas o excluir etiquetas. |
platforms | string o string[] | Plataformas, por ejemplo whatsapp, instagram o messenger. |
topics | string o string[] | Tópicos de conversación. |
statuses | string o string[] | Estados buscables: active, finished o spam. |
agents | string o string[] | IDs/rutas de agentes. |
channel_ids | string o string[] | IDs de canal. |
operations | string o string[] | Modos de operación. |
owner_ids | string o string[] | IDs de propietarios. |
conversation_ids | string o string[] | IDs de hilo. |
client_ids | string o string[] | IDs de cliente. |
phone_numbers | string o string[] | Teléfonos exactos. |
has_phone | boolean | Incluye o excluye conversaciones con teléfono. |
is_finished | boolean | Filtra por conversación finalizada. |
Ranking híbrido
{
"ranking": {
"lexical_weight": 0.65,
"semantic_weight": 0.35,
"rrf_k": 60
}
} Cada peso acepta valores de 0 a 1; en modo híbrido al menos uno debe ser mayor que cero. RRF
combina la posición de cada conversación en ambas ramas, en lugar de comparar directamente sus
escalas de relevancia. Los fragmentos semánticos se deduplican por id de conversación antes de ordenar.
El campo score final está normalizado entre 0 y 1. Solicita sources para saber qué motores
encontraron el resultado y scores para inspeccionar lexicalRank, lexicalTextMatch, semanticRank y semanticDistance.
Controlar el tamaño de la respuesta
La proyección por defecto no incluye mensajes, teléfono ni correo:
{
"response": {
"fields": [
"id", "contactName", "platform", "topic", "tags",
"lastUpdate", "snippet", "conversationUrl", "score", "sources"
],
"include_results": true,
"include_analytics": false,
"include_engine_metadata": false,
"create_search_cache": false,
"max_snippet_chars": 320,
"max_content_chars": 2000
}
} fields acepta:
id, conversationId, contactName, phoneNumber, email, platform, topic, tags,
status, agent, channelId, clientId, operation, owners, isFinished, creationDate,
lastUpdate, snippet, messages, conversationUrl, contactUrl, score, sources, scores | Campo | Rango | Efecto |
|---|---|---|
include_results | boolean | Con false, omite results; es útil para pedir sólo analítica, crear caché o exportar. |
include_analytics | boolean | Agrega conteos por tópico, etiqueta, estado, agente, plataforma y fecha. Son conteos muestreados sobre la ventana fusionada; revisa analytics.scope. |
include_engine_metadata | boolean | Agrega estado, candidatos, tiempo y truncamiento de las ramas léxica y semántica. |
create_search_cache | boolean | Crea un searchId temporal para flujos posteriores y devuelve su expiración. |
max_snippet_chars | integer 40-2000 | Longitud máxima de snippet. Default: 320. |
max_content_chars | integer 100-10000 | Longitud máxima del pasaje coincidente en messages. No representa el historial completo. Default: 2000. |
Para agentes y automatizaciones, pide sólo los campos necesarios. Usa snippet para revisar
relevancia y solicita messages únicamente cuando necesites el pasaje coincidente disponible. Para
el historial completo, usa Obtener conversación .
Exportar CSV
Envía "export_csv": true para exportar las coincidencias de la ventana de candidatos con la
selección de columnas predeterminada, o controla ambas opciones:
{
"query": "solicitud de cancelación",
"response": { "include_results": false },
"export_csv": {
"fields": ["id", "contactName", "phoneNumber", "topic", "lastUpdate", "conversationUrl"],
"max_rows": 500
}
} max_rows limita las filas exportadas, pero no amplía candidate_limit. Las exportaciones que
incluyen snippet o messages se limitan a 100 filas; sin esos campos pueden incluir hasta 1000.
La respuesta incluye export.url, filename, rowCount, sizeBytes, truncated y expiresAt. downloadUrl contiene la misma URL por compatibilidad. El archivo es privado, la URL firmada vence
en 7 días y sus celdas se protegen contra fórmulas de hoja de cálculo.
La exportación predeterminada sí incluye phoneNumber y email. Trata la URL firmada como un
secreto temporal y usa export_csv.fields para excluir datos personales que no necesites.
Respuesta
{
"success": true,
"mode": "hybrid",
"matchCount": 42,
"candidateCount": 42,
"totalFound": 42,
"totalRelation": "lower_bound",
"returnedCount": 2,
"truncated": false,
"fields": ["id", "contactName", "topic", "snippet", "score", "sources"],
"results": [
{
"id": "conv_7a19",
"contactName": "María López",
"topic": "Facturación",
"snippet": "...solicito cancelar porque aparece un cobro duplicado...",
"score": 0.967213,
"sources": ["lexical", "semantic"]
}
],
"pagination": {
"currentPage": 1,
"totalPages": 5,
"pageSize": 10,
"hasNextPage": true,
"hasPreviousPage": false,
"candidateWindow": 250
},
"tookMs": 183
} | Campo | Significado |
|---|---|
candidateCount, matchCount, totalFound | Conversaciones únicas recuperadas dentro de la ventana de candidatos después de deduplicar. |
totalRelation | exact sólo para una búsqueda léxica no truncada; lower_bound para resultados híbridos, semánticos o truncados. |
truncated | true indica que un motor o la fusión alcanzó su límite; puede haber más coincidencias fuera de la ventana. |
returnedCount | Elementos incluidos en results; es 0 cuando include_results es false. |
warnings | Avisos sobre degradación o límites de resultados. |
La página solicitada debe caber dentro de candidate_limit. La ventana máxima es de 1000
conversaciones y permanece fija para conservar el orden al paginar.
Disponibilidad de motores
Si una rama solicitada no está disponible y la otra sí, el endpoint continúa con la disponible,
reajusta el ranking y agrega una entrada en warnings. Activa response.include_engine_metadata al diagnosticar integraciones; evita habilitarlo por defecto si
quieres minimizar el contexto.