> ## Documentation Index
> Fetch the complete documentation index at: https://www.ayrshare.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Chiến dịch Google Performance Max

> Tạo các chiến dịch Performance Max trên Google Ads từ văn bản và hình ảnh của bạn

> [!WARNING]
>
> **Hãy thiết lập theo dõi chuyển đổi trước.** Performance Max dùng các chuyển đổi của bạn để quyết định nơi hiển thị quảng cáo và mức giá thầu. Ayrshare không chặn chiến dịch khi chưa có tính năng này, nhưng Google có thể giới hạn mức chi tiêu của chiến dịch cho đến khi tính năng theo dõi chuyển đổi được thiết lập trong tài khoản Google Ads của bạn. Ayrshare không thiết lập tính năng này cho bạn. Khi tài khoản chưa có, phản hồi tạo chiến dịch sẽ bao gồm một mục `warnings` thông báo điều đó.

Tạo một chiến dịch Performance Max trên Google Ads chỉ trong một yêu cầu. Bạn gửi văn bản và URL hình ảnh; Google kết hợp chúng thành các quảng cáo trên Search, YouTube, Display, Discover, Gmail và Maps. Ayrshare tạo đồng thời ngân sách, chiến dịch, một nhóm thành phần (asset group) và toàn bộ thành phần của nhóm đó. Nếu Google từ chối bất kỳ phần nào, sẽ không có gì được tạo.

