Manage Google Ads Extensions
adsap_google_manage_extensionManage Google Ads extensions (sitelinks, callouts, structured snippets, call, promotion, price) at CAMPAIGN level (default) or ACCOUNT level (level: 'account' — the link serves with ALL eligible campaigns; all six types accepted, probe-confirmed). Ops: 'create_and_link' creates new extension assets and links them to a campaign in one atomic call (max 20); 'link' attaches EXISTING assets to a campaign; 'unlink' detaches them from that campaign — this is how you stop an extension serving there, because Google Ads assets cannot be deleted; 'update_asset' edits an existing asset — WARNING: assets are account-scoped, so an update changes the extension EVERYWHERE it is linked, not just one campaign. Image extensions: bytes go through adsap_google_upload_asset first, then op 'link' with field_type AD_IMAGE — BUT Google allowlist-gates AD_IMAGE links via API (most accounts get UNSUPPORTED_FIELD_TYPE; not something ADSAP can fix), and image assets are never content-mutable. Promotion/price also link to PMax campaigns; AD_IMAGE does not. Use adsap_google_list_extensions first to see what exists (asset ids, field types). Use dry_run: true first for create — Google validates everything without changing anything. All-or-nothing: on error nothing is applied. ad_account_id is the bare 10-digit Google Ads customer ID. Meta has no extensions analog.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | ||
| type | No | update_asset only: the asset's extension type — selects which of the flat per-type fields below apply. Image assets are NOT updatable. | |
| level | No | Where the link lives: 'campaign' (default, requires campaign_id) or 'account' (no campaign_id — the extension serves with all eligible campaigns; unlink at the same level to stop it). Ignored for update_asset. | campaign |
| links | No | link / unlink only: 1-20 existing (asset_id, field_type) pairs to attach to / detach from the campaign. | |
| header | No | update_asset (structured_snippet): new header (fixed Google vocabulary). | |
| values | No | update_asset (structured_snippet): new full set of 3-10 values (replaces the existing set). | |
| dry_run | No | ||
| asset_id | No | update_asset only: the existing asset to edit (from adsap_google_list_extensions). | |
| end_date | No | update_asset (promotion): new serving end date. | |
| occasion | No | update_asset (promotion): new occasion. | |
| final_url | No | update_asset (sitelink/promotion): new destination URL. | |
| link_text | No | update_asset (sitelink): new display text (1-25 chars). | |
| extensions | No | create_and_link only: 1-20 new extensions to create and link to the campaign, discriminated on `type`. | |
| price_type | No | update_asset (price): new price table type. | |
| start_date | No | update_asset (promotion): new serving start date. | |
| campaign_id | No | Numeric Google Ads campaign id. Required for create_and_link / link / unlink at level 'campaign'; must be OMITTED at level 'account'; ignored for update_asset. | |
| percent_off | No | update_asset (promotion): new percent discount (20 = 20% off). Mutually exclusive with money_amount_off. | |
| callout_text | No | update_asset (callout): new callout text (1-25 chars). | |
| country_code | No | update_asset (call): new 2-letter country code. | |
| description1 | No | update_asset (sitelink): new first description (set BOTH descriptions or NEITHER). | |
| description2 | No | update_asset (sitelink): new second description (set BOTH descriptions or NEITHER). | |
| phone_number | No | update_asset (call): new phone number. | |
| ad_account_id | Yes | Bare 10-digit Google Ads customer ID (from adsap_google_list_ad_accounts). No dashes, no act_ prefix. | |
| language_code | No | update_asset (promotion/price): new BCP 47 language tag. | |
| promotion_code | No | update_asset (promotion): new promo code. Mutually exclusive with orders_over_amount. | |
| price_offerings | No | update_asset (price): new FULL set of 3-8 rows (replaces the existing set). | |
| price_qualifier | No | update_asset (price): new qualifier (FROM / UP_TO / AVERAGE). | |
| final_mobile_url | No | update_asset (sitelink/promotion): new mobile destination URL. | |
| money_amount_off | No | update_asset (promotion): new fixed discount. Mutually exclusive with percent_off. | |
| promotion_target | No | update_asset (promotion): new promotion target. | |
| orders_over_amount | No | update_asset (promotion): new minimum order value. Mutually exclusive with promotion_code. | |
| redemption_end_date | No | update_asset (promotion): new redemption window end. | |
| redemption_start_date | No | update_asset (promotion): new redemption window start. |