Use [UpdateCssProductInput](https://developers.google.com/comparison-shopping-services/api/reference/rpc/google.shopping.css.v1#google.shopping.css.v1.CssProductInputsService.UpdateCssProductInput)
method update an existing single CSS product by specifying product
`cssProductInput.name` and a JSON body containing the data you would like to
update for the product.

**Note** : This method only updates the attributes provided in the update
request. The response contains the same attributes as the request and does
not reflect the full `CssProductInput` state after the update is applied.
You shouldn't rely on the response to determine the final state of the
`CssProductInput`.

    PATCH https://css.googleapis.com/v1/accounts/{ACCOUNT_ID}/cssProductInputs/{CSS_PRODUCT_ID}

To add or modify an attribute in a product, specify the field with the new
value in the JSON body. The example shown will update the [title](https://developers.google.com/comparison-shopping-services/api/reference/rpc/google.shopping.css.v1#google.shopping.css.v1.Attributes.FIELDS.string.google.shopping.css.v1.Attributes.title)
and [headline offer link](https://developers.google.com/comparison-shopping-services/api/reference/rpc/google.shopping.css.v1#google.shopping.css.v1.Attributes.FIELDS.string.google.shopping.css.v1.Attributes.headline_offer_link)
of an existing product name `123/cssProductInputs/de~DE~B019G4` with the
attribute value provided in the request body, leaving all other fields
untouched.

### HTTP

    PATCH https://css.googleapis.com/v1/accounts/{ACCOUNT_ID}/cssProductInputs/{CSS_PRODUCT_ID}
    {
      "attributes": {
        "title": "new item title",
        "headlineOfferLink": "headline-offer.com"
      }
    }

### cURL

    curl --location --request PATCH 'https://css.googleapis.com/v1/accounts/{ACCOUNT_ID}/cssProductInputs/{CSS_PRODUCT_ID}' \
    --header 'Content-Type: application/json' \
    --header 'Authorization: Bearer <API_TOKEN>' \
    --data '{"attributes":{"numberOfOffers":"99","headlineOfferPrice":{"currency_code":"EUR","amount_micros":"1200000"}}}'

### Java

    // Copyright 2023 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 shopping.css.samples.v1.cssproducts;

    import com.google.api.gax.core.FixedCredentialsProvider;
    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.protobuf.FieldMask;
    import com.google.shopping.css.v1.CssProductInput;
    import com.google.shopping.css.v1.CssProductInputsServiceClient;
    import com.google.shopping.css.v1.CssProductInputsServiceSettings;
    import com.google.shopping.css.v1.UpdateCssProductInputRequest;
    import shopping.css.samples.utils.Authenticator;
    import shopping.css.samples.utils.Config;

    /** This class demonstrates how to update a CSS Product for a given Account */
    public class UpdateCssProductInput {

      private static String getName(String domainId, String productId) {
        return String.format("accounts/%s/cssProductInputs/%s", domainId, productId);
      }

      public static void updateCssProductInput(Config config, String productId) throws Exception {
        GoogleCredentials credential = new Authenticator().authenticate();
        String name = getName(config.getDomainId().toString(), productId);

        CssProductInputsServiceSettings cssProductInputsServiceSettings =
            CssProductInputsServiceSettings.newBuilder()
                .setCredentialsProvider(FixedCredentialsProvider.create(credential))
                .build();

        try (CssProductInputsServiceClient cssProductInputsServiceClient =
            CssProductInputsServiceClient.create(cssProductInputsServiceSettings)) {

          // Updates the title of the CSS Product leaving the rest of the fields unchanged
          UpdateCssProductInputRequest request =
              UpdateCssProductInputRequest.newBuilder()
                  .setCssProductInput(
                      CssProductInput.newBuilder()
                          .setName(name)
                          .setAttributes(
                              com.google.shopping.css.v1.Attributes.newBuilder()
                                  .setTitle("Attribute Title")
                                  .setHeadlineOfferLink("abc.com")
                                  .setHeadlineOfferCondition("New")
                                  .setDescription("CSS Product description 0")
                                  .build())
                          .build())
                  .setUpdateMask(FieldMask.newBuilder().addPaths("title").build())
                  .build();

          System.out.println("Updating CSS Product");
          CssProductInput response = cssProductInputsServiceClient.updateCssProductInput(request);
          System.out.print("CSS product updated:");

        } catch (Exception e) {
          System.out.println(e);
        }
      }

      public static void main(String[] args) throws Exception {
        final Config config = Config.load();

        // The ID uniquely identifying each product. In
        // the format languageCode~countryCode~rawProvidedId
        final String productId = "de~DE~rawProvidedId17";
        updateCssProductInput(config, productId);
      }
    }

**Only top-level fields can be updated with `cssProductInputs.update` request.**
If you want to update nested fields you must provide the entire top-level
object.

The example shown will update the top-level `headlineOfferPrice` object,
including the nested fields of an existing product, with the product data
provided in the request body, leaving all other fields untouched.

    PATCH https://css.googleapis.com/v1/accounts/{ACCOUNT_ID}/cssProductInputs/{CSS_PRODUCT_ID}
    {
      "attributes": {
        "headlineOfferPrice": {
          "amountMicros": "17.99",
          "currencyCode": "USD"
        }
      }
    }

To select certain fields to update without making changes to the others included
in the body of the request, you can specify an `updateMask`. This query string
parameter should be a comma-separated list of fields you need to modify.
An `updateMask` is useful when you want to assert that only the named fields
will be updated.
Not specifying an `updateMask` is equivalent to marking all fields in the
request to be updated, as shown in the example. However, if an `updateMask` is
not provided explicitly, it is not possible to delete existing attributes.

The example shown will update **only** the `title`
of the existing item with the respective product data provided in
the request body, leaving all other fields including the `headline offer link`
untouched.

    PATCH https://css.googleapis.com/v1/accounts/{ACCOUNT_ID}/cssProductInputs/{CSS_PRODUCT_ID}?updateMask=title
    {
      "attributes": {
        "title":"item-title",
        "headlineOfferLink":"headline-offer-newer.com"
      }
    }

If a field is provided in the updateMask list but not in the body of the
request, that field will be deleted from the Product resource, if it exists.

The example shown will use updateMask to remove the value for the field `title`.

    PATCH https://css.googleapis.com/v1/accounts/{ACCOUNT_ID}/cssProductInputs/{CSS_PRODUCT_ID}?updateMask=title

**ACCOUNT_ID** :
Unique identifier for the account, for example, `123`.

**CSS_PRODUCT_ID** :
CSS product ID, for example, `de~DE~B019G4`.

To delete the `title` field, leave it out of the request body. You can also
send the request with no body or an empty body. Fields not in the updateMask
will stay unchanged.

> [!WARNING]
> **Warning:** When using `updateMask`, be careful to provide the correct value for all fields listed in the `updateMask`. If the value is not included in the body of the request, it will be the equivalent of deleting the field.