Yêu cầu dùng cấu trúc chung của [Chiến dịch Quảng cáo](https://www.ayrshare.com/docs/apis/ads/campaigns.md). Việc đọc và thay đổi chiến dịch, thông tin chi tiết (insights) và lỗi hoạt động giống như trên trang [Chiến dịch Google Search](https://www.ayrshare.com/docs/apis/ads/google/search-campaigns.md). Trang này trình bày những điểm khác biệt.

<ul>
  <li>Quảng cáo Google được bật theo từng tài khoản. Hãy liên hệ với chúng tôi để kích hoạt.</li>
  <li>Chiến dịch mới bắt đầu ở trạng thái `paused` trừ khi bạn gửi `status: "active"`.</li>
  <li>Ngân sách được tính theo ngày, bằng đơn vị tiền tệ của tài khoản quảng cáo, và không bao giờ được dùng chung với các chiến dịch khác.</li>
  <li>Chi tiêu bằng loại tiền khác được quy đổi sang USD để thanh toán theo tỷ giá của ngày đó từ Open Exchange Rates. Tài khoản dùng loại tiền không thể quy đổi sẽ trả về `code: 101` trước khi bất kỳ thứ gì được tạo.</li>
  <li>Video không được hỗ trợ. Google có thể tạo video từ hình ảnh của bạn.</li>
</ul>

## Tham số Header

**Authorization** `string` *required*

[API Key](https://www.ayrshare.com/docs/apis/overview.md#authorization) of the Primary Profile.

Format: `Authorization: Bearer API_KEY`
**Profile-Key** `string`

[Profile Key](https://www.ayrshare.com/docs/apis/overview.md#profile-key-format) of a User Profile.

Format: `Profile-Key: PROFILE_KEY`

**Idempotency-Key** `string` *required*

Một giá trị duy nhất mới, chẳng hạn một UUID, cho mỗi chiến dịch mới. Lặp lại một yêu cầu với cùng khóa sẽ trả về phản hồi đầu tiên. Khi một yêu cầu tạo thất bại trước khi Ayrshare gửi chiến dịch đến Google (ví dụ, một hình ảnh có kích thước không đúng), khóa sẽ được giải phóng, vì vậy bạn có thể sửa yêu cầu và thử lại với cùng khóa đó.

## Tham số Body

**type** `string` *required*

`performanceMax`.

**bidding** `object` *required*

Performance Max chỉ nhận các chiến lược sau. Bất kỳ chiến lược nào khác sẽ trả về `code: 101`.

<ul>
  <li>`maximizeConversions`: đạt nhiều chuyển đổi nhất trong phạm vi ngân sách.</li>
  <li>`targetCpa` kèm `targetCpa`: tương tự, nhắm đến mức chi phí cho mỗi chuyển đổi đó.</li>
  <li>`maximizeConversionValue`: đạt giá trị chuyển đổi cao nhất trong phạm vi ngân sách.</li>
  <li>`targetRoas` kèm `targetRoas`: tương tự, nhắm đến mức lợi nhuận trên chi tiêu quảng cáo đó, ví dụ `3.5` cho 350%.</li>
</ul>

**euPoliticalAdvertising** `boolean` *required*

Google yêu cầu khai báo này trên mọi chiến dịch.

**targeting.locations** `string[]`

Các id vị trí của Google, ví dụ `2840` cho Hoa Kỳ. Bỏ qua trường này để nhắm mục tiêu mọi vị trí.

**platformOptions.google** `object` *required*

**thuộc tính**

**finalUrl** `string` *required*

Trang `http` hoặc `https` mà quảng cáo mở ra.

**assets** `object` *required*

Văn bản và hình ảnh của bạn. Các mục trong mỗi danh sách phải khác nhau.

**thuộc tính**

**headlines** `string[]` *required*

Từ 3 đến 15 mục, mỗi mục tối đa 30 ký tự.

**longHeadlines** `string[]` *required*

Từ 1 đến 5 mục, mỗi mục tối đa 90 ký tự.

**descriptions** `string[]` *required*

Từ 2 đến 5 mục, mỗi mục tối đa 90 ký tự. Ít nhất một mục phải có 60 ký tự trở xuống.

**businessName** `string` *required*

Một tên doanh nghiệp, tối đa 25 ký tự.

**marketingImages** `string[]` *required*

Từ 1 đến 20 URL hình ảnh nằm ngang: tỷ lệ 1.91:1, tối thiểu 600×314.

**squareMarketingImages** `string[]` *required*

Từ 1 đến 20 URL hình ảnh vuông: tỷ lệ 1:1, tối thiểu 300×300.

**logos** `string[]` *required*

Từ 1 đến 5 URL logo vuông: tỷ lệ 1:1, tối thiểu 128×128.

**landscapeLogos** `string[]`

Tối đa 4 URL logo ngang: tỷ lệ 4:1, tối thiểu 512×128. Google nhận tổng cộng tối đa 5 logo và logo ngang.

### Hình ảnh

Ayrshare tải từng hình ảnh xuống từ URL của nó và kiểm tra trước khi gửi bất kỳ thứ gì đến Google:

<ul>
  <li>GIF, JPG hoặc PNG, mỗi tệp tối đa 5120 KB.</li>
  <li>Đạt ít nhất kích thước tối thiểu nêu trên, với tỷ lệ khung hình của trường tương ứng (sai lệch trong phạm vi 1%).</li>
  <li>Tổng dung lượng tất cả hình ảnh tối đa 45 MB.</li>
  <li>URL phải công khai. Các địa chỉ riêng tư sẽ bị từ chối.</li>
</ul>

Một hình ảnh không đạt yêu cầu sẽ trả về `code: 101` kèm tên của hình ảnh đó, ví dụ `platformOptions.google.assets.logos[0]: the image is 100x100; use at least 128x128.`

```bash cURL theme={"system"}
curl \
-H "Authorization: Bearer API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 0b7a6f1c-2d4e-4c55-9a3e-2f8d1b7c9e11" \
-X POST https://api.ayrshare.com/api/ads/google/campaigns \
-d '{
  "accountId": "123-456-7890",
  "name": "Fall sale PMax",
  "type": "performanceMax",
  "budget": { "amount": 40, "type": "daily" },
  "bidding": { "strategy": "maximizeConversions" },
  "targeting": { "locations": ["2840"] },
  "euPoliticalAdvertising": false,
  "platformOptions": {
    "google": {
      "finalUrl": "https://example.com/fall-sale",
      "assets": {
        "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
        "longHeadlines": ["Every running shoe 30% off this week only"],
        "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
        "businessName": "Acme Shoes",
        "marketingImages": ["https://example.com/images/fall-1200x628.png"],
        "squareMarketingImages": ["https://example.com/images/fall-1200x1200.png"],
        "logos": ["https://example.com/images/logo-512.png"]
      }
    }
  }
}'
```

```javascript JavaScript theme={"system"}
const API_KEY = "API_KEY";

fetch("https://api.ayrshare.com/api/ads/google/campaigns", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${API_KEY}`,
    "Content-Type": "application/json",
    "Idempotency-Key": "0b7a6f1c-2d4e-4c55-9a3e-2f8d1b7c9e11"
  },
  body: JSON.stringify({
    "accountId": "123-456-7890",
    "name": "Fall sale PMax",
    "type": "performanceMax",
    "budget": { "amount": 40, "type": "daily" },
    "bidding": { "strategy": "maximizeConversions" },
    "targeting": { "locations": ["2840"] },
    "euPoliticalAdvertising": false,
    "platformOptions": {
      "google": {
        "finalUrl": "https://example.com/fall-sale",
        "assets": {
          "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
          "longHeadlines": ["Every running shoe 30% off this week only"],
          "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
          "businessName": "Acme Shoes",
          "marketingImages": ["https://example.com/images/fall-1200x628.png"],
          "squareMarketingImages": ["https://example.com/images/fall-1200x1200.png"],
          "logos": ["https://example.com/images/logo-512.png"]
        }
      }
    }
  })
})
  .then((res) => res.json())
  .then((json) => console.log(json))
  .catch(console.error);
