Skip to main content
Glama

Propose Google Ads changes (applies nothing)

propose_changes
Idempotent

Dry-runs proposed Google Ads changes against the live account and returns a plain-English summary for approval, without modifying anything. Apply only after the user signs off.

Instructions

Checks a set of changes against the live account and dry-runs them with Google, then stores them as a proposal and returns a plain-English summary. Nothing is changed. Show the summary to the user and apply only after they approve. Supported: add_negative_keywords, pause_campaign, enable_campaign, pause_keyword, enable_keyword, pause_ad_group, enable_ad_group, set_daily_budget, set_end_date, and building: create_campaign (Search), create_display_campaign, create_demand_gen_campaign (YouTube), create_performance_max_campaign, all created paused; add_ad_group, add_keywords, add_responsive_search_ad, add_sitelinks, set_conversion_goal; and tuning: set_keyword_bid, set_ad_group_bid, pause_ad, enable_ad (to replace an ad: add the new one and pause the old in one proposal), add_campaign_targeting, remove_campaign_targeting, set_location_mode, set_bidding_strategy, set_shared_bid_strategy, create_shared_bid_strategy, set_url_suffix, set_eu_political_advertising (Google refuses every change to an account until each campaign has declared this), create_conversion_action, set_conversion_counting, import_ga4_key_event, remove_conversion_action. Point out any ⚠ line in the summary to the user before they approve. At most 50 changes per proposal, counting each keyword in add_keywords and add_negative_keywords as one (a create_campaign or add_ad_group counts as one however much it holds); for more, split them into several proposals up front and show the user all the summaries together.

Input Schema

