---
title: "Flexible live insights query"
method: GET
path: "/v1/ads/insights"
tags: ["Ad Insights"]
---

# Flexible live insights query

`GET /v1/ads/insights`

Live, flexible insights query. The account's platform picks the contract:

**Meta (facebook/instagram)**: forwards caller-chosen `fields`, `breakdowns` and `filtering`
to any Meta insights node and returns Meta's rows verbatim. `objectId` (required) selects the
node; `level` sets row granularity. Semantic validation is Meta's: an unknown field or invalid
breakdown combination returns a 400 carrying Meta's message. For long ranges or agency-scale
accounts prefer the async variant (POST /v1/ads/insights/reports).

**Google Ads (googleads)**: raw GAQL passthrough. Send any read-only GAQL SELECT via `query`
(campaign/keyword/search-term/geo/demographic/asset/shopping resources, `change_event`, any
`segments.*`) and rows come back verbatim (camelCase, counters as strings). Results are paged
at a fixed 10,000 rows; follow `paging.nextPageToken` with `pageToken`. `customerId` is only
needed when the connection has several Google Ads accounts. Semantic validation is Google's:
an invalid query returns a 400 carrying Google's message (note: selecting `segments.date`
requires a finite date filter).

## Query parameters

- `accountId` string, required
- `objectId` string
- `query` string
- `customerId` string
- `pageToken` string
- `level` 'ad' | 'adset' | 'campaign' | 'account'
- `fields` string
- `breakdowns` string
- `actionBreakdowns` string
- `actionAttributionWindows` string
- `actionReportTime` string
- `useUnifiedAttributionSetting` boolean
- `filtering` string
- `datePreset` string
- `fromDate` string, date
- `toDate` string, date
- `timeIncrement` string
- `limit` integer
- `after` string

## Response `200`

Insight rows (raw platform shape)

- object
  - `objectId` string — Meta responses only.
  - `customerId` string — Google responses only: the customer the query ran against.
  - `fieldMask` string, nullable — Google responses only: the selected fields echoed by Google.
  - `data` object[]
  - `paging` object
    - `after` string, nullable — Meta cursor for the next page; null when exhausted.
    - `nextPageToken` string, nullable — Google cursor for the next page; null when exhausted.

## Other responses

- `400` — Invalid input, or the platform rejected the query (unknown field, invalid breakdown combo, malformed GAQL) — message carries the platform's error
- `401` — Unauthorized
- `429` — Platform rate limit reached. For Google this is the per-user operations budget or the shared quota; the message says which and when it resets.
- `501` — Only supported on Meta (facebook/instagram) and Google Ads

---

[API](https://skmtc.net/zernio/apis/zernio-api.md) · [All operations](https://skmtc.net/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zernio/zernio-api/versions/51932b099b2f/schema)
