Skip to main content
Glama

Camberstack: Google Ads

Propose Google Ads changes (applies nothing)

propose_changes
Idempotent

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 rather than edit it: 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; and deleting: delete_keyword, delete_ad, delete_ad_group, delete_campaign (ads, ad groups and campaigns can't be undone), delete_negative_keywords, delete_sitelinks; and negatives: add_ad_group_negatives, delete_ad_group_negatives, create_negative_list, edit_negative_list, apply_negative_list, delete_negative_list; and edit_responsive_search_ad, which keeps the ad instead of replacing it; and set_ad_schedule, set_device_bid, add_campaign_assets, delete_campaign_assets, set_ai_max, set_conversion_settings; and create_remarketing_list, set_campaign_audience, act_on_recommendation; and link_merchant_center / unlink_merchant_center (Shopping and Performance Max need the link). 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.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "customer_id": "<customer_id>",
      "changes": "<changes>"
    },
    "name": "propose_changes"
  }
}

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 changed
    • 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": {
      -      "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"
      -  }
      -]New value: +[
      +  {
      +    "description": "Block searches containing these words in one campaign",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "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": "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": "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": "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": "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": "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": "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": "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": "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": "https URL of a PNG, JPEG or GIF (up to 5120 KB), or an image asset.id",
      +                      "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": "https URL of a PNG, JPEG or GIF (up to 5120 KB), or an image asset.id",
      +                      "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": "https URL of a PNG, JPEG or GIF (up to 5120 KB), or an image asset.id",
      +                      "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": "https URL of a PNG, JPEG or GIF (up to 5120 KB), or an image asset.id",
      +                      "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": "https URL of a PNG, JPEG or GIF (up to 5120 KB), or an image asset.id",
      +                "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": "https URL of a PNG, JPEG or GIF (up to 5120 KB), or an image asset.id",
      +                "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": "https URL of a PNG, JPEG or GIF (up to 5120 KB), or an image asset.id",
      +                "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": "https URL of a PNG, JPEG or GIF (up to 5120 KB), or an image asset.id",
      +          "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": "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": "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"
      +      },
      +      "request_review": {
      +        "description": "Only after Google refused a keyword as exemptible and the user says it complies: the policy and flagged text from the refusal",
      +        "items": {
      +          "properties": {
      +            "policy_name": {
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "violating_text": {
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "policy_name",
      +            "violating_text"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 10,
      +        "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": "Digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "request_review_topics": {
      +        "description": "Only after Google refused this and the user says it complies: the topics from the refusal, which asks Google to review it. PROHIBITED topics can't be",
      +        "items": {
      +          "maxLength": 100,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 10,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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"
      +  },
      +  {
      +    "description": "Delete one keyword. Undo adds it back with its history",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "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": "delete_keyword",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "criterion_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Delete one ad. Permanent, with no undo: say so before they approve; to only stop it, pause it",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "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": "delete_ad",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "ad_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Delete an ad group with its ads and keywords. Permanent, with no undo: say so before they approve; to only stop it, pause it",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "delete_ad_group",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Delete a whole campaign. Permanent, with no undo: say so before they approve; to only stop it, pause it",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "delete_campaign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Delete negative keywords from a campaign, so those searches can show its ads again",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "criterion_ids": {
      +        "description": "campaign_criterion.criterion_id of each negative, from run_gaql WHERE campaign_criterion.negative = TRUE",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "delete_negative_keywords",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "criterion_ids"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Take sitelinks off a campaign. Google can't edit a sitelink: to change one, delete it and add_sitelinks in the same proposal",
      +    "properties": {
      +      "asset_ids": {
      +        "description": "asset.id of each sitelink, from run_gaql FROM campaign_asset WHERE campaign_asset.field_type = 'SITELINK'",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 8,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "campaign_id": {
      +        "description": "Digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "delete_sitelinks",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "asset_ids"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Block searches in one ad group, so it stops catching another group's searches",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "keywords": {
      +        "items": {
      +          "properties": {
      +            "match_type": {
      +              "enum": [
      +                "EXACT",
      +                "PHRASE",
      +                "BROAD"
      +              ],
      +              "type": "string"
      +            },
      +            "text": {
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "match_type"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "add_ad_group_negatives",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "keywords"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Delete negative keywords from an ad group",
      +    "properties": {
      +      "ad_group_id": {
      +        "description": "Digits only (ad_group.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "criterion_ids": {
      +        "description": "ad_group_criterion.criterion_id of each negative, from run_gaql WHERE ad_group_criterion.negative = TRUE",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "delete_ad_group_negatives",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_group_id",
      +      "criterion_ids"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Create a shared negative keyword list, optionally on campaigns",
      +    "properties": {
      +      "campaign_ids": {
      +        "default": [],
      +        "description": "Campaigns to use it on",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "keywords": {
      +        "items": {
      +          "properties": {
      +            "match_type": {
      +              "enum": [
      +                "EXACT",
      +                "PHRASE",
      +                "BROAD"
      +              ],
      +              "type": "string"
      +            },
      +            "text": {
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "match_type"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 50,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "name": {
      +        "description": "List name; must not match an existing list",
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "create_negative_list",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "keywords"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add or remove keywords in a shared negative list. This changes every campaign using it, which the proposal lists",
      +    "properties": {
      +      "add": {
      +        "default": [],
      +        "items": {
      +          "properties": {
      +            "match_type": {
      +              "enum": [
      +                "EXACT",
      +                "PHRASE",
      +                "BROAD"
      +              ],
      +              "type": "string"
      +            },
      +            "text": {
      +              "maxLength": 80,
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text",
      +            "match_type"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "remove_criterion_ids": {
      +        "default": [],
      +        "description": "shared_criterion.criterion_id of each to remove",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "shared_set_id": {
      +        "description": "Shared negative list id (shared_set.id from run_gaql WHERE shared_set.type = 'NEGATIVE_KEYWORDS')",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "edit_negative_list",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "shared_set_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Put a shared negative list on campaigns, or take it off",
      +    "properties": {
      +      "add_campaign_ids": {
      +        "default": [],
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "remove_campaign_ids": {
      +        "default": [],
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 50,
      +        "type": "array"
      +      },
      +      "shared_set_id": {
      +        "description": "Shared negative list id (shared_set.id from run_gaql WHERE shared_set.type = 'NEGATIVE_KEYWORDS')",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "apply_negative_list",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "shared_set_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Delete a shared negative list from every campaign. It has no undo: say so before they approve",
      +    "properties": {
      +      "shared_set_id": {
      +        "description": "Shared negative list id (shared_set.id from run_gaql WHERE shared_set.type = 'NEGATIVE_KEYWORDS')",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "delete_negative_list",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "shared_set_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Edit a responsive search ad's words or link in place, instead of adding a new ad. Give only what changes",
      +    "properties": {
      +      "ad_id": {
      +        "description": "Ad id, digits only (ad_group_ad.ad.id from run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "descriptions": {
      +        "description": "The full new list, replacing the old one",
      +        "items": {
      +          "maxLength": 90,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 4,
      +        "minItems": 2,
      +        "type": "array"
      +      },
      +      "final_url": {
      +        "maxLength": 2048,
      +        "pattern": "^https?:\\/\\/",
      +        "type": "string"
      +      },
      +      "headlines": {
      +        "description": "The full new list, replacing the old one",
      +        "items": {
      +          "maxLength": 30,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 15,
      +        "minItems": 3,
      +        "type": "array"
      +      },
      +      "path1": {
      +        "maxLength": 15,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "path2": {
      +        "maxLength": 15,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "request_review_topics": {
      +        "description": "Only after Google refused this and the user says it complies: the topics from the refusal, which asks Google to review it. PROHIBITED topics can't be",
      +        "items": {
      +          "maxLength": 100,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 10,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "edit_responsive_search_ad",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "ad_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Choose which days and hours a campaign runs, in the account's time zone, with optional bid changes. Hours left out don't run",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "schedule": {
      +        "description": "The whole new schedule, replacing the old one; empty means all day, every day",
      +        "items": {
      +          "properties": {
      +            "bid_percent": {
      +              "description": "Bid change in these hours, e.g. -20",
      +              "maximum": 900,
      +              "minimum": -90,
      +              "type": "number"
      +            },
      +            "day": {
      +              "enum": [
      +                "MONDAY",
      +                "TUESDAY",
      +                "WEDNESDAY",
      +                "THURSDAY",
      +                "FRIDAY",
      +                "SATURDAY",
      +                "SUNDAY"
      +              ],
      +              "type": "string"
      +            },
      +            "end_hour": {
      +              "maximum": 24,
      +              "minimum": 1,
      +              "type": "integer"
      +            },
      +            "start_hour": {
      +              "maximum": 23,
      +              "minimum": 0,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "day",
      +            "start_hour",
      +            "end_hour"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 42,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "set_ad_schedule",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "schedule"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Raise or lower a campaign's bids on one device. Smart bidding ignores everything here except -100",
      +    "properties": {
      +      "campaign_id": {
      +        "description": "Digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "device": {
      +        "enum": [
      +          "DESKTOP",
      +          "MOBILE",
      +          "TABLET"
      +        ],
      +        "type": "string"
      +      },
      +      "percent": {
      +        "description": "Bid change in percent, e.g. -20; -100 stops showing on that device, 0 clears it",
      +        "maximum": 900,
      +        "minimum": -100,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "set_device_bid",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "device",
      +      "percent"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add callouts, structured snippets, a business name, logos or images to a campaign",
      +    "properties": {
      +      "business_name": {
      +        "maxLength": 25,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "callouts": {
      +        "default": [],
      +        "description": "Short selling points, at most 25 characters each",
      +        "items": {
      +          "maxLength": 25,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "type": "array"
      +      },
      +      "campaign_id": {
      +        "description": "Digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "images": {
      +        "default": [],
      +        "description": "Images: landscape 1.91:1 or square 1:1",
      +        "items": {
      +          "description": "https URL of a PNG, JPEG or GIF (up to 5120 KB), or an image asset.id",
      +          "maxLength": 2048,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 0,
      +        "type": "array"
      +      },
      +      "logos": {
      +        "default": [],
      +        "description": "Square logos, 1:1",
      +        "items": {
      +          "description": "https URL of a PNG, JPEG or GIF (up to 5120 KB), or an image asset.id",
      +          "maxLength": 2048,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "maxItems": 5,
      +        "minItems": 0,
      +        "type": "array"
      +      },
      +      "snippets": {
      +        "default": [],
      +        "items": {
      +          "properties": {
      +            "header": {
      +              "enum": [
      +                "Amenities",
      +                "Brands",
      +                "Courses",
      +                "Degree programs",
      +                "Destinations",
      +                "Featured hotels",
      +                "Insurance coverage",
      +                "Models",
      +                "Neighborhoods",
      +                "Service catalog",
      +                "Shows",
      +                "Styles",
      +                "Types"
      +              ],
      +              "type": "string"
      +            },
      +            "values": {
      +              "items": {
      +                "maxLength": 25,
      +                "minLength": 1,
      +                "type": "string"
      +              },
      +              "maxItems": 10,
      +              "minItems": 3,
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "header",
      +            "values"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 4,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "add_campaign_assets",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Take assets off a campaign. No undo: add them again with add_campaign_assets",
      +    "properties": {
      +      "asset_ids": {
      +        "description": "asset.id of each, from run_gaql FROM campaign_asset",
      +        "items": {
      +          "pattern": "^\\d+$",
      +          "type": "string"
      +        },
      +        "maxItems": 20,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "campaign_id": {
      +        "description": "Digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "field_type": {
      +        "enum": [
      +          "CALLOUT",
      +          "STRUCTURED_SNIPPET",
      +          "BUSINESS_NAME",
      +          "BUSINESS_LOGO",
      +          "LOGO",
      +          "AD_IMAGE"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "delete_campaign_assets",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "field_type",
      +      "asset_ids"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Turn AI Max and automatically created text on or off for a campaign. Give only what changes",
      +    "properties": {
      +      "ai_max": {
      +        "description": "AI Max for Search",
      +        "type": "boolean"
      +      },
      +      "campaign_id": {
      +        "description": "Digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "text_automation": {
      +        "description": "Let Google write its own headlines and descriptions",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "set_ai_max",
      +        "type": "string"
      +      },
      +      "url_expansion": {
      +        "description": "Let Google send people to other pages on the site",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Change a conversion action's value, counting window or attribution. Give only what changes",
      +    "properties": {
      +      "attribution": {
      +        "enum": [
      +          "LAST_CLICK",
      +          "DATA_DRIVEN"
      +        ],
      +        "type": "string"
      +      },
      +      "click_window_days": {
      +        "description": "Days after a click a conversion still counts",
      +        "maximum": 90,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "conversion_action_id": {
      +        "description": "conversion_action.id from run_gaql",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "default_value": {
      +        "maximum": 1000000,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "set_conversion_settings",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "conversion_action_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Create a list of the site's visitors, from the Google tag on the site. No customer data is uploaded",
      +    "properties": {
      +      "membership_days": {
      +        "default": 30,
      +        "description": "How long a visitor stays on the list",
      +        "maximum": 540,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "name": {
      +        "maxLength": 255,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "create_remarketing_list",
      +        "type": "string"
      +      },
      +      "url_contains": {
      +        "description": "Visitors to pages whose URL contains this join the list, e.g. example.com",
      +        "maxLength": 512,
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "name",
      +      "url_contains"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Add a remarketing list to a campaign in observation, or take it off: ads still show to everyone, and you can see and bid on the list",
      +    "properties": {
      +      "bid_percent": {
      +        "description": "Bid change for people on the list, e.g. 20",
      +        "maximum": 900,
      +        "minimum": -90,
      +        "type": "number"
      +      },
      +      "campaign_id": {
      +        "description": "Digits only (campaign_id from account_overview or run_gaql)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "on": {
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "set_campaign_audience",
      +        "type": "string"
      +      },
      +      "user_list_id": {
      +        "description": "user_list.id from run_gaql",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "campaign_id",
      +      "user_list_id",
      +      "on"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Apply or dismiss one of Google's recommendations. Applying has no undo and Google picks the details: say so before they approve",
      +    "properties": {
      +      "action": {
      +        "enum": [
      +          "APPLY",
      +          "DISMISS"
      +        ],
      +        "type": "string"
      +      },
      +      "recommendation_id": {
      +        "description": "The end of recommendation.resource_name from run_gaql",
      +        "pattern": "^[\\w=-]+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "act_on_recommendation",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "recommendation_id",
      +      "action"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Link a Merchant Center account to this Google Ads account, so Shopping and Performance Max campaigns can use its products (the user must be an admin of both)",
      +    "properties": {
      +      "merchant_center_id": {
      +        "description": "Merchant Center account ID (from merchant_accounts)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "link_merchant_center",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "merchant_center_id"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Remove the link between a Merchant Center account and this Google Ads account; Shopping and Performance Max campaigns using its products stop serving",
      +    "properties": {
      +      "merchant_center_id": {
      +        "description": "Merchant Center account ID (from merchant_accounts)",
      +        "pattern": "^\\d+$",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "unlink_merchant_center",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "merchant_center_id"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changed
    • 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": {
      -      "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"
      -  }
      -]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"
      +  }
      +]
  3. Changed1 schema field changed
    • 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"
      +  }
      +]
  4. Changed1 schema field changed
    • 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"
      +  }
      +]
  5. Changed2 schema fields changed
    • 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"
      -}
  6. Changed1 schema field changed
    • 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"
      +}
  7. Changed2 schema fields changed
    • changedInput schema / properties / changes / description
      Previous value: -"Changes to propose; several can go in one proposal"New value: +"Changes to propose; several can go in one proposal, up to 50 (each keyword counts as one)"
    • addedInput schema / properties / changes / maxItems
      Added value: +50
  8. Changed1 schema field changed
    • 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 a campaign's bid strategy. 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": "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"
      +  }
      +]
  9. Changed1 schema field changed
    • 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": "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 a campaign's bid strategy. 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": "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 a campaign's bid strategy. 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": "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"
      +  }
      +]
  10. Changed1 schema field changed
    • 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": "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 a campaign's bid strategy. 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": "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": "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 a campaign's bid strategy. 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": "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"
      +  }
      +]
  11. Changed1 schema field changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  12. Changed2 schema fields changed
    • changedInput schema / properties / changes / description
      Previous value: -"Changes to propose"New value: +"Changes to propose; several can go in one proposal"
    • changedInput schema / properties / changes / items / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "campaign_id": {
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "keywords": {
      -        "items": {
      -          "properties": {
      -            "match_type": {
      -              "enum": [
      -                "EXACT",
      -                "PHRASE",
      -                "BROAD"
      -              ],
      -              "type": "string"
      -            },
      -            "text": {
      -              "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"
      -  },
      -  {
      -    "properties": {
      -      "ad_group_id": {
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "criterion_id": {
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pause_keyword",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "criterion_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "ad_group_id": {
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "criterion_id": {
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "enable_keyword",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id",
      -      "criterion_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "ad_group_id": {
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pause_ad_group",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "ad_group_id": {
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "enable_ad_group",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "ad_group_id"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "amount": {
      -        "exclusiveMinimum": 0,
      -        "maximum": 1000000,
      -        "type": "number"
      -      },
      -      "campaign_id": {
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "set_daily_budget",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "amount"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "campaign_id": {
      -        "pattern": "^\\d+$",
      -        "type": "string"
      -      },
      -      "resource_names": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "remove_negative_keywords",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "campaign_id",
      -      "resource_names"
      -    ],
      -    "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": "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 a campaign's bid strategy. 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": "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"
      +  }
      +]
  13. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare non-destructive and idempotent, and the description adds real context beyond them: the tool dry-runs against the live account rather than only validating locally, changes are persisted as a proposal object, irreversible sub-operations are flagged inline ('ads, ad groups and campaigns can't be undone', remove_conversion_action 'permanent unless a GA4 import'), and a hard 50-change cap with a specific counting rule is disclosed.

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 purpose and the approval instruction are front-loaded and earn their place, but the middle is a single ~250-word run-on sentence chained with 'and ... and ...' spanning building/tuning/deleting/negatives, which is hard to scan or use as a lookup. The information is useful; the structure is not.

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

Completeness5/5

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

For a tool with dozens of polymorphic change types and no output schema, the description supplies what an agent needs: what it returns (plain-English summary with ⚠ lines), that nothing is applied, how to proceed after approval, and the size limit. Nothing essential for correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100% and each oneOf variant carries its own description, so the baseline is 3. The description adds value by enumerating which change `type` values are accepted and by stating that each keyword counts as one change for the cap, but it does not repeat per-variant parameter semantics — which is appropriate here.

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?

The opening sentence names the specific action (checks against the live account, dry-runs with Google, stores a proposal, returns a plain-English summary) and states 'Nothing is changed', which cleanly separates it from the apply_changes sibling. The exhaustive list of supported change types makes the resource scope unmistakable.

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

Usage Guidelines5/5

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

Explicit workflow guidance: show the summary to the user, apply only after approval, surface any ⚠ line before approval. It also gives the batching rule — at most 50 changes, split into several proposals up front and show all summaries together — which is the kind of when/how instruction agents otherwise get wrong.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.