There are three APIs you can use to programmatically interact with [Authorized
Buyers](https://support.google.com/authorizedbuyers/answer/6138000):

- **[Marketplace API](https://developers.google.com/authorized-buyers/apis/guides/marketplace/overview)**: Manage deals, auction packages, and client access.
- **[Real-time Bidding API](https://developers.google.com/authorized-buyers/apis/guides/rtb-api/overview)** : Manage bidding, including [QPS
  quotas](https://developers.google.com/authorized-buyers/rtb/callout-quota-system), [targeting](https://developers.google.com/authorized-buyers/apis/guides/rtb-api/pretargeting-overview), and [creatives](https://developers.google.com/authorized-buyers/apis/guides/rtb-api/buyer-creatives).
- **(Deprecated)[Ad Exchange Buyer API II](https://developers.google.com/authorized-buyers/apis/reference/rest)** : This API is deprecated. All resources aside from those related to [RTB Troubleshooting](https://developers.google.com/authorized-buyers/apis/guides/v2/rtb-troubleshooting) have been sunset.

Here are some examples of tasks you can complete using the Authorized Buyers
APIs:

- Access real-time bidding account information.
- Submit and manage creatives undergoing review.
- Retrieve real-time bidding troubleshooting metrics.
- Manage Authorized Buyers [user
  lists](https://developers.google.com/authorized-buyers/apis/realtimebidding/reference/rest/v1/buyers.userLists).
- Manage pretargeting configurations.
- Configure client access for Marketplace.
- Discover and manage proposals for deals in Marketplace.

If you're unfamiliar with Authorized Buyers, see the [Authorized Buyers Help
Center](https://support.google.com/authorizedbuyers/) and
[UI](https://www.google.com/authorizedbuyers/Main.html#BUYER_ADMIN/AccountUsersPlace:accountUsers)
to learn more.

## Quick links

- [Manage creatives](https://developers.google.com/authorized-buyers/apis/guides/rtb-api/creatives)
- [Manage deals](https://developers.google.com/authorized-buyers/apis/guides/marketplace/deals)
- [Migrate from Ad Exchange Buyer II API](https://developers.google.com/authorized-buyers/apis/guides/marketplace-migration)

## Set up authentication

Google APIs use the [OAuth 2.0 protocol](https://developers.google.com/identity/protocols/oauth2) for
authentication and authorization. Here's how to set up authentication for the
Real-time Bidding API using OAuth 2.0.

This example uses a [service
account](https://developers.google.com/identity/protocols/oauth2#serviceaccount). See the [Google Cloud
Identity Access Management](https://cloud.google.com/iam/docs/roles-overview)
documentation for more details on access control.

1. Go to the [Google API Console Enabled APIs
   page](https://console.cloud.google.com/apis/enabled?project=_).

2. From the project drop-down, select a project or create a new one.

   > [!NOTE]
   > **Note:** We recommend [giving multiple people **Admin**
   > access](https://cloud.google.com/iam/docs/granting-changing-revoking-access#required-permissions) to the project to avoid losing access.

3. In the list of **Enabled APIs** , make sure Real-time Bidding API is listed. If
   it's not listed, click the **Google APIs** tab, search for and select the
   Real-time Bidding API, and click **Enable API**.

4. Next, in the sidebar on the left select **Credentials**.

5. Select the **Create credentials** drop-down, then choose **Service account
   key**.

6. In the **Service account** drop-down, choose **New service account**.

7. Enter a **Name** for the service account. The **service account ID** is
   automatically generated from the name and project name.

8. Note the service account ID: you need it to grant access to the new service
   account in the Authorized Buyers UI in step 11.

9. Choose the recommended JSON file as the **Key type**.

10. Click **Create**. The JSON file with the account's public/private key pair
    is saved to your Downloads folder. Keep the generated JSON file in a
    safe place.

11. You must grant the service account access in the [Authorized Buyers
    UI](https://www.google.com/authorizedbuyers) for it to work. Select **Settings \>
    Account Settings** , then choose **User Management \> Account Users** , and
    click **+Service Account**. Enter the service account ID you noted above in
    step 8. This creates a new user with the service account role.

Make sure multiple people have Admin access to your cloud project, in case you
need to change the permissions.

## Request API access

When stepping through the OAuth 2.0 authorization flow, your application can
specify [scopes](https://developers.google.com/identity/protocols/oauth2/scopes) to request access to certain
features on behalf of other Google Accounts. Use the following scopes to gain
read/write access to any of the Authorized Buyers APIs on behalf of an
Authorized Buyers account:

- **Marketplace API**: https://www.googleapis.com/auth/authorized-buyers-marketplace
- **Real-time Bidding API**: https://www.googleapis.com/auth/realtime-bidding
- **Ad Exchange Buyer API II**: https://www.googleapis.com/auth/adexchange.buyer

## Make an API call

Here are some samples you can use to get started in our supported languages:

### Marketplace API

### Java

```
/*
 * Copyright 2021 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.api.services.samples.authorizedbuyers.marketplace.v1;

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.authorizedbuyersmarketplace.v1.AuthorizedBuyersMarketplace;
import com.google.api.services.authorizedbuyersmarketplace.v1.AuthorizedBuyersMarketplaceScopes;
import com.google.api.services.authorizedbuyersmarketplace.v1.model.Client;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.auth.oauth2.ServiceAccountCredentials;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * A sample application that authenticates and runs a request against the Authorized Buyers
 * Marketplace API.
 */
public class FirstApiRequest {

  /**
   * Be sure to specify the name of your application. If the application name is {@code null} or
   * blank, the application will log a warning. Suggested format is "MyCompany-ProductName/1.0".
   */
  private static final String APPLICATION_NAME = "APPLICATION_NAME_HERE";

  // Full path to JSON Key file - include file name.
  private static final java.io.File JSON_FILE = new java.io.File("INSERT_PATH_TO_JSON_FILE");

  // Name of the buyer resource for which the API call is being made.
  private static final String BUYER_NAME = "INSERT_BUYER_RESOURCE_NAME";

  // Global instance of the HTTP transport.
  private static HttpTransport httpTransport;

  // Global instance of the JSON factory.
  private static final JsonFactory jsonFactory = GsonFactory.getDefaultInstance();

  public static void main(String[] args) throws Exception {
    // Create credentials using the JSON key file.
    GoogleCredentials credentials = null;

    try (FileInputStream serviceAccountStream = new FileInputStream((JSON_FILE))) {
      Set<String> scopes = new HashSet<>(AuthorizedBuyersMarketplaceScopes.all());
      credentials = ServiceAccountCredentials.fromStream(serviceAccountStream).createScoped(scopes);
    } catch (IOException ex) {
      System.out.println("Can't complete authorization step. Did you specify a JSON key file?");
      System.out.println(ex);
      System.exit(1);
    }

    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);
    httpTransport = GoogleNetHttpTransport.newTrustedTransport();

    // Use the credentials to create a client for the API service.
    AuthorizedBuyersMarketplace marketplaceClient =
        new AuthorizedBuyersMarketplace.Builder(httpTransport, jsonFactory, requestInitializer)
            .setApplicationName(APPLICATION_NAME)
            .build();

    // Call the buyers.clients.list method to get a list of clients for the given buyer.
    List<Client> clients =
        marketplaceClient.buyers().clients().list(BUYER_NAME).execute().getClients();

    if (clients != null && clients.size() > 0) {
      System.out.printf("Listing of clients associated with buyer \"%s\"%n", BUYER_NAME);
      for (Client client : clients) {
        System.out.printf("* Client name: %s\n", client.getName());
      }
    } else {
      System.out.printf(
          "No clients were found that were associated with buyer \"%s\"%n.", BUYER_NAME);
    }
  }
}
```

### Real-time Bidding API

### Java

Here is a basic example that shows how to use the Real-time Bidding API with Java.

1. **Create a Maven project**

   Open the pom.xml and add these dependencies:

   ```java
   <dependencies>
     <dependency>
       <groupId>com.google.api-client</groupId>
       <artifactId>google-api-client</artifactId>
       <version>1.32.2</version>
     </dependency>
     <dependency>
       <groupId>com.google.apis</groupId>
       <artifactId>google-api-services-pubsub</artifactId>
       <version>v1-rev452-1.25.0</version>
     </dependency>
     <dependency>
       <groupId>com.google.apis</groupId>
       <artifactId>google-api-services-realtimebidding</artifactId>
       <version>v1-rev20260914-2.0.0</version>
     </dependency>
     <dependency>
       <groupId>com.google.auth</groupId>
       <artifactId>google-auth-library-oauth2-http</artifactId>
       <version>1.3.0</version>
     </dependency>
     <dependency>
       <groupId>com.google.code.gson</groupId>
       <artifactId>gson</artifactId>
       <version>2.8.9</version>
     </dependency>
     <dependency>
       <groupId>com.google.http-client</groupId>
       <artifactId>google-http-client-jackson2</artifactId>
       <version>1.40.1</version>
     </dependency>
     <dependency>
       <groupId>joda-time</groupId>
       <artifactId>joda-time</artifactId>
       <version>2.10.13</version>
     </dependency>
     <dependency>
       <groupId>net.sourceforge.argparse4j</groupId>
       <artifactId>argparse4j</artifactId>
       <version>0.9.0</version>
     </dependency>
   </dependencies>
     
   ```

   <br />

2. **Set up your credentials**


   All calls to the API require authentication; create a
   `Credential` using the Service Account JSON key File discussed
   above.

   ```java
   GoogleCredentials credentials = null;

   try (FileInputStream serviceAccountStream = new FileInputStream((JSON_FILE))) {
     Set<String> scopes = new HashSet<>(RealTimeBiddingScopes.all());
     credentials = ServiceAccountCredentials.fromStream(serviceAccountStream).createScoped(scopes);
   } catch (IOException ex) {
     System.out.println("Can't complete authorization step. Did you specify a JSON key file?");
     System.out.println(ex);
     System.exit(1);
   }
   ```
3. **Construct a client for Real-time Bidding API**


   You can then create your Real-time Bidding API client using the Builder
   pattern:

   ```java
   HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(credentials);
   httpTransport = GoogleNetHttpTransport.newTrustedTransport();

   // Use the credentials to create a client for the API service.
   RealTimeBidding realtimeBidding =
       new RealTimeBidding.Builder(httpTransport, jsonFactory, requestInitializer)
           .setApplicationName(APPLICATION_NAME)
           .build();
   ```

   <br />

4. **Perform an operation**


   After you've instantiated a client to connect to the API, you can perform
   an operation. The following code returns all of a given Buyer's
   creatives.

   ```java
       List<Creative> creatives =
           realtimeBidding
               .buyers()
               .creatives()
               .list(BUYER_NAME)
               .setView("FULL")
               .execute()
               .getCreatives();

       if (creatives != null && creatives.size() > 0) {
         System.out.printf("Listing of creatives associated with buyer '%s'%n", BUYER_NAME);
         for (Creative creative : creatives) {
           System.out.printf("* Creative name: %s\n", creative.getName());
         }
       } else {
         System.out.printf(
             "No creatives were found that were associated with buyer '%s'%n.", BUYER_NAME);
       }
   ```


For more detailed information about using the Real-time Bidding API with Java, refer
to the [README](https://github.com/googleads/authorized-buyers-rtb-api-samples/blob/master/java/README.md)
file in the [Real-time Bidding API examples](https://github.com/googleads/authorized-buyers-rtb-api-samples).

### Python

Here is a basic example that shows how to use the Real-time Bidding API with Python.

1. **Download and install the Google API Python Client**

   Example using pip:

   ```python
   $ pip install --upgrade google-api-python-client
   ```

   <br />

2. **Set up your credentials**


   All calls to the API require authentication; instantiate a
   `service_account.Credentials` instance using the Service
   Account JSON key file discussed above.

   ```python
     credentials = service_account.Credentials.from_service_account_file(
         KEY_FILE, scopes=[SCOPE])
   ```
3. **Construct a client for the Real-time Bidding API**


   You can then create your Real-time Bidding API client using the authorized
   `service_account.Credentials` instance:

   ```python
   realtimebidding = build('realtimebidding', VERSION, credentials=credentials)
   ```

   <br />

4. **Perform an operation**


   After you've instantiated a client to connect to the API, you can perform
   an operation. The following code returns all of a given Buyer's
   creatives.

   ```python
   request = realtimebidding.buyers().creatives().list(parent=BUYER_NAME)

   pprint.pprint(request.execute())
   ```


For more detailed information about using the Ad Exchange Buyer API with Python, refer
to the [README](https://github.com/googleads/authorized-buyers-rtb-api-samples/blob/master/python/README.md)
file in the [Real-time Bidding API examples](https://github.com/googleads/authorized-buyers-rtb-api-samples).

### PHP

Here is a basic example that shows how to use the Real-time Bidding API with
PHP.

1. **Set up dependencies**

   If you haven't installed it yet, download and install [Composer](https://getcomposer.org),
   then create a **composer.json** with contents such as the following:

   ```php
   {
     "description": "Authorized Buyers Real-Time Bidding API PHP Samples",
     "require": {
       "php": ">=7.2",
       "google/apiclient": "^2.0"
     },
     "require-dev": {
       "squizlabs/php_codesniffer": "3.*"
     },
     "type": "project",
     "homepage": "https://github.com/googleads/authorized-buyers-rtb-api-samples/tree/master/php",
     "license": "Apache-2.0",
     "authors": [
       {
         "name": "Google",
         "homepage": "https://github.com/googleads/authorized-buyers-rtb-api-samples/graphs/contributors"
       }
     ]
   }
   ```

   Finally, run the following to install dependency libraries:

   ```php
   composer install
   ```
2. **Set up a client**


   Create a `Google_Client`, and use it to instantiate
   `Google_Service_RealTimeBidding`.

   ```php
   $client = new Google_Client();
   $client->setApplicationName('Authorized Buyers Real-time Bidding API PHP Samples');

   $service = new Google_Service_RealTimeBidding($client);
   ```
3. **Set up your credentials**


   All calls to the API require a valid access token. Configure your client to
   step through the OAuth 2.0 flow.

   ```php
   $client->setAuthConfig($keyFileLocation);
   $client->addScope('https://www.googleapis.com/auth/realtime-bidding');

   if ($client->isAccessTokenExpired()) {
       $client->refreshTokenWithAssertion();
   }
   ```
4. **Perform an operation**


   After you've instantiated a client to connect to the API, and configured
   OAuth 2.0, you can use it to make an API call. The following code returns
   all of a given Buyer's creatives:

   ```php
   $result = $service->buyers_creatives->listBuyersCreatives($buyerName, $queryParams);

   print "Creatives associated with buyer account\n";
   if (empty($result['creatives'])) {
       print "No creatives found\n";
       return;
   } else {
       foreach ($result['creatives'] as $creative) {
           print_r($creative);
       }
   }
   ```


For more detailed information about using the Ad Exchange Buyer API with PHP, refer
to the [README](https://github.com/googleads/authorized-buyers-rtb-api-samples/blob/master/php/README.md)
file in the [Real-time Bidding API examples](https://github.com/googleads/authorized-buyers-rtb-api-samples).

### .NET

Here is a basic example that shows how to use the Real-time Bidding API with C#.

1. **Create a new project**

   Open Visual Studio Code and create a new project.
2. **Add required library references to your project**

   In your project's **\*.csproj** file, add a
   `PackageReference` entry for `Google.Apis`,
   `Google.Apis.Auth`, `Google.Apis.Core`,
   `Google.Apis.Oauth2.v2`, and
   `Google.Apis.RealTimeBidding.v1`. As an example, this might look
   like the following:

   ```
   <ItemGroup>
     <PackageReference Include="Google.Apis" Version="1.57.0" />
     <PackageReference Include="Google.Apis.Auth" Version="1.57.0" />
     <PackageReference Include="Google.Apis.Core" Version="1.57.0" />
     <PackageReference Include="Google.Apis.Oauth2.v2" Version="1.57.0.1869" />
     <PackageReference Include="Google.Apis.Pubsub.v1" Version="1.57.0.2667" />
     <PackageReference Condition="!Exists('./Google.Apis.RealTimeBidding.v1.csproj')" Include="Google.Apis.RealTimeBidding.v1" Version="1.57.0.2680" />
     <PackageReference Include="log4net" Version="2.0.13" />
     <PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.4" />
     <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.0">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
     </PackageReference>
     <PackageReference Include="Mono.Options" Version="6.12.0.148" />
     <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
   </ItemGroup>
   ```

   You can find more information about these dependencies at: [https://www.nuget.org/packages/](https://www.nuget.org/packages/).
3. **Set up your credentials**


   All calls to the API require authentication; create a
   `Credential`
   using the Service Account email and JSON File discussed above.

   ```
   var credentialParameters = NewtonsoftJsonSerializer.Instance
       .Deserialize<JsonCredentialParameters>(
           System.IO.File.ReadAllText(ServiceKeyFilePath));

   // Create the credentials.
   var credentialInitializer = new ServiceAccountCredential.Initializer(
           credentialParameters.ClientEmail)
       {
           Scopes = new[] { RealTimeBiddingService.Scope.RealtimeBidding }
       }.FromPrivateKey(credentialParameters.PrivateKey);

   var oAuth2Credentials = new ServiceAccountCredential(credentialInitializer);
   ```
4. **Construct a client for the Real-time Bidding API**


   You can then create your `RealTimeBiddingService`:

   ```
   var serviceInitializer = new BaseClientService.Initializer
       {
           HttpClientInitializer = oAuth2Credentials,
           ApplicationName = "FirstAPICall"
       };

   var realtimebidding = new RealTimeBiddingService(serviceInitializer);
   ```
5. **Perform an operation**


   After you've instantiated a client to connect to the API, you can perform
   an operation. The following code lists creatives for a specified
   Authorized Buyers buyer account associated with your credentials.

   ```
   BuyersResource.CreativesResource.ListRequest request =
       realtimebidding.Buyers.Creatives.List(buyerName);
   request.View = BuyersResource.CreativesResource.ListRequest.ViewEnum.FULL;

   IList<Creative> creatives = request.Execute().Creatives;

   foreach (Creative creative in creatives)
   {
       Console.WriteLine("* Creative name: {0}", creative.Name);
   }
   ```


For more detailed information about using the Real-time Bidding API with C#, refer to
the [README](https://github.com/googleads/authorized-buyers-rtb-api-samples/blob/master/CSharp/README.md)
file in the [Real-time Bidding API examples](https://github.com/googleads/authorized-buyers-rtb-api-samples).

### Ruby

Here is a basic example that shows how to use the Real-time Bidding API with
Ruby.

1. **Download and install the Google API Ruby Client**

   If you haven't installed it yet, download and install [Bundler](https://bundler.io),
   then create a **Gemfile** with contents such as the following:

   ```ruby
   source "https://rubygems.org"

   ruby "2.6.0"

   gem 'google-apis-pubsub_v1', '0.10.0'
   gem 'google-apis-realtimebidding_v1', '~> 0.14.0'
   ```

   Finally, run the following to install dependency libraries:

   ```ruby
   bundle
   ```
2. **Set up your credentials**

   All calls to the API require authentication; create credentials using
   the Service Account email and JSON file discussed above.

   ```ruby
   # Create credentials using the JSON key file.
     auth_options = {
       :json_key_io => File.open(KEY_FILE, "r"),
       :scope => 'https://www.googleapis.com/auth/realtime-bidding'
     }

     oauth_credentials = Google::Auth::ServiceAccountCredentials.make_creds(
       options=auth_options
     )
   ```
3. **Construct a client for the AdExchangeBuyer**

   You can then create your authorized AdExchange Buyer client using the
   credentials:

   ```ruby
   # Create the service and set credentials
     realtimebidding = (
       Google::Apis::RealtimebiddingV1::RealtimeBiddingService.new
     )
     realtimebidding.authorization = oauth_credentials
     realtimebidding.authorization.fetch_access_token!
   ```
4. **Perform an operation**


   After you've instantiated a client to connect to the API, you can perform
   an operation. The following code returns all of a given Buyer's
   creatives.

   ```ruby
   # Call the buyers.creatives.list method to get list of creatives for given buyer.
       creatives_list = realtimebidding.list_buyer_creatives(
           BUYER_NAME, view: 'FULL')

       if creatives_list.creatives.any?
         puts "Found the following creatives for buyer '%s':" % BUYER_NAME
         creatives_list.creatives.each do |creative|
           puts "* Creative name: #{creative.name}"
         end
       else
         puts "No creatives were found that were associated with buyer '%s'" % BUYER_NAME
       end
   ```


For more detailed information about using the Real-time Bidding API with Ruby, refer
to the [README](https://github.com/googleads/authorized-buyers-rtb-api-samples/blob/master/ruby/README.md)
file in the [Real-time Bidding API examples](https://github.com/googleads/authorized-buyers-rtb-api-samples).

### Ad Exchange Buyer API II

### Java

```java
/*
 * Copyright (c) 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.api.services.samples.adexchangebuyer.cmdline.v2_x;

import com.google.api.client.googleapis.services.json.AbstractGoogleJsonClient;
import com.google.api.services.adexchangebuyer2.v2beta1.AdExchangeBuyerII;
import com.google.api.services.adexchangebuyer2.v2beta1.model.AbsoluteDateRange;
import com.google.api.services.adexchangebuyer2.v2beta1.model.Client;
import com.google.api.services.adexchangebuyer2.v2beta1.model.Date;
import com.google.api.services.adexchangebuyer2.v2beta1.model.FilterSet;
import com.google.api.services.adexchangebuyer2.v2beta1.model.RealtimeTimeRange;
import com.google.api.services.adexchangebuyer2.v2beta1.model.RelativeDateRange;
import com.google.api.services.samples.adexchangebuyer.cmdline.BaseSample;
import java.io.IOException;
import java.util.List;

/**
 * This sample illustrates how to retrieve all Bidder-level Filter Sets.
 */
public class GetAllBidderLevelFilterSets extends BaseSample {
  @Override
  public ClientType getClientType() {
    return ClientType.ADEXCHANGEBUYERII;
  }

  @Override
  public String getName() {
    return "Get All Bidder-level Filter Sets.";
  }

  @Override
  public String getDescription() {
    return "Lists Filter Sets associated with the given Bidder.";
  }

  @Override
  public void execute(AbstractGoogleJsonClient client) throws IOException {
    AdExchangeBuyerII adXClient = (AdExchangeBuyerII) client;
    String bidderResourceId = getStringInput("bidderResourceId", "Enter the Bidder's resource ID");
    String ownerName = String.format("bidders/%s", bidderResourceId);
    List<FilterSet> allFilterSets = adXClient.bidders().filterSets().list(ownerName).execute()
        .getFilterSets();

    if (allFilterSets != null && allFilterSets.size() > 0) {
      System.out.println("========================================");
      System.out.printf("Listing of Filter Sets associated with Bidder \"%s\"%n", ownerName);
      System.out.println("========================================");
      for (FilterSet filterSet : allFilterSets) {
        System.out.printf("* Filter Set name: %s%n", filterSet.getName());
        AbsoluteDateRange absDateRange = filterSet.getAbsoluteDateRange();
        if(absDateRange != null) {
          System.out.println("AbsoluteDateRange");
          System.out.printf("\tStart date: %s%n",
              convertDateToString(absDateRange.getStartDate()));
          System.out.printf("\tEnd date: %s%n",
              convertDateToString(absDateRange.getEndDate()));
        }
        RelativeDateRange relDateRange = filterSet.getRelativeDateRange();
        if(relDateRange != null) {
          Integer offset = relDateRange.getOffsetDays();
          System.out.println("RelativeDateRange");
          System.out.printf("\tOffset days: %s%n", offset != null ? offset : 0);
          System.out.printf("\tDuration days: %s%n", relDateRange.getDurationDays());
        }
        RealtimeTimeRange rtTimeRange = filterSet.getRealtimeTimeRange();
        if(rtTimeRange != null) {
          System.out.println("RealtimeTimeRange");
          System.out.printf("\tStart timestamp: %s%n", rtTimeRange.getStartTimestamp());
        }
        String timeSeriesGranularity = filterSet.getTimeSeriesGranularity();
        if(timeSeriesGranularity != null) {
          System.out.printf("Time series granularity: %s%n", timeSeriesGranularity);
        }
        String format = filterSet.getFormat();
        if(format != null) {
          System.out.printf("\tFormat: %s%n", format);
        }
        String environment = filterSet.getEnvironment();
        if(environment != null) {
          System.out.printf("Environment: %s%n", environment);
        }
        List<String> platforms = filterSet.getPlatforms();
        if(platforms != null) {
          System.out.println("Platforms:");
          for(String platform : platforms) {
            System.out.printf("\t%s%n", platform);
          }
        }
        List<Integer> sellerNetworkIds = filterSet.getSellerNetworkIds();
        if(filterSet.getSellerNetworkIds() != null) {
          System.out.println("Seller network IDS:");
          for(Integer sellerNetworkId : sellerNetworkIds) {
            System.out.printf("\t%d%n", sellerNetworkId);
          }
        }
      }
    } else {
      System.out.printf("No Filter Sets were found associated with Bidder \"%s\"%n", ownerName);
    }
  }

  private String convertDateToString(Date date) {
    return String.format("%d%02d%02d", date.getYear(), date.getMonth(), date.getDay());
  }
}
```

### Python

```python
#!/usr/bin/python
#
# Copyright 2017 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""This example lists bidder-level filter sets."""


import argparse
import os
import pprint
import sys

sys.path.insert(0, os.path.abspath('..'))

from googleapiclient.errors import HttpError
import samples_util


_OWNER_NAME_TEMPLATE = 'bidders/{bidders_resource_id}'

DEFAULT_BIDDER_RESOURCE_ID = 'ENTER_BIDDER_RESOURCE_ID_HERE'


def main(ad_exchange_buyer, owner_name):
  try:
    # Construct and execute the request.
    filter_sets = ad_exchange_buyer.bidders().filterSets().list(
        ownerName=owner_name).execute()
    print(f'Listing FilterSets for bidder: "{owner_name}".')
    pprint.pprint(filter_sets)
  except HttpError as e:
    print(e)


if __name__ == '__main__':
  parser = argparse.ArgumentParser(
      description='Creates a bidder-level filter set with the specified options'
  )
  # Required fields.
  parser.add_argument(
      '-b', '--bidder_resource_id', default=DEFAULT_BIDDER_RESOURCE_ID,
      help=('The resource ID of the bidders resource for which the filter '
            'sets were created. This will be used to construct the ownerName '
            'used as a path parameter for filter set requests. For additional '
            'information on how to configure the ownerName path parameter, '
            'see: https://developers.google.com/authorized-buyers/apis/'
            'reference/rest/v2beta1/bidders.filterSets/list'
            '#body.PATH_PARAMETERS.owner_name'))

  args = parser.parse_args()

  try:
    service = samples_util.GetService('v2beta1')
  except IOError as ex:
    print(f'Unable to create adexchangebuyer service - {ex}')
    print('Did you specify the key file in samples_util.py?')
    sys.exit(1)

  main(service, _OWNER_NAME_TEMPLATE.format(
           bidders_resource_id=args.bidder_resource_id))
```

### PHP

```php
<?php
/**
 * Copyright 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

require_once __DIR__ . '/../../BaseExample.php';

/**
 * This example illustrates how to retrieve all Bidder-level Filter Sets.
 */
class ListBidderLevelFilterSets extends BaseExample {

  /**
   * @see BaseExample::getInputParameters()
   */
  protected function getInputParameters() {
    return [
        [
            'name' => 'bidderResourceId',
            'display' => 'Bidder Resource ID',
            'required' => true
        ]
    ];
  }

  /**
   * @see BaseExample::run()
   */
  public function run() {
    $values = $this->formValues;
    $ownerName = sprintf(
        'bidders/%s',
        $values['bidderResourceId']
    );
    $result = $this->service->bidders_filterSets
        ->listBiddersFilterSets($ownerName);
    print sprintf(
        '<h2>Listing Bidder-level Filter Sets for ownerName "%s"</h2>',
         $ownerName
    );
    if (empty($result['filterSets'])) {
      print '<p>No Bidder-level Filter Sets found.</p>';
    } else {
      foreach ($result['filterSets'] as $filterSets) {
        $this->printResult($filterSets);
      }
    }
  }

  /**
   * @see BaseExample::getClientType()
   */
  public function getClientType() {
    return ClientType::AdExchangeBuyerII;
  }

  /**
   * @see BaseExample::getName()
   */
  public function getName() {
    return 'RTB Troubleshooting: List Bidder-level Filter Sets';
  }
}
```

### .NET

```
/* Copyright 2017, Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

using Google.Apis.AdExchangeBuyerII.v2beta1;
using Google.Apis.AdExchangeBuyerII.v2beta1.Data;
using Google.Apis.Services;

using System;
using System.Collections.Generic;

namespace Google.Apis.AdExchangeBuyer.Examples.v2_x
{
    /// <summary>
    /// Retrieves the bidder-level filter sets for the given bidder resource ID.
    /// </summary>
    public class ListBidderLevelFilterSets : ExampleBase
    {
        /// <summary>
        /// Main method, to run this code example as a standalone application.
        /// </summary>
        /// <param name="args">The command line arguments</param>
        public static void Main(string[] args)
        {
            AdExchangeBuyerIIService service = Utilities.GetV2Service();
            ExampleBase example = new ListBidderLevelFilterSets();
            Console.WriteLine(example.Description);

            example.Run(service);
        }

        /// <summary>
        /// Returns a description about the code example.
        /// </summary>
        public override string Description
        {
            get { return "This code example lists all bidder-level filter sets for the given " +
                    "bidder resource ID."; }
        }

        /// <summary>
        /// Runs the code example.
        /// </summary>
        /// <param name="service">An authenticated AdExchangeBuyerIIService</param>
        public override void Run(BaseClientService service)
        {
            AdExchangeBuyerIIService adXService = (AdExchangeBuyerIIService)service;
            string bidderResourceId = "INSERT_BIDDER_RESOURCE_ID_HERE";
            string ownerName = String.Format("bidders/{0}", bidderResourceId);

            ListFilterSetsResponse response = adXService.Bidders.FilterSets.List(ownerName)
                .Execute();

            Console.WriteLine("========================================\n");
            Console.WriteLine("Listing of filter sets associated with owner name \"{0}\"",
                ownerName);
            Console.WriteLine("========================================\n");

            if (response.FilterSets.Count == 0)
            {
                Console.WriteLine("No filter sets found.");
            } else
            {
                foreach (FilterSet filterSet in response.FilterSets)
                {
                    Console.WriteLine("* Name: {0}", filterSet.Name);
                    AbsoluteDateRange absDateRange = filterSet.AbsoluteDateRange;
                    if (absDateRange != null)
                    {
                        Console.WriteLine("\tAbsoluteDateRange:");
                        Date startDate = absDateRange.StartDate;
                        Console.WriteLine("\t\tStartDate:");
                        Console.WriteLine("\t\t\tYear: {0}", startDate.Year);
                        Console.WriteLine("\t\t\tMonth: {0}", startDate.Month);
                        Console.WriteLine("\t\t\tDay: {0}", startDate.Day);
                        Date endDate = absDateRange.EndDate;
                        Console.WriteLine("\t\tEndDate:");
                        Console.WriteLine("\t\t\tYear: {0}", endDate.Year);
                        Console.WriteLine("\t\t\tMonth: {0}", endDate.Month);
                        Console.WriteLine("\t\t\tDay: {0}", endDate.Day);
                    }
                    RelativeDateRange relDateRange = filterSet.RelativeDateRange;
                    if (relDateRange != null)
                    {
                        Console.WriteLine("\tRelativeDateRange:");
                        Console.WriteLine("\t\tOffsetDays: {0}", relDateRange.OffsetDays);
                        Console.WriteLine("\t\tDurationDays: {0}", relDateRange.DurationDays);
                    }
                    RealtimeTimeRange rtTimeRange = filterSet.RealtimeTimeRange;
                    if (rtTimeRange != null)
                    {
                        Console.WriteLine("\tRealtimeTimeRange:");
                        Console.WriteLine("\t\tStartTimestamp: {0}", rtTimeRange.StartTimestamp);
                    }
                    String timeSeriesGranularity = filterSet.TimeSeriesGranularity;
                    if (timeSeriesGranularity != null)
                    {
                        Console.WriteLine("\tTimeSeriesGranularity: {0}", timeSeriesGranularity);
                    }
                    IList<String> formats = filterSet.Formats;
                    if (formats != null)
                    {
                        Console.WriteLine("\tFormats:");
                        foreach (string format in formats)
                        {
                            Console.WriteLine("\t\t{0}", format);
                        }
                    }
                    String environment = filterSet.Environment;
                    if (environment != null)
                    {
                        Console.WriteLine("\tEnvironment: {0}", environment);
                    }
                    IList<string> platforms = filterSet.Platforms;
                    if (platforms != null)
                    {
                        Console.WriteLine("\tPlatforms:");
                        foreach (string platform in platforms)
                        {
                            Console.WriteLine("\t\t{0}", platform);
                        }
                    }
                    IList<int?> sellerNetworkIds = filterSet.SellerNetworkIds;
                    if (sellerNetworkIds != null)
                    {
                        Console.WriteLine("\tSellerNetworkIds:");
                        foreach (int? sellerNetworkId in sellerNetworkIds)
                        {
                            Console.WriteLine("\t\t{0}", sellerNetworkId);
                        }
                    }
                }
            }
        }

        public override ClientType getClientType()
        {
            return ClientType.ADEXCHANGEBUYERII;
        }
    }
}
```

### Ruby

```ruby
#!/usr/bin/env ruby
# Encoding: utf-8
#
# Copyright:: Copyright 2017, Google Inc. All Rights Reserved.
#
# License:: Licensed under the Apache License, Version 2.0 (the "License");
#           you may not use this file except in compliance with the License.
#           You may obtain a copy of the License at
#
#           http://www.apache.org/licenses/LICENSE-2.0
#
#           Unless required by applicable law or agreed to in writing, software
#           distributed under the License is distributed on an "AS IS" BASIS,
#           WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
#           implied.
#           See the License for the specific language governing permissions and
#           limitations under the License.
#
# Lists the filter sets for a given bidder.
#
# Tags: Bidders.FilterSets.list

require 'optparse'

require_relative '../samples_util'


def list_bidder_level_filter_sets(ad_exchange_buyer, owner_name, page_size)
  begin
    response = ad_exchange_buyer.list_bidder_filter_sets(
        owner_name, page_size: page_size
    )

    unless response.filter_sets.nil?
      puts 'Found the following filter sets for bidder %s:' % owner_name
      response.filter_sets.each do |filter_set|
        puts '* Filter set name: %s' % filter_set.name
        if !filter_set.absolute_date_range.nil?
          abs_date_range = filter_set.absolute_date_range
          start_date = abs_date_range.start_date
          end_date = abs_date_range.end_date
          puts "\tAbsolute date range:"
          puts "\t\tStart date: %s-%s-%s" % [start_date.year, start_date.month,
              start_date.day]
          puts "\t\tEnd date: %s-%s-%s" % [end_date.year, end_date.month,
              end_date.day]
        end
        unless filter_set.realtime_time_range.nil?
          realtime_time_range = filter_set.realtime_time_range
          puts "\tRealtime time range:"
          puts "\t\tStart timestamp: %s" % realtime_time_range.start_timestamp
        end
        unless filter_set.relative_date_range.nil?
          relative_date_range = filter_set.relative_date_range
          puts "\tRelative date range:"
          puts "\t\tOffset days: %s" % relative_date_range.offset_days
          puts "\t\tDuration days: %s" % relative_date_range.duration_days
        end
        unless filter_set.time_series_granularity.nil?
          puts "\tTime series granularity: %s" %
              filter_set.time_series_granularity
        end
        unless filter_set.format.nil?
          puts "\tFormat: %s" % filter_set.format
        end
        unless filter_set.environment.nil?
          puts "\tEnvironment: %s" % filter_set.environment
        end
        unless filter_set.platforms.nil?
          puts "\tPlatforms: %s" % filter_set.platforms.inspect
        end
        unless filter_set.seller_network_ids.nil?
          puts "\tSeller network IDs: %s" %
              filter_set.seller_network_ids.inspect
        end
      end
    else
      puts 'No filter sets found for bidder %s.' % owner_name
    end
  rescue Google::Apis::ServerError => e
    raise "The following server error occured:\n%s" % e.message
  rescue Google::Apis::ClientError => e
    raise "Invalid client request:\n%s" % e.message
  rescue Google::Apis::AuthorizationError => e
    raise "Authorization error occured:\n%s" % e.message
  end
end


if __FILE__ == $0
  begin
    # Retrieve the service used to make API requests.
    service = get_service(ADEXCHANGEBUYER_V2BETA1)
  rescue ArgumentError => e
    raise 'Unable to create service, with error message: %s' % e.message
  rescue Signet::AuthorizationError => e
    raise ('Unable to create service, was the KEY_FILE in samples_util.rb ' +
           'set? Error message: %s') % e.message
  end

  # Set options and default values for fields used in this example.
  options = [
    Option.new(
      'bidder_resource_id',
      ('The resource ID of the bidders resource for which the filter ' +
       'sets were created. This will be used to construct the ownerName ' +
       'used as a path parameter for filter set requests. For additional ' +
       'information on how to configure the ownerName path parameter, ' +
       'see: https://developers.google.com/authorized-buyers/apis/reference/' +
       'rest/v2beta1/bidders.filterSets/list#body.PATH_PARAMETERS.owner_name'),
      :short_alias => 'b', :required => true,
      :default_value => nil  # Insert default value here.
    ),
    Option.new(
      'max_page_size',
      'The maximum number of entries returned on one result page.',
      :type => Integer, :short_alias => 'm', :required => true,
      :default_value => MAX_PAGE_SIZE
    )
  ]

  # Parse options.
  parser = Parser.new(options)
  opts = parser.parse(ARGV)

  owner_name = 'bidders/%s' % opts['bidder_resource_id']

  list_bidder_level_filter_sets(service, owner_name, opts['max_page_size'])
end
```

## Next steps

- Read the [background guide](https://developers.google.com/authorized-buyers/apis/guides/background) to
  learn more about the samples, and the available options for developing your
  solution.

- After [setting up a client library](https://developers.google.com/authorized-buyers/apis/downloads), try
  extending the code samples to meet your needs.

- See the [reference documentation](https://developers.google.com/authorized-buyers/apis/relnotes) for the
  version you're working with to learn more about the API.

- If you need help, visit the [forum](https://developers.google.com/authorized-buyers/apis/community).

- If your application is expected to perform real-time bidding, read the [RTB
  protocol](https://developers.google.com/authorized-buyers/rtb/start) documentation.

- Go over the [performance tips](https://developers.google.com/authorized-buyers/apis/guides/performance).

## Take a survey

Help us improve this documentation: tell us what worked and what we missed by
filling out a [quick
survey](https://docs.google.com/a/google.com/forms/d/1SS_QO25VPX5898DYAJ4vfJFconxWp1pRosdJdGlx0mU/viewform?entry.1418023964=AdX+Buyer+REST+API&entry.1636959389).