Ausrichtung festlegen

Die Dienste Targeting-Optionen, Zugewiesene Targeting-Optionen und Werbebuchungen werden zusammen verwendet, um in der Display & Video 360 API das Werbebuchungs-Targeting festzulegen. Auf dieser Seite wird beschrieben, wie Sie verfügbare Targeting-Optionen finden, Targeting-Optionen Werbebuchungen zuweisen und Bulk-Vorgänge für Werbebuchungen ausführen, um die zugewiesenen Targeting-Optionen aufzulisten und zu bearbeiten.

Verfügbare Ausrichtungsoptionen

Für die Definition der gewünschten Zielgruppe werden entweder benutzerdefinierte Variablen, vorhandene Entitäten, für die ein Targeting möglich ist, oder bereits vorhandene Optionen verwendet. Vorhandene Optionen werden je nach Targeting-Typ entweder über Enum-Werte oder Targeting-Option-IDs identifiziert. Entitäten, für die ein Targeting möglich ist, werden anhand ihrer Entitäts-IDs identifiziert. Die IDs der Targeting-Optionen und die Entitäts-IDs können über die Display & Video 360 API ermittelt werden.

Festgelegte enum-Werte verwenden

Die Targeting-Optionen für die folgenden Targeting-Typen werden mithilfe von bestimmten enum-Typen zugewiesen:

TargetingType Enum
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

Eine Stringversion des relevanten enum-Werts kann verwendet werden, um vorhandene AssignedTargetingOption-Ressourcen dieser Targeting-Typen zu identifizieren. Die Version ist im Feld assignedTargetingOptionIdAlias verfügbar. Sie können diesen Aliaswert anstelle von assignedTargetingOptionId verwenden, wenn Sie zugewiesene Targeting-Optionen abrufen oder löschen.

IDs für Ausrichtungsoptionen abrufen

Targeting-Typen, die vorhandene Optionen verwenden, werden über die entsprechenden Targeting-Options-IDs zugewiesen.

Beispielsweise gibt es eine begrenzte Anzahl von Positionen auf dem Bildschirm, auf die mit dem Targeting-Typ TARGETING_TYPE_ON_SCREEN_POSITION ein Targeting vorgenommen werden kann. Jede dieser Positionen hat eine entsprechende ID für die Ausrichtungsoptionen.

Diese Targeting-Options-IDs können mit dem Dienst für Targeting-Optionen abgerufen werden. Je nach Targeting-Typ erfolgt der Abruf auf eine von zwei Arten:

  • Individuelles Abrufen oder vollständige Liste: Sie können die Optionen für die meisten Targeting-Typen mit den Methoden get und list abrufen. Mit targetingTypes.targetingOptions.get können Sie die Details einer Targeting-Option abrufen, die durch einen Targeting-Typ und eine Targeting-Options-ID identifiziert wird. Mit targetingTypes.targetingOptions.list werden alle verfügbaren Targeting-Optionen eines bestimmten Targeting-Typs aufgelistet.
  • Suche: Optionen für standortbasierte Targeting-Typen (TARGETING_TYPE_GEO_REGION, TARGETING_TYPE_POI und TARGETING_TYPE_BUSINESS_CHAIN) müssen mit der search-Methode abgerufen werden. Verwenden Sie targetingTypes.targetingOptions.search, um Targeting-Optionen eines bestimmten Typs abzurufen, die mit bestimmten Abfragestrings übereinstimmen.

Das folgende Beispiel zeigt, wie Sie eine Liste möglicher Targeting-Optionen für den Targeting-Typ TARGETING_TYPE_BROWSER abrufen:

Java

// 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));

Python

# 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
);

Für das Targeting infrage kommende Entitäten auflisten

Um ein Targeting auf eine Werbebuchung mithilfe einer vorhandenen Entität vorzunehmen, die für das Targeting verwendet werden kann, benötigen Sie die ID dieser Entität. Entitäten wie Channels, kombinierte Zielgruppen und Inventarquellengruppen, für die ein Targeting möglich ist, können über ihre eigenen Dienste in der Display & Video 360 API abgerufen werden.

