You can use the Inventories sub-API to keep in-store information for your
local products up to date. This includes updating `price` and `availability`,
and removing stores a product is no longer sold in.

If you're a third-party provider, you can use the Inventories sub-API to
create an interface for your businesses to update the in-store availability of
their products.

## Update price and availability by store

Use
[`localInventories.insert`](https://developers.google.com/merchant/api/reference/rest/inventories_v1/accounts.products.localInventories/insert)
to update the in-store information for a product.

This call replaces the full
[`LocalInventory`](https://developers.google.com/merchant/api/reference/rest/inventories_v1/accounts.products.localInventories)
resource, so make sure you include all fields. See [Add in-store information to
local products](https://developers.google.com/merchant/api/guides/inventories/add-local-inventory) for a code
sample and more details.

## View your existing stores

This section explains how to view the stores associated with a product or
account.

### By product

Use
[`localInventories.list`](https://developers.google.com/merchant/api/reference/rest/inventories_v1/accounts.products.localInventories/list)
to list all the local inventories connected to a specific `product` in your
account. This call returns full `LocalInventory` resources. Use the `store_code`
attribute to identify each store.

Here's a sample you can use to list local inventories for a product:

### Java

    import com.google.api.gax.core.FixedCredentialsProvider;
    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.shopping.merchant.inventories.v1.ListLocalInventoriesRequest;
    import com.google.shopping.merchant.inventories.v1.LocalInventory;
    import com.google.shopping.merchant.inventories.v1.LocalInventoryServiceClient;
    import com.google.shopping.merchant.inventories.v1.LocalInventoryServiceClient.ListLocalInventoriesPagedResponse;
    import com.google.shopping.merchant.inventories.v1.LocalInventoryServiceSettings;
    import shopping.merchant.samples.utils.Authenticator;
    import shopping.merchant.samples.utils.Config;

    /** This class demonstrates how to list all the Local inventories on a given product */
    public class ListLocalInventoriesSample {

      private static String getParent(String accountId, String productId) {
        return String.format("accounts/%s/products/%s", accountId, productId);
      }

      public static void listLocalInventories(Config config, String productId) throws Exception {
        GoogleCredentials credential = new Authenticator().authenticate();

        LocalInventoryServiceSettings localInventoryServiceSettings =
            LocalInventoryServiceSettings.newBuilder()
                .setCredentialsProvider(FixedCredentialsProvider.create(credential))
                .build();

        String parent = getParent(config.getAccountId().toString(), productId);

        try (LocalInventoryServiceClient localInventoryServiceClient =
            LocalInventoryServiceClient.create(localInventoryServiceSettings)) {

          //  The parent product has the format: accounts/{account}/products/{product}
          ListLocalInventoriesRequest request =
              ListLocalInventoriesRequest.newBuilder().setParent(parent).build();

          System.out.println("Sending list Local inventory request:");
          ListLocalInventoriesPagedResponse response =
              localInventoryServiceClient.listLocalInventories(request);

          int count = 0;

          // Iterates over all rows in all pages and prints the Local inventory
          // in each row.
          for (LocalInventory element : response.iterateAll()) {
            System.out.println(element);
            count++;
          }
          System.out.print("The following count of elements were returned: ");
          System.out.println(count);
        } catch (Exception e) {
          System.out.println(e);
        }
      }

      public static void main(String[] args) throws Exception {
        Config config = Config.load();
        // An ID assigned to a product by Google. In the format
        // contentLanguage~feedLabel~offerId
        String productId = "en~label~1111111111";
        listLocalInventories(config, productId);
      }
    }

### cURL

      curl --location
      'https://merchantapi.googleapis.com/inventories/v1/accounts/987654321/products/{en~US~12345}/localInventories' \
      --header 'Authorization: Bearer {API_TOKEN}' \

### PHP

    use Google\ApiCore\ApiException;
    use Google\ApiCore\PagedListResponse;
    use Google\Shopping\Merchant\Inventories\V1\LocalInventory;
    use Google\Shopping\Merchant\Inventories\V1\Client\LocalInventoryServiceClient;
    use Google\Shopping\Merchant\Inventories\V1\ListLocalInventoriesRequest;

    /**
     * Class to list the `LocalInventory` resources for the given product in your
     * merchant account. The response might contain fewer items than specified by
     * `pageSize`. If `pageToken` was returned in previous request, it can be
     * used to obtain additional results.
     *
     * `LocalInventory` resources are listed per product for a given account.
     */

    class ListLocalInventories
    {

        // ENSURE you fill in the merchant account and product ID for the sample to
        // work.
        private const PARENT = 'accounts/[INSERT_ACCOUNT_HERE]/products/[INSERT_PRODUCT_HERE]';

        /**
         * Lists all the local inventories of a given product.
         *
         * @param string $parent The `name` of the parent product to list `LocalInventory`
         *     resources for.
         *     Format: `accounts/{account}/products/{product}`
         */
        function listLocalInventoriesSample(string $parent): void
        {
            // Gets the OAuth credentials to make the request.
            $credentials = Authentication::useServiceAccountOrTokenFile();

            // Creates options config containing credentials for the client to use.
            $options = ['credentials' => $credentials];

            // Creates a client.
            $localInventoryServiceClient = new LocalInventoryServiceClient($options);

            // Prepare the request message.
            $request = (new ListLocalInventoriesRequest())
                ->setParent($parent);

            // Calls the API and catches and prints any network failures/errors.
            try {
                // Page size is set to the default value. If you are returned more
                // responses than your page size, this code will automatically
                // re-call the service with the `pageToken` until all responses
                // are returned.
                $parameters = ['pageSize' => 25000];

                /** @var PagedListResponse $response */
                $response =
                    $localInventoryServiceClient->listLocalInventories($request, $parameters);

                /** @var LocalInventory $element */
                foreach ($response as $element) {
                    printf('LocalInventory data: %s%s', $element->serializeToJsonString(), PHP_EOL);
                }
            } catch (ApiException $ex) {
                printf('Call failed with message: %s%s', $ex->getMessage(), PHP_EOL);
            }
        }

        // Helper to execute the sample.
        function callSample(): void
        {
            // Lists all the local inventories of the parent product.
            $this->listLocalInventoriesSample($this::PARENT);
        }
    }


    $sample = new ListLocalInventories();
    $sample->callSample();

### Python

    from examples.authentication import configuration
    from examples.authentication import generate_user_credentials
    from google.shopping import merchant_inventories_v1

    # ENSURE you fill in the product ID for the sample to
    # work.
    _ACCOUNT = configuration.Configuration().read_merchant_info()
    _PRODUCT = "[INSERT_PRODUCT_HERE]"
    _PARENT = f"accounts/{_ACCOUNT}/products/{_PRODUCT}"


    def list_local_inventories():
      """Lists the `LocalInventory` resources for the given product.

      The response might contain fewer items than specified by
      `pageSize`. If `pageToken` was returned in previous request, it can be
      used to obtain additional results.

      `LocalInventory` resources are listed per product for a given account.
      """

      # Gets OAuth Credentials.
      credentials = generate_user_credentials.main()

      # Creates a client.
      client = merchant_inventories_v1.LocalInventoryServiceClient(
          credentials=credentials)

      # Creates the request.
      # Page size is set to the default value.
      request = merchant_inventories_v1.ListLocalInventoriesRequest(
          parent=_PARENT,
          page_size=25000
      )

      try:
        # Makes the request and catch and print any error messages.
        # If you are returned more responses than your page size, this code
        # will automatically re-call the service with the `pageToken` until all
        # responses are returned.
        page_result = client.list_local_inventories(request=request)

        # Print the response.
        for response in page_result:
          print(response)

      except RuntimeError as e:
        print("List failed")
        print(e)


    if __name__ == "__main__":
      list_local_inventories()

### By account

You can view all the stores associated with your account in your
[Business Profile](https://www.google.com/business/), or with the
[Google My Business API](https://developers.google.com/my-business/reference/rest). You can't use
Merchant API to view or manage stores at the account level, since this
information comes from your Business Profile.

## Remove stores

Here's how to remove stores you no longer sell products in:

### From products

If a product is no longer sold at a specific store, you should remove the local
inventory entry for that store from the product. You can use
[`localInventories.delete`](https://developers.google.com/merchant/api/reference/rest/inventories_v1/accounts.products.localInventories/delete)
to remove a specific local inventory entry from a product.

Here's a sample you can use to remove a local inventory entry from a product:

### Java

    import com.google.api.gax.core.FixedCredentialsProvider;
    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.shopping.merchant.inventories.v1.DeleteLocalInventoryRequest;
    import com.google.shopping.merchant.inventories.v1.LocalInventoryName;
    import com.google.shopping.merchant.inventories.v1.LocalInventoryServiceClient;
    import com.google.shopping.merchant.inventories.v1.LocalInventoryServiceSettings;
    import shopping.merchant.samples.utils.Authenticator;
    import shopping.merchant.samples.utils.Config;

    /** This class demonstrates how to delete a Local inventory for a given product */
    public class DeleteLocalInventorySample {

      public static void deleteLocalInventory(Config config, String productId, String storeCode)
          throws Exception {
        GoogleCredentials credential = new Authenticator().authenticate();

        LocalInventoryServiceSettings localInventoryServiceSettings =
            LocalInventoryServiceSettings.newBuilder()
                .setCredentialsProvider(FixedCredentialsProvider.create(credential))
                .build();

        String name =
            LocalInventoryName.newBuilder()
                .setAccount(config.getAccountId().toString())
                .setProduct(productId)
                .setStoreCode(storeCode)
                .build()
                .toString();

        try (LocalInventoryServiceClient localInventoryServiceClient =
            LocalInventoryServiceClient.create(localInventoryServiceSettings)) {
          DeleteLocalInventoryRequest request =
              DeleteLocalInventoryRequest.newBuilder().setName(name).build();

          System.out.println("Sending deleteLocalInventory request");
          localInventoryServiceClient.deleteLocalInventory(request); // no response returned on success
          System.out.println(
              "Delete successful, note that it may take up to 30 minutes for the delete to update in"
                  + " the system.");
        }
      }

      public static void main(String[] args) throws Exception {
        Config config = Config.load();
        // An ID assigned to a product by Google. In the format
        // contentLanguage~feedLabel~offerId
        String productId = "en~label~1111111111";
        // The ID uniquely identifying each region.
        String storeCode = "EXAMPLE";

        deleteLocalInventory(config, productId, storeCode);
      }
    }

### cURL

      curl --location --request DELETE
      'https://merchantapi.googleapis.com/inventories/v1/accounts/987654321/products/{en~US~12345}/localInventories/123456' \
      --header 'Authorization: Bearer {API_TOKEN}' \

### PHP

    use Google\ApiCore\ApiException;
    use Google\Shopping\Merchant\Inventories\V1\Client\LocalInventoryServiceClient;
    use Google\Shopping\Merchant\Inventories\V1\DeleteLocalInventoryRequest;

    /**
     * Deletes the specified `LocalInventory` resource from the given product
     * in your merchant account.  It might take up to an hour for the
     * `LocalInventory` to be deleted from the specific product.
     * Once you have received a successful delete response, wait for that
     * period before attempting a delete again.
     */

    class DeleteLocalInventory
    {

        // ENSURE you fill in the merchant account, product, and region ID for the
        // sample to work.
        private const ACCOUNT = 'INSERT_ACCOUNT_ID_HERE';
        private const PRODUCT = 'INSERT_PRODUCT_ID_HERE';
        private const STORE_CODE = 'INSERT_STORE_CODE_HERE';

        /**
         * Deletes a specific local inventory of a given product.
         *
         * @param string $formattedName The name of the `LocalInventory` resource
         * to delete.
         *     Format: `accounts/{account}/products/{product}/localInventories/{store_code}`
         *     Please see {@see LocalInventoryServiceClient::localInventoryName()}
         *     for help formatting this field.
         */
        function deleteLocalInventorySample(string $formattedName): void
        {
             // Gets the OAuth credentials to make the request.
             $credentials = Authentication::useServiceAccountOrTokenFile();

             // Creates options config containing credentials for the client to use.
             $options = ['credentials' => $credentials];

             // Creates a client.
             $localInventoryServiceClient = new LocalInventoryServiceClient($options);

            // Prepare the request message.
            $request = (new DeleteLocalInventoryRequest())
                ->setName($formattedName);

             // Calls the API and catches and prints any network failures/errors.
             try {
                 $localInventoryServiceClient->deleteLocalInventory($request);
                 print 'Delete call completed successfully.' . PHP_EOL;
             } catch (ApiException $ex) {
                 printf('Call failed with message: %s%s', $ex->getMessage(), PHP_EOL);
             }
        }

        /**
         * Helper to execute the sample.
         */
        function callSample(): void
        {
            // These variables are defined at the top of the file.
            $formattedName = LocalInventoryServiceClient::localInventoryName(
                $this::ACCOUNT,
                $this::PRODUCT,
                $this::STORE_CODE
            );

            // Deletes the specific local inventory of the parent product.
            $this->deleteLocalInventorySample($formattedName);
        }
    }


    $sample = new DeleteLocalInventory();
    $sample->callSample();

### Python

    from examples.authentication import configuration
    from examples.authentication import generate_user_credentials
    from google.shopping import merchant_inventories_v1

    # ENSURE you fill in the product ID and store code
    # for the sample to work.
    _ACCOUNT = configuration.Configuration().read_merchant_info()
    _PRODUCT = "[INSERT_PRODUCT_HERE]"
    _STORE_CODE = "[INSERT_STORE_CODE_HERE]"
    _NAME = (f"accounts/{_ACCOUNT}/products/{_PRODUCT}/localInventories/"
             f"{_STORE_CODE}")


    def delete_local_inventory():
      """Deletes the specified `LocalInventory` resource from the given product.

      It might take up to an hour for the `LocalInventory` to be deleted
      from the specific product. Once you have received a successful delete
      response, wait for that period before attempting a delete again.
      """

      # Gets OAuth Credentials.
      credentials = generate_user_credentials.main()

      # Creates a client.
      client = merchant_inventories_v1.LocalInventoryServiceClient(
          credentials=credentials)

      # Creates the request.
      request = merchant_inventories_v1.DeleteLocalInventoryRequest(name=_NAME)

      # Makes the request and catch and print any error messages.
      try:
        client.delete_local_inventory(request=request)
        print("Delete successful")
      except RuntimeError as e:
        print("Delete failed")
        print(e)


    if __name__ == "__main__":
      delete_local_inventory()

This call removes information for only the specified store, from only the
specified product.

### From accounts

You can remove stores where you no longer sell your products from your account
by removing them from your [Business Profile](https://www.google.com/business/).
See [Close or remove a business](https://support.google.com/business/answer/4669092)
for more information.