Attach extension assets to a Google Search campaign
Attach sitelinks, callouts and/or structured snippets to an already-existing Google Search campaign — the same builders POST /v1/ads/create uses, but without rebuilding the hierarchy. At least one of sitelinks, callouts or structuredSnippets is required.
Google-only. Other platforms have no equivalent extension surface and return 501.
Approval status is Google-async; poll asset.policy_summary after review. Assets
stay in the account library even if the campaign is later deleted.
API key authentication - use your Zernio API key as a Bearer token
In: header
Path Parameters
Numeric Google platform campaign id.
Zernio Google Ads SocialAccount id — resolves the customer id + refresh token.
See POST /v1/ads/create sitelinks — same shape.
2 <= items <= 201 <= items <= 201 <= items <= 20Response Body
application/json
application/json
import Zernio from '@zernio/node';const zernio = new Zernio({ apiKey: process.env.ZERNIO_API_KEY });const { data } = await zernio.adcampaigns.attachCampaignAssets({ path: { campaignId: 'campaign_abc123', }, body: { accountId: 'account_abc123', },});console.log(data);{
"campaignId": "string",
"sitelinkAssetResourceNames": [
"string"
],
"calloutAssetResourceNames": [
"string"
],
"structuredSnippetAssetResourceNames": [
"string"
]
}{
"error": "Unauthorized"
}Pause or resume many campaigns POST
Process up to 50 campaigns in one call. Each campaign is updated concurrently and the response contains a per-campaign result so a single bad row does not fail the whole batch.
Boost post as ad POST
Creates a paid ad from an existing published post, keeping the post's engagement. By default it provisions the whole hierarchy (campaign, ad set, ad). **Attach shape (Meta).** Send `adSetId` to put the ad under an EXISTING ad set instead, so that ad set keeps its learning phase. It then owns `budget`, `schedule` and `targeting`, and sending any of those alongside `adSetId` is a 400 rather than a silent drop. `budget` is required only without `adSetId`. `instagramAccountId`, `destinationType` and `adSetId` are Meta-only and return 400 on other platforms. **Retries.** Boosts are NOT idempotent and can take minutes when Meta requires re-hosting an Instagram video, so do not retry on client timeout. Send an Idempotency-Key header to make retries safe: same key and body replays the original 201, and distinct keys always create distinct ads. Without the header, an identical request is treated as a retry: while one is in flight it returns 409, and within 10 minutes of a completed boost it returns the already-created ad instead of creating another. To intentionally duplicate an ad, send distinct Idempotency-Keys (or vary the body, e.g. the name).