Jeder Dienst hat eigene get- und list-Methoden. Mit der Methode get können Sie prüfen, ob eine Entität unter einem bestimmten Werbetreibenden verfügbar ist. Verwenden Sie die Methode list, um alle Entitäten dieses Ressourcentyps zu ermitteln, die für einen bestimmten Werbetreibenden verfügbar sind und daher für die Zuweisung von Targeting zu einer Werbebuchung unter diesem Werbetreibenden verwendet werden können.

Ein Teil der Entitäten, auf die ein Targeting möglich ist, kann auch über die API verwaltet werden. Dies erfolgt über die Methoden create und patch im entsprechenden Dienst sowie Dienste für die einzelnen Werte, die in den Entitäten aufgeführt sind, z. B. Inventarquellen, auszuschließende Keywords und Standorte.

IDs für POI-Ausrichtungsoptionen erstellen

Benannte Targeting-Optionen für POIs unter TARGETING_TYPE_POI können mit targetingTypes.targetingOptions.search abgerufen werden. Darüber hinaus können Sie individuelle IDs für TARGETING_TYPE_POI-Targeting-Optionen erstellen, um ein Targeting auf bestimmte Breiten- und Längengrade vorzunehmen.

So erstellen Sie eine ID für eine POI-Ausrichtungsoption:

  1. Koordinaten für Breiten- und Längengrad abrufen (z. B. "40.7414691, -74.003387")
  2. Runden Sie Koordinatenwerte auf die sechste Dezimalstelle. Beispiel: "40,741469, -74,003387"
  3. Entfernen Sie die Dezimalstellen aus den Koordinatenwerten (z. B. "40741469, -74003387")
  4. Verketten Sie die beiden Werte zu einem einzelnen String, der durch ein Semikolon getrennt ist (z. B. "40741469;-74003387").

Der resultierende String kann beim Erstellen einer zugewiesenen TARGETING_TYPE_POI-Targeting-Option als targetingOptionId verwendet werden.

Beim Erstellen werden die Felder targetingOptionId und assignedTargetingOptionId der zugewiesenen Targeting-Option-Ressource aktualisiert, wobei ein Semikolon und ein alphanumerischer Hash angehängt werden.

Targeting-Option zuweisen

Das einer Werbebuchung zugewiesene Targeting wird als zugewiesene Targeting-Option dargestellt. Sie können diese Entitäten mit dem Dienst für zugewiesene Ausrichtungsoptionen verwalten. Wenn Sie eine zugewiesene Targeting-Option erstellen, werden diese Targeting-Details auf die übergeordnete Werbebuchung angewendet. Wenn Sie eine vorhandene zugewiesene Targeting-Option löschen, wird das entsprechende Targeting entfernt.

Mit advertisers.lineItems.targetingTypes.assignedTargetingOptions.create können Sie zugewiesene Targeting-Optionen erstellen. Geben Sie die Targeting-Parameter im Feld details der zugewiesenen Targeting-Option-Ressource an, die dem gewünschten Targeting-Typ entspricht.

So erstellen Sie eine zugewiesene Targeting-Option des Targeting-Typs TARGETING_TYPE_BROWSER:

Java

// 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());

Python

# 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']
);

Fehler

Fehler bei der Targeting-Konfiguration

In Display & Video 360 gibt es eine Reihe von komplexen Regeln zum Targeting. Diese werden in der Display & Video 360 API durch Fehler erzwungen, die beim Erstellen einer zugewiesenen Targeting-Option zurückgegeben werden. Der von der API zurückgegebene Fehler gibt den Verstoß an.

Fehler werden meistens durch vorhandenes Targeting verursacht, das einer Werbebuchung zugewiesen ist. Verwenden Sie advertisers.lineItems.targetingTypes.assignedTargetingOptions.list, um alle Targeting-Optionen eines bestimmten Targeting-Typs abzurufen, der einer Werbebuchung zugewiesen ist. Prüfen Sie, ob das gewünschte Targeting aufgrund der Einschränkungen möglich ist, und verwenden Sie advertisers.lineItems.targetingTypes.assignedTargetingOptions.delete, um unerwünschtes Targeting zu entfernen, bevor Sie noch einmal versuchen, die gewünschte zugewiesene Targeting-Option zu erstellen.

