Установить таргетинг

Службы «Параметры таргетинга» , «Назначенные параметры таргетинга » и «Позиции» используются совместно для настройки таргетинга позиций в API Display & Video 360. На этой странице описаны и приведены примеры того, как найти доступные параметры таргетинга, назначить параметры таргетинга позициям и выполнить массовые операции с позициями для просмотра и редактирования назначенных параметров таргетинга.

Найдите доступные параметры таргетинга

В параметрах таргетинга используются либо заданные пользователем переменные, существующие объекты таргетинга, либо уже существующие параметры для определения желаемой целевой аудитории. Существующие ранее параметры идентифицируются либо с помощью значений перечисления, либо с помощью идентификаторов параметров таргетинга, в зависимости от типа таргетинга. Целевые объекты идентифицируются с использованием их идентификаторов объектов. Идентификаторы вариантов таргетинга и идентификаторы объектов можно найти с помощью API Display & Video 360.

Использовать заданные значения перечисления

Параметры таргетинга для следующих типов таргетинга назначаются с использованием определенных типов перечислений:

TargetingType Перечисление
TARGETING_TYPE_AGE_RANGE AgeRange
TARGETING_TYPE_CONTENT_INSTREAM_POSITION ContentInstreamPosition
TARGETING_TYPE_CONTENT_OUTSTREAM_POSITION ContentOutstreamPosition
TARGETING_TYPE_DEVICE_TYPE DeviceType
TARGETING_TYPE_DIGITAL_CONTENT_LABEL_EXCLUSION ContentRatingTier
TARGETING_TYPE_ENVIRONMENT Environment
TARGETING_TYPE_EXCHANGE Exchange
TARGETING_TYPE_GENDER Gender
TARGETING_TYPE_HOUSEHOLD_INCOME HouseholdIncome
TARGETING_TYPE_NATIVE_CONTENT_POSITION NativeContentPosition
TARGETING_TYPE_OMID Omid
TARGETING_TYPE_PARENTAL_STATUS ParentalStatus
TARGETING_TYPE_SENSITIVE_CATEGORY_EXCLUSION SensitiveCategory
TARGETING_TYPE_VIDEO_PLAYER_SIZE VideoPlayerSize
TARGETING_TYPE_VIEWABILITY Viewability

Строковая версия соответствующего значения перечисления может использоваться для идентификации существующих ресурсов AssignedTargetingOption этих типов таргетинга и доступна в поле assignedTargetingOptionIdAlias . Вы можете использовать это значение псевдонима вместо assignedTargetingOptionId при получении или удалении назначенных параметров таргетинга.

Получить идентификаторы вариантов таргетинга

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

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

Эти идентификаторы параметров таргетинга можно получить с помощью службы «Параметры таргетинга» . В зависимости от типа таргетинга извлечение осуществляется одним из двух способов:

  • Индивидуальный поиск или полный список . Получить параметры для большинства типов таргетинга можно с помощью методов get и list . Используйте targetingTypes.targetingOptions.get , чтобы получить сведения о варианте таргетинга, определяемом типом таргетинга и идентификатором варианта таргетинга. Используйте targetingTypes.targetingOptions.list , чтобы перечислить все доступные параметры таргетинга данного типа таргетинга.
  • Поиск . Параметры типов таргетинга на основе местоположения ( TARGETING_TYPE_GEO_REGION , TARGETING_TYPE_POI и TARGETING_TYPE_BUSINESS_CHAIN ​​) необходимо получить с помощью метода search . Используйте targetingTypes.targetingOptions.search для получения параметров таргетинга заданного типа, соответствующих заданным строкам запроса.

Ниже приведен пример получения списка возможных параметров таргетинга для типа таргетинга TARGETING_TYPE_BROWSER :

Джава

// Configure the list request.
TargetingOptions.List request =
   service
       .targetingTypes()
       .targetingOptions()
       .list("TARGETING_TYPE_BROWSER")
       .setAdvertiserId(advertiser-id);