```

```python Python theme={"system"}
import requests

headers = {
    "Authorization": "Bearer API_KEY",
    "Idempotency-Key": "0b7a6f1c-2d4e-4c55-9a3e-2f8d1b7c9e11",
}

payload = {
  "accountId": "123-456-7890",
  "name": "Fall sale PMax",
  "type": "performanceMax",
  "budget": { "amount": 40, "type": "daily" },
  "bidding": { "strategy": "maximizeConversions" },
  "targeting": { "locations": ["2840"] },
  "euPoliticalAdvertising": False,
  "platformOptions": {
    "google": {
      "finalUrl": "https://example.com/fall-sale",
      "assets": {
        "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
        "longHeadlines": ["Every running shoe 30% off this week only"],
        "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
        "businessName": "Acme Shoes",
        "marketingImages": ["https://example.com/images/fall-1200x628.png"],
        "squareMarketingImages": ["https://example.com/images/fall-1200x1200.png"],
        "logos": ["https://example.com/images/logo-512.png"]
      }
    }
  }
}

r = requests.post("https://api.ayrshare.com/api/ads/google/campaigns", headers=headers, json=payload)

print(r.json())
```

```php PHP theme={"system"}
<?php
$payload = <<<'JSON'
{
  "accountId": "123-456-7890",
  "name": "Fall sale PMax",
  "type": "performanceMax",
  "budget": { "amount": 40, "type": "daily" },
  "bidding": { "strategy": "maximizeConversions" },
  "targeting": { "locations": ["2840"] },
  "euPoliticalAdvertising": false,
  "platformOptions": {
    "google": {
      "finalUrl": "https://example.com/fall-sale",
      "assets": {
        "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
        "longHeadlines": ["Every running shoe 30% off this week only"],
        "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
        "businessName": "Acme Shoes",
        "marketingImages": ["https://example.com/images/fall-1200x628.png"],
        "squareMarketingImages": ["https://example.com/images/fall-1200x1200.png"],
        "logos": ["https://example.com/images/logo-512.png"]
      }
    }
  }
}
JSON;

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://api.ayrshare.com/api/ads/google/campaigns",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer API_KEY",
        "Content-Type: application/json",
        "Idempotency-Key: 0b7a6f1c-2d4e-4c55-9a3e-2f8d1b7c9e11"
    ],
    CURLOPT_POSTFIELDS => $payload
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error: " . $err;
} else {
    echo $response;
}
?>
```

```csharp C# theme={"system"}
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var client = new HttpClient();
        client.DefaultRequestHeaders.Add("Authorization", "Bearer API_KEY");
        client.DefaultRequestHeaders.Add("Idempotency-Key", "0b7a6f1c-2d4e-4c55-9a3e-2f8d1b7c9e11");

        var payload = """
            {
              "accountId": "123-456-7890",
              "name": "Fall sale PMax",
              "type": "performanceMax",
              "budget": { "amount": 40, "type": "daily" },
              "bidding": { "strategy": "maximizeConversions" },
              "targeting": { "locations": ["2840"] },
              "euPoliticalAdvertising": false,
              "platformOptions": {
                "google": {
                  "finalUrl": "https://example.com/fall-sale",
                  "assets": {
                    "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
                    "longHeadlines": ["Every running shoe 30% off this week only"],
                    "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
                    "businessName": "Acme Shoes",
                    "marketingImages": ["https://example.com/images/fall-1200x628.png"],
                    "squareMarketingImages": ["https://example.com/images/fall-1200x1200.png"],
                    "logos": ["https://example.com/images/logo-512.png"]
                  }
                }
              }
            }
            """;

        var response = await client.PostAsync(
            "https://api.ayrshare.com/api/ads/google/campaigns",
            new StringContent(payload, Encoding.UTF8, "application/json"));
        var content = await response.Content.ReadAsStringAsync();

        Console.WriteLine(content);
    }
}
```

```go Go theme={"system"}
package main

import (
    "fmt"
    "io"
    "net/http"
    "strings"
)

