Growomat · Schema
CampaignUpdate
Partial update of a campaign: any subset of `CampaignCreate` fields. Omitted fields keep their values.
AdsGrowthAutomationArtificial IntelligenceMCP
Properties
| Name | Type | Description |
|---|---|---|
| _native | object | |
| _platformBudgets | object | |
| name | string | Campaign name, shown in the app and on the platforms. |
| budget | number | Daily budget, in `currency`. |
| currency | string | ISO 4217 currency code of `budget`, for example `EUR` or `USD`. |
| status | string | `PAUSED` (the default) is safe: the campaign exists on the platforms after a sync but does not serve. `ENABLED` serves after the next sync. `DRAFT` is an unconfirmed build that is never synced until i |
| type | string | The campaign type. It decides which ad formats and which asset roles apply. |
| networks | string | Platform network setting, as the platform names it. |
| languages | string | Language of the audience, as a language code. |
| businessId | string | The business this campaign advertises. Generated copy and the brand voice come from it. |
| goal | string | What the campaign should achieve, in your own words. Used when Growomat drafts ads and keywords for it. |
| geoTargets | array | Where the ads may show: named areas and radius circles in one include/exclude list. Empty means no location restriction; the ads can serve anywhere. |
| locationIntent | string | Who counts as being in the targeted places. `PRESENCE` (default): people who are in, or regularly in, those places. `PRESENCE_OR_INTEREST`: also people elsewhere who search about them. The second is w |
| customLabels | array | Up to ten free-form labels for your own grouping and reporting. |
| adSchedule | object | |
| adScheduleUseSearcherTimeZone | boolean | Interpret the ad schedule in the searcher's local time zone instead of the account time zone, on platforms that support it (Microsoft Advertising). Ignored elsewhere. |
| biddingStrategy | object | |
| targeting | object | |
| trackingUrlTemplate | string | Tracking template applied to every ad in the campaign, for example `{lpurl}?src=ads`. |
| finalUrlSuffix | string | Query string appended to every final URL in the campaign. |
| urlCustomParameters | object | Custom `{_name}` parameters available to tracking templates. |
| negativeKeywords | array | Search terms the whole campaign must not show for. |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/growomat-com/json-schema/growomat-com-campaign-update-schema.json",
"title": "CampaignUpdate",
"description": "Partial update of a campaign: any subset of `CampaignCreate` fields. Omitted fields keep their values.",
"x-generated": "2026-11-10",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/_original/growomat-com-api-openapi.json#/components/schemas/CampaignUpdate",
"type": "object",
"properties": {
"_native": {
"$ref": "#/$defs/NativeExtensions"
},
"_platformBudgets": {
"$ref": "#/$defs/PlatformBudgets"
},
"name": {
"type": "string",
"minLength": 1,
"description": "Campaign name, shown in the app and on the platforms."
},
"budget": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Daily budget, in `currency`."
},
"currency": {
"type": "string",
"minLength": 1,
"maxLength": 3,
"description": "ISO 4217 currency code of `budget`, for example `EUR` or `USD`."
},
"status": {
"type": "string",
"enum": [
"DRAFT",
"ENABLED",
"PAUSED",
"REMOVED"
],
"default": "PAUSED",
"description": "`PAUSED` (the default) is safe: the campaign exists on the platforms after a sync but does not serve. `ENABLED` serves after the next sync. `DRAFT` is an unconfirmed build that is never synced until it is confirmed (*Confirm a draft campaign*); no other status change can take a campaign out of `DRAFT`."
},
"type": {
"type": "string",
"enum": [
"SEARCH",
"DISPLAY",
"VIDEO",
"SHOPPING",
"PERFORMANCE_MAX"
],
"default": "SEARCH",
"description": "The campaign type. It decides which ad formats and which asset roles apply."
},
"networks": {
"type": "string",
"description": "Platform network setting, as the platform names it."
},
"languages": {
"type": "string",
"default": "en",
"description": "Language of the audience, as a language code."
},
"businessId": {
"type": "string",
"description": "The business this campaign advertises. Generated copy and the brand voice come from it."
},
"goal": {
"type": "string",
"description": "What the campaign should achieve, in your own words. Used when Growomat drafts ads and keywords for it."
},
"geoTargets": {
"type": "array",
"items": {
"$ref": "#/$defs/GeoTarget"
},
"description": "Where the ads may show: named areas and radius circles in one include/exclude list. Empty means no location restriction; the ads can serve anywhere."
},
"locationIntent": {
"type": "string",
"enum": [
"PRESENCE",
"PRESENCE_OR_INTEREST"
],
"default": "PRESENCE",
"description": "Who counts as being in the targeted places. `PRESENCE` (default): people who are in, or regularly in, those places. `PRESENCE_OR_INTEREST`: also people elsewhere who search about them. The second is wider and much less qualified; it is the platforms' own default, which this API deliberately does not inherit."
},
"customLabels": {
"type": "array",
"maxItems": 10,
"items": {
"type": "string",
"minLength": 1,
"maxLength": 50
},
"description": "Up to ten free-form labels for your own grouping and reporting."
},
"adSchedule": {
"$ref": "#/$defs/CampaignAdScheduleField"
},
"adScheduleUseSearcherTimeZone": {
"type": "boolean",
"description": "Interpret the ad schedule in the searcher's local time zone instead of the account time zone, on platforms that support it (Microsoft Advertising). Ignored elsewhere."
},
"biddingStrategy": {
"$ref": "#/$defs/BiddingStrategy"
},
"targeting": {
"$ref": "#/$defs/CampaignTargeting"
},
"trackingUrlTemplate": {
"type": "string",
"description": "Tracking template applied to every ad in the campaign, for example `{lpurl}?src=ads`."
},
"finalUrlSuffix": {
"type": "string",
"description": "Query string appended to every final URL in the campaign."
},
"urlCustomParameters": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"description": "Custom `{_name}` parameters available to tracking templates."
},
"negativeKeywords": {
"type": "array",
"items": {
"$ref": "#/$defs/NegativeKeywordEntry"
},
"description": "Search terms the whole campaign must not show for."
}
},
"$defs": {
"BiddingStrategy": {
"type": "object",
"description": "How the platform bids for this campaign.",
"properties": {
"type": {
"type": "string",
"enum": [
"MANUAL_CPC",
"ENHANCED_CPC",
"MAXIMIZE_CLICKS",
"MAXIMIZE_CONVERSIONS",
"MAXIMIZE_CONVERSION_VALUE",
"TARGET_CPA",
"TARGET_ROAS",
"TARGET_IMPRESSION_SHARE"
],
"default": "MAXIMIZE_CLICKS",
"description": "The bidding strategy. Target strategies read their target from the matching field below."
},
"targetCpa": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Target cost per acquisition, for `TARGET_CPA`."
},
"targetRoas": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Target return on ad spend as a ratio (2.5 means 250%), for `TARGET_ROAS`."
},
"targetImpressionShare": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Target impression share in percent, for `TARGET_IMPRESSION_SHARE`."
},
"maxCpcBidCeiling": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Never bid more than this per click."
},
"cpcBid": {
"type": "number",
"exclusiveMinimum": 0,
"description": "The click bid for `MANUAL_CPC`, in the account currency. Every ad group without its own `cpcBid` bids this; an ad group's own `cpcBid` wins."
}
}
},
"CampaignAdScheduleField": {
"description": "The campaign's ad schedule, as a preset name (`ALL_HOURS_ALL_DAYS`, `BUSINESS_HOURS`, `CUSTOM`) or as a `StructuredSchedule`. On read, `adSchedule` returns what you last wrote and `adScheduleStructured` always holds the expanded weekly schedule. `CUSTOM` is treated as `ALL_HOURS_ALL_DAYS`.",
"oneOf": [
{
"type": "string",
"enum": [
"ALL_HOURS_ALL_DAYS",
"BUSINESS_HOURS",
"CUSTOM"
]
},
{
"$ref": "#/$defs/StructuredSchedule"
}
]
},
"CampaignTargeting": {
"type": "object",
"description": "Additional targeting: schedule, devices and platform-specific audience settings. Locations live in the campaign's `geoTargets` list, not here.",
"properties": {
"schedule": {
"type": "array",
"items": {
"type": "object"
}
},
"devices": {
"type": "object"
},
"linkedin": {
"type": "object"
}
}
},
"GeoTarget": {
"type": "object",
"required": [
"kind",
"name"
],
"description": "One row of a campaign's location targeting: a named area or a radius circle, included or excluded.",
"properties": {
"id": {
"type": "string",
"description": "Stable row id. Generated when omitted."
},
"kind": {
"type": "string",
"enum": [
"AREA",
"RADIUS"
],
"description": "`AREA` is a named place, from a country down to a postcode. `RADIUS` is a circle around a point."
},
"negative": {
"type": "boolean",
"default": false,
"description": "`true` excludes this row from the included set. Not allowed on `RADIUS` rows (`400 RADIUS_EXCLUSION_UNSUPPORTED`), and a set where every row is negative is rejected (`400 ONLY_EXCLUSIONS`)."
},
"bidAdjustment": {
"type": "number",
"description": "Percent bid adjustment for this row. Included rows only."
},
"reach": {
"type": "number",
"description": "Audience estimate as reported by the platform, when it gave one. Read-only; never estimated by Growomat."
},
"criterionId": {
"type": [
"string",
"null"
],
"description": "Areas: the Google Ads geo target id."
},
"msLocationId": {
"type": [
"string",
"null"
],
"description": "Areas: the Microsoft Advertising location id."
},
"canonicalId": {
"type": [
"string",
"null"
],
"description": "Areas: Growomat's platform-independent id for the place."
},
"name": {
"type": "string",
"description": "Display name of the place or circle."
},
"type": {
"type": "string",
"enum": [
"COUNTRY",
"REGION",
"METRO",
"CITY",
"DISTRICT",
"POSTAL_CODE",
"AIRPORT",
"UNIVERSITY",
"GLOBAL"
],
"description": "Areas only: what kind of place this is."
},
"countryCode": {
"type": [
"string",
"null"
],
"description": "Areas: ISO 3166-1 country code."
},
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Circles only: latitude of the centre."
},
"lng": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Circles only: longitude of the centre."
},
"radius": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Circles only. Clamped to the platform's range (1 to 500) when pushed; a clamp is reported as a `RADIUS_CLAMPED_TO_MIN` warning."
},
"unit": {
"type": "string",
"enum": [
"km",
"mi"
],
"default": "km",
"description": "Circles only: the unit of `radius`."
}
}
},
"NativeExtensions": {
"type": "object",
"description": "Settings that exist on one platform only, keyed by platform id (for example `google-ads`). Each value is a free-form object that is stored and returned exactly as sent; keys Growomat does not know are kept. Absent by default.\n\nKeys read by platforms whose ad is a post (on the ad, with the campaign as fallback): `postType` (`TEXT` or `IMAGE`), `postTitle`, `postBody`, `callToAction`, `imageUrl`, `videoUrl`, `videoThumbnailUrl`, `carouselCards` (`[{ imageUrl, destinationUrl }]`), `communities`, `interests`.\n\nDelivery keys read on the campaign: `objective`, `goalType`, `startTime`, `endTime`, `optimizationGoal`, `conversionPixelId`.",
"additionalProperties": {
"type": "object",
"additionalProperties": true
},
"properties": {
"openai-ads": {
"type": "object",
"description": "ChatGPT Ads settings. Read on the campaign: `budgetKind`, `biddingType`, `startTime`, `endTime`, `platforms`, `customAudienceIds`, `excludedCustomAudienceIds`, `conversionEventSettingId`, `queryStringTemplate`, `description`, `imageUrl`, `postTitle`, `postBody`; on the ad group: `strategy`, `maxBid`, `cpmBid`, `description`; on the ad: `imageUrl`, `postTitle`, `postBody`, `imageCrop`, `price`. Unknown keys are kept.",
"properties": {
"budgetKind": {
"type": "string",
"enum": [
"DAILY",
"LIFETIME"
],
"default": "DAILY",
"description": "On the campaign: `LIFETIME` makes `budget` the total for the campaign's whole run instead of a day's. The lifetime minimum is 1 unit of the account currency; the daily minimum is per currency (EUR 15). One-way: once pushed, a lifetime budget can never become daily. Maximize-results strategies need `DAILY`."
},
"biddingType": {
"type": "string",
"enum": [
"CLICKS",
"IMPRESSIONS",
"CONVERSIONS"
],
"description": "On the campaign: What the campaign buys. Set once, at the first push. Defaults from `biddingStrategy` (clicks for a CPC strategy, conversions for a CPA strategy); `IMPRESSIONS` is reachable only here."
},
"startTime": {
"type": "string",
"format": "date-time",
"description": "On the campaign: When delivery starts. Falls back to `startDate`; absent means as soon as it is enabled."
},
"endTime": {
"type": "string",
"format": "date-time",
"description": "On the campaign: When delivery ends. Falls back to `endDate` (end of that day, UTC)."
},
"platforms": {
"type": "array",
"items": {
"type": "string",
"enum": [
"ios_app",
"android_app",
"web",
"desktop_web",
"ios_web",
"android_web"
]
},
"description": "On the campaign: The ChatGPT surfaces to deliver on. Absent means all. `web` covers every web surface, so it is never combined with the granular web values."
},
"customAudienceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "On the campaign: Custom audiences to reach."
},
"excludedCustomAudienceIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "On the campaign: Custom audiences to exclude."
},
"conversionEventSettingId": {
"type": "string",
"description": "On the campaign: The conversion event setting a conversions campaign optimises for (required when `biddingType` is `CONVERSIONS`; fixed after the first push). Defaults to the connection's."
},
"queryStringTemplate": {
"type": "string",
"description": "On the campaign: Query parameters appended to every destination URL, for example `utm_source=chatgpt&utm_medium=cpc`. The platform's own click id is added by the platform and is dropped here."
},
"description": {
"type": "string",
"description": "On the campaign: An internal note on the campaign. On the ad group: An internal note on the ad group."
},
"imageUrl": {
"type": "string",
"format": "uri",
"description": "On the campaign: One image for every chat card in the campaign that has none of its own. On the ad: The chat card's image (at least 640 × 640). Wins over an image bound through *Ad assets*; `creative.imageUrl` wins over this."
},
"postTitle": {
"type": "string",
"maxLength": 50,
"description": "On the campaign: One title for every chat card that sets none of its own. On the ad: The card's title as it will read (3–50 characters). Defaults to the first headline."
},
"postBody": {
"type": "string",
"maxLength": 100,
"description": "On the campaign: One body for every chat card that sets none of its own. On the ad: The card's body as it will read (up to 100 characters). Defaults to the first description."
},
"strategy": {
"type": "string",
"enum": [
"fixed_bid",
"maximize_clicks",
"maximize_conversions"
],
"description": "On the ad group: How the ad group bids. `fixed_bid` bids `cpcBid` (or `maxBid` / `cpmBid`); a `maximize_*` strategy needs a daily budget. Must suit the campaign's `biddingType`."
},
"maxBid": {
"type": "number",
"minimum": 0,
"description": "On the ad group: The fixed bid in the account currency, when `cpcBid` does not apply (a CPA bid on a conversions campaign)."
},
"cpmBid": {
"type": "number",
"minimum": 0,
"description": "On the ad group: For an `IMPRESSIONS` campaign: the bid per thousand impressions, in the account currency."
},
"imageCrop": {
"type": "object",
"required": [
"x",
"y",
"width",
"height"
],
"properties": {
"x": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"y": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"width": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"height": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"description": "On the ad: A square crop of the image, each value a fraction (0–1) of the source."
},
"price": {
"type": "string",
"maxLength": 100,
"description": "On the ad: A price shown on the card, as written (for example `From €49`)."
}
},
"additionalProperties": true
}
}
},
"NegativeKeywordEntry": {
"type": "object",
"required": [
"text",
"matchType"
],
"description": "A search term the campaign must not show for.",
"properties": {
"text": {
"type": "string",
"description": "The term."
},
"matchType": {
"type": "string",
"enum": [
"EXACT",
"PHRASE",
"BROAD"
],
"description": "How closely a search must match the term."
}
}
},
"PlatformBudgets": {
"type": "object",
"description": "Where this campaign runs, and how much of the budget each platform gets, keyed by platform id (`reddit-ads`, `microsoft-ads`, and so on).\n\n**A platform not listed here is not part of the campaign.** It is never exported to and never spends, whatever is connected. At least one entry must be switched on.\n\nAn entry without `amount` gets an even share of the budget the listed amounts leave, so `{ \"reddit-ads\": {} }` is the whole budget on Reddit Ads. `percentage` is computed from `amount` on every write; sending it is ignored. The split is checked against the campaign budget and rejected when it exceeds it.",
"additionalProperties": {
"type": "object",
"properties": {
"amount": {
"type": "number",
"minimum": 0,
"description": "This platform's daily share of the budget. Omit it for an even share of what is left. `0` is valid but the platform then has nothing to spend."
},
"enabled": {
"type": "boolean",
"description": "Whether the campaign runs on this platform. Absent means on; `false` keeps the amount but takes the platform out (a live one is paused at the next sync)."
},
"percentage": {
"type": "number",
"minimum": 0,
"maximum": 100,
"readOnly": true,
"description": "Share of the campaign budget, computed from `amount`."
}
}
}
},
"ScheduleWindow": {
"type": "object",
"required": [
"day",
"startHour",
"endHour"
],
"description": "One block of time on one day of the week during which ads may show.",
"properties": {
"day": {
"type": "string",
"enum": [
"MONDAY",
"TUESDAY",
"WEDNESDAY",
"THURSDAY",
"FRIDAY",
"SATURDAY",
"SUNDAY"
],
"description": "The day of the week."
},
"startHour": {
"type": "integer",
"minimum": 0,
"maximum": 23,
"description": "Hour the window opens (0 to 23), in the schedule's time zone."
},
"startMinute": {
"type": "string",
"enum": [
"ZERO",
"FIFTEEN",
"THIRTY",
"FORTY_FIVE"
],
"default": "ZERO",
"description": "Minute the window opens, in quarter hours."
},
"endHour": {
"type": "integer",
"minimum": 0,
"maximum": 24,
"description": "Hour the window closes (0 to 24). `24` means end of day."
},
"endMinute": {
"type": "string",
"enum": [
"ZERO",
"FIFTEEN",
"THIRTY",
"FORTY_FIVE"
],
"default": "ZERO",
"description": "Minute the window closes, in quarter hours."
},
"bidModifier": {
"type": "number",
"minimum": 0.1,
"maximum": 10,
"description": "Bid multiplier for this window; `1.0` means no change. Platforms that express this as a percentage receive the converted value, clamped to their range; a clamp is reported as a `BID_ADJUSTMENT_CLAMPED` warning."
}
}
},
"StructuredSchedule": {
"type": "object",
"required": [
"windows"
],
"description": "A weekly ad schedule: up to 84 windows and the time zone they are in.",
"properties": {
"windows": {
"type": "array",
"maxItems": 84,
"items": {
"$ref": "#/$defs/ScheduleWindow"
},
"description": "The windows during which ads may show."
},
"timezone": {
"type": "string",
"description": "IANA time zone the hours are in, for example `Europe/Berlin`. Defaults to the account time zone."
}
}
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/growomat-com-campaign-update"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.