// Create the response and nextPageToken variables.
ListTargetingOptionsResponse response;
String nextPageToken = null;

do {
 // Create and execute the list request.
 response = request.setPageToken(nextPageToken).execute();

 // Check if the response is empty.
 if (response.isEmpty()) {
   System.out.print("List request returned no Targeting Options");
   break;
 }

 // Iterate over retrieved targeting options.
 for (TargetingOption option : response.getTargetingOptions()) {
   System.out.printf(
       "Targeting Option ID: %s, Browser Display Name: '%s'\n",
       option.getTargetingOptionId(), option.getBrowserDetails().getDisplayName());
 }

 // Update the next page token.
 nextPageToken = response.getNextPageToken();
} while (!Strings.isNullOrEmpty(nextPageToken));

Питон

# Create the page token variable.
next_page_token = ""

while True:
  # Request the targeting options list.
  response = service.targetingTypes() \
    .targetingOptions().list(
      advertiserId=advertiser-id,
      targetingType="TARGETING_TYPE_BROWSER",
      pageToken=next_page_token
  ).execute()

  # Check if response is empty.
  if not response:
    print("List request returned no Targeting Options")
    break

  # Iterate over retrieved targeting options.
  for option in response['targetingOptions']:
    print("Targeting Option ID: %s, Browser Display Name: %s"
          % (option['targetingOptionId'], option['browserDetails']['displayName']))

  # Break out of loop if there is no next page.
  if 'nextPageToken' not in response:
    break

  # Update the next page token.
  next_page_token = response['nextPageToken']

PHP

// Create the page token variable.
$nextPageToken = null;

do {
    // Build the query parameters object for the request.
    $optParams = array(
        'advertiserId' => advertiser-id,
        'pageToken' => $nextPageToken
    );

    // Call the API, getting the browser targeting options for the
    // identified advertiser.
    $response = $this
        ->service
        ->targetingTypes_targetingOptions
        ->listTargetingTypesTargetingOptions(
            'TARGETING_TYPE_BROWSER',
            $optParams
        );

    // Print the resulting targeting options.
    if (!empty($response->getTargetingOptions())) {
        foreach ($response->getTargetingOptions() as $option) {
            printf(
                'Targeting Option ID: %s, Browser Display Name: %s\n',
                $option['targetingOptionId'],
                $option['browserDetails']['displayName']
            );
        }
    } else {
        print('No targeting options returned\n');
    }

    // Update the next page token.
    $nextPageToken = $response->getNextPageToken();
} while (
    !empty($response->getTargetingOptions())
    && $nextPageToken
);

Получение списка объектов, на которые можно настроить таргетинг

Чтобы настроить таргетинг позиции с использованием существующего объекта, на который можно настроить таргетинг, вам понадобится идентификатор этого объекта. Объекты, на которые можно настроить таргетинг, такие как каналы , комбинированные аудитории и группы источников инвентаря , можно получить с помощью собственных сервисов в Display & Video 360 API.

Каждый сервис имеет свои собственные методы get и list . Используйте метод get , чтобы подтвердить, что объект доступен для данного рекламодателя. Используйте метод list , чтобы обнаружить все объекты этого типа ресурса, которые доступны данному рекламодателю и, следовательно, могут использоваться при назначении таргетинга для позиции этого рекламодателя.

Подмножеством целевых объектов также можно управлять через API. Это делается с помощью методов create и patch в соответствующем сервисе, а также сервисов для отдельных значений, перечисленных в сущностях, таких как источники инвентаря , минус-слова и местоположения .

Создайте идентификаторы вариантов таргетинга на POI

Параметры таргетинга на именованные точки интереса в TARGETING_TYPE_POI можно получить с помощью targetingTypes.targetingOptions.search . Кроме того, вы можете создать индивидуальные идентификаторы параметров таргетинга TARGETING_TYPE_POI для таргетинга на определенные координаты широты и долготы.

