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:
| Limit | What it is | 429 details |
|---|---|---|
| Per-user burst | Zernio'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 size | budgetScope: "account" or "user". Clears within a minute. |
| Google's quota | Google throttling the shared developer token or your own ad account | quotaExhausted: 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/treewith metrics. A discovered Video campaign ad carries its YouTube video ids increative.youtubeVideoIds, with the first video's YouTube thumbnail ascreative.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.datewithout a finite date filter (Google rejects it).- Campaign-level negative keywords on
GET /v1/ads/keywords(ad-group level only; read them fromGET /v1/ads/campaigns/{campaignId}/negative-keywordsor GAQL). - Same-day keyword sync: the synced keyword list refreshes about once a day per customer.
- Phone-number matching on Customer Match (email only;
phoneis ignored). - Instant conversions: Data Manager conversions take up to 3 hours to appear in reports.
Common errors
| Error | Where | Cause and fix |
|---|---|---|
NOT_ENOUGH_SQUARE_MARKETING_IMAGE_ASSET, NOT_ENOUGH_MARKETING_IMAGE_ASSET | Display create | One of the 2 required images is missing. Pass both images.landscape and images.square. |
400 carrying a GAQL message | GAQL passthrough | Google'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 call | You 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: true | Any live Google call | Google'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):
{
"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.
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.