add_pmax_campaign_logo

Google Ads Write

Link a square LOGO as a campaign-level asset to an existing Performance Max campaign

Endpoint

POST https://api.adspirer.ai/api/v1/tools/add_pmax_campaign_logo/execute

Headers

Description

Link a square LOGO as a campaign-level asset to an existing Performance Max campaign. Performance Max campaigns with **Brand Guidelines enabled** require at least one square LOGO and a BUSINESS_NAME linked at the CAMPAIGN level (as CampaignAssets, NOT asset-group assets). Until both exist, Google rejects any attempt to complete an asset group with "require at least one square logo to be linked as a CampaignAsset" / "must link business name and logo assets as CampaignAssets". This tool satisfies that requirement — the asset-group image tools cannot, because they link at the asset-group level. Provide the logo by EITHER: - `asset_id` — the numeric ID of an EXISTING approved image asset in the account's library (preferred; no re-upload), or - `image_url` — a public http(s) URL or `data:image/...;base64,...` URI to create a new square logo image. Optionally pass `business_name` (max 25 chars) to link the BUSINESS_NAME asset in the same call. Idempotent: already-linked assets are skipped (pass `force=true` to add another). A non-square logo produces a warning (Google requires 1:1). **Parameters:** - campaign_id: the Performance Max campaign ID - asset_id OR image_url: the logo source (exactly one) - business_name: optional, also link the business name - asset_name / force: optional **Execution time:** 2-6 seconds (asset resolve/upload + Google Ads mutate)

Request body

All tool arguments are wrapped in an arguments object.

FieldTypeDescription
campaign_idstring requiredThe Performance Max campaign ID (numeric). Example: '24249158821'
asset_idstring optionalThe numeric ID (or full resource name) of an EXISTING approved IMAGE asset in the account's library to link as the square logo. Preferred when the logo is already uploaded (no re-upload). Get IDs from discover_existing_assets / list_pmax_asset_group_images.
image_urlstring optionalAlternative to asset_id: a public http(s) URL OR a 'data:image/...;base64,...' URI to create/upsert a NEW square logo image. Provide EITHER asset_id OR image_url, not both.
asset_namestring optionalOptional display name for a newly created logo asset.
business_namestring optionalOptional: also link a BUSINESS_NAME CampaignAsset (max 25 chars) in the same call. Brand-Guidelines PMax campaigns require BOTH a square logo and a business name at the campaign level.
forceboolean optionalIf true, link even when an identical logo is already linked (default skips duplicates). default: false
customer_idstring optionalGoogle Ads customer ID. Required for multi-account users. Get from get_connections_status.

Example request

{
  "arguments": {
    "campaign_id": "<campaign_id>",
    "asset_id": "string",
    "image_url": "string",
    "asset_name": "string",
    "business_name": "string",
    "force": false,
    "customer_id": "string"
  }
}

Example responses

200 — Success

{
  "success": true,
  "data": {
    "text": "(tool-specific textual output for add_pmax_campaign_logo)",
    "quota": {
      "used": 42,
      "limit": 150,
      "tier": "plus",
      "period_end": "2026-05-01"
    }
  },
  "tool": "add_pmax_campaign_logo"
}

400 — Tool-level error (bad arguments / multi-account selection)

{
  "success": false,
  "error": "You have 25 meta_ads accounts connected. Please specify which account to use by passing the ad_account_id parameter:\n  - Acme Holdings (ad_account_id=\"act_123456789\")\n  - Acme EU (ad_account_id=\"act_987654321\")",
  "is_error": true,
  "tool": "add_pmax_campaign_logo"
}

402 — Quota exhausted

{
  "success": false,
  "error": "\ud83d\udea8 Monthly limit reached (150/150 tool calls on Plus tier).\nUpgrade to Pro at https://adspirer.ai to keep building.",
  "is_error": true,
  "tool": "add_pmax_campaign_logo",
  "quota": {
    "used": 150,
    "limit": 150,
    "tier": "plus",
    "period_end": "2026-05-01",
    "upgrade_url": "https://adspirer.ai"
  }
}

Try it live


Adspirer REST API — get an API key at adspirer.ai/keys · adspirer.ai