Выполните следующие действия, чтобы создать идентификатор варианта таргетинга на POI:

  1. Получить координаты широты и долготы (например: «40.7414691, -74.003387»)
  2. Округлите значения координат до шестого десятичного знака (например: «40,741469, -74,003387»).
  3. Удалите десятичные знаки из значений координат (например: «40741469, -74003387»).
  4. Объедините два значения, чтобы создать одну строку, разделенную точкой с запятой (например: «40741469;-74003387»).

Полученную строку можно использовать в качестве targetingOptionId при создании назначенного параметра таргетинга TARGETING_TYPE_POI .

После создания поля targetingOptionId и assignedTargetingOptionId назначенного ресурса параметра таргетинга будут обновлены с добавлением точки с запятой и буквенно-цифрового хеша.

Назначьте параметр таргетинга

Таргетинг, назначенный позиции, представлен как Назначенный параметр таргетинга . Управлять этими объектами можно с помощью службы «Назначенные параметры таргетинга» . При создании назначенного параметра таргетинга эти сведения о таргетинге применяются к родительской позиции. Удаление существующего назначенного параметра таргетинга приведет к удалению этого таргетинга.

Используйте advertisers.lineItems.targetingTypes.assignedTargetingOptions.create , чтобы создать назначенные параметры таргетинга. Укажите параметры таргетинга в поле details назначенного ресурса параметра таргетинга, соответствующего предполагаемому типу таргетинга.

Ниже приведен пример того, как создать назначенный параметр таргетинга типа TARGETING_TYPE_BROWSER :

Джава

// Create an AssignedTargetingOption object of the
// browser targeting type.
AssignedTargetingOption assignedTargetingOption =
   new AssignedTargetingOption()
       .setBrowserDetails(
           new BrowserAssignedTargetingOptionDetails()
               .setTargetingOptionId(targeting-option-id));

// Configure the create request.
AssignedTargetingOptions.Create request =
   service
       .advertisers()
       .lineItems()
       .targetingTypes()
       .assignedTargetingOptions()
       .create(
           advertiser-id,
           line-item-id,
           "TARGETING_TYPE_BROWSER",
           assignedTargetingOption);

// Send the request.
AssignedTargetingOption response = request.execute();

// Display the new assigned targeting option.
System.out.printf("AssignedTargetingOption %s was created.",
   response.getName());

Питон

# Create a assigned targeting option object.
assigned_targeting_option_obj = {
    'browserDetails': {
        'targetingOptionId': targeting-option-id
    }
}

# Create the assigned targeting option.
assigned_targeting_option = service.advertisers().lineItems()\
  .targetingTypes().assignedTargetingOptions().create(
    advertiserId=advertiser-id,
    lineItemId=line-item-id,
    targetingType="TARGETING_TYPE_BROWSER",
    body=assigned_targeting_option_obj
).execute()

# Display the new assigned targeting option.
print("Assigned Targeting Option %s was created."
      % assigned_targeting_option["name"])

PHP

// Create a assigned targeting option object.
$assignedTargetingOption =
    new Google_Service_DisplayVideo_AssignedTargetingOption();

// Create and set browser details.
$details =
    new Google_Service_DisplayVideo_BrowserAssignedTargetingOptionDetails();
$details->setTargetingOptionId(targeting-option-id);
$assignedTargetingOption->setBrowserDetails($details);

// Call the API, creating the browser assigned targeting option for the
// given line item.
$result = $this
    ->service
    ->advertisers_lineItems_targetingTypes_assignedTargetingOptions
    ->create(
        advertiser-id,
        line-item-id,
        'TARGETING_TYPE_BROWSER',
        $assignedTargetingOption
    );

printf(
    'Assigned Targeting Option %s was created.\n',
    $result['name']
);

Ошибки

Ошибки конфигурации таргетинга

В Display & Video 360 существует ряд сложных правил, касающихся таргетинга . Они применяются в Display & Video 360 API посредством ошибок, возвращаемых при создании назначенного параметра таргетинга. Ошибка, возвращаемая API, укажет на нарушение.

