Объекты, методы и службы

В этом руководстве представлены объекты и методы AdWords API на примере основных задач управления кампаниями. Затем описываются службы, предлагаемые API, со ссылками на соответствующие справочные страницы.

AdWords API предназначен для опытных пользователей, хорошо знакомых с системой AdWords. Если вы новичок или хотите освежить свои знания, рекомендуем ознакомиться с этим руководством.

Иерархия и область действия объекта

Аккаунт AdWords представляет собой иерархическую структуру, состоящую из объектов разного уровня.

В каждом аккаунте есть одна или несколько рекламных кампаний, представленных объектами Campaigns.

В каждую кампанию входит несколько групп объявлений, то есть объектов типа AdGroups.

Они, в свою очередь, включают несколько объектов AdGroupAds и AdGroupCriteria. Каждый объект AdGroupAd представляет собой объявление, а AdGroupCriterion – критерий таргетинга (например, ключевое слово), определяющий, в каких случаях должна показываться реклама.

Критерии таргетинга можно задавать и на уровне всей кампании. На этом же уровне можно задавать бюджеты и даты.

И наконец, на уровне кампании работают расширения объявлений, которые позволяют добавлять в объявления дополнительную информацию: телефонные номера, адреса и т. д.

У каждого объекта в AdWords есть собственный идентификатор. Некоторые из них уникальны на глобальном уровне, а другие – только на строго определенном. В таблице ниже описывается уникальность идентификаторов каждого объекта в AdWords.

Идентификатор объекта Уровень уникальности Глобальный или нет
Идентификатор бюджета Глобальный Да
Идентификатор кампании Глобальный Да
Идентификатор группы объявлений Глобальный Да
Идентификатор объявления Группа объявлений Нет. Пара (AdGroupId,AdId) уникальна на глобальном уровне.
Идентификатор критерия группы объявлений Группа объявлений Нет. Пара (AdGroupId,CriterionId) уникальна на глобальном уровне.
Идентификатор критерия кампании Кампания Нет. Пара (CampaignId,CriterionId) уникальна на глобальном уровне.
Расширения объявлений Кампания Нет. Пара (CampaignId,AdExtensionId) уникальна на глобальном уровне.
Идентификатор фида Глобальный Да
Идентификатор элемента фида Глобальный Да
Идентификатор атрибута фида Фид Нет
Идентификатор сопоставления фида Глобальный Да
Идентификатор ярлыка Глобальный Да

Эти правила можно использовать при создании локальной базы данных для хранения объектов AdWords.

