הגדרת טירגוט

השירותים Targeting Options‏, Assigned Targeting Options ו-Line items משמשים יחד להגדרת טירגוט של פריטים ב-Display & Video 360 API. בדף הזה מוסבר איך למצוא את אפשרויות הטירגוט הזמינות, להקצות אפשרויות טירגוט לפריטי שורה ולבצע פעולות בכמות גדולה על פריטי שורה כדי להציג ולערוך את אפשרויות הטירגוט שהוקצו.

איך מוצאים את אפשרויות הטירגוט הזמינות

אפשרויות הטירגוט משתמשות במשתנים שהגדיר המשתמש, בישויות קיימות שניתן לטרגט או באפשרויות קיימות מראש כדי להגדיר את קהל היעד הרצוי. אפשרויות קיימות מזוהות באמצעות ערכי enum או מזהי אפשרויות טירגוט, בהתאם לסוג הטירגוט. ישויות שניתן לטרגט מזוהות באמצעות מזהי הישויות שלהן. אפשר למצוא את מזהי האפשרויות לטירגוט ואת מזהי הישויות באמצעות Display & Video 360 API.

שימוש בערכי enum מוגדרים

אפשרויות הטירגוט של סוגי הטירגוט הבאים מוקצות באמצעות סוגי enum ספציפיים:

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

אפשר להשתמש בגרסה של מחרוזת של ערך המניין הרלוונטי כדי לזהות משאבים קיימים מסוג AssignedTargetingOption של סוגי הטירגוט האלה, והיא זמינה בשדה assignedTargetingOptionIdAlias. אפשר להשתמש בערך החלופי הזה במקום ב-assignedTargetingOptionId כשמאתרים או מוחקים אפשרויות טירגוט שהוקצו.

אחזור מזהי אפשרויות טירגוט

סוגי טירגוט שמשתמשים באפשרויות קיימות מוקצים באמצעות מזהי אפשרויות הטירגוט התואמים.

לדוגמה, יש מספר מוגבל של מיקומים במסך שאפשר לטרגט באמצעות סוג הטירגוט TARGETING_TYPE_ON_SCREEN_POSITION. לכל אחת מהמיקומים האלה יש מזהה תואם של אפשרות טירגוט.

אפשר לאחזר את מזהי אפשרויות הטירגוט האלה דרך השירות Targeting Options. בהתאם לסוג הטירגוט, אחזור הנתונים מתבצע באחת משתי דרכים:

  • אחזור פריטים ספציפיים או רשימה מקיפה: אפשר לאחזר אפשרויות לרוב סוגי הטירגוט באמצעות השיטות 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:

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

הצגת רשימה של ישויות שאפשר לטרגט אליהן

כדי לטרגט פריט שורה באמצעות ישות קיימת שניתן לטרגט, צריך את המזהה של הישות הזו. ישויות שניתן לטרגט, כמו ערוצים, קהלים משולבים וקבוצות של מקורות מלאי שטחי פרסום, ניתנות לאחזור דרך השירותים שלהן ב-Display & Video 360 API.

לכל שירות יש שיטות get ו-list משלו. משתמשים בשיטה get כדי לוודא שהישות זמינה במפרסם נתון. אפשר להשתמש ב-method‏ list כדי לזהות את כל הישויות מסוג המשאב הזה שזמינות למפרסם נתון, ולכן אפשר להשתמש בהן כדי להקצות טירגוט לפריט שמוצג בחשבון של המפרסם הזה.

אפשר גם לנהל קבוצת משנה של ישויות שניתן לטרגט דרך ה-API. כדי לעשות זאת, משתמשים בשיטות create ו-patch בשירות המתאים, וגם בשירותים של הערכים הנפרדים שמפורטים בישויות, כמו מקורות מלאי שטחי הפרסום, מילות מפתח שליליות ומיקומים.

יצירת מזהי אפשרויות טירגוט לנקודות עניין

אפשר לאחזר אפשרויות טירגוט של נקודות עניין בעלות שם בקטע TARGETING_TYPE_POI באמצעות targetingTypes.targetingOptions.search. בנוסף, אפשר ליצור מזהי אפשרויות טירגוט בהתאמה אישית של TARGETING_TYPE_POI כדי לטרגט קואורדינטות ספציפיות של קו רוחב ואורך.

כדי ליצור מזהה של אפשרות טירגוט לפי נקודת עניין:

  1. אחזור קואורדינטות של קו רוחב וקו אורך (למשל: '40.7414691, -74.003387')
  2. עיגול ערכי הקואורדינטות לשישית העשרונית (למשל: ‎"40.741469, -74.003387"‎)
  3. מסירים את הנקודות העשרוניות מערכי הקואורדינטות (למשל: ‎40741469, -74003387‎)
  4. שרשור שני הערכים ליצירת מחרוזת אחת, מופרדים באמצעות נקודה-פסיק (למשל: ‎"40741469;-74003387")

אפשר להשתמש במחרוזת שנוצרת כ-targetingOptionId כשיוצרים אפשרות טירגוט TARGETING_TYPE_POI שהוקצה לה.