Ошибки чаще всего вызваны существующим таргетингом, назначенным позиции. Используйте advertisers.lineItems.targetingTypes.assignedTargetingOptions.list , чтобы получить все параметры таргетинга данного типа таргетинга, назначенного позиции, оценить, возможен ли желаемый таргетинг с учетом ограничений, и используйте advertisers.lineItems.targetingTypes.assignedTargetingOptions.delete для удаления любой нежелательный таргетинг, прежде чем снова попытаться создать желаемый назначенный вариант таргетинга.

Ошибки таргетинга на YouTube и партнерских сайтах

Таргетинг специально для кампаний YouTube и партнеров невозможно обновить с помощью API Display & Video 360. Попытка сделать это приведет к ошибке.

К таргетингу YouTube и партнерских компаний относятся все параметры таргетинга, назначенные непосредственно позициям и группам объявлений YouTube и партнерские программы , а также любой таргетинг следующих типов таргетинга:

  • TARGETING_TYPE_SESSION_POSITION
  • TARGETING_TYPE_YOUTUBE_CHANNEL
  • TARGETING_TYPE_YOUTUBE_VIDEO

Ошибки параллелизма

Попытка обновить настройки или таргетинг одной позиции с помощью нескольких одновременных запросов приведет к ошибке.

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

Массовые и масштабные операции таргетинга

Вы можете использовать методы массового таргетинга и таргетинга на уровне всего ресурса , чтобы управлять назначенными параметрами таргетинга по типам таргетинга:

  • Используйте методы массового таргетинга , чтобы получать или редактировать параметры таргетинга для нескольких типов таргетинга и для нескольких ресурсов. Вы можете получить полные конфигурации таргетинга для нескольких позиций с помощью advertisers.lineItems.bulkListAssignedTargetingOptions или внести одинаковые обновления в таргетинг для нескольких позиций с помощью advertisers.lineItems.bulkEditAssignedTargetingOptions . Они доступны только в сервисе advertisers.lineItems .
  • Используйте методы таргетинга на уровне всего ресурса , чтобы получать или редактировать параметры таргетинга для нескольких типов таргетинга в рамках одного ресурса. Они доступны в службах partners , advertisers , advertisers.campaigns и advertisers.insertionOrders и называются listAssignedTargetingOptions или editAssignedTargetingOptions .

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

Массовый список таргетинга

advertisers.lineItems.bulkListAssignedTargetingOptions позволяет просмотреть все параметры таргетинга, назначенные одной или нескольким позициям в различных типах таргетинга. Он работает аналогично любому другому методу list . Вы можете использовать параметр запроса filter для фильтрации результатов по TargetingType или Inheritance .

Ниже приведен пример того, как составить список всех параметров таргетинга, назначенных позиции и унаследованных родительским партнером или рекламодателем:

Джава

// Configure the bulk list request.
LineItems.BulkListAssignedTargetingOptions request =
    service.advertisers().lineItems()
        .bulkListAssignedTargetingOptions(advertiser-id);

// Set Line Items to retrieve targeting for.
request.setLineItemIds(line-item-ids);

// Set filter to only return inherited assigned targeting options.
request.setFilter(
    "inheritance=\"INHERITED_FROM_ADVERTISER\" OR inheritance=\"INHERITED_FROM_PARTNER\"");

// Create the response and nextPageToken variables.
BulkListAssignedTargetingOptionsResponse response;
String nextPageToken = null;

do {
  // Set page token and execute the list request.
  response = request.setPageToken(nextPageToken).execute();

  // Check if the response is empty.
  if (response.isEmpty()) {
    System.out.print("Bulk list request returned no Assigned Targeting Options");
    break;
  }

  // Iterate over retrieved line item assigned targeting option wrapper objects.
  for (LineItemAssignedTargetingOption lineItemAssignedTargetingOption
      : response.getLineItemAssignedTargetingOptions()) {
    System.out.printf(
        "Assigned Targeting Option %s found\n",
        lineItemAssignedTargetingOption.getAssignedTargetingOption().getName());
  }

  // Update the next page token.
  nextPageToken = response.getNextPageToken();
} while (!Strings.isNullOrEmpty(nextPageToken));

