Establecer orientación

Los servicios Opciones de segmentación, Opciones de segmentación asignadas y Líneas de pedido se usan en conjunto para establecer la segmentación de las líneas de pedido en la API de Display & Video 360. En esta página, se describen y proporcionan ejemplos para encontrar opciones de segmentación disponibles, asignarlas a los elementos de línea y ejecutar operaciones masivas en los elementos de línea para enumerar y editar las opciones de segmentación asignadas.

Cómo encontrar las opciones de segmentación disponibles

Las opciones de segmentación usan variables especificadas por el usuario, entidades segmentables existentes o opciones preexistentes para definir el público objetivo deseado. Las opciones preexistentes se identifican con valores de enum o IDs de opciones de segmentación, según el tipo de segmentación. Las entidades aptas para segmentación se identifican con sus IDs de entidad. Los IDs de opción de segmentación y los IDs de entidad se pueden encontrar con la API de Display & Video 360.

Usa valores de enum establecidos

Las opciones de segmentación para los siguientes tipos de segmentación se asignan con tipos de enumeración específicos:

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

Se puede usar una versión de cadena del valor de enumeración relevante para identificar los recursos AssignedTargetingOption existentes de estos tipos de segmentación y está disponible en el campo assignedTargetingOptionIdAlias. Puedes usar este valor de alias en lugar de assignedTargetingOptionId cuando recuperes o borres las opciones de segmentación asignadas.

Cómo recuperar los IDs de las opciones de segmentación

Los tipos de segmentación que usan opciones preexistentes se asignan con los IDs de opciones de segmentación correspondientes.

Por ejemplo, hay una cantidad finita de posiciones en pantalla a las que se puede segmentar con el tipo de segmentación TARGETING_TYPE_ON_SCREEN_POSITION. Cada una de estas posiciones tiene un ID de opción de segmentación correspondiente.

Estos IDs de opciones de segmentación se pueden recuperar a través del servicio de opciones de segmentación. Según el tipo de segmentación, la recuperación se realiza de una de las siguientes maneras:

  • Recuperación individual o lista exhaustiva: La recuperación de opciones para la mayoría de los tipos de segmentación se puede realizar con los métodos get y list. Usa targetingTypes.targetingOptions.get para recuperar los detalles de una opción de segmentación identificada por un tipo de segmentación y un ID de opción de segmentación. Usa targetingTypes.targetingOptions.list para enumerar todas las opciones de segmentación disponibles de un tipo de segmentación determinado.
  • Búsqueda: Las opciones para los tipos de segmentación geográfica (TARGETING_TYPE_GEO_REGION, TARGETING_TYPE_POI y TARGETING_TYPE_BUSINESS_CHAIN) se deben recuperar con el método search. Usa targetingTypes.targetingOptions.search para recuperar opciones de segmentación de un tipo determinado que coincidan con cadenas de consulta determinadas.

Este es un ejemplo de cómo recuperar una lista de posibles opciones de segmentación para el tipo de segmentación TARGETING_TYPE_BROWSER:

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

Enumera las entidades segmentables

Para segmentar una línea de pedido con una entidad segmentable existente, necesitas el ID de esa entidad. Las entidades segmentables, como los canales, los públicos combinados y los grupos de fuentes de inventario, se pueden recuperar a través de sus propios servicios en la API de Display & Video 360.

Cada servicio tiene sus propios métodos get y list. Usa el método get para confirmar que una entidad está disponible para un anunciante determinado. Usa el método list para descubrir todas las entidades de ese tipo de recurso que están disponibles para un anunciante determinado y, por lo tanto, se pueden usar para asignar segmentación a una línea de pedido de ese anunciante.

También se puede administrar un subconjunto de entidades segmentables a través de la API. Esto se hace a través de los métodos create y patch en el servicio correspondiente, así como de los servicios para los valores individuales que se enumeran en las entidades, como las fuentes de inventario, las palabras clave negativas y las ubicaciones.

Cómo compilar IDs de opciones de segmentación de lugares de interés

Las opciones de segmentación de lugares de interés designados, en TARGETING_TYPE_POI, se pueden recuperar con targetingTypes.targetingOptions.search. Además, puedes crear IDs de opciones de segmentación TARGETING_TYPE_POI personalizados para segmentar anuncios en coordenadas de latitud y longitud específicas.

Sigue estos pasos para crear un ID de opción de segmentación de lugares de interés:

  1. Recupera las coordenadas de latitud y longitud (p. ej., "40.7414691, -74.003387").
  2. Redondea los valores de las coordenadas al sexto decimal (p. ej., "40.741469, -74.003387").
  3. Quita los decimales de los valores de las coordenadas (p. ej., "40741469, -74003387").
  4. Concatena los dos valores para crear una sola cadena, separada por un punto y coma (p. ej., "40741469;-74003387").

La cadena resultante se puede usar como targetingOptionId cuando se crea una opción de segmentación asignada TARGETING_TYPE_POI.

Cuando se cree, se actualizarán los campos targetingOptionId y assignedTargetingOptionId del recurso de opción de segmentación asignado y se agregará un punto y coma y un hash alfanumérico.

Asigna una opción de segmentación

La segmentación asignada a una línea de pedido se representa como una opción de segmentación asignada. Puedes administrar estas entidades con el servicio de opciones de segmentación asignadas. Cuando creas una opción de segmentación asignada, se aplican esos detalles de segmentación a la línea de pedido superior. Si borras una opción de segmentación asignada existente, se quitará esa segmentación.

