Zernio
Zernio
API Reference

Insights

List lead conversationsGETGoogle Local Services Ads leadsGETSubmit async insights reportPOSTGet ad analyticsGETPoll an async insights report runGETGoogle Ads search terms reportGETGet campaign analyticsGETGet historical keyword metricsPOSTGenerate keyword ideasPOSTFlexible live insights queryGET
Dashboard
llms.txtOpenAPI
OverviewPlatformsAPI ReferenceResources
Insights

Google Ads search terms report

The actual search queries that triggered your ads, with matched-keyword status and spend metrics, the raw material for wasted-spend analysis and negative-keyword lists. Reads Google's search_term_view, cached for the quota window; defaults to the last 30 days. Rows are ordered by cost, descending. Draws on the shared Google Ads operations budget. The response carries cachedAt and stale, set when a quota-exhausted call falls back to the last-good copy instead of a live read.


PlatformsGoogle
GET
/v1/ads/search-terms

Authorization

bearerAuth
AuthorizationBearer <token>

API key authentication: send your Zernio API key in the Authorization header, prefixed with Bearer.

In: header

Query Parameters

accountId*string

Google ads SocialAccount id.

customerId?string

Numeric Google Ads customer id (no dashes). Defaults to the account's connected customer.

fromDate?string

Defaults to 30 days ago.

Formatdate
toDate?string

Defaults to today.

Formatdate
campaignId?string

Numeric Google campaign id filter.

adGroupId?string

Numeric Google ad group id filter.

pageToken?string

Cursor from paging.nextPageToken of the previous page.

Response Body

application/json

application/json

application/json

application/json

application/json

{  "customerId": "string",  "data": [    {      "searchTerm": "string",      "status": "string",      "matchType": "string",      "campaignId": "string",      "campaignName": "string",      "adGroupId": "string",      "adGroupName": "string",      "impressions": 0,      "clicks": 0,      "costMicros": 0,      "conversions": 0,      "conversionsValue": 0    }  ],  "paging": {    "nextPageToken": "string"  },  "cachedAt": "2019-08-24T14:15:22Z",  "stale": true}
Was this page helpful?

Poll an async insights report run

Status and results for a report run created via POST /v1/ads/insights/reports. While the job runs, returns `status` and `percentCompletion`. Once `status` is "Job Completed" the response also carries a `data` page, cursor-paginated via `limit` / `after`.

Get campaign analytics

Returns performance analytics for a whole campaign in one call: summary metrics, a daily timeline over the requested date range (summed across the campaign's ads), and optional demographic breakdowns. Breakdowns are fetched live from Meta at the campaign level (one call per dimension, no per-ad fan-out), so an agency dashboard gets campaign-level age/gender/etc. without summing thousands of per-ad reads. `campaignId` is the platform campaign id; pass `platform` when a campaign id could be ambiguous across platforms. If no date range is provided, defaults to the last 90 days. Date range is capped at 730 days max. Google adds searchImpressionShare, searchBudgetLostImpressionShare, searchRankLostImpressionShare, searchTopImpressionShare and searchAbsoluteTopImpressionShare under analytics.summary for the requested inclusive range. These ratios are queried together without daily segmentation and cached for 10 minutes. Unavailable values are null. analytics.impressionShareCache reports cachedAt and stale independently of synced metrics.