NameRequiredDescriptionDefault
changesYesChanges to propose; several can go in one proposal, up to 50 (each keyword counts as one)
customer_idYesGoogle Ads customer ID, with or without dashes (from list_accounts)

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.20.0
    • changedInput schema / properties / changes / items / oneOf
      Previous value: -[
      -  {
      -    "description": "Block searches containing these words in one campaign",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "keywords": {
      -        "items": {
      -          "properties": {
      -            "match_type": {
      -              "description": "PHRASE blocks any search containing the words in order; the usual choice",
      -              "enum": [
      -                "EXACT",
      -                "PHRASE",
      -                "BROAD"
      -              ],
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "The search words to block, e.g. \"free\"",
      -              "maxLength": 80,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "match_type"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "add_negative_keywords",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "keywords"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Pause one keyword",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "criterion_id": {
      -        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pause_keyword",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "criterion_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Re-enable one paused keyword",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "criterion_id": {
      -        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "enable_keyword",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "criterion_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Pause a whole campaign (stops all its spend)",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pause_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Turn a paused campaign back on. It starts spending again; the summary says how much",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "enable_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Pause one ad group",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pause_ad_group",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Re-enable one paused ad group",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "enable_ad_group",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Change a campaign's daily budget (not shared budgets)",
      -    "properties": {
      -      "amount": {
      -        "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "set_daily_budget",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "amount"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Set the last day a campaign runs, so it stops spending on its own",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "end_date": {
      -        "anyOf": [
      -          {
      -            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -            "type": "string"
      -          },
      -          {
      -            "const": "none",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date"
      -      },
      -      "type": {
      -        "const": "set_end_date",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "end_date"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign",
      -    "properties": {
      -      "ad_groups": {
      -        "items": {
      -          "properties": {
      -            "ads": {
      -              "items": {
      -                "description": "A responsive search ad",
      -                "properties": {
      -                  "descriptions": {
      -                    "description": "2 to 4 descriptions, each at most 90 characters",
      -                    "items": {
      -                      "maxLength": 90,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 4,
      -                    "minItems": 2,
      -                    "type": "array"
      -                  },
      -                  "final_url": {
      -                    "description": "The landing page",
      -                    "maxLength": 2048,
      -                    "pattern": "^https?:\\/\\/",
      -                    "type": "string"
      -                  },
      -                  "headlines": {
      -                    "description": "3 to 15 headlines, each at most 30 characters",
      -                    "items": {
      -                      "maxLength": 30,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 15,
      -                    "minItems": 3,
      -                    "type": "array"
      -                  },
      -                  "path1": {
      -                    "description": "Display path part 1, at most 15 characters",
      -                    "maxLength": 15,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "path2": {
      -                    "description": "Display path part 2, at most 15 characters",
      -                    "maxLength": 15,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "headlines",
      -                  "descriptions",
      -                  "final_url"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 3,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "default_max_cpc": {
      -              "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)",
      -              "exclusiveMinimum": 0,
      -              "maximum": 1000,
      -              "type": "number"
      -            },
      -            "keywords": {
      -              "items": {
      -                "properties": {
      -                  "match_type": {
      -                    "description": "PHRASE matches searches containing the words in order; the usual choice",
      -                    "enum": [
      -                      "EXACT",
      -                      "PHRASE",
      -                      "BROAD"
      -                    ],
      -                    "type": "string"
      -                  },
      -                  "max_cpc": {
      -                    "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      -                    "exclusiveMinimum": 0,
      -                    "maximum": 1000,
      -                    "type": "number"
      -                  },
      -                  "text": {
      -                    "description": "The keyword, e.g. \"cleaning invoice template\"",
      -                    "maxLength": 80,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "text",
      -                  "match_type"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 50,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "name": {
      -              "maxLength": 255,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "keywords",
      -            "ads"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 10,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "bidding": {
      -        "default": "MANUAL_CPC",
      -        "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget",
      -        "enum": [
      -          "MANUAL_CPC",
      -          "MAXIMIZE_CLICKS",
      -          "MAXIMIZE_CONVERSIONS"
      -        ],
      -        "type": "string"
      -      },
      -      "daily_budget": {
      -        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "end_date": {
      -        "description": "Last day the campaign runs, YYYY-MM-DD",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [
      -          "1000"
      -        ],
      -        "description": "Google language ids, e.g. 1000 English, 1003 Spanish",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [
      -          "2840"
      -        ],
      -        "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "name": {
      -        "description": "Campaign name; must not match an existing campaign",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "negative_keywords": {
      -        "default": [],
      -        "description": "Searches to block across the campaign",
      -        "items": {
      -          "properties": {
      -            "match_type": {
      -              "enum": [
      -                "EXACT",
      -                "PHRASE",
      -                "BROAD"
      -              ],
      -              "type": "string"
      -            },
      -            "text": {
      -              "maxLength": 80,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "match_type"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 200,
      -        "type": "array"
      -      },
      -      "presence_only": {
      -        "default": true,
      -        "description": "Show ads only to people IN the locations (true), not merely interested in them",
      -        "type": "boolean"
      -      },
      -      "search_partners": {
      -        "default": false,
      -        "description": "Also show on Google's search partner sites",
      -        "type": "boolean"
      -      },
      -      "sitelinks": {
      -        "default": [],
      -        "items": {
      -          "properties": {
      -            "description1": {
      -              "description": "At most 35 characters; give both descriptions or neither",
      -              "maxLength": 35,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "description2": {
      -              "maxLength": 35,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "Link text, at most 25 characters",
      -              "maxLength": 25,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "url": {
      -              "maxLength": 2048,
      -              "pattern": "^https?:\\/\\/",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "url"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 8,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "create_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "daily_budget",
      -      "ad_groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Build a new Display campaign (image ads across Google's Display Network of sites and apps) with ad groups and responsive display ads. Google's optimized targeting finds the audience. It is created PAUSED: nothing spends until a separate enable_campaign",
      -    "properties": {
      -      "ad_groups": {
      -        "items": {
      -          "properties": {
      -            "ads": {
      -              "items": {
      -                "description": "A responsive display ad: Google assembles ads from these headlines, descriptions and images",
      -                "properties": {
      -                  "business_name": {
      -                    "description": "The advertiser's name, at most 25 characters",
      -                    "maxLength": 25,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "descriptions": {
      -                    "description": "1 to 5 descriptions, each at most 90 characters",
      -                    "items": {
      -                      "maxLength": 90,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "final_url": {
      -                    "description": "The landing page",
      -                    "maxLength": 2048,
      -                    "pattern": "^https?:\\/\\/",
      -                    "type": "string"
      -                  },
      -                  "headlines": {
      -                    "description": "1 to 5 short headlines, each at most 30 characters",
      -                    "items": {
      -                      "maxLength": 30,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "logo_images": {
      -                    "default": [],
      -                    "description": "0 to 5 landscape logos, 4:1 (e.g. 1200×300, at least 512×128)",
      -                    "items": {
      -                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                      "maxLength": 2048,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 0,
      -                    "type": "array"
      -                  },
      -                  "long_headline": {
      -                    "description": "One long headline, at most 90 characters",
      -                    "maxLength": 90,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "marketing_images": {
      -                    "description": "1 to 15 landscape images, 1.91:1 (e.g. 1200×628, at least 600×314)",
      -                    "items": {
      -                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                      "maxLength": 2048,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 15,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "square_logo_images": {
      -                    "default": [],
      -                    "description": "0 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128)",
      -                    "items": {
      -                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                      "maxLength": 2048,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 0,
      -                    "type": "array"
      -                  },
      -                  "square_marketing_images": {
      -                    "description": "1 to 15 square images, 1:1 (e.g. 1200×1200, at least 300×300)",
      -                    "items": {
      -                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                      "maxLength": 2048,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 15,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  }
      -                },
      -                "required": [
      -                  "headlines",
      -                  "long_headline",
      -                  "descriptions",
      -                  "business_name",
      -                  "final_url",
      -                  "marketing_images",
      -                  "square_marketing_images"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 3,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "default_max_cpc": {
      -              "description": "Default max cost per click (required when the campaign uses manual CPC)",
      -              "exclusiveMinimum": 0,
      -              "maximum": 1000,
      -              "type": "number"
      -            },
      -            "name": {
      -              "maxLength": 255,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "ads"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 5,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "bidding": {
      -        "default": "MAXIMIZE_CLICKS",
      -        "description": "MANUAL_CPC uses the ad groups' max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget",
      -        "enum": [
      -          "MANUAL_CPC",
      -          "MAXIMIZE_CLICKS",
      -          "MAXIMIZE_CONVERSIONS"
      -        ],
      -        "type": "string"
      -      },
      -      "daily_budget": {
      -        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "end_date": {
      -        "description": "Last day the campaign runs, YYYY-MM-DD",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [
      -          "1000"
      -        ],
      -        "description": "Google language ids, e.g. 1000 English",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [
      -          "2840"
      -        ],
      -        "description": "Google geo target ids, e.g. 2840 United States",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "name": {
      -        "description": "Campaign name; must not match an existing campaign",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "presence_only": {
      -        "default": true,
      -        "description": "Show ads only to people IN the locations (true), not merely interested in them",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "const": "create_display_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "daily_budget",
      -      "ad_groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Build a new Demand Gen campaign with YouTube video ads, which is how to advertise on YouTube through the API (Google doesn't allow creating Video campaigns there). It is created PAUSED: nothing spends until a separate enable_campaign",
      -    "properties": {
      -      "ad_groups": {
      -        "items": {
      -          "properties": {
      -            "ads": {
      -              "items": {
      -                "description": "A Demand Gen video ad: runs on YouTube (in-stream, in-feed and Shorts), Discover and Gmail",
      -                "properties": {
      -                  "business_name": {
      -                    "description": "The advertiser's name, at most 25 characters",
      -                    "maxLength": 25,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "descriptions": {
      -                    "description": "1 to 5 descriptions, each at most 90 characters",
      -                    "items": {
      -                      "maxLength": 90,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "final_url": {
      -                    "description": "The landing page",
      -                    "maxLength": 2048,
      -                    "pattern": "^https?:\\/\\/",
      -                    "type": "string"
      -                  },
      -                  "headlines": {
      -                    "description": "1 to 5 headlines, each at most 40 characters",
      -                    "items": {
      -                      "maxLength": 40,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "logo_image": {
      -                    "description": "A square 1:1 logo (e.g. 1200×1200, at least 128×128): an https URL, or an image asset id from the account",
      -                    "maxLength": 2048,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "long_headlines": {
      -                    "description": "1 to 5 long headlines, each at most 90 characters",
      -                    "items": {
      -                      "maxLength": 90,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "videos": {
      -                    "description": "1 to 5 YouTube videos",
      -                    "items": {
      -                      "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted",
      -                      "maxLength": 200,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  }
      -                },
      -                "required": [
      -                  "videos",
      -                  "headlines",
      -                  "long_headlines",
      -                  "descriptions",
      -                  "business_name",
      -                  "logo_image",
      -                  "final_url"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 3,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "language_ids": {
      -              "default": [
      -                "1000"
      -              ],
      -              "description": "Google language ids, e.g. 1000 English",
      -              "items": {
      -                "pattern": "^\\d+$",
      -                "type": "string"
      -              },
      -              "maxItems": 20,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "location_ids": {
      -              "default": [
      -                "2840"
      -              ],
      -              "description": "Google geo target ids, e.g. 2840 United States (Demand Gen targets locations per ad group, not per campaign)",
      -              "items": {
      -                "pattern": "^\\d+$",
      -                "type": "string"
      -              },
      -              "maxItems": 50,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "name": {
      -              "maxLength": 255,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "ads"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 5,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "bidding": {
      -        "default": "MAXIMIZE_CONVERSIONS",
      -        "description": "Demand Gen bids automatically: MAXIMIZE_CONVERSIONS (needs conversion tracking) or MAXIMIZE_CLICKS",
      -        "enum": [
      -          "MAXIMIZE_CONVERSIONS",
      -          "MAXIMIZE_CLICKS"
      -        ],
      -        "type": "string"
      -      },
      -      "daily_budget": {
      -        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "end_date": {
      -        "description": "Last day the campaign runs, YYYY-MM-DD",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Campaign name; must not match an existing campaign",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "create_demand_gen_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "daily_budget",
      -      "ad_groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Build a new Performance Max campaign: one budget, Google places ads across Search, YouTube, Display, Discover, Gmail and Maps from the asset groups' text, images and videos. No shopping feed (non-retail). It is created PAUSED: nothing spends until a separate enable_campaign",
      -    "properties": {
      -      "asset_groups": {
      -        "items": {
      -          "description": "An asset group: the headlines, descriptions, images and videos Google combines into ads on every channel",
      -          "properties": {
      -            "descriptions": {
      -              "description": "2 to 5 descriptions, each at most 90 characters; Google recommends one of 60 or fewer",
      -              "items": {
      -                "maxLength": 90,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 5,
      -              "minItems": 2,
      -              "type": "array"
      -            },
      -            "final_url": {
      -              "description": "The landing page (Google may also send people to other pages on the same site)",
      -              "maxLength": 2048,
      -              "pattern": "^https?:\\/\\/",
      -              "type": "string"
      -            },
      -            "headlines": {
      -              "description": "3 to 15 headlines, each at most 30 characters",
      -              "items": {
      -                "maxLength": 30,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 15,
      -              "minItems": 3,
      -              "type": "array"
      -            },
      -            "long_headlines": {
      -              "description": "1 to 5 long headlines, each at most 90 characters",
      -              "items": {
      -                "maxLength": 90,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 5,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "marketing_images": {
      -              "description": "1 to 20 landscape images, 1.91:1 (e.g. 1200×628)",
      -              "items": {
      -                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                "maxLength": 2048,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 20,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "name": {
      -              "maxLength": 255,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "portrait_marketing_images": {
      -              "default": [],
      -              "description": "0 to 20 portrait images, 4:5 (e.g. 960×1200)",
      -              "items": {
      -                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                "maxLength": 2048,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 20,
      -              "minItems": 0,
      -              "type": "array"
      -            },
      -            "square_marketing_images": {
      -              "description": "1 to 20 square images, 1:1 (e.g. 1200×1200)",
      -              "items": {
      -                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                "maxLength": 2048,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 20,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "videos": {
      -              "default": [],
      -              "description": "0 to 5 YouTube videos; without one, Google may auto-generate a video from the images",
      -              "items": {
      -                "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted",
      -                "maxLength": 200,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 5,
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "final_url",
      -            "headlines",
      -            "long_headlines",
      -            "descriptions",
      -            "marketing_images",
      -            "square_marketing_images"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 5,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "bidding": {
      -        "default": "MAXIMIZE_CONVERSIONS",
      -        "description": "Performance Max bids for conversions only: MAXIMIZE_CONVERSIONS, or MAXIMIZE_CONVERSION_VALUE when conversions carry values",
      -        "enum": [
      -          "MAXIMIZE_CONVERSIONS",
      -          "MAXIMIZE_CONVERSION_VALUE"
      -        ],
      -        "type": "string"
      -      },
      -      "business_name": {
      -        "description": "The advertiser's name, at most 25 characters (linked to the campaign, per Google's brand guidelines)",
      -        "maxLength": 25,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "daily_budget": {
      -        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "end_date": {
      -        "description": "Last day the campaign runs, YYYY-MM-DD",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [
      -          "1000"
      -        ],
      -        "description": "Google language ids, e.g. 1000 English",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [
      -          "2840"
      -        ],
      -        "description": "Google geo target ids, e.g. 2840 United States",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "logo_images": {
      -        "description": "1 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128), linked to the campaign",
      -        "items": {
      -          "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -          "maxLength": 2048,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 5,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "name": {
      -        "description": "Campaign name; must not match an existing campaign",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "target_cpa": {
      -        "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "create_performance_max_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "daily_budget",
      -      "business_name",
      -      "logo_images",
      -      "asset_groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add an ad group, with its keywords and ads, to an existing Search campaign",
      -    "properties": {
      -      "ad_group": {
      -        "properties": {
      -          "ads": {
      -            "items": {
      -              "description": "A responsive search ad",
      -              "properties": {
      -                "descriptions": {
      -                  "description": "2 to 4 descriptions, each at most 90 characters",
      -                  "items": {
      -                    "maxLength": 90,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "maxItems": 4,
      -                  "minItems": 2,
      -                  "type": "array"
      -                },
      -                "final_url": {
      -                  "description": "The landing page",
      -                  "maxLength": 2048,
      -                  "pattern": "^https?:\\/\\/",
      -                  "type": "string"
      -                },
      -                "headlines": {
      -                  "description": "3 to 15 headlines, each at most 30 characters",
      -                  "items": {
      -                    "maxLength": 30,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "maxItems": 15,
      -                  "minItems": 3,
      -                  "type": "array"
      -                },
      -                "path1": {
      -                  "description": "Display path part 1, at most 15 characters",
      -                  "maxLength": 15,
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "path2": {
      -                  "description": "Display path part 2, at most 15 characters",
      -                  "maxLength": 15,
      -                  "minLength": 1,
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "headlines",
      -                "descriptions",
      -                "final_url"
      -              ],
      -              "type": "object"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          },
      -          "default_max_cpc": {
      -            "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)",
      -            "exclusiveMinimum": 0,
      -            "maximum": 1000,
      -            "type": "number"
      -          },
      -          "keywords": {
      -            "items": {
      -              "properties": {
      -                "match_type": {
      -                  "description": "PHRASE matches searches containing the words in order; the usual choice",
      -                  "enum": [
      -                    "EXACT",
      -                    "PHRASE",
      -                    "BROAD"
      -                  ],
      -                  "type": "string"
      -                },
      -                "max_cpc": {
      -                  "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      -                  "exclusiveMinimum": 0,
      -                  "maximum": 1000,
      -                  "type": "number"
      -                },
      -                "text": {
      -                  "description": "The keyword, e.g. \"cleaning invoice template\"",
      -                  "maxLength": 80,
      -                  "minLength": 1,
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "text",
      -                "match_type"
      -              ],
      -              "type": "object"
      -            },
      -            "maxItems": 50,
      -            "minItems": 1,
      -            "type": "array"
      -          },
      -          "name": {
      -            "maxLength": 255,
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "name",
      -          "keywords",
      -          "ads"
      -        ],
      -        "type": "object"
      -      },
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "add_ad_group",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "ad_group"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add keywords to an existing ad group",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "keywords": {
      -        "items": {
      -          "properties": {
      -            "match_type": {
      -              "description": "PHRASE matches searches containing the words in order; the usual choice",
      -              "enum": [
      -                "EXACT",
      -                "PHRASE",
      -                "BROAD"
      -              ],
      -              "type": "string"
      -            },
      -            "max_cpc": {
      -              "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      -              "exclusiveMinimum": 0,
      -              "maximum": 1000,
      -              "type": "number"
      -            },
      -            "text": {
      -              "description": "The keyword, e.g. \"cleaning invoice template\"",
      -              "maxLength": 80,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "match_type"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "add_keywords",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "keywords"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add a responsive search ad to an existing ad group",
      -    "properties": {
      -      "ad": {
      -        "description": "A responsive search ad",
      -        "properties": {
      -          "descriptions": {
      -            "description": "2 to 4 descriptions, each at most 90 characters",
      -            "items": {
      -              "maxLength": 90,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "maxItems": 4,
      -            "minItems": 2,
      -            "type": "array"
      -          },
      -          "final_url": {
      -            "description": "The landing page",
      -            "maxLength": 2048,
      -            "pattern": "^https?:\\/\\/",
      -            "type": "string"
      -          },
      -          "headlines": {
      -            "description": "3 to 15 headlines, each at most 30 characters",
      -            "items": {
      -              "maxLength": 30,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "maxItems": 15,
      -            "minItems": 3,
      -            "type": "array"
      -          },
      -          "path1": {
      -            "description": "Display path part 1, at most 15 characters",
      -            "maxLength": 15,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "path2": {
      -            "description": "Display path part 2, at most 15 characters",
      -            "maxLength": 15,
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "headlines",
      -          "descriptions",
      -          "final_url"
      -        ],
      -        "type": "object"
      -      },
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "add_responsive_search_ad",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "ad"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add sitelinks to a campaign",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "sitelinks": {
      -        "items": {
      -          "properties": {
      -            "description1": {
      -              "description": "At most 35 characters; give both descriptions or neither",
      -              "maxLength": 35,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "description2": {
      -              "maxLength": 35,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "Link text, at most 25 characters",
      -              "maxLength": 25,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "url": {
      -              "maxLength": 2048,
      -              "pattern": "^https?:\\/\\/",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "url"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 8,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "add_sitelinks",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "sitelinks"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "category": {
      -        "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)",
      -        "pattern": "^[A-Z_]+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "set_conversion_goal",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "category"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Change one keyword's max CPC (manual CPC campaigns)",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "criterion_id": {
      -        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "max_cpc": {
      -        "anyOf": [
      -          {
      -            "exclusiveMinimum": 0,
      -            "maximum": 1000,
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid"
      -      },
      -      "type": {
      -        "const": "set_keyword_bid",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "criterion_id",
      -      "max_cpc"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Change an ad group's default max CPC, which its keywords use unless they have their own",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "max_cpc": {
      -        "description": "New default max cost per click for the ad group",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "set_ad_group_bid",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "max_cpc"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Pause one ad",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "ad_id": {
      -        "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pause_ad",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "ad_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Re-enable one paused ad",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "ad_id": {
      -        "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "enable_ad",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "ad_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add locations and/or languages a campaign targets",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [],
      -        "description": "Language ids to add, e.g. 1000 English",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [],
      -        "description": "Geo target ids to add, e.g. 2840 United States",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "add_campaign_targeting",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Stop targeting some of a campaign's locations and/or languages",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [],
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [],
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "remove_campaign_targeting",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "presence_only": {
      -        "description": "true: only people IN the locations; false: also people interested in them",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "const": "set_location_mode",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "presence_only"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Switch ONE campaign's bid strategy. A campaign on a shared (portfolio) strategy moves off it onto its own; the other campaigns on the shared strategy keep it. To change the shared strategy for every campaign on it, use set_shared_bid_strategy. If the user didn't say which they mean, ask. Google re-learns after a switch, so performance can wobble for a week or two",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "strategy": {
      -        "enum": [
      -          "MANUAL_CPC",
      -          "MAXIMIZE_CLICKS",
      -          "MAXIMIZE_CONVERSIONS"
      -        ],
      -        "type": "string"
      -      },
      -      "target_cpa": {
      -        "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "set_bidding_strategy",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "strategy"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Change a shared (portfolio) bid strategy's targets. This changes EVERY campaign on it, which the proposal lists. Its type can't be changed; to move one campaign to another strategy, use set_bidding_strategy",
      -    "properties": {
      -      "bidding_strategy_id": {
      -        "description": "Shared (portfolio) strategy id: bidding_strategy.id from run_gaql, or the id at the end of campaign.bidding_strategy",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "The most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "target_cpa": {
      -        "description": "Target cost per conversion (TARGET_CPA and MAXIMIZE_CONVERSIONS strategies)",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "target_roas": {
      -        "description": "Target return on ad spend as a ratio, e.g. 4 = 400% (TARGET_ROAS and MAXIMIZE_CONVERSION_VALUE)",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "set_shared_bid_strategy",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "bidding_strategy_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Create a shared (portfolio) bid strategy, optionally moving campaigns onto it. Undo moves those campaigns back and removes it",
      -    "properties": {
      -      "campaign_ids": {
      -        "default": [],
      -        "description": "Campaigns to move onto it in the same step (each leaves its current strategy)",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "The most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "name": {
      -        "description": "Name for the shared strategy; must not match an existing one",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "strategy": {
      -        "enum": [
      -          "MAXIMIZE_CLICKS",
      -          "MAXIMIZE_CONVERSIONS",
      -          "MAXIMIZE_CONVERSION_VALUE",
      -          "TARGET_CPA",
      -          "TARGET_ROAS"
      -        ],
      -        "type": "string"
      -      },
      -      "target_cpa": {
      -        "description": "Target cost per conversion: required for TARGET_CPA, optional for MAXIMIZE_CONVERSIONS",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "target_roas": {
      -        "description": "Target return on ad spend as a ratio, e.g. 4 = 400%: required for TARGET_ROAS, optional for MAXIMIZE_CONVERSION_VALUE",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "create_shared_bid_strategy",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "strategy"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "suffix": {
      -        "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it",
      -        "maxLength": 1000,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "set_url_suffix",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "suffix"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Declare whether a campaign contains EU political advertising. While any campaign lacks this declaration, Google refuses every change to the account (EU_POLITICAL_ADVERTISING_DECLARATION_REQUIRED); find those campaigns with campaign.missing_eu_political_advertising_declaration = TRUE. It is the advertiser's own legal statement: ask the user, never assume the answer",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "contains_eu_political_advertising": {
      -        "description": "The user's answer: true only if the campaign carries political ads under EU rules (about an election, a referendum, or a law or regulation, shown in the EU)",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "const": "set_eu_political_advertising",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "contains_eu_political_advertising"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Create a conversion action to measure sign-ups, leads or purchases",
      -    "properties": {
      -      "category": {
      -        "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)",
      -        "pattern": "^[A-Z_]+$",
      -        "type": "string"
      -      },
      -      "counting": {
      -        "default": "ONE_PER_CLICK",
      -        "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases",
      -        "enum": [
      -          "ONE_PER_CLICK",
      -          "MANY_PER_CLICK"
      -        ],
      -        "type": "string"
      -      },
      -      "default_value": {
      -        "description": "Value per conversion when none is sent",
      -        "maximum": 1000000,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "name": {
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "primary": {
      -        "default": true,
      -        "description": "Primary actions count in Conversions and can steer bidding",
      -        "type": "boolean"
      -      },
      -      "source": {
      -        "default": "UPLOAD_CLICKS",
      -        "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page",
      -        "enum": [
      -          "UPLOAD_CLICKS",
      -          "WEBPAGE"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "create_conversion_action",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "category"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Set how many conversions one ad click can produce for a conversion action",
      -    "properties": {
      -      "conversion_action_id": {
      -        "description": "conversion_action.id from run_gaql",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "counting": {
      -        "enum": [
      -          "ONE_PER_CLICK",
      -          "MANY_PER_CLICK"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "set_conversion_counting",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "conversion_action_id",
      -      "counting"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Import a GA4 key event into Google Ads as a conversion action, so campaigns can count and bid on it. The GA4 property must be linked to this account",
      -    "properties": {
      -      "event_name": {
      -        "description": "The GA4 key event, e.g. generate_lead, purchase, sign_up",
      -        "pattern": "^[A-Za-z][A-Za-z0-9_]{0,39}$",
      -        "type": "string"
      -      },
      -      "primary": {
      -        "default": true,
      -        "description": "Primary actions count in Conversions and can steer bidding",
      -        "type": "boolean"
      -      },
      -      "property_id": {
      -        "description": "GA4 property id (from analytics_properties)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "import_ga4_key_event",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "property_id",
      -      "event_name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "description": "Block searches containing these words in one campaign",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "keywords": {
      +        "items": {
      +          "properties": {
      +            "match_type": {
      +              "description": "PHRASE blocks any search containing the words in order; the usual choice",
      +              "enum": [
      +                "EXACT",
      +                "PHRASE",
      +                "BROAD"
      +              ],
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "The search words to block, e.g. \"free\"",
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "match_type"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "add_negative_keywords",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "keywords"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Pause one keyword",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "criterion_id": {
      +        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pause_keyword",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "criterion_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Re-enable one paused keyword",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "criterion_id": {
      +        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "enable_keyword",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "criterion_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Pause a whole campaign (stops all its spend)",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pause_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Turn a paused campaign back on. It starts spending again; the summary says how much",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "enable_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Pause one ad group",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pause_ad_group",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Re-enable one paused ad group",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "enable_ad_group",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Change a campaign's daily budget (not shared budgets)",
      +    "properties": {
      +      "amount": {
      +        "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "set_daily_budget",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "amount"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Set the last day a campaign runs, so it stops spending on its own",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "end_date": {
      +        "anyOf": [
      +          {
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "const": "none",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date"
      +      },
      +      "type": {
      +        "const": "set_end_date",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "end_date"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign",
      +    "properties": {
      +      "ad_groups": {
      +        "items": {
      +          "properties": {
      +            "ads": {
      +              "items": {
      +                "description": "A responsive search ad",
      +                "properties": {
      +                  "descriptions": {
      +                    "description": "2 to 4 descriptions, each at most 90 characters",
      +                    "items": {
      +                      "maxLength": 90,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 4,
      +                    "minItems": 2,
      +                    "type": "array"
      +                  },
      +                  "final_url": {
      +                    "description": "The landing page",
      +                    "maxLength": 2048,
      +                    "pattern": "^https?:\\/\\/",
      +                    "type": "string"
      +                  },
      +                  "headlines": {
      +                    "description": "3 to 15 headlines, each at most 30 characters",
      +                    "items": {
      +                      "maxLength": 30,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 15,
      +                    "minItems": 3,
      +                    "type": "array"
      +                  },
      +                  "path1": {
      +                    "description": "Display path part 1, at most 15 characters",
      +                    "maxLength": 15,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "path2": {
      +                    "description": "Display path part 2, at most 15 characters",
      +                    "maxLength": 15,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "headlines",
      +                  "descriptions",
      +                  "final_url"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 3,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "default_max_cpc": {
      +              "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)",
      +              "exclusiveMinimum": 0,
      +              "maximum": 1000,
      +              "type": "number"
      +            },
      +            "keywords": {
      +              "items": {
      +                "properties": {
      +                  "match_type": {
      +                    "description": "PHRASE matches searches containing the words in order; the usual choice",
      +                    "enum": [
      +                      "EXACT",
      +                      "PHRASE",
      +                      "BROAD"
      +                    ],
      +                    "type": "string"
      +                  },
      +                  "max_cpc": {
      +                    "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      +                    "exclusiveMinimum": 0,
      +                    "maximum": 1000,
      +                    "type": "number"
      +                  },
      +                  "text": {
      +                    "description": "The keyword, e.g. \"cleaning invoice template\"",
      +                    "maxLength": 80,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "text",
      +                  "match_type"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 50,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "name": {
      +              "maxLength": 255,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "keywords",
      +            "ads"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 10,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "bidding": {
      +        "default": "MANUAL_CPC",
      +        "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget",
      +        "enum": [
      +          "MANUAL_CPC",
      +          "MAXIMIZE_CLICKS",
      +          "MAXIMIZE_CONVERSIONS"
      +        ],
      +        "type": "string"
      +      },
      +      "daily_budget": {
      +        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "end_date": {
      +        "description": "Last day the campaign runs, YYYY-MM-DD",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [
      +          "1000"
      +        ],
      +        "description": "Google language ids, e.g. 1000 English, 1003 Spanish",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [
      +          "2840"
      +        ],
      +        "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "name": {
      +        "description": "Campaign name; must not match an existing campaign",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "negative_keywords": {
      +        "default": [],
      +        "description": "Searches to block across the campaign",
      +        "items": {
      +          "properties": {
      +            "match_type": {
      +              "enum": [
      +                "EXACT",
      +                "PHRASE",
      +                "BROAD"
      +              ],
      +              "type": "string"
      +            },
      +            "text": {
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "match_type"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 200,
      +        "type": "array"
      +      },
      +      "presence_only": {
      +        "default": true,
      +        "description": "Show ads only to people IN the locations (true), not merely interested in them",
      +        "type": "boolean"
      +      },
      +      "search_partners": {
      +        "default": false,
      +        "description": "Also show on Google's search partner sites",
      +        "type": "boolean"
      +      },
      +      "sitelinks": {
      +        "default": [],
      +        "items": {
      +          "properties": {
      +            "description1": {
      +              "description": "At most 35 characters; give both descriptions or neither",
      +              "maxLength": 35,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "description2": {
      +              "maxLength": 35,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "Link text, at most 25 characters",
      +              "maxLength": 25,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "url": {
      +              "maxLength": 2048,
      +              "pattern": "^https?:\\/\\/",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "url"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 8,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "create_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "daily_budget",
      +      "ad_groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Build a new Display campaign (image ads across Google's Display Network of sites and apps) with ad groups and responsive display ads. Google's optimized targeting finds the audience. It is created PAUSED: nothing spends until a separate enable_campaign",
      +    "properties": {
      +      "ad_groups": {
      +        "items": {
      +          "properties": {
      +            "ads": {
      +              "items": {
      +                "description": "A responsive display ad: Google assembles ads from these headlines, descriptions and images",
      +                "properties": {
      +                  "business_name": {
      +                    "description": "The advertiser's name, at most 25 characters",
      +                    "maxLength": 25,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "descriptions": {
      +                    "description": "1 to 5 descriptions, each at most 90 characters",
      +                    "items": {
      +                      "maxLength": 90,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "final_url": {
      +                    "description": "The landing page",
      +                    "maxLength": 2048,
      +                    "pattern": "^https?:\\/\\/",
      +                    "type": "string"
      +                  },
      +                  "headlines": {
      +                    "description": "1 to 5 short headlines, each at most 30 characters",
      +                    "items": {
      +                      "maxLength": 30,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "logo_images": {
      +                    "default": [],
      +                    "description": "0 to 5 landscape logos, 4:1 (e.g. 1200×300, at least 512×128)",
      +                    "items": {
      +                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                      "maxLength": 2048,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 0,
      +                    "type": "array"
      +                  },
      +                  "long_headline": {
      +                    "description": "One long headline, at most 90 characters",
      +                    "maxLength": 90,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "marketing_images": {
      +                    "description": "1 to 15 landscape images, 1.91:1 (e.g. 1200×628, at least 600×314)",
      +                    "items": {
      +                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                      "maxLength": 2048,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 15,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "square_logo_images": {
      +                    "default": [],
      +                    "description": "0 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128)",
      +                    "items": {
      +                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                      "maxLength": 2048,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 0,
      +                    "type": "array"
      +                  },
      +                  "square_marketing_images": {
      +                    "description": "1 to 15 square images, 1:1 (e.g. 1200×1200, at least 300×300)",
      +                    "items": {
      +                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                      "maxLength": 2048,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 15,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  }
      +                },
      +                "required": [
      +                  "headlines",
      +                  "long_headline",
      +                  "descriptions",
      +                  "business_name",
      +                  "final_url",
      +                  "marketing_images",
      +                  "square_marketing_images"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 3,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "default_max_cpc": {
      +              "description": "Default max cost per click (required when the campaign uses manual CPC)",
      +              "exclusiveMinimum": 0,
      +              "maximum": 1000,
      +              "type": "number"
      +            },
      +            "name": {
      +              "maxLength": 255,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "ads"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 5,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "bidding": {
      +        "default": "MAXIMIZE_CLICKS",
      +        "description": "MANUAL_CPC uses the ad groups' max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget",
      +        "enum": [
      +          "MANUAL_CPC",
      +          "MAXIMIZE_CLICKS",
      +          "MAXIMIZE_CONVERSIONS"
      +        ],
      +        "type": "string"
      +      },
      +      "daily_budget": {
      +        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "end_date": {
      +        "description": "Last day the campaign runs, YYYY-MM-DD",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [
      +          "1000"
      +        ],
      +        "description": "Google language ids, e.g. 1000 English",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [
      +          "2840"
      +        ],
      +        "description": "Google geo target ids, e.g. 2840 United States",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "name": {
      +        "description": "Campaign name; must not match an existing campaign",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "presence_only": {
      +        "default": true,
      +        "description": "Show ads only to people IN the locations (true), not merely interested in them",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "create_display_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "daily_budget",
      +      "ad_groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Build a new Demand Gen campaign with YouTube video ads, which is how to advertise on YouTube through the API (Google doesn't allow creating Video campaigns there). It is created PAUSED: nothing spends until a separate enable_campaign",
      +    "properties": {
      +      "ad_groups": {
      +        "items": {
      +          "properties": {
      +            "ads": {
      +              "items": {
      +                "description": "A Demand Gen video ad: runs on YouTube (in-stream, in-feed and Shorts), Discover and Gmail",
      +                "properties": {
      +                  "business_name": {
      +                    "description": "The advertiser's name, at most 25 characters",
      +                    "maxLength": 25,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "descriptions": {
      +                    "description": "1 to 5 descriptions, each at most 90 characters",
      +                    "items": {
      +                      "maxLength": 90,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "final_url": {
      +                    "description": "The landing page",
      +                    "maxLength": 2048,
      +                    "pattern": "^https?:\\/\\/",
      +                    "type": "string"
      +                  },
      +                  "headlines": {
      +                    "description": "1 to 5 headlines, each at most 40 characters",
      +                    "items": {
      +                      "maxLength": 40,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "logo_image": {
      +                    "description": "A square 1:1 logo (e.g. 1200×1200, at least 128×128): an https URL, or an image asset id from the account",
      +                    "maxLength": 2048,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "long_headlines": {
      +                    "description": "1 to 5 long headlines, each at most 90 characters",
      +                    "items": {
      +                      "maxLength": 90,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "videos": {
      +                    "description": "1 to 5 YouTube videos",
      +                    "items": {
      +                      "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted",
      +                      "maxLength": 200,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  }
      +                },
      +                "required": [
      +                  "videos",
      +                  "headlines",
      +                  "long_headlines",
      +                  "descriptions",
      +                  "business_name",
      +                  "logo_image",
      +                  "final_url"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 3,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "language_ids": {
      +              "default": [
      +                "1000"
      +              ],
      +              "description": "Google language ids, e.g. 1000 English",
      +              "items": {
      +                "pattern": "^\\d+$",
      +                "type": "string"
      +              },
      +              "maxItems": 20,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "location_ids": {
      +              "default": [
      +                "2840"
      +              ],
      +              "description": "Google geo target ids, e.g. 2840 United States (Demand Gen targets locations per ad group, not per campaign)",
      +              "items": {
      +                "pattern": "^\\d+$",
      +                "type": "string"
      +              },
      +              "maxItems": 50,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "name": {
      +              "maxLength": 255,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "ads"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 5,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "bidding": {
      +        "default": "MAXIMIZE_CONVERSIONS",
      +        "description": "Demand Gen bids automatically: MAXIMIZE_CONVERSIONS (needs conversion tracking) or MAXIMIZE_CLICKS",
      +        "enum": [
      +          "MAXIMIZE_CONVERSIONS",
      +          "MAXIMIZE_CLICKS"
      +        ],
      +        "type": "string"
      +      },
      +      "daily_budget": {
      +        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "end_date": {
      +        "description": "Last day the campaign runs, YYYY-MM-DD",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Campaign name; must not match an existing campaign",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "create_demand_gen_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "daily_budget",
      +      "ad_groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Build a new Performance Max campaign: one budget, Google places ads across Search, YouTube, Display, Discover, Gmail and Maps from the asset groups' text, images and videos. No shopping feed (non-retail). It is created PAUSED: nothing spends until a separate enable_campaign",
      +    "properties": {
      +      "asset_groups": {
      +        "items": {
      +          "description": "An asset group: the headlines, descriptions, images and videos Google combines into ads on every channel",
      +          "properties": {
      +            "descriptions": {
      +              "description": "2 to 5 descriptions, each at most 90 characters; Google recommends one of 60 or fewer",
      +              "items": {
      +                "maxLength": 90,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 5,
      +              "minItems": 2,
      +              "type": "array"
      +            },
      +            "final_url": {
      +              "description": "The landing page (Google may also send people to other pages on the same site)",
      +              "maxLength": 2048,
      +              "pattern": "^https?:\\/\\/",
      +              "type": "string"
      +            },
      +            "headlines": {
      +              "description": "3 to 15 headlines, each at most 30 characters",
      +              "items": {
      +                "maxLength": 30,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 15,
      +              "minItems": 3,
      +              "type": "array"
      +            },
      +            "long_headlines": {
      +              "description": "1 to 5 long headlines, each at most 90 characters",
      +              "items": {
      +                "maxLength": 90,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 5,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "marketing_images": {
      +              "description": "1 to 20 landscape images, 1.91:1 (e.g. 1200×628)",
      +              "items": {
      +                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                "maxLength": 2048,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 20,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "name": {
      +              "maxLength": 255,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "portrait_marketing_images": {
      +              "default": [],
      +              "description": "0 to 20 portrait images, 4:5 (e.g. 960×1200)",
      +              "items": {
      +                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                "maxLength": 2048,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 20,
      +              "minItems": 0,
      +              "type": "array"
      +            },
      +            "square_marketing_images": {
      +              "description": "1 to 20 square images, 1:1 (e.g. 1200×1200)",
      +              "items": {
      +                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                "maxLength": 2048,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 20,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "videos": {
      +              "default": [],
      +              "description": "0 to 5 YouTube videos; without one, Google may auto-generate a video from the images",
      +              "items": {
      +                "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted",
      +                "maxLength": 200,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 5,
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "final_url",
      +            "headlines",
      +            "long_headlines",
      +            "descriptions",
      +            "marketing_images",
      +            "square_marketing_images"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 5,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "bidding": {
      +        "default": "MAXIMIZE_CONVERSIONS",
      +        "description": "Performance Max bids for conversions only: MAXIMIZE_CONVERSIONS, or MAXIMIZE_CONVERSION_VALUE when conversions carry values",
      +        "enum": [
      +          "MAXIMIZE_CONVERSIONS",
      +          "MAXIMIZE_CONVERSION_VALUE"
      +        ],
      +        "type": "string"
      +      },
      +      "business_name": {
      +        "description": "The advertiser's name, at most 25 characters (linked to the campaign, per Google's brand guidelines)",
      +        "maxLength": 25,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "daily_budget": {
      +        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "end_date": {
      +        "description": "Last day the campaign runs, YYYY-MM-DD",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [
      +          "1000"
      +        ],
      +        "description": "Google language ids, e.g. 1000 English",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [
      +          "2840"
      +        ],
      +        "description": "Google geo target ids, e.g. 2840 United States",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "logo_images": {
      +        "description": "1 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128), linked to the campaign",
      +        "items": {
      +          "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +          "maxLength": 2048,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 5,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "name": {
      +        "description": "Campaign name; must not match an existing campaign",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "target_cpa": {
      +        "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "create_performance_max_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "daily_budget",
      +      "business_name",
      +      "logo_images",
      +      "asset_groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add an ad group, with its keywords and ads, to an existing Search campaign",
      +    "properties": {
      +      "ad_group": {
      +        "properties": {
      +          "ads": {
      +            "items": {
      +              "description": "A responsive search ad",
      +              "properties": {
      +                "descriptions": {
      +                  "description": "2 to 4 descriptions, each at most 90 characters",
      +                  "items": {
      +                    "maxLength": 90,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "maxItems": 4,
      +                  "minItems": 2,
      +                  "type": "array"
      +                },
      +                "final_url": {
      +                  "description": "The landing page",
      +                  "maxLength": 2048,
      +                  "pattern": "^https?:\\/\\/",
      +                  "type": "string"
      +                },
      +                "headlines": {
      +                  "description": "3 to 15 headlines, each at most 30 characters",
      +                  "items": {
      +                    "maxLength": 30,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "maxItems": 15,
      +                  "minItems": 3,
      +                  "type": "array"
      +                },
      +                "path1": {
      +                  "description": "Display path part 1, at most 15 characters",
      +                  "maxLength": 15,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "path2": {
      +                  "description": "Display path part 2, at most 15 characters",
      +                  "maxLength": 15,
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "headlines",
      +                "descriptions",
      +                "final_url"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "default_max_cpc": {
      +            "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)",
      +            "exclusiveMinimum": 0,
      +            "maximum": 1000,
      +            "type": "number"
      +          },
      +          "keywords": {
      +            "items": {
      +              "properties": {
      +                "match_type": {
      +                  "description": "PHRASE matches searches containing the words in order; the usual choice",
      +                  "enum": [
      +                    "EXACT",
      +                    "PHRASE",
      +                    "BROAD"
      +                  ],
      +                  "type": "string"
      +                },
      +                "max_cpc": {
      +                  "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      +                  "exclusiveMinimum": 0,
      +                  "maximum": 1000,
      +                  "type": "number"
      +                },
      +                "text": {
      +                  "description": "The keyword, e.g. \"cleaning invoice template\"",
      +                  "maxLength": 80,
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "text",
      +                "match_type"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 50,
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "name": {
      +            "maxLength": 255,
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "keywords",
      +          "ads"
      +        ],
      +        "type": "object"
      +      },
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "add_ad_group",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "ad_group"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add keywords to an existing ad group",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "keywords": {
      +        "items": {
      +          "properties": {
      +            "match_type": {
      +              "description": "PHRASE matches searches containing the words in order; the usual choice",
      +              "enum": [
      +                "EXACT",
      +                "PHRASE",
      +                "BROAD"
      +              ],
      +              "type": "string"
      +            },
      +            "max_cpc": {
      +              "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      +              "exclusiveMinimum": 0,
      +              "maximum": 1000,
      +              "type": "number"
      +            },
      +            "text": {
      +              "description": "The keyword, e.g. \"cleaning invoice template\"",
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "match_type"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "add_keywords",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "keywords"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add a responsive search ad to an existing ad group",
      +    "properties": {
      +      "ad": {
      +        "description": "A responsive search ad",
      +        "properties": {
      +          "descriptions": {
      +            "description": "2 to 4 descriptions, each at most 90 characters",
      +            "items": {
      +              "maxLength": 90,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "maxItems": 4,
      +            "minItems": 2,
      +            "type": "array"
      +          },
      +          "final_url": {
      +            "description": "The landing page",
      +            "maxLength": 2048,
      +            "pattern": "^https?:\\/\\/",
      +            "type": "string"
      +          },
      +          "headlines": {
      +            "description": "3 to 15 headlines, each at most 30 characters",
      +            "items": {
      +              "maxLength": 30,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "maxItems": 15,
      +            "minItems": 3,
      +            "type": "array"
      +          },
      +          "path1": {
      +            "description": "Display path part 1, at most 15 characters",
      +            "maxLength": 15,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "path2": {
      +            "description": "Display path part 2, at most 15 characters",
      +            "maxLength": 15,
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "headlines",
      +          "descriptions",
      +          "final_url"
      +        ],
      +        "type": "object"
      +      },
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "add_responsive_search_ad",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "ad"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add sitelinks to a campaign",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "sitelinks": {
      +        "items": {
      +          "properties": {
      +            "description1": {
      +              "description": "At most 35 characters; give both descriptions or neither",
      +              "maxLength": 35,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "description2": {
      +              "maxLength": 35,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "Link text, at most 25 characters",
      +              "maxLength": 25,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "url": {
      +              "maxLength": 2048,
      +              "pattern": "^https?:\\/\\/",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "url"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 8,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "add_sitelinks",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "sitelinks"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "category": {
      +        "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)",
      +        "pattern": "^[A-Z_]+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "set_conversion_goal",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "category"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Change one keyword's max CPC (manual CPC campaigns)",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "criterion_id": {
      +        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "max_cpc": {
      +        "anyOf": [
      +          {
      +            "exclusiveMinimum": 0,
      +            "maximum": 1000,
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid"
      +      },
      +      "type": {
      +        "const": "set_keyword_bid",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "criterion_id",
      +      "max_cpc"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Change an ad group's default max CPC, which its keywords use unless they have their own",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "max_cpc": {
      +        "description": "New default max cost per click for the ad group",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "set_ad_group_bid",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "max_cpc"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Pause one ad",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "ad_id": {
      +        "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pause_ad",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "ad_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Re-enable one paused ad",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "ad_id": {
      +        "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "enable_ad",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "ad_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add locations and/or languages a campaign targets",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [],
      +        "description": "Language ids to add, e.g. 1000 English",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [],
      +        "description": "Geo target ids to add, e.g. 2840 United States",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "add_campaign_targeting",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Stop targeting some of a campaign's locations and/or languages",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [],
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [],
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "remove_campaign_targeting",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "presence_only": {
      +        "description": "true: only people IN the locations; false: also people interested in them",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "set_location_mode",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "presence_only"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Switch ONE campaign's bid strategy. A campaign on a shared (portfolio) strategy moves off it onto its own; the other campaigns on the shared strategy keep it. To change the shared strategy for every campaign on it, use set_shared_bid_strategy. If the user didn't say which they mean, ask. Google re-learns after a switch, so performance can wobble for a week or two",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "strategy": {
      +        "enum": [
      +          "MANUAL_CPC",
      +          "MAXIMIZE_CLICKS",
      +          "MAXIMIZE_CONVERSIONS"
      +        ],
      +        "type": "string"
      +      },
      +      "target_cpa": {
      +        "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "set_bidding_strategy",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "strategy"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Change a shared (portfolio) bid strategy's targets. This changes EVERY campaign on it, which the proposal lists. Its type can't be changed; to move one campaign to another strategy, use set_bidding_strategy",
      +    "properties": {
      +      "bidding_strategy_id": {
      +        "description": "Shared (portfolio) strategy id: bidding_strategy.id from run_gaql, or the id at the end of campaign.bidding_strategy",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "The most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "target_cpa": {
      +        "description": "Target cost per conversion (TARGET_CPA and MAXIMIZE_CONVERSIONS strategies)",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "target_roas": {
      +        "description": "Target return on ad spend as a ratio, e.g. 4 = 400% (TARGET_ROAS and MAXIMIZE_CONVERSION_VALUE)",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "set_shared_bid_strategy",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "bidding_strategy_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Create a shared (portfolio) bid strategy, optionally moving campaigns onto it. Undo moves those campaigns back and removes it",
      +    "properties": {
      +      "campaign_ids": {
      +        "default": [],
      +        "description": "Campaigns to move onto it in the same step (each leaves its current strategy)",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "The most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "name": {
      +        "description": "Name for the shared strategy; must not match an existing one",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "strategy": {
      +        "enum": [
      +          "MAXIMIZE_CLICKS",
      +          "MAXIMIZE_CONVERSIONS",
      +          "MAXIMIZE_CONVERSION_VALUE",
      +          "TARGET_CPA",
      +          "TARGET_ROAS"
      +        ],
      +        "type": "string"
      +      },
      +      "target_cpa": {
      +        "description": "Target cost per conversion: required for TARGET_CPA, optional for MAXIMIZE_CONVERSIONS",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "target_roas": {
      +        "description": "Target return on ad spend as a ratio, e.g. 4 = 400%: required for TARGET_ROAS, optional for MAXIMIZE_CONVERSION_VALUE",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "create_shared_bid_strategy",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "strategy"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "suffix": {
      +        "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it",
      +        "maxLength": 1000,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "set_url_suffix",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "suffix"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Declare whether a campaign contains EU political advertising. While any campaign lacks this declaration, Google refuses every change to the account (EU_POLITICAL_ADVERTISING_DECLARATION_REQUIRED); find those campaigns with campaign.missing_eu_political_advertising_declaration = TRUE. It is the advertiser's own legal statement: ask the user, never assume the answer",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "contains_eu_political_advertising": {
      +        "description": "The user's answer: true only if the campaign carries political ads under EU rules (about an election, a referendum, or a law or regulation, shown in the EU)",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "set_eu_political_advertising",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "contains_eu_political_advertising"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Create a conversion action to measure sign-ups, leads or purchases",
      +    "properties": {
      +      "call_min_seconds": {
      +        "description": "AD_CALL and WEBSITE_CALL only: how long a call must last to count (default 60)",
      +        "maximum": 10000,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "category": {
      +        "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)",
      +        "pattern": "^[A-Z_]+$",
      +        "type": "string"
      +      },
      +      "counting": {
      +        "default": "ONE_PER_CLICK",
      +        "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases",
      +        "enum": [
      +          "ONE_PER_CLICK",
      +          "MANY_PER_CLICK"
      +        ],
      +        "type": "string"
      +      },
      +      "default_value": {
      +        "description": "Value per conversion when none is sent",
      +        "maximum": 1000000,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "name": {
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "primary": {
      +        "default": true,
      +        "description": "Primary actions count in Conversions and can steer bidding",
      +        "type": "boolean"
      +      },
      +      "source": {
      +        "default": "UPLOAD_CLICKS",
      +        "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page. AD_CALL: calls from the phone number in ads (call assets). WEBSITE_CALL: calls to a Google forwarding number on the site (needs Google's tag)",
      +        "enum": [
      +          "UPLOAD_CLICKS",
      +          "WEBPAGE",
      +          "AD_CALL",
      +          "WEBSITE_CALL"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "create_conversion_action",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "category"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Set how many conversions one ad click can produce for a conversion action",
      +    "properties": {
      +      "conversion_action_id": {
      +        "description": "conversion_action.id from run_gaql",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "counting": {
      +        "enum": [
      +          "ONE_PER_CLICK",
      +          "MANY_PER_CLICK"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "set_conversion_counting",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "conversion_action_id",
      +      "counting"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Import a GA4 key event into Google Ads as a conversion action, so campaigns can count and bid on it. The GA4 property must be linked to this account",
      +    "properties": {
      +      "event_name": {
      +        "description": "The GA4 key event, e.g. generate_lead, purchase, sign_up",
      +        "pattern": "^[A-Za-z][A-Za-z0-9_]{0,39}$",
      +        "type": "string"
      +      },
      +      "primary": {
      +        "default": true,
      +        "description": "Primary actions count in Conversions and can steer bidding",
      +        "type": "boolean"
      +      },
      +      "property_id": {
      +        "description": "GA4 property id (from analytics_properties)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "import_ga4_key_event",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "property_id",
      +      "event_name"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Remove a conversion action. Permanent unless a GA4 import: say so before they approve",
      +    "properties": {
      +      "conversion_action_id": {
      +        "description": "conversion_action.id from run_gaql",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "remove_conversion_action",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "conversion_action_id"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changedv0.18.0
    • changedInput schema / properties / changes / items / oneOf
      Previous value: -[
      -  {
      -    "description": "Block searches containing these words in one campaign",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "keywords": {
      -        "items": {
      -          "properties": {
      -            "match_type": {
      -              "description": "PHRASE blocks any search containing the words in order; the usual choice",
      -              "enum": [
      -                "EXACT",
      -                "PHRASE",
      -                "BROAD"
      -              ],
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "The search words to block, e.g. \"free\"",
      -              "maxLength": 80,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "match_type"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "add_negative_keywords",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "keywords"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Pause one keyword",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "criterion_id": {
      -        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pause_keyword",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "criterion_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Re-enable one paused keyword",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "criterion_id": {
      -        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "enable_keyword",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "criterion_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Pause a whole campaign (stops all its spend)",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pause_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Turn a paused campaign back on. It starts spending again; the summary says how much",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "enable_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Pause one ad group",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pause_ad_group",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Re-enable one paused ad group",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "enable_ad_group",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Change a campaign's daily budget (not shared budgets)",
      -    "properties": {
      -      "amount": {
      -        "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "set_daily_budget",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "amount"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Set the last day a campaign runs, so it stops spending on its own",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "end_date": {
      -        "anyOf": [
      -          {
      -            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -            "type": "string"
      -          },
      -          {
      -            "const": "none",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date"
      -      },
      -      "type": {
      -        "const": "set_end_date",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "end_date"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign",
      -    "properties": {
      -      "ad_groups": {
      -        "items": {
      -          "properties": {
      -            "ads": {
      -              "items": {
      -                "description": "A responsive search ad",
      -                "properties": {
      -                  "descriptions": {
      -                    "description": "2 to 4 descriptions, each at most 90 characters",
      -                    "items": {
      -                      "maxLength": 90,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 4,
      -                    "minItems": 2,
      -                    "type": "array"
      -                  },
      -                  "final_url": {
      -                    "description": "The landing page",
      -                    "maxLength": 2048,
      -                    "pattern": "^https?:\\/\\/",
      -                    "type": "string"
      -                  },
      -                  "headlines": {
      -                    "description": "3 to 15 headlines, each at most 30 characters",
      -                    "items": {
      -                      "maxLength": 30,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 15,
      -                    "minItems": 3,
      -                    "type": "array"
      -                  },
      -                  "path1": {
      -                    "description": "Display path part 1, at most 15 characters",
      -                    "maxLength": 15,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "path2": {
      -                    "description": "Display path part 2, at most 15 characters",
      -                    "maxLength": 15,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "headlines",
      -                  "descriptions",
      -                  "final_url"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 3,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "default_max_cpc": {
      -              "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)",
      -              "exclusiveMinimum": 0,
      -              "maximum": 1000,
      -              "type": "number"
      -            },
      -            "keywords": {
      -              "items": {
      -                "properties": {
      -                  "match_type": {
      -                    "description": "PHRASE matches searches containing the words in order; the usual choice",
      -                    "enum": [
      -                      "EXACT",
      -                      "PHRASE",
      -                      "BROAD"
      -                    ],
      -                    "type": "string"
      -                  },
      -                  "max_cpc": {
      -                    "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      -                    "exclusiveMinimum": 0,
      -                    "maximum": 1000,
      -                    "type": "number"
      -                  },
      -                  "text": {
      -                    "description": "The keyword, e.g. \"cleaning invoice template\"",
      -                    "maxLength": 80,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "text",
      -                  "match_type"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 50,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "name": {
      -              "maxLength": 255,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "keywords",
      -            "ads"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 10,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "bidding": {
      -        "default": "MANUAL_CPC",
      -        "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget",
      -        "enum": [
      -          "MANUAL_CPC",
      -          "MAXIMIZE_CLICKS",
      -          "MAXIMIZE_CONVERSIONS"
      -        ],
      -        "type": "string"
      -      },
      -      "daily_budget": {
      -        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "end_date": {
      -        "description": "Last day the campaign runs, YYYY-MM-DD",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [
      -          "1000"
      -        ],
      -        "description": "Google language ids, e.g. 1000 English, 1003 Spanish",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [
      -          "2840"
      -        ],
      -        "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "name": {
      -        "description": "Campaign name; must not match an existing campaign",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "negative_keywords": {
      -        "default": [],
      -        "description": "Searches to block across the campaign",
      -        "items": {
      -          "properties": {
      -            "match_type": {
      -              "enum": [
      -                "EXACT",
      -                "PHRASE",
      -                "BROAD"
      -              ],
      -              "type": "string"
      -            },
      -            "text": {
      -              "maxLength": 80,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "match_type"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 200,
      -        "type": "array"
      -      },
      -      "presence_only": {
      -        "default": true,
      -        "description": "Show ads only to people IN the locations (true), not merely interested in them",
      -        "type": "boolean"
      -      },
      -      "search_partners": {
      -        "default": false,
      -        "description": "Also show on Google's search partner sites",
      -        "type": "boolean"
      -      },
      -      "sitelinks": {
      -        "default": [],
      -        "items": {
      -          "properties": {
      -            "description1": {
      -              "description": "At most 35 characters; give both descriptions or neither",
      -              "maxLength": 35,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "description2": {
      -              "maxLength": 35,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "Link text, at most 25 characters",
      -              "maxLength": 25,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "url": {
      -              "maxLength": 2048,
      -              "pattern": "^https?:\\/\\/",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "url"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 8,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "create_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "daily_budget",
      -      "ad_groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Build a new Display campaign (image ads across Google's Display Network of sites and apps) with ad groups and responsive display ads. Google's optimized targeting finds the audience. It is created PAUSED: nothing spends until a separate enable_campaign",
      -    "properties": {
      -      "ad_groups": {
      -        "items": {
      -          "properties": {
      -            "ads": {
      -              "items": {
      -                "description": "A responsive display ad: Google assembles ads from these headlines, descriptions and images",
      -                "properties": {
      -                  "business_name": {
      -                    "description": "The advertiser's name, at most 25 characters",
      -                    "maxLength": 25,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "descriptions": {
      -                    "description": "1 to 5 descriptions, each at most 90 characters",
      -                    "items": {
      -                      "maxLength": 90,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "final_url": {
      -                    "description": "The landing page",
      -                    "maxLength": 2048,
      -                    "pattern": "^https?:\\/\\/",
      -                    "type": "string"
      -                  },
      -                  "headlines": {
      -                    "description": "1 to 5 short headlines, each at most 30 characters",
      -                    "items": {
      -                      "maxLength": 30,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "logo_images": {
      -                    "default": [],
      -                    "description": "0 to 5 landscape logos, 4:1 (e.g. 1200×300, at least 512×128)",
      -                    "items": {
      -                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                      "maxLength": 2048,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 0,
      -                    "type": "array"
      -                  },
      -                  "long_headline": {
      -                    "description": "One long headline, at most 90 characters",
      -                    "maxLength": 90,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "marketing_images": {
      -                    "description": "1 to 15 landscape images, 1.91:1 (e.g. 1200×628, at least 600×314)",
      -                    "items": {
      -                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                      "maxLength": 2048,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 15,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "square_logo_images": {
      -                    "default": [],
      -                    "description": "0 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128)",
      -                    "items": {
      -                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                      "maxLength": 2048,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 0,
      -                    "type": "array"
      -                  },
      -                  "square_marketing_images": {
      -                    "description": "1 to 15 square images, 1:1 (e.g. 1200×1200, at least 300×300)",
      -                    "items": {
      -                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                      "maxLength": 2048,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 15,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  }
      -                },
      -                "required": [
      -                  "headlines",
      -                  "long_headline",
      -                  "descriptions",
      -                  "business_name",
      -                  "final_url",
      -                  "marketing_images",
      -                  "square_marketing_images"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 3,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "default_max_cpc": {
      -              "description": "Default max cost per click (required when the campaign uses manual CPC)",
      -              "exclusiveMinimum": 0,
      -              "maximum": 1000,
      -              "type": "number"
      -            },
      -            "name": {
      -              "maxLength": 255,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "ads"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 5,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "bidding": {
      -        "default": "MAXIMIZE_CLICKS",
      -        "description": "MANUAL_CPC uses the ad groups' max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget",
      -        "enum": [
      -          "MANUAL_CPC",
      -          "MAXIMIZE_CLICKS",
      -          "MAXIMIZE_CONVERSIONS"
      -        ],
      -        "type": "string"
      -      },
      -      "daily_budget": {
      -        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "end_date": {
      -        "description": "Last day the campaign runs, YYYY-MM-DD",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [
      -          "1000"
      -        ],
      -        "description": "Google language ids, e.g. 1000 English",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [
      -          "2840"
      -        ],
      -        "description": "Google geo target ids, e.g. 2840 United States",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "name": {
      -        "description": "Campaign name; must not match an existing campaign",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "presence_only": {
      -        "default": true,
      -        "description": "Show ads only to people IN the locations (true), not merely interested in them",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "const": "create_display_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "daily_budget",
      -      "ad_groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Build a new Demand Gen campaign with YouTube video ads, which is how to advertise on YouTube through the API (Google doesn't allow creating Video campaigns there). It is created PAUSED: nothing spends until a separate enable_campaign",
      -    "properties": {
      -      "ad_groups": {
      -        "items": {
      -          "properties": {
      -            "ads": {
      -              "items": {
      -                "description": "A Demand Gen video ad: runs on YouTube (in-stream, in-feed and Shorts), Discover and Gmail",
      -                "properties": {
      -                  "business_name": {
      -                    "description": "The advertiser's name, at most 25 characters",
      -                    "maxLength": 25,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "descriptions": {
      -                    "description": "1 to 5 descriptions, each at most 90 characters",
      -                    "items": {
      -                      "maxLength": 90,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "final_url": {
      -                    "description": "The landing page",
      -                    "maxLength": 2048,
      -                    "pattern": "^https?:\\/\\/",
      -                    "type": "string"
      -                  },
      -                  "headlines": {
      -                    "description": "1 to 5 headlines, each at most 40 characters",
      -                    "items": {
      -                      "maxLength": 40,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "logo_image": {
      -                    "description": "A square 1:1 logo (e.g. 1200×1200, at least 128×128): an https URL, or an image asset id from the account",
      -                    "maxLength": 2048,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "long_headlines": {
      -                    "description": "1 to 5 long headlines, each at most 90 characters",
      -                    "items": {
      -                      "maxLength": 90,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "videos": {
      -                    "description": "1 to 5 YouTube videos",
      -                    "items": {
      -                      "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted",
      -                      "maxLength": 200,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  }
      -                },
      -                "required": [
      -                  "videos",
      -                  "headlines",
      -                  "long_headlines",
      -                  "descriptions",
      -                  "business_name",
      -                  "logo_image",
      -                  "final_url"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 3,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "language_ids": {
      -              "default": [
      -                "1000"
      -              ],
      -              "description": "Google language ids, e.g. 1000 English",
      -              "items": {
      -                "pattern": "^\\d+$",
      -                "type": "string"
      -              },
      -              "maxItems": 20,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "location_ids": {
      -              "default": [
      -                "2840"
      -              ],
      -              "description": "Google geo target ids, e.g. 2840 United States (Demand Gen targets locations per ad group, not per campaign)",
      -              "items": {
      -                "pattern": "^\\d+$",
      -                "type": "string"
      -              },
      -              "maxItems": 50,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "name": {
      -              "maxLength": 255,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "ads"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 5,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "bidding": {
      -        "default": "MAXIMIZE_CONVERSIONS",
      -        "description": "Demand Gen bids automatically: MAXIMIZE_CONVERSIONS (needs conversion tracking) or MAXIMIZE_CLICKS",
      -        "enum": [
      -          "MAXIMIZE_CONVERSIONS",
      -          "MAXIMIZE_CLICKS"
      -        ],
      -        "type": "string"
      -      },
      -      "daily_budget": {
      -        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "end_date": {
      -        "description": "Last day the campaign runs, YYYY-MM-DD",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Campaign name; must not match an existing campaign",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "create_demand_gen_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "daily_budget",
      -      "ad_groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Build a new Performance Max campaign: one budget, Google places ads across Search, YouTube, Display, Discover, Gmail and Maps from the asset groups' text, images and videos. No shopping feed (non-retail). It is created PAUSED: nothing spends until a separate enable_campaign",
      -    "properties": {
      -      "asset_groups": {
      -        "items": {
      -          "description": "An asset group: the headlines, descriptions, images and videos Google combines into ads on every channel",
      -          "properties": {
      -            "descriptions": {
      -              "description": "2 to 5 descriptions, each at most 90 characters; Google recommends one of 60 or fewer",
      -              "items": {
      -                "maxLength": 90,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 5,
      -              "minItems": 2,
      -              "type": "array"
      -            },
      -            "final_url": {
      -              "description": "The landing page (Google may also send people to other pages on the same site)",
      -              "maxLength": 2048,
      -              "pattern": "^https?:\\/\\/",
      -              "type": "string"
      -            },
      -            "headlines": {
      -              "description": "3 to 15 headlines, each at most 30 characters",
      -              "items": {
      -                "maxLength": 30,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 15,
      -              "minItems": 3,
      -              "type": "array"
      -            },
      -            "long_headlines": {
      -              "description": "1 to 5 long headlines, each at most 90 characters",
      -              "items": {
      -                "maxLength": 90,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 5,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "marketing_images": {
      -              "description": "1 to 20 landscape images, 1.91:1 (e.g. 1200×628)",
      -              "items": {
      -                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                "maxLength": 2048,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 20,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "name": {
      -              "maxLength": 255,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "portrait_marketing_images": {
      -              "default": [],
      -              "description": "0 to 20 portrait images, 4:5 (e.g. 960×1200)",
      -              "items": {
      -                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                "maxLength": 2048,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 20,
      -              "minItems": 0,
      -              "type": "array"
      -            },
      -            "square_marketing_images": {
      -              "description": "1 to 20 square images, 1:1 (e.g. 1200×1200)",
      -              "items": {
      -                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                "maxLength": 2048,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 20,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "videos": {
      -              "default": [],
      -              "description": "0 to 5 YouTube videos; without one, Google may auto-generate a video from the images",
      -              "items": {
      -                "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted",
      -                "maxLength": 200,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 5,
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "final_url",
      -            "headlines",
      -            "long_headlines",
      -            "descriptions",
      -            "marketing_images",
      -            "square_marketing_images"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 5,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "bidding": {
      -        "default": "MAXIMIZE_CONVERSIONS",
      -        "description": "Performance Max bids for conversions only: MAXIMIZE_CONVERSIONS, or MAXIMIZE_CONVERSION_VALUE when conversions carry values",
      -        "enum": [
      -          "MAXIMIZE_CONVERSIONS",
      -          "MAXIMIZE_CONVERSION_VALUE"
      -        ],
      -        "type": "string"
      -      },
      -      "business_name": {
      -        "description": "The advertiser's name, at most 25 characters (linked to the campaign, per Google's brand guidelines)",
      -        "maxLength": 25,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "daily_budget": {
      -        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "end_date": {
      -        "description": "Last day the campaign runs, YYYY-MM-DD",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [
      -          "1000"
      -        ],
      -        "description": "Google language ids, e.g. 1000 English",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [
      -          "2840"
      -        ],
      -        "description": "Google geo target ids, e.g. 2840 United States",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "logo_images": {
      -        "description": "1 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128), linked to the campaign",
      -        "items": {
      -          "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -          "maxLength": 2048,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 5,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "name": {
      -        "description": "Campaign name; must not match an existing campaign",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "target_cpa": {
      -        "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "create_performance_max_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "daily_budget",
      -      "business_name",
      -      "logo_images",
      -      "asset_groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add an ad group, with its keywords and ads, to an existing Search campaign",
      -    "properties": {
      -      "ad_group": {
      -        "properties": {
      -          "ads": {
      -            "items": {
      -              "description": "A responsive search ad",
      -              "properties": {
      -                "descriptions": {
      -                  "description": "2 to 4 descriptions, each at most 90 characters",
      -                  "items": {
      -                    "maxLength": 90,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "maxItems": 4,
      -                  "minItems": 2,
      -                  "type": "array"
      -                },
      -                "final_url": {
      -                  "description": "The landing page",
      -                  "maxLength": 2048,
      -                  "pattern": "^https?:\\/\\/",
      -                  "type": "string"
      -                },
      -                "headlines": {
      -                  "description": "3 to 15 headlines, each at most 30 characters",
      -                  "items": {
      -                    "maxLength": 30,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "maxItems": 15,
      -                  "minItems": 3,
      -                  "type": "array"
      -                },
      -                "path1": {
      -                  "description": "Display path part 1, at most 15 characters",
      -                  "maxLength": 15,
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "path2": {
      -                  "description": "Display path part 2, at most 15 characters",
      -                  "maxLength": 15,
      -                  "minLength": 1,
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "headlines",
      -                "descriptions",
      -                "final_url"
      -              ],
      -              "type": "object"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          },
      -          "default_max_cpc": {
      -            "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)",
      -            "exclusiveMinimum": 0,
      -            "maximum": 1000,
      -            "type": "number"
      -          },
      -          "keywords": {
      -            "items": {
      -              "properties": {
      -                "match_type": {
      -                  "description": "PHRASE matches searches containing the words in order; the usual choice",
      -                  "enum": [
      -                    "EXACT",
      -                    "PHRASE",
      -                    "BROAD"
      -                  ],
      -                  "type": "string"
      -                },
      -                "max_cpc": {
      -                  "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      -                  "exclusiveMinimum": 0,
      -                  "maximum": 1000,
      -                  "type": "number"
      -                },
      -                "text": {
      -                  "description": "The keyword, e.g. \"cleaning invoice template\"",
      -                  "maxLength": 80,
      -                  "minLength": 1,
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "text",
      -                "match_type"
      -              ],
      -              "type": "object"
      -            },
      -            "maxItems": 50,
      -            "minItems": 1,
      -            "type": "array"
      -          },
      -          "name": {
      -            "maxLength": 255,
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "name",
      -          "keywords",
      -          "ads"
      -        ],
      -        "type": "object"
      -      },
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "add_ad_group",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "ad_group"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add keywords to an existing ad group",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "keywords": {
      -        "items": {
      -          "properties": {
      -            "match_type": {
      -              "description": "PHRASE matches searches containing the words in order; the usual choice",
      -              "enum": [
      -                "EXACT",
      -                "PHRASE",
      -                "BROAD"
      -              ],
      -              "type": "string"
      -            },
      -            "max_cpc": {
      -              "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      -              "exclusiveMinimum": 0,
      -              "maximum": 1000,
      -              "type": "number"
      -            },
      -            "text": {
      -              "description": "The keyword, e.g. \"cleaning invoice template\"",
      -              "maxLength": 80,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "match_type"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "add_keywords",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "keywords"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add a responsive search ad to an existing ad group",
      -    "properties": {
      -      "ad": {
      -        "description": "A responsive search ad",
      -        "properties": {
      -          "descriptions": {
      -            "description": "2 to 4 descriptions, each at most 90 characters",
      -            "items": {
      -              "maxLength": 90,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "maxItems": 4,
      -            "minItems": 2,
      -            "type": "array"
      -          },
      -          "final_url": {
      -            "description": "The landing page",
      -            "maxLength": 2048,
      -            "pattern": "^https?:\\/\\/",
      -            "type": "string"
      -          },
      -          "headlines": {
      -            "description": "3 to 15 headlines, each at most 30 characters",
      -            "items": {
      -              "maxLength": 30,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "maxItems": 15,
      -            "minItems": 3,
      -            "type": "array"
      -          },
      -          "path1": {
      -            "description": "Display path part 1, at most 15 characters",
      -            "maxLength": 15,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "path2": {
      -            "description": "Display path part 2, at most 15 characters",
      -            "maxLength": 15,
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "headlines",
      -          "descriptions",
      -          "final_url"
      -        ],
      -        "type": "object"
      -      },
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "add_responsive_search_ad",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "ad"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add sitelinks to a campaign",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "sitelinks": {
      -        "items": {
      -          "properties": {
      -            "description1": {
      -              "description": "At most 35 characters; give both descriptions or neither",
      -              "maxLength": 35,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "description2": {
      -              "maxLength": 35,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "Link text, at most 25 characters",
      -              "maxLength": 25,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "url": {
      -              "maxLength": 2048,
      -              "pattern": "^https?:\\/\\/",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "url"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 8,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "add_sitelinks",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "sitelinks"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "category": {
      -        "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)",
      -        "pattern": "^[A-Z_]+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "set_conversion_goal",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "category"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Change one keyword's max CPC (manual CPC campaigns)",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "criterion_id": {
      -        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "max_cpc": {
      -        "anyOf": [
      -          {
      -            "exclusiveMinimum": 0,
      -            "maximum": 1000,
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid"
      -      },
      -      "type": {
      -        "const": "set_keyword_bid",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "criterion_id",
      -      "max_cpc"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Change an ad group's default max CPC, which its keywords use unless they have their own",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "max_cpc": {
      -        "description": "New default max cost per click for the ad group",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "set_ad_group_bid",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "max_cpc"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Pause one ad",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "ad_id": {
      -        "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pause_ad",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "ad_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Re-enable one paused ad",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "ad_id": {
      -        "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "enable_ad",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "ad_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add locations and/or languages a campaign targets",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [],
      -        "description": "Language ids to add, e.g. 1000 English",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [],
      -        "description": "Geo target ids to add, e.g. 2840 United States",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "add_campaign_targeting",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Stop targeting some of a campaign's locations and/or languages",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [],
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [],
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "remove_campaign_targeting",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "presence_only": {
      -        "description": "true: only people IN the locations; false: also people interested in them",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "const": "set_location_mode",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "presence_only"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Switch ONE campaign's bid strategy. A campaign on a shared (portfolio) strategy moves off it onto its own; the other campaigns on the shared strategy keep it. To change the shared strategy for every campaign on it, use set_shared_bid_strategy. If the user didn't say which they mean, ask. Google re-learns after a switch, so performance can wobble for a week or two",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "strategy": {
      -        "enum": [
      -          "MANUAL_CPC",
      -          "MAXIMIZE_CLICKS",
      -          "MAXIMIZE_CONVERSIONS"
      -        ],
      -        "type": "string"
      -      },
      -      "target_cpa": {
      -        "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "set_bidding_strategy",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "strategy"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Change a shared (portfolio) bid strategy's targets. This changes EVERY campaign on it, which the proposal lists. Its type can't be changed; to move one campaign to another strategy, use set_bidding_strategy",
      -    "properties": {
      -      "bidding_strategy_id": {
      -        "description": "Shared (portfolio) strategy id: bidding_strategy.id from run_gaql, or the id at the end of campaign.bidding_strategy",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "The most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "target_cpa": {
      -        "description": "Target cost per conversion (TARGET_CPA and MAXIMIZE_CONVERSIONS strategies)",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "target_roas": {
      -        "description": "Target return on ad spend as a ratio, e.g. 4 = 400% (TARGET_ROAS and MAXIMIZE_CONVERSION_VALUE)",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "set_shared_bid_strategy",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "bidding_strategy_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Create a shared (portfolio) bid strategy, optionally moving campaigns onto it. Undo moves those campaigns back and removes it",
      -    "properties": {
      -      "campaign_ids": {
      -        "default": [],
      -        "description": "Campaigns to move onto it in the same step (each leaves its current strategy)",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "The most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "name": {
      -        "description": "Name for the shared strategy; must not match an existing one",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "strategy": {
      -        "enum": [
      -          "MAXIMIZE_CLICKS",
      -          "MAXIMIZE_CONVERSIONS",
      -          "MAXIMIZE_CONVERSION_VALUE",
      -          "TARGET_CPA",
      -          "TARGET_ROAS"
      -        ],
      -        "type": "string"
      -      },
      -      "target_cpa": {
      -        "description": "Target cost per conversion: required for TARGET_CPA, optional for MAXIMIZE_CONVERSIONS",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "target_roas": {
      -        "description": "Target return on ad spend as a ratio, e.g. 4 = 400%: required for TARGET_ROAS, optional for MAXIMIZE_CONVERSION_VALUE",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "create_shared_bid_strategy",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "strategy"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "suffix": {
      -        "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it",
      -        "maxLength": 1000,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "set_url_suffix",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "suffix"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Create a conversion action to measure sign-ups, leads or purchases",
      -    "properties": {
      -      "category": {
      -        "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)",
      -        "pattern": "^[A-Z_]+$",
      -        "type": "string"
      -      },
      -      "counting": {
      -        "default": "ONE_PER_CLICK",
      -        "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases",
      -        "enum": [
      -          "ONE_PER_CLICK",
      -          "MANY_PER_CLICK"
      -        ],
      -        "type": "string"
      -      },
      -      "default_value": {
      -        "description": "Value per conversion when none is sent",
      -        "maximum": 1000000,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "name": {
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "primary": {
      -        "default": true,
      -        "description": "Primary actions count in Conversions and can steer bidding",
      -        "type": "boolean"
      -      },
      -      "source": {
      -        "default": "UPLOAD_CLICKS",
      -        "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page",
      -        "enum": [
      -          "UPLOAD_CLICKS",
      -          "WEBPAGE"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "create_conversion_action",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "category"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Set how many conversions one ad click can produce for a conversion action",
      -    "properties": {
      -      "conversion_action_id": {
      -        "description": "conversion_action.id from run_gaql",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "counting": {
      -        "enum": [
      -          "ONE_PER_CLICK",
      -          "MANY_PER_CLICK"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "set_conversion_counting",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "conversion_action_id",
      -      "counting"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Import a GA4 key event into Google Ads as a conversion action, so campaigns can count and bid on it. The GA4 property must be linked to this account",
      -    "properties": {
      -      "event_name": {
      -        "description": "The GA4 key event, e.g. generate_lead, purchase, sign_up",
      -        "pattern": "^[A-Za-z][A-Za-z0-9_]{0,39}$",
      -        "type": "string"
      -      },
      -      "primary": {
      -        "default": true,
      -        "description": "Primary actions count in Conversions and can steer bidding",
      -        "type": "boolean"
      -      },
      -      "property_id": {
      -        "description": "GA4 property id (from analytics_properties)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "import_ga4_key_event",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "property_id",
      -      "event_name"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "description": "Block searches containing these words in one campaign",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "keywords": {
      +        "items": {
      +          "properties": {
      +            "match_type": {
      +              "description": "PHRASE blocks any search containing the words in order; the usual choice",
      +              "enum": [
      +                "EXACT",
      +                "PHRASE",
      +                "BROAD"
      +              ],
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "The search words to block, e.g. \"free\"",
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "match_type"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "add_negative_keywords",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "keywords"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Pause one keyword",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "criterion_id": {
      +        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pause_keyword",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "criterion_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Re-enable one paused keyword",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "criterion_id": {
      +        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "enable_keyword",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "criterion_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Pause a whole campaign (stops all its spend)",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pause_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Turn a paused campaign back on. It starts spending again; the summary says how much",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "enable_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Pause one ad group",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pause_ad_group",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Re-enable one paused ad group",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "enable_ad_group",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Change a campaign's daily budget (not shared budgets)",
      +    "properties": {
      +      "amount": {
      +        "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "set_daily_budget",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "amount"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Set the last day a campaign runs, so it stops spending on its own",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "end_date": {
      +        "anyOf": [
      +          {
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "const": "none",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date"
      +      },
      +      "type": {
      +        "const": "set_end_date",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "end_date"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign",
      +    "properties": {
      +      "ad_groups": {
      +        "items": {
      +          "properties": {
      +            "ads": {
      +              "items": {
      +                "description": "A responsive search ad",
      +                "properties": {
      +                  "descriptions": {
      +                    "description": "2 to 4 descriptions, each at most 90 characters",
      +                    "items": {
      +                      "maxLength": 90,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 4,
      +                    "minItems": 2,
      +                    "type": "array"
      +                  },
      +                  "final_url": {
      +                    "description": "The landing page",
      +                    "maxLength": 2048,
      +                    "pattern": "^https?:\\/\\/",
      +                    "type": "string"
      +                  },
      +                  "headlines": {
      +                    "description": "3 to 15 headlines, each at most 30 characters",
      +                    "items": {
      +                      "maxLength": 30,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 15,
      +                    "minItems": 3,
      +                    "type": "array"
      +                  },
      +                  "path1": {
      +                    "description": "Display path part 1, at most 15 characters",
      +                    "maxLength": 15,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "path2": {
      +                    "description": "Display path part 2, at most 15 characters",
      +                    "maxLength": 15,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "headlines",
      +                  "descriptions",
      +                  "final_url"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 3,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "default_max_cpc": {
      +              "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)",
      +              "exclusiveMinimum": 0,
      +              "maximum": 1000,
      +              "type": "number"
      +            },
      +            "keywords": {
      +              "items": {
      +                "properties": {
      +                  "match_type": {
      +                    "description": "PHRASE matches searches containing the words in order; the usual choice",
      +                    "enum": [
      +                      "EXACT",
      +                      "PHRASE",
      +                      "BROAD"
      +                    ],
      +                    "type": "string"
      +                  },
      +                  "max_cpc": {
      +                    "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      +                    "exclusiveMinimum": 0,
      +                    "maximum": 1000,
      +                    "type": "number"
      +                  },
      +                  "text": {
      +                    "description": "The keyword, e.g. \"cleaning invoice template\"",
      +                    "maxLength": 80,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "text",
      +                  "match_type"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 50,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "name": {
      +              "maxLength": 255,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "keywords",
      +            "ads"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 10,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "bidding": {
      +        "default": "MANUAL_CPC",
      +        "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget",
      +        "enum": [
      +          "MANUAL_CPC",
      +          "MAXIMIZE_CLICKS",
      +          "MAXIMIZE_CONVERSIONS"
      +        ],
      +        "type": "string"
      +      },
      +      "daily_budget": {
      +        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "end_date": {
      +        "description": "Last day the campaign runs, YYYY-MM-DD",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [
      +          "1000"
      +        ],
      +        "description": "Google language ids, e.g. 1000 English, 1003 Spanish",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [
      +          "2840"
      +        ],
      +        "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "name": {
      +        "description": "Campaign name; must not match an existing campaign",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "negative_keywords": {
      +        "default": [],
      +        "description": "Searches to block across the campaign",
      +        "items": {
      +          "properties": {
      +            "match_type": {
      +              "enum": [
      +                "EXACT",
      +                "PHRASE",
      +                "BROAD"
      +              ],
      +              "type": "string"
      +            },
      +            "text": {
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "match_type"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 200,
      +        "type": "array"
      +      },
      +      "presence_only": {
      +        "default": true,
      +        "description": "Show ads only to people IN the locations (true), not merely interested in them",
      +        "type": "boolean"
      +      },
      +      "search_partners": {
      +        "default": false,
      +        "description": "Also show on Google's search partner sites",
      +        "type": "boolean"
      +      },
      +      "sitelinks": {
      +        "default": [],
      +        "items": {
      +          "properties": {
      +            "description1": {
      +              "description": "At most 35 characters; give both descriptions or neither",
      +              "maxLength": 35,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "description2": {
      +              "maxLength": 35,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "Link text, at most 25 characters",
      +              "maxLength": 25,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "url": {
      +              "maxLength": 2048,
      +              "pattern": "^https?:\\/\\/",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "url"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 8,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "create_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "daily_budget",
      +      "ad_groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Build a new Display campaign (image ads across Google's Display Network of sites and apps) with ad groups and responsive display ads. Google's optimized targeting finds the audience. It is created PAUSED: nothing spends until a separate enable_campaign",
      +    "properties": {
      +      "ad_groups": {
      +        "items": {
      +          "properties": {
      +            "ads": {
      +              "items": {
      +                "description": "A responsive display ad: Google assembles ads from these headlines, descriptions and images",
      +                "properties": {
      +                  "business_name": {
      +                    "description": "The advertiser's name, at most 25 characters",
      +                    "maxLength": 25,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "descriptions": {
      +                    "description": "1 to 5 descriptions, each at most 90 characters",
      +                    "items": {
      +                      "maxLength": 90,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "final_url": {
      +                    "description": "The landing page",
      +                    "maxLength": 2048,
      +                    "pattern": "^https?:\\/\\/",
      +                    "type": "string"
      +                  },
      +                  "headlines": {
      +                    "description": "1 to 5 short headlines, each at most 30 characters",
      +                    "items": {
      +                      "maxLength": 30,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "logo_images": {
      +                    "default": [],
      +                    "description": "0 to 5 landscape logos, 4:1 (e.g. 1200×300, at least 512×128)",
      +                    "items": {
      +                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                      "maxLength": 2048,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 0,
      +                    "type": "array"
      +                  },
      +                  "long_headline": {
      +                    "description": "One long headline, at most 90 characters",
      +                    "maxLength": 90,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "marketing_images": {
      +                    "description": "1 to 15 landscape images, 1.91:1 (e.g. 1200×628, at least 600×314)",
      +                    "items": {
      +                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                      "maxLength": 2048,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 15,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "square_logo_images": {
      +                    "default": [],
      +                    "description": "0 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128)",
      +                    "items": {
      +                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                      "maxLength": 2048,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 0,
      +                    "type": "array"
      +                  },
      +                  "square_marketing_images": {
      +                    "description": "1 to 15 square images, 1:1 (e.g. 1200×1200, at least 300×300)",
      +                    "items": {
      +                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                      "maxLength": 2048,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 15,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  }
      +                },
      +                "required": [
      +                  "headlines",
      +                  "long_headline",
      +                  "descriptions",
      +                  "business_name",
      +                  "final_url",
      +                  "marketing_images",
      +                  "square_marketing_images"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 3,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "default_max_cpc": {
      +              "description": "Default max cost per click (required when the campaign uses manual CPC)",
      +              "exclusiveMinimum": 0,
      +              "maximum": 1000,
      +              "type": "number"
      +            },
      +            "name": {
      +              "maxLength": 255,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "ads"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 5,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "bidding": {
      +        "default": "MAXIMIZE_CLICKS",
      +        "description": "MANUAL_CPC uses the ad groups' max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget",
      +        "enum": [
      +          "MANUAL_CPC",
      +          "MAXIMIZE_CLICKS",
      +          "MAXIMIZE_CONVERSIONS"
      +        ],
      +        "type": "string"
      +      },
      +      "daily_budget": {
      +        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "end_date": {
      +        "description": "Last day the campaign runs, YYYY-MM-DD",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [
      +          "1000"
      +        ],
      +        "description": "Google language ids, e.g. 1000 English",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [
      +          "2840"
      +        ],
      +        "description": "Google geo target ids, e.g. 2840 United States",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "name": {
      +        "description": "Campaign name; must not match an existing campaign",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "presence_only": {
      +        "default": true,
      +        "description": "Show ads only to people IN the locations (true), not merely interested in them",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "create_display_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "daily_budget",
      +      "ad_groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Build a new Demand Gen campaign with YouTube video ads, which is how to advertise on YouTube through the API (Google doesn't allow creating Video campaigns there). It is created PAUSED: nothing spends until a separate enable_campaign",
      +    "properties": {
      +      "ad_groups": {
      +        "items": {
      +          "properties": {
      +            "ads": {
      +              "items": {
      +                "description": "A Demand Gen video ad: runs on YouTube (in-stream, in-feed and Shorts), Discover and Gmail",
      +                "properties": {
      +                  "business_name": {
      +                    "description": "The advertiser's name, at most 25 characters",
      +                    "maxLength": 25,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "descriptions": {
      +                    "description": "1 to 5 descriptions, each at most 90 characters",
      +                    "items": {
      +                      "maxLength": 90,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "final_url": {
      +                    "description": "The landing page",
      +                    "maxLength": 2048,
      +                    "pattern": "^https?:\\/\\/",
      +                    "type": "string"
      +                  },
      +                  "headlines": {
      +                    "description": "1 to 5 headlines, each at most 40 characters",
      +                    "items": {
      +                      "maxLength": 40,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "logo_image": {
      +                    "description": "A square 1:1 logo (e.g. 1200×1200, at least 128×128): an https URL, or an image asset id from the account",
      +                    "maxLength": 2048,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "long_headlines": {
      +                    "description": "1 to 5 long headlines, each at most 90 characters",
      +                    "items": {
      +                      "maxLength": 90,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "videos": {
      +                    "description": "1 to 5 YouTube videos",
      +                    "items": {
      +                      "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted",
      +                      "maxLength": 200,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  }
      +                },
      +                "required": [
      +                  "videos",
      +                  "headlines",
      +                  "long_headlines",
      +                  "descriptions",
      +                  "business_name",
      +                  "logo_image",
      +                  "final_url"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 3,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "language_ids": {
      +              "default": [
      +                "1000"
      +              ],
      +              "description": "Google language ids, e.g. 1000 English",
      +              "items": {
      +                "pattern": "^\\d+$",
      +                "type": "string"
      +              },
      +              "maxItems": 20,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "location_ids": {
      +              "default": [
      +                "2840"
      +              ],
      +              "description": "Google geo target ids, e.g. 2840 United States (Demand Gen targets locations per ad group, not per campaign)",
      +              "items": {
      +                "pattern": "^\\d+$",
      +                "type": "string"
      +              },
      +              "maxItems": 50,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "name": {
      +              "maxLength": 255,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "ads"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 5,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "bidding": {
      +        "default": "MAXIMIZE_CONVERSIONS",
      +        "description": "Demand Gen bids automatically: MAXIMIZE_CONVERSIONS (needs conversion tracking) or MAXIMIZE_CLICKS",
      +        "enum": [
      +          "MAXIMIZE_CONVERSIONS",
      +          "MAXIMIZE_CLICKS"
      +        ],
      +        "type": "string"
      +      },
      +      "daily_budget": {
      +        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "end_date": {
      +        "description": "Last day the campaign runs, YYYY-MM-DD",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Campaign name; must not match an existing campaign",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "create_demand_gen_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "daily_budget",
      +      "ad_groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Build a new Performance Max campaign: one budget, Google places ads across Search, YouTube, Display, Discover, Gmail and Maps from the asset groups' text, images and videos. No shopping feed (non-retail). It is created PAUSED: nothing spends until a separate enable_campaign",
      +    "properties": {
      +      "asset_groups": {
      +        "items": {
      +          "description": "An asset group: the headlines, descriptions, images and videos Google combines into ads on every channel",
      +          "properties": {
      +            "descriptions": {
      +              "description": "2 to 5 descriptions, each at most 90 characters; Google recommends one of 60 or fewer",
      +              "items": {
      +                "maxLength": 90,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 5,
      +              "minItems": 2,
      +              "type": "array"
      +            },
      +            "final_url": {
      +              "description": "The landing page (Google may also send people to other pages on the same site)",
      +              "maxLength": 2048,
      +              "pattern": "^https?:\\/\\/",
      +              "type": "string"
      +            },
      +            "headlines": {
      +              "description": "3 to 15 headlines, each at most 30 characters",
      +              "items": {
      +                "maxLength": 30,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 15,
      +              "minItems": 3,
      +              "type": "array"
      +            },
      +            "long_headlines": {
      +              "description": "1 to 5 long headlines, each at most 90 characters",
      +              "items": {
      +                "maxLength": 90,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 5,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "marketing_images": {
      +              "description": "1 to 20 landscape images, 1.91:1 (e.g. 1200×628)",
      +              "items": {
      +                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                "maxLength": 2048,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 20,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "name": {
      +              "maxLength": 255,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "portrait_marketing_images": {
      +              "default": [],
      +              "description": "0 to 20 portrait images, 4:5 (e.g. 960×1200)",
      +              "items": {
      +                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                "maxLength": 2048,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 20,
      +              "minItems": 0,
      +              "type": "array"
      +            },
      +            "square_marketing_images": {
      +              "description": "1 to 20 square images, 1:1 (e.g. 1200×1200)",
      +              "items": {
      +                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                "maxLength": 2048,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 20,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "videos": {
      +              "default": [],
      +              "description": "0 to 5 YouTube videos; without one, Google may auto-generate a video from the images",
      +              "items": {
      +                "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted",
      +                "maxLength": 200,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 5,
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "final_url",
      +            "headlines",
      +            "long_headlines",
      +            "descriptions",
      +            "marketing_images",
      +            "square_marketing_images"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 5,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "bidding": {
      +        "default": "MAXIMIZE_CONVERSIONS",
      +        "description": "Performance Max bids for conversions only: MAXIMIZE_CONVERSIONS, or MAXIMIZE_CONVERSION_VALUE when conversions carry values",
      +        "enum": [
      +          "MAXIMIZE_CONVERSIONS",
      +          "MAXIMIZE_CONVERSION_VALUE"
      +        ],
      +        "type": "string"
      +      },
      +      "business_name": {
      +        "description": "The advertiser's name, at most 25 characters (linked to the campaign, per Google's brand guidelines)",
      +        "maxLength": 25,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "daily_budget": {
      +        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "end_date": {
      +        "description": "Last day the campaign runs, YYYY-MM-DD",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [
      +          "1000"
      +        ],
      +        "description": "Google language ids, e.g. 1000 English",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [
      +          "2840"
      +        ],
      +        "description": "Google geo target ids, e.g. 2840 United States",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "logo_images": {
      +        "description": "1 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128), linked to the campaign",
      +        "items": {
      +          "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +          "maxLength": 2048,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 5,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "name": {
      +        "description": "Campaign name; must not match an existing campaign",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "target_cpa": {
      +        "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "create_performance_max_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "daily_budget",
      +      "business_name",
      +      "logo_images",
      +      "asset_groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add an ad group, with its keywords and ads, to an existing Search campaign",
      +    "properties": {
      +      "ad_group": {
      +        "properties": {
      +          "ads": {
      +            "items": {
      +              "description": "A responsive search ad",
      +              "properties": {
      +                "descriptions": {
      +                  "description": "2 to 4 descriptions, each at most 90 characters",
      +                  "items": {
      +                    "maxLength": 90,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "maxItems": 4,
      +                  "minItems": 2,
      +                  "type": "array"
      +                },
      +                "final_url": {
      +                  "description": "The landing page",
      +                  "maxLength": 2048,
      +                  "pattern": "^https?:\\/\\/",
      +                  "type": "string"
      +                },
      +                "headlines": {
      +                  "description": "3 to 15 headlines, each at most 30 characters",
      +                  "items": {
      +                    "maxLength": 30,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "maxItems": 15,
      +                  "minItems": 3,
      +                  "type": "array"
      +                },
      +                "path1": {
      +                  "description": "Display path part 1, at most 15 characters",
      +                  "maxLength": 15,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "path2": {
      +                  "description": "Display path part 2, at most 15 characters",
      +                  "maxLength": 15,
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "headlines",
      +                "descriptions",
      +                "final_url"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "default_max_cpc": {
      +            "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)",
      +            "exclusiveMinimum": 0,
      +            "maximum": 1000,
      +            "type": "number"
      +          },
      +          "keywords": {
      +            "items": {
      +              "properties": {
      +                "match_type": {
      +                  "description": "PHRASE matches searches containing the words in order; the usual choice",
      +                  "enum": [
      +                    "EXACT",
      +                    "PHRASE",
      +                    "BROAD"
      +                  ],
      +                  "type": "string"
      +                },
      +                "max_cpc": {
      +                  "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      +                  "exclusiveMinimum": 0,
      +                  "maximum": 1000,
      +                  "type": "number"
      +                },
      +                "text": {
      +                  "description": "The keyword, e.g. \"cleaning invoice template\"",
      +                  "maxLength": 80,
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "text",
      +                "match_type"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 50,
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "name": {
      +            "maxLength": 255,
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "keywords",
      +          "ads"
      +        ],
      +        "type": "object"
      +      },
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "add_ad_group",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "ad_group"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add keywords to an existing ad group",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "keywords": {
      +        "items": {
      +          "properties": {
      +            "match_type": {
      +              "description": "PHRASE matches searches containing the words in order; the usual choice",
      +              "enum": [
      +                "EXACT",
      +                "PHRASE",
      +                "BROAD"
      +              ],
      +              "type": "string"
      +            },
      +            "max_cpc": {
      +              "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      +              "exclusiveMinimum": 0,
      +              "maximum": 1000,
      +              "type": "number"
      +            },
      +            "text": {
      +              "description": "The keyword, e.g. \"cleaning invoice template\"",
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "match_type"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "add_keywords",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "keywords"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add a responsive search ad to an existing ad group",
      +    "properties": {
      +      "ad": {
      +        "description": "A responsive search ad",
      +        "properties": {
      +          "descriptions": {
      +            "description": "2 to 4 descriptions, each at most 90 characters",
      +            "items": {
      +              "maxLength": 90,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "maxItems": 4,
      +            "minItems": 2,
      +            "type": "array"
      +          },
      +          "final_url": {
      +            "description": "The landing page",
      +            "maxLength": 2048,
      +            "pattern": "^https?:\\/\\/",
      +            "type": "string"
      +          },
      +          "headlines": {
      +            "description": "3 to 15 headlines, each at most 30 characters",
      +            "items": {
      +              "maxLength": 30,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "maxItems": 15,
      +            "minItems": 3,
      +            "type": "array"
      +          },
      +          "path1": {
      +            "description": "Display path part 1, at most 15 characters",
      +            "maxLength": 15,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "path2": {
      +            "description": "Display path part 2, at most 15 characters",
      +            "maxLength": 15,
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "headlines",
      +          "descriptions",
      +          "final_url"
      +        ],
      +        "type": "object"
      +      },
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "add_responsive_search_ad",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "ad"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add sitelinks to a campaign",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "sitelinks": {
      +        "items": {
      +          "properties": {
      +            "description1": {
      +              "description": "At most 35 characters; give both descriptions or neither",
      +              "maxLength": 35,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "description2": {
      +              "maxLength": 35,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "Link text, at most 25 characters",
      +              "maxLength": 25,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "url": {
      +              "maxLength": 2048,
      +              "pattern": "^https?:\\/\\/",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "url"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 8,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "add_sitelinks",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "sitelinks"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "category": {
      +        "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)",
      +        "pattern": "^[A-Z_]+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "set_conversion_goal",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "category"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Change one keyword's max CPC (manual CPC campaigns)",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "criterion_id": {
      +        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "max_cpc": {
      +        "anyOf": [
      +          {
      +            "exclusiveMinimum": 0,
      +            "maximum": 1000,
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid"
      +      },
      +      "type": {
      +        "const": "set_keyword_bid",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "criterion_id",
      +      "max_cpc"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Change an ad group's default max CPC, which its keywords use unless they have their own",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "max_cpc": {
      +        "description": "New default max cost per click for the ad group",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "set_ad_group_bid",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "max_cpc"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Pause one ad",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "ad_id": {
      +        "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pause_ad",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "ad_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Re-enable one paused ad",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "ad_id": {
      +        "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "enable_ad",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "ad_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add locations and/or languages a campaign targets",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [],
      +        "description": "Language ids to add, e.g. 1000 English",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [],
      +        "description": "Geo target ids to add, e.g. 2840 United States",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "add_campaign_targeting",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Stop targeting some of a campaign's locations and/or languages",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [],
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [],
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "remove_campaign_targeting",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "presence_only": {
      +        "description": "true: only people IN the locations; false: also people interested in them",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "set_location_mode",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "presence_only"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Switch ONE campaign's bid strategy. A campaign on a shared (portfolio) strategy moves off it onto its own; the other campaigns on the shared strategy keep it. To change the shared strategy for every campaign on it, use set_shared_bid_strategy. If the user didn't say which they mean, ask. Google re-learns after a switch, so performance can wobble for a week or two",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "strategy": {
      +        "enum": [
      +          "MANUAL_CPC",
      +          "MAXIMIZE_CLICKS",
      +          "MAXIMIZE_CONVERSIONS"
      +        ],
      +        "type": "string"
      +      },
      +      "target_cpa": {
      +        "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "set_bidding_strategy",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "strategy"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Change a shared (portfolio) bid strategy's targets. This changes EVERY campaign on it, which the proposal lists. Its type can't be changed; to move one campaign to another strategy, use set_bidding_strategy",
      +    "properties": {
      +      "bidding_strategy_id": {
      +        "description": "Shared (portfolio) strategy id: bidding_strategy.id from run_gaql, or the id at the end of campaign.bidding_strategy",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "The most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "target_cpa": {
      +        "description": "Target cost per conversion (TARGET_CPA and MAXIMIZE_CONVERSIONS strategies)",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "target_roas": {
      +        "description": "Target return on ad spend as a ratio, e.g. 4 = 400% (TARGET_ROAS and MAXIMIZE_CONVERSION_VALUE)",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "set_shared_bid_strategy",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "bidding_strategy_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Create a shared (portfolio) bid strategy, optionally moving campaigns onto it. Undo moves those campaigns back and removes it",
      +    "properties": {
      +      "campaign_ids": {
      +        "default": [],
      +        "description": "Campaigns to move onto it in the same step (each leaves its current strategy)",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "The most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "name": {
      +        "description": "Name for the shared strategy; must not match an existing one",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "strategy": {
      +        "enum": [
      +          "MAXIMIZE_CLICKS",
      +          "MAXIMIZE_CONVERSIONS",
      +          "MAXIMIZE_CONVERSION_VALUE",
      +          "TARGET_CPA",
      +          "TARGET_ROAS"
      +        ],
      +        "type": "string"
      +      },
      +      "target_cpa": {
      +        "description": "Target cost per conversion: required for TARGET_CPA, optional for MAXIMIZE_CONVERSIONS",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "target_roas": {
      +        "description": "Target return on ad spend as a ratio, e.g. 4 = 400%: required for TARGET_ROAS, optional for MAXIMIZE_CONVERSION_VALUE",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "create_shared_bid_strategy",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "strategy"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "suffix": {
      +        "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it",
      +        "maxLength": 1000,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "set_url_suffix",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "suffix"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Declare whether a campaign contains EU political advertising. While any campaign lacks this declaration, Google refuses every change to the account (EU_POLITICAL_ADVERTISING_DECLARATION_REQUIRED); find those campaigns with campaign.missing_eu_political_advertising_declaration = TRUE. It is the advertiser's own legal statement: ask the user, never assume the answer",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "contains_eu_political_advertising": {
      +        "description": "The user's answer: true only if the campaign carries political ads under EU rules (about an election, a referendum, or a law or regulation, shown in the EU)",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "set_eu_political_advertising",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "contains_eu_political_advertising"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Create a conversion action to measure sign-ups, leads or purchases",
      +    "properties": {
      +      "category": {
      +        "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)",
      +        "pattern": "^[A-Z_]+$",
      +        "type": "string"
      +      },
      +      "counting": {
      +        "default": "ONE_PER_CLICK",
      +        "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases",
      +        "enum": [
      +          "ONE_PER_CLICK",
      +          "MANY_PER_CLICK"
      +        ],
      +        "type": "string"
      +      },
      +      "default_value": {
      +        "description": "Value per conversion when none is sent",
      +        "maximum": 1000000,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "name": {
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "primary": {
      +        "default": true,
      +        "description": "Primary actions count in Conversions and can steer bidding",
      +        "type": "boolean"
      +      },
      +      "source": {
      +        "default": "UPLOAD_CLICKS",
      +        "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page",
      +        "enum": [
      +          "UPLOAD_CLICKS",
      +          "WEBPAGE"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "create_conversion_action",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "category"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Set how many conversions one ad click can produce for a conversion action",
      +    "properties": {
      +      "conversion_action_id": {
      +        "description": "conversion_action.id from run_gaql",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "counting": {
      +        "enum": [
      +          "ONE_PER_CLICK",
      +          "MANY_PER_CLICK"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "set_conversion_counting",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "conversion_action_id",
      +      "counting"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Import a GA4 key event into Google Ads as a conversion action, so campaigns can count and bid on it. The GA4 property must be linked to this account",
      +    "properties": {
      +      "event_name": {
      +        "description": "The GA4 key event, e.g. generate_lead, purchase, sign_up",
      +        "pattern": "^[A-Za-z][A-Za-z0-9_]{0,39}$",
      +        "type": "string"
      +      },
      +      "primary": {
      +        "default": true,
      +        "description": "Primary actions count in Conversions and can steer bidding",
      +        "type": "boolean"
      +      },
      +      "property_id": {
      +        "description": "GA4 property id (from analytics_properties)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "import_ga4_key_event",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "property_id",
      +      "event_name"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. Changed2 schema fields changedv0.17.0
    • changedInput schema / properties / changes / items / oneOf
      Previous value: -[
      -  {
      -    "description": "Block searches containing these words in one campaign",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "keywords": {
      -        "items": {
      -          "properties": {
      -            "match_type": {
      -              "description": "PHRASE blocks any search containing the words in order; the usual choice",
      -              "enum": [
      -                "EXACT",
      -                "PHRASE",
      -                "BROAD"
      -              ],
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "The search words to block, e.g. \"free\"",
      -              "maxLength": 80,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "match_type"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "add_negative_keywords",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "keywords"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Pause one keyword",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "criterion_id": {
      -        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pause_keyword",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "criterion_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Re-enable one paused keyword",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "criterion_id": {
      -        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "enable_keyword",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "criterion_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Pause a whole campaign (stops all its spend)",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pause_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Turn a paused campaign back on. It starts spending again; the summary says how much",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "enable_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Pause one ad group",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pause_ad_group",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Re-enable one paused ad group",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "enable_ad_group",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Change a campaign's daily budget (not shared budgets)",
      -    "properties": {
      -      "amount": {
      -        "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "set_daily_budget",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "amount"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Set the last day a campaign runs, so it stops spending on its own",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "end_date": {
      -        "anyOf": [
      -          {
      -            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -            "type": "string"
      -          },
      -          {
      -            "const": "none",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date"
      -      },
      -      "type": {
      -        "const": "set_end_date",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "end_date"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign",
      -    "properties": {
      -      "ad_groups": {
      -        "items": {
      -          "properties": {
      -            "ads": {
      -              "items": {
      -                "description": "A responsive search ad",
      -                "properties": {
      -                  "descriptions": {
      -                    "description": "2 to 4 descriptions, each at most 90 characters",
      -                    "items": {
      -                      "maxLength": 90,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 4,
      -                    "minItems": 2,
      -                    "type": "array"
      -                  },
      -                  "final_url": {
      -                    "description": "The landing page",
      -                    "maxLength": 2048,
      -                    "pattern": "^https?:\\/\\/",
      -                    "type": "string"
      -                  },
      -                  "headlines": {
      -                    "description": "3 to 15 headlines, each at most 30 characters",
      -                    "items": {
      -                      "maxLength": 30,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 15,
      -                    "minItems": 3,
      -                    "type": "array"
      -                  },
      -                  "path1": {
      -                    "description": "Display path part 1, at most 15 characters",
      -                    "maxLength": 15,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "path2": {
      -                    "description": "Display path part 2, at most 15 characters",
      -                    "maxLength": 15,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "headlines",
      -                  "descriptions",
      -                  "final_url"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 3,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "default_max_cpc": {
      -              "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)",
      -              "exclusiveMinimum": 0,
      -              "maximum": 1000,
      -              "type": "number"
      -            },
      -            "keywords": {
      -              "items": {
      -                "properties": {
      -                  "match_type": {
      -                    "description": "PHRASE matches searches containing the words in order; the usual choice",
      -                    "enum": [
      -                      "EXACT",
      -                      "PHRASE",
      -                      "BROAD"
      -                    ],
      -                    "type": "string"
      -                  },
      -                  "max_cpc": {
      -                    "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      -                    "exclusiveMinimum": 0,
      -                    "maximum": 1000,
      -                    "type": "number"
      -                  },
      -                  "text": {
      -                    "description": "The keyword, e.g. \"cleaning invoice template\"",
      -                    "maxLength": 80,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "text",
      -                  "match_type"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 50,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "name": {
      -              "maxLength": 255,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "keywords",
      -            "ads"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 10,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "bidding": {
      -        "default": "MANUAL_CPC",
      -        "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget",
      -        "enum": [
      -          "MANUAL_CPC",
      -          "MAXIMIZE_CLICKS",
      -          "MAXIMIZE_CONVERSIONS"
      -        ],
      -        "type": "string"
      -      },
      -      "daily_budget": {
      -        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "end_date": {
      -        "description": "Last day the campaign runs, YYYY-MM-DD",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [
      -          "1000"
      -        ],
      -        "description": "Google language ids, e.g. 1000 English, 1003 Spanish",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [
      -          "2840"
      -        ],
      -        "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "name": {
      -        "description": "Campaign name; must not match an existing campaign",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "negative_keywords": {
      -        "default": [],
      -        "description": "Searches to block across the campaign",
      -        "items": {
      -          "properties": {
      -            "match_type": {
      -              "enum": [
      -                "EXACT",
      -                "PHRASE",
      -                "BROAD"
      -              ],
      -              "type": "string"
      -            },
      -            "text": {
      -              "maxLength": 80,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "match_type"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 200,
      -        "type": "array"
      -      },
      -      "presence_only": {
      -        "default": true,
      -        "description": "Show ads only to people IN the locations (true), not merely interested in them",
      -        "type": "boolean"
      -      },
      -      "search_partners": {
      -        "default": false,
      -        "description": "Also show on Google's search partner sites",
      -        "type": "boolean"
      -      },
      -      "sitelinks": {
      -        "default": [],
      -        "items": {
      -          "properties": {
      -            "description1": {
      -              "description": "At most 35 characters; give both descriptions or neither",
      -              "maxLength": 35,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "description2": {
      -              "maxLength": 35,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "Link text, at most 25 characters",
      -              "maxLength": 25,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "url": {
      -              "maxLength": 2048,
      -              "pattern": "^https?:\\/\\/",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "url"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 8,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "create_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "daily_budget",
      -      "ad_groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Build a new Display campaign (image ads across Google's Display Network of sites and apps) with ad groups and responsive display ads. Google's optimized targeting finds the audience. It is created PAUSED: nothing spends until a separate enable_campaign",
      -    "properties": {
      -      "ad_groups": {
      -        "items": {
      -          "properties": {
      -            "ads": {
      -              "items": {
      -                "description": "A responsive display ad: Google assembles ads from these headlines, descriptions and images",
      -                "properties": {
      -                  "business_name": {
      -                    "description": "The advertiser's name, at most 25 characters",
      -                    "maxLength": 25,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "descriptions": {
      -                    "description": "1 to 5 descriptions, each at most 90 characters",
      -                    "items": {
      -                      "maxLength": 90,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "final_url": {
      -                    "description": "The landing page",
      -                    "maxLength": 2048,
      -                    "pattern": "^https?:\\/\\/",
      -                    "type": "string"
      -                  },
      -                  "headlines": {
      -                    "description": "1 to 5 short headlines, each at most 30 characters",
      -                    "items": {
      -                      "maxLength": 30,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "logo_images": {
      -                    "default": [],
      -                    "description": "0 to 5 landscape logos, 4:1 (e.g. 1200×300, at least 512×128)",
      -                    "items": {
      -                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                      "maxLength": 2048,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 0,
      -                    "type": "array"
      -                  },
      -                  "long_headline": {
      -                    "description": "One long headline, at most 90 characters",
      -                    "maxLength": 90,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "marketing_images": {
      -                    "description": "1 to 15 landscape images, 1.91:1 (e.g. 1200×628, at least 600×314)",
      -                    "items": {
      -                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                      "maxLength": 2048,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 15,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "square_logo_images": {
      -                    "default": [],
      -                    "description": "0 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128)",
      -                    "items": {
      -                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                      "maxLength": 2048,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 0,
      -                    "type": "array"
      -                  },
      -                  "square_marketing_images": {
      -                    "description": "1 to 15 square images, 1:1 (e.g. 1200×1200, at least 300×300)",
      -                    "items": {
      -                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                      "maxLength": 2048,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 15,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  }
      -                },
      -                "required": [
      -                  "headlines",
      -                  "long_headline",
      -                  "descriptions",
      -                  "business_name",
      -                  "final_url",
      -                  "marketing_images",
      -                  "square_marketing_images"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 3,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "default_max_cpc": {
      -              "description": "Default max cost per click (required when the campaign uses manual CPC)",
      -              "exclusiveMinimum": 0,
      -              "maximum": 1000,
      -              "type": "number"
      -            },
      -            "name": {
      -              "maxLength": 255,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "ads"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 5,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "bidding": {
      -        "default": "MAXIMIZE_CLICKS",
      -        "description": "MANUAL_CPC uses the ad groups' max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget",
      -        "enum": [
      -          "MANUAL_CPC",
      -          "MAXIMIZE_CLICKS",
      -          "MAXIMIZE_CONVERSIONS"
      -        ],
      -        "type": "string"
      -      },
      -      "daily_budget": {
      -        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "end_date": {
      -        "description": "Last day the campaign runs, YYYY-MM-DD",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [
      -          "1000"
      -        ],
      -        "description": "Google language ids, e.g. 1000 English",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [
      -          "2840"
      -        ],
      -        "description": "Google geo target ids, e.g. 2840 United States",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "name": {
      -        "description": "Campaign name; must not match an existing campaign",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "presence_only": {
      -        "default": true,
      -        "description": "Show ads only to people IN the locations (true), not merely interested in them",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "const": "create_display_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "daily_budget",
      -      "ad_groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Build a new Demand Gen campaign with YouTube video ads, which is how to advertise on YouTube through the API (Google doesn't allow creating Video campaigns there). It is created PAUSED: nothing spends until a separate enable_campaign",
      -    "properties": {
      -      "ad_groups": {
      -        "items": {
      -          "properties": {
      -            "ads": {
      -              "items": {
      -                "description": "A Demand Gen video ad: runs on YouTube (in-stream, in-feed and Shorts), Discover and Gmail",
      -                "properties": {
      -                  "business_name": {
      -                    "description": "The advertiser's name, at most 25 characters",
      -                    "maxLength": 25,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "descriptions": {
      -                    "description": "1 to 5 descriptions, each at most 90 characters",
      -                    "items": {
      -                      "maxLength": 90,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "final_url": {
      -                    "description": "The landing page",
      -                    "maxLength": 2048,
      -                    "pattern": "^https?:\\/\\/",
      -                    "type": "string"
      -                  },
      -                  "headlines": {
      -                    "description": "1 to 5 headlines, each at most 40 characters",
      -                    "items": {
      -                      "maxLength": 40,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "logo_image": {
      -                    "description": "A square 1:1 logo (e.g. 1200×1200, at least 128×128): an https URL, or an image asset id from the account",
      -                    "maxLength": 2048,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "long_headlines": {
      -                    "description": "1 to 5 long headlines, each at most 90 characters",
      -                    "items": {
      -                      "maxLength": 90,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "videos": {
      -                    "description": "1 to 5 YouTube videos",
      -                    "items": {
      -                      "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted",
      -                      "maxLength": 200,
      -                      "minLength": 1,
      -                      "type": "string"
      -                    },
      -                    "maxItems": 5,
      -                    "minItems": 1,
      -                    "type": "array"
      -                  }
      -                },
      -                "required": [
      -                  "videos",
      -                  "headlines",
      -                  "long_headlines",
      -                  "descriptions",
      -                  "business_name",
      -                  "logo_image",
      -                  "final_url"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 3,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "language_ids": {
      -              "default": [
      -                "1000"
      -              ],
      -              "description": "Google language ids, e.g. 1000 English",
      -              "items": {
      -                "pattern": "^\\d+$",
      -                "type": "string"
      -              },
      -              "maxItems": 20,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "location_ids": {
      -              "default": [
      -                "2840"
      -              ],
      -              "description": "Google geo target ids, e.g. 2840 United States (Demand Gen targets locations per ad group, not per campaign)",
      -              "items": {
      -                "pattern": "^\\d+$",
      -                "type": "string"
      -              },
      -              "maxItems": 50,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "name": {
      -              "maxLength": 255,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "ads"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 5,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "bidding": {
      -        "default": "MAXIMIZE_CONVERSIONS",
      -        "description": "Demand Gen bids automatically: MAXIMIZE_CONVERSIONS (needs conversion tracking) or MAXIMIZE_CLICKS",
      -        "enum": [
      -          "MAXIMIZE_CONVERSIONS",
      -          "MAXIMIZE_CLICKS"
      -        ],
      -        "type": "string"
      -      },
      -      "daily_budget": {
      -        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "end_date": {
      -        "description": "Last day the campaign runs, YYYY-MM-DD",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "Campaign name; must not match an existing campaign",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "create_demand_gen_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "daily_budget",
      -      "ad_groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Build a new Performance Max campaign: one budget, Google places ads across Search, YouTube, Display, Discover, Gmail and Maps from the asset groups' text, images and videos. No shopping feed (non-retail). It is created PAUSED: nothing spends until a separate enable_campaign",
      -    "properties": {
      -      "asset_groups": {
      -        "items": {
      -          "description": "An asset group: the headlines, descriptions, images and videos Google combines into ads on every channel",
      -          "properties": {
      -            "descriptions": {
      -              "description": "2 to 5 descriptions, each at most 90 characters; Google recommends one of 60 or fewer",
      -              "items": {
      -                "maxLength": 90,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 5,
      -              "minItems": 2,
      -              "type": "array"
      -            },
      -            "final_url": {
      -              "description": "The landing page (Google may also send people to other pages on the same site)",
      -              "maxLength": 2048,
      -              "pattern": "^https?:\\/\\/",
      -              "type": "string"
      -            },
      -            "headlines": {
      -              "description": "3 to 15 headlines, each at most 30 characters",
      -              "items": {
      -                "maxLength": 30,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 15,
      -              "minItems": 3,
      -              "type": "array"
      -            },
      -            "long_headlines": {
      -              "description": "1 to 5 long headlines, each at most 90 characters",
      -              "items": {
      -                "maxLength": 90,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 5,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "marketing_images": {
      -              "description": "1 to 20 landscape images, 1.91:1 (e.g. 1200×628)",
      -              "items": {
      -                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                "maxLength": 2048,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 20,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "name": {
      -              "maxLength": 255,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "portrait_marketing_images": {
      -              "default": [],
      -              "description": "0 to 20 portrait images, 4:5 (e.g. 960×1200)",
      -              "items": {
      -                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                "maxLength": 2048,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 20,
      -              "minItems": 0,
      -              "type": "array"
      -            },
      -            "square_marketing_images": {
      -              "description": "1 to 20 square images, 1:1 (e.g. 1200×1200)",
      -              "items": {
      -                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -                "maxLength": 2048,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 20,
      -              "minItems": 1,
      -              "type": "array"
      -            },
      -            "videos": {
      -              "default": [],
      -              "description": "0 to 5 YouTube videos; without one, Google may auto-generate a video from the images",
      -              "items": {
      -                "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted",
      -                "maxLength": 200,
      -                "minLength": 1,
      -                "type": "string"
      -              },
      -              "maxItems": 5,
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "final_url",
      -            "headlines",
      -            "long_headlines",
      -            "descriptions",
      -            "marketing_images",
      -            "square_marketing_images"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 5,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "bidding": {
      -        "default": "MAXIMIZE_CONVERSIONS",
      -        "description": "Performance Max bids for conversions only: MAXIMIZE_CONVERSIONS, or MAXIMIZE_CONVERSION_VALUE when conversions carry values",
      -        "enum": [
      -          "MAXIMIZE_CONVERSIONS",
      -          "MAXIMIZE_CONVERSION_VALUE"
      -        ],
      -        "type": "string"
      -      },
      -      "business_name": {
      -        "description": "The advertiser's name, at most 25 characters (linked to the campaign, per Google's brand guidelines)",
      -        "maxLength": 25,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "daily_budget": {
      -        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "end_date": {
      -        "description": "Last day the campaign runs, YYYY-MM-DD",
      -        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [
      -          "1000"
      -        ],
      -        "description": "Google language ids, e.g. 1000 English",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [
      -          "2840"
      -        ],
      -        "description": "Google geo target ids, e.g. 2840 United States",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "logo_images": {
      -        "description": "1 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128), linked to the campaign",
      -        "items": {
      -          "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      -          "maxLength": 2048,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "maxItems": 5,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "name": {
      -        "description": "Campaign name; must not match an existing campaign",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "target_cpa": {
      -        "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "create_performance_max_campaign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "daily_budget",
      -      "business_name",
      -      "logo_images",
      -      "asset_groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add an ad group, with its keywords and ads, to an existing Search campaign",
      -    "properties": {
      -      "ad_group": {
      -        "properties": {
      -          "ads": {
      -            "items": {
      -              "description": "A responsive search ad",
      -              "properties": {
      -                "descriptions": {
      -                  "description": "2 to 4 descriptions, each at most 90 characters",
      -                  "items": {
      -                    "maxLength": 90,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "maxItems": 4,
      -                  "minItems": 2,
      -                  "type": "array"
      -                },
      -                "final_url": {
      -                  "description": "The landing page",
      -                  "maxLength": 2048,
      -                  "pattern": "^https?:\\/\\/",
      -                  "type": "string"
      -                },
      -                "headlines": {
      -                  "description": "3 to 15 headlines, each at most 30 characters",
      -                  "items": {
      -                    "maxLength": 30,
      -                    "minLength": 1,
      -                    "type": "string"
      -                  },
      -                  "maxItems": 15,
      -                  "minItems": 3,
      -                  "type": "array"
      -                },
      -                "path1": {
      -                  "description": "Display path part 1, at most 15 characters",
      -                  "maxLength": 15,
      -                  "minLength": 1,
      -                  "type": "string"
      -                },
      -                "path2": {
      -                  "description": "Display path part 2, at most 15 characters",
      -                  "maxLength": 15,
      -                  "minLength": 1,
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "headlines",
      -                "descriptions",
      -                "final_url"
      -              ],
      -              "type": "object"
      -            },
      -            "maxItems": 3,
      -            "minItems": 1,
      -            "type": "array"
      -          },
      -          "default_max_cpc": {
      -            "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)",
      -            "exclusiveMinimum": 0,
      -            "maximum": 1000,
      -            "type": "number"
      -          },
      -          "keywords": {
      -            "items": {
      -              "properties": {
      -                "match_type": {
      -                  "description": "PHRASE matches searches containing the words in order; the usual choice",
      -                  "enum": [
      -                    "EXACT",
      -                    "PHRASE",
      -                    "BROAD"
      -                  ],
      -                  "type": "string"
      -                },
      -                "max_cpc": {
      -                  "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      -                  "exclusiveMinimum": 0,
      -                  "maximum": 1000,
      -                  "type": "number"
      -                },
      -                "text": {
      -                  "description": "The keyword, e.g. \"cleaning invoice template\"",
      -                  "maxLength": 80,
      -                  "minLength": 1,
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "text",
      -                "match_type"
      -              ],
      -              "type": "object"
      -            },
      -            "maxItems": 50,
      -            "minItems": 1,
      -            "type": "array"
      -          },
      -          "name": {
      -            "maxLength": 255,
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "name",
      -          "keywords",
      -          "ads"
      -        ],
      -        "type": "object"
      -      },
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "add_ad_group",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "ad_group"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add keywords to an existing ad group",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "keywords": {
      -        "items": {
      -          "properties": {
      -            "match_type": {
      -              "description": "PHRASE matches searches containing the words in order; the usual choice",
      -              "enum": [
      -                "EXACT",
      -                "PHRASE",
      -                "BROAD"
      -              ],
      -              "type": "string"
      -            },
      -            "max_cpc": {
      -              "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      -              "exclusiveMinimum": 0,
      -              "maximum": 1000,
      -              "type": "number"
      -            },
      -            "text": {
      -              "description": "The keyword, e.g. \"cleaning invoice template\"",
      -              "maxLength": 80,
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "match_type"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 50,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "add_keywords",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "keywords"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add a responsive search ad to an existing ad group",
      -    "properties": {
      -      "ad": {
      -        "description": "A responsive search ad",
      -        "properties": {
      -          "descriptions": {
      -            "description": "2 to 4 descriptions, each at most 90 characters",
      -            "items": {
      -              "maxLength": 90,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "maxItems": 4,
      -            "minItems": 2,
      -            "type": "array"
      -          },
      -          "final_url": {
      -            "description": "The landing page",
      -            "maxLength": 2048,
      -            "pattern": "^https?:\\/\\/",
      -            "type": "string"
      -          },
      -          "headlines": {
      -            "description": "3 to 15 headlines, each at most 30 characters",
      -            "items": {
      -              "maxLength": 30,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "maxItems": 15,
      -            "minItems": 3,
      -            "type": "array"
      -          },
      -          "path1": {
      -            "description": "Display path part 1, at most 15 characters",
      -            "maxLength": 15,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "path2": {
      -            "description": "Display path part 2, at most 15 characters",
      -            "maxLength": 15,
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "headlines",
      -          "descriptions",
      -          "final_url"
      -        ],
      -        "type": "object"
      -      },
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "add_responsive_search_ad",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "ad"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add sitelinks to a campaign",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "sitelinks": {
      -        "items": {
      -          "properties": {
      -            "description1": {
      -              "description": "At most 35 characters; give both descriptions or neither",
      -              "maxLength": 35,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "description2": {
      -              "maxLength": 35,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "Link text, at most 25 characters",
      -              "maxLength": 25,
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "url": {
      -              "maxLength": 2048,
      -              "pattern": "^https?:\\/\\/",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text",
      -            "url"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 8,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "add_sitelinks",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "sitelinks"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "category": {
      -        "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)",
      -        "pattern": "^[A-Z_]+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "set_conversion_goal",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "category"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Change one keyword's max CPC (manual CPC campaigns)",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "criterion_id": {
      -        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "max_cpc": {
      -        "anyOf": [
      -          {
      -            "exclusiveMinimum": 0,
      -            "maximum": 1000,
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid"
      -      },
      -      "type": {
      -        "const": "set_keyword_bid",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "criterion_id",
      -      "max_cpc"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Change an ad group's default max CPC, which its keywords use unless they have their own",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "max_cpc": {
      -        "description": "New default max cost per click for the ad group",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "set_ad_group_bid",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "max_cpc"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Pause one ad",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "ad_id": {
      -        "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pause_ad",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "ad_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Re-enable one paused ad",
      -    "properties": {
      -      "ad_group_id": {
      -        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "ad_id": {
      -        "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "enable_ad",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "ad_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Add locations and/or languages a campaign targets",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [],
      -        "description": "Language ids to add, e.g. 1000 English",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [],
      -        "description": "Geo target ids to add, e.g. 2840 United States",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "add_campaign_targeting",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Stop targeting some of a campaign's locations and/or languages",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "language_ids": {
      -        "default": [],
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 20,
      -        "type": "array"
      -      },
      -      "location_ids": {
      -        "default": [],
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "remove_campaign_targeting",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "presence_only": {
      -        "description": "true: only people IN the locations; false: also people interested in them",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "const": "set_location_mode",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "presence_only"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Switch ONE campaign's bid strategy. A campaign on a shared (portfolio) strategy moves off it onto its own; the other campaigns on the shared strategy keep it. To change the shared strategy for every campaign on it, use set_shared_bid_strategy. If the user didn't say which they mean, ask. Google re-learns after a switch, so performance can wobble for a week or two",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "strategy": {
      -        "enum": [
      -          "MANUAL_CPC",
      -          "MAXIMIZE_CLICKS",
      -          "MAXIMIZE_CONVERSIONS"
      -        ],
      -        "type": "string"
      -      },
      -      "target_cpa": {
      -        "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "set_bidding_strategy",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "strategy"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Change a shared (portfolio) bid strategy's targets. This changes EVERY campaign on it, which the proposal lists. Its type can't be changed; to move one campaign to another strategy, use set_bidding_strategy",
      -    "properties": {
      -      "bidding_strategy_id": {
      -        "description": "Shared (portfolio) strategy id: bidding_strategy.id from run_gaql, or the id at the end of campaign.bidding_strategy",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "The most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "target_cpa": {
      -        "description": "Target cost per conversion (TARGET_CPA and MAXIMIZE_CONVERSIONS strategies)",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "target_roas": {
      -        "description": "Target return on ad spend as a ratio, e.g. 4 = 400% (TARGET_ROAS and MAXIMIZE_CONVERSION_VALUE)",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "set_shared_bid_strategy",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "bidding_strategy_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Create a shared (portfolio) bid strategy, optionally moving campaigns onto it. Undo moves those campaigns back and removes it",
      -    "properties": {
      -      "campaign_ids": {
      -        "default": [],
      -        "description": "Campaigns to move onto it in the same step (each leaves its current strategy)",
      -        "items": {
      -          "pattern": "^\\d+$",
      -          "type": "string"
      -        },
      -        "maxItems": 50,
      -        "type": "array"
      -      },
      -      "max_cpc_ceiling": {
      -        "description": "The most Google may bid per click",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "name": {
      -        "description": "Name for the shared strategy; must not match an existing one",
      -        "maxLength": 255,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "strategy": {
      -        "enum": [
      -          "MAXIMIZE_CLICKS",
      -          "MAXIMIZE_CONVERSIONS",
      -          "MAXIMIZE_CONVERSION_VALUE",
      -          "TARGET_CPA",
      -          "TARGET_ROAS"
      -        ],
      -        "type": "string"
      -      },
      -      "target_cpa": {
      -        "description": "Target cost per conversion: required for TARGET_CPA, optional for MAXIMIZE_CONVERSIONS",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "target_roas": {
      -        "description": "Target return on ad spend as a ratio, e.g. 4 = 400%: required for TARGET_ROAS, optional for MAXIMIZE_CONVERSION_VALUE",
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000,
      -        "type": "number"
      -      },
      -      "type": {
      -        "const": "create_shared_bid_strategy",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "strategy"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)",
      -    "properties": {
      -      "campaign_id": {
      -        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "suffix": {
      -        "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it",
      -        "maxLength": 1000,
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "set_url_suffix",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "suffix"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Create a conversion action to measure sign-ups, leads or purchases",
      -    "properties": {
      -      "category": {
      -        "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)",
      -        "pattern": "^[A-Z_]+$",
      -        "type": "string"
      -      },
      -      "counting": {
      -        "default": "ONE_PER_CLICK",
      -        "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases",
      -        "enum": [
      -          "ONE_PER_CLICK",
      -          "MANY_PER_CLICK"
      -        ],
      -        "type": "string"
      -      },
      -      "default_value": {
      -        "description": "Value per conversion when none is sent",
      -        "maximum": 1000000,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "name": {
      -        "maxLength": 100,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "primary": {
      -        "default": true,
      -        "description": "Primary actions count in Conversions and can steer bidding",
      -        "type": "boolean"
      -      },
      -      "source": {
      -        "default": "UPLOAD_CLICKS",
      -        "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page",
      -        "enum": [
      -          "UPLOAD_CLICKS",
      -          "WEBPAGE"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "create_conversion_action",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "name",
      -      "category"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Set how many conversions one ad click can produce for a conversion action",
      -    "properties": {
      -      "conversion_action_id": {
      -        "description": "conversion_action.id from run_gaql",
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "counting": {
      -        "enum": [
      -          "ONE_PER_CLICK",
      -          "MANY_PER_CLICK"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "set_conversion_counting",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "conversion_action_id",
      -      "counting"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "description": "Block searches containing these words in one campaign",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "keywords": {
      +        "items": {
      +          "properties": {
      +            "match_type": {
      +              "description": "PHRASE blocks any search containing the words in order; the usual choice",
      +              "enum": [
      +                "EXACT",
      +                "PHRASE",
      +                "BROAD"
      +              ],
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "The search words to block, e.g. \"free\"",
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "match_type"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "add_negative_keywords",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "keywords"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Pause one keyword",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "criterion_id": {
      +        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pause_keyword",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "criterion_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Re-enable one paused keyword",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "criterion_id": {
      +        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "enable_keyword",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "criterion_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Pause a whole campaign (stops all its spend)",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pause_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Turn a paused campaign back on. It starts spending again; the summary says how much",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "enable_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Pause one ad group",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pause_ad_group",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Re-enable one paused ad group",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "enable_ad_group",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Change a campaign's daily budget (not shared budgets)",
      +    "properties": {
      +      "amount": {
      +        "description": "New average daily budget in the account's currency, e.g. 10 for $10.00/day (not micros)",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "set_daily_budget",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "amount"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Set the last day a campaign runs, so it stops spending on its own",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "end_date": {
      +        "anyOf": [
      +          {
      +            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +            "type": "string"
      +          },
      +          {
      +            "const": "none",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Last day the campaign runs, YYYY-MM-DD in the account's time zone (it stops after 23:59:59 that day), or \"none\" to remove the end date"
      +      },
      +      "type": {
      +        "const": "set_end_date",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "end_date"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Build a new Search campaign with its ad groups, keywords, ads, targeting, negatives and sitelinks, in one step. It is created PAUSED: nothing spends until a separate enable_campaign",
      +    "properties": {
      +      "ad_groups": {
      +        "items": {
      +          "properties": {
      +            "ads": {
      +              "items": {
      +                "description": "A responsive search ad",
      +                "properties": {
      +                  "descriptions": {
      +                    "description": "2 to 4 descriptions, each at most 90 characters",
      +                    "items": {
      +                      "maxLength": 90,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 4,
      +                    "minItems": 2,
      +                    "type": "array"
      +                  },
      +                  "final_url": {
      +                    "description": "The landing page",
      +                    "maxLength": 2048,
      +                    "pattern": "^https?:\\/\\/",
      +                    "type": "string"
      +                  },
      +                  "headlines": {
      +                    "description": "3 to 15 headlines, each at most 30 characters",
      +                    "items": {
      +                      "maxLength": 30,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 15,
      +                    "minItems": 3,
      +                    "type": "array"
      +                  },
      +                  "path1": {
      +                    "description": "Display path part 1, at most 15 characters",
      +                    "maxLength": 15,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "path2": {
      +                    "description": "Display path part 2, at most 15 characters",
      +                    "maxLength": 15,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "headlines",
      +                  "descriptions",
      +                  "final_url"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 3,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "default_max_cpc": {
      +              "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)",
      +              "exclusiveMinimum": 0,
      +              "maximum": 1000,
      +              "type": "number"
      +            },
      +            "keywords": {
      +              "items": {
      +                "properties": {
      +                  "match_type": {
      +                    "description": "PHRASE matches searches containing the words in order; the usual choice",
      +                    "enum": [
      +                      "EXACT",
      +                      "PHRASE",
      +                      "BROAD"
      +                    ],
      +                    "type": "string"
      +                  },
      +                  "max_cpc": {
      +                    "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      +                    "exclusiveMinimum": 0,
      +                    "maximum": 1000,
      +                    "type": "number"
      +                  },
      +                  "text": {
      +                    "description": "The keyword, e.g. \"cleaning invoice template\"",
      +                    "maxLength": 80,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "text",
      +                  "match_type"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 50,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "name": {
      +              "maxLength": 255,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "keywords",
      +            "ads"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 10,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "bidding": {
      +        "default": "MANUAL_CPC",
      +        "description": "MANUAL_CPC uses the ad group and keyword max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget",
      +        "enum": [
      +          "MANUAL_CPC",
      +          "MAXIMIZE_CLICKS",
      +          "MAXIMIZE_CONVERSIONS"
      +        ],
      +        "type": "string"
      +      },
      +      "daily_budget": {
      +        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "end_date": {
      +        "description": "Last day the campaign runs, YYYY-MM-DD",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [
      +          "1000"
      +        ],
      +        "description": "Google language ids, e.g. 1000 English, 1003 Spanish",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [
      +          "2840"
      +        ],
      +        "description": "Google geo target ids, e.g. 2840 United States, 2826 United Kingdom, 2124 Canada (look others up in geo_target_constant)",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "name": {
      +        "description": "Campaign name; must not match an existing campaign",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "negative_keywords": {
      +        "default": [],
      +        "description": "Searches to block across the campaign",
      +        "items": {
      +          "properties": {
      +            "match_type": {
      +              "enum": [
      +                "EXACT",
      +                "PHRASE",
      +                "BROAD"
      +              ],
      +              "type": "string"
      +            },
      +            "text": {
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "match_type"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 200,
      +        "type": "array"
      +      },
      +      "presence_only": {
      +        "default": true,
      +        "description": "Show ads only to people IN the locations (true), not merely interested in them",
      +        "type": "boolean"
      +      },
      +      "search_partners": {
      +        "default": false,
      +        "description": "Also show on Google's search partner sites",
      +        "type": "boolean"
      +      },
      +      "sitelinks": {
      +        "default": [],
      +        "items": {
      +          "properties": {
      +            "description1": {
      +              "description": "At most 35 characters; give both descriptions or neither",
      +              "maxLength": 35,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "description2": {
      +              "maxLength": 35,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "Link text, at most 25 characters",
      +              "maxLength": 25,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "url": {
      +              "maxLength": 2048,
      +              "pattern": "^https?:\\/\\/",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "url"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 8,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "create_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "daily_budget",
      +      "ad_groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Build a new Display campaign (image ads across Google's Display Network of sites and apps) with ad groups and responsive display ads. Google's optimized targeting finds the audience. It is created PAUSED: nothing spends until a separate enable_campaign",
      +    "properties": {
      +      "ad_groups": {
      +        "items": {
      +          "properties": {
      +            "ads": {
      +              "items": {
      +                "description": "A responsive display ad: Google assembles ads from these headlines, descriptions and images",
      +                "properties": {
      +                  "business_name": {
      +                    "description": "The advertiser's name, at most 25 characters",
      +                    "maxLength": 25,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "descriptions": {
      +                    "description": "1 to 5 descriptions, each at most 90 characters",
      +                    "items": {
      +                      "maxLength": 90,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "final_url": {
      +                    "description": "The landing page",
      +                    "maxLength": 2048,
      +                    "pattern": "^https?:\\/\\/",
      +                    "type": "string"
      +                  },
      +                  "headlines": {
      +                    "description": "1 to 5 short headlines, each at most 30 characters",
      +                    "items": {
      +                      "maxLength": 30,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "logo_images": {
      +                    "default": [],
      +                    "description": "0 to 5 landscape logos, 4:1 (e.g. 1200×300, at least 512×128)",
      +                    "items": {
      +                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                      "maxLength": 2048,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 0,
      +                    "type": "array"
      +                  },
      +                  "long_headline": {
      +                    "description": "One long headline, at most 90 characters",
      +                    "maxLength": 90,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "marketing_images": {
      +                    "description": "1 to 15 landscape images, 1.91:1 (e.g. 1200×628, at least 600×314)",
      +                    "items": {
      +                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                      "maxLength": 2048,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 15,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "square_logo_images": {
      +                    "default": [],
      +                    "description": "0 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128)",
      +                    "items": {
      +                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                      "maxLength": 2048,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 0,
      +                    "type": "array"
      +                  },
      +                  "square_marketing_images": {
      +                    "description": "1 to 15 square images, 1:1 (e.g. 1200×1200, at least 300×300)",
      +                    "items": {
      +                      "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                      "maxLength": 2048,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 15,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  }
      +                },
      +                "required": [
      +                  "headlines",
      +                  "long_headline",
      +                  "descriptions",
      +                  "business_name",
      +                  "final_url",
      +                  "marketing_images",
      +                  "square_marketing_images"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 3,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "default_max_cpc": {
      +              "description": "Default max cost per click (required when the campaign uses manual CPC)",
      +              "exclusiveMinimum": 0,
      +              "maximum": 1000,
      +              "type": "number"
      +            },
      +            "name": {
      +              "maxLength": 255,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "ads"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 5,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "bidding": {
      +        "default": "MAXIMIZE_CLICKS",
      +        "description": "MANUAL_CPC uses the ad groups' max CPCs; MAXIMIZE_CLICKS and MAXIMIZE_CONVERSIONS let Google bid within the budget",
      +        "enum": [
      +          "MANUAL_CPC",
      +          "MAXIMIZE_CLICKS",
      +          "MAXIMIZE_CONVERSIONS"
      +        ],
      +        "type": "string"
      +      },
      +      "daily_budget": {
      +        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "end_date": {
      +        "description": "Last day the campaign runs, YYYY-MM-DD",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [
      +          "1000"
      +        ],
      +        "description": "Google language ids, e.g. 1000 English",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [
      +          "2840"
      +        ],
      +        "description": "Google geo target ids, e.g. 2840 United States",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "name": {
      +        "description": "Campaign name; must not match an existing campaign",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "presence_only": {
      +        "default": true,
      +        "description": "Show ads only to people IN the locations (true), not merely interested in them",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "create_display_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "daily_budget",
      +      "ad_groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Build a new Demand Gen campaign with YouTube video ads, which is how to advertise on YouTube through the API (Google doesn't allow creating Video campaigns there). It is created PAUSED: nothing spends until a separate enable_campaign",
      +    "properties": {
      +      "ad_groups": {
      +        "items": {
      +          "properties": {
      +            "ads": {
      +              "items": {
      +                "description": "A Demand Gen video ad: runs on YouTube (in-stream, in-feed and Shorts), Discover and Gmail",
      +                "properties": {
      +                  "business_name": {
      +                    "description": "The advertiser's name, at most 25 characters",
      +                    "maxLength": 25,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "descriptions": {
      +                    "description": "1 to 5 descriptions, each at most 90 characters",
      +                    "items": {
      +                      "maxLength": 90,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "final_url": {
      +                    "description": "The landing page",
      +                    "maxLength": 2048,
      +                    "pattern": "^https?:\\/\\/",
      +                    "type": "string"
      +                  },
      +                  "headlines": {
      +                    "description": "1 to 5 headlines, each at most 40 characters",
      +                    "items": {
      +                      "maxLength": 40,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "logo_image": {
      +                    "description": "A square 1:1 logo (e.g. 1200×1200, at least 128×128): an https URL, or an image asset id from the account",
      +                    "maxLength": 2048,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "long_headlines": {
      +                    "description": "1 to 5 long headlines, each at most 90 characters",
      +                    "items": {
      +                      "maxLength": 90,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "videos": {
      +                    "description": "1 to 5 YouTube videos",
      +                    "items": {
      +                      "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted",
      +                      "maxLength": 200,
      +                      "minLength": 1,
      +                      "type": "string"
      +                    },
      +                    "maxItems": 5,
      +                    "minItems": 1,
      +                    "type": "array"
      +                  }
      +                },
      +                "required": [
      +                  "videos",
      +                  "headlines",
      +                  "long_headlines",
      +                  "descriptions",
      +                  "business_name",
      +                  "logo_image",
      +                  "final_url"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 3,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "language_ids": {
      +              "default": [
      +                "1000"
      +              ],
      +              "description": "Google language ids, e.g. 1000 English",
      +              "items": {
      +                "pattern": "^\\d+$",
      +                "type": "string"
      +              },
      +              "maxItems": 20,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "location_ids": {
      +              "default": [
      +                "2840"
      +              ],
      +              "description": "Google geo target ids, e.g. 2840 United States (Demand Gen targets locations per ad group, not per campaign)",
      +              "items": {
      +                "pattern": "^\\d+$",
      +                "type": "string"
      +              },
      +              "maxItems": 50,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "name": {
      +              "maxLength": 255,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "ads"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 5,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "bidding": {
      +        "default": "MAXIMIZE_CONVERSIONS",
      +        "description": "Demand Gen bids automatically: MAXIMIZE_CONVERSIONS (needs conversion tracking) or MAXIMIZE_CLICKS",
      +        "enum": [
      +          "MAXIMIZE_CONVERSIONS",
      +          "MAXIMIZE_CLICKS"
      +        ],
      +        "type": "string"
      +      },
      +      "daily_budget": {
      +        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "end_date": {
      +        "description": "Last day the campaign runs, YYYY-MM-DD",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Campaign name; must not match an existing campaign",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "create_demand_gen_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "daily_budget",
      +      "ad_groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Build a new Performance Max campaign: one budget, Google places ads across Search, YouTube, Display, Discover, Gmail and Maps from the asset groups' text, images and videos. No shopping feed (non-retail). It is created PAUSED: nothing spends until a separate enable_campaign",
      +    "properties": {
      +      "asset_groups": {
      +        "items": {
      +          "description": "An asset group: the headlines, descriptions, images and videos Google combines into ads on every channel",
      +          "properties": {
      +            "descriptions": {
      +              "description": "2 to 5 descriptions, each at most 90 characters; Google recommends one of 60 or fewer",
      +              "items": {
      +                "maxLength": 90,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 5,
      +              "minItems": 2,
      +              "type": "array"
      +            },
      +            "final_url": {
      +              "description": "The landing page (Google may also send people to other pages on the same site)",
      +              "maxLength": 2048,
      +              "pattern": "^https?:\\/\\/",
      +              "type": "string"
      +            },
      +            "headlines": {
      +              "description": "3 to 15 headlines, each at most 30 characters",
      +              "items": {
      +                "maxLength": 30,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 15,
      +              "minItems": 3,
      +              "type": "array"
      +            },
      +            "long_headlines": {
      +              "description": "1 to 5 long headlines, each at most 90 characters",
      +              "items": {
      +                "maxLength": 90,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 5,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "marketing_images": {
      +              "description": "1 to 20 landscape images, 1.91:1 (e.g. 1200×628)",
      +              "items": {
      +                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                "maxLength": 2048,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 20,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "name": {
      +              "maxLength": 255,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "portrait_marketing_images": {
      +              "default": [],
      +              "description": "0 to 20 portrait images, 4:5 (e.g. 960×1200)",
      +              "items": {
      +                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                "maxLength": 2048,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 20,
      +              "minItems": 0,
      +              "type": "array"
      +            },
      +            "square_marketing_images": {
      +              "description": "1 to 20 square images, 1:1 (e.g. 1200×1200)",
      +              "items": {
      +                "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +                "maxLength": 2048,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 20,
      +              "minItems": 1,
      +              "type": "array"
      +            },
      +            "videos": {
      +              "default": [],
      +              "description": "0 to 5 YouTube videos; without one, Google may auto-generate a video from the images",
      +              "items": {
      +                "description": "A YouTube video id (e.g. dQw4w9WgXcQ) or its youtube.com / youtu.be URL. The video must be public or unlisted",
      +                "maxLength": 200,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 5,
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "final_url",
      +            "headlines",
      +            "long_headlines",
      +            "descriptions",
      +            "marketing_images",
      +            "square_marketing_images"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 5,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "bidding": {
      +        "default": "MAXIMIZE_CONVERSIONS",
      +        "description": "Performance Max bids for conversions only: MAXIMIZE_CONVERSIONS, or MAXIMIZE_CONVERSION_VALUE when conversions carry values",
      +        "enum": [
      +          "MAXIMIZE_CONVERSIONS",
      +          "MAXIMIZE_CONVERSION_VALUE"
      +        ],
      +        "type": "string"
      +      },
      +      "business_name": {
      +        "description": "The advertiser's name, at most 25 characters (linked to the campaign, per Google's brand guidelines)",
      +        "maxLength": 25,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "daily_budget": {
      +        "description": "Average daily budget in the account's currency, e.g. 20 for $20.00/day",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000000,
      +        "type": "number"
      +      },
      +      "end_date": {
      +        "description": "Last day the campaign runs, YYYY-MM-DD",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [
      +          "1000"
      +        ],
      +        "description": "Google language ids, e.g. 1000 English",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [
      +          "2840"
      +        ],
      +        "description": "Google geo target ids, e.g. 2840 United States",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "logo_images": {
      +        "description": "1 to 5 square logos, 1:1 (e.g. 1200×1200, at least 128×128), linked to the campaign",
      +        "items": {
      +          "description": "An https URL of a PNG, JPEG or GIF (at most 5120 KB), or the id of an image asset already in the account (asset.id from run_gaql WHERE asset.type = 'IMAGE')",
      +          "maxLength": 2048,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 5,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "name": {
      +        "description": "Campaign name; must not match an existing campaign",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "target_cpa": {
      +        "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "create_performance_max_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "daily_budget",
      +      "business_name",
      +      "logo_images",
      +      "asset_groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add an ad group, with its keywords and ads, to an existing Search campaign",
      +    "properties": {
      +      "ad_group": {
      +        "properties": {
      +          "ads": {
      +            "items": {
      +              "description": "A responsive search ad",
      +              "properties": {
      +                "descriptions": {
      +                  "description": "2 to 4 descriptions, each at most 90 characters",
      +                  "items": {
      +                    "maxLength": 90,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "maxItems": 4,
      +                  "minItems": 2,
      +                  "type": "array"
      +                },
      +                "final_url": {
      +                  "description": "The landing page",
      +                  "maxLength": 2048,
      +                  "pattern": "^https?:\\/\\/",
      +                  "type": "string"
      +                },
      +                "headlines": {
      +                  "description": "3 to 15 headlines, each at most 30 characters",
      +                  "items": {
      +                    "maxLength": 30,
      +                    "minLength": 1,
      +                    "type": "string"
      +                  },
      +                  "maxItems": 15,
      +                  "minItems": 3,
      +                  "type": "array"
      +                },
      +                "path1": {
      +                  "description": "Display path part 1, at most 15 characters",
      +                  "maxLength": 15,
      +                  "minLength": 1,
      +                  "type": "string"
      +                },
      +                "path2": {
      +                  "description": "Display path part 2, at most 15 characters",
      +                  "maxLength": 15,
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "headlines",
      +                "descriptions",
      +                "final_url"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 3,
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "default_max_cpc": {
      +            "description": "Default max cost per click for the ad group (required when the campaign uses manual CPC)",
      +            "exclusiveMinimum": 0,
      +            "maximum": 1000,
      +            "type": "number"
      +          },
      +          "keywords": {
      +            "items": {
      +              "properties": {
      +                "match_type": {
      +                  "description": "PHRASE matches searches containing the words in order; the usual choice",
      +                  "enum": [
      +                    "EXACT",
      +                    "PHRASE",
      +                    "BROAD"
      +                  ],
      +                  "type": "string"
      +                },
      +                "max_cpc": {
      +                  "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      +                  "exclusiveMinimum": 0,
      +                  "maximum": 1000,
      +                  "type": "number"
      +                },
      +                "text": {
      +                  "description": "The keyword, e.g. \"cleaning invoice template\"",
      +                  "maxLength": 80,
      +                  "minLength": 1,
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "text",
      +                "match_type"
      +              ],
      +              "type": "object"
      +            },
      +            "maxItems": 50,
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "name": {
      +            "maxLength": 255,
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "name",
      +          "keywords",
      +          "ads"
      +        ],
      +        "type": "object"
      +      },
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "add_ad_group",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "ad_group"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add keywords to an existing ad group",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "keywords": {
      +        "items": {
      +          "properties": {
      +            "match_type": {
      +              "description": "PHRASE matches searches containing the words in order; the usual choice",
      +              "enum": [
      +                "EXACT",
      +                "PHRASE",
      +                "BROAD"
      +              ],
      +              "type": "string"
      +            },
      +            "max_cpc": {
      +              "description": "Max cost per click for this keyword in the account's currency (manual CPC only); omit to use the ad group's",
      +              "exclusiveMinimum": 0,
      +              "maximum": 1000,
      +              "type": "number"
      +            },
      +            "text": {
      +              "description": "The keyword, e.g. \"cleaning invoice template\"",
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "match_type"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "add_keywords",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "keywords"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add a responsive search ad to an existing ad group",
      +    "properties": {
      +      "ad": {
      +        "description": "A responsive search ad",
      +        "properties": {
      +          "descriptions": {
      +            "description": "2 to 4 descriptions, each at most 90 characters",
      +            "items": {
      +              "maxLength": 90,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "maxItems": 4,
      +            "minItems": 2,
      +            "type": "array"
      +          },
      +          "final_url": {
      +            "description": "The landing page",
      +            "maxLength": 2048,
      +            "pattern": "^https?:\\/\\/",
      +            "type": "string"
      +          },
      +          "headlines": {
      +            "description": "3 to 15 headlines, each at most 30 characters",
      +            "items": {
      +              "maxLength": 30,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "maxItems": 15,
      +            "minItems": 3,
      +            "type": "array"
      +          },
      +          "path1": {
      +            "description": "Display path part 1, at most 15 characters",
      +            "maxLength": 15,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "path2": {
      +            "description": "Display path part 2, at most 15 characters",
      +            "maxLength": 15,
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "headlines",
      +          "descriptions",
      +          "final_url"
      +        ],
      +        "type": "object"
      +      },
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "add_responsive_search_ad",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "ad"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add sitelinks to a campaign",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "sitelinks": {
      +        "items": {
      +          "properties": {
      +            "description1": {
      +              "description": "At most 35 characters; give both descriptions or neither",
      +              "maxLength": 35,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "description2": {
      +              "maxLength": 35,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "Link text, at most 25 characters",
      +              "maxLength": 25,
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "url": {
      +              "maxLength": 2048,
      +              "pattern": "^https?:\\/\\/",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "url"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 8,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "add_sitelinks",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "sitelinks"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Make a campaign count and bid on ONE conversion category only (e.g. SIGNUP), so another product's or step's conversions don't steer it",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "category": {
      +        "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)",
      +        "pattern": "^[A-Z_]+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "set_conversion_goal",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "category"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Change one keyword's max CPC (manual CPC campaigns)",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "criterion_id": {
      +        "description": "Keyword criterion id, digits only (ad_group_criterion.criterion_id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "max_cpc": {
      +        "anyOf": [
      +          {
      +            "exclusiveMinimum": 0,
      +            "maximum": 1000,
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "New max cost per click for this keyword, or null to clear it so the keyword uses the ad group's bid"
      +      },
      +      "type": {
      +        "const": "set_keyword_bid",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "criterion_id",
      +      "max_cpc"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Change an ad group's default max CPC, which its keywords use unless they have their own",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "max_cpc": {
      +        "description": "New default max cost per click for the ad group",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "set_ad_group_bid",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "max_cpc"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Pause one ad",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "ad_id": {
      +        "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pause_ad",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "ad_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Re-enable one paused ad",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Ad group id, digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "ad_id": {
      +        "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "enable_ad",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "ad_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add locations and/or languages a campaign targets",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [],
      +        "description": "Language ids to add, e.g. 1000 English",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [],
      +        "description": "Geo target ids to add, e.g. 2840 United States",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "add_campaign_targeting",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Stop targeting some of a campaign's locations and/or languages",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "language_ids": {
      +        "default": [],
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "location_ids": {
      +        "default": [],
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "remove_campaign_targeting",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Choose whether a campaign shows to people in its locations only, or also to people interested in them",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "presence_only": {
      +        "description": "true: only people IN the locations; false: also people interested in them",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "set_location_mode",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "presence_only"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Switch ONE campaign's bid strategy. A campaign on a shared (portfolio) strategy moves off it onto its own; the other campaigns on the shared strategy keep it. To change the shared strategy for every campaign on it, use set_shared_bid_strategy. If the user didn't say which they mean, ask. Google re-learns after a switch, so performance can wobble for a week or two",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "MAXIMIZE_CLICKS only: the most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "strategy": {
      +        "enum": [
      +          "MANUAL_CPC",
      +          "MAXIMIZE_CLICKS",
      +          "MAXIMIZE_CONVERSIONS"
      +        ],
      +        "type": "string"
      +      },
      +      "target_cpa": {
      +        "description": "MAXIMIZE_CONVERSIONS only: target cost per conversion",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "set_bidding_strategy",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "strategy"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Change a shared (portfolio) bid strategy's targets. This changes EVERY campaign on it, which the proposal lists. Its type can't be changed; to move one campaign to another strategy, use set_bidding_strategy",
      +    "properties": {
      +      "bidding_strategy_id": {
      +        "description": "Shared (portfolio) strategy id: bidding_strategy.id from run_gaql, or the id at the end of campaign.bidding_strategy",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "The most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "target_cpa": {
      +        "description": "Target cost per conversion (TARGET_CPA and MAXIMIZE_CONVERSIONS strategies)",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "target_roas": {
      +        "description": "Target return on ad spend as a ratio, e.g. 4 = 400% (TARGET_ROAS and MAXIMIZE_CONVERSION_VALUE)",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "set_shared_bid_strategy",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "bidding_strategy_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Create a shared (portfolio) bid strategy, optionally moving campaigns onto it. Undo moves those campaigns back and removes it",
      +    "properties": {
      +      "campaign_ids": {
      +        "default": [],
      +        "description": "Campaigns to move onto it in the same step (each leaves its current strategy)",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "max_cpc_ceiling": {
      +        "description": "The most Google may bid per click",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "name": {
      +        "description": "Name for the shared strategy; must not match an existing one",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "strategy": {
      +        "enum": [
      +          "MAXIMIZE_CLICKS",
      +          "MAXIMIZE_CONVERSIONS",
      +          "MAXIMIZE_CONVERSION_VALUE",
      +          "TARGET_CPA",
      +          "TARGET_ROAS"
      +        ],
      +        "type": "string"
      +      },
      +      "target_cpa": {
      +        "description": "Target cost per conversion: required for TARGET_CPA, optional for MAXIMIZE_CONVERSIONS",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "target_roas": {
      +        "description": "Target return on ad spend as a ratio, e.g. 4 = 400%: required for TARGET_ROAS, optional for MAXIMIZE_CONVERSION_VALUE",
      +        "exclusiveMinimum": 0,
      +        "maximum": 1000,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "create_shared_bid_strategy",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "strategy"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Set or clear a campaign's final URL suffix (tracking parameters on every ad click)",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Campaign id, digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "suffix": {
      +        "description": "Query string Google appends to every landing page in the campaign, e.g. \"utm_source=google&utm_medium=cpc&utm_term={keyword}\", or \"none\" to clear it",
      +        "maxLength": 1000,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "set_url_suffix",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "suffix"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Create a conversion action to measure sign-ups, leads or purchases",
      +    "properties": {
      +      "category": {
      +        "description": "Conversion category, e.g. SIGNUP, PURCHASE, SUBMIT_LEAD_FORM, QUALIFIED_LEAD (see conversion_action.category in run_gaql)",
      +        "pattern": "^[A-Z_]+$",
      +        "type": "string"
      +      },
      +      "counting": {
      +        "default": "ONE_PER_CLICK",
      +        "description": "ONE_PER_CLICK for sign-ups and leads; MANY_PER_CLICK for purchases",
      +        "enum": [
      +          "ONE_PER_CLICK",
      +          "MANY_PER_CLICK"
      +        ],
      +        "type": "string"
      +      },
      +      "default_value": {
      +        "description": "Value per conversion when none is sent",
      +        "maximum": 1000000,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "name": {
      +        "maxLength": 100,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "primary": {
      +        "default": true,
      +        "description": "Primary actions count in Conversions and can steer bidding",
      +        "type": "boolean"
      +      },
      +      "source": {
      +        "default": "UPLOAD_CLICKS",
      +        "description": "UPLOAD_CLICKS: your server uploads ad click ids (no Google tag). WEBPAGE: Google gives you a tag to put on the page",
      +        "enum": [
      +          "UPLOAD_CLICKS",
      +          "WEBPAGE"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "create_conversion_action",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "category"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Set how many conversions one ad click can produce for a conversion action",
      +    "properties": {
      +      "conversion_action_id": {
      +        "description": "conversion_action.id from run_gaql",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "counting": {
      +        "enum": [
      +          "ONE_PER_CLICK",
      +          "MANY_PER_CLICK"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "set_conversion_counting",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "conversion_action_id",
      +      "counting"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Import a GA4 key event into Google Ads as a conversion action, so campaigns can count and bid on it. The GA4 property must be linked to this account",
      +    "properties": {
      +      "event_name": {
      +        "description": "The GA4 key event, e.g. generate_lead, purchase, sign_up",
      +        "pattern": "^[A-Za-z][A-Za-z0-9_]{0,39}$",
      +        "type": "string"
      +      },
      +      "primary": {
      +        "default": true,
      +        "description": "Primary actions count in Conversions and can steer bidding",
      +        "type": "boolean"
      +      },
      +      "property_id": {
      +        "description": "GA4 property id (from analytics_properties)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "import_ga4_key_event",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "property_id",
      +      "event_name"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedInput schema / properties / confirm_switch
      Removed value: -{
      -  "description": "Only after the user has agreed to spend their plan's account switch (a call answered \"Account switch:\"). Leave out otherwise",
      -  "type": "boolean"
      -}
  4. Changed1 schema field changedv0.14.1
    • addedInput schema / properties / confirm_switch
      Added value: +{
      +  "description": "Only after the user has agreed to spend their plan's account switch (a call answered \"Account switch:\"). Leave out otherwise",
      +  "type": "boolean"
      +}
  5. First observedv0.11.0

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it discloses the dry-run against the live account, the fact that a proposal record is stored, the 50-change cap with per-keyword counting, and the account-wide EU political advertising declaration blocker with its error code. The 'Nothing is changed' line also reconciles readOnlyHint=false with the user's expectation that no live ads are mutated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first two sentences are tight and front-loaded with the critical 'nothing is changed / approve first' behaviour. The middle sentence, however, is a ~200-word comma-spliced catalogue of operation names ('and building:...', 'and tuning:...') that duplicates the schema and is hard to scan, diluting an otherwise well-structured definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly explains the return value as a plain-English summary with ⚠ lines, and it covers the approval flow and batch limit. The remaining gap is the absence of any mention of the proposal identifier or the follow-up tools (apply_changes, discard_proposal) an agent needs to complete the loop.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the oneOf already enumerates every change type with per-variant descriptions, so the description's long op list mostly restates structured data. The added value is limited to the counting rule for the 50-item cap, and even that is echoed in the changes parameter's schema description. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb chain (checks, dry-runs with Google, stores as a proposal, returns a summary) against a specific resource (Google Ads account changes), and explicitly distinguishes itself from the write path with 'Nothing is changed.' An agent can tell this apart from apply_changes without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operational guidance: show the summary to the user, apply only after approval, surface any ⚠ line, and split anything over 50 changes into several proposals shown together. It never names the sibling tools (apply_changes, discard_proposal) that carry out those next steps, so routing to them is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.