> ## 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.

# Campagnes sur le Réseau de Recherche Google

> Créez une campagne Google Ads sur le Réseau de Recherche avec son budget, ses mots clés, le texte de l'annonce et le ciblage géographique en une seule requête

Créez une campagne Google Ads sur le Réseau de Recherche en une seule requête. Ayrshare crée ensemble le budget, la campagne, un groupe d'annonces, vos mots clés, une annonce responsive sur le Réseau de Recherche et le ciblage géographique. Si Google refuse l'un de ces éléments, rien n'est créé.

La requête utilise la structure commune décrite dans [Campagnes publicitaires](https://www.ayrshare.com/docs/apis/ads/campaigns.md). Cette page présente ce qui est propre à Google.

<ul>
  <li>Les annonces Google sont activées compte par compte. Contactez-nous pour les activer.</li>
  <li>Associez d'abord Google Ads depuis la page "Social Accounts". `accountId` est l'ID client Google Ads à 10 chiffres, avec ou sans tirets (`123-456-7890`).</li>
  <li>L'utilisateur Google que vous associez doit avoir un accès direct au compte publicitaire. Les comptes auxquels vous accédez uniquement via un compte administrateur ne sont pas listés et ne peuvent pas encore être utilisés : ajoutez cet utilisateur directement au compte publicitaire. Les comptes administrateur ne sont pas listés non plus : ils ne peuvent pas contenir de campagnes.</li>
  <li>Les nouvelles campagnes démarrent en `paused` sauf si vous envoyez `status: "active"`.</li>
  <li>Le budget est quotidien, dans la devise du compte publicitaire. N'envoyez pas `budget.currency` : il renvoie `code: 101`.</li>
  <li>Les dépenses dans une autre devise sont converties en USD pour la facturation au taux de change du jour fourni par Open Exchange Rates. Un compte dans une devise qui ne peut pas être convertie renvoie `code: 101` avant que quoi que ce soit ne soit créé.</li>
  <li>Les annonces sont diffusées uniquement sur Google Search, et non sur les partenaires du Réseau de Recherche ni sur le Réseau Display.</li>
</ul>

> [!NOTE]
>
> **Suivi des conversions.** `maximizeConversions` ne fonctionne que si le suivi des conversions est configuré dans votre compte Google Ads. Ayrshare ne le configure pas pour vous. Sans lui, utilisez `maximizeClicks` ou `manualCpc`.

## Paramètres d'en-tête

**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*

Une nouvelle valeur unique, comme un UUID, pour chaque nouvelle campagne. Répéter une requête avec la même clé renvoie la première réponse et ne crée rien de nouveau. Lorsqu'une création échoue avant qu'Ayrshare n'envoie la campagne à Google, la clé est libérée : vous pouvez donc corriger la requête et réessayer avec la même clé. Cela couvre une valeur refusée par Ayrshare (comme une stratégie d'enchères non prise en charge), un compte dans une devise qui ne peut pas être convertie en USD, et tout échec de la vérification du compte qu'Ayrshare effectue en premier, y compris un refus de Google. Une création qui échoue une fois la campagne envoyée à Google conserve sa réponse : réessayez-la avec une nouvelle clé.

## Paramètres du corps

