---
title: "Create a Performance Max campaign (paused)"
method: POST
path: "/api/v1/tools/google_create_pmax_campaign/execute"
tags: ["Google Ads"]
---

# Create a Performance Max campaign (paused)

`POST /api/v1/tools/google_create_pmax_campaign/execute`

## Request

- Base URL: `https://adako.ai`
- URL: `https://adako.ai/api/v1/tools/google_create_pmax_campaign/execute`
- Auth: HTTP bearer

Creates a whole Performance Max campaign in one atomic change: budget, campaign, location targeting, asset group, every text and image asset, and optional search themes and audience signal. The campaign is created PAUSED and its asset group enabled inside it, so nothing serves and nothing is spent until the campaign is turned on, and turning it on launches everything. Report that with the two links the result gives (Google Ads and the campaign's page in Adako), and offer "enable all": google_resume_campaign turns the campaign on in one approval.
Use when: the user has given a budget, a landing page, the copy, the images and the countries — and understands what Performance Max is: one campaign that spends across Search, Shopping, YouTube, Display, Discover, Gmail and Maps with very little per-channel control or reporting.
Do not use when: anything is missing or invented. Google needs at least 3 headlines, 1 long headline, 2 descriptions, a business name, a landscape image, a square image and a square logo; the tool refuses with a plain list of what is missing rather than sending a request that fails halfway. Do not use it when a Search campaign is what the user actually needs — Performance Max cannot be steered by keyword and will happily cannibalise an existing brand campaign.
Images may be asset ids (from google_list_assets) or https URLs, which are downloaded, measured against Google's aspect-ratio rules and uploaded in the same change. Locations must be ids from google_resolve_locations; they reach people in or regularly in those places (Presence) unless location_targeting is PRESENCE_OR_INTEREST. Final-URL expansion is switched off, so traffic goes to the page you named. Text limits count each Chinese, Japanese or Korean character as 2, and the daily budget is rounded to the smallest amount Google bills in the account currency.
If anything is rejected, nothing at all is created: there is no half-built campaign to clean up.
If you are unsure which account, campaign or period the user means, ask them — do not guess ids or dates.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `arguments` object, required
    - `customer_id` string: Google Ads customer id (10 digits, dashes optional). Omit to use the primary account; list_connected_accounts shows the valid ids.
    - `campaign_name` string, required: Campaign name the user will recognise.
    - `daily_budget` number, required: Average daily budget as a decimal in the account currency. Never micros.
    - `final_url` string, uri, required: The landing page the asset group points at (https).
    - `business_name` string, required: Business name, 25 characters or fewer (Chinese, Japanese and Korean count as 2).
    - `headlines` string[], required: At least 3 headlines, 30 characters or fewer each (Chinese, Japanese and Korean characters count as 2). Five is the practical minimum.
    - `long_headlines` string[], required: At least 1 long headline, 90 characters or fewer.
    - `descriptions` string[], required: At least 2 descriptions; the first must be 60 characters or fewer.
    - `marketing_images` union[], required: Landscape 1.91:1 images — asset ids or https URLs.
      - union
        - string: An existing image asset id from google_list_assets.
        - string, uri: An https URL; the image is downloaded, checked and uploaded.
    - `square_images` union[], required: Square 1:1 images — asset ids or https URLs.
      - union
        - string: An existing image asset id from google_list_assets.
        - string, uri: An https URL; the image is downloaded, checked and uploaded.
    - `logos` union[], required: Square 1:1 logos — asset ids or https URLs.
      - union
        - string: An existing image asset id from google_list_assets.
        - string, uri: An https URL; the image is downloaded, checked and uploaded.
    - `location_ids` string[], required: Geo target constant ids from google_resolve_locations. Free text is never accepted.
    - `location_targeting` 'PRESENCE' | 'PRESENCE_OR_INTEREST': Who the locations reach. PRESENCE (the default here): people in or regularly in those places. PRESENCE_OR_INTEREST (Google’s own default): also people elsewhere who show interest in them, e.g. someone abroad planning a trip. Choose it only when the user wants that wider reach.
    - `target_roas` number: Optional target ROAS (4 means 400%). With it the campaign maximises conversion value; without it, conversions.
    - `search_themes` string[]: Optional search themes to seed the asset group (at most 25).
    - `audience_id` string: Optional audience signal. Audience id from google_search_audiences — only an entry from its `audiences` list. The `interest_segments` and `user_lists` it also returns are different kinds of id and Google refuses them here with INVALID_COMBINED_AUDIENCE_ID (seen live 2026-09-18). An account with an empty `audiences` list has no audience to signal with; say so rather than passing an interest id.
    - `idempotency_key` string: Optional caller-supplied key; identical keys never execute twice.

## Response `200`

The tool ran. A write returns proposal_id and approve_url while the change waits for approval.

- SuccessEnvelope
  - `success` unknown, required
  - `tool` string, required
  - `data` object, required: Machine-readable result.
  - `markdown` string, required: The same result written for a person or a model.
  - `quota` Quota: Task usage for the current billing period.
    - `plan` string
    - `used` integer
    - `limit` integer
    - `period_end` string
    - `upgrade_url` string
  - `proposal_id` string: Present for writes. Nothing changes on the ad platform until it is approved.
  - `approve_url` string: Where a person approves the proposal.
  - `request_id` string, required

## Other responses

- `400`: Invalid arguments, or the ad account could not be resolved.
- `401`: Missing, invalid, revoked or expired API key.
- `402`: Monthly task quota used up, or the plan does not include this tool.
- `403`: The connected ad account lacks the access level this tool needs.
- `404`: Unknown tool name.
- `409`: Not connected, reconnect needed, confirmation required, a proposal already pending or no longer pending, an identical create that failed earlier today (proposal_failed_before), a create that duplicates an approved one (duplicate_create), the ad-account limit of the plan reached (account_limit), or an Idempotency-Key reused with different arguments.
- `429`: Rate limited by Adako or by the ad platform. See Retry-After.
- `500`: Unexpected error inside Adako.
- `502`: The ad platform returned an error.

---

[API](https://skmtc.dev/adako/apis/adako-rest-api.md) · [All operations](https://skmtc.dev/adako/apis/adako-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adako/apis/adako-rest-api/revisions/59ee60d48a56?raw)
