הגדרת טירגוט

השירותים אפשרויות מיקוד, אפשרויות מיקוד שהוקצו ופריטים משמשים בשילוב עם הגדרת מיקוד לפריטים ב-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

גרסת מחרוזת של ערך ה-enum הרלוונטי יכולה לשמש לזיהוי משאבי 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:

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 כדי לוודא שישות זמינה אצל מפרסם מסוים. משתמשים בשיטה 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 של משאב אפשרות המיקוד שהוקצה יתעדכנו, ויצורפו נקודה ופסיק וגיבוב אלפאנומרי.

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

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

בעזרת 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 ושותפים

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

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

  • 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.

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

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 אפשר להוסיף ולהסיר אפשרויות טירגוט מסוגים שונים במקביל לפריט אחד או יותר.

השיטה הזו לוקחת רשימה של 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');
}