func main() {
    payload := `{
  "accountId": "123-456-7890",
  "name": "Fall sale PMax",
  "type": "performanceMax",
  "budget": { "amount": 40, "type": "daily" },
  "bidding": { "strategy": "maximizeConversions" },
  "targeting": { "locations": ["2840"] },
  "euPoliticalAdvertising": false,
  "platformOptions": {
    "google": {
      "finalUrl": "https://example.com/fall-sale",
      "assets": {
        "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
        "longHeadlines": ["Every running shoe 30% off this week only"],
        "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
        "businessName": "Acme Shoes",
        "marketingImages": ["https://example.com/images/fall-1200x628.png"],
        "squareMarketingImages": ["https://example.com/images/fall-1200x1200.png"],
        "logos": ["https://example.com/images/logo-512.png"]
      }
    }
  }
}`

    req, _ := http.NewRequest("POST", "https://api.ayrshare.com/api/ads/google/campaigns", strings.NewReader(payload))
    req.Header.Add("Authorization", "Bearer API_KEY")
    req.Header.Add("Content-Type", "application/json")
    req.Header.Add("Idempotency-Key", "0b7a6f1c-2d4e-4c55-9a3e-2f8d1b7c9e11")

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
```

```java Java theme={"system"}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class CreateCampaign {
    public static void main(String[] args) throws Exception {
        String payload = """
            {
              "accountId": "123-456-7890",
              "name": "Fall sale PMax",
              "type": "performanceMax",
              "budget": { "amount": 40, "type": "daily" },
              "bidding": { "strategy": "maximizeConversions" },
              "targeting": { "locations": ["2840"] },
              "euPoliticalAdvertising": false,
              "platformOptions": {
                "google": {
                  "finalUrl": "https://example.com/fall-sale",
                  "assets": {
                    "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
                    "longHeadlines": ["Every running shoe 30% off this week only"],
                    "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
                    "businessName": "Acme Shoes",
                    "marketingImages": ["https://example.com/images/fall-1200x628.png"],
                    "squareMarketingImages": ["https://example.com/images/fall-1200x1200.png"],
                    "logos": ["https://example.com/images/logo-512.png"]
                  }
                }
              }
            }
            """;

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.ayrshare.com/api/ads/google/campaigns"))
            .header("Authorization", "Bearer API_KEY")
            .header("Content-Type", "application/json")
            .header("Idempotency-Key", "0b7a6f1c-2d4e-4c55-9a3e-2f8d1b7c9e11")
            .POST(HttpRequest.BodyPublishers.ofString(payload))
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
    }
}
```

```ruby Ruby theme={"system"}
require 'net/http'
require 'uri'

uri = URI.parse('https://api.ayrshare.com/api/ads/google/campaigns')

request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer API_KEY'
request['Content-Type'] = 'application/json'
request['Idempotency-Key'] = '0b7a6f1c-2d4e-4c55-9a3e-2f8d1b7c9e11'
request.body = <<~JSON
  {
    "accountId": "123-456-7890",
    "name": "Fall sale PMax",
    "type": "performanceMax",
    "budget": { "amount": 40, "type": "daily" },
    "bidding": { "strategy": "maximizeConversions" },
    "targeting": { "locations": ["2840"] },
    "euPoliticalAdvertising": false,
    "platformOptions": {
      "google": {
        "finalUrl": "https://example.com/fall-sale",
        "assets": {
          "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
          "longHeadlines": ["Every running shoe 30% off this week only"],
          "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
          "businessName": "Acme Shoes",
          "marketingImages": ["https://example.com/images/fall-1200x628.png"],
          "squareMarketingImages": ["https://example.com/images/fall-1200x1200.png"],
          "logos": ["https://example.com/images/logo-512.png"]
        }
      }
    }
  }
JSON

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(request)
end

puts response.body
```

```json 200: Campaign Created theme={"system"}
{
  "status": "success",
  "platform": "google",
  "campaignId": "21534567891",
  "assetGroupId": "6512345678",
  "campaignStatus": "paused"
}
```

```json 200: Created, No Conversion Tracking theme={"system"}
{
  "status": "success",
  "platform": "google",
  "campaignId": "21534567891",
  "assetGroupId": "6512345678",
  "campaignStatus": "paused",
  "warnings": [
    "This Google Ads account has no conversion tracking. Performance Max optimizes for conversions, so Google may limit the campaign's spend until you set up conversion tracking in Google Ads."
  ]
}
```

```json 400: Image Too Small theme={"system"}
{
  "action": "request",
  "status": "error",
  "code": 101,
  "message": "Missing or incorrect parameters. Please verify with the docs. https://www.ayrshare.com/docs/apis",
  "details": "platformOptions.google.assets.logos[0]: the image is 100x100; use at least 128x128."
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.