Питон

# Create the page token variable.
next_page_token = ""

while True:
  # Execute the list request.
  response = service.advertisers().lineItems() \
    .bulkListAssignedTargetingOptions(
      advertiserId=advertiser-id,
      lineItemIds=line-item-ids,
      filter="inheritance=\"INHERITED_FROM_ADVERTISER\" OR "
             "inheritance=\"INHERITED_FROM_PARTNER\"",
      pageToken=next_page_token
  ).execute()

  # Check if response is empty.
  if not response:
    print("Bulk list request returned no Assigned Targeting Options")
    break

  # Iterate over retrieved assigned targeting options.
  for lineItemAssignedTargetingOption in response['lineItemAssignedTargetingOptions']:
    print("Assigned Targeting Option %s found"
          % (lineItemAssignedTargetingOption['assignedTargetingOption']['name']))

  # Break out of loop if there is no next page.
  if 'nextPageToken' not in response:
    break

  # Update the next page token.
  next_page_token = response['nextPageToken']

PHP

// Create the page token variable.
$nextPageToken = null;

do {
    // Build the query parameters object for the request.
    $optParams = array(
        'lineItemIds' => line-item-ids,
        'filter' => "inheritance=\"INHERITED_FROM_ADVERTISER\" OR "
            . "inheritance=\"INHERITED_FROM_PARTNER\"",
        'pageToken' => $nextPageToken
    );

    // Call the API, getting all the assigned targeting options for the
    // identified line item.
    $response = $service
        ->advertisers_lineItems
        ->bulkListAssignedTargetingOptions(
            advertiser-id,
            $optParams
    );

    // Print the returned assigned targeting options.
    if (!empty($response->getLineItemAssignedTargetingOptions())) {
        foreach ($response->getLineItemAssignedTargetingOptions() as $option) {
            printf('Assigned Targeting Option %s found\n', $option->getAssignedTargetingOption()['name']);
        }
    } else {
        print('No targeting options returned\n');
    }

    // Update the next page token.
    $nextPageToken = $response->getNextPageToken();
} while (
    !empty($response->getLineItemAssignedTargetingOptions())
    && $nextPageToken);

Массовое изменение таргетинга

advertisers.lineItems.bulkEditAssignedTargetingOptions позволяет добавлять и удалять несколько вариантов таргетинга различных типов таргетинга из одной или нескольких позиций одновременно.

Метод принимает список DeleteAssignedTargetingOptionsRequests и список CreateAssignedTargetingOptionsRequests . Один объект запроса может представлять собой удаление или создание нескольких назначенных параметров таргетинга одного и того же типа таргетинга.

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

Ниже приведен пример массового редактирования назначенных параметров таргетинга для одной или нескольких позиций с учетом списков назначенных параметров таргетинга, которые нужно удалить, и параметров таргетинга, которые нужно создать:

Джава

// Create a bulk edit request.
BulkEditAssignedTargetingOptionsRequest requestContent =
    new BulkEditAssignedTargetingOptionsRequest();

// Set line item IDs in edit request.
requestContent.setLineItemIds(line-item-ids);

// Build delete request list.
ArrayList<DeleteAssignedTargetingOptionsRequest> deleteRequests =
    new ArrayList<DeleteAssignedTargetingOptionsRequest>();

// Add browser assigned targeting option IDs to delete request list.
deleteRequests.add(new DeleteAssignedTargetingOptionsRequest()
    .setTargetingType("TARGETING_TYPE_BROWSER")
    .setAssignedTargetingOptionIds(delete-browser-assigned-targeting-ids));

// Add device make or model assigned targeting option IDs to delete request list.
deleteRequests.add(new DeleteAssignedTargetingOptionsRequest()
    .setTargetingType("TARGETING_TYPE_DEVICE_MAKE_MODEL")
    .setAssignedTargetingOptionIds(
        delete-device-make-model-assigned-targeting-ids));