במהלך היצירה, השדות targetingOptionId ו-assignedTargetingOptionId של משאב אפשרות הטירגוט שהוקצה יתעדכנו, עם סימן פסיק וחיפוש (hash) אלפאנומרי שיתווספו אליהם.

הקצאת אפשרות טירגוט

טירגוט שהוקצה לפריט מסוים מיוצג בתור אפשרות טירגוט שהוקצה. אפשר לנהל את הישויות האלה באמצעות השירות 'אפשרויות טירגוט שהוקצו'. כשיוצרים אפשרות טירגוט שהוקצה, פרטי הטירגוט האלה חלים על הפריט הראשי. מחיקת אפשרות טירגוט קיימת תסיר את הטירגוט הזה.

משתמשים ב-advertisers.lineItems.targetingTypes.assignedTargetingOptions.create כדי ליצור אפשרויות טירגוט שהוקצו. מציינים את פרמטרים הטירגוט בשדה details של משאב אפשרות הטירגוט שהוקצה, בהתאם לסוג הטירגוט המיועד שלו.

דוגמה ליצירת אפשרות טירגוט שהוקצה לה סוג טירגוט 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']
);

שגיאות

שגיאות בהגדרות הטירגוט

יש כמה כללים מורכבים לגבי טירגוט ב-Display & Video 360. הן נאכפות ב-Display & Video 360 API באמצעות שגיאות שמוחזרות בזמן היצירה של אפשרות הטירגוט שהוקצה. השגיאה שתוחזר על ידי ה-API תציין את ההפרה.

בדרך כלל, השגיאות נגרמות בגלל טירגוט קיים שהוקצה לפריט. משתמשים ב-advertisers.lineItems.targetingTypes.assignedTargetingOptions.list כדי לאחזר את כל אפשרויות הטירגוט של סוג טירגוט נתון שהוקצה לפריט שורה, בודקים אם אפשר להגדיר את הטירגוט הרצוי בהתאם למגבלות, ומשתמשים ב-advertisers.lineItems.targetingTypes.assignedTargetingOptions.delete כדי להסיר טירגוט לא רצוי לפני שמנסים שוב ליצור את אפשרות הטירגוט הרצוי שהוקצתה.

שגיאות בטירגוט של YouTube ושותפים

אי אפשר לעדכן טירגוט ספציפי לקמפיינים של YouTube ושותפים באמצעות Display & Video 360 API, וניסיון לעשות זאת יוביל לשגיאה.

הטירגוט של YouTube ושותפי הווידאו של Google מורכב מכל סוגי הטירגוט שהוקצו ישירות לקבוצות של מודעות ולפריטים של YouTube ושותפי הווידאו של Google, וגם מכל סוגי הטירגוט הבאים:

  • 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, ונקרא listAssignedTargetingOptions או editAssignedTargetingOptions.

אם אתם רוצים לקבל תצוגה מלאה של הטירגוט הנוכחי של פריט חשבון, להחיל הגדרת טירגוט מוגדרת מראש על פריט חשבון או לבצע כמה שינויים בטירגוט של פריט חשבון בו-זמנית, מומלץ להשתמש בשיטות הטירגוט האלה.

טירגוט של רשימות בכמות גדולה

בעזרת advertisers.lineItems.bulkListAssignedTargetingOptions אפשר לראות את כל אפשרויות הטירגוט שהוקצו לפריט אחד או יותר, בסוגים שונים של טירגוט. היא פועלת באופן דומה לכל שיטת list אחרת. אפשר להשתמש בפרמטר השאילתה filter כדי לסנן את התוצאות לפי TargetingType או לפי Inheritance.

דוגמה לאופן שבו אפשר לרשום את כל אפשרויות הטירגוט שהוקצו לפריט שעוברות בירושה לשותף ההורה או למפרסם:

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

עריכת טירגוט בכמות גדולה

advertisers.lineItems.bulkEditAssignedTargetingOptions מאפשר להוסיף ולהסיר בו-זמנית כמה אפשרויות טירגוט מסוגים שונים מפריט שורה אחד או יותר.

ה-method מקבל רשימה של DeleteAssignedTargetingOptionsRequests ורשימה של CreateAssignedTargetingOptionsRequests. אובייקט בקשה יחיד יכול לייצג מחיקה או יצירה של כמה אפשרויות טירגוט שהוקצו מאותו סוג טירגוט.

אם הניסיון למחוק או ליצור אפשרות טירגוט שהוקצה לפריט גורם לשגיאה באותו פריט, הפעולה בכמות גדולה תבוטל לגבי הפריט הזה. הבקשה מחזירה רשימת פריטים שעודכנו בהצלחה, וגם רשימות של פריטים שלא ניתן היה לעדכן ושל השגיאות הרלוונטיות.

בדוגמה הבאה מוסבר איך לערוך בבת אחת את אפשרויות הטירגוט שהוקצו לפריט אחד או יותר, על סמך רשימות של אפשרויות טירגוט שהוקצו ואפשרויות טירגוט שרוצים ליצור:

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