Usa advertisers.lineItems.targetingTypes.assignedTargetingOptions.create para crear opciones de segmentación asignadas. Especifica los parámetros de segmentación en el campo details del recurso de opción de segmentación asignado que corresponde al tipo de segmentación previsto.

A continuación, se muestra un ejemplo de cómo crear una opción de segmentación asignada del tipo de segmentación 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']
);

Errores

Errores de configuración de la segmentación

Existen varias reglas complejas relacionadas con la segmentación en Display & Video 360. Se aplican en la API de Display & Video 360 a través de errores que se muestran cuando se crea una opción de segmentación asignada. El error que muestra la API especificará la infracción.

Los errores se deben principalmente a la segmentación existente asignada a una línea de pedido. Usa advertisers.lineItems.targetingTypes.assignedTargetingOptions.list para recuperar todas las opciones de segmentación de un tipo de segmentación determinado asignadas a una línea de pedido, evalúa si es posible la segmentación deseada dadas las limitaciones y usa advertisers.lineItems.targetingTypes.assignedTargetingOptions.delete para quitar cualquier segmentación no deseada antes de volver a intentar crear la opción de segmentación asignada deseada.

Errores de segmentación de YouTube y socios

La segmentación específica para las campañas de YouTube y socios no se puede actualizar con la API de Display & Video 360. Si intentas hacerlo, se producirá un error.

La segmentación de YouTube y socios consiste en todas las segmentaciones asignadas directamente a las líneas de pedido de YouTube y socios y a los grupos de anuncios, así como a cualquier segmentación de los siguientes tipos de segmentación:

  • TARGETING_TYPE_SESSION_POSITION
  • TARGETING_TYPE_YOUTUBE_CHANNEL
  • TARGETING_TYPE_YOUTUBE_VIDEO

Errores de simultaneidad

Si intentas actualizar la configuración o la segmentación de una sola línea de pedido a través de varias solicitudes simultáneas, se producirá un error.

Si necesitas agregar o quitar varias opciones de segmentación asignadas para un solo elemento de una sola línea al mismo tiempo, debes usar una solicitud de edición masiva. Si deseas actualizar la configuración y la segmentación de una línea de pedido, realiza la solicitud advertisers.lineItems.patch y la solicitud de segmentación relevante de forma consecutiva para asegurarte de que la segunda solicitud no se envíe hasta que la primera muestre una respuesta.

Operaciones de segmentación masivas y a nivel de los recursos

Puedes usar los métodos de segmentación masiva y para todo el recurso para administrar las opciones de segmentación asignadas en todos los tipos de segmentación:

  • Usa los métodos de segmentación masiva para recuperar o editar opciones de segmentación en varios tipos de segmentación y en varios recursos. Puedes recuperar la configuración de segmentación completa de varias líneas de pedido con advertisers.lineItems.bulkListAssignedTargetingOptions o realizar actualizaciones idénticas de la segmentación en varias líneas de pedido con advertisers.lineItems.bulkEditAssignedTargetingOptions. Solo están disponibles en el servicio de advertisers.lineItems.
  • Usa los métodos de segmentación a nivel del recurso para recuperar o editar opciones de segmentación en varios tipos de segmentación en un solo recurso. Están disponibles en los servicios partners y advertisers, y se denominan listAssignedTargetingOptions o editAssignedTargetingOptions.

Si deseas obtener una vista completa de la segmentación actual de una línea de pedido, aplicar una configuración de segmentación predeterminada a una línea de pedido o realizar varios cambios en la segmentación de una línea de pedido de forma simultánea, considera usar estos métodos de segmentación.

Segmentación por lista de forma masiva

advertisers.lineItems.bulkListAssignedTargetingOptions proporciona una forma de ver todas las segmentaciones asignadas a una o más líneas de pedido en diferentes tipos de segmentación. Funciona de manera similar a cualquier otro método list. Puedes usar el parámetro de consulta filter para filtrar los resultados por TargetingType o Inheritance.

A continuación, se muestra un ejemplo de cómo enumerar todas las opciones de segmentación asignadas a una línea de pedido que hereda el socio o anunciante superior:

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

Cómo editar la segmentación de forma masiva

advertisers.lineItems.bulkEditAssignedTargetingOptions proporciona una forma de agregar y quitar varias opciones de segmentación de varios tipos de segmentación de una o más líneas de pedido de forma simultánea.

El método toma una lista de DeleteAssignedTargetingOptionsRequests y una lista de CreateAssignedTargetingOptionsRequests. Un solo objeto de solicitud puede representar la eliminación o creación de varias opciones de segmentación asignadas del mismo tipo de segmentación.

Si el intento de borrar o crear una opción de segmentación asignada causa un error en una línea de pedido, se abandonará la acción masiva para esa línea de pedido. La solicitud muestra una lista de líneas de pedido que se actualizaron correctamente, así como listas de líneas de pedido que no se pudieron actualizar y los errores relevantes.

A continuación, se muestra un ejemplo de cómo editar de forma masiva las opciones de segmentación asignadas para uno o más líneas de pedido, según las listas de opciones de segmentación asignadas que se deben borrar y las opciones de segmentación que se deben crear:

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