// Set delete requests in edit request.
requestContent.setDeleteRequests(deleteRequests);

// Build create request list.
ArrayList<CreateAssignedTargetingOptionsRequest> createRequests =
    new ArrayList<CreateAssignedTargetingOptionsRequest>();

// Create browser assigned targeting option create request.
CreateAssignedTargetingOptionsRequest createBrowserTargetingRequest =
    new CreateAssignedTargetingOptionsRequest();
createBrowserTargetingRequest.setTargetingType("TARGETING_TYPE_BROWSER");

// Create and set list of browser assigned targeting options.
ArrayList<AssignedTargetingOption> createBrowserAssignedTargetingOptions =
    new ArrayList<AssignedTargetingOption>();
for (String targetingOptionId : create-browser-assigned-targeting-ids) {
  createBrowserAssignedTargetingOptions.add(new AssignedTargetingOption()
      .setBrowserDetails(
          new BrowserAssignedTargetingOptionDetails()
              .setTargetingOptionId(targetingOptionId)));
}
createBrowserTargetingRequest
    .setAssignedTargetingOptions(createBrowserAssignedTargetingOptions);

// Add browser assigned targeting options to list of create requests.
createRequests.add(createBrowserTargetingRequest);

// Set create requests in edit request.
requestContent.setCreateRequests(createRequests);

// Configure the bulk edit request.
LineItems.BulkEditAssignedTargetingOptions request =
    service.advertisers().lineItems()
        .bulkEditAssignedTargetingOptions(
            advertiser-id,
            requestContent);

// Execute bulk edit request.
BulkEditAssignedTargetingOptionsResponse response = request.execute();

// Check if any line items updated successfully.
if (response.getUpdatedLineItemIds() == null || response.getUpdatedLineItemIds().isEmpty()) {
  System.out.println("No line items were updated successfully.");
} else {
  System.out.printf(
      "Targeting configurations for the following line item IDs were updated: %s.\n",
      Arrays.toString(response.getUpdatedLineItemIds().toArray()));
}

// Check if any line items failed to update.
if (response.getFailedLineItemIds() == null || response.getFailedLineItemIds().isEmpty()) {
  System.out.println("No line items failed to update.");
} else {
  // Print the line items that failed to update.
  System.out.printf(
      "Targeting configurations for the following line item IDs failed to update: %s.\n",
      Arrays.toString(response.getFailedLineItemIds().toArray()));

  // Print errors thrown for failed updates.
  System.out.println("The failed updates were caused by the following errors:");
  for (Status error : response.getErrors()) {
    System.out.printf("Error Code: %s, Message: %s\n", error.getCode(), error.getMessage());
  }
}

Питон

# Build assigned targeting option objects to create.
createBrowserAssignedTargetingOptions = []
for targeting_id in create-browser-assigned-targeting-ids:
  createBrowserAssignedTargetingOptions.append(
      {'browserDetails': {'targetingOptionId': targeting_id}}
  )

# Create a bulk edit request.
bulk_edit_line_item_request = {
    'lineItemIds': line-item-ids,
    'deleteRequests': [
        {
            'targetingType': 'TARGETING_TYPE_BROWSER',
            'assignedTargetingOptionIds':
              delete-browser-assigned-targeting-ids
        },
        {
            'targetingType': 'TARGETING_TYPE_DEVICE_MAKE_MODEL',
            'assignedTargetingOptionIds':
              delete-device-make-model-assigned-targeting-ids
        }
    ],
    'createRequests': [
        {
            'targetingType': 'TARGETING_TYPE_BROWSER',
            'assignedTargetingOptions':
              createBrowserAssignedTargetingOptions
        }
    ]
}

# Edit the line item targeting.
response = service.advertisers().lineItems()\
  .bulkEditAssignedTargetingOptions(
    advertiserId=advertiser-id,
    body=bulk_edit_line_item_request
).execute()

# Print successfully updated line items.
if 'updatedLineItemIds' not in response:
  print("No line items were updated successfully.")
