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: 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, create_conversion_action, set_conversion_counting, import_ga4_key_event. Point out any ⚠ line in the summary to the user before they approve. At most 50 changes per proposal, counting each keyword in add_keywords and add_negative_keywords as one (a create_campaign or add_ad_group counts as one however much it holds); for more, split them into several proposals up front and show the user all the summaries together.

Input Schema

TableJSON 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. 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"
      -}
  2. 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"
      +}
  3. 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
  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 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"
      +  }
      +]
  5. 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"
      +  }
      +]
  6. 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"
      +  }
      +]
  7. 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"
  8. 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"
      +  }
      +]
  9. First observed

TDQS

A4.8/5.0
Behavior5/5

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

The description goes well beyond the annotations by explaining the dry-run validation, proposal storage, human approval workflow, warning lines, change-counting rules, and campaigns being created paused. These details are important because the tool is not read-only even though it applies nothing to the live account.

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

Conciseness4/5

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

The core behavior is front-loaded and the workflow is easy to follow. The long supported-operations list is useful but somewhat redundant with the schema, making the description longer than strictly necessary.

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 complex proposal-creation tool with a rich schema and safety-relevant annotations, the description covers what the tool does, what it does not do, how to handle warnings and approval, and how to manage the batch-size limit. No critical context appears 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%, so the schema already documents the nested change objects well. The description still adds useful semantics by listing supported change types and clarifying that each keyword counts toward the 50-change limit while a create_campaign or add_ad_group counts as one.

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 description states a precise verb and resource: check and dry-run Google Ads changes, store a proposal, return a summary, and change nothing. It clearly distinguishes this from applying changes by saying 'Nothing is changed' and 'apply only after they approve.'

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?

It explicitly tells the agent to show the summary to the user and only apply after approval, and to point out any ⚠ line before approval. It also handles the 50-change limit by instructing the agent to split larger batches into multiple proposals and present all summaries together.

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.

Resources