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

Manage ads

Pause and resume Google campaigns, ad groups and ads, change a campaign's budget and bidding, rename ad groups, and delete any level.


By the end of this page, you can stop and restart delivery, change what a running Google campaign spends, and remove what you no longer need.

Before you start

You need a googleads account and a campaign. campaignId and adSetId are Google's numeric campaign and ad group ids (platformCampaignId and platformAdSetId on the created ad).

Pause or resume

PUT /v1/ads/campaigns/{campaignId}/status writes the campaign's own switch (ENABLED or PAUSED) and nothing else. Its ad groups and ads keep their own switches.

import Zernio from '@zernio/node';

const zernio = new Zernio();

const { data: paused } = await zernio.adcampaigns.updateAdCampaignStatus({
  path: { campaignId: '21874563210' },
  body: { status: 'paused', platform: 'google' }
});

Response (200):

{ "status": "paused", "platformCampaignStatus": "PAUSED", "statusReadAt": "2026-10-19T08:55:34.565Z", "updated": 1, "skipped": 0 }

Zernio reads the switch from Google first. When it is already in the requested state, nothing is written and the response says updated: 0, skipped: 1 with a reason.

Resuming a campaign lets each ad group and ad deliver again only if its own switch is on. Narrower scopes take the same status:

ScopeCall
One ad groupPUT /v1/ads/ad-sets/{adSetId}/status
One adPUT /v1/ads/{adId}/status, which leaves sibling ads running
Up to 50 campaignsPOST /v1/ads/campaigns/bulk-status, which reports each row on its own

A Performance Max campaign is always created paused. Resume it here once it passes review.

Change the budget

Send budget on PUT /v1/ads/campaigns/{campaignId}. Google budgets are daily only, and the amount is in whole units of the account's currency, not micros.

const { data: rebudgeted } = await zernio.adcampaigns.updateAdCampaign({
  path: { campaignId: '21874563210' },
  body: { platform: 'google', budget: { amount: 80, type: 'daily' } }
});

Response (200):

{ "updated": 1, "budget": { "amount": 80, "type": "daily", "amountMicros": "80000000" }, "budgetLevel": "campaign" }

budget on PUT /v1/ads/{adId} changes the same campaign budget.

Shared budgets. A budget is shared when Google flags it so, or when more than one campaign uses it. On PUT /v1/ads/campaigns/{campaignId}, changing one returns 409 unless you send allowSharedBudgetUpdate: true, because the change reaches every campaign on it. PUT /v1/ads/{adId} does not take that flag and always returns 409.

sharedBudgetId moves the campaign onto a budget from GET /v1/ads/shared-budgets, and also needs allowSharedBudgetUpdate: true. sharedBudgetId: null moves it back onto a new daily budget of its own, sized by budget.

Change the bidding

bidStrategy on PUT /v1/ads/campaigns/{campaignId} sets the campaign's bidding. Amounts are whole currency units.

bidStrategyWithGoogle strategy
LOWEST_COST_WITHOUT_CAPMaximize Conversions
COST_CAPbidAmountTarget CPA
LOWEST_COST_WITH_MIN_ROASroasAverageFloorTarget ROAS
LOWEST_COST_WITH_BID_CAPbidAmountMaximize Clicks with a CPC ceiling

Instead of bidStrategy, send one of:

  • portfolioBidStrategyId, to attach a portfolio strategy from GET /v1/ads/bid-strategies
  • targetImpressionShare (Search only)
  • manualCpc: { maxCpc } (Search and Display), which gives every ad group of the campaign maxCpc as its bid

A campaign on a portfolio strategy rejects bidStrategy. Detach it in Google Ads first, since the strategy is shared across campaigns.

Rename

name on PUT /v1/ads/ad-sets/{adSetId} renames the ad group.

Google ads have no rename: PUT /v1/ads/{adId} does not take name on Google. To change what an ad says, edit its text instead (Edit responsive search ad text).

Delete

LevelCallWhat Google does
AdDELETE /v1/ads/{adId}Removes the ad. Zernio keeps it as cancelled for history.
Ad groupDELETE /v1/ads/ad-sets/{adSetId}Removes the ad group, which stays readable for reporting. Its ads are marked cancelled.
CampaignDELETE /v1/ads/campaigns/{campaignId}Removes the campaign. Its ads are marked cancelled.

Deleting an ad never deletes its campaign or ad group while they hold another ad.

A campaign with no ads in Zernio is deleted only after Google confirms it holds no ad groups, ads or asset groups. To delete one, send accountId in the body or the query string.

If it fails

ErrorCauseFix
409 on a budget changeThe campaign's budget is shared, or its sharing state is unknownSend allowSharedBudgetUpdate: true if you mean to change every campaign on it
422 on budgetTypeThe budget is lifetimeSend type: "daily"
501 on bidStrategy on an ad groupGoogle bids at campaign levelSet it on PUT /v1/ads/campaigns/{campaignId}
409 invalid_resource_state on a campaign deleteThe empty campaign was never synced, or Google still lists ad groups or ads under itSync the ad account (POST /v1/ads/sync) and delete again
429 with budgetScopeMore than 15 writes a minute on one account, or 120 across your accountsRetry within the minute (Quotas)

Related

  • Create a campaign: the campaigns these calls manage.
  • Targeting: change a running campaign's locations, languages and devices.
  • Keywords: pause, change or remove one keyword.
  • Pause or resume a campaign, Update a campaign and Delete a campaign: every field.
Was this page helpful?

URL tracking tags

Read and update a Google campaign's tracking template and final URL suffix through GET and PATCH /v1/ads/{adId}/tracking-tags.

Recommendations

Read Google's optimization recommendations for a Google Ads account with their estimated impact, apply them with Google's suggested values or your own, and dismiss the ones you do not want.

On this page

Before you startPause or resumeChange the budgetChange the biddingRenameDeleteIf it failsRelated