Connect

Consultar gasto diario por campaña en Meta

Lee el gasto y la entrega DIARIOS por campaña de la cuenta publicitaria de Meta de esta conexión, YA sincronizados.

Tool IDmeta_ads.gasto_campanas.consultar
Nombre MCPmeta_ads__gasto_campanas__consultar
Conectormeta_ads
Planoaction
Lee el alcancegasto (debe estar habilitado en la conexión)
Scope (permiso)meta_ads:read
Authnone
Versión1
Sensiblesí
Deprecadono
ComportamientoreadOnly=true, destructive=false, idempotent=true, openWorld=false

Requiere conexión. Indica cuál en cada llamada: header X-Connect-Connection en REST y campo connectionId en el execute de MCP. No hay resolución implícita, ni siquiera con una sola conexión activa: la conexión es la empresa. El id sale de conexiones.estado.consultar.

Qué hace

Sirve para atribuir gasto por campaña; para el total de la cuenta usa 'meta_ads.gasto_cuenta.consultar' y no sumes las dos, ni supongas que la suma de campañas cuadra con la cuenta (Meta puede no informar campañas eliminadas). Lectura pura: NO contacta a Meta ni dispara una sincronización. Revisa 'cobertura' antes de concluir que no hubo gasto. Las cifras son las que Meta informa en Insights: el gasto es estimado y NO equivale a facturas, cobros ni impuestos. No mezcles monedas. Para traer datos nuevos usa 'meta_ads.conexion.sincronizar'. Pagina con 'cursor'.

Entrada

CampoTipoRequeridoDescripción
desdestring ^\d{4}-\d{2}-\d{2}$noPrimer día (AAAA-MM-DD, día calendario en la zona horaria de la cuenta publicitaria). Omítelo para no filtrar.
hastastring ^\d{4}-\d{2}-\d{2}$noÚltimo día, incluido (AAAA-MM-DD, día calendario en la zona horaria de la cuenta publicitaria). Omítelo para no filtrar.
campanaIdstring ^[1-9][0-9]{0,30}$noTrae sólo esa campaña, por su id de Meta (texto).
cursorstringnoPuntero opaco a la página siguiente. Reenvía tal cual el 'cursor' que devolvió la llamada anterior; nunca lo construyas a mano. Omítelo para pedir la primera página.
limitentero 1-500no · default 100Cuántas filas trae la página, entre 1 y 500. Por omisión, 100.
JSON Schema de entrada
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "desde": {
      "description": "Primer día (AAAA-MM-DD, día calendario en la zona horaria de la cuenta publicitaria). Omítelo para no filtrar.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "hasta": {
      "description": "Último día, incluido (AAAA-MM-DD, día calendario en la zona horaria de la cuenta publicitaria). Omítelo para no filtrar.",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "campanaId": {
      "description": "Trae sólo esa campaña, por su id de Meta (texto).",
      "type": "string",
      "pattern": "^[1-9][0-9]{0,30}$"
    },
    "cursor": {
      "description": "Puntero opaco a la página siguiente. Reenvía tal cual el 'cursor' que devolvió la llamada anterior; nunca lo construyas a mano. Omítelo para pedir la primera página.",
      "type": "string"
    },
    "limit": {
      "default": 100,
      "description": "Cuántas filas trae la página, entre 1 y 500. Por omisión, 100.",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  }
}

Ejemplo

curl
curl -X POST https://connect.emisso.ai/api/v1/tools/meta_ads.gasto_campanas.consultar/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Content-Type: application/json" \
  -d '{"input":{"desde":"2026-10-01","hasta":"2026-10-20","campanaId":"120210000000000001"}}'
MCP · meta-tool execute
{
  "tool": "meta_ads.gasto_campanas.consultar",
  "params": {
    "desde": "2026-10-01",
    "hasta": "2026-10-20",
    "campanaId": "120210000000000001"
  },
  "connectionId": "conn_9tKfR2mQx4Vb"
}

Salida esperada (200):

{
  "data": {
    "cuenta": {
      "cuentaId": "1234567890123456",
      "moneda": "CLP",
      "zonaHoraria": "America/Santiago"
    },
    "filas": [
      {
        "campanaId": "120210000000000001",
        "campanaNombre": "Ventas octubre",
        "fecha": "2026-10-19",
        "moneda": "CLP",
        "zonaHoraria": "America/Santiago",
        "gasto": "21000",
        "impresiones": 30010,
        "alcance": 15002,
        "clics": 640,
        "clicsEnlace": 455,
        "diaCerrado": true,
        "versionApi": "v26.0",
        "sincronizadoEn": "2026-10-20T16:00:02.000Z"
      }
    ],
    "cobertura": {
      "desde": "2025-09-21",
      "hasta": "2026-10-20",
      "completa": true,
      "diasSinLeer": [],
      "pendiente": null,
      "sincronizadoEn": "2026-10-20T16:00:02.000Z"
    },
    "cursor": null
  },
  "meta": {
    "request_id": "req_…",
    "tool_id": "meta_ads.gasto_campanas.consultar",
    "plane": "action",
    "latency_ms": 24,
    "audit_status": "recorded"
  }
}

