---
title: "Create a Performance Max asset group"
method: POST
path: "/v1/ads/campaigns/{campaignId}/asset-groups"
tags: ["Ad Campaigns"]
---

# Create a Performance Max asset group

`POST /v1/ads/campaigns/{campaignId}/asset-groups`

Add an asset group to an existing Performance Max campaign. The group, any new assets, their links and an optional listing-group tree are created in one atomic request, so Google checks the asset minimums (for non-retail campaigns) against the whole set. Created PAUSED unless status is ENABLED. validateOnly: true runs Google's validation without creating anything.

## Path parameters

- `campaignId` string, required

## Request body

- object
  - `name` string, required — Unique within the campaign.
  - `finalUrls` string[], required
  - `finalMobileUrls` string[]
  - `path1` string
  - `path2` string — Requires path1.
  - `status` 'ENABLED' | 'PAUSED'
  - `assets` GoogleAssetGroupAssetLink[]
    - `fieldType` string, required — Google AssetFieldType, such as HEADLINE, LONG_HEADLINE, DESCRIPTION, BUSINESS_NAME, MARKETING_IMAGE, SQUARE_MARKETING_IMAGE, PORTRAIT_MARKETING_IMAGE, LOGO, LANDSCAPE_LOGO or YOUTUBE_VIDEO.
    - `asset` string — Existing asset id or resource name customers/{customerId}/assets/{assetId}. Must belong to the campaign's ad account.
    - `text` string — Text assets link as HEADLINE, LONG_HEADLINE, DESCRIPTION or BUSINESS_NAME.
    - `imageUrl` string, uri — Public http(s) image. Links as an image role or LOGO / LANDSCAPE_LOGO.
    - `youtubeVideoId` string — Links as YOUTUBE_VIDEO.
  - `listingGroupFilter` GoogleListingGroupTree — The root of a Performance Max retail listing-group tree (listing source SHOPPING). No children targets all products. Requires a campaign linked to Merchant Center.
    - `children` GoogleListingGroupNode[]
      - `dimension` GoogleListingGroupDimension, required — Exactly one key. Omit the value (for example { productBrand: {} }) for the everything-else node of that level.
        - `productBrand` object
          - `value` string
        - `productCategory` object
          - `categoryId` string — Google product category id.
          - `level` 'LEVEL1' | 'LEVEL2' | 'LEVEL3' | 'LEVEL4' | 'LEVEL5', required
        - `productType` object
          - `value` string
          - `level` 'LEVEL1' | 'LEVEL2' | 'LEVEL3' | 'LEVEL4' | 'LEVEL5', required
        - `productItemId` object
          - `value` string
        - `productCondition` object
          - `condition` 'NEW' | 'REFURBISHED' | 'USED'
        - `productChannel` object
          - `channel` 'ONLINE' | 'LOCAL'
        - `productCustomAttribute` object
          - `value` string
          - `index` 'INDEX0' | 'INDEX1' | 'INDEX2' | 'INDEX3' | 'INDEX4', required
      - `excluded` boolean — Leaf only. true excludes these products.
      - `children` GoogleListingGroupNode[] — Makes the node a subdivision. Children share one dimension (and level or index) and include exactly one everything-else node.
  - `validateOnly` boolean

## Response `200`

validateOnly request accepted by Google. Nothing was created.

- object
  - `validateOnly` boolean
  - `message` string

## Other responses

- `201` — Asset group created.
- `400` — Invalid request
- `401` — Unauthorized
- `404` — Resource not found
- `422` — Google Ads connection needs reconnecting.
- `429` — Google quota or the Zernio Google operations burst limit is exhausted.
- `501` — Campaign is not on Google Ads.

## Changes

- **2026-09-28** `1c23a639830f` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/ads/campaigns/:campaignId/asset-groups/post.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) · [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/1c23a639830f?raw)