Les champs communs fonctionnent comme décrit dans [Campagnes publicitaires](https://www.ayrshare.com/docs/apis/ads/campaigns.md). Sur Google :

**type** `string` *required*

`search`.

**bidding.strategy** `string` *required*

`maximizeClicks`, `manualCpc` ou `maximizeConversions`. Toute autre valeur renvoie `code: 101`.

**euPoliticalAdvertising** `boolean` *required*

Google exige cette déclaration pour chaque campagne. Tant qu'une campagne d'un compte n'est pas déclarée, Google refuse toute modification des campagnes de ce compte.

**schedule** `object`

Google planifie des journées entières dans le fuseau horaire du compte publicitaire. `start` commence à 00:00:00 le jour indiqué et `end` s'arrête à 23:59:59 le jour indiqué ; l'heure que vous envoyez ne sert qu'à choisir le jour. `start` peut être aujourd'hui, mais pas un jour antérieur. Pour une campagne d'une seule journée, envoyez la même date pour `start` et `end`. Un `end` tombant un jour antérieur à `start` renvoie `code: 101`.

**targeting** `object`

Google associe les annonces sur le Réseau de Recherche aux internautes en fonction de la langue du texte de votre annonce : il n'y a donc pas de paramètre de langue. Envoyer `targeting.languages` renvoie `code: 101`.

**propriétés**

**locations** `string[]`

Les ID de zones géographiques Google, par exemple `2840` pour les États-Unis. Trouvez les ID dans la [liste des cibles géographiques](https://developers.google.com/google-ads/api/data/geotargets) de Google. Omettez ce champ pour cibler toutes les zones géographiques.

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

**propriétés**

**finalUrl** `string` *required*

La page `http` ou `https` qu'ouvre l'annonce.

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

De 3 à 15 titres, de 30 caractères maximum chacun.

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

De 2 à 4 descriptions, de 90 caractères maximum chacune.

**path1** `string`

Première partie du chemin d'affichage, affichée après le domaine, 15 caractères maximum.

**path2** `string`

Seconde partie du chemin d'affichage, 15 caractères maximum. Nécessite `path1`.

**keywords** `object[]` *required*

Au moins un mot clé : `{ "text": string, "matchType": "exact" | "phrase" | "broad" }`. `text` contient au maximum 80 caractères et 10 mots.

**maxCpc** `number`

Le montant maximal à payer par clic, dans la devise du compte. Obligatoire avec `manualCpc`. Avec `maximizeClicks`, il plafonne chaque enchère. Non accepté avec `maximizeConversions`.

```bash cURL theme={"system"}
curl \
-H "Authorization: Bearer API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f1c2d4e-0b7a-4c55-9a3e-2f8d1b7c9e10" \
-X POST https://api.ayrshare.com/api/ads/google/campaigns \
-d '{
  "accountId": "123-456-7890",
  "name": "Fall sale",
  "type": "search",
  "budget": { "amount": 25, "type": "daily" },
  "bidding": { "strategy": "maximizeClicks" },
  "targeting": { "locations": ["2840"] },
  "euPoliticalAdvertising": false,
  "platformOptions": {
    "google": {
      "finalUrl": "https://example.com/fall-sale",
      "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
      "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
      "path1": "shoes",
      "keywords": [
        { "text": "running shoes", "matchType": "phrase" },
        { "text": "trail running shoes", "matchType": "exact" }
      ]
    }
  }
}'
```

```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": "6f1c2d4e-0b7a-4c55-9a3e-2f8d1b7c9e10"
  },
  body: JSON.stringify({
    "accountId": "123-456-7890",
    "name": "Fall sale",
    "type": "search",
    "budget": { "amount": 25, "type": "daily" },
    "bidding": { "strategy": "maximizeClicks" },
    "targeting": { "locations": ["2840"] },
    "euPoliticalAdvertising": false,
    "platformOptions": {
      "google": {
        "finalUrl": "https://example.com/fall-sale",
        "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
        "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
        "path1": "shoes",
        "keywords": [
          { "text": "running shoes", "matchType": "phrase" },
          { "text": "trail running shoes", "matchType": "exact" }
        ]
      }
    }
  })
})
  .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": "6f1c2d4e-0b7a-4c55-9a3e-2f8d1b7c9e10",
}

payload = {
  "accountId": "123-456-7890",
  "name": "Fall sale",
  "type": "search",
  "budget": { "amount": 25, "type": "daily" },
  "bidding": { "strategy": "maximizeClicks" },
  "targeting": { "locations": ["2840"] },
  "euPoliticalAdvertising": False,
  "platformOptions": {
    "google": {
      "finalUrl": "https://example.com/fall-sale",
      "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
      "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
      "path1": "shoes",
      "keywords": [
        { "text": "running shoes", "matchType": "phrase" },
        { "text": "trail running shoes", "matchType": "exact" }
      ]
    }
  }
}

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",
  "type": "search",
  "budget": { "amount": 25, "type": "daily" },
  "bidding": { "strategy": "maximizeClicks" },
  "targeting": { "locations": ["2840"] },
  "euPoliticalAdvertising": false,
  "platformOptions": {
    "google": {
      "finalUrl": "https://example.com/fall-sale",
      "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
      "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
      "path1": "shoes",
      "keywords": [
        { "text": "running shoes", "matchType": "phrase" },
        { "text": "trail running shoes", "matchType": "exact" }
      ]
    }
  }
}
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: 6f1c2d4e-0b7a-4c55-9a3e-2f8d1b7c9e10"
    ],
    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", "6f1c2d4e-0b7a-4c55-9a3e-2f8d1b7c9e10");

        var payload = """
            {
              "accountId": "123-456-7890",
              "name": "Fall sale",
              "type": "search",
              "budget": { "amount": 25, "type": "daily" },
              "bidding": { "strategy": "maximizeClicks" },
              "targeting": { "locations": ["2840"] },
              "euPoliticalAdvertising": false,
              "platformOptions": {
                "google": {
                  "finalUrl": "https://example.com/fall-sale",
                  "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
                  "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
                  "path1": "shoes",
                  "keywords": [
                    { "text": "running shoes", "matchType": "phrase" },
                    { "text": "trail running shoes", "matchType": "exact" }
                  ]
                }
              }
            }
            """;

        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",
  "type": "search",
  "budget": { "amount": 25, "type": "daily" },
  "bidding": { "strategy": "maximizeClicks" },
  "targeting": { "locations": ["2840"] },
  "euPoliticalAdvertising": false,
  "platformOptions": {
    "google": {
      "finalUrl": "https://example.com/fall-sale",
      "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
      "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
      "path1": "shoes",
      "keywords": [
        { "text": "running shoes", "matchType": "phrase" },
        { "text": "trail running shoes", "matchType": "exact" }
      ]
    }
  }
}`

    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", "6f1c2d4e-0b7a-4c55-9a3e-2f8d1b7c9e10")

    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",
              "type": "search",
              "budget": { "amount": 25, "type": "daily" },
              "bidding": { "strategy": "maximizeClicks" },
              "targeting": { "locations": ["2840"] },
              "euPoliticalAdvertising": false,
              "platformOptions": {
                "google": {
                  "finalUrl": "https://example.com/fall-sale",
                  "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
                  "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
                  "path1": "shoes",
                  "keywords": [
                    { "text": "running shoes", "matchType": "phrase" },
                    { "text": "trail running shoes", "matchType": "exact" }
                  ]
                }
              }
            }
            """;

        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", "6f1c2d4e-0b7a-4c55-9a3e-2f8d1b7c9e10")
            .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'] = '6f1c2d4e-0b7a-4c55-9a3e-2f8d1b7c9e10'
request.body = <<~JSON
  {
    "accountId": "123-456-7890",
    "name": "Fall sale",
    "type": "search",
    "budget": { "amount": 25, "type": "daily" },
    "bidding": { "strategy": "maximizeClicks" },
    "targeting": { "locations": ["2840"] },
    "euPoliticalAdvertising": false,
    "platformOptions": {
      "google": {
        "finalUrl": "https://example.com/fall-sale",
        "headlines": ["Fall sale", "Shoes 30% off", "Free returns"],
        "descriptions": ["Every shoe 30% off this week.", "Free returns on every order."],
        "path1": "shoes",
        "keywords": [
          { "text": "running shoes", "matchType": "phrase" },
          { "text": "trail running shoes", "matchType": "exact" }
        ]
      }
    }
  }
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": "21534567890",
  "adGroupId": "16812345678",
  "adId": "71234567890",
  "campaignStatus": "paused"
}
```

```json 400: Too Few Headlines 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.headlines: Supply at least 3 headlines."
}
```

## Erreurs

| Code | Quand |
| - | - |
| `101` | Un champ est manquant ou invalide. `details` l'indique. |
| `205` | Google a refusé la requête : par exemple, le compte contient déjà une campagne portant ce nom, ou le texte de l'annonce enfreint les règles publicitaires de Google. `details` indique ce qu'il faut modifier. |
| `400` | L'utilisateur Google que vous avez associé ne peut pas accéder à ce compte publicitaire, l'accès à Google Ads a été révoqué, la campagne ne vous appartient pas, ou une modification cible une campagne supprimée dans Google Ads. |
| `370` | Google n'a pas pu traiter la requête, ou Google n'a pas encore approuvé l'accès d'Ayrshare. `details` inclut l'ID de requête Google lorsqu'il existe. Une création qui renvoie `370` parce que la réponse de Google a été perdue peut tout de même avoir créé la campagne. Google refuse une deuxième campagne portant le même nom dans un même compte : réessayer avec le même `name` renvoie donc `205` au lieu de créer un doublon. |


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