Create a standalone ad group
Changed onCreates an empty ad group under an existing campaign, ready for ads to be added later.
The ad group is created WITHOUT an ad (Google Ads compliance row C.190). Ads join it later via adSetId on POST /v1/ads/create. Supports Google Ads and Reddit Ads; every other platform returns 501.
Google Ads (platform: google)
- The ad group type follows the campaign: a standard ad group under a Search or Display campaign, a Demand Gen ad group under a Demand Gen campaign.
- On a Demand Gen campaign the ad group is always created PAUSED, and maxCpc or status: ACTIVE returns 400 (Demand Gen bids at the campaign).
- targeting sets a Demand Gen ad group's locations and languages (countries, regions, cities, zips, metros, languages), created atomically with the ad group. Without it the ad group serves worldwide.
- targeting returns 400 for any other targeting field, and on campaigns that keep geo on the campaign: Search, Display, and Demand Gen campaigns migrated from Discovery. Edit those with PUT /v1/ads/campaigns/{campaignId}/targeting.
- Any other campaign type returns 400 (Performance Max has asset groups instead of ad groups).
- A campaign that is not in the ad account, or was removed, returns 404.
Reddit Ads (platform: reddit)
- adAccountId (the Reddit ad account id) is required and must be a selected ad account of the connection (403 otherwise).
- When the campaign has no campaign budget, send budgetAmount + budgetType (a lifetime budget needs endDate).
- The ad group is optimized for the campaign's objective. promotedObject.customEventType is required on a conversions campaign, and the pixel must have received that event, else 422.
- It bids with bidStrategy/bidAmount like POST /v1/ads/create.
- Under campaign budget optimization the ad group takes the campaign's bid, goal type, optimization event and pixel, and bid fields return 400.
- The ad group must start no earlier than a future campaign start and end no later than the campaign end (400 otherwise).
- targeting takes the same targeting object as the other ad endpoints (no geo defaults to the US).
- A campaign of another ad account returns 404, a Reddit Max campaign 422.
- maxCpc and customerId are Google only (400 on Reddit), and the other Reddit fields return 400 on Google.
After creation
Created PAUSED unless status: ACTIVE. The new ad group has no ad yet, so it will not appear in GET /v1/ads/tree (built purely from ads rows) until one is added. Use GET /v1/ads/ad-sets to see it in the meantime.
It can be read, edited and deleted through /v1/ads/ad-sets/{adSetId} right away (targeting, schedule, name, status, budget and bid fields). A budget on an ad group that spends its campaign budget returns 422.
Idempotency: send an Idempotency-Key header to make retries safe.
Request
- Base URLhttps://zernio.com/api
- AuthHTTP bearer
- TypeScriptA function with typed inputs. Its response is checked against the schema.
Headers
Optional client-generated unique key (e.g. a UUID) that makes retries safe.
- Same key + same body: replays the original response.
- Same key + different body: 422.
- Key still processing: 409.
Only 2xx responses are stored, so a request that failed with a 4xx can be retried with a corrected body under the SAME key.
Request body
Response
Ad group created
Changes
- info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status
- info
- breaking
added to the
request propertyallOflist - breaking
the
request property type changed fromobjectto no type - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/ - warning
removed the request property
/
- breaking