{"openapi":"3.1.0","info":{"title":"Pymaia API","version":"1.0.0","description":"Unified REST API for the Pymaia marketing dashboard. Every tool exposed via MCP is also available via POST /api/v1/{tool}. Auth: Bearer API key (scope-enforced).","contact":{"name":"Pymaia","url":"https://pymaia.com"}},"servers":[{"url":"https://api.pymaia.com"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"API key issued from Pymaia dashboard (/settings/api) or OAuth access token"}}},"paths":{"/api/v1/analizar_performance":{"post":{"operationId":"analizar_performance","summary":"Usala cuando el usuario pida \"¿cómo vienen mis ads/campañas?\", performance, ROAS o resultados de un período","description":"Usala cuando el usuario pida \"¿cómo vienen mis ads/campañas?\", performance, ROAS o resultados de un período. Trae los KPIs cross-canal con variación vs el período anterior + las mejores/peores campañas. Reemplaza tener que llamar get_kpi_summary + query_meta_campaigns + query_google_campaigns a mano.","tags":["General"],"security":[{"bearerAuth":["ads:read","analytics:read","ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days_back":{"type":"number","default":30,"description":"Ventana en días (default 30)"},"channel":{"type":"string","enum":["all","meta","google"],"default":"all","description":"Enfocar un canal"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/diagnosticar_cambio":{"post":{"operationId":"diagnosticar_cambio","summary":"Usala cuando el usuario pregunte POR QUÉ subió o bajó algo (ROAS, ventas, gasto) en un período","description":"Usala cuando el usuario pregunte POR QUÉ subió o bajó algo (ROAS, ventas, gasto) en un período. Compara la ventana actual vs la anterior y descompone el cambio por canal y por campaña, para explicar qué lo movió.","tags":["General"],"security":[{"bearerAuth":["ads:read","analytics:read","ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days_back":{"type":"number","default":30,"description":"Ventana en días (default 30)"},"metric":{"type":"string","enum":["roas","revenue","spend","store_revenue"],"default":"roas"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/quick_wins":{"post":{"operationId":"quick_wins","summary":"Usala cuando el usuario pida \"qué hago ahora\", oportunidades, quick wins o qué mejorar","description":"Usala cuando el usuario pida \"qué hago ahora\", oportunidades, quick wins o qué mejorar. Junta las recomendaciones nuevas del hub, las campañas con ROAS < 1 (plata que se está perdiendo), los carritos abandonados y las alertas críticas, rankeadas por impacto, con el próximo paso de cada una.","tags":["General"],"security":[{"bearerAuth":["ads:read","ecommerce:read","notifications:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/preparar_reporte":{"post":{"operationId":"preparar_reporte","summary":"Usala cuando el usuario pida armar/preparar un reporte, resumen ejecutivo o \"reporte para el cliente\" de un período","description":"Usala cuando el usuario pida armar/preparar un reporte, resumen ejecutivo o \"reporte para el cliente\" de un período. Devuelve la estructura lista para narrar: resumen cross-canal con variaciones, desglose por canal, y las recomendaciones abiertas. El usuario lo redacta con vos.","tags":["General"],"security":[{"bearerAuth":["ads:read","analytics:read","ecommerce:read","notifications:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days_back":{"type":"number","default":30,"description":"Ventana en días (default 30)"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/revisar_tienda":{"post":{"operationId":"revisar_tienda","summary":"Usala cuando el usuario pregunte por su tienda online: ventas, órdenes, AOV, productos top o carritos abandonados","description":"Usala cuando el usuario pregunte por su tienda online: ventas, órdenes, AOV, productos top o carritos abandonados. Junta órdenes, productos y carritos del período en una sola vista.","tags":["General"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days_back":{"type":"number","default":30,"description":"Ventana en días (default 30)"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/auditar_canal":{"post":{"operationId":"auditar_canal","summary":"Usala cuando el usuario pida auditar un canal (meta, google, seo, tienda, meli, amazon) siguiendo la metodología de Pymaia","description":"Usala cuando el usuario pida auditar un canal (meta, google, seo, tienda, meli, amazon) siguiendo la metodología de Pymaia. Trae el framework de auditoría de la agencia + los datos clave del canal, para que armes la auditoría paso a paso con esos datos.","tags":["General"],"security":[{"bearerAuth":["skills:read","ads:read","analytics:read","ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"canal":{"type":"string","enum":["meta","google","seo","tienda","meli","amazon"]}},"required":["canal"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/estado_conexiones":{"post":{"operationId":"estado_conexiones","summary":"Usala cuando el usuario pregunte qué está conectado, si hay algo desconectado, la salud de las integraciones, alertas del sistema o cuántos créditos le quedan","description":"Usala cuando el usuario pregunte qué está conectado, si hay algo desconectado, la salud de las integraciones, alertas del sistema o cuántos créditos le quedan. Devuelve las conexiones con su veredicto de salud, las alertas abiertas y el saldo de créditos, todo en una llamada. Panorama de conexiones (marca las que necesitan reconexión), alertas recientes y saldo de créditos.","tags":["General"],"security":[{"bearerAuth":["connections:read","notifications:read","billing:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/analizar_competencia":{"post":{"operationId":"analizar_competencia","summary":"Usala cuando el usuario pregunte por sus competidores: quiénes son, qué anuncios corren, cuál les está funcionando o qué publican","description":"Usala cuando el usuario pregunte por sus competidores: quiénes son, qué anuncios corren, cuál les está funcionando o qué publican. Con `competitor_id` trae el análisis completo de ESE competidor (mix de formatos, los que más duran, cadencia, contenido orgánico); sin él, el panorama de todos. Devuelve SOLO lo ya generado — no dispara análisis nuevos.","tags":["General"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["competitive:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"competitor_id":{"type":"string","description":"Para el análisis profundo de un competidor. Sin esto, el panorama de todos."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/revisar_clientes":{"post":{"operationId":"revisar_clientes","summary":"Usala cuando el usuario pregunte por sus leads, pipeline o CRM (lead-gen / negocios de servicios)","description":"Usala cuando el usuario pregunte por sus leads, pipeline o CRM (lead-gen / negocios de servicios). Trae los leads recientes, su estado en el pipeline y la actividad. OJO: para COMPRADORES de la tienda online con RFM/LTV usá list_store_customers, no esto.","tags":["General"],"x-module-flag":"module_pymaia_crm","security":[{"bearerAuth":["crm:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days_back":{"type":"number","default":30,"description":"Ventana en días (default 30)"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/revisar_seo":{"post":{"operationId":"revisar_seo","summary":"Usala cuando el usuario pregunte por SEO, posicionamiento, tráfico orgánico o Search Console: clics, impresiones, posición y las páginas/keywords top del período","description":"Usala cuando el usuario pregunte por SEO, posicionamiento, tráfico orgánico o Search Console: clics, impresiones, posición y las páginas/keywords top del período.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days_back":{"type":"number","default":30,"description":"Ventana en días (default 30)"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/revisar_email":{"post":{"operationId":"revisar_email","summary":"Usala cuando el usuario pregunte por su email marketing: campañas BROADCAST enviadas, aperturas, clics o performance (Omnisend/Klaviyo)","description":"Usala cuando el usuario pregunte por su email marketing: campañas BROADCAST enviadas, aperturas, clics o performance (Omnisend/Klaviyo). Trae las campañas recientes con sus métricas. OJO: para los FLOWS automatizados (carrito abandonado, bienvenida, etc.) usá list_email_flows — ahí suele estar el grueso del revenue.","tags":["Email"],"security":[{"bearerAuth":["crm:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days_back":{"type":"number","default":30,"description":"Ventana en días (default 30)"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_meta_campaigns":{"post":{"operationId":"query_meta_campaigns","summary":"Campañas de Meta Ads (Facebook e Instagram) con gasto, impresiones, clics, conversiones, valor de conversión y ROAS por fila","description":"Campañas de Meta Ads (Facebook e Instagram) con gasto, impresiones, clics, conversiones, valor de conversión y ROAS por fila. NO la uses para el panorama del negocio: «cómo venimos» es analizar_performance, que cruza ads con la tienda. Tampoco para el desglose por creativo, público o ubicación, que es query_meta_breakdowns. Devuelve hasta las filas del `limit`: si el rango es largo, acortalo en vez de subirlo.","tags":["Ads"],"security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string","description":"Start date YYYY-MM-DD"},"date_to":{"type":"string","description":"End date YYYY-MM-DD"},"limit":{"type":"number","description":"Max rows to return","default":50},"status":{"type":"string","description":"Filter by campaign status (e.g., ACTIVE)"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_google_campaigns":{"post":{"operationId":"query_google_campaigns","summary":"Campañas de Google Ads: devuelve una fila por campaña con gasto, impresiones, clics, conversiones y ROAS","description":"Campañas de Google Ads: devuelve una fila por campaña con gasto, impresiones, clics, conversiones y ROAS. NO la uses para términos de búsqueda (query_google_search_terms) ni para palabras clave (query_google_keywords), que es donde suele estar el desperdicio. Para comparar Google contra Meta y la tienda, analizar_performance.","tags":["Ads"],"security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string","description":"Start date (YYYY-MM-DD)"},"date_to":{"type":"string","description":"End date (YYYY-MM-DD)"},"limit":{"type":"number","description":"Max rows to return.","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_email_campaigns":{"post":{"operationId":"query_email_campaigns","summary":"Query email campaign performance (Omnisend/Klaviyo etc","description":"Query email campaign performance (Omnisend/Klaviyo etc.). Returns campaigns with subject, sent, opens, clicks. With include_body=true also returns the email COPY (plain text of the body, for recently sent campaigns) — use it when the user wants you to analyze/improve a campaign's copy or CTA.","tags":["Ads"],"security":[{"bearerAuth":["crm:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"number","description":"Max rows to return","default":50},"status":{"type":"string","description":"Filter by status: draft, scheduled, sending, sent"},"include_body":{"type":"boolean","description":"Include the email copy (plain text, truncated). Only for recently sent campaigns. Default false.","default":false}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_contacts":{"post":{"operationId":"query_contacts","summary":"Contactos/leads del CRM (lead-gen) con tags y origen","description":"Contactos/leads del CRM (lead-gen) con tags y origen. OJO: son personas del pipeline de ventas, NO los compradores de la tienda online — para clientes de la tienda con RFM/LTV usá list_store_customers.","tags":["CRM & Leads"],"security":[{"bearerAuth":["crm:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"number","default":100},"search":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_orders":{"post":{"operationId":"query_orders","summary":"Órdenes de la tienda (Shopify/Tiendanube) con atribución UTM y recorrido del cliente","description":"Órdenes de la tienda (Shopify/Tiendanube) con atribución UTM y recorrido del cliente. `count` es cuántas filas devuelve esta llamada; `total_revenue` y `orders_in_period` son del PERÍODO COMPLETO (todas las órdenes, sin anuladas, con la cotización de cada fecha) — no dependen del `limit`.","tags":["Ecommerce"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string","description":"Start date YYYY-MM-DD"},"date_to":{"type":"string","description":"End date YYYY-MM-DD"},"limit":{"type":"number","default":50,"description":"Max rows to return"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_products":{"post":{"operationId":"query_products","summary":"Query product catalog with prices and stock (Omnisend product mirror)","description":"Query product catalog with prices and stock (Omnisend product mirror).","tags":["Ecommerce"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"number","default":100},"search":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_carts":{"post":{"operationId":"query_carts","summary":"Query abandoned carts/checkouts across Omnisend (email platform) and Shopify (abandoned_checkouts)","description":"Query abandoned carts/checkouts across Omnisend (email platform) and Shopify (abandoned_checkouts). Returns cart details with totals, recovery URLs, and aggregate stats. Merge ambas fuentes para no perder data si el cliente usa Shopify nativo sin Omnisend cart tracking.","tags":["Ecommerce"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"number","description":"Max carts. Default 50.","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_analytics":{"post":{"operationId":"query_analytics","summary":"Query Google Analytics sessions, users, conversions and revenue per day","description":"Query Google Analytics sessions, users, conversions and revenue per day.","tags":["Analytics"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string","description":"Start date YYYY-MM-DD"},"date_to":{"type":"string","description":"End date YYYY-MM-DD"},"limit":{"type":"number","description":"Max rows to return","default":50},"traffic_source":{"type":"string","description":"Filter by traffic source"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_search_console":{"post":{"operationId":"query_search_console","summary":"Google Search Console: consultas orgánicas con clics, impresiones, CTR y posición promedio","description":"Google Search Console: consultas orgánicas con clics, impresiones, CTR y posición promedio. Es tráfico ORGÁNICO, no pago — lo pago es query_google_campaigns. NO dice si una página está indexada: eso es query_indexation. Devuelve las filas del `limit`, ordenadas por clics.","tags":["Analytics"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string","description":"Start date YYYY-MM-DD"},"date_to":{"type":"string","description":"End date YYYY-MM-DD"},"limit":{"type":"number","description":"Max rows to return","default":50},"query_filter":{"type":"string","description":"Filter keywords containing this text"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_kpi_summary":{"post":{"operationId":"get_kpi_summary","summary":"Cross-platform KPI summary normalized to the org reporting currency (via exchange_rates)","description":"Cross-platform KPI summary normalized to the org reporting currency (via exchange_rates). Returns per-platform spend/revenue/ROAS, store revenue, blended ad ROAS, store ROAS (revenue/spend), sessions and SEO clicks.","tags":["General"],"security":[{"bearerAuth":["ads:read","analytics:read","ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days_back":{"type":"number","default":30,"description":"Number of days to look back (ignored if date_from is set)"},"date_from":{"type":"string","description":"Explicit window start YYYY-MM-DD (for comparing arbitrary periods). Overrides days_back."},"date_to":{"type":"string","description":"Explicit window end YYYY-MM-DD (defaults to today). Only used with date_from."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_data":{"post":{"operationId":"query_data","summary":"FLEXIBLE store metrics query (semantic layer, single source of truth — matches dashboard/alerts)","description":"FLEXIBLE store metrics query (semantic layer, single source of truth — matches dashboard/alerts). Compose {metric, dimensions[], filters, date range} to answer ANY store aggregation question without a dedicated tool. Sources: STORE, META ADS, GOOGLE ADS, ANALYTICS (GA4), SEO (Search Console), SOCIAL, EMAIL, CRM (contacts), MELI (MercadoLibre). Metrics/dimensions from different sources cannot be mixed (error lists valid ones). Call get_data_catalog for the full live list (grows without deploy).","tags":["General"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"metric":{"type":"string"},"dimensions":{"type":"array","items":{"type":"string"}},"filters":{"type":"object","additionalProperties":{}},"date_from":{"type":"string"},"date_to":{"type":"string"}},"required":["metric"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_data_catalog":{"post":{"operationId":"get_data_catalog","summary":"Available metrics and dimensions for query_data (single source of truth)","description":"Available metrics and dimensions for query_data (single source of truth).","tags":["General"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_readonly_sql":{"post":{"operationId":"run_readonly_sql","summary":"ESCAPE HATCH (advanced): run ONE read-only SELECT against this org's data, RLS-isolated (cannot see other orgs, cannot write)","description":"ESCAPE HATCH (advanced): run ONE read-only SELECT against this org's data, RLS-isolated (cannot see other orgs, cannot write). Use ONLY when query_data does not cover the question. Devuelve las filas del SELECT tal cual, sin agregaciones ni interpretación. Tables: store_orders (+ store_connections via store_connection_id; store_orders has no org_id), meta_ad_creatives, ad_accounts. Return explicit columns. Prefer query_data when it fits.","tags":["General"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sql":{"type":"string"}},"required":["sql"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_agents":{"post":{"operationId":"list_agents","summary":"Lista todos los agentes de IA disponibles con sus capacidades y tools","description":"Lista todos los agentes de IA disponibles con sus capacidades y tools","tags":["Agents"],"security":[{"bearerAuth":["agents:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_agent":{"post":{"operationId":"run_agent","summary":"Corre un agente de IA con una tarea específica","description":"Corre un agente de IA con una tarea específica. El agente tiene acceso a las tools de datos de marketing y analiza/responde según su especialización.","tags":["Agents"],"security":[{"bearerAuth":["agents:run"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent_slug":{"type":"string","description":"Agent slug (e.g. \"ads-analyst\", \"growth360\", \"seo-specialist\")"},"message":{"type":"string","description":"The task or question for the agent"}},"required":["agent_slug","message"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_connections":{"post":{"operationId":"list_connections","summary":"Lista las conexiones de plataformas de la organización con su estado de sync y un veredicto `health` por conexión","description":"Lista las conexiones de plataformas de la organización con su estado de sync y un veredicto `health` por conexión. Mirá `health` antes de citar un cero: `empty_sync` significa que la conexión corre sin errores pero no trae filas hace días, o sea que ese cero NO es un dato real. Valores: ok | empty_sync | stale | error | needs_reconnection | never_synced.","tags":["Org & Connections"],"security":[{"bearerAuth":["connections:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/trigger_sync":{"post":{"operationId":"trigger_sync","summary":"Dispara la sincronización de datos de una plataforma conectada","description":"Dispara la sincronización de datos de una plataforma conectada. Plataformas válidas: google_ads, meta_ads, google_analytics, search_console, shopify, tiendanube, mercadolibre, omnisend, instagram, amazon_sp, amazon_ads, linkedin, linkedin_ads, tiktok_ads, woocommerce, clarity, klaviyo, perfit, x_ads, merchant_center.","tags":["Org & Connections"],"security":[{"bearerAuth":["connections:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","description":"Clave de plataforma (google_ads | meta_ads | google_analytics | search_console | shopify | tiendanube | mercadolibre | omnisend | instagram | amazon_sp | amazon_ads | linkedin | linkedin_ads | tiktok_ads | woocommerce | clarity | klaviyo | perfit | x_ads | merchant_center)"}},"required":["platform"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/propose_connect_platform":{"post":{"operationId":"propose_connect_platform","summary":"Guide the user to (re)connect a platform when its connection is missing or broken (expired token)","description":"Guide the user to (re)connect a platform when its connection is missing or broken (expired token). Returns a deep-link to /settings/connections so the user can complete the OAuth flow. Use when a sync fails because there is no working connection. platform is the platform key (e.g. meta, google_ads, omnisend, shopify, google_analytics, search_console, tiktok_ads).","tags":["General"],"security":[{"bearerAuth":["connections:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","description":"Platform key to connect (e.g. meta, google_ads, omnisend, shopify, google_analytics, search_console, tiktok_ads)."}},"required":["platform"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_tasks":{"post":{"operationId":"list_tasks","summary":"Lista todas las tareas de IA (programadas, recurrentes, por evento) de la organización","description":"Lista todas las tareas de IA (programadas, recurrentes, por evento) de la organización. OJO: NO son las Automatizaciones/workflows del módulo homónimo (triggers→pasos) — para eso usá list_workflows.","tags":["Tasks"],"x-module-flag":"module_tasks","security":[{"bearerAuth":["tasks:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["active","paused","completed","archived","suggested","pending_approval","approved","rejected","scheduled"],"description":"Filtrar por estado (active | paused | completed | archived | suggested | pending_approval | approved | rejected | scheduled)"},"task_type":{"type":"string","enum":["one_time","recurring","event_trigger"],"description":"Filtrar por tipo (one_time | recurring | event_trigger)"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/create_task":{"post":{"operationId":"create_task","summary":"Crea una nueva tarea de IA","description":"Crea una nueva tarea de IA. La ejecuta el agente indicado (o se rutea automáticamente si no se especifica).","tags":["Tasks"],"x-module-flag":"module_tasks","security":[{"bearerAuth":["tasks:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Short name for the task"},"objective":{"type":"string","description":"What the task should accomplish"},"agent_slug":{"type":"string","description":"Agent to execute (e.g. \"ads-analyst\"). Leave empty for auto-routing via growth360."},"task_type":{"type":"string","enum":["one_time","recurring","event_trigger"],"default":"one_time"},"cron_expr":{"type":"string","description":"Cron expression for recurring tasks (e.g. \"0 9 * * 1\" = every Monday 9am)"},"priority":{"type":"number","minimum":1,"maximum":4,"default":3,"description":"1=critical, 2=high, 3=medium, 4=low"},"success_criteria":{"type":"string","description":"How to evaluate if the task succeeded"},"max_cost_usd":{"type":"number","description":"Monthly budget limit in USD"}},"required":["name","objective"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_task":{"post":{"operationId":"run_task","summary":"Ejecuta una tarea de inmediato","description":"Ejecuta una tarea de inmediato. Devuelve el resultado de la ejecución del agente.","tags":["Tasks"],"x-module-flag":"module_tasks","security":[{"bearerAuth":["tasks:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"task_id":{"type":"string","description":"Task UUID to execute"}},"required":["task_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/update_task":{"post":{"operationId":"update_task","summary":"Actualiza una tarea (pausar, reanudar, cambiar prioridad, etc","description":"Actualiza una tarea (pausar, reanudar, cambiar prioridad, etc.)","tags":["Tasks"],"x-module-flag":"module_tasks","security":[{"bearerAuth":["tasks:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"task_id":{"type":"string","description":"Task UUID"},"status":{"type":"string","enum":["active","paused","completed","archived","suggested","pending_approval","approved","rejected","scheduled"],"description":"Estado nuevo (active | paused | completed | archived | suggested | pending_approval | approved | rejected | scheduled)"},"priority":{"type":"number","description":"New priority 1-4"},"objective":{"type":"string"},"cron_expr":{"type":"string"}},"required":["task_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_task_runs":{"post":{"operationId":"list_task_runs","summary":"Get execution history for a task","description":"Get execution history for a task","tags":["Tasks"],"x-module-flag":"module_tasks","security":[{"bearerAuth":["tasks:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"task_id":{"type":"string","description":"Task UUID"},"limit":{"type":"number","default":10}},"required":["task_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_templates":{"post":{"operationId":"list_templates","summary":"Lista los templates de TAREAS/automatización que se pueden activar (alertas, reportes recurrentes, monitoreos)","description":"Lista los templates de TAREAS/automatización que se pueden activar (alertas, reportes recurrentes, monitoreos). OJO: NO es el tema/plantilla de la tienda online — si el usuario pregunta por \"el template/tema de Tiendanube/Shopify\", eso es get_store_theme.","tags":["Tasks"],"x-module-flag":"module_tasks","security":[{"bearerAuth":["tasks:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"category":{"type":"string","enum":["ads","crm","ecommerce","growth","seo"],"description":"Filtrar por categoría (ads | crm | ecommerce | growth | seo)"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/activate_template":{"post":{"operationId":"activate_template","summary":"Crea una tarea a partir de una plantilla","description":"Crea una tarea a partir de una plantilla","tags":["Tasks"],"x-module-flag":"module_tasks","security":[{"bearerAuth":["tasks:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"template_id":{"type":"string","description":"Template UUID to activate"},"name_override":{"type":"string","description":"Custom name for the task"}},"required":["template_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_suggestions":{"post":{"operationId":"list_suggestions","summary":"List AI-generated task suggestions for the organization","description":"List AI-generated task suggestions for the organization","tags":["Tasks"],"x-module-flag":"module_tasks","security":[{"bearerAuth":["tasks:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/read_agent_memories":{"post":{"operationId":"read_agent_memories","summary":"Read accumulated agent memories/insights for this organization","description":"Read accumulated agent memories/insights for this organization. Memories contain patterns, anomalies, and learnings from previous analyses. Sin agent_slug devuelve las memorias de TODOS los agentes de la cuenta: usá agent_slug cuando busques lo que aprendió uno en particular, y \"shared\" para lo transversal (baseline del cliente, resultados destilados, preferencias).","tags":["Agents"],"security":[{"bearerAuth":["memory:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent_slug":{"type":"string","description":"Filter by agent slug (e.g. \"ads-analyst\"). Omitir = todas las de la cuenta. \"shared\" = memorias transversales."},"memory_type":{"type":"string","enum":["insight","fact","preference","pattern","warning","living_doc"],"description":"Filtrar por tipo (insight | fact | preference | pattern | warning | living_doc)"},"path_prefix":{"type":"string","description":"Filter by memory path prefix (e.g. \"meta/campaigns/\")"},"min_importance":{"type":"number","default":1,"description":"Minimum importance level (1-10)"},"limit":{"type":"number","default":20}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/write_agent_memory":{"post":{"operationId":"write_agent_memory","summary":"Write or update an agent memory","description":"Write or update an agent memory. Use paths like \"meta/campaigns/roas-pattern\" to organize knowledge hierarchically.","tags":["Agents"],"security":[{"bearerAuth":["memory:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent_slug":{"type":"string","description":"Agent slug that owns this memory"},"path":{"type":"string","description":"Hierarchical path (e.g. \"google/keywords/brand-terms\")"},"content":{"type":"string","description":"The memory content - insights, patterns, observations"},"memory_type":{"type":"string","enum":["insight","fact","preference","pattern","warning","living_doc"],"default":"insight"},"importance":{"type":"number","minimum":1,"maximum":10,"default":5,"description":"Importance level 1-10"},"ttl_days":{"type":"number","description":"Days until this memory expires (null = permanent)"}},"required":["agent_slug","path","content"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/delete_agent_memory":{"post":{"operationId":"delete_agent_memory","summary":"Elimina una memoria del agente por ID","description":"Elimina una memoria del agente por ID","tags":["Agents"],"security":[{"bearerAuth":["memory:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"memory_id":{"type":"string","description":"Memory UUID to delete"}},"required":["memory_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/submit_feedback":{"post":{"operationId":"submit_feedback","summary":"Submit feedback (rating/correction) on an agent task run","description":"Submit feedback (rating/correction) on an agent task run","tags":["Account"],"security":[{"bearerAuth":["agents:run"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"run_id":{"type":"string","description":"Task run UUID to rate"},"rating":{"type":"number","minimum":1,"maximum":5,"description":"Rating 1-5 (1=terrible, 5=excellent)"},"correction":{"type":"string","description":"What should the agent have done differently?"},"tags":{"type":"array","items":{"type":"string"},"description":"Tags like \"wrong-data\", \"good-insight\", \"missed-opportunity\""}},"required":["run_id","rating"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_feedback":{"post":{"operationId":"list_feedback","summary":"List feedback submitted for agent task runs","description":"List feedback submitted for agent task runs","tags":["Account"],"security":[{"bearerAuth":["agents:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent_slug":{"type":"string","description":"Filter by agent"},"min_rating":{"type":"number"},"max_rating":{"type":"number"},"limit":{"type":"number","default":20}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_skills":{"post":{"operationId":"list_skills","summary":"Lista los playbooks disponibles (métodos de marketing que el agente ejecuta contra los datos de la cuenta)","description":"Lista los playbooks disponibles (métodos de marketing que el agente ejecuta contra los datos de la cuenta). Devuelve la ficha de cada uno: nombre, categoría y cuándo usarlo — no el método. Para el método completo de uno, get_skill_content.","tags":["Agents"],"security":[{"bearerAuth":["skills:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"q":{"type":"string","description":"Texto a buscar en el nombre y la descripción"},"category":{"type":"string","description":"Filtrar por categoría (list_skills sin filtros las muestra todas)"},"limit":{"type":"integer","minimum":1,"maximum":200,"default":40,"description":"Cuántas devolver (default 40)"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_skill_content":{"post":{"operationId":"get_skill_content","summary":"Trae el método completo de UN playbook por slug","description":"Trae el método completo de UN playbook por slug. Pedí sólo el que vas a usar: son métodos largos y traerlos de a muchos llena el contexto sin aportar.","tags":["Agents"],"security":[{"bearerAuth":["skills:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string","description":"Slug del playbook (ej. \"audit-quality-score\")"}},"required":["slug"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_playbook_sections":{"post":{"operationId":"list_playbook_sections","summary":"Lista las secciones (fases/reglas) de un playbook por slug, con índice numerado","description":"Lista las secciones (fases/reglas) de un playbook por slug, con índice numerado","tags":["General"],"security":[{"bearerAuth":["skills:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string","description":"Playbook slug"}},"required":["slug"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_playbook_section":{"post":{"operationId":"get_playbook_section","summary":"Read ONE section of a playbook (by numeric index or title) to follow its steps/rules","description":"Read ONE section of a playbook (by numeric index or title) to follow its steps/rules","tags":["General"],"security":[{"bearerAuth":["skills:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"section":{"type":"string","description":"Index (e.g. \"1\") or section title"}},"required":["slug","section"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_notifications":{"post":{"operationId":"list_notifications","summary":"List recent notifications for the organization","description":"List recent notifications for the organization","tags":["Recommendations"],"security":[{"bearerAuth":["notifications:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"module":{"type":"string","description":"Filter by module (e.g. \"tareas\", \"ads\", \"seo\")"},"unread_only":{"type":"boolean","default":false},"limit":{"type":"number","default":20}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_organization_info":{"post":{"operationId":"get_organization_info","summary":"Todo lo que Pymaia sabe del negocio: identidad de marca (colores, tipografía, logo, tono de voz, pilares y qué NO decir), rubro, moneda, ICPs, competidores y estado del tracking","description":"Todo lo que Pymaia sabe del negocio: identidad de marca (colores, tipografía, logo, tono de voz, pilares y qué NO decir), rubro, moneda, ICPs, competidores y estado del tracking. Úsala ANTES de escribir cualquier pieza, copy o reporte para ese cliente: es de dónde sale la marca, y escribir de memoria produce contenido que no se parece al cliente. Devuelve un objeto grande y de una sola vez; no hace falta llamarla de nuevo en la misma conversación.","tags":["Org & Connections"],"security":[{"bearerAuth":["agents:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_claude_setup":{"post":{"operationId":"get_claude_setup","summary":"Onboarding para usar Pymaia como frontend desde Claude/ChatGPT","description":"Onboarding para usar Pymaia como frontend desde Claude/ChatGPT. Devuelve las instrucciones sugeridas para tu Claude Project (system prompt), la lista de skills de marketing disponibles, preguntas de ejemplo, y el modelo de aprobación. Llamala una vez al conectar para que tu asistente sepa qué puede hacer con Pymaia y cómo. No consume créditos de IA de Pymaia (el modelo lo pone tu suscripción).","tags":["General"],"security":[{"bearerAuth":["skills:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/submit_connector_feedback":{"post":{"operationId":"submit_connector_feedback","summary":"Radicar feedback general sobre el conector/Pymaia (bug, idea, pregunta) para que lo revise el equipo","description":"Radicar feedback general sobre el conector/Pymaia (bug, idea, pregunta) para que lo revise el equipo. Usala para reportes de ingeniería o sugerencias que NO son sobre una corrida puntual de un agente (para eso está submit_feedback, que pide run_id). No consume créditos.","tags":["Account"],"security":[{"bearerAuth":["agents:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"category":{"type":"string","enum":["bug","idea","question","other"],"default":"other","description":"Tipo de feedback"},"message":{"type":"string","minLength":1,"description":"El reporte/sugerencia, en texto libre"},"context":{"type":"object","additionalProperties":{},"description":"Contexto opcional: pasos de reproducción, tools involucradas, etc."}},"required":["message"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/search_knowledge":{"post":{"operationId":"search_knowledge","summary":"Busca en la base de conocimiento: (1) documentos del negocio (PDFs/CSV que subió), reportes guardados y benchmarks de su industria (la guía de growth de la agencia); y (2) la DOCUMENTACIÓN DE PYMAIA — cómo usar la app (conectar plataformas, qué hace cada módulo, créditos y planes, modo agencia, API/MCP)","description":"Busca en la base de conocimiento: (1) documentos del negocio (PDFs/CSV que subió), reportes guardados y benchmarks de su industria (la guía de growth de la agencia); y (2) la DOCUMENTACIÓN DE PYMAIA — cómo usar la app (conectar plataformas, qué hace cada módulo, créditos y planes, modo agencia, API/MCP). USALO antes de recomendar estrategia (para no recomendar de memoria) y SIEMPRE que te pregunten \"cómo hago X en Pymaia\", \"cómo conecto <plataforma>\", \"qué hace el módulo <Y>\" (ahí pasá source_types:[\"product_docs\"]). NO es para métricas en vivo: esas se traen con los query_*/bundles.","tags":["General"],"security":[{"bearerAuth":["knowledge:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"description":"Qué buscar, en lenguaje natural."},"source_types":{"type":"array","items":{"type":"string","enum":["document","report","industry","product_docs"]},"description":"Opcional: limitar la búsqueda. product_docs = documentación de cómo usar Pymaia; document/report/industry = conocimiento del negocio y su industria."},"limit":{"type":"number","default":8,"description":"Máx fragmentos (default 8, techo 20)."}},"required":["query"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_pending_actions":{"post":{"operationId":"list_pending_actions","summary":"List agent actions awaiting human approval","description":"List agent actions awaiting human approval. These were proposed by agents but blocked by guardrails (e.g., destructive ops like pausing campaigns, changing budgets, updating prices).","tags":["Recommendations"],"security":[{"bearerAuth":["actions:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent_slug":{"type":"string","description":"Filter by the agent that proposed the action"},"action_type":{"type":"string","description":"Filter by action type (e.g. pause_meta_campaign)"},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_action_history":{"post":{"operationId":"list_action_history","summary":"List historical agent actions (executed, rejected, failed, expired, or approved but not yet executed)","description":"List historical agent actions (executed, rejected, failed, expired, or approved but not yet executed). Useful for audit trails.","tags":["Recommendations"],"security":[{"bearerAuth":["actions:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["approved","rejected","executed","failed","expired"],"description":"Filter by status"},"agent_slug":{"type":"string"},"limit":{"type":"number","default":25}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/approve_action":{"post":{"operationId":"approve_action","summary":"Approve a pending agent action and execute it","description":"Approve a pending agent action and execute it. Marks the action as approved, then calls the execute-action edge function to actually run the mutation. NOTE: approving from the connector is NOT a human approval — it counts against the organization daily cap of automatic actions, so it can come back as pending when the cap is full (get_autonomy_status shows the cap and how much of it is used). Approving in the Pymaia app has no cap.","tags":["Recommendations"],"security":[{"bearerAuth":["actions:approve"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"action_id":{"type":"string","description":"UUID of the pending action"}},"required":["action_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/reject_action":{"post":{"operationId":"reject_action","summary":"Rechaza una acción del agente pendiente","description":"Rechaza una acción del agente pendiente. La acción no se ejecuta.","tags":["Recommendations"],"security":[{"bearerAuth":["actions:approve"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"action_id":{"type":"string","description":"UUID of the pending action"},"reason":{"type":"string","description":"Why the action was rejected"}},"required":["action_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_guardrails":{"post":{"operationId":"list_guardrails","summary":"List guardrail rules that gate agent actions (what requires approval, auto-approval thresholds, cooldowns, max auto amounts)","description":"List guardrail rules that gate agent actions (what requires approval, auto-approval thresholds, cooldowns, max auto amounts).","tags":["Recommendations"],"security":[{"bearerAuth":["actions:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent_slug":{"type":"string"},"action_type":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_autonomy_status":{"post":{"operationId":"get_autonomy_status","summary":"How much the AI is allowed to do on its own in this organization, and how much of that it already used today","description":"How much the AI is allowed to do on its own in this organization, and how much of that it already used today. Returns the autonomy level (observar = everything waits for a human OK; con_aprobacion = per-action rules decide; autonomia_acotada = rules plus autopilot scopes; autonomia_condicional = also runs what has 14 clean days), the daily cap of automatic actions and how many were used, AI spend and its cap, how many actions are waiting for approval and how many expire within 24h, how many came back to pending because of a cap, and the recommended level with the reason behind it. Read-only. Use it before proposing work in bulk, and to explain why an action is waiting instead of running.","tags":["General"],"security":[{"bearerAuth":["actions:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/propose_campaign":{"post":{"operationId":"propose_campaign","summary":"Propose a COMPLETE advertising campaign (campaign → ad set/group → creative → ad) for Meta, Google or TikTok","description":"Propose a COMPLETE advertising campaign (campaign → ad set/group → creative → ad) for Meta, Google or TikTok. Builds an Action Bundle queued for human approval (creating real ads ALWAYS needs explicit human sign-off; the campaign is created PAUSED). Provide a resolved spec — for Meta: creative.imageHash + creative.pageId; for Google: headlines/descriptions/keywords; for TikTok: identity + creatives. Returns a bundleId the user approves in the Pymaia dashboard.","tags":["Ads"],"security":[{"bearerAuth":["actions:approve"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["meta","google","tiktok"]},"spec":{"type":"object","additionalProperties":{},"description":"Resolved campaign spec (shape depends on platform). Always include draftId + name."},"brief_text":{"type":"string","description":"Campaign intent text (used for special-ad-category detection)."},"estimated_reach":{"type":"number"},"declared_categories":{"type":"array","items":{"type":"string"}}},"required":["platform","spec"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_competitors":{"post":{"operationId":"list_competitors","summary":"Los competidores de la marca, con lo que se leyó de cada uno: propuesta de valor, precio, estado de la última lectura de su sitio y de sus anuncios","description":"Los competidores de la marca, con lo que se leyó de cada uno: propuesta de valor, precio, estado de la última lectura de su sitio y de sus anuncios. Usala cuando te pregunten «contra quién competimos» o antes de mirar los anuncios de uno en particular.","tags":["Competitive"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["competitive:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"number","default":50,"description":"Máximo de filas"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_competitor":{"post":{"operationId":"get_competitor","summary":"Full detail of a competitor profile including 4Ps JSON, SWOT, tech stack, messaging themes","description":"Full detail of a competitor profile including 4Ps JSON, SWOT, tech stack, messaging themes.","tags":["Competitive"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["competitive:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"competitor_id":{"type":"string","description":"UUID of competitor_profiles row"}},"required":["competitor_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_competitor_ads":{"post":{"operationId":"list_competitor_ads","summary":"Los anuncios que un competidor está corriendo, con su pieza, su botón, a dónde manda y cuántos días lleva al aire","description":"Los anuncios que un competidor está corriendo, con su pieza, su botón, a dónde manda y cuántos días lleva al aire. Vienen de DOS fuentes y cada fila dice de cuál: `plataforma` = meta (biblioteca de anuncios, con copy) o google (Ads Transparency, que da la pieza pero NO el texto — esos anuncios se clasifican mirando la imagen). Sin métricas públicas, `days_active` es el único proxy de que un anuncio le funciona: por eso el orden por defecto es `longest_running`. Usala cuando pregunten «qué está pautando X» o «qué anuncio le funciona». `platforms` es otra cosa: son las UBICACIONES dentro de Meta (Facebook, Instagram), no la fuente. sort: longest_running | newest. media_type: image | video | carousel. plataforma: meta | google.","tags":["Competitive"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["competitive:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"competitor_id":{"type":"string","description":"Filtrar por un competidor"},"active_only":{"type":"boolean","default":true,"description":"Sólo los que están corriendo ahora"},"media_type":{"type":"string","enum":["image","video","carousel"],"description":"Filtrar por formato"},"plataforma":{"type":"string","enum":["meta","google"],"description":"De qué biblioteca salió el anuncio. Sin esto vienen las dos, mezcladas."},"sort":{"type":"string","enum":["longest_running","newest"],"default":"longest_running","description":"longest_running = los que más tiempo llevan al aire (lo que les funciona)"},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_competitor_ad_reports":{"post":{"operationId":"list_competitor_ad_reports","summary":"La lectura de qué le funciona a un competidor: mix de formatos, los anuncios que más tiempo llevan al aire, con qué cadencia lanza, a qué públicos le habla y dónde tenés lugar","description":"La lectura de qué le funciona a un competidor: mix de formatos, los anuncios que más tiempo llevan al aire, con qué cadencia lanza, a qué públicos le habla y dónde tenés lugar. Es lo que produce el análisis automático de sus anuncios.","tags":["Competitive"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["competitive:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"competitor_id":{"type":"string","description":"UUID de competitor_profiles"}},"required":["competitor_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_competitor_snapshots":{"post":{"operationId":"list_competitor_snapshots","summary":"Time-series snapshots per competitor (weekly) — active ads count, messaging themes, pricing, site diffs","description":"Time-series snapshots per competitor (weekly) — active ads count, messaging themes, pricing, site diffs.","tags":["Competitive"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["competitive:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"competitor_id":{"type":"string","description":"UUID of competitor_profiles row"},"limit":{"type":"number","default":12}},"required":["competitor_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_competitor_analyzer":{"post":{"operationId":"run_competitor_analyzer","summary":"Vuelve a leer el SITIO de un competidor: 4Ps, propuesta de valor, precio, tech stack, tono","description":"Vuelve a leer el SITIO de un competidor: 4Ps, propuesta de valor, precio, tech stack, tono. Cuesta ~3 créditos. NO trae sus anuncios ni sus redes (para eso están la cadencia automática y `sync_competitor_ads`). Usala cuando el sitio del competidor cambió o la lectura es vieja.","tags":["Competitive"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["competitive:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"competitor_id":{"type":"string","description":"UUID of competitor_profiles row"}},"required":["competitor_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/regenerate_competitor_swot":{"post":{"operationId":"regenerate_competitor_swot","summary":"DEPRECADA: usá `run_competitor_analyzer`, que ya produce el análisis del competidor","description":"DEPRECADA: usá `run_competitor_analyzer`, que ya produce el análisis del competidor. Esta tool invocaba una edge function que no existe y siempre falló.","tags":["Competitive"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["competitive:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"competitor_id":{"type":"string"}},"required":["competitor_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/sync_competitor_ads":{"post":{"operationId":"sync_competitor_ads","summary":"Trae los anuncios de un competidor de la Ad Library pública de META y los guarda","description":"Trae los anuncios de un competidor de la Ad Library pública de META y los guarda. Cuesta 10 créditos por competidor. Después corre solo la lectura de qué le funciona. Usala cuando `list_competitor_ads` devuelva vacío o los datos sean viejos. NO trae los de Google: ésos se traen desde la app (ficha del competidor) o por el cron, si la organización activó «incluir Google». Que esta tool no los cubra no quiere decir que no existan.","tags":["Competitive"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["competitive:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"competitor_id":{"type":"string"}},"required":["competitor_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_competitor_posts":{"post":{"operationId":"list_competitor_posts","summary":"Lo que un competidor publica en Instagram, TikTok o LinkedIn, con su engagement","description":"Lo que un competidor publica en Instagram, TikTok o LinkedIn, con su engagement. Es la mitad barata de copiar: un anuncio cuesta plata, un reel que funciona cuesta una idea. sort: engagement | newest.","tags":["Competitive"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["competitive:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"competitor_id":{"type":"string","description":"UUID de competitor_profiles"},"platform":{"type":"string","enum":["instagram","tiktok","linkedin"]},"sort":{"type":"string","enum":["engagement","newest"],"default":"engagement"},"limit":{"type":"number","default":20}},"required":["competitor_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_competitive_gap_analysis":{"post":{"operationId":"run_competitive_gap_analysis","summary":"Cross-competitor gap analysis: opportunities, positioning holes, messaging gaps","description":"Cross-competitor gap analysis: opportunities, positioning holes, messaging gaps. Uses competitive-gap-analyzer.","tags":["Competitive"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["competitive:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/suggest_competitors":{"post":{"operationId":"suggest_competitors","summary":"Use competitor-suggester to propose new competitors based on the org brand profile + industry","description":"Use competitor-suggester to propose new competitors based on the org brand profile + industry. Returns suggested names + domains; does NOT persist.","tags":["Competitive"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["competitive:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"number","default":5,"description":"Max suggestions"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_creative_templates":{"post":{"operationId":"list_creative_templates","summary":"Listá las plantillas para generar creativos estáticos brand-kit del Estudio (slug, nombre, categoría, si requiere foto, si soporta carrusel, descripción)","description":"Listá las plantillas para generar creativos estáticos brand-kit del Estudio (slug, nombre, categoría, si requiere foto, si soporta carrusel, descripción). Es el catálogo con el que se componen las piezas (hero con foto, minimalista editorial, testimonio, reseña, mockups de chat/WhatsApp/tweet, comparación, antes/después, etc.). NO son plantillas de tareas (esas van en list_templates) ni skills de análisis.","tags":["Tasks"],"security":[{"bearerAuth":["brand:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"category":{"type":"string","description":"Filtrar por categoría (ej. promo, announcement, social_proof)"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_brand_profile":{"post":{"operationId":"get_brand_profile","summary":"Get the full brand profile for the active org: name, website, description, target customers, voice, value prop, colors, settings, plus positioning statements, buyer personas, brand goals and known competitors","description":"Get the full brand profile for the active org: name, website, description, target customers, voice, value prop, colors, settings, plus positioning statements, buyer personas, brand goals and known competitors.","tags":["Brand IQ"],"x-module-flag":"module_brand_iq","security":[{"bearerAuth":["brand:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/update_brand_profile":{"post":{"operationId":"update_brand_profile","summary":"Update brand profile fields (description, target_customers, brand_voice, value_proposition, colors)","description":"Update brand profile fields (description, target_customers, brand_voice, value_proposition, colors). Does not trigger re-analysis.","tags":["Brand IQ"],"x-module-flag":"module_brand_iq","security":[{"bearerAuth":["brand:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"website_url":{"type":"string","format":"uri"},"company_description":{"type":"string"},"target_customers":{"type":"string"},"brand_voice":{"type":"string"},"value_proposition":{"type":"string"},"brand_color_primary":{"type":"string"},"brand_color_accent":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_brand_analyzer":{"post":{"operationId":"run_brand_analyzer","summary":"Run the brand-analyzer edge function on the org website","description":"Run the brand-analyzer edge function on the org website. Scrapes site, detects tech stack, infers voice/positioning, fills brand_* fields. Updates brand_analyzed_at.","tags":["Brand IQ"],"x-module-flag":"module_brand_iq","security":[{"bearerAuth":["brand:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_brand_competitors":{"post":{"operationId":"list_brand_competitors","summary":"Los competidores de la marca","description":"Los competidores de la marca. ALIAS de `list_competitors`, que es la tool viva — ésta queda para no romper los Projects que la nombran. Preferí `list_competitors`.","tags":["Competitive"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["brand:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/add_brand_competitor":{"post":{"operationId":"add_brand_competitor","summary":"Agrega un competidor a seguir","description":"Agrega un competidor a seguir. Guarda la marca; su sitio, sus anuncios y sus redes se leen después según la cadencia de la organización (o con `run_competitor_analyzer` y `sync_competitor_ads`, que gastan créditos).","tags":["Competitive"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["brand:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"website":{"type":"string","format":"uri"},"notes":{"type":"string"}},"required":["name"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/remove_brand_competitor":{"post":{"operationId":"remove_brand_competitor","summary":"Archiva un competidor","description":"Archiva un competidor. No borra sus anuncios ni su historial: la ficha deja de aparecer y las corridas dejan de gastarle créditos.","tags":["Competitive"],"x-module-flag":"module_competitive","security":[{"bearerAuth":["brand:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"brand_ref_id":{"type":"string","description":"El id del competidor (`id` o `brand_ref_id`)"}},"required":["brand_ref_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_brand_assets":{"post":{"operationId":"list_brand_assets","summary":"Listá la biblioteca de assets de marca del cliente (uploads, sitio, productos, ads, redes): imágenes/logos/fotos reales para usar como fondo o referencia antes de generar con IA","description":"Listá la biblioteca de assets de marca del cliente (uploads, sitio, productos, ads, redes): imágenes/logos/fotos reales para usar como fondo o referencia antes de generar con IA.","tags":["Brand IQ"],"security":[{"bearerAuth":["brand:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"source":{"type":"string","enum":["manual","site","store_product","meta_ad","social_post","review_ugc","derived"]},"for":{"type":"string","enum":["background","ad"],"description":"background/ad ordena primero los assets aptos para usar como fondo o pauta."},"limit":{"type":"integer","minimum":1,"maximum":100,"default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_creative_job":{"post":{"operationId":"get_creative_job","summary":"Consultá un render de creativo que quedó en curso (job_id que devuelve compose_static)","description":"Consultá un render de creativo que quedó en curso (job_id que devuelve compose_static). Devuelve status y, cuando termina, la image_url final.","tags":["General"],"security":[{"bearerAuth":["brand:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"job_id":{"type":"string","format":"uuid"}},"required":["job_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/compose_static":{"post":{"operationId":"compose_static","summary":"Generá una estática/post/placa brand-kit con texto vectorial nítido usando un template del Estudio","description":"Generá una estática/post/placa brand-kit con texto vectorial nítido usando un template del Estudio. Para el fondo preferí material REAL del cliente: brand_asset_id (ver list_brand_assets) o product_id; si no hay, background_prompt genera uno on-brand. No publica: devuelve URLs/render token.","tags":["General"],"security":[{"bearerAuth":["brand:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"template_slug":{"type":"string","minLength":1},"headline":{"type":"string","minLength":1},"subheadline":{"type":"string"},"contact_name":{"type":"string"},"cta":{"type":"string"},"badge":{"type":"string"},"bullets":{"type":"array","items":{"type":"string"}},"format":{"type":"string","enum":["feed","portrait","story"],"default":"feed"},"background_prompt":{"type":"string"},"background_style":{"type":"string","enum":["product_shot","lifestyle","flat_lay","cinematic","ugc_photo","minimal"],"description":"Preset que se SUMA al background_prompt. Si tu prompt ya describe la escena, omitilo: apilar \"minimal\" sobre una escena concreta empuja al modelo a un degradado abstracto."},"bg_storage_path":{"type":"string"},"brand_asset_id":{"type":"string","format":"uuid","description":"Asset de la biblioteca de marca a usar como fondo (list_brand_assets)."},"product_id":{"type":"string","format":"uuid","description":"Producto del catálogo: usa su foto como fondo."},"space_id":{"type":"string","format":"uuid","description":"Espacio donde guardar la pieza como nodo editable."},"node_id":{"type":"string","format":"uuid","description":"Nodo existente a actualizar (requiere space_id)."},"fidelity":{"type":"string","enum":["fast","rich"]}},"required":["template_slug","headline"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/compose_carousel":{"post":{"operationId":"compose_carousel","summary":"Generá un carrusel brand-kit de 3-7 slides con templates del Estudio","description":"Generá un carrusel brand-kit de 3-7 slides con templates del Estudio. No publica: devuelve image_url por slide.","tags":["General"],"security":[{"bearerAuth":["brand:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slides":{"type":"array","items":{"type":"object","properties":{"headline":{"type":"string","minLength":1},"body":{"type":"string"},"kind":{"type":"string","enum":["portada","tip","cierre"],"default":"tip","description":"portada y cierre NO llevan número; el contador cuenta sólo los tips"}},"required":["headline"],"additionalProperties":false},"minItems":3,"maxItems":7},"cta":{"type":"string"},"format":{"type":"string","enum":["feed","portrait"],"default":"portrait","description":"portrait 4:5 (default, el que más pantalla ocupa en el feed de Instagram) o feed 1:1"},"template_slug":{"type":"string","default":"carousel-tips"}},"required":["slides"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/compose_carousel_pdf":{"post":{"operationId":"compose_carousel_pdf","summary":"Convertí un carrusel ya generado (image_url por slide) en un PDF multipágina para subir manualmente como documento de LinkedIn","description":"Convertí un carrusel ya generado (image_url por slide) en un PDF multipágina para subir manualmente como documento de LinkedIn.","tags":["General"],"security":[{"bearerAuth":["brand:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"image_urls":{"type":"array","items":{"type":"string","format":"uri"},"minItems":2},"name":{"type":"string"}},"required":["image_urls"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_maturity_score":{"post":{"operationId":"get_maturity_score","summary":"Lee el último score/nivel de madurez de la org, estado persistido y próximos hitos","description":"Lee el último score/nivel de madurez de la org, estado persistido y próximos hitos.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"milestone_limit":{"type":"integer","minimum":1,"maximum":100,"default":20}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_maturity_score":{"post":{"operationId":"run_maturity_score","summary":"Recalcula el score de madurez y materializa snapshots/hitos","description":"Recalcula el score de madurez y materializa snapshots/hitos. No toca plataformas externas.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"source":{"type":"string","enum":["event","cron","onboarding"],"default":"event"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_benchmarks":{"post":{"operationId":"list_benchmarks","summary":"Lista benchmarks/referentes configurados en Brand IQ + capturas y recomendaciones derivadas","description":"Lista benchmarks/referentes configurados en Brand IQ + capturas y recomendaciones derivadas.","tags":["General"],"x-module-flag":"module_brand_iq","security":[{"bearerAuth":["brand:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":500,"default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_benchmark_analysis":{"post":{"operationId":"run_benchmark_analysis","summary":"Genera recomendaciones \"X/N benchmarks hacen Y — vos no\" comparando la marca contra sus benchmarks","description":"Genera recomendaciones \"X/N benchmarks hacen Y — vos no\" comparando la marca contra sus benchmarks. Requiere que los benchmarks estén capturados y analizados (se hace desde Benchmarks en la app / barrido semanal). Si falta un paso previo, la tool te dice exactamente qué falta y dónde hacerlo.","tags":["General"],"x-module-flag":"module_brand_iq","security":[{"bearerAuth":["brand:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_linkedin_campaigns":{"post":{"operationId":"query_linkedin_campaigns","summary":"Consulta campañas de LinkedIn Ads sincronizadas con impresiones, clicks, spend, conversiones y revenue por fecha","description":"Consulta campañas de LinkedIn Ads sincronizadas con impresiones, clicks, spend, conversiones y revenue por fecha.","tags":["Ads"],"x-module-flag":"module_linkedin_ads","security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":500,"default":100},"status":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_pinterest_campaigns":{"post":{"operationId":"query_pinterest_campaigns","summary":"Consulta campañas de Pinterest Ads sincronizadas: impresiones, clicks, inversión, conversiones y GUARDADOS (`saves`) por fecha","description":"Consulta campañas de Pinterest Ads sincronizadas: impresiones, clicks, inversión, conversiones y GUARDADOS (`saves`) por fecha. `saves` es la señal propia de Pinterest —guardar un pin es intención a futuro— y no tiene equivalente en las otras redes: las conversiones suelen tardar semanas, así que un 0 ahí no significa que la campaña no esté funcionando. No hay `reach`: Pinterest lo reporta siempre en 0, así que no se puede calcular frecuencia. La moneda va POR FILA (`currency`), no por cuenta.","tags":["Ads"],"x-module-flag":"module_pinterest_ads","security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":500,"default":100},"status":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_meli_ads":{"post":{"operationId":"query_meli_ads","summary":"Consulta campañas de Mercado Ads (Product Ads) sincronizadas: inversión, clicks, impresiones, CVR, unidades y facturación atribuida, con ACOS y ROAS por fecha","description":"Consulta campañas de Mercado Ads (Product Ads) sincronizadas: inversión, clicks, impresiones, CVR, unidades y facturación atribuida, con ACOS y ROAS por fecha. Ojo con la diferencia: `acos`/`roas` miran SOLO la venta que el aviso se atribuye, así que un ACOS bajo puede convivir con canibalización de ventas que ya eran orgánicas — para eso hay que comparar la inversión contra la facturación TOTAL del canal (TACoS), cruzando con query_orders.","tags":["MercadoLibre"],"x-module-flag":"module_mercadolibre","security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":500,"default":100},"status":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_amazon_campaigns":{"post":{"operationId":"query_amazon_campaigns","summary":"Consulta campañas de Amazon Ads sincronizadas con spend, sales, orders, ACOS y ROAS","description":"Consulta campañas de Amazon Ads sincronizadas con spend, sales, orders, ACOS y ROAS.","tags":["Ads"],"x-module-flag":"module_amazon","security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":500,"default":100},"state":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_amazon_orders":{"post":{"operationId":"query_amazon_orders","summary":"Consulta órdenes Amazon SP-API sincronizadas por fecha/status","description":"Consulta órdenes Amazon SP-API sincronizadas por fecha/status.","tags":["Ecommerce"],"x-module-flag":"module_amazon","security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"status":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":500,"default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_amazon_products":{"post":{"operationId":"query_amazon_products","summary":"Consulta catálogo Amazon sincronizado: ASIN/SKU, precio, stock e imagen","description":"Consulta catálogo Amazon sincronizado: ASIN/SKU, precio, stock e imagen.","tags":["Ecommerce"],"x-module-flag":"module_amazon","security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"search":{"type":"string"},"in_stock_only":{"type":"boolean","default":false},"limit":{"type":"integer","minimum":1,"maximum":500,"default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_creators":{"post":{"operationId":"list_creators","summary":"Lista creators/influencers/UGC/afiliados con métricas, status y affinity score","description":"Lista creators/influencers/UGC/afiliados con métricas, status y affinity score.","tags":["General"],"x-module-flag":"module_influencer_ugc","security":[{"bearerAuth":["crm:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["instagram","facebook","tiktok"]},"status":{"type":"string"},"min_affinity":{"type":"integer","minimum":0,"maximum":100},"limit":{"type":"integer","minimum":1,"maximum":500,"default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_creator_profile":{"post":{"operationId":"get_creator_profile","summary":"Detalle de un creator con posts recientes, colaboraciones y comisiones","description":"Detalle de un creator con posts recientes, colaboraciones y comisiones.","tags":["General"],"x-module-flag":"module_influencer_ugc","security":[{"bearerAuth":["crm:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"creator_id":{"type":"string","format":"uuid"},"posts_limit":{"type":"integer","minimum":0,"maximum":50,"default":12}},"required":["creator_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_creator_intel":{"post":{"operationId":"run_creator_intel","summary":"Ejecuta acciones seguras del módulo Influencer/UGC: search, enrich, score o score-creative","description":"Ejecuta acciones seguras del módulo Influencer/UGC: search, enrich, score o score-creative. No contacta creators ni paga comisiones.","tags":["General"],"x-module-flag":"module_influencer_ugc","security":[{"bearerAuth":["crm:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"action":{"type":"string","enum":["search","enrich","score","score-creative","seed-mentions"]},"platform":{"type":"string","enum":["instagram","facebook","tiktok","all"]},"creator_id":{"type":"string","format":"uuid"},"creator_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"query":{"type":"string"},"location":{"type":"string"},"min_followers":{"type":"integer","minimum":0},"limit":{"type":"integer","minimum":1,"maximum":50}},"required":["action"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_outbound_leads":{"post":{"operationId":"list_outbound_leads","summary":"Lista leads del grid outbound con señales de audit, fit/waste score y status","description":"Lista leads del grid outbound con señales de audit, fit/waste score y status.","tags":["CRM & Leads"],"x-module-flag":"module_outbound","security":[{"bearerAuth":["crm:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"grid_file_id":{"type":"string","format":"uuid"},"limit":{"type":"integer","minimum":1,"maximum":500,"default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_outbound_sequences":{"post":{"operationId":"list_outbound_sequences","summary":"Lista secuencias outbound (draft/active/paused) y sus pasos","description":"Lista secuencias outbound (draft/active/paused) y sus pasos.","tags":["General"],"x-module-flag":"module_outbound","security":[{"bearerAuth":["crm:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":500,"default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_outbound_campaigns":{"post":{"operationId":"list_outbound_campaigns","summary":"Lista campañas outbound y métricas de envío/respuesta","description":"Lista campañas outbound y métricas de envío/respuesta. Solo lectura.","tags":["Ads"],"x-module-flag":"module_outbound","security":[{"bearerAuth":["crm:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"channel":{"type":"string","enum":["email","whatsapp","ig_dm","linkedin"]},"limit":{"type":"integer","minimum":1,"maximum":500,"default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/create_outbound_sequence_draft":{"post":{"operationId":"create_outbound_sequence_draft","summary":"Crea una secuencia outbound en estado draft","description":"Crea una secuencia outbound en estado draft. No envía mensajes ni activa el cron.","tags":["General"],"x-module-flag":"module_outbound","security":[{"bearerAuth":["crm:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"steps":{"type":"array","items":{"type":"object","additionalProperties":{}},"minItems":1},"table_id":{"type":"string","format":"uuid"}},"required":["name","steps"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/upsert_outbound_leads":{"post":{"operationId":"upsert_outbound_leads","summary":"Crea/actualiza leads outbound por dominio dentro de la org","description":"Crea/actualiza leads outbound por dominio dentro de la org. No enriquece ni contacta.","tags":["CRM & Leads"],"x-module-flag":"module_outbound","security":[{"bearerAuth":["crm:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"leads":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"store_name":{"type":"string"},"country":{"type":"string"},"platform":{"type":"string"},"status":{"type":"string"},"data":{"type":"object","additionalProperties":{}},"audit":{"type":"object","additionalProperties":{}}},"additionalProperties":false},"minItems":1,"maxItems":100}},"required":["leads"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/propose_execute_outbound":{"post":{"operationId":"propose_execute_outbound","summary":"Propone enviar una campaña outbound aprobable vía Trust Layer","description":"Propone enviar una campaña outbound aprobable vía Trust Layer. NO envía: deja una acción pendiente de aprobación en Pymaia. Canales: email, whatsapp y linkedin. Cuándo NO usarla: para escribir el contenido de la secuencia usá create_outbound_sequence_draft; esta sólo propone el ENVÍO de una campaña que ya existe. OJO con whatsapp: sin NINGÚN contacto con opt-in cargado en la cuenta, el envío se rechaza — no es una restricción nuestra, es la política de Meta y el número en riesgo es el que el cliente usa para atender ventas. Ese chequeo es de la CUENTA, no por destinatario: que pase no significa que cada persona de esta campaña haya dado consentimiento, así que decíselo al usuario en vez de darlo por cubierto.","tags":["General"],"x-module-flag":"module_outbound","security":[{"bearerAuth":["actions:approve"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"campaign_id":{"type":"string","format":"uuid"},"channel":{"type":"string","enum":["email","whatsapp","linkedin"],"default":"email"},"opportunity_count":{"type":"integer","minimum":0},"reason":{"type":"string","minLength":1}},"required":["campaign_id","reason"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/create_social_post_draft":{"post":{"operationId":"create_social_post_draft","summary":"Crea un BORRADOR de posteo orgánico en el módulo de Posteos, listo para revisar y aprobar en la app","description":"Crea un BORRADOR de posteo orgánico en el módulo de Posteos, listo para revisar y aprobar en la app. No publica ni agenda: el borrador solo pasa a programado cuando una persona lo aprueba.","tags":["Organic Social"],"x-module-flag":"module_organic_social","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platforms":{"type":"array","items":{"type":"string","enum":["instagram","facebook","tiktok","linkedin","x","youtube","threads","pinterest","bluesky","google_business"]},"minItems":1,"description":"Redes donde va el posteo"},"caption":{"type":"string","minLength":1},"title":{"type":"string","description":"Nombre de la tarjeta. Repetirlo actualiza ese borrador en vez de crear otro."},"media_url":{"type":"string","format":"uri"},"scheduled_at":{"type":"string","description":"ISO-8601. Sin esto se propone en 24h."},"rationale":{"type":"string"}},"required":["platforms","caption"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/propose_schedule_social_post":{"post":{"operationId":"propose_schedule_social_post","summary":"[Deprecada] Usá create_social_post_draft: deja un borrador aprobable en Posteos, para todas las redes","description":"[Deprecada] Usá create_social_post_draft: deja un borrador aprobable en Posteos, para todas las redes.","tags":["Organic Social"],"x-module-flag":"module_organic_social","security":[{"bearerAuth":["actions:approve"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"image_url":{"type":"string","format":"uri"},"caption":{"type":"string"},"hashtags":{"type":"array","items":{"type":"string"}},"scheduled_at":{"type":"string"},"calendar_entry_id":{"type":"string","format":"uuid"},"reason":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_tiktok_campaigns":{"post":{"operationId":"query_tiktok_campaigns","summary":"Query TikTok Ads campaign performance (impressions, clicks, spend, conversions) for the org ad accounts","description":"Query TikTok Ads campaign performance (impressions, clicks, spend, conversions) for the org ad accounts.","tags":["Ads"],"x-module-flag":"module_tiktok_ads","security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string","description":"Start date YYYY-MM-DD"},"date_to":{"type":"string","description":"End date YYYY-MM-DD"},"limit":{"type":"number","description":"Max rows to return","default":50},"status":{"type":"string","description":"Filter by campaign status"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_google_ad_groups":{"post":{"operationId":"list_google_ad_groups","summary":"List Google Ads ad groups with performance","description":"List Google Ads ad groups with performance. Filter by campaign_id to drill down the hierarchy (campaign → ad group → ad).","tags":["Ads"],"security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"campaign_id":{"type":"string","description":"Filter by Google campaign_id"},"date_from":{"type":"string"},"date_to":{"type":"string"},"limit":{"type":"number","default":50,"description":"Filas diarias (ordenadas por fecha desc). Default bajo para no reventar el tamaño de respuesta; filtrá por campaign_id o acortá el rango en vez de subirlo."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_google_ads_ads":{"post":{"operationId":"list_google_ads_ads","summary":"List individual Google Ads ads (headline, description, ad_type) with performance","description":"List individual Google Ads ads (headline, description, ad_type) with performance. Use ad_group_id for hierarchy drill-down.","tags":["Ads"],"security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ad_group_id":{"type":"string"},"campaign_id":{"type":"string"},"date_from":{"type":"string"},"date_to":{"type":"string"},"limit":{"type":"number","default":50,"description":"Filas diarias (ordenadas por fecha desc). Default bajo para no reventar el tamaño de respuesta; filtrá por ad_group_id/campaign_id o acortá el rango en vez de subirlo."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_meta_creatives":{"post":{"operationId":"query_meta_creatives","summary":"Query Meta ad creatives with fatigue scores and thumbnails","description":"Query Meta ad creatives with fatigue scores and thumbnails. Useful for spotting creative fatigue and identifying top performers.","tags":["Ads"],"security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"min_fatigue_score":{"type":"number","description":"Return only creatives with fatigue >= this value"},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/propose_pause_campaign":{"post":{"operationId":"propose_pause_campaign","summary":"Propose pausing an ad campaign","description":"Propose pausing an ad campaign. Creates a pending agent_action that must be approved via approve_action. Supported platforms: meta, google, tiktok, pinterest.","tags":["Ads"],"security":[{"bearerAuth":["ads:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["meta","google","tiktok","pinterest"]},"campaign_id":{"type":"string","description":"Platform-native campaign id"},"reason":{"type":"string","description":"Why pause this campaign"}},"required":["platform","campaign_id","reason"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/propose_update_budget":{"post":{"operationId":"propose_update_budget","summary":"Propose updating daily budget on an ad campaign","description":"Propose updating daily budget on an ad campaign. Creates a pending agent_action for approval. Platforms: meta, google, tiktok.","tags":["Ads"],"security":[{"bearerAuth":["ads:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["meta","google","tiktok"]},"campaign_id":{"type":"string"},"new_daily_budget":{"type":"number","exclusiveMinimum":true,"minimum":0},"currency":{"type":"string"},"reason":{"type":"string"}},"required":["platform","campaign_id","new_daily_budget","reason"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_google_search_terms":{"post":{"operationId":"query_google_search_terms","summary":"Query Google Ads search terms (actual queries that triggered ads) with performance","description":"Query Google Ads search terms (actual queries that triggered ads) with performance. Spot wasted spend and negative-keyword candidates.","tags":["Ads"],"security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string","description":"Start date YYYY-MM-DD"},"date_to":{"type":"string","description":"End date YYYY-MM-DD"},"min_impressions":{"type":"number","description":"Return only terms with impressions >= this value"},"limit":{"type":"number","default":100,"description":"Filas diarias (ordenadas por fecha desc). Default bajo para no reventar el tamaño de respuesta; angostá con min_impressions o date range en vez de subirlo."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_google_keywords":{"post":{"operationId":"query_google_keywords","summary":"Query Google Ads keywords with Quality Score components (expected CTR, ad relevance, landing page experience) and performance","description":"Query Google Ads keywords with Quality Score components (expected CTR, ad relevance, landing page experience) and performance. Find low-QS keywords to fix.","tags":["Ads"],"security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"max_quality_score":{"type":"number","description":"Return only keywords with quality_score <= this value"},"limit":{"type":"number","default":25,"description":"Filas diarias (ordenadas por fecha desc). Default BAJO (cada keyword trae muchos campos: quality score + componentes) para no reventar el tamaño de respuesta; angostá con max_quality_score o date range en vez de subirlo."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_google_breakdowns":{"post":{"operationId":"query_google_breakdowns","summary":"Query Google Ads performance breakdowns by dimension (device, network, day-of-week, hour, geo, etc","description":"Query Google Ads performance breakdowns by dimension (device, network, day-of-week, hour, geo, etc.). Filter by dimension and/or campaign_id.","tags":["Ads"],"security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"dimension":{"type":"string","description":"Filter by breakdown dimension (e.g. device, network, hour)"},"campaign_id":{"type":"string"},"date_from":{"type":"string"},"date_to":{"type":"string"},"limit":{"type":"number","default":100,"description":"Filas diarias (ordenadas por fecha desc). Default bajo para no reventar el tamaño de respuesta; angostá con dimension/campaign_id o date range en vez de subirlo."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_meta_breakdowns":{"post":{"operationId":"query_meta_breakdowns","summary":"Query Meta Ads performance breakdowns (age, gender, placement, platform, device, etc","description":"Query Meta Ads performance breakdowns (age, gender, placement, platform, device, etc.). Filter by breakdown_type. Scope: org.","tags":["Ads"],"security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"breakdown_type":{"type":"string","description":"Filter by breakdown type (e.g. age, gender, publisher_platform)"},"date_from":{"type":"string"},"date_to":{"type":"string"},"limit":{"type":"number","default":500}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_meta_geo":{"post":{"operationId":"query_meta_geo","summary":"Query Meta Ads performance by geographic region (spend, revenue, conversions per region)","description":"Query Meta Ads performance by geographic region (spend, revenue, conversions per region). Scope: org.","tags":["Ads"],"security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"limit":{"type":"number","default":500}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_ga4_traffic_detail":{"post":{"operationId":"query_ga4_traffic_detail","summary":"Query GA4 traffic detail by source/medium/device/landing page (event counts + values)","description":"Query GA4 traffic detail by source/medium/device/landing page (event counts + values). Use ai_only=true to isolate generative-AI referral traffic (ChatGPT, Perplexity, Gemini, etc.). Scope: org.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"event_name":{"type":"string","description":"Filter by GA4 event name (e.g. page_view, purchase)"},"ai_only":{"type":"boolean","description":"Return only rows whose source is a generative-AI engine"},"limit":{"type":"number","default":500}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_ga4_demographics":{"post":{"operationId":"query_ga4_demographics","summary":"Query GA4 demographics — users and sessions by age bracket and gender","description":"Query GA4 demographics — users and sessions by age bracket and gender. Scope: org. No date dimension.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"number","default":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_google_gaql":{"post":{"operationId":"query_google_gaql","summary":"Advanced Google Ads GAQL reporting","description":"Advanced Google Ads GAQL reporting. In this MCP client this is a stub — the live GAQL report runs from the app chat (Maia). Use query_google_breakdowns / query_meta_breakdowns for dimensional breakdowns here.","tags":["Ads"],"security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","description":"GAQL query (ignored by this MCP stub)"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_indexation":{"post":{"operationId":"query_indexation","summary":"Google Search Console URL Inspection results: indexation status por página","description":"Google Search Console URL Inspection results: indexation status por página. El verdict crudo de GSC (PASS/PARTIAL/FAIL/NEUTRAL) es ambiguo (NEUTRAL lo comparten 404s y páginas canonicalizadas), así que cada fila trae un campo derivado `issue` legible: indexada / no_encontrada_404 / soft_404 / redirect / noindex / canonicalizada_ok (esperado, NO es problema) / no_indexada / otro. `not_indexed_count` cuenta solo problemas reales (excluye canonicalizada_ok). Snapshot (no date range); se puebla en el sync de Search Console (top páginas por impresiones, no todas).","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"only_problems":{"type":"boolean","description":"Only URLs that are not cleanly indexed (verdict != PASS or coverage not indexed / not found / error)"},"limit":{"type":"number","default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/estimate_meta_audience_overlap":{"post":{"operationId":"estimate_meta_audience_overlap","summary":"Estimate audience overlap between Meta ad sets from synced targeting (shared custom audiences + age/gender/geo/interests)","description":"Estimate audience overlap between Meta ad sets from synced targeting (shared custom audiences + age/gender/geo/interests). Flags ad sets competing for the same people (self-competition → inflated CPM, slow learning). NOT Meta's real overlap % (not exposed via API); a targeting-based estimate. Returns the ad set pairs with highest overlap.","tags":["Ads"],"security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"number","default":30,"description":"Window of days to take ad sets with recent activity"},"min_overlap":{"type":"number","default":0.3,"description":"0-1 threshold to report a pair"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_alert_rules":{"post":{"operationId":"list_alert_rules","summary":"List alert rules for the org — thresholds on platform metrics that fire notifications when breached","description":"List alert rules for the org — thresholds on platform metrics that fire notifications when breached. Use to get rule_id before update/delete.","tags":["Automation"],"security":[{"bearerAuth":["notifications:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["analytics","competitive","crm","ga4","google_ads","instagram","klaviyo","linkedin_ads","mercadolibre","meta_ads","omnisend","search_console","seo","shopify","tienda","tiktok_ads","tracking","x_ads"],"description":"Optional platform filter."},"enabled_only":{"type":"boolean","description":"If true, only enabled rules. Default false.","default":false},"limit":{"type":"number","description":"Max rows. Default 50.","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/create_alert_rule":{"post":{"operationId":"create_alert_rule","summary":"Create an alert rule","description":"Create an alert rule. When the metric breaches the threshold, a notification fires via the configured channels. Scoped to the current org.","tags":["Automation"],"security":[{"bearerAuth":["notifications:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Short rule name."},"description":{"type":"string","description":"Optional longer description."},"platform":{"type":"string","enum":["analytics","competitive","crm","ga4","google_ads","instagram","klaviyo","linkedin_ads","mercadolibre","meta_ads","omnisend","search_console","seo","shopify","tienda","tiktok_ads","tracking","x_ads"]},"metric":{"type":"string","description":"Debe ser una de las métricas de esa plataforma; cualquier otra crea una alerta que no puede dispararse nunca. Válidas por plataforma: analytics → attribution_gap, brand_cannibalization, channel_mix_reasignar, channel_mix_shift, day_of_week_pattern, funnel_step_drop, pagespeed_score, sync_lag_hours, unassigned_high · competitive → format_gap · crm → channel_dormant, lead_sin_contactar · ga4 → conversions · google_ads → ad_disapproved, anomaly, autopilot_peor_que_manual, no_optimized_targeting, roas, spend_pacing, waste_absolute · instagram → facebook_emparejado · klaviyo → best_subject_line_replicate, flow_underperforming, list_growth_stalled · linkedin_ads → cost_per_conversion, low_ctr, no_conversions, setup_pending · mercadolibre → buybox_lost, low_stock, negative_margin, reputation_at_risk, reputation_drop, tacos, unanswered_questions, visits_no_sales · meta_ads → account_no_funding, ad_disapproved, adset_no_advantage, anomaly, audience_overlap_high, compradores_sin_excluir, conversions, cost_per_conversion, cpa_absolute, cpm, family_winner_clear, format_gap_video, frequency, high_freq_refresh, learning_limited, roas, spend_pacing, top_ad_fatigue_duplicate, utm_missing, waste_ads, winner_pattern_amplify · omnisend → abandoned_cart_no_flow, bounce_rate, flow_inactive, open_rate, sms_channel_unused, unsubscribes, vip_segment_unused · search_console → ai_overview_visibility, cannibalization, clicks, errors, position · seo → canonical_missing, noindex, schema_broken · shopify → abandoned_carts, aov, inventory_low, orders, refund_rate · tienda → aov_bundle_opportunity, bestseller_under_promoted, first_buyer_retention_flow, repeat_buyer_rate_low · tiktok_ads → setup_pending · tracking → ga4_vs_store_gap · x_ads → setup_pending"},"condition":{"type":"string","enum":["gt","gte","lt","lte","%change_up","%change_down"]},"threshold":{"type":"number"},"comparison_period":{"type":"string","enum":["day","week","month"],"description":"Required for pct_change conditions."},"channels":{"type":"array","items":{"type":"string","enum":["dashboard","email","slack","whatsapp"]},"description":"Default [\"dashboard\"].","default":["dashboard"]}},"required":["name","platform","metric","condition","threshold"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/update_alert_rule":{"post":{"operationId":"update_alert_rule","summary":"Update fields on an alert rule (enabled, threshold, channels, etc)","description":"Update fields on an alert rule (enabled, threshold, channels, etc). Omit fields you do not want to change. Scoped to the current org.","tags":["Automation"],"security":[{"bearerAuth":["notifications:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rule_id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"threshold":{"type":"number"},"condition":{"type":"string","enum":["gt","gte","lt","lte","%change_up","%change_down"]},"comparison_period":{"type":"string","enum":["day","week","month"]},"enabled":{"type":"boolean"},"channels":{"type":"array","items":{"type":"string"}}},"required":["rule_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/delete_alert_rule":{"post":{"operationId":"delete_alert_rule","summary":"Delete an alert rule","description":"Delete an alert rule. Scoped to the current org.","tags":["Automation"],"security":[{"bearerAuth":["notifications:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rule_id":{"type":"string"}},"required":["rule_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/mark_notification_read":{"post":{"operationId":"mark_notification_read","summary":"Marca una notificación como leída","description":"Marca una notificación como leída. Pasá all=true para marcar todas las no leídas de la organización.","tags":["Recommendations"],"security":[{"bearerAuth":["notifications:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"notification_id":{"type":"string"},"all":{"type":"boolean","default":false}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/update_org_channels":{"post":{"operationId":"update_org_channels","summary":"Update the org notification channels (Slack webhook, quiet hours for Slack)","description":"Update the org notification channels (Slack webhook, quiet hours for Slack). Pass only the fields you want to change. Pass an empty string \"\" to clear a field. Scoped to the current org. NOTE: WhatsApp notifications are per-user (each member links their own number in Settings → Notifications); they are not configurable here.","tags":["General"],"security":[{"bearerAuth":["notifications:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slack_webhook_url":{"type":"string","description":"Slack incoming webhook URL. \"\" to clear."},"notification_quiet_hours_start":{"type":"string","description":"Quiet hours start (HH:MM). \"\" to clear."},"notification_quiet_hours_end":{"type":"string","description":"Quiet hours end (HH:MM). \"\" to clear."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_recommendations":{"post":{"operationId":"list_recommendations","summary":"List recommendations from the Recommendations Hub for the org","description":"List recommendations from the Recommendations Hub for the org. Use to get recommendation IDs before applying/snoozing/dismissing. Filter by status (default \"new\") and severity.","tags":["Recommendations"],"security":[{"bearerAuth":["notifications:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["new","snoozed","applied","dismissed","expired"],"default":"new"},"severity":{"type":"string","enum":["info","warning","critical"]},"module":{"type":"string"},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/apply_recommendation":{"post":{"operationId":"apply_recommendation","summary":"Mark a recommendation from the Recommendations Hub as applied (done)","description":"Mark a recommendation from the Recommendations Hub as applied (done). Use after the suggested change was actually carried out. Internal state only — does NOT mutate any external platform. Scoped to the current organization. Get the recommendation_id by first listing recommendations from the Recommendations Hub.","tags":["Recommendations"],"security":[{"bearerAuth":["notifications:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"recommendation_id":{"type":"string","description":"UUID of the recommendation to mark as applied."}},"required":["recommendation_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/snooze_recommendation":{"post":{"operationId":"snooze_recommendation","summary":"Snooze a recommendation for a number of hours (it reappears after)","description":"Snooze a recommendation for a number of hours (it reappears after). Use when the suggestion is valid but not actionable right now. Internal state only. Scoped to the current organization.","tags":["Recommendations"],"security":[{"bearerAuth":["notifications:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"recommendation_id":{"type":"string","description":"UUID of the recommendation to snooze."},"hours":{"type":"number","description":"Hours to snooze. Default 24.","default":24}},"required":["recommendation_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/dismiss_recommendation":{"post":{"operationId":"dismiss_recommendation","summary":"Dismiss a recommendation permanently (it will not reappear)","description":"Dismiss a recommendation permanently (it will not reappear). Use when the suggestion is not relevant or the user rejected it. Internal state only. Scoped to the current organization.","tags":["Recommendations"],"security":[{"bearerAuth":["notifications:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"recommendation_id":{"type":"string","description":"UUID of the recommendation to dismiss."},"reason":{"type":"string","description":"Optional short reason for dismissing (helps tune future recommendations)."}},"required":["recommendation_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_media_plan":{"post":{"operationId":"query_media_plan","summary":"List media plan items (planned campaigns by platform/funnel stage with budgets and KPIs) for the org, ordered by sort_order","description":"List media plan items (planned campaigns by platform/funnel stage with budgets and KPIs) for the org, ordered by sort_order. Use to get item ids before upsert/delete.","tags":["Growth Plan"],"x-module-flag":"module_growth_plan","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"number","description":"Max rows. Default 100.","default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/upsert_media_plan_item":{"post":{"operationId":"upsert_media_plan_item","summary":"Create or update a media plan item","description":"Create or update a media plan item. If id is provided, updates that row (by id+org); otherwise inserts a new one. Only the fields you pass are written. Scoped to the current org.","tags":["Growth Plan"],"x-module-flag":"module_growth_plan","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Item id to update. Omit to create a new item."},"platform":{"type":"string","description":"Uno de: meta, google, tiktok, microsoft, linkedin, youtube, twitter, pinterest."},"funnel_stage":{"type":"string","description":"Uno de: awareness, consideracion, conversion, retargeting, brand."},"campaign_name":{"type":"string"},"objective":{"type":"string"},"budget_pct":{"type":"number"},"budget_amount":{"type":"number"},"bidding_strategy":{"type":"string"},"kpi_primary":{"type":"string"},"kpi_target":{"type":"number"},"creative_format":{"type":"string"},"notes":{"type":"string"},"is_active":{"type":"boolean"},"sort_order":{"type":"number"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/delete_media_plan_item":{"post":{"operationId":"delete_media_plan_item","summary":"Delete a media plan item","description":"Delete a media plan item. Scoped to the current org.","tags":["Growth Plan"],"x-module-flag":"module_growth_plan","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_content_plan":{"post":{"operationId":"query_content_plan","summary":"List content plan ads (creative concepts mapped to funnel stage / awareness level with copy and briefs) for the org, ordered by sort_order","description":"List content plan ads (creative concepts mapped to funnel stage / awareness level with copy and briefs) for the org, ordered by sort_order. Use to get ad ids before upsert/delete.","tags":["Growth Plan"],"x-module-flag":"module_growth_plan","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"number","description":"Max rows. Default 100.","default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/upsert_content_plan_ad":{"post":{"operationId":"upsert_content_plan_ad","summary":"Create or update a content plan ad","description":"Create or update a content plan ad. If id is provided, updates that row (by id+org); otherwise inserts a new one. Only the fields you pass are written. Scoped to the current org.","tags":["Growth Plan"],"x-module-flag":"module_growth_plan","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Ad id to update. Omit to create a new ad."},"framework_ad_id":{"type":"string"},"funnel_stage":{"type":"string","description":"Uno de: tofu, mofu, bofu, rmk, ltv."},"awareness_level":{"type":"string","description":"Nivel de conciencia del framework PDA. Uno de: CI (consciente del inconveniente), CP (consciente del problema), CPS (consciente de la solución), CPCP (consciente del producto), RMK (remarketing)."},"format":{"type":"string"},"status":{"type":"string","description":"Uno de: pending, active, paused, done."},"campaign_destination":{"type":"string"},"copy":{"type":"string"},"creative_brief":{"type":"string"},"production_notes":{"type":"string"},"owner":{"type":"string"},"ad_link":{"type":"string"},"start_date":{"type":"string"},"live_date":{"type":"string"},"notes":{"type":"string"},"phase":{"type":"number","description":"Entero de 1 a 5."},"sort_order":{"type":"number"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/delete_content_plan_ad":{"post":{"operationId":"delete_content_plan_ad","summary":"Delete a content plan ad","description":"Delete a content plan ad. Scoped to the current org.","tags":["Growth Plan"],"x-module-flag":"module_growth_plan","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_account_plan":{"post":{"operationId":"query_account_plan","summary":"List account plan objectives (strategic goals by front with baseline/target/current values and health status) for the org, ordered by sort_order","description":"List account plan objectives (strategic goals by front with baseline/target/current values and health status) for the org, ordered by sort_order. Use to get objective ids before upsert/delete.","tags":["Growth Plan"],"x-module-flag":"module_growth_plan","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"number","description":"Max rows. Default 100.","default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/upsert_account_plan_objective":{"post":{"operationId":"upsert_account_plan_objective","summary":"Create or update an account plan objective","description":"Create or update an account plan objective. If id is provided, updates that row (by id+org); otherwise inserts a new one. Only the fields you pass are written. Scoped to the current org.","tags":["Growth Plan"],"x-module-flag":"module_growth_plan","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Objective id to update. Omit to create a new objective."},"front":{"type":"string","description":"Uno de: overall, meta_ads, google_ads, tiktok, seo, tienda, email, organic, brand, tracking."},"title":{"type":"string"},"metric_key":{"type":"string"},"unit":{"type":"string","description":"Uno de: currency, ratio_x, pct, count, days."},"currency_code":{"type":"string"},"direction":{"type":"string","description":"Uno de: increase, decrease."},"baseline_value":{"type":"number"},"target_value":{"type":"number"},"current_value":{"type":"number"},"timeframe":{"type":"string","description":"Uno de: month, quarter, year."},"period_start":{"type":"string"},"period_end":{"type":"string"},"owner_label":{"type":"string"},"priority":{"type":"number"},"lifecycle_status":{"type":"string","description":"Uno de: active, paused, archived."},"rationale":{"type":"string"},"sort_order":{"type":"number"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/delete_account_plan_objective":{"post":{"operationId":"delete_account_plan_objective","summary":"Delete an account plan objective","description":"Delete an account plan objective. Scoped to the current org.","tags":["Growth Plan"],"x-module-flag":"module_growth_plan","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_growth_plan":{"post":{"operationId":"query_growth_plan","summary":"List the growth plan for the org: phases (budget split by funnel stage with ICP, platforms, creative/copy angle, CTA, KPIs) and don'ts (rules to avoid)","description":"List the growth plan for the org: phases (budget split by funnel stage with ICP, platforms, creative/copy angle, CTA, KPIs) and don'ts (rules to avoid). Both ordered by sort_order. Use to get phase/dont ids before upsert/delete.","tags":["Growth Plan"],"x-module-flag":"module_growth_plan","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"number","description":"Max rows. Default 100.","default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/upsert_growth_plan_phase":{"post":{"operationId":"upsert_growth_plan_phase","summary":"Create or update a growth plan phase","description":"Create or update a growth plan phase. If id is provided, updates that row (by id+org); otherwise inserts a new one. Only the fields you pass are written. Scoped to the current org.","tags":["Growth Plan"],"x-module-flag":"module_growth_plan","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Phase id to update. Omit to create a new phase."},"phase":{"type":"string","description":"Uno de: awareness, consideracion, conversion."},"budget_pct":{"type":"number","description":"De 0 a 100."},"icp_label":{"type":"string"},"platforms":{"type":"array","items":{"type":"string"}},"creative_dominant":{"type":"string"},"copy_angle":{"type":"string"},"cta":{"type":"string"},"kpis":{"type":"array","items":{"type":"string"}},"period_months":{"type":"number"},"is_active":{"type":"boolean"},"sort_order":{"type":"number"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/delete_growth_plan_phase":{"post":{"operationId":"delete_growth_plan_phase","summary":"Delete a growth plan phase","description":"Delete a growth plan phase. Scoped to the current org.","tags":["Growth Plan"],"x-module-flag":"module_growth_plan","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/upsert_growth_plan_dont":{"post":{"operationId":"upsert_growth_plan_dont","summary":"Create or update a growth plan don't (a rule to avoid)","description":"Create or update a growth plan don't (a rule to avoid). If id is provided, updates that row (by id+org); otherwise inserts a new one. Only the fields you pass are written. Scoped to the current org.","tags":["Growth Plan"],"x-module-flag":"module_growth_plan","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Don't id to update. Omit to create a new one."},"rule":{"type":"string"},"rationale":{"type":"string"},"horizon_months":{"type":"number"},"active":{"type":"boolean"},"sort_order":{"type":"number"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/delete_growth_plan_dont":{"post":{"operationId":"delete_growth_plan_dont","summary":"Delete a growth plan don't","description":"Delete a growth plan don't. Scoped to the current org.","tags":["Growth Plan"],"x-module-flag":"module_growth_plan","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_leads":{"post":{"operationId":"list_leads","summary":"List CRM leads with status, value, assigned user, and linked contact","description":"List CRM leads with status, value, assigned user, and linked contact.","tags":["CRM & Leads"],"x-module-flag":"module_pymaia_crm","security":[{"bearerAuth":["crm:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["new","contacted","qualified","proposal","negotiating","won","lost"]},"limit":{"type":"number","default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/create_lead":{"post":{"operationId":"create_lead","summary":"Crea un nuevo lead","description":"Crea un nuevo lead. Opcionalmente vinculá a un contacto existente con contact_id.","tags":["CRM & Leads"],"x-module-flag":"module_pymaia_crm","security":[{"bearerAuth":["crm:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1},"contact_id":{"type":"string"},"status":{"type":"string","enum":["new","contacted","qualified","proposal","negotiating","won","lost"],"default":"new"},"value":{"type":"number"},"currency":{"type":"string","default":"ARS"},"source":{"type":"string"}},"required":["title"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/update_lead":{"post":{"operationId":"update_lead","summary":"Update lead fields (status, value, assigned_to)","description":"Update lead fields (status, value, assigned_to). Omit fields to keep unchanged.","tags":["CRM & Leads"],"x-module-flag":"module_pymaia_crm","security":[{"bearerAuth":["crm:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lead_id":{"type":"string"},"status":{"type":"string","enum":["new","contacted","qualified","proposal","negotiating","won","lost"]},"value":{"type":"number"},"assigned_to":{"type":"string","description":"user UUID"},"closed_at":{"type":"string","description":"ISO timestamp when lead closed"}},"required":["lead_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_lead_activities":{"post":{"operationId":"list_lead_activities","summary":"List activities (notes, calls, emails, stage changes) on a lead","description":"List activities (notes, calls, emails, stage changes) on a lead.","tags":["CRM & Leads"],"x-module-flag":"module_pymaia_crm","security":[{"bearerAuth":["crm:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"lead_id":{"type":"string"},"limit":{"type":"number","default":50}},"required":["lead_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/create_contact":{"post":{"operationId":"create_contact","summary":"Crea un contacto de CRM (persona)","description":"Crea un contacto de CRM (persona). Usá tags[] para segmentar.","tags":["CRM & Leads"],"x-module-flag":"module_pymaia_crm","security":[{"bearerAuth":["crm:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"full_name":{"type":"string","minLength":1},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"company":{"type":"string"},"source":{"type":"string","default":"manual"},"tags":{"type":"array","items":{"type":"string"},"default":[]}},"required":["full_name"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/configure_vendedor":{"post":{"operationId":"configure_vendedor","summary":"Configure the AI salesperson (Vera): what the business SELLS (playbook), its GOAL (what the conversation must achieve), the concrete conversion action, and its TONE","description":"Configure the AI salesperson (Vera): what the business SELLS (playbook), its GOAL (what the conversation must achieve), the concrete conversion action, and its TONE. Pass only what you want to change; \"\" clears a field. The goal matters: Vera's built-in stages push toward closing a catalog sale, so a business whose conversion is a signup, a booking or a quote must state it here or she pushes the wrong way. The playbook decides HOW she converses, not just how she sounds: \"catalogo\" asks about size and builds an order, \"servicios\" surveys the case and pushes to book or quote. Leave it unset to derive it from the org's industry. Writes the org's primary channel account (WhatsApp if present, otherwise Instagram or Messenger). On an org that has WhatsApp, that row is also the fallback config for the other channels.","tags":["General"],"x-module-flag":"module_vendedor","security":[{"bearerAuth":["crm:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"playbook":{"type":"string","enum":["catalogo","servicios"]},"objetivo":{"type":"string"},"accion_label":{"type":"string"},"accion_url":{"type":"string"},"tono":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_whatsapp_conversations":{"post":{"operationId":"list_whatsapp_conversations","summary":"List WhatsApp conversations for the org with last message preview","description":"List WhatsApp conversations for the org with last message preview.","tags":["WhatsApp"],"x-module-flag":"module_vendedor","security":[{"bearerAuth":["crm:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_whatsapp_messages":{"post":{"operationId":"list_whatsapp_messages","summary":"List messages of a WhatsApp conversation","description":"List messages of a WhatsApp conversation. Org is enforced via the conversation FK.","tags":["WhatsApp"],"x-module-flag":"module_vendedor","security":[{"bearerAuth":["crm:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"conversation_id":{"type":"string"},"limit":{"type":"number","default":100}},"required":["conversation_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_meli_category_map":{"post":{"operationId":"list_meli_category_map","summary":"Estado del mapeo de categorías MercadoLibre → tienda para el import de catálogo","description":"Estado del mapeo de categorías MercadoLibre → tienda para el import de catálogo. Las que están en \"proposed\" necesitan que una persona las confirme en la app.","tags":["MercadoLibre"],"x-module-flag":"module_mercadolibre","security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/preview_meli_import":{"post":{"operationId":"preview_meli_import","summary":"Qué se importaría del catálogo de MercadoLibre a la tienda: cuántas publicaciones, cuántas categorías distintas y cuántas tienen variaciones","description":"Qué se importaría del catálogo de MercadoLibre a la tienda: cuántas publicaciones, cuántas categorías distintas y cuántas tienen variaciones. Sólo lectura, no importa nada.","tags":["MercadoLibre"],"x-module-flag":"module_mercadolibre","security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_revenue_por_canal":{"post":{"operationId":"query_revenue_por_canal","summary":"Facturación por CANAL de venta en un período: cuánto dejó Shopify, cuánto Tiendanube, cuánto MercadoLibre, cuánto Amazon","description":"Facturación por CANAL de venta en un período: cuánto dejó Shopify, cuánto Tiendanube, cuánto MercadoLibre, cuánto Amazon. Usala para \"¿de dónde vino la plata?\", \"¿cuánto vendí en cada canal?\", reportes periódicos y cualquier comparación entre canales. Devuelve lo facturado (todo menos anulado) y lo COBRADO (pago capturado) por separado, en moneda nativa y en dólares.","tags":["General"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string","description":"YYYY-MM-DD"},"date_to":{"type":"string","description":"YYYY-MM-DD"}},"required":["date_from","date_to"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_meli_margin":{"post":{"operationId":"query_meli_margin","summary":"Margen neto por publicación de MercadoLibre: facturación menos la comisión REAL que cobró MeLi y el costo de envío","description":"Margen neto por publicación de MercadoLibre: facturación menos la comisión REAL que cobró MeLi y el costo de envío. Para \"¿qué me deja cada producto?\", \"¿cuál me hace perder plata?\" y cualquier análisis de rentabilidad en ML. Es margen ANTES del costo de mercadería.","tags":["MercadoLibre"],"x-module-flag":"module_mercadolibre","security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"number","minimum":1,"maximum":365,"default":30},"min_margin_pct":{"type":"number"},"limit":{"type":"number","minimum":1,"maximum":100,"default":20}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/check_meli_publishability":{"post":{"operationId":"check_meli_publishability","summary":"Revisa qué le falta al catálogo de la tienda para poder publicarse en MercadoLibre: categoría sugerida, atributos obligatorios que faltan, fotos inalcanzables, precio y stock","description":"Revisa qué le falta al catálogo de la tienda para poder publicarse en MercadoLibre: categoría sugerida, atributos obligatorios que faltan, fotos inalcanzables, precio y stock. NO publica nada.","tags":["MercadoLibre"],"x-module-flag":"module_mercadolibre","security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"siteId":{"type":"string","pattern":"^M[A-Z]{2}$","default":"MLA"},"limit":{"type":"number","minimum":1,"maximum":50,"default":20}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/import_meli_catalog":{"post":{"operationId":"import_meli_catalog","summary":"Arranca, retoma, consulta o cancela el import del catálogo de MercadoLibre a la tienda","description":"Arranca, retoma, consulta o cancela el import del catálogo de MercadoLibre a la tienda. Los productos entran OCULTOS: el usuario los revisa y publica. `destino` sólo cuenta al arrancar (el trabajo lo congela junto con la lista de ítems); si la org tiene más de una tienda conectada y no se especifica, va a Tiendanube.","tags":["MercadoLibre"],"x-module-flag":"module_mercadolibre","security":[{"bearerAuth":["ecommerce:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"action":{"type":"string","enum":["start","resume","status","cancel"],"default":"status"},"destino":{"type":"string","enum":["tiendanube","shopify","woocommerce"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_meli_listings":{"post":{"operationId":"list_meli_listings","summary":"List MercadoLibre listings with price, stock, visits","description":"List MercadoLibre listings with price, stock, visits.","tags":["MercadoLibre"],"x-module-flag":"module_mercadolibre","security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"search":{"type":"string"},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_meli_orders":{"post":{"operationId":"list_meli_orders","summary":"List MercadoLibre orders by date range","description":"List MercadoLibre orders by date range.","tags":["MercadoLibre"],"x-module-flag":"module_mercadolibre","security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"status":{"type":"string"},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_meli_questions":{"post":{"operationId":"list_meli_questions","summary":"List MercadoLibre pre-purchase questions","description":"List MercadoLibre pre-purchase questions. Default: unanswered only.","tags":["MercadoLibre"],"x-module-flag":"module_mercadolibre","security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["unanswered","answered","all"],"default":"unanswered"},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/propose_answer_meli_question":{"post":{"operationId":"propose_answer_meli_question","summary":"Propose an answer to a MercadoLibre question","description":"Propose an answer to a MercadoLibre question. Creates a pending agent_action that must be approved via approve_action.","tags":["MercadoLibre"],"x-module-flag":"module_mercadolibre","security":[{"bearerAuth":["ecommerce:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"question_id":{"type":"string","description":"MercadoLibre question_id"},"answer_text":{"type":"string","minLength":1,"maxLength":2000}},"required":["question_id","answer_text"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_abandoned_checkouts":{"post":{"operationId":"list_abandoned_checkouts","summary":"List abandoned checkouts from Shopify/Tiendanube with recovery URLs","description":"List abandoned checkouts from Shopify/Tiendanube with recovery URLs.","tags":["Ecommerce"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days_back":{"type":"number","default":30},"recovered":{"type":"string","enum":["all","recovered","not_recovered"],"default":"not_recovered"},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_sites":{"post":{"operationId":"list_sites","summary":"Listá sitios de Site Studio (code_sites) y sitios legacy Puck (client_sites) de la organización","description":"Listá sitios de Site Studio (code_sites) y sitios legacy Puck (client_sites) de la organización.","tags":["Sites"],"x-module-flag":"module_site_studio","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":100,"default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_site":{"post":{"operationId":"get_site","summary":"Detalle de un sitio por id","description":"Detalle de un sitio por id. Busca primero en Site Studio (code_sites) y luego en client_sites legacy.","tags":["Sites"],"x-module-flag":"module_site_studio","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"site_id":{"type":"string","format":"uuid"}},"required":["site_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_site_pages":{"post":{"operationId":"list_site_pages","summary":"Listá las páginas de un SITIO de Site Studio (el website builder)","description":"Listá las páginas de un SITIO de Site Studio (el website builder). Para sitios legacy Puck (client_sites) devuelve las páginas editables; para sitios de código (code_sites) devuelve las generaciones recientes + deep-link. OJO: NO son las páginas/blog de la TIENDA ecommerce (Shopify/Tiendanube) — esas se ven en el módulo Tienda de la app.","tags":["Sites"],"x-module-flag":"module_sites","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"site_id":{"type":"string","format":"uuid"},"limit":{"type":"integer","minimum":1,"maximum":200,"default":100}},"required":["site_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/create_site_draft":{"post":{"operationId":"create_site_draft","summary":"Crea un borrador seguro de Site Studio para la org","description":"Crea un borrador seguro de Site Studio para la org. No publica ni genera deploy; deja el sitio listo para abrir/generar desde la app.","tags":["Sites"],"x-module-flag":"module_site_studio","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"prompt":{"type":"string"}},"required":["name"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/propose_publish_site":{"post":{"operationId":"propose_publish_site","summary":"Prepara una propuesta para publicar/promover un sitio","description":"Prepara una propuesta para publicar/promover un sitio. NO publica directo ni crea acción ejecutable si no hay handler seguro; devuelve deep-link para aprobar/ejecutar en Site Studio.","tags":["Sites"],"x-module-flag":"module_site_studio","security":[{"bearerAuth":["actions:approve"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"site_id":{"type":"string","format":"uuid"},"target":{"type":"string","enum":["production","custom_domain"],"default":"production"},"reason":{"type":"string","minLength":1}},"required":["site_id","reason"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_landing_analyzer":{"post":{"operationId":"run_landing_analyzer","summary":"Corre el diagnóstico de landing (pilares de conversión) sobre una URL y devuelve el análisis","description":"Corre el diagnóstico de landing (pilares de conversión) sobre una URL y devuelve el análisis. Usa el endpoint interno server-to-server; `fresh` fuerza un scan nuevo en vez de la caché de 48h.","tags":["Sites"],"x-module-flag":"module_sites","security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"fresh":{"type":"boolean","default":false}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/optimize_product_content":{"post":{"operationId":"optimize_product_content","summary":"Optimiza la ficha (título + descripción, on-brand + SEO) de uno o varios productos de la tienda (Shopify o Tiendanube) del cliente","description":"Optimiza la ficha (título + descripción, on-brand + SEO) de uno o varios productos de la tienda (Shopify o Tiendanube) del cliente. Por defecto genera PREVIEW; apply=true escribe los cambios en Shopify (cobra créditos). Indicá los productos por nombre (se resuelven contra la tienda) o por id.","tags":["Ecommerce"],"security":[{"bearerAuth":["ecommerce:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"product_names":{"type":"array","items":{"type":"string"}},"product_ids":{"type":"array","items":{"type":"string"}},"apply":{"type":"boolean","default":false}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/optimize_meli_listing":{"post":{"operationId":"optimize_meli_listing","summary":"Optimiza el título (máx 60, keyword-first, sin texto promocional que ML modera) y la descripción de una o varias publicaciones de MercadoLibre del cliente con IA","description":"Optimiza el título (máx 60, keyword-first, sin texto promocional que ML modera) y la descripción de una o varias publicaciones de MercadoLibre del cliente con IA. Por defecto PREVIEW; apply=true escribe en MercadoLibre (cobra créditos). Indicá por nombre (listing_names) o por id (listing_ids).","tags":["MercadoLibre"],"x-module-flag":"module_mercadolibre","security":[{"bearerAuth":["ecommerce:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"listing_names":{"type":"array","items":{"type":"string"}},"listing_ids":{"type":"array","items":{"type":"string"}},"apply":{"type":"boolean","default":false}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_store_theme":{"post":{"operationId":"get_store_theme","summary":"Devuelve el TEMA/PLANTILLA (theme) de la tienda online conectada (Tiendanube/Shopify/WooCommerce) y cuál está publicado/activo (el live)","description":"Devuelve el TEMA/PLANTILLA (theme) de la tienda online conectada (Tiendanube/Shopify/WooCommerce) y cuál está publicado/activo (el live). Cuando el usuario pregunta por \"el template/tema/plantilla de la tienda\" (o \"de Tiendanube/Shopify\") se refiere a ESTO — NO a los templates de tareas de Pymaia (esos son list_templates). Nota Tiendanube: leer el tema requiere el token del editor de temas configurado; si falta, la tool lo dice (no inventes).","tags":["Ecommerce"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["shopify","tiendanube","woocommerce"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_members":{"post":{"operationId":"list_members","summary":"List users of the active org with their role","description":"List users of the active org with their role. Includes profile info (name, avatar).","tags":["Org & Connections"],"security":[{"bearerAuth":["admin:*"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/invite_user":{"post":{"operationId":"invite_user","summary":"Invite a user by email to join the active org with a role","description":"Invite a user by email to join the active org with a role. Creates an invitations row with a 7-day token.","tags":["General"],"security":[{"bearerAuth":["admin:*"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["admin","member","viewer"],"default":"viewer"}},"required":["email"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_invitations":{"post":{"operationId":"list_invitations","summary":"List pending and accepted invitations for the active org","description":"List pending and accepted invitations for the active org.","tags":["Org & Connections"],"security":[{"bearerAuth":["admin:*"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"include_accepted":{"type":"boolean","default":false},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/revoke_invitation":{"post":{"operationId":"revoke_invitation","summary":"Revoca una invitación pendiente (hard delete)","description":"Revoca una invitación pendiente (hard delete).","tags":["Org & Connections"],"security":[{"bearerAuth":["admin:*"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"invitation_id":{"type":"string"}},"required":["invitation_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/update_member_role":{"post":{"operationId":"update_member_role","summary":"Cambia el rol de un usuario en la organización activa","description":"Cambia el rol de un usuario en la organización activa. Roles: admin, member, viewer.","tags":["Org & Connections"],"security":[{"bearerAuth":["admin:*"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"user_id":{"type":"string"},"role":{"type":"string","enum":["admin","member","viewer"]}},"required":["user_id","role"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/remove_member":{"post":{"operationId":"remove_member","summary":"Quita a un usuario de la organización activa","description":"Quita a un usuario de la organización activa.","tags":["Org & Connections"],"security":[{"bearerAuth":["admin:*"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"user_id":{"type":"string"}},"required":["user_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_connections_detail":{"post":{"operationId":"list_connections_detail","summary":"Detalle completo de las conexiones de la org (cuenta conectada, scopes, fechas)","description":"Detalle completo de las conexiones de la org (cuenta conectada, scopes, fechas). Complementa a list_connections, que además trae el veredicto `health` y las pistas de qué hacer. Ojo: esta tool lee por service_role, así que ve TODAS las conexiones de la org — incluidas las personales de otros miembros, que list_connections oculta a propósito.","tags":["Org & Connections"],"security":[{"bearerAuth":["connections:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/disconnect_platform":{"post":{"operationId":"disconnect_platform","summary":"Revoke a platform connection (sets status=revoked)","description":"Revoke a platform connection (sets status=revoked). Does NOT delete encrypted tokens — they are wiped by a separate cleanup job.","tags":["General"],"security":[{"bearerAuth":["connections:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"connection_id":{"type":"string"}},"required":["connection_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_pagespeed_scores":{"post":{"operationId":"query_pagespeed_scores","summary":"Velocidad del sitio medida con PageSpeed Insights: puntaje de performance y Core Web Vitals (LCP, FID, CLS, TTFB) por URL y dispositivo, del escaneo más reciente hacia atrás","description":"Velocidad del sitio medida con PageSpeed Insights: puntaje de performance y Core Web Vitals (LCP, FID, CLS, TTFB) por URL y dispositivo, del escaneo más reciente hacia atrás. Devuelve una fila por URL y dispositivo. Lee lo YA escaneado — para medir ahora, primero run_pagespeed_scan. NO explica por qué la gente no compra: para eso está el embudo (query_ga4_funnel) o los carritos (query_carts).","tags":["Analytics"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Filter by URL"},"device":{"type":"string","enum":["mobile","desktop"]},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_pagespeed_scan":{"post":{"operationId":"run_pagespeed_scan","summary":"Dispara un scan de PageSpeed Insights para una URL vía la edge function pagespeed-scan","description":"Dispara un scan de PageSpeed Insights para una URL vía la edge function pagespeed-scan.","tags":["Analytics"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"device":{"type":"string","enum":["mobile","desktop"],"default":"mobile"}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_ga4_funnel":{"post":{"operationId":"query_ga4_funnel","summary":"Query GA4 ecommerce funnel events (view_item, add_to_cart, begin_checkout, purchase) by date range","description":"Query GA4 ecommerce funnel events (view_item, add_to_cart, begin_checkout, purchase) by date range. Use for drop-off analysis.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date_from":{"type":"string"},"date_to":{"type":"string"},"property_id":{"type":"string"},"limit":{"type":"number","default":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_social_accounts":{"post":{"operationId":"list_social_accounts","summary":"List organic social accounts (Instagram, TikTok, LinkedIn, X, YouTube, Facebook) with followers count","description":"List organic social accounts (Instagram, TikTok, LinkedIn, X, YouTube, Facebook) with followers count.","tags":["Organic Social"],"x-module-flag":"module_organic_social","security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_social_posts":{"post":{"operationId":"list_social_posts","summary":"List organic social posts with engagement metrics across Instagram, TikTok, LinkedIn, X, YouTube and Facebook","description":"List organic social posts with engagement metrics across Instagram, TikTok, LinkedIn, X, YouTube and Facebook.","tags":["Organic Social"],"x-module-flag":"module_organic_social","security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"social_account_id":{"type":"string"},"platform":{"type":"string","enum":["instagram","tiktok","linkedin","x","youtube","facebook_page"],"description":"Red social (instagram | tiktok | linkedin | x | youtube | facebook_page)"},"days_back":{"type":"number","default":30},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_social_metrics":{"post":{"operationId":"list_social_metrics","summary":"Time-series daily metrics per social account (followers, reach, impressions, engagement_rate)","description":"Time-series daily metrics per social account (followers, reach, impressions, engagement_rate).","tags":["Organic Social"],"x-module-flag":"module_organic_social","security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"social_account_id":{"type":"string"},"days_back":{"type":"number","default":30}},"required":["social_account_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_ai_usage":{"post":{"operationId":"get_ai_usage","summary":"Get AI usage (message count, tokens, cost USD) for the org in a given month","description":"Get AI usage (message count, tokens, cost USD) for the org in a given month. Defaults to the current month.","tags":["Account"],"security":[{"bearerAuth":["billing:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"month":{"type":"string","description":"YYYY-MM; defaults to current month"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_ai_usage_history":{"post":{"operationId":"list_ai_usage_history","summary":"Time-series of AI usage per month for the org","description":"Time-series of AI usage per month for the org.","tags":["Account"],"security":[{"bearerAuth":["billing:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"number","default":12}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_credit_balance":{"post":{"operationId":"get_credit_balance","summary":"Saldo de créditos de IA: el total disponible (mensualidad del plan + packs comprados, que no vencen), el plan, el cupo mensual, cuándo fue el último reset y cuándo es el próximo","description":"Saldo de créditos de IA: el total disponible (mensualidad del plan + packs comprados, que no vencen), el plan, el cupo mensual, cuándo fue el último reset y cuándo es el próximo.","tags":["Account"],"security":[{"bearerAuth":["billing:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_credit_transactions":{"post":{"operationId":"list_credit_transactions","summary":"List credit transactions (grants, AI consumption, purchases, admin adjustments) for the org","description":"List credit transactions (grants, AI consumption, purchases, admin adjustments) for the org.","tags":["Recommendations"],"security":[{"bearerAuth":["billing:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","enum":["monthly_grant","purchase","ai_message","refund","admin_adjustment","trial_grant","addon"]},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_credit_packs":{"post":{"operationId":"list_credit_packs","summary":"List credit packs available for purchase (name, credits, price_usd)","description":"List credit packs available for purchase (name, credits, price_usd).","tags":["Account"],"security":[{"bearerAuth":["billing:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_workspace_files":{"post":{"operationId":"list_workspace_files","summary":"Lista los archivos del workspace: artefactos markdown que GENERA el asistente (business-profile","description":"Lista los archivos del workspace: artefactos markdown que GENERA el asistente (business-profile.md, brand-guidelines.md, estrategias, reportes). OJO: NO son los documentos/PDFs/CSV que SUBIÓ el usuario — para esos uploads ingeridos usá list_documents.","tags":["Spaces"],"security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"category":{"type":"string","enum":["brand","research","strategy","report","other"]},"pinned_only":{"type":"boolean","default":false},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_workspace_file":{"post":{"operationId":"get_workspace_file","summary":"Lee el contenido markdown completo de un archivo del workspace por id","description":"Lee el contenido markdown completo de un archivo del workspace por id.","tags":["Spaces"],"security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file_id":{"type":"string"}},"required":["file_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/create_workspace_file":{"post":{"operationId":"create_workspace_file","summary":"Crea un documento del workspace: markdown (\"doc\"), una GRILLA de columnas y filas (\"grid\") o una PRESENTACIÓN (\"slides\")","description":"Crea un documento del workspace: markdown (\"doc\"), una GRILLA de columnas y filas (\"grid\") o una PRESENTACIÓN (\"slides\"). Para una tabla lo más simple es mandar `table` con headers y rows: el server arma la grilla y genera los ids. Devuelve el link para abrirlo en Pymaia. Cuándo NO usarla: para leer o listar lo que ya existe (list_workspace_files / get_workspace_file), para editar uno existente (update_workspace_file — esta crea uno nuevo cada vez), ni para subir una imagen o un video: eso son assets de la app, no documentos.","tags":["Spaces"],"security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"category":{"type":"string","enum":["brand","research","strategy","report","other"]},"doc_type":{"type":"string","enum":["doc","grid","slides"],"default":"doc","description":"doc = markdown · grid = grilla · slides = presentación"},"content":{"type":"string","maxLength":200000,"description":"Markdown. Sólo para doc_type \"doc\"."},"table":{"type":"object","properties":{"headers":{"type":"array","items":{"type":"string"},"minItems":1},"rows":{"type":"array","items":{"type":"array","items":{"type":"string"}}}},"required":["headers","rows"],"additionalProperties":false,"description":"Atajo para \"grid\": headers + rows. El server genera los ids."},"content_json":{"anyOf":[{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string","enum":["text","url","dropdown","file","metric","brand_voice","audience","agent","prompt"],"default":"text"},"options":{"type":"array","items":{"type":"string"}}},"required":["id","name"],"additionalProperties":false},"minItems":1},"rows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"cells":{"type":"object","additionalProperties":{"type":"object","properties":{"value":{"type":"string"},"href":{"type":"string","description":"Link interno (/...) o externo"}},"required":["value"],"additionalProperties":false}}},"required":["id","cells"],"additionalProperties":false}},"viewMode":{"type":"string","enum":["condensed","expanded"]}},"required":["columns","rows"],"additionalProperties":false},{"type":"object","properties":{"theme":{"type":"string","enum":["pymaia","helena","minimal","brand"],"default":"pymaia"},"slides":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","description":"Tipo de slide: 'title', 'content', 'bullets', 'image', 'chart'…"},"layoutId":{"type":"string","description":"Layout: 'cover', 'bullet-list', 'two-columns', 'metric'…"},"data":{"type":"object","additionalProperties":{},"description":"Campos del layout: title, subtitle, items, body…"}},"required":["id","type"],"additionalProperties":false},"minItems":1}},"required":["slides"],"additionalProperties":false}],"description":"Contenido estructurado de grid o slides, si querés controlar los ids."},"is_pinned":{"type":"boolean","default":false}},"required":["name","category"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/update_workspace_file":{"post":{"operationId":"update_workspace_file","summary":"Actualiza un documento del workspace: name, category, is_pinned, el markdown (`content`) o el contenido de una grilla/presentación (`table` o `content_json`)","description":"Actualiza un documento del workspace: name, category, is_pinned, el markdown (`content`) o el contenido de una grilla/presentación (`table` o `content_json`). Sólo se escribe lo que mandás, y devuelve el documento actualizado con el link para abrirlo. Cuándo NO usarla: para crear uno nuevo es create_workspace_file, y para borrarlo delete_workspace_file. Si mandás `table` reemplaza la grilla ENTERA, no agrega filas.","tags":["Spaces"],"security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file_id":{"type":"string"},"name":{"type":"string"},"category":{"type":"string","enum":["brand","research","strategy","report","other"]},"content":{"type":"string","maxLength":200000},"table":{"type":"object","properties":{"headers":{"type":"array","items":{"type":"string"},"minItems":1},"rows":{"type":"array","items":{"type":"array","items":{"type":"string"}}}},"required":["headers","rows"],"additionalProperties":false,"description":"Reemplaza la grilla entera. El server genera los ids."},"content_json":{"anyOf":[{"type":"object","properties":{"columns":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string","enum":["text","url","dropdown","file","metric","brand_voice","audience","agent","prompt"],"default":"text"},"options":{"type":"array","items":{"type":"string"}}},"required":["id","name"],"additionalProperties":false},"minItems":1},"rows":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"cells":{"type":"object","additionalProperties":{"type":"object","properties":{"value":{"type":"string"},"href":{"type":"string","description":"Link interno (/...) o externo"}},"required":["value"],"additionalProperties":false}}},"required":["id","cells"],"additionalProperties":false}},"viewMode":{"type":"string","enum":["condensed","expanded"]}},"required":["columns","rows"],"additionalProperties":false},{"type":"object","properties":{"theme":{"type":"string","enum":["pymaia","helena","minimal","brand"],"default":"pymaia"},"slides":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","description":"Tipo de slide: 'title', 'content', 'bullets', 'image', 'chart'…"},"layoutId":{"type":"string","description":"Layout: 'cover', 'bullet-list', 'two-columns', 'metric'…"},"data":{"type":"object","additionalProperties":{},"description":"Campos del layout: title, subtitle, items, body…"}},"required":["id","type"],"additionalProperties":false},"minItems":1}},"required":["slides"],"additionalProperties":false}]},"is_pinned":{"type":"boolean"}},"required":["file_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/delete_workspace_file":{"post":{"operationId":"delete_workspace_file","summary":"Elimina un archivo del workspace","description":"Elimina un archivo del workspace.","tags":["Spaces"],"security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file_id":{"type":"string"}},"required":["file_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_spaces":{"post":{"operationId":"list_spaces","summary":"List creative spaces (canvases with nodes/workflows) for the org","description":"List creative spaces (canvases with nodes/workflows) for the org.","tags":["Spaces"],"x-module-flag":"module_spaces","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["draft","active","completed","archived"]},"limit":{"type":"number","default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_space":{"post":{"operationId":"get_space","summary":"Trae un espacio con sus nodos y conexiones (grafo del canvas)","description":"Trae un espacio con sus nodos y conexiones (grafo del canvas).","tags":["Spaces"],"x-module-flag":"module_spaces","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"space_id":{"type":"string"}},"required":["space_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/create_space":{"post":{"operationId":"create_space","summary":"Crea un nuevo espacio creativo (canvas vacío)","description":"Crea un nuevo espacio creativo (canvas vacío).","tags":["Spaces"],"x-module-flag":"module_spaces","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"description":{"type":"string"},"tags":{"type":"array","items":{"type":"string"},"default":[]}},"required":["name"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/create_space_node":{"post":{"operationId":"create_space_node","summary":"Create a node in a space (canvas)","description":"Create a node in a space (canvas). For AI generator nodes (ai-image-gen, ai-text-gen, ai-video-gen, ai-static-gen) you can preload the prompt/params in `config`; the node stays in draft and generation is triggered later. Returns the created node id (use it in connect_space_nodes).","tags":["Spaces"],"x-module-flag":"module_spaces","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"space_id":{"type":"string"},"type":{"type":"string","enum":["brief","text","image","video","audio","document","note","group","ai-text-gen","ai-image-gen","ai-video-gen","ai-static-gen","ai-upscaler","ai-assistant","ai-audio-gen","ai-adapt","ai-avatar-gen","ai-video-postprod","ai-variants","publish","transcriptor","remotion-render","reel-project","video-composer","outreach-wait","outreach-email","outreach-dm","outreach-condition","ad-reference","audience","product","signal","post"]},"title":{"type":"string"},"content":{"type":"string"},"position_x":{"type":"number","default":0},"position_y":{"type":"number","default":0},"config":{"type":"object","additionalProperties":{}},"platform":{"type":"string"},"source":{"type":"string","enum":["manual","ai_text","ai_image","ai_video","ai_compose","ai_audio","ai_decompose","remotion","higgsfield","canva","freepik","upload","ad_library","ad_reference","audience","template","product"],"default":"manual"}},"required":["space_id","type"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/connect_space_nodes":{"post":{"operationId":"connect_space_nodes","summary":"Connect two nodes in a space with an edge (source output → target input)","description":"Connect two nodes in a space with an edge (source output → target input). Use to build the flow (e.g. brief → ai-text-gen → ai-image-gen). Both nodes must exist in the same space.","tags":["Spaces"],"x-module-flag":"module_spaces","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"space_id":{"type":"string"},"source_node_id":{"type":"string"},"target_node_id":{"type":"string"},"source_handle":{"type":"string","default":"output"},"target_handle":{"type":"string","default":"input"},"label":{"type":"string"}},"required":["space_id","source_node_id","target_node_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/update_space_node":{"post":{"operationId":"update_space_node","summary":"Update a node in a space by id","description":"Update a node in a space by id. Only the fields you pass are written (title, content, status, position, config). Scoped to the current org.","tags":["Spaces"],"x-module-flag":"module_spaces","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"UUID of the node to update."},"title":{"type":"string"},"content":{"type":"string"},"status":{"type":"string"},"position_x":{"type":"number"},"position_y":{"type":"number"},"config":{"type":"object","additionalProperties":{},"description":"JSONB config to replace."}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/delete_space_node":{"post":{"operationId":"delete_space_node","summary":"Delete a node in a space by id","description":"Delete a node in a space by id. Scoped to the current org.","tags":["Spaces"],"x-module-flag":"module_spaces","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"UUID of the node to delete."}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/delete_space_edge":{"post":{"operationId":"delete_space_edge","summary":"Delete an edge (connection) between nodes in a space by id","description":"Delete an edge (connection) between nodes in a space by id. space_edges has no org_id: the edge's space is verified to belong to the org before deleting.","tags":["Spaces"],"x-module-flag":"module_spaces","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"UUID of the edge to delete."}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/generate_daily_report":{"post":{"operationId":"generate_daily_report","summary":"Generate the daily morning report for the org (cross-channel KPIs, insights, recommended actions)","description":"Generate the daily morning report for the org (cross-channel KPIs, insights, recommended actions). Calls daily-report-generate edge function.","tags":["General"],"security":[{"bearerAuth":["reports:run"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string","description":"YYYY-MM-DD; defaults to today"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/send_daily_digest_email":{"post":{"operationId":"send_daily_digest_email","summary":"Send the daily digest email for the org (calls daily-digest-email edge function)","description":"Send the daily digest email for the org (calls daily-digest-email edge function). Uses the most recent daily report.","tags":["Email"],"security":[{"bearerAuth":["reports:run"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_store_connections":{"post":{"operationId":"list_store_connections","summary":"List Shopify/Tiendanube store connections for the org (store_id, store_name, store_url, last_sync)","description":"List Shopify/Tiendanube store connections for the org (store_id, store_name, store_url, last_sync).","tags":["Ecommerce"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["shopify","tiendanube"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_store_orders":{"post":{"operationId":"list_store_orders","summary":"Órdenes de la tienda (Shopify/Tiendanube), de la más nueva a la más vieja, filtrables por fecha y estado","description":"Órdenes de la tienda (Shopify/Tiendanube), de la más nueva a la más vieja, filtrables por fecha y estado. Cada orden trae sus `line_items` (qué productos y cuántos), el email del comprador y los UTMs con los que entró. Son las órdenes CRUDAS: para facturación, ticket promedio o ROAS de la tienda usá get_kpi_summary, y para atribución (de qué campaña vino cada venta) query_orders. NO incluye carritos abandonados: eso es list_abandoned_checkouts.","tags":["Ecommerce"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["shopify","tiendanube"]},"date_from":{"type":"string","description":"YYYY-MM-DD"},"date_to":{"type":"string","description":"YYYY-MM-DD"},"status":{"type":"string"},"limit":{"type":"number","default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_store_order":{"post":{"operationId":"get_store_order","summary":"UNA orden de la tienda, entera: qué se vendió (line_items), quién compró (nombre, email, teléfono, ciudad), de dónde vino (UTMs y click ids de Meta/Google/TikTok) y el link para abrirla en la plataforma","description":"UNA orden de la tienda, entera: qué se vendió (line_items), quién compró (nombre, email, teléfono, ciudad), de dónde vino (UTMs y click ids de Meta/Google/TikTok) y el link para abrirla en la plataforma. Buscá por el número que ve el cliente (`order_id`, acepta \"#2125\" o \"2125\"). Cuándo NO usarla: para VARIAS órdenes usá list_store_orders, para facturación o ticket promedio get_kpi_summary, y para atribución agregada por campaña query_orders. No devuelve la dirección de envío: para eso abrí la orden en la plataforma con el link que trae.","tags":["Ecommerce"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"order_id":{"type":"string","description":"El número de orden que ve el cliente. Acepta \"#2125\" o \"2125\"."},"platform":{"type":"string","enum":["shopify","tiendanube"]}},"required":["order_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_store_products":{"post":{"operationId":"list_store_products","summary":"Productos de la tienda (Shopify/Tiendanube) con precio, stock, estado y métricas","description":"Productos de la tienda (Shopify/Tiendanube) con precio, stock, estado y métricas. Si buscás UN producto o una línea, pasá `search` con parte del nombre en vez de listar todo y leer: un catálogo real tiene cientos y el listado se corta por `limit`, así que sin buscar el que te importa puede no estar en la respuesta. NO trae ventas por producto — eso es query_products.","tags":["Ecommerce"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["shopify","tiendanube"]},"search":{"type":"string","description":"Parte del nombre del producto. Búsqueda parcial, sin distinguir mayúsculas."},"status":{"type":"string"},"in_stock_only":{"type":"boolean","default":false},"limit":{"type":"number","default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_geo_queries":{"post":{"operationId":"list_geo_queries","summary":"Tracker MANUAL legacy de queries GEO (las que se cargaron a mano para monitorear en ChatGPT/Perplexity/Gemini)","description":"Tracker MANUAL legacy de queries GEO (las que se cargaron a mano para monitorear en ChatGPT/Perplexity/Gemini). OJO: para la visibilidad REAL en IA (SoV, menciones, score) que muestra el módulo GEO usá get_ai_visibility / get_aeo_score / list_ai_mentions — esta tool puede venir vacía aunque haya datos de visibilidad.","tags":["GEO"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"active_only":{"type":"boolean","default":false},"limit":{"type":"number","default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/create_geo_query":{"post":{"operationId":"create_geo_query","summary":"Create a GEO tracked query to monitor brand visibility in AI engines (ChatGPT/Perplexity/Gemini)","description":"Create a GEO tracked query to monitor brand visibility in AI engines (ChatGPT/Perplexity/Gemini).","tags":["GEO"],"security":[{"bearerAuth":["brand:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":1},"brand_name":{"type":"string","minLength":1},"engines":{"type":"array","items":{"type":"string","enum":["chatgpt","perplexity","gemini"]},"default":["chatgpt","perplexity","gemini"]}},"required":["query","brand_name"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_geo_results":{"post":{"operationId":"list_geo_results","summary":"List GEO result samples per engine for a tracked query (brand_mentioned, position, snippet)","description":"List GEO result samples per engine for a tracked query (brand_mentioned, position, snippet). Useful to see if the brand shows up in AI answers over time.","tags":["GEO"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"geo_query_id":{"type":"string"},"engine":{"type":"string","enum":["chatgpt","perplexity","gemini"]},"limit":{"type":"number","default":100}},"required":["geo_query_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_pixel_scan":{"post":{"operationId":"get_pixel_scan","summary":"Devuelve el último scan de pixels/tracking del sitio de LA ORG (Meta Pixel, GA4, GTM, Google Ads, TikTok, Hotjar, Clarity)","description":"Devuelve el último scan de pixels/tracking del sitio de LA ORG (Meta Pixel, GA4, GTM, Google Ads, TikTok, Hotjar, Clarity). Guardado en organizations.settings.pixel_scan. El scan corre con un navegador real (Playwright) que ejecuta JS y captura los requests reales → `method:\"headless\"` + `confidence:\"network\"` significa que el pixel DISPARÓ de verdad (ground truth). Si `method:\"static\"` (fallback, servicio caído) un `false` puede ser falso negativo (no ve tags vía GTM/checkout) → cruzá con estado_conexiones. EXCEPCIÓN meta_capi: es server-to-server y NO se puede verificar desde el navegador — un `present:false` ahí significa \"no verificable\", nunca \"no configurado\" (mirá _meta_capi_caveat). Para escanear el sitio de una URL cualquiera (no el de la org) usá diagnose_page.","tags":["Analytics"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_server_side_tracking":{"post":{"operationId":"get_server_side_tracking","summary":"Estado REAL de Meta Conversions API (CAPI) y Google Enhanced Conversions, consultado a las APIs de las plataformas (no al navegador)","description":"Estado REAL de Meta Conversions API (CAPI) y Google Enhanced Conversions, consultado a las APIs de las plataformas (no al navegador). Para CAPI usa las stats del pixel por ORIGEN DE EVENTO en Meta: `capi_active:true` = Meta recibió eventos de servidor; `false` = no recibió; `null` = no se pudo determinar (sin permisos/sin datos). ESTA es la fuente para responder \"¿tiene Conversions API?\" — get_pixel_scan NO puede saberlo (es un scan de navegador y CAPI es server-to-server). Si está vacío, corré el health check desde Tracking Health en la app.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_pixel_scan":{"post":{"operationId":"run_pixel_scan","summary":"Escanea el sitio de LA ORG con un navegador real (ejecuta JS, captura requests) y guarda el resultado en settings (lo lee get_pixel_scan)","description":"Escanea el sitio de LA ORG con un navegador real (ejecuta JS, captura requests) y guarda el resultado en settings (lo lee get_pixel_scan). Detecta Meta/GA4/GTM/Google Ads/TikTok/Hotjar/Clarity con señal de red. Para diagnosticar UNA URL arbitraria (no el sitio de la org) usá diagnose_page.","tags":["Analytics"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_server_side_tracking":{"post":{"operationId":"run_server_side_tracking","summary":"Dispara un chequeo FRESCO de tracking server-side (Meta CAPI + Google Enhanced Conversions) consultando las APIs de las plataformas AHORA y lo guarda en settings (lo lee get_server_side_tracking)","description":"Dispara un chequeo FRESCO de tracking server-side (Meta CAPI + Google Enhanced Conversions) consultando las APIs de las plataformas AHORA y lo guarda en settings (lo lee get_server_side_tracking). Usalo cuando el health cacheado esté viejo o después de tocar el pixel/CAPI. Corre solo automático semanal + al conectar Meta/Google; esto lo fuerza on-demand. Devuelve el reporte por pixel (server vs browser events 7d, capi_active) — la fuente correcta para \"¿tiene Conversions API?\", no el scan de navegador.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_webhooks":{"post":{"operationId":"list_webhooks","summary":"List outbound webhooks configured for the org (URL, subscribed events, last delivery status)","description":"List outbound webhooks configured for the org (URL, subscribed events, last delivery status). These are OUTBOUND (Pymaia notifies your system). For INBOUND gateways — something outside triggers an automation — use list_webhook_endpoints.","tags":["Automation"],"x-module-flag":"module_automatizaciones","security":[{"bearerAuth":["notifications:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/create_webhook":{"post":{"operationId":"create_webhook","summary":"Create an outbound webhook that receives POST with HMAC-SHA256 signature (header x-pymaia-signature) on selected events","description":"Create an outbound webhook that receives POST with HMAC-SHA256 signature (header x-pymaia-signature) on selected events. Returns the signing secret once — store it securely.","tags":["Automation"],"x-module-flag":"module_automatizaciones","security":[{"bearerAuth":["notifications:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["action.proposed","action.approved","action.rejected","task.created","task.completed","task.failed","sync.completed","sync.failed","alert.triggered","lead.created","report.generated","tool.executed","*"]},"default":["*"]}},"required":["name","url"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/update_webhook":{"post":{"operationId":"update_webhook","summary":"Update webhook (name/url/events/is_active)","description":"Update webhook (name/url/events/is_active).","tags":["Automation"],"x-module-flag":"module_automatizaciones","security":[{"bearerAuth":["notifications:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"webhook_id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"type":"string","enum":["action.proposed","action.approved","action.rejected","task.created","task.completed","task.failed","sync.completed","sync.failed","alert.triggered","lead.created","report.generated","tool.executed","*"]}},"is_active":{"type":"boolean"}},"required":["webhook_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/delete_webhook":{"post":{"operationId":"delete_webhook","summary":"Elimina un webhook","description":"Elimina un webhook.","tags":["Automation"],"x-module-flag":"module_automatizaciones","security":[{"bearerAuth":["notifications:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"webhook_id":{"type":"string"}},"required":["webhook_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_webhook_deliveries":{"post":{"operationId":"list_webhook_deliveries","summary":"List recent delivery attempts for an OUTBOUND webhook (status, duration, response)","description":"List recent delivery attempts for an OUTBOUND webhook (status, duration, response). For what ARRIVED at an inbound gateway, use list_webhook_receipts.","tags":["Automation"],"x-module-flag":"module_automatizaciones","security":[{"bearerAuth":["notifications:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"webhook_id":{"type":"string"},"limit":{"type":"number","default":50}},"required":["webhook_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_pending_browser_tasks":{"post":{"operationId":"list_pending_browser_tasks","summary":"List manual_action_tasks pending or in-progress for this org","description":"List manual_action_tasks pending or in-progress for this org. Returns tasks the user (or Claude in the browser) should execute manually because the underlying platform has no API. Each task has step-by-step instructions, a target URL, and a verifier_kind.","tags":["Tasks"],"security":[{"bearerAuth":["tasks:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":50,"default":20},"platform":{"type":"string","description":"Filtrar por plataforma. Ej.: omnisend, klaviyo, meta_ads, google_ads, shopify. No es una lista cerrada — puede haber otras."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_task_details":{"post":{"operationId":"get_task_details","summary":"Get full details of a manual_action_task: steps array, expected_outcome, target_url, verifier config","description":"Get full details of a manual_action_task: steps array, expected_outcome, target_url, verifier config. Use this BEFORE lease_task to understand what needs to be done.","tags":["Tasks"],"x-module-flag":"module_tasks","security":[{"bearerAuth":["tasks:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"task_id":{"type":"string","format":"uuid"}},"required":["task_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/lease_task":{"post":{"operationId":"lease_task","summary":"Acquire an exclusive lease on a manual action task before starting work","description":"Acquire an exclusive lease on a manual action task before starting work. Returns the steps + target_url + a lease_token. The lease expires in 15 minutes; call complete_task or report_task_blocked before then. Without a lease, complete_task will reject your call.","tags":["Tasks"],"x-module-flag":"module_tasks","security":[{"bearerAuth":["tasks:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"task_id":{"type":"string","format":"uuid"}},"required":["task_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/complete_task":{"post":{"operationId":"complete_task","summary":"Mark a manual action task as completed","description":"Mark a manual action task as completed. Requires the lease_token from lease_task. The system will trigger the relevant platform sync; verification of the change happens automatically based on the task verifier_kind.","tags":["Tasks"],"x-module-flag":"module_tasks","security":[{"bearerAuth":["tasks:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"task_id":{"type":"string","format":"uuid"},"lease_token":{"type":"string","format":"uuid"},"summary":{"type":"string","minLength":1,"maxLength":1000,"description":"Brief description of what was done in the browser"},"screenshots":{"type":"array","items":{"type":"string","format":"uri"},"description":"Optional. Public URLs of screenshots that prove the change."}},"required":["task_id","lease_token","summary"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/report_task_blocked":{"post":{"operationId":"report_task_blocked","summary":"Report that a manual action task could not be completed","description":"Report that a manual action task could not be completed. Use this when the steps fail (e.g. UI changed, missing permission, error). The lease is released and the task can be retried.","tags":["Tasks"],"x-module-flag":"module_tasks","security":[{"bearerAuth":["tasks:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"task_id":{"type":"string","format":"uuid"},"lease_token":{"type":"string","format":"uuid"},"reason":{"type":"string","minLength":1,"maxLength":500},"current_step_n":{"type":"integer","description":"Which step (n) failed"}},"required":["task_id","lease_token","reason"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_store_customers":{"post":{"operationId":"list_store_customers","summary":"Lista los COMPRADORES de la tienda online (Shopify/Tiendanube) con su RFM y LTV: cuánto gastaron, cuántas órdenes hicieron y cuándo fue su última compra","description":"Lista los COMPRADORES de la tienda online (Shopify/Tiendanube) con su RFM y LTV: cuánto gastaron, cuántas órdenes hicieron y cuándo fue su última compra. Son clientes que ya COMPRARON en la tienda, NO los leads/contactos del CRM (para eso usá query_contacts). `rfm_group_native` es el segmento tal cual lo calcula la plataforma (texto libre: champions, loyal, at_risk, etc.); el filtro `segment` matchea contra ese campo.","tags":["Ecommerce"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"segment":{"type":"string","enum":["champions","loyal","at_risk","new","all"]},"sort":{"type":"string","enum":["ltv","recency","orders"],"default":"ltv"},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_store_reviews":{"post":{"operationId":"list_store_reviews","summary":"Lista las reseñas de PRODUCTOS de la tienda online (Shopify/Tiendanube): el TEXTO + RATING que dejaron los compradores (título, cuerpo, autor, si es compra verificada)","description":"Lista las reseñas de PRODUCTOS de la tienda online (Shopify/Tiendanube): el TEXTO + RATING que dejaron los compradores (título, cuerpo, autor, si es compra verificada). NO son imágenes ni contenido UGC (para eso usá list_brand_assets). Usá `max_rating` para traer las reseñas malas (<= N estrellas).","tags":["Ecommerce"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"product_id":{"type":"string"},"max_rating":{"type":"integer","minimum":1,"maximum":5},"source":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_meli_reputation":{"post":{"operationId":"get_meli_reputation","summary":"Devuelve la reputación del vendedor en MercadoLibre: nickname + el objeto `seller_reputation` nativo de MELI (level_id, power_seller_status, metrics de reclamos/cancelaciones/demoras en el manejo con su rate) MÁS la serie histórica de los últimos días","description":"Devuelve la reputación del vendedor en MercadoLibre: nickname + el objeto `seller_reputation` nativo de MELI (level_id, power_seller_status, metrics de reclamos/cancelaciones/demoras en el manejo con su rate) MÁS la serie histórica de los últimos días. La foto sola no dice si está mejorando o cayendo — miralas juntas. Es la reputación del SELLER en el marketplace, no las reseñas de productos de la tienda propia (para eso usá list_store_reviews).","tags":["MercadoLibre"],"x-module-flag":"module_mercadolibre","security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"number","minimum":1,"maximum":180,"default":60}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_meli_buybox":{"post":{"operationId":"query_meli_buybox","summary":"Estado de competencia en catálogo (buy-box) de las publicaciones de MercadoLibre: si ganan o pierden la página de producto y a qué precio la ganarían","description":"Estado de competencia en catálogo (buy-box) de las publicaciones de MercadoLibre: si ganan o pierden la página de producto y a qué precio la ganarían. Sólo las publicaciones de CATÁLOGO compiten por el buy-box. OJO con `price_to_win`: cuando la publicación ya está arriba, MercadoLibre lo devuelve IGUAL al precio actual, así que acá viene en null salvo que sea estrictamente MENOR — si está, es un precio al que bajar de verdad. Nunca lo leas como \"bajá 0%\". `ganando` es true tanto si gana sola como si comparte el primer puesto. `winner_item_id` es la publicación que se está llevando el catálogo: usala para nombrar al competidor concreto en vez de hablar de \"otro vendedor\".","tags":["MercadoLibre"],"x-module-flag":"module_mercadolibre","security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"only_losing":{"type":"boolean","default":false},"limit":{"type":"number","minimum":1,"maximum":100,"default":25}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_meli_trends":{"post":{"operationId":"query_meli_trends","summary":"Búsquedas en tendencia de MercadoLibre por categoría: qué está buscando la gente y en qué posición","description":"Búsquedas en tendencia de MercadoLibre por categoría: qué está buscando la gente y en qué posición. Sirve para decidir qué publicar o cómo titular. Es tendencia del MARKETPLACE, no del vendedor: no la uses para hablar de sus ventas.","tags":["MercadoLibre"],"x-module-flag":"module_mercadolibre","security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"category_id":{"type":"string"},"limit":{"type":"number","minimum":1,"maximum":100,"default":25}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_seo_keywords":{"post":{"operationId":"query_seo_keywords","summary":"Keyword research del módulo SEO: universo de keywords con volumen de búsqueda, dificultad (0-100), CPC, intención de búsqueda y features del SERP","description":"Keyword research del módulo SEO: universo de keywords con volumen de búsqueda, dificultad (0-100), CPC, intención de búsqueda y features del SERP. Es RESEARCH de oportunidad (qué buscar y cuán difícil es rankear), DISTINTO de query_search_console (clics/impresiones/posiciones YA logrados en Google Search). Usá target_only para ver solo las keywords objetivo que la marca sigue.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target_only":{"type":"boolean","default":false},"min_volume":{"type":"number"},"search_intent":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_seo_rank_history":{"post":{"operationId":"query_seo_rank_history","summary":"Evolución histórica de la posición de una keyword en Google (rank tracking): serie de posición por fecha, más URL rankeada y si aparece AI Overview (y si la marca está dentro)","description":"Evolución histórica de la posición de una keyword en Google (rank tracking): serie de posición por fecha, más URL rankeada y si aparece AI Overview (y si la marca está dentro). Pasá keyword (texto) o keyword_id (uuid).","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keyword":{"type":"string"},"keyword_id":{"type":"string","format":"uuid"},"days":{"type":"integer","minimum":1,"maximum":365,"default":90},"limit":{"type":"integer","minimum":1,"maximum":500,"default":200}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_seo_backlinks":{"post":{"operationId":"query_seo_backlinks","summary":"Perfil de backlinks del dominio: (a) último snapshot resumen (domain rank, total de backlinks, dominios referentes, dofollow/nofollow/rotos); (b) top dominios referentes activos por autoridad; (c) menciones de la marca sin enlazar (oportunidades de link building)","description":"Perfil de backlinks del dominio: (a) último snapshot resumen (domain rank, total de backlinks, dominios referentes, dofollow/nofollow/rotos); (b) top dominios referentes activos por autoridad; (c) menciones de la marca sin enlazar (oportunidades de link building).","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":100,"default":20}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_seo_technical_audit":{"post":{"operationId":"get_seo_technical_audit","summary":"Última auditoría técnica de SEO del sitio: score global (0-100), agregados de issues (summary) y la fecha del escaneo","description":"Última auditoría técnica de SEO del sitio: score global (0-100), agregados de issues (summary) y la fecha del escaneo. Devuelve el conteo de páginas auditadas, no el detalle completo por página.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_ai_visibility":{"post":{"operationId":"get_ai_visibility","summary":"Visibilidad REAL de la marca en asistentes de IA (ChatGPT/Perplexity/Gemini): último barrido con visibility_score (% de respuestas donde te mencionan), Share of Voice, posición promedio, desglose por motor y por categoría de consulta, y competidores más citados","description":"Visibilidad REAL de la marca en asistentes de IA (ChatGPT/Perplexity/Gemini): último barrido con visibility_score (% de respuestas donde te mencionan), Share of Voice, posición promedio, desglose por motor y por categoría de consulta, y competidores más citados. Incluye las top consultas donde NO apareciste. Esta es la medición real de SoV/menciones — list_geo_queries es un tracker manual legacy mucho más pobre.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"category":{"type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_aeo_score":{"post":{"operationId":"get_aeo_score","summary":"Score de AEO / answer-engine readiness de la marca: aeo_score, visibility_score y ready_score del snapshot más reciente, con su fecha","description":"Score de AEO / answer-engine readiness de la marca: aeo_score, visibility_score y ready_score del snapshot más reciente, con su fecha. Mide qué tan lista está la marca para ser citada por motores de respuesta.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_ai_mentions":{"post":{"operationId":"list_ai_mentions","summary":"Citas/menciones concretas de la marca en respuestas de LLMs, con la URL citada, el dominio, el motor (llm) y la consulta que las gatilló","description":"Citas/menciones concretas de la marca en respuestas de LLMs, con la URL citada, el dominio, el motor (llm) y la consulta que las gatilló. A diferencia de get_ai_visibility (agregado/score), esto son las evidencias individuales para revisar qué páginas te están citando.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"llm":{"type":"string"},"days":{"type":"integer","minimum":1,"maximum":180,"default":30},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/query_clarity_insights":{"post":{"operationId":"query_clarity_insights","summary":"Comportamiento de UX real de Microsoft Clarity por página: rage clicks, dead clicks, quick-backs, profundidad de scroll, errores de script y de click, sesiones y engagement","description":"Comportamiento de UX real de Microsoft Clarity por página: rage clicks, dead clicks, quick-backs, profundidad de scroll, errores de script y de click, sesiones y engagement. Es fricción/UX concreta (dónde la gente se frustra), distinto del rebote de query_analytics o de la velocidad de pagespeed.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url_contains":{"type":"string"},"days":{"type":"integer","minimum":1,"maximum":90,"default":30},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_meta_audiences":{"post":{"operationId":"list_meta_audiences","summary":"Inventario de audiencias custom de Meta Ads con su tamaño estimado, subtipo, retención y estado de entrega","description":"Inventario de audiencias custom de Meta Ads con su tamaño estimado, subtipo, retención y estado de entrega. Sirve para detectar audiencias saturadas o demasiado chicas. Es el catálogo/tamaño de las audiencias, distinto de estimate_meta_audience_overlap (que mide el solapamiento entre ad sets).","tags":["Ads"],"security":[{"bearerAuth":["ads:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":200,"default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_email_flows":{"post":{"operationId":"list_email_flows","summary":"Lista los FLOWS/automatizaciones de email de la org (Klaviyo + Omnisend unificados) con revenue y métricas","description":"Lista los FLOWS/automatizaciones de email de la org (Klaviyo + Omnisend unificados) con revenue y métricas. Son secuencias automatizadas disparadas por evento (carrito abandonado, bienvenida, post-compra, win-back), NO campañas broadcast puntuales. Para campañas puntuales usá query_email_campaigns / revisar_email. Ventana de datos rolling ~365 días (no depende del filtro de fecha).","tags":["Email"],"security":[{"bearerAuth":["crm:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"Filtrar por estado del flow (ej. \"live\", \"active\", \"draft\")"},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_workflows":{"post":{"operationId":"list_workflows","summary":"Lista las Automatizaciones (\"Outcome Automations\") del módulo homónimo: workflows con trigger → pasos, su estado y su cadencia de ejecución","description":"Lista las Automatizaciones (\"Outcome Automations\") del módulo homónimo: workflows con trigger → pasos, su estado y su cadencia de ejecución. DISTINTO de list_tasks (tareas de IA recurrentes/por evento que ejecutan agentes). Estas son las automatizaciones no-agénticas configuradas por el usuario.","tags":["General"],"x-module-flag":"module_automatizaciones","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["draft","active","paused","archived"],"description":"Estado de la automatización (CHECK de la tabla `workflows`)."},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_workflow_runs":{"post":{"operationId":"list_workflow_runs","summary":"Historial de ejecuciones de las Automatizaciones (workflows)","description":"Historial de ejecuciones de las Automatizaciones (workflows). Pasá workflow_id para el historial de un workflow puntual, o dejalo vacío para ver las ejecuciones recientes de toda la org. Útil para diagnosticar por qué un workflow falla o no corre.","tags":["General"],"x-module-flag":"module_automatizaciones","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"workflow_id":{"type":"string","format":"uuid","description":"UUID del workflow; vacío = todas las ejecuciones de la org"},"status":{"type":"string","enum":["running","waiting","completed","failed","cancelled"],"description":"Estado de la ejecución. \"completed\" es la que terminó bien; \"waiting\" está dormida esperando un trabajo o una aprobación."},"limit":{"type":"integer","minimum":1,"maximum":100,"default":30}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_daily_reports":{"post":{"operationId":"list_daily_reports","summary":"Lee el HISTÓRICO de reportes ejecutivos ya generados (KPIs cross-channel, insights, acciones)","description":"Lee el HISTÓRICO de reportes ejecutivos ya generados (KPIs cross-channel, insights, acciones). Esto NO regenera nada: distinto de generate_daily_report (crea uno nuevo, gasta trabajo) y de preparar_reporte (ensambla datos crudos). El TEXTO del reporte vive en el workspace file: cuando hay workspace_file_id, traelo con get_workspace_file.","tags":["General"],"security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"integer","minimum":1,"maximum":90,"default":14,"description":"Ventana hacia atrás en días (target_date >= hoy - days)"},"limit":{"type":"integer","minimum":1,"maximum":60,"default":20}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_documents":{"post":{"operationId":"list_documents","summary":"Lista los archivos SUBIDOS por el usuario e ingeridos (PDFs, CSV, uploads) y su estado de procesamiento","description":"Lista los archivos SUBIDOS por el usuario e ingeridos (PDFs, CSV, uploads) y su estado de procesamiento. Distinto de list_workspace_files (artefactos markdown que genera el asistente). NO devuelve el contenido: para buscar dentro de estos documentos usá search_knowledge.","tags":["General"],"security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","processing","ready","failed"],"description":"Filtrar por estado (pending | processing | ready | failed)"},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/diagnosticar_automatizacion":{"post":{"operationId":"diagnosticar_automatizacion","summary":"Por qué una automatización no está haciendo lo que esperabas: junta su estado, el resumen de la semana, qué está esperando, los últimos errores y —si la dispara una puerta de entrada— los recibos de lo que llegó","description":"Por qué una automatización no está haciendo lo que esperabas: junta su estado, el resumen de la semana, qué está esperando, los últimos errores y —si la dispara una puerta de entrada— los recibos de lo que llegó. Usala cuando alguien dice \"no funciona\" o \"no pasó nada\". Para el historial crudo de ejecuciones usá list_workflow_runs.","tags":["General"],"x-module-flag":"module_automatizaciones","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"workflow_id":{"type":"string","format":"uuid","description":"UUID de la automatización (lo da list_workflows)"}},"required":["workflow_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_webhook_endpoints":{"post":{"operationId":"list_webhook_endpoints","summary":"Las puertas de ENTRADA de la org: las URLs con secreto que dejan que algo de afuera (Zapier, Make, el sistema del cliente) dispare una automatización","description":"Las puertas de ENTRADA de la org: las URLs con secreto que dejan que algo de afuera (Zapier, Make, el sistema del cliente) dispare una automatización. OJO: list_webhooks son los SALIENTES (Pymaia avisa hacia afuera), no estas.","tags":["Automation"],"x-module-flag":"module_automatizaciones","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"solo_activas":{"type":"boolean","description":"true = sólo las encendidas"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_webhook_receipts":{"post":{"operationId":"list_webhook_receipts","summary":"Qué llegó a las puertas de ENTRADA y qué pasó con cada envío: si entró, si se rechazó y por qué, y cuántas automatizaciones disparó","description":"Qué llegó a las puertas de ENTRADA y qué pasó con cada envío: si entró, si se rechazó y por qué, y cuántas automatizaciones disparó. Es lo que contesta \"mandé el POST y no pasó nada\". Para las entregas SALIENTES usá list_webhook_deliveries.","tags":["Automation"],"x-module-flag":"module_automatizaciones","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"endpoint_id":{"type":"string","format":"uuid","description":"UUID de la puerta (lo da list_webhook_endpoints); vacío = todas"},"limit":{"type":"integer","minimum":1,"maximum":50,"default":20}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_org_capabilities":{"post":{"operationId":"get_org_capabilities","summary":"Qué puede automatizar esta organización: plataformas conectadas (y cuáles están rotas), EN QUÉ REDES PUEDE PUBLICAR —que no es lo mismo que las conectadas: publicar tiene su propia fuente—, eventos que puede disparar —incluidas sus puertas de entrada propias—, qué datos tiene cargados, qué acciones ya corren sin pedir aprobación, cuántos créditos le quedan y qué automatizaciones ya existen","description":"Qué puede automatizar esta organización: plataformas conectadas (y cuáles están rotas), EN QUÉ REDES PUEDE PUBLICAR —que no es lo mismo que las conectadas: publicar tiene su propia fuente—, eventos que puede disparar —incluidas sus puertas de entrada propias—, qué datos tiene cargados, qué acciones ya corren sin pedir aprobación, cuántos créditos le quedan y qué automatizaciones ya existen. Llamalo ANTES de crear_automatizacion si dudás de qué hay disponible: evita proponer algo sobre una plataforma que no está conectada. Si te preguntan «¿en qué redes puedo publicar?», la respuesta está acá.","tags":["General"],"x-module-flag":"module_automatizaciones","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/crear_automatizacion":{"post":{"operationId":"crear_automatizacion","summary":"Arma una automatización a medida desde una descripción en lenguaje natural, con todo el catálogo (90+ acciones sobre las plataformas conectadas, disparadores por evento u horario, condiciones, ramas decididas por IA, esperas)","description":"Arma una automatización a medida desde una descripción en lenguaje natural, con todo el catálogo (90+ acciones sobre las plataformas conectadas, disparadores por evento u horario, condiciones, ramas decididas por IA, esperas). SIEMPRE entra como BORRADOR y este conector NO puede activarla: la persona la activa en la app viendo lo que va a hacer. Con dry_run:true devuelve la propuesta sin crear nada — usalo para mostrarla y confirmar antes. Si el pedido calza con una plantilla conocida vas a obtener algo más previsible describiéndolo igual: el generador las reusa. SI FALLA CON code:\"imposible\": no reintentes — lo que se pidió necesita un disparador que esta cuenta no tiene. Contale a la persona el motivo, ofrecele los de `available` (cada uno con su label) y, si viene `alternativa`, ese es el próximo paso concreto.","tags":["General"],"x-module-flag":"module_automatizaciones","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"descripcion":{"type":"string","minLength":8,"description":"Qué tiene que hacer, en una o dos frases. Nombrá el disparador y la acción concreta."},"dry_run":{"type":"boolean","description":"true = devolver la propuesta sin crearla."}},"required":["descripcion"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/editar_automatizacion":{"post":{"operationId":"editar_automatizacion","summary":"Propone un cambio sobre una automatización existente, descrito en lenguaje natural (\"agregale un aviso al equipo\", \"que espere 2 horas antes\")","description":"Propone un cambio sobre una automatización existente, descrito en lenguaje natural (\"agregale un aviso al equipo\", \"que espere 2 horas antes\"). Pedí UN cambio por vez. Devuelve la propuesta y el diff (qué pasos se agregan, se van o cambian). Sobre un BORRADOR se puede guardar con confirmar:true. Sobre una automatización ACTIVA nunca se guarda: devuelve el link para que una persona lo revise y aplique en el editor.","tags":["General"],"x-module-flag":"module_automatizaciones","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"workflow_id":{"type":"string","format":"uuid","description":"UUID de la automatización (lo da list_workflows)"},"cambio":{"type":"string","minLength":4,"description":"El cambio pedido, uno por vez."},"confirmar":{"type":"boolean","description":"Sólo borradores: guardar el cambio propuesto."}},"required":["workflow_id","cambio"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_signal_sources":{"post":{"operationId":"list_signal_sources","summary":"Fuentes de señales de la org: qué mira cada una (MercadoLibre, un actor de Apify, una puerta de entrada, un JSON o un feed), qué tipo de señal produce, cada cuánto corre, si está activa y su último error","description":"Fuentes de señales de la org: qué mira cada una (MercadoLibre, un actor de Apify, una puerta de entrada, un JSON o un feed), qué tipo de señal produce, cada cuánto corre, si está activa y su último error. Para responder \"¿de dónde salen las ofertas?\" o \"¿por qué no entran señales nuevas?\".","tags":["General"],"x-module-flag":"module_senales","security":[{"bearerAuth":[["workspace:read","signals:read"]]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"solo_activas":{"type":"boolean","default":false,"description":"Sólo las encendidas"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_signal_types":{"post":{"operationId":"list_signal_types","summary":"Tipos de señal disponibles para la org (los de fábrica y los propios): qué campos tiene cada uno y qué enriquecimientos se le aplican","description":"Tipos de señal disponibles para la org (los de fábrica y los propios): qué campos tiene cada uno y qué enriquecimientos se le aplican. Útil antes de crear una señal con create_signal desde una automatización: el tipo tiene que existir.","tags":["General"],"x-module-flag":"module_senales","security":[{"bearerAuth":[["workspace:read","signals:read"]]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_enrichers":{"post":{"operationId":"list_enrichers","summary":"Catálogo de enriquecimientos que se le pueden agregar a una señal: qué deja cada uno en la señal (precio actualizado, rubro, puntaje visual, el video, un resumen), si gasta créditos, y a qué tipo de señal aplica","description":"Catálogo de enriquecimientos que se le pueden agregar a una señal: qué deja cada uno en la señal (precio actualizado, rubro, puntaje visual, el video, un resumen), si gasta créditos, y a qué tipo de señal aplica. Para responder \"¿qué más puedo sacarle a estas señales?\" o \"¿por qué esto cuesta créditos?\". Cuáles están prendidos en cada tipo lo dice list_signal_types.","tags":["General"],"x-module-flag":"module_senales","security":[{"bearerAuth":[["workspace:read","signals:read"]]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_product_signals":{"post":{"operationId":"list_product_signals","summary":"Ofertas detectadas por las fuentes: la cola de curación","description":"Ofertas detectadas por las fuentes: la cola de curación. Filtrable por estado (new = sin revisar, approved = aprobada, discarded = descartada, published, expired) y por tipo de señal. Ordena por puntaje. Para \"¿qué ofertas hay para revisar?\" o para conseguir el id de una antes de aprobarla o descartarla.","tags":["Ecommerce"],"x-module-flag":"module_senales","security":[{"bearerAuth":["signals:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["new","approved","discarded","published","expired"],"description":"Estado. Sin esto vienen todas."},"signal_type":{"type":"string","description":"Slug del tipo (list_signal_types los lista)"},"buscar":{"type":"string","description":"Texto en el título"},"limit":{"type":"integer","minimum":1,"maximum":100,"default":25}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_product_signal":{"post":{"operationId":"get_product_signal","summary":"Una oferta con todo su detalle: precio, descuento, ventas, fotos, enriquecimientos aplicados y si ya tiene link de afiliado listo","description":"Una oferta con todo su detalle: precio, descuento, ventas, fotos, enriquecimientos aplicados y si ya tiene link de afiliado listo. Usá list_product_signals para conseguir el id.","tags":["Ecommerce"],"x-module-flag":"module_senales","security":[{"bearerAuth":["signals:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/count_product_signals_by_type":{"post":{"operationId":"count_product_signals_by_type","summary":"Cuántas ofertas hay por tipo y por estado","description":"Cuántas ofertas hay por tipo y por estado. Para responder \"¿cuánto tengo sin revisar?\" sin traerse la cola entera.","tags":["Ecommerce"],"x-module-flag":"module_senales","security":[{"bearerAuth":["signals:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_pipeline_times":{"post":{"operationId":"get_pipeline_times","summary":"Cuánto tarda una oferta aprobada en llegar a la calle, en dos tramos: de aprobada a posteo armado (lo hace la máquina) y de armado a publicado (lo hace una persona)","description":"Cuánto tarda una oferta aprobada en llegar a la calle, en dos tramos: de aprobada a posteo armado (lo hace la máquina) y de armado a publicado (lo hace una persona). En minutos, mediana.","tags":["General"],"x-module-flag":"module_senales","security":[{"bearerAuth":["signals:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/approve_product_signals":{"post":{"operationId":"approve_product_signals","summary":"Aprueba ofertas de la cola: pasan a `approved`, se les encola el video y disparan las automatizaciones suscriptas","description":"Aprueba ofertas de la cola: pasan a `approved`, se les encola el video y disparan las automatizaciones suscriptas. GASTA CRÉDITOS (el render del clip) y las publica en el sitio del cliente. Máximo 20 por llamada. Conseguí los ids con list_product_signals.","tags":["Ecommerce"],"x-module-flag":"module_senales","security":[{"bearerAuth":["signals:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":20,"description":"Ids de las ofertas. Máximo 20: aprobar encola un video por cada una."}},"required":["ids"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/discard_product_signals":{"post":{"operationId":"discard_product_signals","summary":"Descarta ofertas de la cola: salen del sitio y dejan de aparecer para revisar","description":"Descarta ofertas de la cola: salen del sitio y dejan de aparecer para revisar. Es REVERSIBLE — una descartada se puede volver a aprobar con approve_product_signals. No gasta créditos ni publica nada.","tags":["Ecommerce"],"x-module-flag":"module_senales","security":[{"bearerAuth":["signals:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":50},"motivo":{"type":"string","maxLength":200,"description":"Por qué. Queda guardado en la señal."}},"required":["ids"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/create_product_signal":{"post":{"operationId":"create_product_signal","summary":"Carga una oferta en la cola de Señales, para que una persona la revise","description":"Carga una oferta en la cola de Señales, para que una persona la revise. Nace en `new`: crear NO aprueba ni publica nada. El tipo tiene que existir (mirá list_signal_types). `external_id` es la clave de idempotencia — en Temu es el goods_id, en MercadoLibre el MLA: repetirlo actualiza la oferta en vez de duplicarla, y nunca le cambia el estado. Si te equivocaste, discard_product_signals la saca.","tags":["Ecommerce"],"x-module-flag":"module_senales","security":[{"bearerAuth":["signals:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"signal_type":{"type":"string","description":"Slug del tipo (list_signal_types los lista)"},"external_id":{"type":"string","description":"Id del producto en la tienda: goods_id de Temu, MLA de MercadoLibre"},"title":{"type":"string","description":"Lo que se ve en la cola"},"payload":{"type":"object","additionalProperties":{},"description":"Los campos que declara el tipo (precio, foto, etc.)"},"score":{"type":"number","minimum":0,"maximum":100,"description":"Cuánto importa, 0-100. Ordena la cola."},"permalink":{"type":"string","format":"uri","description":"URL del producto. Sin esto no se le puede encolar el video."}},"required":["signal_type","external_id","title"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/create_signal_source":{"post":{"operationId":"create_signal_source","summary":"Crear una fuente de señales para la cuenta: qué mira (MercadoLibre, un actor de Apify, una puerta de entrada, un JSON o un feed RSS), qué tipo de señal produce, con qué detectores y cada cuánto","description":"Crear una fuente de señales para la cuenta: qué mira (MercadoLibre, un actor de Apify, una puerta de entrada, un JSON o un feed RSS), qué tipo de señal produce, con qué detectores y cada cuánto. **Nace apagada**: hay que correrla una vez y mirar el resultado antes de encenderla con toggle_signal_source. Si es una puerta de entrada (`webhook`), devuelve la URL y el secreto UNA sola vez.","tags":["General"],"x-module-flag":"module_senales","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Nombre para reconocerla en la lista"},"source":{"type":"string","description":"El adapter: meli_search, meli_apify, meli_cupones, meli_trends, webhook, http_json, rss… (list_signal_sources muestra los que ya usa la cuenta)"},"signal_type":{"type":"string","description":"Slug del tipo que produce. Tiene que existir para la cuenta (list_signal_types)"},"config":{"type":"object","additionalProperties":{},"default":{},"description":"Config del adapter: url, query, actor_input, mapeo, ruta_items…"},"detector":{"type":"object","additionalProperties":{},"description":"Qué mira: baja_de_precio, descuento_min, palabra_clave…"},"every_minutes":{"type":"number","description":"Cada cuánto corre. Hay un piso por adapter; si pedís menos, la fn lo rechaza y dice cuál es"}},"required":["name","source"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/update_signal_source":{"post":{"operationId":"update_signal_source","summary":"Editar una fuente existente: nombre, qué mira, sus detectores o cada cuánto corre","description":"Editar una fuente existente: nombre, qué mira, sus detectores o cada cuánto corre. No la enciende ni la apaga (eso es toggle_signal_source). Las mismas validaciones que al crearla.","tags":["General"],"x-module-flag":"module_senales","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string","minLength":1},"source":{"type":"string"},"signal_type":{"type":"string"},"config":{"type":"object","additionalProperties":{},"default":{}},"detector":{"type":"object","additionalProperties":{}},"every_minutes":{"type":"number"}},"required":["id","name","source"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_signal_source":{"post":{"operationId":"run_signal_source","summary":"Correr una fuente AHORA y devolver qué encontró, sin esperar al cron","description":"Correr una fuente AHORA y devolver qué encontró, sin esperar al cron. Es el paso que va antes de encender una fuente nueva: si trae basura, se corrige la config sin haber ensuciado la cola. Una puerta de entrada no se corre — espera un POST.","tags":["General"],"x-module-flag":"module_senales","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/toggle_signal_source":{"post":{"operationId":"toggle_signal_source","summary":"Encender o apagar una fuente","description":"Encender o apagar una fuente. Encender es lo que la suelta al cron: desde ahí corre sola y puede gastar créditos si su tipo tiene enriquecimientos pagos (list_enrichers dice cuáles). Apagar corta la entrada de verdad, también la de una puerta.","tags":["General"],"x-module-flag":"module_senales","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"enabled":{"type":"boolean","description":"true enciende, false apaga"}},"required":["id","enabled"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/rotate_signal_source_secret":{"post":{"operationId":"rotate_signal_source_secret","summary":"Rotar el secreto de la puerta de entrada de una fuente `webhook`","description":"Rotar el secreto de la puerta de entrada de una fuente `webhook`. Devuelve el nuevo UNA vez; el anterior sigue valiendo un rato para que el emisor no quede en 401 mientras se reconfigura.","tags":["General"],"x-module-flag":"module_senales","security":[{"bearerAuth":["workspace:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"}},"required":["id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/signals_health":{"post":{"operationId":"signals_health","summary":"Qué está ROTO ahora en señales y automatizaciones: fuentes apagadas por error o sin correr, entregas rechazadas en las puertas de entrada, videos que fallaron, corridas con error o trabadas, acciones por vencer","description":"Qué está ROTO ahora en señales y automatizaciones: fuentes apagadas por error o sin correr, entregas rechazadas en las puertas de entrada, videos que fallaron, corridas con error o trabadas, acciones por vencer. Vacío = todo bien. Es la primera consulta ante \"no está entrando nada\" o \"no se armó el posteo\".","tags":["General"],"x-module-flag":"module_senales","security":[{"bearerAuth":["workspace:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_store_pages":{"post":{"operationId":"list_store_pages","summary":"Lista las páginas y artículos de blog de la TIENDA online (Shopify/Tiendanube/WooCommerce)","description":"Lista las páginas y artículos de blog de la TIENDA online (Shopify/Tiendanube/WooCommerce). resource=\"page\" = páginas estáticas, resource=\"article\" = posts del blog. OJO: NO son las páginas de un sitio de Site Studio (para eso list_site_pages) ni el tema de la tienda (get_store_theme).","tags":["Ecommerce"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"resource":{"type":"string","enum":["page","article"],"default":"page"},"platform":{"type":"string","enum":["shopify","tiendanube","woocommerce"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/list_store_coupons":{"post":{"operationId":"list_store_coupons","summary":"Lista los cupones/descuentos de la tienda online (Shopify/Tiendanube)","description":"Lista los cupones/descuentos de la tienda online (Shopify/Tiendanube). Read-only (crear/activar se hace en la app). Usá active_only para ver solo los vigentes.","tags":["Ecommerce"],"security":[{"bearerAuth":["ecommerce:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"active_only":{"type":"boolean","default":false},"limit":{"type":"integer","minimum":1,"maximum":250,"default":100}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/run_seo_domain_analytics":{"post":{"operationId":"run_seo_domain_analytics","summary":"Análisis LIVE de dominio SEO (tráfico orgánico estimado, keywords que rankean, competidores orgánicos) vía DataForSEO","description":"Análisis LIVE de dominio SEO (tráfico orgánico estimado, keywords que rankean, competidores orgánicos) vía DataForSEO. COBRA 3 CRÉDITOS por corrida (igual que en la app). Usalo cuando pidan autoridad/tráfico orgánico estimado del dominio; para keywords propias ya capturadas usá query_seo_keywords (gratis).","tags":["Analytics"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string","description":"Dominio a analizar; por defecto el de la org (organizations.website_url)"},"country":{"type":"string","minLength":2,"maxLength":2,"description":"Código de país ISO (default AR)"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}},"/api/v1/get_tracking_reconciliation":{"post":{"operationId":"get_tracking_reconciliation","summary":"Reconcilia el revenue que reporta cada plataforma de ads (Meta/Google conversion_value) contra el que la TIENDA atribuye a ese canal, y da el % de ventas sin atribuir (untagged)","description":"Reconcilia el revenue que reporta cada plataforma de ads (Meta/Google conversion_value) contra el que la TIENDA atribuye a ese canal, y da el % de ventas sin atribuir (untagged). Responde \"¿por qué Meta reporta más ventas que mi tienda?\" con diagnóstico por canal (pixel inflado, UTMs rotos, orgánico, etc.), normalizado a la moneda de la tienda. NO estimes esto a mano cruzando otras tools — esta ya aplica la lógica correcta de atribución y moneda.","tags":["General"],"security":[{"bearerAuth":["analytics:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"integer","minimum":1,"maximum":90,"default":30}},"additionalProperties":false}}}},"responses":{"200":{"description":"Tool executed successfully","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"result":{},"duration_ms":{"type":"number"}}}}}},"400":{"description":"Invalid params or handler error"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Missing required scope(s)"},"404":{"description":"Tool not found"},"429":{"description":"Rate limit exceeded"}}}}}}