Targeting-Fehler für YouTube und Partner

Die Ausrichtung auf YouTube und Partner-Kampagnen kann nicht mit der Display & Video 360 API aktualisiert werden. Wenn Sie dies versuchen, wird ein Fehler ausgegeben.

Das Targeting auf „YouTube und Partner“ umfasst das gesamte Targeting, das „YouTube und Partner“-Werbebuchungen und -Anzeigengruppen direkt zugewiesen ist, sowie die folgenden Targeting-Typen:

  • TARGETING_TYPE_SESSION_POSITION
  • TARGETING_TYPE_YOUTUBE_CHANNEL
  • TARGETING_TYPE_YOUTUBE_VIDEO

Gleichzeitigkeitsfehler

Der Versuch, die Einstellungen oder das Targeting einer einzelnen Werbebuchung durch mehrere gleichzeitige Anfragen zu aktualisieren, führt zu einem Fehler.

Wenn Sie einer einzelnen Werbebuchung gleichzeitig mehrere zugewiesene Targeting-Optionen hinzufügen oder entfernen müssen, sollten Sie eine Bulk-Bearbeitungsanfrage verwenden. Wenn Sie die Einstellungen und das Targeting einer Werbebuchung aktualisieren möchten, senden Sie die advertisers.lineItems.patch-Anfrage und die entsprechende Targeting-Anfrage nacheinander. So sorgen Sie dafür, dass die zweite Anfrage erst gesendet wird, wenn sie eine Antwort zurückgibt.

Bulk- und ressourcenweite Targeting-Vorgänge

Mit Bulk-Targeting und ressourcenweiten Targeting-Methoden können Sie zugewiesene Targeting-Optionen für verschiedene Targeting-Typen verwalten:

Wenn Sie einen vollständigen Überblick über das aktuelle Targeting einer Werbebuchung erhalten, eine vordefinierte Targeting-Konfiguration auf eine Werbebuchung anwenden oder mehrere Änderungen am Targeting einer Werbebuchung gleichzeitig vornehmen müssen, sollten Sie diese Targeting-Methoden verwenden.

Listen-Targeting im Bulk

Mit advertisers.lineItems.bulkListAssignedTargetingOptions können Sie sich das gesamte Targeting ansehen, das einer oder mehreren Werbebuchungen mit verschiedenen Targeting-Typen zugewiesen ist. Sie funktioniert ähnlich wie jede andere list-Methode. Mit dem Abfrageparameter filter können Sie die Ergebnisse nach TargetingType oder Inheritance filtern.

Hier sehen Sie ein Beispiel dafür, wie Sie alle Targeting-Optionen auflisten, die einer Werbebuchung zugewiesen sind und vom übergeordneten Partner oder Werbetreibenden übernommen werden:

Java

// 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));

Python

# 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);

Ausrichtung per Bulk-Verfahren bearbeiten

Mit advertisers.lineItems.bulkEditAssignedTargetingOptions können Sie einer oder mehreren Werbebuchungen gleichzeitig mehrere Targeting-Optionen verschiedener Targeting-Typen hinzufügen oder daraus entfernen.

Die Methode verwendet eine Liste von DeleteAssignedTargetingOptionsRequests und eine Liste von CreateAssignedTargetingOptionsRequests. Ein einzelnes Anfrageobjekt kann das Löschen oder Erstellen mehrerer zugewiesener Targeting-Optionen desselben Targeting-Typs darstellen.

Wenn das Löschen oder Erstellen einer zugewiesenen Targeting-Option einen Fehler für eine Werbebuchung verursacht, wird die Bulk-Aktion für diese Werbebuchung abgebrochen. Die Anfrage gibt eine Liste der erfolgreich aktualisierten Werbebuchungen, eine Liste der Werbebuchungen, die nicht aktualisiert werden konnten, und die relevanten Fehler zurück.

Hier sehen Sie ein Beispiel für die Bulk-Bearbeitung zugewiesener Targeting-Optionen für eine oder mehrere Werbebuchungen. Dazu werden Listen mit zu löschenden zugewiesenen Targeting-Optionen und zu erstellende Targeting-Optionen verwendet:

Java

// 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());
  }
}

Python

# 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');
}