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"]
  }
}
CampoTipoDefaultDescripción
querystring, 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_queriesstring o string[]Una consulta semántica o hasta 5 variantes; se conserva la mejor coincidencia por conversación.
modehybrid, lexical o semantichybridSelecciona los motores.
filtersobject{}Filtros avanzados; consulta la tabla siguiente.
pageinteger ≥ 11Página solicitada.
page_sizeinteger 1-10010Resultados por página.
candidate_limitinteger 25-1000250Ventana fija de candidatos que se recuperan y fusionan antes de paginar. Usa el mismo valor al recorrer páginas.
semantic_score_thresholdnumber 0-20.8Distancia semántica máxima. Se aceptan resultados con distancia menor al umbral; un valor menor exige mayor similitud.
rankingobjectpesos 0.5, rrf_k: 60Pesos de los motores y constante RRF.
responseobjectproyección compactaControla campos, resultados, analítica, diagnósticos y límites de texto.
export_csvboolean u objectfalseGenera un CSV con URL firmada.

Modos de búsqueda

ModoMotorCuándo usarlo
hybridLéxico + semánticoRecomendado. Combina coincidencias textuales y conceptuales con Reciprocal Rank Fusion (RRF).
lexicalLéxicoPara palabras, nombres, teléfonos, correos o frases exactas. query: "*" permite explorar sólo con filtros y recencia.
semanticSemánticoPara 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.

CampoTipoDescripción
start_date, end_datefecha ISO 8601Rango inclusivo. Si se omite, busca desde los últimos 90 días hasta ahora. Una fecha YYYY-MM-DD cubre el día completo.
date_fieldlastUpdate o creationDateFecha usada por el rango. Default: lastUpdate.
tagsstring, string[] u objectString/lista equivale a any. El objeto admite any, all y none para incluir cualquiera, exigir todas o excluir etiquetas.
platformsstring o string[]Plataformas, por ejemplo whatsapp, instagram o messenger.
topicsstring o string[]Tópicos de conversación.
statusesstring o string[]Estados buscables: active, finished o spam.
agentsstring o string[]IDs/rutas de agentes.
channel_idsstring o string[]IDs de canal.
operationsstring o string[]Modos de operación.
owner_idsstring o string[]IDs de propietarios.
conversation_idsstring o string[]IDs de hilo.
client_idsstring o string[]IDs de cliente.
phone_numbersstring o string[]Teléfonos exactos.
has_phonebooleanIncluye o excluye conversaciones con teléfono.
is_finishedbooleanFiltra 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
CampoRangoEfecto
include_resultsbooleanCon false, omite results; es útil para pedir sólo analítica, crear caché o exportar.
include_analyticsbooleanAgrega conteos por tópico, etiqueta, estado, agente, plataforma y fecha. Son conteos muestreados sobre la ventana fusionada; revisa analytics.scope.
include_engine_metadatabooleanAgrega estado, candidatos, tiempo y truncamiento de las ramas léxica y semántica.
create_search_cachebooleanCrea un searchId temporal para flujos posteriores y devuelve su expiración.
max_snippet_charsinteger 40-2000Longitud máxima de snippet. Default: 320.
max_content_charsinteger 100-10000Longitud máxima del pasaje coincidente en messages. No representa el historial completo. Default: 2000.

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.

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
}
CampoSignificado
candidateCount, matchCount, totalFoundConversaciones únicas recuperadas dentro de la ventana de candidatos después de deduplicar.
totalRelationexact sólo para una búsqueda léxica no truncada; lower_bound para resultados híbridos, semánticos o truncados.
truncatedtrue indica que un motor o la fusión alcanzó su límite; puede haber más coincidencias fuera de la ventana.
returnedCountElementos incluidos en results; es 0 cuando include_results es false.
warningsAvisos 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.