הגדרת טירגוט

בקטע אפשרויות טירגוט, אפשרויות טירגוט מוקצות, וגם נעשה שימוש בשירותי פריטים בשילוב כדי להגדיר טירגוט פריטים ברשת המדיה Video 360 API בדף הזה נתאר ונציג דוגמאות למציאת אפשרויות מיקוד זמינות, להקצות אפשרויות מיקוד לשורה פריטים, וביצוע פעולות בכמות גדולה על פריטים כדי להציג ולערוך את הפריטים שהוקצו אפשרויות טירגוט.

איך בודקים את אפשרויות הטירגוט הזמינות

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

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

כדי לטרגט פריט באמצעות ישות קיימת שאפשר לטרגט, צריך המזהה של אותה ישות. ישויות שאפשר לטרגט, כמו ערוצים, קהלים משולבים, וגם קבוצות מקור של מלאי שטחי פרסום. אפשר לאחזר אותן דרך את השירותים שלהם ברשת המדיה 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']
);

שגיאות

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

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

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

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

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

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

  • TARGETING_TYPE_SESSION_POSITION
  • TARGETING_TYPE_YOUTUBE_CHANNEL
  • TARGETING_TYPE_YOUTUBE_VIDEO

שגיאות בו-זמניות (concurrency)

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

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

פעולות טירגוט בכמות גדולה וברשימת המשאבים

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

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

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

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