Salida

CampoTipoRequeridoDescripción
cuentaobjetosíLa cuenta publicitaria fijada a esta conexión. Una conexión lee UNA sola cuenta publicitaria.
cuenta.cuentaIdstringnullsí
cuenta.monedastringnullsí
cuenta.zonaHorariastringnullsí
filaslista de objetosíUn día de una campaña por fila, del día más reciente al más antiguo. Cada fila es el total de ESA campaña ese día.
filas[].campanaIdstringsíEl id de la campaña en Meta, como texto: no lo conviertas a número.
filas[].campanaNombrestringnullsí
filas[].fechastringsíEl día (AAAA-MM-DD) en la zona horaria de 'zonaHoraria', la de la cuenta publicitaria. No es un día de Chile si la cuenta usa otra zona.
filas[].monedastringsíLa moneda del gasto (ISO 4217, la de la cuenta publicitaria). Nunca sumes gastos de monedas distintas.
filas[].zonaHorariastringsíLa zona horaria IANA con que Meta cortó este día.
filas[].gastostringsíGasto estimado del día según Meta, decimal en texto en 'moneda' (por ejemplo "15990" o "12.34"). Es una métrica de entrega publicitaria, NO un comprobante: no es lo facturado ni lo cobrado, y no incluye impuestos.
filas[].impresionesenterosíVeces que se mostraron los anuncios ese día.
filas[].alcanceenteronullsí
filas[].clicsenteronullsí
filas[].clicsEnlaceenteronullsí
filas[].diaCerradobooleanosífalse si al leerlo el día todavía no terminaba en la zona de la cuenta: sus cifras pueden crecer.
filas[].versionApistringsíLa versión de la Marketing API con que se leyó la fila (por ejemplo 'v26.0').
filas[].sincronizadoEnstringsíCuándo guardó Connect esta versión de la fila (ISO 8601, UTC). Meta puede corregir días de hasta 28 días atrás; la relectura reemplaza la fila.
coberturaobjetosíQué cubre lo guardado. Dentro de [desde, hasta], un día SIN fila significa que Meta no informó entrega ese día (gasto cero), salvo que caiga en 'diasSinLeer'. Fuera de la cobertura, el gasto es desconocido.
cobertura.desdestringnullsí
cobertura.hastastringnullsí
cobertura.completabooleanosítrue sólo si el histórico llegó al horizonte del conector (~13 meses), no quedó ningún tramo sin leer y la última sincronización no quedó a medias. En false, una lista vacía NO prueba que no hubo gasto: dilo así.
cobertura.diasSinLeerlista de objetosíTramos dentro de la cobertura que no se pudieron leer: ahí el gasto es DESCONOCIDO, no cero.
cobertura.diasSinLeer[].desdestringsíPrimer día del tramo (AAAA-MM-DD).
cobertura.diasSinLeer[].hastastringsíÚltimo día del tramo (AAAA-MM-DD).
cobertura.diasSinLeer[].motivostringsíPor qué no se leyó: 'demasiados_datos', 'datos_ilegibles' o 'agrupada'.
cobertura.pendiente"presupuesto" · "error_transitorio"nullsí
cobertura.sincronizadoEnstringnullsí
cursorstringnullsí
JSON Schema de salida
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "cuenta": {
      "type": "object",
      "properties": {
        "cuentaId": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "El id de la cuenta publicitaria en Meta, sin el prefijo 'act_', como texto. null si la conexión todavía no sincronizó."
        },
        "moneda": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "La moneda de la cuenta (ISO 4217) en la última sincronización. Cada fila trae además la suya."
        },
        "zonaHoraria": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "La zona horaria IANA de la cuenta (por ejemplo 'America/Santiago'): en ella corta Meta los días."
        }
      },
      "required": [
        "cuentaId",
        "moneda",
        "zonaHoraria"
      ],
      "additionalProperties": false,
      "description": "La cuenta publicitaria fijada a esta conexión. Una conexión lee UNA sola cuenta publicitaria."
    },
    "filas": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "campanaId": {
            "type": "string",
            "description": "El id de la campaña en Meta, como texto: no lo conviertas a número."
          },
          "campanaNombre": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "El nombre de la campaña cuando Connect leyó la fila. Puede cambiar en Meta; identifica con 'campanaId'."
          },
          "fecha": {
            "type": "string",
            "description": "El día (AAAA-MM-DD) en la zona horaria de 'zonaHoraria', la de la cuenta publicitaria. No es un día de Chile si la cuenta usa otra zona."
          },
          "moneda": {
            "type": "string",
            "description": "La moneda del gasto (ISO 4217, la de la cuenta publicitaria). Nunca sumes gastos de monedas distintas."
          },
          "zonaHoraria": {
            "type": "string",
            "description": "La zona horaria IANA con que Meta cortó este día."
          },
          "gasto": {
            "type": "string",
            "description": "Gasto estimado del día según Meta, decimal en texto en 'moneda' (por ejemplo \"15990\" o \"12.34\"). Es una métrica de entrega publicitaria, NO un comprobante: no es lo facturado ni lo cobrado, y no incluye impuestos."
          },
          "impresiones": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "Veces que se mostraron los anuncios ese día."
          },
          "alcance": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "Personas únicas (cuentas del Centro de cuentas) que vieron los anuncios ese día, estimado por Meta. NO se suma entre días ni entre campañas: una persona puede repetirse. null si Meta no lo informó; null no es cero."
          },
          "clics": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "Clics de todo tipo según Meta. null si no lo informó."
          },
          "clicsEnlace": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "Clics en el enlace del anuncio según Meta (inline_link_clicks). Es una métrica de interacción, no una conversión ni una venta. null si no lo informó."
          },
          "diaCerrado": {
            "type": "boolean",
            "description": "false si al leerlo el día todavía no terminaba en la zona de la cuenta: sus cifras pueden crecer."
          },
          "versionApi": {
            "type": "string",
            "description": "La versión de la Marketing API con que se leyó la fila (por ejemplo 'v26.0')."
          },
          "sincronizadoEn": {
            "type": "string",
            "description": "Cuándo guardó Connect esta versión de la fila (ISO 8601, UTC). Meta puede corregir días de hasta 28 días atrás; la relectura reemplaza la fila."
          }
        },
        "required": [
          "campanaId",
          "campanaNombre",
          "fecha",
          "moneda",
          "zonaHoraria",
          "gasto",
          "impresiones",
          "alcance",
          "clics",
          "clicsEnlace",
          "diaCerrado",
          "versionApi",
          "sincronizadoEn"
        ],
        "additionalProperties": false
      },
      "description": "Un día de una campaña por fila, del día más reciente al más antiguo. Cada fila es el total de ESA campaña ese día."
    },
    "cobertura": {
      "type": "object",
      "properties": {
        "desde": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Primer día (AAAA-MM-DD, zona de la cuenta) desde el que están guardados los dos niveles. null si nunca se sincronizó."
        },
        "hasta": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Último día leído (AAAA-MM-DD). Puede ser hoy: las filas con 'diaCerrado' en false todavía pueden crecer."
        },
        "completa": {
          "type": "boolean",
          "description": "true sólo si el histórico llegó al horizonte del conector (~13 meses), no quedó ningún tramo sin leer y la última sincronización no quedó a medias. En false, una lista vacía NO prueba que no hubo gasto: dilo así."
        },
        "diasSinLeer": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "desde": {
                "type": "string",
                "description": "Primer día del tramo (AAAA-MM-DD)."
              },
              "hasta": {
                "type": "string",
                "description": "Último día del tramo (AAAA-MM-DD)."
              },
              "motivo": {
                "type": "string",
                "description": "Por qué no se leyó: 'demasiados_datos', 'datos_ilegibles' o 'agrupada'."
              }
            },
            "required": [
              "desde",
              "hasta",
              "motivo"
            ],
            "additionalProperties": false
          },
          "description": "Tramos dentro de la cobertura que no se pudieron leer: ahí el gasto es DESCONOCIDO, no cero."
        },
        "pendiente": {
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "presupuesto",
                "error_transitorio"
              ]
            },
            {
              "type": "null"
            }
          ],
          "description": "Si la última sincronización terminó con trabajo pendiente: 'presupuesto' (quedó historia por leer) o 'error_transitorio' (Meta limitó o no respondió). null si terminó todo lo que tenía."
        },
        "sincronizadoEn": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Cuándo terminó la última sincronización que guardó datos (ISO 8601, UTC). null si nunca."
        }
      },
      "required": [
        "desde",
        "hasta",
        "completa",
        "diasSinLeer",
        "pendiente",
        "sincronizadoEn"
      ],
      "additionalProperties": false,
      "description": "Qué cubre lo guardado. Dentro de [desde, hasta], un día SIN fila significa que Meta no informó entrega ese día (gasto cero), salvo que caiga en 'diasSinLeer'. Fuera de la cobertura, el gasto es desconocido."
    },
    "cursor": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Puntero a la página siguiente. Si viene distinto de null hay más filas: vuelve a llamar reenviándolo tal cual en 'cursor'. Un null significa que no queda nada por traer."
    }
  },
  "required": [
    "cuenta",
    "filas",
    "cobertura",
    "cursor"
  ],
  "additionalProperties": false
}

Errores de esta tool

CódigoHTTPReintentableQué hacer
connection_disabled403noReactívala en /connections o usa otra conexión del mismo sistema.
connection_not_found404noUsa uno de los connectionId que lista el error, o revisa la conexión en /connections. No hace falta reactivar nada.
alcance_not_enabled403noHabilita el alcance en /connections o quítalo del input de la sincronización.

Toda llamada puede devolver además los códigos transversales (validation_error, unauthorized, scope_not_granted, rate_limited, entre otros): el detalle vive en el catálogo de errores.

Próximos pasos

En esta página