> [!IMPORTANT]
> **Key Point:** "Bid modifier" and "bid adjustment" have the same meaning and are used interchangeably in the Google Ads UI and Google Ads API.

Campaign and ad group-level
[bid adjustments](https://support.google.com/google-ads/answer/2732132)
give you more control over your bids in
Google Ads campaigns, providing the option to increase or decrease bids for
different types of criteria.

Within the Google Ads API, bid adjustments are managed through the following services
depending on the level and criterion type:

- **[`CampaignBidModifierService`](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignBidModifierService)
  ([`CampaignBidModifier`](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignBidModifier)):** Supports campaign-level [`interaction_type`](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignBidModifier#interaction_type) ([`InteractionTypeInfo`](https://developers.google.com/google-ads/api/reference/rpc/v26/InteractionTypeInfo)) bid adjustments.
- **[`CampaignCriterionService`](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignCriterionService)
  ([`CampaignCriterion.bid_modifier`](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignCriterion#bid_modifier)):** Supports campaign-level `device`, `location`, and `ad_schedule` bid adjustments (see the [targeting guide](https://developers.google.com/google-ads/api/docs/targeting/overview) for specifics).
- **[`AdGroupBidModifierService`](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupBidModifierService)
  ([`AdGroupBidModifier`](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupBidModifier)):** Supports ad group-level `device` adjustments and travel criteria adjustments for hotel ads in Hotel campaigns and Search Campaigns for Travel (`user_set_dates`, `advance_booking_window`, `length_of_booking`, `start_day_of_week`, and `start_date_range` in v26 and later, or the corresponding `hotel_*` fields in v25 and earlier; see [Adjust bids with bid modifiers](https://developers.google.com/google-ads/api/docs/hotel-ads/bidding/create-ad-group-bid-modifier) for details).

## Add, update, and remove bid adjustments

Use the `create`, `update`, or `remove` fields of
[`CampaignBidModifierOperation`](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignBidModifierOperation)
or
[`AdGroupBidModifierOperation`](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupBidModifierOperation)
operations to add, update, or remove bid adjustments.

A `bid_modifier` value is a multiplier applied to the base bid (for example,
`1.2` increases bids by 20%, `0.8` decreases bids by 20%, and `0.0` represents
a -100% opt-out for supported criteria). Refer to the
[`CampaignBidModifier`](https://developers.google.com/google-ads/api/reference/rpc/v26/CampaignBidModifier) and
[`AdGroupBidModifier`](https://developers.google.com/google-ads/api/reference/rpc/v26/AdGroupBidModifier) API documentation for
the valid range of `bid_modifier` values.

This example demonstrates how to add a new ad group-level mobile bid
adjustment:


### Java

```java
private void runExample(
    GoogleAdsClient googleAdsClient, long customerId, long adGroupId, double bidModifier) {

  // Creates an ad group bid modifier for mobile devices with the specified ad group ID and
  // bid modifier value.
  AdGroupBidModifier adGroupBidModifier =
      AdGroupBidModifier.newBuilder()
          .setAdGroup(ResourceNames.adGroup(customerId, adGroupId))
          .setBidModifier(bidModifier)
          .setDevice(DeviceInfo.newBuilder().setType(Device.MOBILE))
          .build();

  // Creates an ad group bid modifier operation for creating an ad group bid modifier.
  AdGroupBidModifierOperation adGroupBidModifierOperation =
      AdGroupBidModifierOperation.newBuilder().setCreate(adGroupBidModifier).build();

  // Issues a mutate request to add the ad group bid modifier.
  try (AdGroupBidModifierServiceClient adGroupBidModifierServiceClient =
      googleAdsClient.getLatestVersion().createAdGroupBidModifierServiceClient()) {
    MutateAdGroupBidModifiersResponse response =
        adGroupBidModifierServiceClient.mutateAdGroupBidModifiers(
            Long.toString(customerId), ImmutableList.of(adGroupBidModifierOperation));

    System.out.printf("Added %d ad group bid modifiers:%n", response.getResultsCount());
    for (MutateAdGroupBidModifierResult mutateAdGroupBidModifierResult :
        response.getResultsList()) {
      System.out.printf("\t%s%n", mutateAdGroupBidModifierResult.getResourceName());
    }
  }
}
      
```

### C#

```c#
public void Run(GoogleAdsClient client, long customerId, long adGroupId,
    double bidModifierValue)
{
    // Get the AdGroupBidModifierService.
    AdGroupBidModifierServiceClient adGroupBidModifierService =
        client.GetService(Services.V26.AdGroupBidModifierService);

    // Creates an ad group bid modifier for mobile devices with the specified ad group
    // ID and bid modifier value.
    AdGroupBidModifier adGroupBidModifier = new AdGroupBidModifier()
    {
        AdGroup = ResourceNames.AdGroup(customerId, adGroupId),
        BidModifier = bidModifierValue,
        Device = new DeviceInfo()
        {
            Type = Device.Mobile
        }
    };

    // Creates an ad group bid modifier operation for creating an ad group bid modifier.
    AdGroupBidModifierOperation adGroupBidModifierOperation =
        new AdGroupBidModifierOperation()
        {
            Create = adGroupBidModifier
        };

    // Send the operation in a mutate request.
    try
    {
        MutateAdGroupBidModifiersResponse response =
            adGroupBidModifierService.MutateAdGroupBidModifiers(customerId.ToString(),
                new AdGroupBidModifierOperation[] { adGroupBidModifierOperation });
        Console.WriteLine("Added {0} ad group bid modifiers:", response.Results.Count);
        foreach (MutateAdGroupBidModifierResult result in response.Results)
        {
            Console.WriteLine($"\t{result.ResourceName}");
        }
    }
    catch (GoogleAdsException e)
    {
        Console.WriteLine("Failure:");
        Console.WriteLine($"Message: {e.Message}");
        Console.WriteLine($"Failure: {e.Failure}");
        Console.WriteLine($"Request ID: {e.RequestId}");
        throw;
    }
}
      
```

### PHP

```php
    public static function runExample(
        GoogleAdsClient $googleAdsClient,
        int $customerId,
        int $adGroupId,
        float $bidModifierValue
    ) {
        // Creates an ad group bid modifier for mobile devices with the specified ad group ID and
        // bid modifier value.
        $adGroupBidModifier = new AdGroupBidModifier(
            [
            'ad_group' => ResourceNames::forAdGroup($customerId, $adGroupId),
            'bid_modifier' => $bidModifierValue,
            'device' => new DeviceInfo(['type' => Device::MOBILE])
            ]
        );

        // Creates an ad group bid modifier operation for creating an ad group bid modifier.
        $adGroupBidModifierOperation = new AdGroupBidModifierOperation();
        $adGroupBidModifierOperation->setCreate($adGroupBidModifier);

        // Issues a mutate request to add the ad group bid modifier.
        $adGroupBidModifierServiceClient = $googleAdsClient->getAdGroupBidModifierServiceClient();
        $response = $adGroupBidModifierServiceClient->mutateAdGroupBidModifiers(
            MutateAdGroupBidModifiersRequest::build($customerId, [$adGroupBidModifierOperation])
        );

        printf("Added %d ad group bid modifier:%s", $response->getResults()->count(), PHP_EOL);

        foreach ($response->getResults() as $addedAdGroupBidModifier) {
            /**
 * @var AdGroupBidModifier $addedAdGroupBidModifier
*/
            print $addedAdGroupBidModifier->getResourceName() . PHP_EOL;
        }
    }
      
```

### Python

```python
def main(
    client: GoogleAdsClient,
    customer_id: str,
    ad_group_id: str,
    bid_modifier_value: float,
) -> None:
    ad_group_service: AdGroupServiceClient = client.get_service(
        "AdGroupService"
    )
    ad_group_bm_service: AdGroupBidModifierServiceClient = client.get_service(
        "AdGroupBidModifierService"
    )

    # Create ad group bid modifier for mobile devices with the specified ad
    # group ID and bid modifier value.
    ad_group_bid_modifier_operation: AdGroupBidModifierOperation = (
        client.get_type("AdGroupBidModifierOperation")
    )
    ad_group_bid_modifier: AdGroupBidModifier = (
        ad_group_bid_modifier_operation.create
    )

    # Set the ad group.
    ad_group_bid_modifier.ad_group = ad_group_service.ad_group_path(
        customer_id, ad_group_id
    )

    # Set the bid modifier.
    ad_group_bid_modifier.bid_modifier = bid_modifier_value

    # Sets the device.
    device_enum: DeviceEnum = client.enums.DeviceEnum
    ad_group_bid_modifier.device.type_ = device_enum.MOBILE

    # Add the ad group bid modifier.
    ad_group_bm_response: MutateAdGroupBidModifiersResponse = (
        ad_group_bm_service.mutate_ad_group_bid_modifiers(
            customer_id=customer_id,
            operations=[ad_group_bid_modifier_operation],
        )
    )
      
```

### Ruby

```ruby
def add_ad_group_bid_modifier(customer_id, ad_group_id, bid_modifier_value)
  # GoogleAdsClient will read a config file from
  # ENV['HOME']/google_ads_config.rb when called without parameters
  client = Google::Ads::GoogleAds::GoogleAdsClient.new

  # Creates an ad group bid modifier for mobile devices with the specified
  # ad group ID and bid modifier value.
  ad_group_bid_modifier = client.resource.ad_group_bid_modifier do |mod|
    # Sets the ad group.
    mod.ad_group = client.path.ad_group(customer_id, ad_group_id)

    # Sets the Bid Modifier.
    mod.bid_modifier = bid_modifier_value

    # Sets the Device.
    mod.device = client.resource.device_info do |device|
      device.type = :MOBILE
    end
  end

  # Create the operation.
  operation = client.operation.create_resource.ad_group_bid_modifier(ad_group_bid_modifier)

  # Add the ad group ad.
  response = client.service.ad_group_bid_modifier.mutate_ad_group_bid_modifiers(
    customer_id: customer_id,
    operations: [operation]
  )

  puts "Added #{response.results.size} ad group bid modifiers:"
  response.results.each do |added_ad_group_bid_modifier|
    puts "\t#{added_ad_group_bid_modifier.resource_name}"
  end
end
      
```

### Perl

```perl
sub add_ad_group_bid_modifier {
  my ($api_client, $customer_id, $ad_group_id, $bid_modifier_value) = @_;

  # Create an ad group bid modifier for mobile devices with the specified ad group ID and
  # bid modifier value.
  my $ad_group_bid_modifier =
    Google::Ads::GoogleAds::V26::Resources::AdGroupBidModifier->new({
      adGroup => Google::Ads::GoogleAds::V26::Utils::ResourceNames::ad_group(
        $customer_id, $ad_group_id
      ),
      bidModifier => $bid_modifier_value,
      device      => Google::Ads::GoogleAds::V26::Common::DeviceInfo->new({
          type => MOBILE
        })});

  # Create an ad group bid modifier operation.
  my $ad_group_bid_modifier_operation =
    Google::Ads::GoogleAds::V26::Services::AdGroupBidModifierService::AdGroupBidModifierOperation
    ->new({
      create => $ad_group_bid_modifier
    });

  # Add the ad group bid modifier.
  my $ad_group_bid_modifiers_response =
    $api_client->AdGroupBidModifierService()->mutate({
      customerId => $customer_id,
      operations => [$ad_group_bid_modifier_operation]});

  printf "Created ad group bid modifier '%s'.\n",
    $ad_group_bid_modifiers_response->{results}[0]{resourceName};

  return 1;
}
      
```

### curl

> [!NOTE]
> **Note:** While a direct REST code sample for this step isn't provided here, you can achieve this using a manual REST request.   
>
> Refer to the Google Ads API REST interface documentation and the method-specific reference pages. You will need to construct the JSON payload based on the proto definitions.   
>
> Key Resources:
>
> - [Using REST](https://developers.google.com/google-ads/api/rest/overview)
> - [REST Interface Structure](https://developers.google.com/google-ads/api/rest/design/overview)
> - [JSON Field Mappings](https://developers.google.com/google-ads/api/rest/design/json-mappings)
> - Consult the [REST API Reference](https://developers.google.com/google-ads/api/reference/rpc/latest/overview) for the specific service and method.

<br />

## Retrieve bid adjustments

You can retrieve existing campaign-level bid adjustments by looking for all the
[`campaign_bid_modifier`](https://developers.google.com/google-ads/api/fields/v26/campaign_bid_modifier) values. At the ad
group level, search for
[`ad_group_bid_modifier`](https://developers.google.com/google-ads/api/fields/v26/ad_group_bid_modifier).
Here is a GAQL query that retrieves all bid modifiers of the account that are
related to a given ad group:

```sql
SELECT
  campaign.id,
  ad_group.id,
  ad_group_bid_modifier.bid_modifier,
  ad_group_bid_modifier.criterion_id
FROM ad_group_bid_modifier
WHERE ad_group.id = ad_group_id
```

> [!NOTE]
> **Note:** By adjusting the `WHERE` clause in the preceding example, you can fetch bid modifiers at different levels in a single API call. For example, to retrieve all bid modifiers in a campaign, filter on `campaign.id` instead of `ad_group.id`. Or you can omit the `WHERE` clause entirely to retrieve all bid modifiers across an entire account.