Cordex
CRM de WhatsApp en tu asistente de IA: clasifica conversaciones, gestiona contactos y negocios, planifica campañas, automatizaciones e informes en Cordex. MCP remoto con OAuth.
Servidor MCP alojado
npx add-mcp 'https://app.cordex.ai/api/mcp'Se instala en Claude Code, Codex, Cursor y más
Documentación
URL del servidor
https://app.cordex.ai/api/mcp
Transporte Streamable HTTP. Autenticación OAuth 2.1 con PKCE, con registro dinámico de cliente (DCR) o Client ID Metadata Document (CIMD).
Lo que necesitas
Una cuenta en Cordex (crea una en app.cordex.ai/signup) y un asistente que acepte conectores MCP remotos.
Cómo conectarse
Claude (claude.ai, Desktop y mobile)
Abre Configuración › Conectores, busca "Cordex" en el directorio o haz clic en Agregar conector personalizado y pega https://app.cordex.ai/api/mcp.. Haz clic en Conectar, inicia sesión en Cordex, elige la empresa y aprueba los permisos.
ChatGPT
Busca "Cordex" en las apps de ChatGPT. Mientras la app no aparezca para ti, activa el modo desarrollador en Configuración › Apps, crea una app con la URL https://app.cordex.ai/api/mcp,, elige OAuth y aprueba los permisos en la ventana de Cordex.
Claude Code
Ejecuta el comando a continuación y, dentro de Claude Code, usa /mcp para autenticarte mediante el navegador.
claude mcp add --transport http cordex https://app.cordex.ai/api/mcp
Cursor y VS Code
Agrega el servidor a mcp.json. El editor abre el navegador para el inicio de sesión OAuth en la primera llamada.
{
"mcpServers": {
"cordex": {
"url": "https://app.cordex.ai/api/mcp"
}
}
}
Grok
En grok.com/connectors, haz clic en Nuevo conector › Personalizado, pega https://app.cordex.ai/api/mcp y completa la autorización.
Mistral Le Chat
En Conectores › Agregar conector › Conector MCP personalizado, pega https://app.cordex.ai/api/mcp y elige OAuth.
Perplexity
En Configuración › Conectores › Agregar conector personalizado, pega https://app.cordex.ai/api/mcp y autoriza.
Otros clientes (clave de API)
Los clientes sin OAuth pueden usar una clave de API creada en Configuración › API y MCP, enviada en el encabezado Authorization: Bearer cdx_….
Permisos
En la pantalla de consentimiento puedes elegir acceso total o, por módulo, solo lectura o lectura y modificación. Las herramientas que solo leen datos están marcadas como de solo lectura; las que eliminan o cancelan algo están marcadas como destructivas, y el asistente pide confirmación antes de usarlas.
Herramientas disponibles
233 herramientas en 12 módulos. Organización · 5 de lectura · 4 de modificación
integrations_list— Listar integraciones dentro de la organización actual.integrations_overview— Listar las conexiones de integración de la organización con cuántos agentes usan cada una.integrations_upsert— Crear o actualizar un registro de conexión de integración de una organización; OAuth se maneja por separado.members_invite— Invitar a un administrador a la organización actual por correo electrónico.members_list— Listar miembros dentro de la organización actual.members_remove— Eliminar a un miembro actual de la organización, conservando al menos un administrador.org_get— Obtener la organización dentro de la organización actual.org_update— Actualizar la organización dentro de la organización actual.usage_summary— Uso de IA de solo lectura de la organización: solicitudes, tokens y costo en USD sumados por mes, fuente y modelo. Contactos · 6 de lectura · 8 de modificacióncontacts_create— Crear contactos dentro de la organización actual.contacts_delete— Eliminar un contacto y sus conversaciones; sus negocios se conservan sin contacto.contacts_deleteMatching— Eliminar todos los contactos que coincidan con el filtro contacts.overview (consulta, plataforma, etiquetas; ninguno = todos los contactos) excepto excludeIds, como contacts.delete: sus conversaciones se eliminan y sus negocios se conservan sin contacto. Máximo 5000 por llamada. expectedCount (el número que la persona confirmó) hace que la llamada falle cuando la coincidencia cambió.contacts_duplicates— Encontrar grupos de contactos que parecen ser la misma persona (mismo correo electrónico, dígitos de teléfono o número de WhatsApp).contacts_get— Obtener contactos dentro de la organización actual.contacts_identities_add— Vincular un contacto a una identidad de canal en la organización actual.contacts_identities_remove— Eliminar una identidad de canal de un contacto en la organización actual.contacts_list— Listar contactos dentro de la organización actual.contacts_merge— Mover atómicamente identidades, conversaciones y negocios del contacto de origen al destino, y luego eliminar el origen.contacts_overview— Paginar contactos para pantallas: texto de búsqueda, filtro de plataforma de canal, etiquetas (contactos con cualquiera de ellas), orden, identidades, negocios abiertos y última actividad, más el total.contacts_search— Buscar contactos por nombre, correo electrónico o teléfono dentro de la organización actual.contacts_setCampaignOptOut— Marcar si un contacto recibe campañas. Los contactos que responden SAIR/PARAR/STOP a una campaña se excluyen automáticamente; optedOut:false les permite recibir campañas nuevamente.contacts_tags— Listar las etiquetas usadas en los contactos de esta organización con cuántos contactos llevan cada una, las más usadas primero.contacts_update— Actualizar contactos dentro de la organización actual. CRM · 12 de lectura · 20 de modificacióncustom_fields_create— Crear campos personalizados dentro de la organización actual.custom_fields_delete— Eliminar una definición de campo personalizado y quitar sus valores almacenados de contactos o negocios.custom_fields_get— Obtener campos personalizados dentro de la organización actual.custom_fields_list— Listar campos personalizados dentro de la organización actual.custom_fields_update— Actualizar campos personalizados dentro de la organización actual.deal_views_create— Guardar una vista de los negocios de un pipeline para el usuario actual (shared: true la muestra a toda la organización). Ábrela en /crm?pipeline=<pipelineId>&view=<id>. config = {layout: kanban|table|calendar, filter: {match: all|any, rules: [{field, op, value?}]}, sort: [{field, dir: asc|desc}] (máx. 3, en orden de prioridad), cardFields: [field] (tarjeta kanban, en orden), columns: [{field, width?}] (tabla, en orden), calendar: {dateField, span: month|week}}; las claves omitidas conservan sus valores predeterminados. field = title|stage|value|owner|contact|expectedCloseDate|createdAt|updatedAt o custom.<key> de un campo personalizado de negocio; el título siempre se muestra, así que déjalo fuera de cardFields y columns. op por tipo de campo: text (title, contact, custom text) contains|notContains|is|empty|notEmpty; number (value en reales, custom number) eq|gt|lt|between [a,b]|empty|notEmpty; date (expectedCloseDate, createdAt, updatedAt, custom date) relative (today|thisWeek|thisMonth|overdue|next7|next30)|before|after (YYYY-MM-DD)|between [from,to]|empty|notEmpty; stage anyOf|noneOf [ids de etapas de este pipeline]; owner anyOf|noneOf [ids de usuarios o "me"]|empty|notEmpty; select anyOf|noneOf [opciones]|empty|notEmpty; multiselect hasAny|hasAll|hasNone [opciones]|empty|notEmpty; boolean isTrue|isFalse. Todos los operadores: contains, notContains, is, eq, gt, lt, between, before, after, relative, anyOf, noneOf, hasAny, hasAll, hasNone, isTrue, isFalse, empty, notEmpty.deal_views_delete— Eliminar una vista de negocio guardada que el usuario actual creó.deal_views_get— Obtener una vista de negocio guardada que el usuario actual puede usar.deal_views_list— Listar las vistas de negocio guardadas de un pipeline que el usuario actual puede usar: las propias en orden de pestañas, luego las compartidas de colegas.deal_views_reorder— Reordenar las pestañas de vistas de negocio propias del usuario actual de un pipeline; los ids deben contener cada una de sus vistas exactamente una vez.deal_views_update— Cambiar una vista de negocio guardada que el usuario actual creó: nombre, shared o config (las claves de config de nivel superior dadas reemplazan las almacenadas; el resto se conserva). config = {layout: kanban|table|calendar, filter: {match: all|any, rules: [{field, op, value?}]}, sort: [{field, dir: asc|desc}] (máx. 3, en orden de prioridad), cardFields: [field] (tarjeta kanban, en orden), columns: [{field, width?}] (tabla, en orden), calendar: {dateField, span: month|week}}; las claves omitidas conservan sus valores predeterminados. field = title|stage|value|owner|contact|expectedCloseDate|createdAt|updatedAt o custom.<key> de un campo personalizado de negocio; el título siempre se muestra, así que déjalo fuera de cardFields y columns. op por tipo de campo: text (title, contact, custom text) contains|notContains|is|empty|notEmpty; number (value en reales, custom number) eq|gt|lt|between [a,b]|empty|notEmpty; date (expectedCloseDate, createdAt, updatedAt, custom date) relative (today|thisWeek|thisMonth|overdue|next7|next30)|before|after (YYYY-MM-DD)|between [from,to]|empty|notEmpty; stage anyOf|noneOf [ids de etapas de este pipeline]; owner anyOf|noneOf [ids de usuarios o "me"]|empty|notEmpty; select anyOf|noneOf [opciones]|empty|notEmpty; multiselect hasAny|hasAll|hasNone [opciones]|empty|notEmpty; boolean isTrue|isFalse. Todos los operadores: contains, notContains, is, eq, gt, lt, between, before, after, relative, anyOf, noneOf, hasAny, hasAll, hasNone, isTrue, isFalse, empty, notEmpty.deals_create— Crear negocios dentro de la organización actual.deals_delete— Eliminar negocios dentro de la organización actual.deals_get— Obtener negocios dentro de la organización actual.deals_history— Listar las últimas 500 entradas del registro de actividad de un negocio, las más antiguas primero: sus propios eventos de creación/actualización/movimiento (cada salida es el negocio completo después del cambio) y conversation.created para su contacto actual. Se conserva durante 90 días.deals_list— Listar negocios dentro de la organización actual.deals_move— Mover un negocio a una etapa que pertenezca al mismo pipeline.deals_overview— Listar negocios con su contacto para pantallas, filtrados por id, pipeline, etapa, propietario, contacto o texto.deals_update— Actualizar negocios dentro de la organización actual.pipelines_configure— Configurar un pipeline que aún no tiene negocios en un solo paso: nombre nuevo opcional y la lista ordenada completa de etapas (reemplaza todas las etapas actuales). Necesita al menos una etapa abierta y una ganada. Se rechaza cuando el pipeline tiene negocios o una automatización, flujo o vista guardada apunta a sus etapas; edita las etapas una por una entonces.pipelines_create— Crear pipelines dentro de la organización actual.pipelines_delete— Eliminar un pipeline con sus etapas y negocios.pipelines_ensureDefault— Crear el pipeline de ventas predeterminado cuando la organización no tiene ninguno; devuelve los pipelines.pipelines_get— Obtener pipelines dentro de la organización actual.pipelines_list— Listar pipelines dentro de la organización actual.pipelines_update— Actualizar pipelines dentro de la organización actual.stages_create— Crear una etapa; sin una posición, se agrega después de la última etapa del pipeline.stages_delete— Eliminar una etapa; cuando aún tiene negocios, moveDealsTo debe nombrar otra etapa del mismo pipeline.stages_get— Obtener etapas dentro de la organización actual.stages_list— Listar etapas dentro de la organización actual.stages_reorder— Reordenar todas las etapas de un pipeline; los ids deben contener cada etapa exactamente una vez.stages_update— Actualizar etapas dentro de la organización actual. Agentes · 11 de lectura · 21 de modificaciónagents_create— Crear agentes dentro de la organización actual.agents_delete— Eliminar un agente; las bandejas de entrada que maneja vuelven a no tener manejador y sus conversaciones a no tener asignado.agents_get— Obtener agentes dentro de la organización actual.agents_integrations_attach— Adjuntar integraciones de agentes dentro de la organización actual.agents_integrations_detach— Desadjuntar integraciones de agentes dentro de la organización actual.agents_knowledge_attach— Adjuntar una base de conocimiento a un agente: desde su próxima respuesta, el agente la busca (herramienta search_knowledge) antes de responder preguntas que los documentos cubren, y cita documento y página.agents_knowledge_detach— Desadjuntar una base de conocimiento de un agente; la base y sus documentos permanecen.agents_list— Listar agentes dentro de la organización actual.agents_skills_attach— Adjuntar habilidades de agentes dentro de la organización actual.agents_skills_detach— Desadjuntar habilidades de agentes dentro de la organización actual.agents_update— Actualizar agentes dentro de la organización actual.agents_usage— Listar las bandejas de entrada manejadas por un agente y contar las conversaciones asignadas a él, antes de eliminarlo.knowledge_bases_create— Crear una base de conocimiento: una biblioteca con nombre de documentos (manuales, políticas, preguntas frecuentes) que los agentes pueden buscar. Luego agrega archivos (knowledge.sources.addFile) o páginas web (knowledge.sources.addUrl) y adjúntala a agentes con agents.knowledge.attach.knowledge_bases_delete— Eliminar una base de conocimiento con todas sus fuentes y pasajes, y desadjuntarla de cada agente.knowledge_bases_get— Obtener una base de conocimiento con sus recuentos de fuentes y los agentes a los que está adjunta.knowledge_bases_list— Listar las bases de conocimiento de la organización con cuántas fuentes tiene cada una y cuántas están listas, en procesamiento o fallidas. Los agentes buscan las bases adjuntas a ellos (agents.knowledge.attach).knowledge_bases_update— Renombrar una base de conocimiento o cambiar su descripción.knowledge_search— Buscar bases de conocimiento como lo hace un agente: búsqueda híbrida (significado más palabras exactas como modelos de producto y códigos de error) sobre la base dada, o sobre cada base adjunta al agente dado. Devuelve los mejores pasajes con título de documento, página y URL.knowledge_sources_addUrl— Agregar una página web pública o un PDF vinculado (hasta 50 MB, páginas escaneadas incluidas), o cada página de un sitemap.xml (hasta 200 páginas del mismo sitio), a una base de conocimiento. Solo se obtienen direcciones https públicas; la fuente se vuelve buscable cuando su estado es ready. Usa knowledge.sources.resync para obtenerla nuevamente más tarde.knowledge_sources_delete— Eliminar una fuente de conocimiento y sus pasajes; los agentes dejan de encontrarla inmediatamente.knowledge_sources_get— Obtener una fuente de conocimiento con su estado, recuentos de páginas y pasajes, modelos de producto detectados y resumen.knowledge_sources_list— Listar las fuentes (archivos, páginas, sitemaps) de una base de conocimiento con su estado de procesamiento: pending y processing aún se están leyendo, ready son buscables, failed llevan el error.knowledge_sources_resync— Leer una fuente de conocimiento nuevamente (obtener la página o el sitemap de nuevo, o reprocesar un archivo), por ejemplo después de un fallo o cuando el sitio cambió.skills_create— Crear una habilidad privada: un nombre, una descripción corta de cuándo un agente debería usarla y un cuerpo en Markdown con las instrucciones. Adjúntala a un agente con agents.skills.attach.skills_delete— Eliminar una habilidad privada y desadjuntarla de cada agente que la usa.skills_get— Obtén una habilidad privada con su cuerpo en Markdown y si su instantánea publicada en el marketplace está desactualizada (publicationDirty).skills_install— Copia una instantánea publicada en el marketplace a la biblioteca de habilidades privadas de la organización actual.skills_list— Lista las habilidades privadas de esta organización: instrucciones reutilizables en Markdown (nombre, descripción, cuerpo) que los agentes de IA siguen una vez que se adjunta una habilidad con agents.skills.attach.skills_marketplace_list— Lista las instantáneas de habilidades públicas explícitamente publicadas entre organizaciones.skills_publish— Publica una instantánea pública explícita en el marketplace de una habilidad privada; las ediciones privadas posteriores permanecen privadas.skills_unpublish— Despublica habilidades dentro de la organización actual.skills_update— Cambia el nombre, la descripción o el cuerpo en Markdown de una habilidad privada. Los agentes que la usan siguen el nuevo texto desde su próxima respuesta; una instantánea publicada en el marketplace solo cambia con skills.publish. Flujos · 2 de lectura · 8 de modificaciónflows_create— Crea flujos dentro de la organización actual.flows_delete— Elimina flujos dentro de la organización actual.flows_get— Obtén flujos dentro de la organización actual.flows_list— Lista flujos dentro de la organización actual.flows_publish— Publica el borrador actual como una nueva versión de flujo inmutable y actívalo.flows_run_skipWait— skipWait ejecuta flujos dentro de la organización actual.flows_run_start— Inicia un flujo publicado en una conversación desde su nodo inicial, reemplazando cualquier flujo en ejecución; restart=true también reinicia el mismo flujo.flows_run_stop— Detén el flujo que se ejecuta en una conversación; el usuario que lo detiene se convierte en el asignado para que el bot no se reanude.flows_saveDraft— Guarda un gráfico de flujo como borrador sin cambiar las versiones publicadas; flows.publish lo valida. Gráfico: {nodes:[{id,type,position:{x,y},data}], edges:[{id,source,target,sourceHandle?}]}. Datos de nodo por tipo: start {}; message {text} (admite {{contact.firstName}}, {{contact.name}} y {{var}} capturado); question {text, buttons:[{id,label<=20 chars}] (max 3), saveAs?}; agent {agentId, goal, variables:[{name,description?}], exits:[{id,label,when}], maxTurns}; condition {branches:[{id,label,variable,operator:equals|not_equals|contains|gt|lt|is_set,value?}], elseLabel}; action {kind, label, params} with string params (they accept {{var}}): set_variable {name,value}; add_tag {tag}; update_contact_field {field: name|email|phone|<custom field key>, value}; create_deal {pipeline, stage, title?, valueCents?}; move_deal {stage, pipeline?} (mueve el trato del contacto en el pipeline de esa etapa); handoff {target:human|copilot, userId?, message?}; end {outcome:resolved|abandoned|converted}. Bordes: exactamente un inicio; start/message/action necesitan un borde predeterminado (sin sourceHandle); los bordes de question usan sourceHandle=id de botón, on_invalid o on_timeout; los bordes de agent usan id de salida y un 'fallback' requerido; los bordes de condition usan id de rama y 'else'; end/handoff no tienen bordes salientes.flows_update— Actualiza flujos dentro de la organización actual. Canales · 18 de lectura · 16 de modificaciónchannels_abandon— Cancela una conexión que el usuario inició y no ha terminado: desconéctala y luego elimínala localmente.channels_configureWebhook— Habilita el webhook de Cordex en una sesión de WhatsApp propia o restaura su configuración original guardada.channels_connectComplete— Completa una acción de conexión descrita por esquema para un canal pendiente propio.channels_connectOptions— Lista opciones seguras para una conexión pendiente propia.channels_connectStart— Inicia una nueva conexión de canal de Cordex.channels_delete— Elimina canales dentro de la organización actual.channels_disconnect— Desconecta un canal de Cordex propio.channels_get— Obtén canales dentro de la organización actual.channels_groups_list— Lista los grupos de WhatsApp de un canal de WhatsApp QR propio, incluidos nombres y recuentos de participantes, para configurar los grupos de bandeja de entrada permitidos. Solo lectura.channels_importExisting— Importa una cuenta conectada autorizada por un operador sin mover su perfil.channels_list— Lista canales dentro de la organización actual.channels_messagingLimit— Límite de mensajería de Meta para un canal oficial de WhatsApp: nivel (el más alto de la organización), límite (destinatarios únicos iniciados por la empresa por 24 horas móviles, null cuando es ilimitado), presupuesto (90% de eso, lo que usan las campañas), usado (destinatarios contados ahora, plantillas manuales incluidas), oldestAt (cuando el destinatario contado más antiguo libera un espacio), calificación de calidad y cuándo se leyó el nivel (actualizado después de 6h). Solo lectura.channels_numbers_search— Lee los números de teléfono y precios disponibles.channels_numbers_unconnected— Lee los números que esta organización compró y que ninguna cuenta de WhatsApp usa aún. Solo lectura.channels_permissions_status— Si un canal de Instagram o Facebook fue autorizado para comentarios y mensajes Direct;missing\lista las áreas para otorgar al reconectar. Solo lectura.channels_qr— qr para un canal de Cordex propio.channels_removalImpact— Cuenta las conversaciones y mensajes que eliminaría la eliminación de un canal propio.channels_remove— Elimina localmente un canal desconectado con su bandeja de entrada, conversaciones y mensajes; los contactos y tratos permanecen y la cuenta del proveedor no se toca.channels_status— estado para un canal de Cordex propio.channels_templates_create— Envía una nueva plantilla de WhatsApp para revisión (componentes personalizados) o crea una plantilla de biblioteca preaprobada (libraryTemplateName; omite componentes). Los encabezados multimedia toman solo una URL https pública, en example.header_handle. Las variables {{1}}.. o {{name}} necesitan ejemplos. Carousel y limited_time_offer son solo MARKETING; los botones otp solo AUTHENTICATION.channels_templates_delete— Elimina una plantilla, irreversible: el nombre está bloqueado durante 30 días. Pasa language para eliminar una variante, o allLanguages true para eliminar cada variante.channels_templates_get— Obtén una variante de plantilla con sus componentes, rejectedReason y calidad. Pasa language cuando el nombre tiene varias variantes. Solo lectura.channels_templates_library— Busca una plantilla de biblioteca de WhatsApp preaprobada por nombre exacto para previsualizar su cuerpo, parámetros y botones antes de crearla. Solo lectura.channels_templates_list— Lista las plantillas de mensajes de WhatsApp de un canal oficial de WhatsApp propio con estado, categoría, idioma y una vista previa del cuerpo. El estado cambia asincrónicamente (PENDING a APPROVED o REJECTED); llama de nuevo para actualizar. Solo lectura.channels_templates_update— Edita una variante de plantilla APPROVED, REJECTED o PAUSED. Las ediciones de componentes la envían de vuelta a revisión; el nombre, el idioma y la categoría no pueden cambiar; las plantillas aprobadas se pueden editar una vez cada 24h.channels_update— Actualiza canales dentro de la organización actual.channels_whatsappFlows_list— Lista los Flows de WhatsApp de un canal oficial de WhatsApp propio, para adjuntar uno a un botón de flujo de plantilla. Solo lectura.comments_reply— Responde públicamente bajo un comentario de Instagram o Facebook (comment.received); todos los que ven la publicación ven la respuesta.comments_replyPrivately— Envía un mensaje Direct al autor de un comentario de Instagram o Facebook (comment.received). Meta permite una respuesta privada por comentario, dentro de los 7 días posteriores. Los botones opcionales (1-3) son {type:'postback',title,payload} o {type:'web_url',title,url}.inboxes_create— Crea una bandeja de entrada para un canal en esta organización. Una bandeja de entrada por canal; allowedGroupIds selecciona hasta 50 ids de grupos de WhatsApp (...@g.us), predeterminado vacío (sin grupos); groupsAll permite que todos los grupos entren, incluidos los futuros; groupMentionOnly hace que el manejador responda en grupos solo cuando el número es @mencionado o se le responde.inboxes_get— Obtén bandejas de entrada dentro de la organización actual.inboxes_list— Lista bandejas de entrada dentro de la organización actual.inboxes_update— Actualiza el enrutamiento/configuración de la bandeja de entrada. allowedGroupIds selecciona hasta 50 ids de grupos de WhatsApp (...@g.us); [] deshabilita grupos a menos que groupsAll; omitirlo preserva la selección. groupsAll=true permite que todos los grupos entren, incluidos los futuros. groupMentionOnly=true hace que el manejador responda en grupos solo cuando el número es @mencionado o se le responde; otros mensajes de grupo permanecen como contexto. Los grupos usan el manejador propio de la bandeja de entrada. Usa channels.groups.list para descubrir grupos.posts_list— Lista las publicaciones más recientes (25 por cuenta, más nuevas primero) de los canales de Instagram y Facebook conectados de la organización, incluidas las publicaciones sin comentarios.id\es el id de publicación de la plataforma que comment.received lleva como postId.search\filtra por subtítulo. Solo lectura. Conversaciones · 7 de lectura · 10 de modificaciónconversations_assign— Asigna una conversación a un miembro actual, un agente de la organización, el copiloto o sin asignado. Asignar a alguien mientras un flujo se ejecuta detiene ese flujo.conversations_filter— Filtra conversaciones como la pantalla de bandeja de entrada, en toda la organización, actividad más reciente primero. Devuelve { items, total }; items tienen la forma conversations.overview. tab: mine (asignado al llamante) | unassigned | all | bots (agente, copiloto o un flujo en ejecución). channelId y status son los filtros rápidos. filter: { match: all|any, rules: [{ field, op, value }] }, máximo 20 reglas, combinadas con los filtros rápidos por AND. Campos y ops: messageText (cualquier mensaje visible, 3-200 caracteres) y contact (nombre, teléfono o correo) contains|notContains; assignee anyOf|noneOf [user:<id> | agent:<id> | flow:<id> | copilot | none]; channel anyOf|noneOf [ids de canal]; status anyOf|noneOf [open|pending|snoozed|resolved]; campaign anyOf|noneOf [ids de campaña]; createdAt, lastMessageAt, lastInboundAt (último mensaje del cliente) relative (today|yesterday|last7|last30|thisMonth|lastMonth)|before|after (YYYY-MM-DD)|between [from,to] inclusivo, como días en timeZone; las conversaciones sin esa actividad nunca coinciden con fechas; tags (etiquetas de contacto) hasAny|hasAll|hasNone [tags]; awaitingReply (el cliente habló por última vez, no resuelto) y isTest isTrue|isFalse. timeZone es una zona IANA como America/Sao_Paulo.conversations_get— Obtén conversaciones dentro de la organización actual.conversations_list— Lista conversaciones dentro de la organización actual.conversations_messagingWindow— Si se pueden enviar mensajes de formato libre: WhatsApp oficial solo los permite dentro de las 24h del último mensaje del contacto; de lo contrario, usa messages.sendTemplate. Solo lectura.conversations_overview— Lista conversaciones con contacto, bandeja de entrada, canal y último mensaje. lastMessageBefore/After filtra cualquier actividad de mensaje visible; lastInboundBefore significa que el cliente ha estado en silencio desde esa marca de tiempo ISO, y lastInboundAfter selecciona actividad reciente del cliente. Las marcas de tiempo de actividad nulas nunca coinciden con estos filtros.conversations_setFlowStep— Establece una conversación en un nodo existente de una versión de flujo publicada y opcionalmente actualiza variables.conversations_setStatus— Establece el estado de una conversación a open, pending, snoozed o resolved.conversations_startWithTemplate— Inicia (o continúa) una conversación oficial de WhatsApp con un contacto enviando una plantilla APPROVED. Da contactId, o phone en formato internacional con un + inicial (p. ej. +5511999990000). Devuelve conversationId; la respuesta llega en la misma conversación. Mismos parámetros que messages.sendTemplate.conversations_startWithText— Inicia (o continúa) una conversación de WhatsApp en un canal de WhatsApp conectado por QR enviando un mensaje de texto libre; los canales oficiales de WhatsApp necesitan conversations.startWithTemplate en su lugar. Da contactId, o phone en formato internacional con un + inicial (p. ej. +5511999990000); el número debe estar en WhatsApp. Devuelve conversationId; la respuesta llega en la misma conversación.messages_list— Lista mensajes de una conversación. latest:true devuelve la página más reciente en orden cronológico; includeId la extiende hacia atrás hasta ese mensaje (más algo de contexto), hasta 1000 mensajes.messages_retry— reintenta mensajes dentro de la organización actual.messages_search— Busca texto de mensajes en todas las conversaciones de esta organización (subcadena sin distinción de mayúsculas/minúsculas, al menos 3 caracteres), más reciente primero. Filtros opcionales de channelId y estado de conversación. Devuelve messageId, conversationId, text, createdAt, contact y channel.messages_send— Persiste un mensaje saliente, luego pone en cola la entrega después del commit de la base de datos; los mensajes pendientes sobreviven a fallos de cola.messages_sendTemplate— Envía una plantilla de WhatsApp APROBADA en una conversación oficial de WhatsApp existente; funciona cuando la ventana de 24 h está cerrada. headerParams/bodyParams son valores en orden de aparición (un objeto con clave por nombre de variable para plantillas nombradas); buttonParams rellenan sufijos de URL dinámicos, cupones copy_code y tokens de flujo por índice de botón; headerMedia sobrescribe el medio aprobado (solo URL https pública); headerLocation es obligatorio para encabezados de ubicación. La plantilla se verifica contra la activa antes de ponerse en cola.web_sessions_create— Crea una conversación de prueba con un agente o flujo en el canal Web.web_sessions_send— Habla como el cliente en una sesión de prueba Web existente; se enruta por el procesamiento normal de entrada. Automatizaciones · 6 de lectura · 6 de escrituraautomations_catalog— Descubre nombres de eventos de automatización, operaciones, operadores de reglas, variables, límites y zona horaria de la organización. Llámalo antes de crear una automatización. Proporciona operation para obtener el esquema JSON de entrada de esa operación.automations_create— Crea una automatización (Cuando → Si → Entonces). Revisa automations.templates primero y prefiere automations.createFromTemplate si una plantilla encaja; de lo contrario, llama a automations.catalog primero. Disparador: evento (cualquier nombre de operación que cambie datos, o message.received / conversation.created / contact.created / comment.received), programación (cron de 5 campos en la zona horaria de la organización, con forEach opcional sobre una operación de lista) o manual. Pasos: operación (cualquier operación del registro; el JSON de entrada acepta {{variables}}) o espera (duración como 1h, 3d). Opcional por paso: if (reglas), onFalse skip|stop, once (clave de plantilla). Se crea deshabilitada a menos que enabled:true. once ejecuta un paso como máximo una vez por clave en todas las ejecuciones; trigger.dedupe evita ejecuciones duplicadas por clave; trigger.when filtra datos inmutables de disparador/ítem antes de crear la ejecución.automations_createFromTemplate— Instala una plantilla del marketplace (ver automations.templates) como automatización. fill mapea claves de ranura a valores: resuelve IDs reales con herramientas de lectura primero; los textos son cuerpos de mensaje. Las ranuras automáticas de pipeline/etapa se mantienen consistentes: una stageId dada trae su pipeline, una pipelineId dada su primera etapa, ninguna el pipeline predeterminado y su primera etapa. name y prompt usan los localizados por defecto; prompt solo lo aceptan plantillas de IA. Se crea deshabilitada a menos que enabled:true, lo que requiere que toda ranura no automática esté llena. Ajústala después con automations.update.automations_delete— Elimina una automatización y en cascada sus ejecuciones y marcas once.automations_get— Obtén la definición de una automatización, estado de activación, última ejecución y estadísticas de ejecución de siete días por ID.automations_list— Lista las automatizaciones de esta organización, opcionalmente filtrando por habilitadas; incluye última ejecución y totales de siete días: completadas y fallidas.automations_run— Ejecuta manualmente una automatización, incluidas las deshabilitadas, con payload de disparador, ítem y marcador isTest opcionales. Omite trigger.when; el if/once de pasos y la deduplicación de disparador aún aplican. La ejecución se pone en cola tras el commit; revisa automations.runs.get para resultados.automations_runs_get— Obtén la instantánea completa de definición de una ejecución, variables, registro de pasos, error y tiempos de ejecución por ID de ejecución.automations_runs_list— Lista ejecuciones de automatización de más reciente a más antigua, opcionalmente filtrando por automationId, status e isTest. Incluye nombre de automatización y payload de disparador; usa runs.get para registro completo e instantánea.automations_setEnabled— Habilita o deshabilita una automatización. Habilitar desde deshabilitada reinicia el estado de programación y activa desde ahora. Deshabilitar cancela ejecuciones pendientes y en espera en la misma transacción.automations_templates— Lista el marketplace curado de automatizaciones (plantillas listas) en un idioma (pt-BR por defecto, en, es), opcionalmente por categoría o texto libre. Cada ítem tiene key, category, title, description, needsInput, slots (lo que aún debe llenarse: IDs de pipeline/etapa/flujo/agente/usuario, nombre de plantilla de WhatsApp aprobada, textos de mensaje o una palabra clave) y la definición completa. Revísalo antes de construir una automatización desde cero e instala una que encaje con automations.createFromTemplate.automations_update— Actualiza name, trigger o steps proporcionados de una automatización; las secciones omitidas se conservan y la definición combinada completa se valida. Cambiar el tipo de disparador reinicia el estado de programación. Las ejecuciones existentes conservan su instantánea de definición original. Relatórios · 5 de lectura · 7 de escriturareports_catalog— Descubre qué pueden medir los Relatórios (informes): fuentes (conversations, messages, deals, contacts, ads) con sus campos, tipos, agregaciones permitidas y operadores de filtro (incluidos los campos personalizados de esta organización como custom.<key>), períodos, buckets, presets listos, plantillas de tablero y la zona horaria de la organización. Llámalo antes de construir una consulta o tablero.reports_dashboards_create— Crea un tablero para el usuario actual (shared: true lo muestra a toda la organización, de solo lectura para otros). Comienza desde una plantilla (anuncios, atendimento, vendas, contatos) o da una config; locale (pt-BR por defecto, en, es) define el idioma de los títulos de widgets de una plantilla; sin ninguno, comienza vacío. Ábrelo en /reports/<id>. config = {filters: {period, channelIds, assigneeIds, pipelineIds, networks (solo fuente ads: meta|google|tiktok|linkedin|pinterest|x|reddit|openai)}, widgets: [{id, title, viz: kpi|line|bar|area|pie|donut|table|funnel, query, layout: {x 0-11, y, w 1-12, h 1-12} en una cuadrícula de 12 columnas, options: {compare: none|previousPeriod, format: number|currency|duration|percent, stacked?, colors?}}]} (máx. 30 widgets). Los widgets KPI son w 3 h 2, los gráficos w 6 h 4. Las configuraciones inválidas devuelven problemas con rutas como widgets.0.query.measures.0.field.reports_dashboards_delete— Elimina un tablero que el usuario actual posee, con todos sus widgets. Los tableros compartidos de colegas no se pueden eliminar; esto no se puede deshacer.reports_dashboards_duplicate— Copia un tablero que el usuario actual puede ver (propio o compartido) a un nuevo tablero privado que posee. La copia se llama "<name> (cópia)" a menos que se dé name (locale en/es cambia el sufijo a "(copy)"/"(copia)").reports_dashboards_get— Obtén un tablero (con su config) que el usuario actual posee o que se le ha compartido.reports_dashboards_list— Lista los tableros que el usuario actual puede usar: primero los propios (por posición), luego los compartidos de colegas. Cada uno tiene id, name, shared, position, ownerId y config.reports_dashboards_update— Cambia un tablero que el usuario actual posee: name, shared, position (orden de pestañas) o config (una config dada reemplaza la almacenada; usa reports.widgets.* para editar widgets individuales). config = {filters: {period, channelIds, assigneeIds, pipelineIds, networks (solo fuente ads: meta|google|tiktok|linkedin|pinterest|x|reddit|openai)}, widgets: [{id, title, viz: kpi|line|bar|area|pie|donut|table|funnel, query, layout: {x 0-11, y, w 1-12, h 1-12} en una cuadrícula de 12 columnas, options: {compare: none|previousPeriod, format: number|currency|duration|percent, stacked?, colors?}}]} (máx. 30 widgets). Los widgets KPI son w 3 h 2, los gráficos w 6 h 4.reports_query— Ejecuta un informe y devuelve {columns, rows, truncated, period, previous?, labels?}. Las columnas son g0.. (grupos) y luego m0.. (medidas); labels mapea IDs de asignado/propietario a nombres. Solo lectura. Da una query o un preset, opcionalmente con filtros estilo tablero {period, channelIds, assigneeIds, pipelineIds, networks} (period anula el rango de la consulta) y compare: true para también obtener filas del período anterior. Una query = {source: conversations|messages|deals|contacts|ads, measures: [{agg: count|sum|avg|median|min|max|distinct, field?}] (1-6; field obligatorio excepto para count), groupBy?: [{field, bucket?: day|week|month|quarter|year}] (máx. 2, bucket solo en campos de fecha), filters?: [{field, op, value?}], period: {field?, range}, sort?: {by: m0..m5|g0|g1, dir}, limit?: 1-500, includeTest?: boolean}. range = today|yesterday|last7|last30|last90|thisWeek|thisMonth|thisQuarter|thisYear|lastMonth o {from: YYYY-MM-DD, to: YYYY-MM-DD}; period.field usa por defecto la fecha de creación de la fuente (usa closedAt para deals cerrados en el período, resolvedAt para conversaciones resueltas). ads = hechos de anuncios (métricas por anuncio por día, conversaciones y deals atribuidos, leads de plataforma): agrupa por network, account, campaign, adSet, ad, currency, date; suma spend/impressions/reach/clicks/conversions/conversionValue/platformLeads/messagingStarted/conversations/leads/deals/won/revenue; promedio ctr/cpc/cpm/cpaReal/roasReal/roasPlatform (razón de sumas); count necesita un campo. Las medidas de dinero se dividen por moneda (se agrega un grupo de moneda); revenue es BRL; roasReal usa solo cuentas BRL; roasReal y cpaReal cuentan solo deals ganados cuyo primer contacto tiene una campaña de anuncios conocida, por lo que pueden ser menores que los totales de won/revenue. reach es una suma de alcance diario, no personas únicas. Los gráficos de dinero de anuncios soportan una medida (usa una tabla para varias); conversations/leads/deals/won no se pueden filtrar. Las métricas de plataforma faltantes son null, no 0. Filtra un informe de anuncios por red con filters.networks. Los campos, agregaciones y operadores por fuente vienen de reports.catalog: llámalo primero. preset = uno de: conv.volume, conv.byChannel, conv.byAssignee, conv.byStatus, conv.frt.median, conv.resolution.avg, msgs.volume, deals.wonValue, deals.winRate, deals.funnel, deals.byOwner, contacts.new, contacts.byTag, ads.spend, ads.spendByDay, ads.funnelByNetwork, ads.roasByNetwork, ads.topAds, ads.conversations.reports_records— Profundiza en los registros (hasta 50: id, title, subtitle, createdAt, href) detrás de un informe, opcionalmente limitado a un grupo o bucket de tiempo con bucket: {field, value} (field debe ser uno de los campos groupBy de la consulta; value es el valor de grupo devuelto en rows, p. ej. "2026-03-02" para un día). Solo lectura. Una query = {source: conversations|messages|deals|contacts|ads, measures: [{agg: count|sum|avg|median|min|max|distinct, field?}] (1-6; field obligatorio excepto para count), groupBy?: [{field, bucket?: day|week|month|quarter|year}] (máx. 2, bucket solo en campos de fecha), filters?: [{field, op, value?}], period: {field?, range}, sort?: {by: m0..m5|g0|g1, dir}, limit?: 1-500, includeTest?: boolean}. range = today|yesterday|last7|last30|last90|thisWeek|thisMonth|thisQuarter|thisYear|lastMonth o {from: YYYY-MM-DD, to: YYYY-MM-DD}; period.field usa por defecto la fecha de creación de la fuente (usa closedAt para deals cerrados en el período, resolvedAt para conversaciones resueltas). ads = hechos de anuncios (métricas por anuncio por día, conversaciones y deals atribuidos, leads de plataforma): agrupa por network, account, campaign, adSet, ad, currency, date; suma spend/impressions/reach/clicks/conversions/conversionValue/platformLeads/messagingStarted/conversations/leads/deals/won/revenue; promedio ctr/cpc/cpm/cpaReal/roasReal/roasPlatform (razón de sumas); count necesita un campo. Las medidas de dinero se dividen por moneda (se agrega un grupo de moneda); revenue es BRL; roasReal usa solo cuentas BRL; roasReal y cpaReal cuentan solo deals ganados cuyo primer contacto tiene una campaña de anuncios conocida, por lo que pueden ser menores que los totales de won/revenue. reach es una suma de alcance diario, no personas únicas. Los gráficos de dinero de anuncios soportan una medida (usa una tabla para varias); conversations/leads/deals/won no se pueden filtrar. Las métricas de plataforma faltantes son null, no 0. Filtra un informe de anuncios por red con filters.networks. Los campos, agregaciones y operadores por fuente vienen de reports.catalog: llámalo primero. preset = uno de: conv.volume, conv.byChannel, conv.byAssignee, conv.byStatus, conv.frt.median, conv.resolution.avg, msgs.volume, deals.wonValue, deals.winRate, deals.funnel, deals.byOwner, contacts.new, contacts.byTag, ads.spend, ads.spendByDay, ads.funnelByNetwork, ads.roasByNetwork, ads.topAds, ads.conversations.reports_widgets_add— Agrega un widget a un panel que el usuario actual posee. Proporciona título, viz, consulta y opciones opcionales; el id se genera. Sin diseño, el widget se coloca junto a la última fila cuando cabe en las 12 columnas; de lo contrario, debajo de las existentes en x 0 (tamaño w 6 h 4, o w 3 h 2 para kpi). Devuelve {widgetId, dashboard}. Una consulta = {source: conversations|messages|deals|contacts|ads, measures: [{agg: count|sum|avg|median|min|max|distinct, field?}] (1-6; field es obligatorio excepto para count), groupBy?: [{field, bucket?: day|week|month|quarter|year}] (máx. 2, bucket solo en campos de fecha), filters?: [{field, op, value?}], period: {field?, range}, sort?: {by: m0..m5|g0|g1, dir}, limit?: 1-500, includeTest?: boolean}. range = today|yesterday|last7|last30|last90|thisWeek|thisMonth|thisQuarter|thisYear|lastMonth o {from: YYYY-MM-DD, to: YYYY-MM-DD}; period.field por defecto es la fecha de creación de la fuente (usa closedAt para negocios cerrados en el período, resolvedAt para conversaciones resueltas). ads = hechos de anuncios (métricas por anuncio por día, conversaciones y negocios atribuidos, clientes potenciales de la plataforma): agrupa por network, account, campaign, adSet, ad, currency, date; suma spend/impressions/reach/clicks/conversions/conversionValue/platformLeads/messagingStarted/conversations/leads/deals/won/revenue; promedio ctr/cpc/cpm/cpaReal/roasReal/roasPlatform (proporción de sumas); count necesita un campo. Las medidas monetarias se dividen por moneda (se agrega un grupo de moneda); revenue está en BRL; roasReal usa solo cuentas en BRL; roasReal y cpaReal cuentan solo negocios ganados cuyo primer toque tiene una campaña de anuncios conocida, por lo que pueden ser más bajos que los totales de won/revenue. reach es una suma de alcance diario, no personas únicas. Los gráficos de dinero de anuncios admiten una medida (usa una tabla para varias); conversations/leads/deals/won no se pueden filtrar. Las métricas de plataforma faltantes son null, no 0. Filtra un informe de anuncios por red con filters.networks. Los campos, agregaciones y operadores por fuente provienen de reports.catalog: llámalo primero.reports_widgets_remove— Elimina un widget de un panel que el usuario actual posee. Devuelve el panel.reports_widgets_update— Cambia un widget de un panel que el usuario actual posee. patch puede contener title, viz, query, layout y options (cada clave dada reemplaza la almacenada). Devuelve el panel. Una consulta = {source: conversations|messages|deals|contacts|ads, measures: [{agg: count|sum|avg|median|min|max|distinct, field?}] (1-6; field es obligatorio excepto para count), groupBy?: [{field, bucket?: day|week|month|quarter|year}] (máx. 2, bucket solo en campos de fecha), filters?: [{field, op, value?}], period: {field?, range}, sort?: {by: m0..m5|g0|g1, dir}, limit?: 1-500, includeTest?: boolean}. range = today|yesterday|last7|last30|last90|thisWeek|thisMonth|thisQuarter|thisYear|lastMonth o {from: YYYY-MM-DD, to: YYYY-MM-DD}; period.field por defecto es la fecha de creación de la fuente (usa closedAt para negocios cerrados en el período, resolvedAt para conversaciones resueltas). ads = hechos de anuncios (métricas por anuncio por día, conversaciones y negocios atribuidos, clientes potenciales de la plataforma): agrupa por network, account, campaign, adSet, ad, currency, date; suma spend/impressions/reach/clicks/conversions/conversionValue/platformLeads/messagingStarted/conversations/leads/deals/won/revenue; promedio ctr/cpc/cpm/cpaReal/roasReal/roasPlatform (proporción de sumas); count necesita un campo. Las medidas monetarias se dividen por moneda (se agrega un grupo de moneda); revenue está en BRL; roasReal usa solo cuentas en BRL; roasReal y cpaReal cuentan solo negocios ganados cuyo primer toque tiene una campaña de anuncios conocida, por lo que pueden ser más bajos que los totales de won/revenue. reach es una suma de alcance diario, no personas únicas. Los gráficos de dinero de anuncios admiten una medida (usa una tabla para varias); conversations/leads/deals/won no se pueden filtrar. Las métricas de plataforma faltantes son null, no 0. Filtra un informe de anuncios por red con filters.networks. Los campos, agregaciones y operadores por fuente provienen de reports.catalog: llámalo primero. Campañas · 4 de lectura · 7 de alteracióncampaigns_audiencePreview— Previsualiza a quién llega la audiencia de una campaña en un canal: total, elegibles, omitidos por motivo (no_phone, opted_out, duplicate) y una muestra de 20 contactos elegibles. QR necesita una identidad de canal o un teléfono de 10+ dígitos; WhatsApp oficial necesita un número de WhatsApp conocido o un teléfono con + al inicio. Los grupos nunca son destinatarios.campaigns_cancel— Cancela una campaña definitivamente: los destinatarios aún no enviados se omiten (motivo cancelled); los mensajes ya en cola aún se envían.campaigns_create— Crea una campaña borrador; campaigns.launch la inicia. El canal debe estar conectado: WhatsApp QR envía mensaje {kind:'text', text (admite {{nome}}, {{primeiro_nome}}, {{telefone}}, {{email}}, {{campo.<key>}} y spintax {Oi|Olá}), media?: {key, type, name?} de la subida de medios}; WhatsApp oficial (la API de Meta) envía {kind:'template', name, language, bodyParams?: {<variable>: {source:'field', field} | {source:'fixed', value}}, headerMedia?}. audience: {tags?, query?, platform?} (como filtros de contacts.overview) o un {contactIds} explícito, con excludeIds; verifícalo con campaigns.audiencePreview. cadence por defecto es el preset cuidadoso (activado para QR, desactivado para oficial). replyTo (un miembro, un agente o un flujo publicado que responde entra al inicio) recibe las conversaciones que abre la campaña; por defecto eres tú.campaigns_delete— Elimina una campaña y su lista de destinatarios (los mensajes enviados permanecen en sus conversaciones). Una campaña en ejecución debe pausarse o cancelarse primero.campaigns_get— Obtiene una campaña: mensaje, audiencia, cadence, replyTo, schedule, estado con motivo de espera/pausa, canal, conteos acumulativos de destinatarios y progreso {total, done}.campaigns_launch— Inicia una campaña borrador: congela la audiencia ahora (contactos elegibles en orden de nombre, máximo 5000; el resto se lista como omitido con un motivo) y envía ahora, o en scheduledAt cuando está en el futuro. Falla sin destinatarios elegibles.campaigns_list— Lista las campañas de esta organización (envíos masivos de WhatsApp), más recientes primero, con canal, estado, motivo de espera/pausa y conteos de destinatarios. Los conteos son acumulativos para el embudo: sent incluye delivered, delivered incluye read, read incluye replied; pending, queued, failed y skipped son exclusivos.campaigns_pause— Pausa una campaña en ejecución o programada; campaigns.resume continúa donde se detuvo.campaigns_recipients— Pagina los destinatarios de una campaña en orden de envío con contacto, estado mostrado (pending, queued, sent, delivered, read, replied, failed, skipped), motivo de omisión, código de error, texto renderizado, conversación y la primera respuesta. El filtro de estado es acumulativo como los conteos (sent también devuelve delivered, read y replied).campaigns_resume— Reanuda una campaña pausada (pausada manual o automáticamente) desde el siguiente destinatario pendiente, enviando ahora; una pausada antes de su programación vuelve a programada.campaigns_update— Actualiza una campaña borrador o programada (name, channelId, message, audience, cadence, replyTo, scheduledAt). Una campaña programada recongela sus destinatarios cuando la audiencia o el canal cambian. Anuncios · 25 de lectura · 24 de alteraciónads_accounts_list— Lista las cuentas de anuncios de las redes de anuncios conectadas: network, name, currency, timezone, si es utilizable (y por qué no), si está seleccionada para sincronización, estado de sincronización y última hora de sincronización. Solo las cuentas de anuncios seleccionadas se sincronizan.ads_accounts_select— Elige qué cuentas de anuncios de una conexión sincroniza Cordex: accountIds es el conjunto seleccionado completo (ids de ads.accounts.list); las demás se deseleccionan y dejan de sincronizar. En redes donde el proveedor limita cuentas por API (Meta, Google y otros), deseleccionar una cuenta también elimina el historial sincronizado del proveedor (alrededor de 90 días) para ella, así que confirma con el usuario primero. Las cuentas no utilizables no se pueden seleccionar.ads_accounts_sync— Pide a Cordex que actualice las campañas, anuncios y métricas de las cuentas de anuncios seleccionadas (todas, o solo accountIds de ads.accounts.list). La actualización se ejecuta en segundo plano en aproximadamente un minuto; no espera por ella. Respeta los límites de velocidad de cada red.ads_audiences_create— Crea una audiencia en una cuenta de anuncios. kind customer_list convierte contactos CRM (source {kind:'crm', tags, query, platform}) en una lista: solo se envían contactos que no han optado por no participar y tienen un email (o teléfono donde la red coincide en él), subidos en segundo plano (ads_audiences_get muestra tamaño y estado de sincronización; el tamaño aparece horas después). kind lookalike (source {kind:'lookalike', seedAudienceId, country, ratio o size}) se basa en otra audiencia de la misma cuenta; las audiencias website (pixelId, retentionDays, urlContains) y engagement (source, sourceIds, event, retentionDays) necesitan el píxel o ids de ads.identities.list. ads.networks.describe lista qué tipos admite cada red y sus reglas. syncMode daily mantiene una lista de clientes actualizada con nuevos contactos. No es seguro repetir: si la respuesta se pierde, la audiencia puede existir de todos modos, así que verifica ads.audiences.list antes de crearla de nuevo.ads_audiences_delete— Elimina permanentemente una audiencia en la red de anuncios y en Cordex. Los anuncios que la usan la pierden, y los borradores de anuncios editables la tienen eliminada. Se rechaza mientras exista una audiencia lookalike construida a partir de ella, mientras se reconstruye, para audiencias creadas en el propio administrador de la red de anuncios y en redes que no pueden eliminar ese tipo.ads_audiences_estimate— Estima, antes de crear una lista de clientes desde contactos CRM, cuántas personas podría recibir cada cuenta de anuncios: eligible = contactos que coinciden con la fuente y no han optado por no participar; usable = emails distintos (y teléfonos donde la red coincide en teléfono, como Meta) que la subida enviaría. warnings: belowMinimum (la red necesita al menosminimum\personas coincidentes para servir anuncios, p. ej. Google 5000, Meta y X 100), replaceUpload (LinkedIn reemplaza toda la lista en cada sincronización), overMax (más de lo que la red conserva: la subida se rechaza, así que reduce la fuente por debajo demaximum\), noUsable, notSupported (con motivo). Solo lectura; los números son conteos de contactos, no de personas que la red coincidirá.ads_audiences_get— Obtiene una audiencia guardada con su tamaño, tasa de coincidencia, estado de sincronización y qué depende de ella: seedOf (audiencias lookalike construidas a partir de ella), drafts (borradores de anuncios editables que la usan) y adsUsing (conjuntos de anuncios sincronizados que la mencionan, null cuando aún no tiene id de red). El tamaño y el estado se releen de la red de anuncios cuando tienen más de 15 minutos.ads_audiences_list— Lista audiencias guardadas (listas de clientes construidas desde contactos CRM, lookalike, audiencias de visitantes del sitio web y engagement, más las creadas en el propio administrador de la red de anuncios) con su tamaño, tasa de coincidencia y estado de sincronización. size y matchRate son null hasta que la red de anuncios los informe (puede tomar horas).networks\dice, para cada red de anuncios conectada, qué tipos de audiencia admite y por qué no cuando no lo hace. Lee la lista de la red de anuncios como máximo cada 10 minutos; pasa refresh true para forzarlo.ads_audiences_rebuild— Recrea una lista de clientes desde los contactos CRM actuales para que los contactos que optaron por no participar o fueron borrados se eliminen realmente, luego elimina la lista antigua en la red de anuncios. Confirma con el usuario primero: los anuncios que usaban la lista antigua la pierden (adsUsing es cuántos conjuntos de anuncios sincronizados la mencionan). Se ejecuta en segundo plano; ads_audiences_get muestra el progreso. En redes donde cada sincronización ya reemplaza toda la lista, esto solo pone en cola una sincronización (modo replace).ads_audiences_sync— Sube los contactos CRM que coinciden con la fuente de una lista de clientes y aún no están en ella, en segundo plano (los contactos que optaron por no participar o no tienen un email utilizable se omiten). Solo crece la lista: los contactos eliminados o que optaron por no participar desde entonces permanecen en la red de anuncios hasta ads.audiences.rebuild.ads_audiences_update— Renombra una audiencia (solo en redes de anuncios que permiten renombrar; ver actions.rename en ads.audiences.get) o cambia el syncMode de una lista de clientes (manual o daily). Las audiencias creadas en el propio administrador de la red de anuncios son de solo lectura.ads_campaigns_list— Lista las campañas publicitarias en las redes de anuncios conectadas como un árbol: campaña, luego conjunto de anuncios (grupo) y luego anuncio. Solo se incluyen las cuentas publicitarias seleccionadas de las redes conectadas. Cada nodo tiene su insignia de estado, si su propio interruptor de encendido/apagado está activado, el presupuesto y su nivel, el objetivo, las métricas de rendimiento en el rango de fechas (gasto, impresiones, clics, ctr, cpc, cpm, resultados, clientes potenciales, messagingStarted), columnas de CRM (conversaciones, clientes potenciales, negocios, ganados, ingresos, roas) y capacidades por acción (pausar, reanudar, presupuesto, renombrar, duplicar, eliminar: habilitadas o la razón por la que no lo están). El dinero está en la moneda propia de cada cuenta publicitaria y nunca se suma entre monedas: los totales son una fila por moneda. Una métrica que la red no reporta es null, no 0. Las columnas de CRM provienen de la atribución de Cordex (último clic de anuncio pagado dentro de 30 días) y son todas null cuando aún no se ha atribuido una venta o conversación a un anuncio; roas es ingresos divididos por gasto solo para campañas en BRL (null con roasNote 'currency' en caso contrario). Rango predeterminado: últimos 30 días; las campañas archivadas/eliminadas están ocultas a menos que el estado sea 'archived' o 'all'.ads_connections_disconnect— Desconecta una conexión de red de anuncios. Sus cuentas publicitarias se deseleccionan (la sincronización se detiene), pero las campañas, anuncios y métricas ya sincronizados se conservan.ads_connections_list— Lista las conexiones de redes de anuncios de esta organización: una entrada por red (Meta, Google, TikTok, LinkedIn, Pinterest, X, Reddit, OpenAI) con la conexión activa (estado connecting, connected, needs_reconnect o error, nombre para mostrar, estado de sincronización, recuentos de cuentas publicitarias y cuentas publicitarias seleccionadas) o null cuando esa red no está conectada.ads_conversion_destinations_list— Lista dónde se pueden enviar conversiones: para cada cuenta publicitaria conectada, los píxeles, acciones de conversión, reglas o conjuntos de eventos que puede recibir (destinations, null cuando la red de anuncios no puede recibir conversiones, con capi explicando por qué), más los números de WhatsApp conectados y si ya tienen un conjunto de datos de conversiones, y las redes que no pueden recibir conversiones en absoluto. Un error al leer una cuenta se informa en el error de esa cuenta y no oculta las demás. Usa los ids de destino con ads.conversion_rules.create.ads_conversion_events_list— El registro de envío de conversiones, más reciente primero: para cada evento la regla, el desencadenante, el estado (pending, sent, failed con la razón de la red de anuncios y fallos, skipped con el motivo: no se encontró clic de anuncio, otra red, fuera de la ventana, optado por no participar, identificadores faltantes...), el valor, el negocio y contacto involucrados y el id de seguimiento de la red para soporte. Nunca incluye el correo electrónico o teléfono del contacto. Pagina con nextCursor.ads_conversion_rules_create— Crea reglas de conversión que reportan resultados reales de CRM a las redes de anuncios. Un desencadenante (deal_won, deal_stage con un stageId, tag_added con una etiqueta, conversation_started) y de 1 a 8 destinos (pipe capi: una cuenta publicitaria más un destinationId de ads.conversion_destinations.list; pipe whatsapp: un número de WhatsApp conectado, solo anuncios de Meta Click-to-WhatsApp, que puede configurar su conjunto de datos de conversiones en la red). Se crea una regla por destino, juntas o no en absoluto. eventName tiene valores predeterminados por desencadenante y red; windowDays tiene un valor predeterminado de 30 (7 para WhatsApp y Reddit, como máximo 90); el valor proviene del negocio a menos que valueSource sea fixed o none. testCode envía cada evento a la vista de prueba de la red. Las reglas comienzan habilitadas y envían conversiones reales: confirma con el usuario primero. Las redes sin soporte de conversiones (X) son rechazadas. Los valores de negocios están en BRL, por lo que una regla con valor de negocio reporta BRL (usa valueSource fixed para otra moneda). Las conversiones de Google no llevan señal de consentimiento, que solo se requiere para audiencias en el EEE/Reino Unido.ads_conversion_rules_delete— Elimina una regla de conversión y, con ella, su registro de envío. Los eventos ya enviados a la red de anuncios permanecen allí. Pausa la regla (enabled false) en su lugar para conservar el registro.ads_conversion_rules_get— Obtiene una regla de conversión con su código de prueba (si lo hay) y sus 20 eventos más recientes del registro de envío.ads_conversion_rules_list— Lista las reglas de conversión: cada una envía un evento de CRM (negocio ganado, negocio que alcanza una etapa, una etiqueta agregada, una conversación iniciada) a un destino de red de anuncios, solo para contactos cuyo clic de anuncio provino de esa red dentro de la ventana de la regla. Cada fila tiene su destino, evento, los identificadores que envía, ventana, configuración de valor, si está en modo de prueba (el código de prueba en sí nunca se lista) y los recuentos de enviados/fallidos/omitidos de los últimos 30 días.networks\dice qué redes de anuncios pueden recibir conversiones y por qué no cuando una no puede.ads_conversion_rules_update— Cambia una regla de conversión: nombre, enabled, eventName, windowDays, configuraciones de valor, el desencadenante o testCode (null deja el modo de prueba). El destino no se puede cambiar: crea una nueva regla en su lugar. Mismos límites que ads.conversion_rules.create.ads_conversions_dispatch— Envía nuevamente eventos de conversión que fallaron o aún están pendientes (1 a 50 ids de ads.conversion_events.list). Se reutiliza el mismo id de evento, por lo que la red de anuncios nunca lo cuenta dos veces. Los eventos ya enviados u omitidos no se pueden reenviar. Devuelve el nuevo estado y razón de cada evento.ads_conversions_test— Envía una conversión de prueba para una regla para que el usuario pueda verla en la vista de prueba de la red de anuncios. Solo donde la red tiene un modo de prueba (píxel de Meta y WhatsApp, Pinterest, Reddit); en otros lugares se rechaza, porque una prueba allí sería una conversión real. Necesita un código de prueba (de la pantalla de eventos de prueba de la red), proporcionado aquí o guardado en la regla. Sin contactId se usa un visitante sintético con una dirección inventada (sin datos de una persona real) (no para WhatsApp, que necesita un contacto que provenga de un anuncio de Click-to-WhatsApp). La prueba se registra como un evento de prueba.ads_create— Crea un anuncio en su red a partir de un borrador guardado con ads.drafts.save (valídalo primero con ads.validate). Siempre se crea en pausa, con los países del borrador, y solo una vez por borrador incluso si se llama de nuevo. Se ejecuta en segundo plano: el resultado dice submitting, y la nueva campaña aparece en ads.campaigns.list como pending review en aproximadamente un minuto; un fallo se almacena en el borrador (ads.drafts.get). Activarlo más tarde con ads.objects.set_status comienza a gastar: confirma con el usuario.ads_drafts_delete— Elimina un borrador de anuncio. Solo se pueden eliminar borradores que no se enviaron (estado draft) o cuya presentación falló; los borradores que se están enviando o ya se crearon no se pueden eliminar.ads_drafts_get— Obtiene un borrador de anuncio: red, cuenta publicitaria, objetivo, nombre, todo el formulario, su cdxRef, estado (draft, submitting, submitted o failed), el error de un intento fallido y el resultado de uno enviado.ads_drafts_list— Lista los borradores de anuncios, más recientemente editados primero: id, red, cuenta publicitaria, objetivo, nombre, cdxRef, estado (draft, submitting, submitted, failed), error y resultado. Filtra por estado.ads_drafts_save— Crea o actualiza un borrador de anuncio (pasa id para actualizar).form\sigue los campos de ads.networks.describe para esa red y objetivo: el monto del presupuesto es un número entero en la moneda de la cuenta publicitaria; los países tienen como valor predeterminado Brasil (OpenAI: Estados Unidos); las imágenes y videos son URLs públicas https en creative.imageUrl / creative.videoUrl. El formulario se reemplaza por completo en cada guardado. Devuelve el id del borrador, su cdxRef y los problemas que aún bloquean ads.create, cada uno etiquetado con el paso del asistente. No se envía nada a la red de anuncios.ads_forms_create— Crea un formulario de clientes potenciales nativo en Meta o LinkedIn para anuncios de generación de clientes potenciales. Los formularios no se pueden editar después de la creación (crea uno nuevo en su lugar). LinkedIn no puede precompletar campos de perfil, así que pide correo electrónico y teléfono como preguntas. Usa el id devuelto como leadGenFormId en ads.drafts.save. La red del formulario debe coincidir con la red de la cuenta. No es seguro repetir: si la respuesta se pierde, el formulario puede existir de todos modos, así que verifica ads.forms.list antes de crear de nuevo.ads_forms_get— Obtiene un formulario de clientes potenciales de una cuenta publicitaria con sus preguntas (claves, etiquetas, opciones de respuesta) y cuántos clientes potenciales y negocios produjo en los últimos 30 días. Los formularios de clientes potenciales no se pueden editar: para cambiar uno, crea un nuevo formulario a partir de él.ads_forms_list— Lista los formularios de clientes potenciales nativos de una cuenta publicitaria (Meta, LinkedIn) con su estado, cuántos clientes potenciales y negocios produjo cada uno en los últimos 30 días y la campaña que lo usó. supported false significa que la red de anuncios de la cuenta no tiene formularios de clientes potenciales. delivery dice si los clientes potenciales llegan instantáneamente (webhook) o se obtienen periódicamente (poll). Usa el id de un formulario como leadGenFormId en ads.drafts.save.ads_identities_list— Lista las páginas de Facebook, píxeles, formularios de clientes potenciales, publicaciones, tableros, organizaciones o números de WhatsApp conectados (whatsapp, para anuncios de click-to-WhatsApp) que un anuncio puede usar en una cuenta publicitaria, para que los ids no necesiten escribirse a mano. supported false significa que esta red de anuncios no puede listar ese tipo: pide el id al usuario en su lugar.ads_leads_get— Obtiene un cliente potencial de anuncio (id de ads.leads.list) con cada respuesta que la persona dio en el formulario, los consentimientos que aceptó y el contacto, negocio, anuncio y campaña a los que está vinculado.ads_leads_list— Lista los clientes potenciales recibidos de formularios de clientes potenciales de anuncios con el contacto de Cordex y el negocio que cada uno creó. Filtra por red, formulario, cuenta publicitaria, estado de importación o rango de fechas (yyyy-mm-dd). Más reciente primero.ads_leads_settings_get— Obtiene lo que sucede cuando llega un cliente potencial de anuncio: la etapa del pipeline donde se crea su negocio (si la hay), el propietario del negocio y la conversación de plantilla de WhatsApp iniciada con el cliente potencial (si la hay).ads_leads_settings_update— Elige qué sucede cuando llega un cliente potencial de anuncio: crea un negocio en una etapa del pipeline, establece su propietario y opcionalmente inicia una conversación de WhatsApp con una plantilla aprobada. Reemplaza toda la configuración; envía deal null, ownerUserId null y whatsapp null para solo crear el contacto.ads_networks_describe— Describe las redes de anuncios que Cordex gestiona (Meta, Google, TikTok, LinkedIn, Pinterest, X, Reddit, OpenAI): qué puede crear, editar, pausar, duplicar o eliminar cada una por nivel, sus objetivos, reglas y mínimos de presupuesto, países predeterminados, qué métricas reporta (otras son null) y cómo se atribuyen las ventas. Léelo antes de actuar en una red.ads_objects_delete— Elimina una campaña publicitaria, conjunto de anuncios o anuncio. Dependiendo de la red, esto lo elimina permanentemente o solo lo archiva (el resultado dice cuál: modo delete o archive); de cualquier manera, deja de entregar y reportar. Prefiere pausar con ads.objects.set_status a menos que el usuario claramente quiera que desaparezca, y confirma primero.ads_objects_duplicate— Duplica una campaña publicitaria, conjunto de anuncios o anuncio en su red. La copia siempre se crea en pausa. Envía el mismo idempotencyKey para reintentar de manera segura sin crear una segunda copia; déjalo fuera para una nueva (se devuelve). No está disponible en todas las redes: consulta ads.networks.describe.ads_objects_get— Obtiene un objeto de anuncio (campaña, conjunto de anuncios o anuncio) por su id de Cordex: sus campos, insignia de estado, capacidades, sus padres (campaña, conjunto de anuncios), sus hijos directos con sus métricas, y métricas de rendimiento en el rango de fechas más una serie diaria. El dinero está en la moneda de la cuenta publicitaria; una métrica que la red no reporta es null.ads_objects_set_status— Pausa o activa una campaña publicitaria, conjunto de anuncios o anuncio en su red de anuncios. Activar comienza a gastar el presupuesto de la empresa inmediatamente: confirma con el usuario primero. Cada nivel tiene su propio interruptor (pausar una campaña no cambia sus hijos). En X, el interruptor de un anuncio es el de su línea de pedido, por lo que toda la línea de pedido se pausa o reanuda. Deshabilitado por red o estado como dicen ads.networks.describe y las capacidades de ads.objects.get. El resultado dice qué nivel se cambió.ads_objects_update_budget— Cambia el presupuesto de una campaña publicitaria, conjunto de anuncios o anuncio. amount es un número entero en la moneda propia de la cuenta publicitaria (no centavos) y type es daily o lifetime. Esto cambia el gasto real: confirma el monto con el usuario primero. Cordex lo aplica en el nivel donde la red mantiene el presupuesto (por ejemplo, el conjunto de anuncios en TikTok, LinkedIn y Pinterest); los niveles que no pueden tener un presupuesto se rechazan con la razón. Algunas redes tienen un presupuesto mínimo en USD.ads_reach_estimate— Estima cuántas personas alcanza una audiencia. Pasa draftId para usar los países y la segmentación de un borrador de anuncio, o accountId con países y segmentación. Devuelve estimate null cuando la red publicitaria no proporciona estimación; ready false significa que todavía se está calculando, vuelve a preguntar en unos segundos.ads_targeting_search— Encuentra ids de segmentación (ubicaciones, intereses, idiomas, palabras clave) para una cuenta publicitaria, para usar en la segmentación de un borrador de anuncio. dimension es uno de location, age, gender, language, interest o keyword, limitado a lo que la red de la cuenta puede segmentar (consulta ads.networks.describe). Keyword devuelve ideas de palabras clave con sus búsquedas mensuales promedio. countryCode (código ISO de 2 letras) reduce la búsqueda y por defecto usa el país predeterminado de la red.ads_touches_list— Lista los clics de anuncios que Cordex atribuyó a contactos (anuncios de WhatsApp, formularios de clientes potenciales, enlaces de seguimiento), del más reciente al más antiguo. Con contactId, attributed marca el toque que cuenta para ese contacto: el último toque pagado dentro de 30 días.ads_tracking_links_create— Crea un enlace de seguimiento de Cordex para usarlo como destino de un anuncio en cualquier red. Cada clic se registra con el id de clic de la red y las etiquetas UTM; los enlaces a WhatsApp llevan un código corto en el mensaje prellenado para que la conversación se atribuya al anuncio. El destino debe ser un sitio https o un número de WhatsApp; no se puede cambiar después. Opcionalmente, vincula el enlace a un objeto de anuncio (campaña, conjunto de anuncios o id de anuncio de ads.campaigns.list) para que los clics se atribuyan a ese nivel.ads_tracking_links_delete— Elimina un enlace de seguimiento de Cordex (id de ads.tracking_links.list). El enlace deja de funcionar (su URL responde 'no encontrado'), pero los clics y contactos ya atribuidos a él se conservan.ads_tracking_links_list— Lista los enlaces de seguimiento de Cordex de la organización con su URL, código corto, destino, número de clics, cuántos contactos llegaron a través de ellos y la hora del último clic. Los enlaces archivados están ocultos a menos que includeArchived sea true.ads_validate— Comprueba un borrador de anuncio sin crear nada: devuelve ok y los problemas que bloquean ads.create (cada uno con la ruta del formulario, un código y el paso del asistente). withPlatform también pide a la red publicitaria que compruebe el anuncio sin crearlo, solo donde la red lo admite; cuenta contra el límite de velocidad de la red, así que úsalo una vez antes de ads.create. Actividad · 1 de lectura · 0 de modificaciónactivity_list— Lista el registro de actividad de esta organización del más reciente al más antiguo: cada operación que modifica datos y los eventos message.received, conversation.created, contact.created y comment.received, con la carga útil exacta que las automatizaciones reciben como trigger.*. Filtra por nombre de evento; pagina con before (createdAt del último elemento). Se conserva durante 90 días.
Ejemplos de solicitudes
- ¿Qué conversaciones de WhatsApp están sin respuesta desde hace más de 2 horas?
- Crea el contacto María Souza, teléfono +55 11 99999-0000, con la etiqueta "lead caliente".
- Mueve el negocio de Padaria Central a la etapa Propuesta enviada.
- ¿Cuántas conversaciones atendió cada agente la última semana?
- Lista las campañas programadas para este mes con el número de destinatarios.
Seguridad y privacidad
El asistente actúa como tú, solo en la empresa elegida y dentro de los alcances aprobados. Cordex no recibe el historial de la conversación con el asistente. Los cambios quedan en el registro de actividad de la empresa. Para desconectar, revoca la aplicación en Configuración › API y MCP.