تعيين الاستهداف

يتم استخدام خدمات خيارات الاستهداف وخيارات الاستهداف المخصّصة والعناصر جنبًا إلى جنب مع ضبط استهداف العناصر في واجهة برمجة التطبيقات لـ "مساحة العرض والفيديو 360". تصف هذه الصفحة وتقدم أمثلة على كيفية العثور على خيارات الاستهداف المتاحة وتعيين خيارات الاستهداف للبنود وتنفيذ عمليات مجمّعة على العناصر لإدراج وتعديل خيارات الاستهداف المخصصة.

الاطّلاع على خيارات الاستهداف المتاحة

تستخدم خيارات الاستهداف إما متغيّرات يحددها المستخدم أو كيانات حالية قابلة للاستهداف أو خيارات موجودة مسبقًا لتحديد الجمهور المستهدف المطلوب. يتم تحديد الخيارات المتوفرة مسبقًا باستخدام قيم التعداد أو أرقام تعريف خيارات الاستهداف، اعتمادًا على نوع الاستهداف. يتم تحديد الكيانات القابلة للاستهداف باستخدام أرقام تعريف الكيانات الخاصة بها. يمكن العثور على أرقام تعريف خيارات الاستهداف وأرقام تعريف الكيانات باستخدام "مساحة العرض والفيديو 360 API".

استخدام قيم تعداد محدّدة

يتم تعيين خيارات الاستهداف لأنواع الاستهداف التالية باستخدام أنواع تعداد معيّنة:

TargetingType قيم التعداد
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. لكل موضع من هذه المواضع رقم تعريف لخيار الاستهداف المقابل.

ويمكن استرداد أرقام تعريف خيارات الاستهداف هذه من خلال خدمة خيارات الاستهداف. وحسب نوع الاستهداف، يتم الاسترداد بإحدى الطريقتين التاليتين:

  • استرداد الخيارات الفردية أو القائمة الشاملة: يمكن استرداد الخيارات لغالبية أنواع الاستهداف باستخدام الطريقتين 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
);

إدراج الكيانات القابلة للاستهداف

لاستهداف عنصر باستخدام كيان حالي قابل للاستهداف، ستحتاج إلى رقم تعريف ذلك الكيان. يمكن استرداد الكيانات القابلة للاستهداف، مثل القنوات وشرائح الجمهور المُجمَّعة ومجموعات مصادر المستودع، من خلال خدماتها الخاصة في واجهة برمجة التطبيقات "مساحة العرض والفيديو 360".

ولكل خدمة طرق get وlist خاصة بها. استخدِم طريقة get للتأكّد من أنّ كيانًا متاحًا بموجب معلِن معيّن. استخدِم الإجراء list لاكتشاف جميع الكيانات من نوع المورد ذلك والمتاحة لمعلِن معيّن، وبالتالي يمكن استخدامها في تخصيص الاستهداف لعنصر ضمن هذا المعلِن.

ويمكن أيضًا إدارة مجموعة فرعية من الكيانات القابلة للاستهداف من خلال واجهة برمجة التطبيقات. يتم ذلك من خلال طريقتَي 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 لمورد خيار الاستهداف الذي تم تعيينه، مع إلحاق فاصلة منقوطة وتجزئة أبجدية رقمية.

تعيين خيار استهداف

يتمّ تمثيل الاستهداف الذي تمّ تعيينه لعنصر معيّن باعتباره خيار استهداف معيّن. يمكنك إدارة هذه الكيانات باستخدام خدمة خيارات الاستهداف المعينة. يؤدي إنشاء خيار استهداف معيَّن إلى تطبيق تفاصيل الاستهداف هذه على العنصر الرئيسي. ويؤدي حذف خيار استهداف حالي تم تعيينه إلى إزالة هذا الاستهداف.

AssignedTargetingOption

استخدِم 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". يتمّ فرض هذه السياسات في "مساحة العرض والفيديو 360 API" من خلال حدوث أخطاء عند إنشاء خيار الاستهداف المحدَّد. سيحدّد الخطأ الذي تعرضه واجهة برمجة التطبيقات الانتهاك.

تحدث الأخطاء في الغالب بسبب الاستهداف الحالي الذي تم تعيينه لعنصر. استخدِم advertisers.lineItems.targetingTypes.assignedTargetingOptions.list لاسترداد جميع خيارات الاستهداف لنوع استهداف معيَّن تم تحديده كبند، وتقييم ما إذا كان الاستهداف المطلوب ممكنًا في ظل الحدود المحدودة، واستخدام advertisers.lineItems.targetingTypes.assignedTargetingOptions.delete لإزالة أي استهداف غير مرغوب فيه قبل محاولة إنشاء خيار الاستهداف المطلوب مرة أخرى.

أخطاء استهداف YouTube والشركاء

لا يمكن تعديل الاستهداف المخصّص لحملات YouTube والشركاء باستخدام واجهة برمجة التطبيقات Display & Video 360 API، وسيؤدي إجراء ذلك إلى حدوث خطأ.

يتألف استهداف YouTube والشركاء من كل الاستهداف المخصّص مباشرةً لتفاصيل الإعلان في YouTube و "الشركاء " والمجموعات الإعلانية، بالإضافة إلى أي استهداف لأنواع الاستهداف التالية:

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