Zernio
APIFor you
Zernio
APIFor you
Platforms

Google Ads

Overview

Build

Create adsPerformance MaxDemand Gen

Target

TargetingKeywordsCustomer Match

Measure

Insights & GAQLConversionsGoogle TagURL tracking tags

Operate

Manage adsRecommendationsAccounts & labels

Reference

Limits and errors
Dashboard
OverviewPlatformsAPI ReferenceResources
Google Ads

Limits and errors

The per-user burst limit and Google quota on live Google Ads calls, what the Google Ads API and Zernio's integration do not expose, and the errors Google returns most often.


Live Google Ads calls pass a per-user burst limit. Anything Google rejects comes back carrying Google's own error.

API version

Zernio calls Google Ads API v25, so GAQL resource and field names resolve against that version.

Zernio moves the version itself, and a migration needs no change on your side. The one field Google removed that older queries still use is translated for you, see legacy date fields.

Quotas and the ops budget

Every Google Ads API call across all Zernio customers runs on one developer token.

The token holds Standard access, so there is no daily operations cap to budget for. Two limits remain:

LimitWhat it is429 details
Per-user burstZernio's own gate on user-driven live calls (the GAQL passthrough, search terms, Keyword Planner, and the keyword, label, goal, asset group, recommendation, targeting and campaign writes that go straight to Google): 15 requests per minute per Google Ads account and 120 per minute per user across all accounts, counted per request regardless of batch sizebudgetScope: "account" or "user". Clears within a minute.
Google's quotaGoogle throttling the shared developer token or your own ad accountquotaExhausted: true, quotaScope (DEVELOPER for the shared token, ACCOUNT for your ad account) and resetsAt, with a Retry-After header counting down to it

Both return 429 with code rate_limited and platform: "google".

On a Google quota 429, retrying before resetsAt cannot succeed. Keep calling other platforms, which are unaffected.

Cached reads. These reads are cached for 10 minutes:

  • labels
  • asset groups
  • conversion goals
  • recommendations
  • the manager hierarchy
  • negative keyword lists
  • search terms

When Google's quota runs out, they fall back to the last successful copy with stale: true. Check cachedAt and stale before treating a read as live.

Rate limits covers Zernio's own request limits.

What you cannot do

Google's API, or Zernio's Google integration, does not expose:

  • Shopping or Video campaigns through /v1/ads/create (Search, Display, Performance Max and Demand Gen only). Discovered campaigns of every type still sync into /ads/tree with metrics. A discovered Video campaign ad carries its YouTube video ids in creative.youtubeVideoIds, with the first video's YouTube thumbnail as creative.thumbnailUrl.
  • Editing the cards of an existing Demand Gen carousel ad (create a new carousel ad instead).
  • Deleting a Google asset: unlinking or removing detaches it, and the asset stays in the account library.
  • A Responsive Display Ad with one image (Google requires landscape and square).
  • GAQL writes: the passthrough is read-only SELECT.
  • segments.date without a finite date filter (Google rejects it).
  • Campaign-level negative keywords on GET /v1/ads/keywords (ad-group level only; read them from GET /v1/ads/campaigns/{campaignId}/negative-keywords or GAQL).
  • Same-day keyword sync: the synced keyword list refreshes about once a day per customer.
  • Phone-number matching on Customer Match (email only; phone is ignored).
  • Instant conversions: Data Manager conversions take up to 3 hours to appear in reports.

Common errors

ErrorWhereCause and fix
NOT_ENOUGH_SQUARE_MARKETING_IMAGE_ASSET, NOT_ENOUGH_MARKETING_IMAGE_ASSETDisplay createOne of the 2 required images is missing. Pass both images.landscape and images.square.
400 carrying a GAQL messageGAQL passthroughGoogle's query validator, verbatim; its messages name the offending field. The classic is an unbounded segments.date.
429 with details.budgetScope: "account" or "user"Any live Google callYou passed 15 requests in a minute on one account (account) or 120 across all your accounts (user). Retry within the minute.
429 with details.quotaExhausted: trueAny live Google callGoogle's quota on the shared token (quotaScope: DEVELOPER) or your ad account (ACCOUNT). Wait until details.resetsAt.

Google's own error is forwarded inside Zernio's platform_error envelope (error handling):

JSON
{
  "error": "Google rejected the ad: NOT_ENOUGH_SQUARE_MARKETING_IMAGE_ASSET",
  "type": "platform_error",
  "code": "platform_api_error",
  "platform": "google",
  "platformError": {
    "code": 3,
    "message": "Request contains an invalid argument.",
    "details": [ { "errors": [ { "errorCode": { "assetError": "NOT_ENOUGH_SQUARE_MARKETING_IMAGE_ASSET" }, "message": "Too few." } ] } ]
  }
}

Related

  • Create ads: the media requirements and the create call each limit applies to.
  • Insights and GAQL: the live reads the burst limit applies to.
  • Error handling: the envelope every error uses.
Was this page helpful?

Accounts & labels

Read the Google Ads manager (MCC) hierarchy behind a connection, create client accounts under a manager, manage manager links, and organize campaigns, ad groups, ads and keywords with labels.

LinkedIn Ads

Create, boost, target and measure LinkedIn campaigns on a linkedinads account with the ads endpoints.

On this page

API versionQuotas and the ops budgetWhat you cannot doCommon errorsRelated