else:
  print("Targeting configurations for the following line item IDs were updated: %s"
        % response['updatedLineItemIds'])

# Print line items that failed to update.
if 'failedLineItemIds' not in response:
  print("No line items failed to update.")
else:
  print("Targeting configurations for the following line item IDs failed to update: %s"
        % response['failedLineItemIds'])
  if 'errors' in response:
    print("The failed updates were caused by the following errors:")
    for error in response["errors"]:
      print("Error code: %s, Message: %s" % (error["code"], error["message"]))

PHP

// Create delete request list.
$deleteRequests = array();

// Create and add browser assigned targeting option IDs to delete request list.
$deleteBrowserTargetingRequest =
    new Google_Service_DisplayVideo_DeleteAssignedTargetingOptionsRequest();
$deleteBrowserTargetingRequest->setTargetingType(
    "TARGETING_TYPE_BROWSER"
);
$deleteBrowserTargetingRequest->setAssignedTargetingOptionIds(
    delete-browser-assigned-targeting-ids
);
$deleteRequests[] = $deleteBrowserTargetingRequest;

// Create and add device assigned targeting option IDs to delete request list.
$deleteDeviceTargetingRequest =
    new Google_Service_DisplayVideo_DeleteAssignedTargetingOptionsRequest();
$deleteDeviceTargetingRequest->setTargetingType(
    "TARGETING_TYPE_DEVICE_MAKE_MODEL"
);
$deleteDeviceTargetingRequest->setAssignedTargetingOptionIds(
    delete-device-make-model-assigned-targeting-ids
);
$deleteRequests[] = $deleteDeviceTargetingRequest;

// Create create request list.
$createRequests = array();

// Create and populate list of browser assigned targetion options to create.
$createBrowserAssignedTargetingOptions = array();
foreach (create-browser-assigned-targeting-ids as $optionId) {
    $option = new Google_Service_DisplayVideo_AssignedTargetingOption();
    $details =
        new Google_Service_DisplayVideo_BrowserAssignedTargetingOptionDetails();
    $details->setTargetingOptionId($optionId);

    $option->setBrowserDetails($details);
    $createBrowserAssignedTargetingOptions[] = $option;
}

// Create and add browser assigned targeting option create request to create
// request list.
$createBrowserTargetingRequest =
    new Google_Service_DisplayVideo_CreateAssignedTargetingOptionsRequest();
$createBrowserTargetingRequest->setTargetingType(
    "TARGETING_TYPE_BROWSER"
);
$createBrowserTargetingRequest->setAssignedTargetingOptions(
    $createBrowserAssignedTargetingOptions
);
$createRequests[] = $createBrowserTargetingRequest;

// Create a bulk edit request and assign create and delete request lists.
$body =
    new Google_Service_DisplayVideo_BulkEditAssignedTargetingOptionsRequest();
$body->setLineItemIds(line-item-ids);
$body->setCreateRequests($createRequests);
$body->setDeleteRequests($deleteRequests);

// Call the API, editing the assigned targeting options for the identified
// line item.
$response = $service
    ->advertisers_lineItems
    ->bulkEditAssignedTargetingOptions(
        advertiser-id,
        $body
    );

// Print successfully updated line items.
if (!empty($response->getUpdatedLineItemIds())) {
    printf('Targeting configurations for the following line item IDs were updated:\n');
    foreach ($response->getUpdatedLineItemIds() as $id) {
        printf('%s\n', $id);
    }
} else {
    print('No line items were updated successfully.\n');
}

// Print line items that failed to update.
if (!empty($response->getFailedLineItemIds())) {
    print('Targeting configurations for the following line item IDs failed to update:\n');
    foreach ($response->getFailedLineItemIds() as $id) {
        printf('%s\n', $id);
    }
    print('The failed updates were caused by the following errors:\n');
    foreach ($response->getErrors() as $error) {
        printf('Error Code: %s, Message: %s\n', $error->getCode(), $error->getMessage());
    }
} else {
    print('No line items failed to update.\n');
}