Если объект является производным от другого, он также будет содержать поле Type. Например, у объекта TextAd будет поле Type, указывающее на то, что он является производным от объекта Ad. При использовании динамического языка с помощью этого поля можно проверить, относится ли объект к какому-либо конкретному типу (например, принадлежит ли объект Ad к типу TextAd.

Методы и операции

AdWords API предлагает ряд служб для управления объектами AdWords. Так, служба CampaignService предназначена для управления кампаниями, служба AdGroupService – для работы с группами объявлений и т. д.

Все такие службы используют два стандартных метода: get() и mutate().

Метод get()

Метод get() используется для извлечения объектов AdWords. Например, CampaignService.get() позволяет получить список кампаний.

Метод get() в качестве входных данных принимает selector, а в качестве результата возвращает page. По умолчанию API AdWords не возвращает все поля объекта. Список fields необходимо предоставить при создании селектора.

Затем результаты можно отфильтровать с помощью поля predicates, упорядочить с помощью поля ordering или сузить с помощью поля dateRange, ограничив диапазон дат.

Если вы извлекаете большое количество объектов, необходимо также установить поле paging. Если этого не сделать, AdWords API выдаст ошибку SizeLimitError.RESPONSE_SIZE_LIMIT_EXCEEDED.

В приведенном ниже примере иллюстрируется практическая реализация описанных выше принципов. Этот код извлекает и отображает все кампании в аккаунте.

Java

// Get the CampaignService.
CampaignServiceInterface campaignService =
    adWordsServices.get(session, CampaignServiceInterface.class);

int offset = 0;

// Create selector.
SelectorBuilder builder = new SelectorBuilder();
Selector selector = builder
    .fields(CampaignField.Id, CampaignField.Name)
    .orderAscBy(CampaignField.Name)
    .offset(offset)
    .limit(PAGE_SIZE)
    .build();

CampaignPage page;
do {
  // Get all campaigns.
  page = campaignService.get(selector);

  // Display campaigns.
  if (page.getEntries() != null) {
    for (Campaign campaign : page.getEntries()) {
      System.out.printf("Campaign with name '%s' and ID %d was found.%n", campaign.getName(),
          campaign.getId());
    }
  } else {
    System.out.println("No campaigns were found.");
  }

  offset += PAGE_SIZE;
  selector = builder.increaseOffsetBy(PAGE_SIZE).build();
} while (offset < page.getTotalNumEntries());

C#

using (CampaignService campaignService =
    (CampaignService) user.GetService(AdWordsService.v201802.CampaignService)) {

  // Create the selector.
  Selector selector = new Selector() {
    fields = new string[] {
      Campaign.Fields.Id, Campaign.Fields.Name, Campaign.Fields.Status
    },
    paging = Paging.Default
  };

  CampaignPage page = new CampaignPage();

  try {
    do {
      // Get the campaigns.
      page = campaignService.get(selector);

      // Display the results.
      if (page != null && page.entries != null) {
        int i = selector.paging.startIndex;
        foreach (Campaign campaign in page.entries) {
          Console.WriteLine("{0}) Campaign with id = '{1}', name = '{2}' and " +
              "status = '{3}' was found.", i + 1, campaign.id,
              campaign.name, campaign.status);
          i++;
        }
      }
      selector.paging.IncreaseOffset();
    } while (selector.paging.startIndex < page.totalNumEntries);
    Console.WriteLine("Number of campaigns found: {0}", page.totalNumEntries);
  } catch (Exception e) {
    throw new System.ApplicationException("Failed to retrieve campaigns", e);
  }

Python

# Initialize appropriate service.
campaign_service = client.GetService('CampaignService', version='v201802')

# Construct selector and get all campaigns.
offset = 0
selector = {
    'fields': ['Id', 'Name', 'Status'],
    'paging': {
        'startIndex': str(offset),
        'numberResults': str(PAGE_SIZE)
    }
}

more_pages = True
while more_pages:
  page = campaign_service.get(selector)

  # Display results.
  if 'entries' in page:
    for campaign in page['entries']:
      print ('Campaign with id "%s", name "%s", and status "%s" was '
             'found.' % (campaign['id'], campaign['name'],
                         campaign['status']))
  else:
    print 'No campaigns were found.'
  offset += PAGE_SIZE
  selector['paging']['startIndex'] = str(offset)
  more_pages = offset < int(page['totalNumEntries'])

PHP

$campaignService = $adWordsServices->get($session, CampaignService::class);

// Create selector.
$selector = new Selector();
$selector->setFields(['Id', 'Name']);
$selector->setOrdering([new OrderBy('Name', SortOrder::ASCENDING)]);
$selector->setPaging(new Paging(0, self::PAGE_LIMIT));

$totalNumEntries = 0;
do {
    // Make the get request.
    $page = $campaignService->get($selector);

    // Display results.
    if ($page->getEntries() !== null) {
        $totalNumEntries = $page->getTotalNumEntries();
        foreach ($page->getEntries() as $campaign) {
            printf(
                "Campaign with ID %d and name '%s' was found.\n",
                $campaign->getId(),
                $campaign->getName()
            );
        }
    }

    // Advance the paging index.
    $selector->getPaging()->setStartIndex(
        $selector->getPaging()->getStartIndex() + self::PAGE_LIMIT
    );
} while ($selector->getPaging()->getStartIndex() < $totalNumEntries);

printf("Number of results found: %d\n", $totalNumEntries);

Perl

# Create selector.
my $paging = Google::Ads::AdWords::v201802::Paging->new({
    startIndex    => 0,
    numberResults => PAGE_SIZE
});
my $selector = Google::Ads::AdWords::v201802::Selector->new({
    fields   => ["Id", "Name"],
    ordering => [
      Google::Ads::AdWords::v201802::OrderBy->new({
          field     => "Name",
          sortOrder => "ASCENDING"
        })
    ],
    paging => $paging
  });

# Paginate through results.
# The contents of the subroutine will be executed for each campaign.
Google::Ads::AdWords::Utilities::PageProcessor->new({
    client   => $client,
    service  => $client->CampaignService(),
    selector => $selector
  }
  )->process_entries(
  sub {
    my ($campaign) = @_;
    printf "Campaign with name \"%s\" and id \"%d\" was found.\n",
      $campaign->get_name(), $campaign->get_id();
  });

Ruby

campaign_srv = adwords.service(:CampaignService, API_VERSION)

# Get all the campaigns for this account.
selector = {
  :fields => ['Id', 'Name', 'Status'],
  :ordering => [
    {:field => 'Name', :sort_order => 'ASCENDING'}
  ],
  :paging => {
    :start_index => 0,
    :number_results => PAGE_SIZE
  }
}

# Set initial values.
offset, page = 0, {}

begin
  page = campaign_srv.get(selector)
  if page[:entries]
    page[:entries].each do |campaign|
      puts "Campaign ID %d, name '%s' and status '%s'" %
          [campaign[:id], campaign[:name], campaign[:status]]
    end
    # Increment values to request the next page.
    offset += PAGE_SIZE
    selector[:paging][:start_index] = offset
  end
end while page[:total_num_entries] > offset

if page.include?(:total_num_entries)
  puts "\tTotal number of campaigns found: %d." % [page[:total_num_entries]]
end

VB.NET

Using campaignService As CampaignService = CType(user.GetService(
    AdWordsService.v201802.CampaignService), CampaignService)

  ' Create the selector.
  Dim selector As New Selector
  selector.fields = New String() {
    Campaign.Fields.Id, Campaign.Fields.Name, Campaign.Fields.Status
  }
  selector.paging = Paging.Default

  Dim page As New CampaignPage

  Try
    Do
      ' Get the campaigns.
      page = campaignService.get(selector)

      ' Display the results.
      If ((Not page Is Nothing) AndAlso (Not page.entries Is Nothing)) Then
        Dim i As Integer = selector.paging.startIndex
        For Each campaign As Campaign In page.entries
          Console.WriteLine("{0}) Campaign with id = '{1}', name = '{2}' and status = " &
            "'{3}' was found.", i + 1, campaign.id, campaign.name, campaign.status)
          i += 1
        Next
      End If
      selector.paging.IncreaseOffset()
    Loop While (selector.paging.startIndex < page.totalNumEntries)
    Console.WriteLine("Number of campaigns found: {0}", page.totalNumEntries)
  Catch e As Exception
    Throw New System.ApplicationException("Failed to retrieve campaign(s).", e)
  End Try

Подробнее о доступных полях селектора для разных служб.

Наши клиентские библиотеки содержат примеры кода с использованием метода get() для всех служб управления кампаниями. Ниже приведены примеры клиентских библиотек для служб управления кампаниями на разных языках программирования.

Метод query()

Метод query() является альтернативой методу get(). Вместо селекторов в нем используется SQL-подобный язык (AWQL). Создание того же запроса на AWQL обычно является более эффективным. Метод query() поддерживается большинством основных служб. Обратите внимание, что AWQL не поддерживает изменение данных с помощью метода mutate.

Продемонстрируем возможности AWQL с помощью приведенного выше примера. Вместо селектора из четырех строк используется всего одна строка, которая содержит всю нужную информацию.

Java

String query = "SELECT Id, Name, Status ORDER BY Name";

C#

// Create the query.
string query = "SELECT Id, Name, Status ORDER BY Name";

Python

query = (adwords.ServiceQueryBuilder()
         .Select('Id', 'Name', 'Status')
         .Where('Status').EqualTo('ENABLED')
         .OrderBy('Name')
         .Limit(0, PAGE_SIZE)
         .Build())

PHP

$query = (new ServiceQueryBuilder())
    ->select(['Id', 'Name', 'Status'])
    ->orderByAsc('Name')
    ->limit(0, self::PAGE_LIMIT)
    ->build();

Perl

my $query =
  Google::Ads::AdWords::Utilities::ServiceQueryBuilder->new(
  {client => $client})
  ->select(["Id", "Name", "Status"])
  ->order_by("Name")
  ->build();

Ruby

# Get all the campaigns for this account.
query_builder = adwords.service_query_builder do |b|
  b.select('Id', 'Name', 'Status')
  b.order_by_asc('Name')
  b.limit(0, PAGE_SIZE)
end
query = query_builder.build

VB.NET

' Create the query.
Dim query As String = "SELECT Id, Name, Status ORDER BY Name"

Обратите внимание, что предложение FROM отсутствует. Это связано с тем, что выбор уже определяется службой, которой принадлежит используемый метод query(). AWQL поддерживает предложение FROM только при создании отчетов. Для использования этой строки нужно просто вызвать метод query требуемой службы.

Java

CampaignPage page = null;
do {
  String pageQuery = query + String.format(" LIMIT %d, %d", offset, PAGE_SIZE);
  // Get all campaigns.
  page = campaignService.query(pageQuery);

  // Display campaigns.
  if (page.getEntries() != null) {
    for (Campaign campaign : page.getEntries()) {
      System.out.printf("Campaign with name '%s' and ID %d was found.%n", campaign.getName(),
          campaign.getId());
    }
  } else {
    System.out.println("No campaigns were found.");
  }

  offset += PAGE_SIZE;
} while (offset < page.getTotalNumEntries());

C#

int offset = 0;
int pageSize = 500;

CampaignPage page = new CampaignPage();

try {
  do {
    string queryWithPaging = string.Format("{0} LIMIT {1}, {2}", query, offset, pageSize);

    // Get the campaigns.
    page = campaignService.query(queryWithPaging);

    // Display the results.
    if (page != null && page.entries != null) {
      int i = offset;
      foreach (Campaign campaign in page.entries) {
        Console.WriteLine("{0}) Campaign with id = '{1}', name = '{2}' and status = " +
            "'{3}' was found.", i + 1, campaign.id, campaign.name, campaign.status);
        i++;
      }
    }
    offset += pageSize;
  } while (offset < page.totalNumEntries);
  Console.WriteLine("Number of campaigns found: {0}", page.totalNumEntries);
} catch (Exception e) {
  throw new System.ApplicationException("Failed to retrieve campaigns", e);
}

Python

for page in query.Pager(campaign_service):
  # Display results.
  if 'entries' in page:
    for campaign in page['entries']:
      print ('Campaign with id "%s", name "%s", and status "%s" was '
             'found.' % (campaign['id'], campaign['name'],
                         campaign['status']))
  else:
    print 'No campaigns were found.'

PHP

do {

    // Advance the paging offset in subsequent iterations only.
    if (isset($page)) {
        $query->nextPage();
    }

    // Make a request using an AWQL string. This request will return the
    // first page containing up to `self::PAGE_LIMIT` results
    $page = $campaignService->query(sprintf('%s', $query));

    // Display results from second and subsequent pages.
    if ($page->getEntries() !== null) {
        foreach ($page->getEntries() as $campaign) {
            printf(
                "Campaign with ID %d and name '%s' was found.\n",
                $campaign->getId(),
                $campaign->getName()
            );
        }
    }
} while ($query->hasNext($page));

printf("Number of results found: %d\n",
    $page->getTotalNumEntries());

Perl

Google::Ads::AdWords::Utilities::PageProcessor->new({
    client    => $client,
    service   => $client->CampaignService(),
    query     => $query,
    page_size => PAGE_SIZE
  }
  )->process_entries(
  sub {
    my ($campaign) = @_;
    printf "Campaign with name \"%s\" and id \"%d\" was found.\n",
      $campaign->get_name(), $campaign->get_id();
  });

Ruby

loop do
  page_query = query.to_s
  page = campaign_srv.query(page_query)
  if page[:entries]
    page[:entries].each do |campaign|
      puts "Campaign ID %d, name '%s' and status '%s'" %
          [campaign[:id], campaign[:name], campaign[:status]]
    end
  end
  break unless query.has_next(page)
  query.next_page
end

if page.include?(:total_num_entries)
  puts "\tTotal number of campaigns found: %d." % page[:total_num_entries]
end

VB.NET

Dim offset As Long = 0
Dim pageSize As Long = 500

Dim page As New CampaignPage()

Try
  Do
    Dim queryWithPaging As String = String.Format("{0} LIMIT {1}, {2}", query, offset,
        pageSize)

    ' Get the campaigns.
    page = campaignService.query(queryWithPaging)

    ' Display the results.
    If ((Not page Is Nothing) AndAlso (Not page.entries Is Nothing)) Then
      Dim i As Integer = CInt(offset)
      For Each campaign As Campaign In page.entries
        Console.WriteLine("{0}) Campaign with id = '{1}', name = '{2}' and status = " &
            "'{3}' was found.", i, campaign.id, campaign.name, campaign.status)
        i += 1
      Next
    End If
    offset = offset + pageSize
  Loop While (offset < page.totalNumEntries)
  Console.WriteLine("Number of campaigns found: {0}", page.totalNumEntries)
Catch e As Exception
  Throw New System.ApplicationException("Failed to retrieve campaign(s).", e)
End Try

Результаты этого вызова будут аналогичны результатам вызова get() в примере выше. В целом это более лаконичный и интуитивный способ написания запросов по сравнению с вызовом get(). Подробнее читайте в руководстве по AWQL.

Метод mutate()

Метод mutate() используется для изменения (создания, обновления или удаления) объектов AdWords.

Чтобы изменить какой-либо объект, необходимо создать соответствующий объект Operation. Например, CampaignOperation позволяет модифицировать объект Campaign.

Поле operator определяет тип выполняемой операции (ADD SET или REMOVE), а поле operand содержит изменяемый объект. Например, код добавления кампании может выглядеть так:

Java

// Get the CampaignService.
CampaignServiceInterface campaignService =
    adWordsServices.get(session, CampaignServiceInterface.class);

// Create campaign.
Campaign campaign = new Campaign();
campaign.setName("Interplanetary Cruise #" + System.currentTimeMillis());

// Recommendation: Set the campaign to PAUSED when creating it to prevent
// the ads from immediately serving. Set to ENABLED once you've added
// targeting and the ads are ready to serve.
campaign.setStatus(CampaignStatus.PAUSED);

BiddingStrategyConfiguration biddingStrategyConfiguration = new BiddingStrategyConfiguration();
biddingStrategyConfiguration.setBiddingStrategyType(BiddingStrategyType.MANUAL_CPC);

// You can optionally provide a bidding scheme in place of the type.
ManualCpcBiddingScheme cpcBiddingScheme = new ManualCpcBiddingScheme();
biddingStrategyConfiguration.setBiddingScheme(cpcBiddingScheme);

campaign.setBiddingStrategyConfiguration(biddingStrategyConfiguration);

// You can optionally provide these field(s).
campaign.setStartDate(new DateTime().plusDays(1).toString("yyyyMMdd"));
campaign.setEndDate(new DateTime().plusDays(30).toString("yyyyMMdd"));
campaign.setFrequencyCap(new FrequencyCap(5L, TimeUnit.DAY, Level.ADGROUP));

// Only the budgetId should be sent, all other fields will be ignored by CampaignService.
Budget budget = new Budget();
budget.setBudgetId(budgetId);
campaign.setBudget(budget);

campaign.setAdvertisingChannelType(AdvertisingChannelType.SEARCH);

// Set the campaign network options to Search and Search Network.
NetworkSetting networkSetting = new NetworkSetting();
networkSetting.setTargetGoogleSearch(true);
networkSetting.setTargetSearchNetwork(true);
networkSetting.setTargetContentNetwork(false);
networkSetting.setTargetPartnerSearchNetwork(false);
campaign.setNetworkSetting(networkSetting);

// Set options that are not required.
GeoTargetTypeSetting geoTarget = new GeoTargetTypeSetting();
geoTarget.setPositiveGeoTargetType(GeoTargetTypeSettingPositiveGeoTargetType.DONT_CARE);
campaign.setSettings(new Setting[] {geoTarget});

// You can create multiple campaigns in a single request.
Campaign campaign2 = new Campaign();
campaign2.setName("Interplanetary Cruise banner #" + System.currentTimeMillis());
campaign2.setStatus(CampaignStatus.PAUSED);
BiddingStrategyConfiguration biddingStrategyConfiguration2 = new BiddingStrategyConfiguration();
biddingStrategyConfiguration2.setBiddingStrategyType(BiddingStrategyType.MANUAL_CPC);
campaign2.setBiddingStrategyConfiguration(biddingStrategyConfiguration2);

Budget budget2 = new Budget();
budget2.setBudgetId(budgetId);
campaign2.setBudget(budget2);

campaign2.setAdvertisingChannelType(AdvertisingChannelType.DISPLAY);

// Create operations.
CampaignOperation operation = new CampaignOperation();
operation.setOperand(campaign);
operation.setOperator(Operator.ADD);
CampaignOperation operation2 = new CampaignOperation();
operation2.setOperand(campaign2);
operation2.setOperator(Operator.ADD);

CampaignOperation[] operations = new CampaignOperation[] {operation, operation2};

// Add campaigns.
CampaignReturnValue result = campaignService.mutate(operations);

// Display campaigns.
for (Campaign campaignResult : result.getValue()) {
  System.out.printf("Campaign with name '%s' and ID %d was added.%n", campaignResult.getName(),
      campaignResult.getId());
}

C#

List<CampaignOperation> operations = new List<CampaignOperation>();

for (int i = 0; i < NUM_ITEMS; i++) {
  // Create the campaign.
  Campaign campaign = new Campaign();
  campaign.name = "Interplanetary Cruise #" + ExampleUtilities.GetRandomString();
  campaign.advertisingChannelType = AdvertisingChannelType.SEARCH;

  // Recommendation: Set the campaign to PAUSED when creating it to prevent
  // the ads from immediately serving. Set to ENABLED once you've added
  // targeting and the ads are ready to serve.
  campaign.status = CampaignStatus.PAUSED;

  BiddingStrategyConfiguration biddingConfig = new BiddingStrategyConfiguration();
  biddingConfig.biddingStrategyType = BiddingStrategyType.MANUAL_CPC;
  campaign.biddingStrategyConfiguration = biddingConfig;

  campaign.budget = new Budget();
  campaign.budget.budgetId = budget.budgetId;

  // Set the campaign network options.
  campaign.networkSetting = new NetworkSetting();
  campaign.networkSetting.targetGoogleSearch = true;
  campaign.networkSetting.targetSearchNetwork = true;
  campaign.networkSetting.targetContentNetwork = false;
  campaign.networkSetting.targetPartnerSearchNetwork = false;

  // Set the campaign settings for Advanced location options.
  GeoTargetTypeSetting geoSetting = new GeoTargetTypeSetting();
  geoSetting.positiveGeoTargetType = GeoTargetTypeSettingPositiveGeoTargetType.DONT_CARE;
  geoSetting.negativeGeoTargetType = GeoTargetTypeSettingNegativeGeoTargetType.DONT_CARE;

  campaign.settings = new Setting[] { geoSetting };

  // Optional: Set the start date.
  campaign.startDate = DateTime.Now.AddDays(1).ToString("yyyyMMdd");

  // Optional: Set the end date.
  campaign.endDate = DateTime.Now.AddYears(1).ToString("yyyyMMdd");

  // Optional: Set the frequency cap.
  FrequencyCap frequencyCap = new FrequencyCap();
  frequencyCap.impressions = 5;
  frequencyCap.level = Level.ADGROUP;
  frequencyCap.timeUnit = TimeUnit.DAY;
  campaign.frequencyCap = frequencyCap;

  // Create the operation.
  CampaignOperation operation = new CampaignOperation();
  operation.@operator = Operator.ADD;
  operation.operand = campaign;

  operations.Add(operation);
}

try {
  // Add the campaign.
  CampaignReturnValue retVal = campaignService.mutate(operations.ToArray());

  // Display the results.
  if (retVal != null && retVal.value != null && retVal.value.Length > 0) {
    foreach (Campaign newCampaign in retVal.value) {
      Console.WriteLine("Campaign with name = '{0}' and id = '{1}' was added.",
          newCampaign.name, newCampaign.id);
    }
  } else {
    Console.WriteLine("No campaigns were added.");
  }
} catch (Exception e) {
  throw new System.ApplicationException("Failed to add campaigns.", e);
}

Python

operations = [{
    'operator': 'ADD',
    'operand': {
        'name': 'Interplanetary Cruise #%s' % uuid.uuid4(),
        # Recommendation: Set the campaign to PAUSED when creating it to
        # stop the ads from immediately serving. Set to ENABLED once you've
        # added targeting and the ads are ready to serve.
        'status': 'PAUSED',
        'advertisingChannelType': 'SEARCH',
        'biddingStrategyConfiguration': {
            'biddingStrategyType': 'MANUAL_CPC',
        },
        'endDate': (datetime.datetime.now() +
                    datetime.timedelta(365)).strftime('%Y%m%d'),
        # Note that only the budgetId is required
        'budget': {
            'budgetId': budget_id
        },
        'networkSetting': {
            'targetGoogleSearch': 'true',
            'targetSearchNetwork': 'true',
            'targetContentNetwork': 'false',
            'targetPartnerSearchNetwork': 'false'
        },
        # Optional fields
        'startDate': (datetime.datetime.now() +
                      datetime.timedelta(1)).strftime('%Y%m%d'),
        'frequencyCap': {
            'impressions': '5',
            'timeUnit': 'DAY',
            'level': 'ADGROUP'
        },
        'settings': [
            {
                'xsi_type': 'GeoTargetTypeSetting',
                'positiveGeoTargetType': 'DONT_CARE',
                'negativeGeoTargetType': 'DONT_CARE'
            }
        ]
    }
}, {
    'operator': 'ADD',
    'operand': {
        'name': 'Interplanetary Cruise banner #%s' % uuid.uuid4(),
        'status': 'PAUSED',
        'biddingStrategyConfiguration': {
            'biddingStrategyType': 'MANUAL_CPC'
        },
        'endDate': (datetime.datetime.now() +
                    datetime.timedelta(365)).strftime('%Y%m%d'),
        # Note that only the budgetId is required
        'budget': {
            'budgetId': budget_id
        },
        'advertisingChannelType': 'DISPLAY'
    }
}]
campaigns = campaign_service.mutate(operations)

# Display results.
for campaign in campaigns['value']:
  print ('Campaign with name "%s" and id "%s" was added.'
         % (campaign['name'], campaign['id']))

PHP

$campaignService = $adWordsServices->get($session, CampaignService::class);

$operations = [];

// Create a campaign with required and optional settings.
$campaign = new Campaign();
$campaign->setName('Interplanetary Cruise #' . uniqid());
$campaign->setAdvertisingChannelType(AdvertisingChannelType::SEARCH);

// Set shared budget (required).
$campaign->setBudget(new Budget());
$campaign->getBudget()->setBudgetId($budget->getBudgetId());

// Set bidding strategy (required).
$biddingStrategyConfiguration = new BiddingStrategyConfiguration();
$biddingStrategyConfiguration->setBiddingStrategyType(
    BiddingStrategyType::MANUAL_CPC
);

// You can optionally provide a bidding scheme in place of the type.
$biddingScheme = new ManualCpcBiddingScheme();
$biddingStrategyConfiguration->setBiddingScheme($biddingScheme);

$campaign->setBiddingStrategyConfiguration($biddingStrategyConfiguration);

// Set network targeting (optional).
$networkSetting = new NetworkSetting();
$networkSetting->setTargetGoogleSearch(true);
$networkSetting->setTargetSearchNetwork(true);
$networkSetting->setTargetContentNetwork(true);
$campaign->setNetworkSetting($networkSetting);

// Set additional settings (optional).
// Recommendation: Set the campaign to PAUSED when creating it to stop
// the ads from immediately serving. Set to ENABLED once you've added
// targeting and the ads are ready to serve.
$campaign->setStatus(CampaignStatus::PAUSED);
$campaign->setStartDate(date('Ymd', strtotime('+1 day')));
$campaign->setEndDate(date('Ymd', strtotime('+1 month')));

// Set frequency cap (optional).
$frequencyCap = new FrequencyCap();
$frequencyCap->setImpressions(5);
$frequencyCap->setTimeUnit(TimeUnit::DAY);
$frequencyCap->setLevel(Level::ADGROUP);
$campaign->setFrequencyCap($frequencyCap);

// Set advanced location targeting settings (optional).
$geoTargetTypeSetting = new GeoTargetTypeSetting();
$geoTargetTypeSetting->setPositiveGeoTargetType(
    GeoTargetTypeSettingPositiveGeoTargetType::DONT_CARE
);
$geoTargetTypeSetting->setNegativeGeoTargetType(
    GeoTargetTypeSettingNegativeGeoTargetType::DONT_CARE
);
$campaign->setSettings([$geoTargetTypeSetting]);

// Create a campaign operation and add it to the operations list.
$operation = new CampaignOperation();
$operation->setOperand($campaign);
$operation->setOperator(Operator::ADD);
$operations[] = $operation;

// Create a campaign with only required settings.
$campaign = new Campaign();
$campaign->setName('Interplanetary Cruise #' . uniqid());
$campaign->setAdvertisingChannelType(AdvertisingChannelType::DISPLAY);

// Set shared budget (required).
$campaign->setBudget(new Budget());
$campaign->getBudget()->setBudgetId($budget->getBudgetId());

// Set bidding strategy (required).
$biddingStrategyConfiguration = new BiddingStrategyConfiguration();
$biddingStrategyConfiguration->setBiddingStrategyType(
    BiddingStrategyType::MANUAL_CPC
);
$campaign->setBiddingStrategyConfiguration($biddingStrategyConfiguration);

$campaign->setStatus(CampaignStatus::PAUSED);

// Create a campaign operation and add it to the operations list.
$operation = new CampaignOperation();
$operation->setOperand($campaign);
$operation->setOperator(Operator::ADD);
$operations[] = $operation;

// Create the campaigns on the server and print out some information for
// each created campaign.
$result = $campaignService->mutate($operations);
foreach ($result->getValue() as $campaign) {
    printf(
        "Campaign with name '%s' and ID %d was added.\n",
        $campaign->getName(),
        $campaign->getId()
    );
}

Perl

# Create campaigns.
my $num_campaigns = 2;
my @operations    = ();
for (my $i = 0 ; $i < $num_campaigns ; $i++) {
  my (undef, undef, undef, $mday, $mon, $year) = localtime(time);
  my $today = sprintf("%d%02d%02d", ($year + 1900), ($mon + 1), $mday);
  (undef, undef, undef, $mday, $mon, $year) = localtime(time + 60 * 60 * 24);
  my $tomorrow = sprintf("%d%02d%02d", ($year + 1900), ($mon + 1), $mday);
  my $campaign = Google::Ads::AdWords::v201802::Campaign->new({
      name => "Interplanetary Cruise #" . uniqid(),
      # Bidding strategy (required).
      biddingStrategyConfiguration =>
        Google::Ads::AdWords::v201802::BiddingStrategyConfiguration->new({
          biddingStrategyType => "MANUAL_CPC",
          # You can optionally provide a bidding scheme in place of the type.
        }
        ),
      # Budget (required) - note only the budgetId is required.
      budget =>
        Google::Ads::AdWords::v201802::Budget->new({budgetId => $budgetId}),
      # Create a Search Network with Display Select campaign.
      # To create a Display Only campaign, omit networkSetting and use the
      # DISPLAY advertisingChannelType.
      # NetworkSetting (optional).
      networkSetting => Google::Ads::AdWords::v201802::NetworkSetting->new({
          targetGoogleSearch         => 1,
          targetSearchNetwork        => 1,
          targetContentNetwork       => 1,
          targetPartnerSearchNetwork => 0
        }
      ),
      # Advertising channel type (required).
      advertisingChannelType => "SEARCH",
      # Frequency cap (non-required).
      frequencyCap => Google::Ads::AdWords::v201802::FrequencyCap->new({
          impressions => 5,
          timeUnit    => "DAY",
          level       => "ADGROUP"
        }
      ),
      settings => [
        # Advanced location targeting settings (non-required).
        Google::Ads::AdWords::v201802::GeoTargetTypeSetting->new({
            positiveGeoTargetType => "DONT_CARE",
            negativeGeoTargetType => "DONT_CARE"
          }
        ),
      ],
      # Additional properties (non-required).
      startDate                   => $today,
      endDate                     => $tomorrow,
      # Recommendation: Set the campaign to PAUSED when creating it to stop
      # the ads from immediately serving. Set to ENABLED once you've added
      # targeting and the ads are ready to serve.
      status                      => "PAUSED"
    });

  # Create operation.
  my $campaign_operation =
    Google::Ads::AdWords::v201802::CampaignOperation->new({
      operator => "ADD",
      operand  => $campaign
    });
  push @operations, $campaign_operation;
}

# Add campaigns.
my $result = $client->CampaignService()->mutate({operations => \@operations});

# Display campaigns.
foreach my $campaign (@{$result->get_value()}) {
  printf "Campaign with name \"%s\" and id \"%s\" was added.\n",
    $campaign->get_name(), $campaign->get_id();
}

Ruby

campaign_srv = adwords.service(:CampaignService, API_VERSION)

# Create campaigns.
campaigns = [
  {
    :name => "Interplanetary Cruise #%d" % (Time.new.to_f * 1000).to_i,
    # Recommendation: Set the campaign to PAUSED when creating it to stop the
    # ads from immediately serving. Set to ENABLED once you've added
    # targeting and the ads are ready to serve.
    :status => 'PAUSED',
    :bidding_strategy_configuration => {
      :bidding_strategy_type => 'MANUAL_CPC'
    },
    # Budget (required) - note only the budget ID is required.
    :budget => {:budget_id => budget_id},
    :advertising_channel_type => 'SEARCH',
    # Optional fields:
    :start_date =>
        DateTime.parse((Date.today + 1).to_s).strftime('%Y%m%d'),
    :network_setting => {
      :target_google_search => true,
      :target_search_network => true,
      :target_content_network => true
    },
    :settings => [
      {
        :xsi_type => 'GeoTargetTypeSetting',
        :positive_geo_target_type => 'DONT_CARE',
        :negative_geo_target_type => 'DONT_CARE'
      }
    ],
    :frequency_cap => {
      :impressions => '5',
      :time_unit => 'DAY',
      :level => 'ADGROUP'
    }
  },
  {
    :name => "Interplanetary Cruise banner #%d" % (Time.new.to_f * 1000).to_i,
    :status => 'PAUSED',
    :bidding_strategy_configuration => {
      :bidding_strategy_type => 'MANUAL_CPC'
    },
    :budget => {:budget_id => budget_id},
    :advertising_channel_type => 'DISPLAY'
  }
]

# Prepare for adding campaign.
operations = campaigns.map do |campaign|
  {:operator => 'ADD', :operand => campaign}
end

# Add campaign.
response = campaign_srv.mutate(operations)
if response and response[:value]
  response[:value].each do |campaign|
    puts "Campaign with name '%s' and ID %d was added." %
        [campaign[:name], campaign[:id]]
  end
else
  raise new StandardError, 'No campaigns were added.'
end

VB.NET

  Dim operations As New List(Of CampaignOperation)

  For i As Integer = 1 To NUM_ITEMS
    ' Create the campaign.
    Dim campaign As New Campaign
    campaign.name = "Interplanetary Cruise #" & ExampleUtilities.GetRandomString
    campaign.advertisingChannelType = AdvertisingChannelType.SEARCH

    ' Recommendation: Set the campaign to PAUSED when creating it to prevent
    ' the ads from immediately serving. Set to ENABLED once you've added
    ' targeting and the ads are ready to serve.
    campaign.status = CampaignStatus.PAUSED

    Dim biddingConfig As New BiddingStrategyConfiguration()
    biddingConfig.biddingStrategyType = BiddingStrategyType.MANUAL_CPC
    campaign.biddingStrategyConfiguration = biddingConfig

    ' Set the campaign budget.
    campaign.budget = New Budget
    campaign.budget.budgetId = budget.budgetId

    ' Set the campaign network options.
    campaign.networkSetting = New NetworkSetting
    campaign.networkSetting.targetGoogleSearch = True
    campaign.networkSetting.targetSearchNetwork = True
    campaign.networkSetting.targetContentNetwork = False
    campaign.networkSetting.targetPartnerSearchNetwork = False

    ' Set the campaign geo target and keyword match settings.
    Dim geoSetting As New GeoTargetTypeSetting
    geoSetting.positiveGeoTargetType = GeoTargetTypeSettingPositiveGeoTargetType.DONT_CARE
    geoSetting.negativeGeoTargetType = GeoTargetTypeSettingNegativeGeoTargetType.DONT_CARE

    campaign.settings = New Setting() {geoSetting}

    ' Optional: Set the start date.
    campaign.startDate = DateTime.Now.AddDays(1).ToString("yyyyMMdd")

    ' Optional: Set the end date.
    campaign.endDate = DateTime.Now.AddYears(1).ToString("yyyyMMdd")

    ' Optional: Set the frequency cap.
    Dim frequencyCap As New FrequencyCap
    frequencyCap.impressions = 5
    frequencyCap.level = Level.ADGROUP
    frequencyCap.timeUnit = TimeUnit.DAY
    campaign.frequencyCap = frequencyCap

    ' Create the operation.
    Dim operation As New CampaignOperation
    operation.operator = [Operator].ADD
    operation.operand = campaign
    operations.Add(operation)
  Next

  Try
    ' Add the campaign.
    Dim retVal As CampaignReturnValue = campaignService.mutate(operations.ToArray())

    ' Display the results.
    If ((Not retVal Is Nothing) AndAlso (Not retVal.value Is Nothing) AndAlso
      (retVal.value.Length > 0)) Then
      For Each newCampaign As Campaign In retVal.value
        Console.WriteLine("Campaign with name = '{0}' and id = '{1}' was added.",
            newCampaign.name, newCampaign.id)
      Next
    Else
      Console.WriteLine("No campaigns were added.")
    End If
  Catch e As Exception
    Throw New System.ApplicationException("Failed to add campaigns.", e)
  End Try
End Using

Наши клиентские библиотеки содержат примеры кода, в которых метод mutate() используется для всех служб управления кампаниями.

При изменении количество однотипных объектов, которые могут содержаться в одном аккаунте AdWords, ограниченно. Лимиты для различных типов объектов AdWords приведены в этой статье Справочного центра. Ориентируйтесь на них при планировании кампаний, однако не определяйте их в коде своего приложения.

При вызове метода mutate() следует также иметь в виду, что предпочтительнее отправлять несколько операций в одном запросе, чем несколько запросов с одной операцией в каждом. Это сокращает число обращений к серверу и таким образом повышает быстродействие приложения.

С этой целью также рекомендуется объединять запросы, относящиеся к одному родительскому элементу. Например, вместо того чтобы добавлять объявления в разные группы в одном запросе, сформируйте набор запросов, добавляющих объявления в одну и ту же группу. Другие полезные советы вы найдете в этом руководстве.

Поле operator

Поле operator определяет тип выполняемой операции (ADD,SET или REMOVE).

Оператор ADD осуществляет добавление, SET – изменение, а REMOVE – удаление объекта. Однако эти операторы применимы не ко всем службам.

Например, созданную кампанию AdWords удалить нельзя – можно только присвоить ей статус REMOVED. При статусе REMOVED можно по-прежнему запрашивать информацию о кампании и ее статистику.

Оператор REMOVE не поддерживается службой CampaignService. Чтобы присвоить кампании статус REMOVED, необходимо использовать оператор SET.

Аналогичным образом цель кампании нельзя изменить (SET) – ее можно только добавить ADD или удалить REMOVE.

Далее показано, как в AdWords обрабатываются различные типы объектов.

Тип Добавление нового объекта Включение Приостановка Удаление/отключение
Campaign Действие: mutate()
Операция: ADD
Статус: ENABLED
Действие: mutate()
Операция: SET
Статус: ENABLED
Действие: mutate()
Операция: SET
Статус: PAUSED
Действие: mutate()
Операция: SET
Статус: REMOVED
Budget Действие: mutate()
Операция: ADD
Статус: ENABLED
Нет Нет Действие: mutate()
Операция: SET
Статус: REMOVED
AdGroup Действие: mutate()
Операция: ADD
Статус: ENABLED
Действие: mutate()
Операция: SET
Статус: ENABLED
Действие: mutate()
Операция: SET
Статус: PAUSED
Действие: mutate()
Операция: SET
Статус: REMOVED
AdGroupAd Действие: mutate()
Операция: ADD
Статус: ENABLED
Действие: mutate()
Операция: SET
Статус: ENABLED
Действие: mutate()
Операция: SET
Статус: PAUSED
Действие: mutate()
Операция: REMOVE
Статус: DISABLED
BiddableAdGroupCriterion Действие: mutate()
Операция: ADD
Статус: ENABLED
Действие: mutate()
Операция: SET
Статус: ENABLED
Действие: mutate()
Операция: SET
Статус: PAUSED
Действие: mutate
Операция: REMOVE
Статус: REMOVED
UserList Действие: mutate()
Операция: ADD
Статус: OPEN
Нет Нет Действие: mutate()
Операция: SET
Статус: CLOSED
Feed Действие: mutate()
Операция: ADD
Статус: ENABLED
Нет Нет Действие: mutate()
Операция: REMOVE
Статус: REMOVED
FeedMapping Действие: mutate()
Операция: ADD
Статус: ENABLED
Нет Нет Действие: mutate()
Операция: REMOVE
Статус: REMOVED
FeedItem Действие: mutate
Операция: ADD
Статус: ENABLED
Нет Нет Действие: mutate()
Операция: REMOVE
Статус: REMOVED
CustomerFeed Действие: mutate()
Операция: ADD
Статус: ENABLED
Нет Нет Действие: mutate()
Операция: REMOVE
Статус: REMOVED
CampaignFeed Действие: mutate()
Операция: ADD
Статус: ENABLED
Нет Нет Действие: mutate()
Операция: REMOVE
Статус: REMOVED
AdGroupFeed Действие: mutate()
Операция: ADD
Статус: ENABLED
Нет Нет Действие: mutate()
Операция: REMOVE
Статус: REMOVED

Одновременное изменение

Если у вас несколько пользователей, которые одновременно изменяют один и тот же объект с помощью приложения, или если в целях быстродействия вы осуществляете параллельное изменение объектов AdWords с использованием нескольких потоков, важно понимать, как AdWords обрабатывает одновременные запросы на изменение одного и того же объекта.

Одновременное изменение одного объекта AdWords из нескольких источников невозможно. Это касается в том числе обновления объекта сразу несколькими процессами через одно и то же или через разные приложения (например, из вашего приложения и Редактора AdWords). AdWords API не позволяет блокировать объекты перед их изменением. При попытке одновременного изменения объекта из двух источников API выдает ошибку CONCURRENT_MODIFICATION_ERROR.

Подробнее об управлении параллелизмом в AdWords API можно прочитать в нашем блоге.

Синхронные и асинхронные изменения

В AdWords API метод mutate() является синхронным. Это означает, что при вызове API ответ поступит только после того, как объекты будут изменены. Таким образом, необходимо ожидать ответа на каждый запрос. Плюс этого метода состоит в относительной простоте программирования. Однако он может негативно влиять на балансировку нагрузки и приводить к расходованию ресурсов впустую в ожидании, когда завершится обработка вызова.

В качестве альтернативы можно изменять объекты асинхронно, используя службу BatchJobService. Она позволяет выполнять задачи, состоящие из больших пакетов операций, в нескольких службах, не ожидая завершения операций. После отправки задания серверы AdWords API выполняют операции асинхронно. Тем временем ваш компьютер может выполнять другие операции, периодически проверяя статус задачи.

Подробнее читайте в руководстве по пакетной обработке.

Проверка вызовов mutate

Заголовок SOAP validateOnly позволяет проверять вызовы API, не изменяя при этом данные. Эта возможность очень полезна для проверки пропущенных параметров и неверных значений полей.

Для использования данной функции полю validateOnly в RequestHeader нужно задать значение true. По умолчанию клиентские библиотеки задают значение false.

В этом случае ваш запрос полностью проверяется, однако шаг выполнения пропускается. Если ошибок не обнаружено, возвращается пустой ответ. В противном случае возвращаются подробные сообщения об ошибках.

Ниже приведен пример настройки validateOnly с помощью нашей библиотеки Java.

Credential oAuth2Credential = new OfflineCredentials.Builder()
    .forApi(Api.ADWORDS)
    .fromFile()
    .build()
    .generateCredential();

AdWordsSession session = new AdWordsSession.Builder()
    .fromFile()
    .withOAuth2Credential(oAuth2Credential)
    .build();

session.setValidateOnly(true);

У всех вызовов API, выполненных в этом сеансе, заголовок validateOnly будет иметь значение true.

Заголовок validateOnly позволяет проверить объявления на предмет соответствия правилам. Объявления автоматически отклоняются, если они не соответствуют правилам, например в отношении определенных слов, пунктуации, использования заглавных букв или длины. При массовой загрузке всего одна ошибка приведет к отклонению всех объявлений. Проверка нового объявления в режиме validateOnly позволяет без труда выявлять ошибки. Практическое применение показано в этом примере кода.

Проверку запросов mutate() можно выполнять даже без клиентской библиотеки, если настроить заголовок SOAP.

Службы AdWords API

В этом разделе описываются службы, предлагаемые AdWords API, со ссылками на соответствующие справочные страницы с дополнительной информацией.

Службы AdWords API можно разделить на четыре функциональные категории:

Управление данными кампаний

Службы управления кампаниями используются для работы с кампаниями AdWords и элементами, которые с ними связаны. Каждая служба управления кампаниями соответствует элементу в иерархии данных кампании.

Служба Описание
CampaignService Позволяет создавать, изменять и удалять кампании. Кампания содержит одну или несколько групп объявлений. Для нее определяются отдельный бюджет, стратегия назначения ставок, диапазон дат активности и настройки таргетинга.
AdGroupService Позволяет создавать, изменять и удалять группы объявлений. Группа объявлений включает в себя набор объявлений и критериев, а также содержит значение ставки по умолчанию, соответствующей этим критериям.
AdGroupAdService Позволяет создавать, изменять и удалять объявления.
CampaignExtensionSettingService Позволяет создавать, изменять и удалять расширения объявлений. Расширения объявлений – это дополнительная информация (например, адрес компании, номер телефона или дополнительные ссылки), которая добавляется в стандартные текстовые объявления, заданные в кампании.
CampaignCriterionService
AdGroupCriterionService
Позволяют создавать, изменять и удалять критерии. Критерий описывает условия показа объявления.
ConversionTrackerService
OfflineConversionFeedService
Позволяют оценивать эффективность объявлений и ключевых слов, определяя, что происходит после совершения клика. Служба OfflineConversionFeedService обрабатывает импорт офлайн-конверсий.
DataService Возвращает данные управления рекламной кампанией, соответствующие указанным критериям.
FeedService
FeedItemService
FeedMappingService
AdGroupFeedService
CampaignFeedService
Позволяют создавать собственные фиды данных для управления расширениями.
AdwordsUserListService Позволяет создавать, изменять и удалять списки пользователей. Списки пользователей и критерии списков пользователей позволяют показывать рекламу пользователям, которые уже совершали конверсию на вашем сайте.
BudgetService Позволяет создавать, изменять и удалять бюджеты. Используется для управления бюджетами, которые могут использоваться в нескольких кампаниях.

Оптимизация

Службы оптимизации используются для получения статистики эффективности и поиска идей для новых критериев.

Служба Описание
ReportDefinitionService Позволяет создавать и скачивать различные отчеты по эффективности.
TargetingIdeaService Используется для подбора новых вариантов ключевых слов и мест размещения по определенным параметрам.
TrafficEstimatorService Предоставляет оценочные данные по трафику для предлагаемых кампаний, групп объявлений и ключевых слов.
DraftService и TrialService Позволяют создавать проекты кампании и эксперименты для тестирования ее настроек. Подробнее…

Управление аккаунтом

Службы управления аккаунтом используются для отслеживания активности в аккаунте.

Служба Описание
CustomerService Позволяет получать основные сведения о клиентском аккаунте.
CustomerSyncService Позволяет получать сведения об изменении данных кампании за определенный диапазон дат.
ManagedCustomerService Используется для управления клиентскими аккаунтами и связями между управляющим и клиентскими аккаунтами.

Вспомогательные службы

Вспомогательные службы используются для выполнения других задач в AdWords API.

Служба Описание
BatchJobService Используется для асинхронной обработки крупных пакетов операций с данными кампании. Выполнение задач массового изменения занимает больше времени, чем синхронные вызовы стандартных веб-служб, но обеспечивает другие преимущества, описанные в руководстве по пакетной обработке.
MediaService Позволяет загружать и получать идентификаторы объектов, которые используются в медиарекламе (например, в графических и видеообъявлениях).
ConstantDataService Возвращает постоянные значения, используемые в API.
LocationCriterionService Возвращает идентификатор критерия местоположения.

Данные кампании

Работа с данными кампании – одна из важнейших задач, которые выполняются с помощью AdWords API. В следующей таблице описываются все элементы данных кампании и их связь друг с другом.

Элемент
Дочерние элементы (количество)
Тип данных Описание
Кампания
Группы объявлений (1+)
Списки таргетинга кампании (7)
Расширения объявлений кампании (0+)
Критерии кампании (0+)
Campaign Кампания содержит одну или несколько групп объявлений. Для нее определяются отдельный бюджет, стратегия назначения ставок, диапазон дат активности и настройки таргетинга.
Группа объявлений
Объявления (1+)
Критерии (1+)
AdGroup
Группа объявлений содержит набор объявлений и критериев, а также значение ставки по умолчанию, соответствующей этим критериям.
Объявление
Переопределения расширений объявлений (0+)
AdGroupAd Доступные типы объявлений являются подклассами абстрактного типа Ad и представлены в документации по API.
Критерий
Нет
AdGroupCriterion, CampaignCriterion Критерии описывают условия включения (положительный критерий) или отключения (отрицательный критерий) показа объявления. Критерий группы объявлений применяется к объявлениям в родительской группе. Критерий кампании всегда является отрицательным и определяет условия, запрещающие показ объявлений.
Расширение объявления
Нет
CampaignExtensionSetting Расширения объявлений – это дополнительная информация (например, адрес компании, номер телефона или дополнительные ссылки), которая добавляется в стандартные текстовые объявления, заданные в кампании.
Фид
Нет
Feed Фиды выступают в качестве поставщиков данных для расширений объявлений (дополнительных ссылок, номеров телефонов, приложений).
Список пользователей
Нет
UserList Списки пользователей позволяют отслеживать пользователей, которые уже проявили интерес к вашему веб-сайту. Чтобы показывать объявления таким пользователям, нужно создать критерий списка пользователей и связать его с существующим списком пользователей.
Бюджет
Нет
Budget Бюджеты используются для управления расходами в кампаниях. Бюджет может использоваться сразу в нескольких кампаниях, и система определит его оптимальное распределение.

Оставить отзыв о...

Текущей странице
Нужна помощь? Обратитесь в службу поддержки.