To provide a seamless, unified, and integrated shopping experience, when you add
a product with Merchant API, it is available by default for all enabled
destinations, including online and local destination types. This is part of the
[multi-channel](https://support.google.com/merchants/answer/16529073)
strategy in shopping.

To specify additional information about the local availability of your products,
you use the Inventories sub-API to indicate that your products are
available in physical stores.

> [!IMPORTANT]
> **Key Term:** In the Inventories sub-API, products you sell in physical stores are called local products.

If you are migrating from Content API for Shopping, see
[Migrate inventory management](https://developers.google.com/merchant/api/guides/compatibility/inventories#local_inventory).

Here are the necessary steps to add in-store information to your local products:

## Connect your business to Merchant Center

- You need a [Business Profile](https://www.google.com/business/) and
  [merchant account](https://business.google.com/en-all/merchant-center/)
  to list local products on Google.

- [Set up your accounts](https://support.google.com/business/answer/10514137#Ccreate-a-business-profile-on-google)
  for local product listings, and [Configure your account for local
  inventory](https://support.google.com/merchants/answer/10507042).

- After setting up your accounts, [Link your Business Profile and
  Merchant Center account](https://support.google.com/merchants/answer/12160023#How_to_link_accounts).

> [!IMPORTANT]
> **Important:** Local inventory data is supplemental and does not replace your primary product data. Before you submit local inventory updates, upload your product data to a primary data source. The local inventory data needs to be attached to the existing product.

## Sign up for free local listings

After linking a Business Profile to your Merchant Center account, you
can [enroll in free local listings](https://support.google.com/merchants/answer/7457386).
Make sure you follow the
[free listings policies](https://support.google.com/merchants/answer/12073010?visit_id=638060375510428996-106400947&rd=1).

By participating in
[free local listings](https://support.google.com/merchants/answer/9825611)
, your in-store products can appear in free listings across Google properties.

## Verify you have local products

Before inserting local inventories to products you should check that you have
products targeting local (or in-store)
[destinations](https://developers.google.com/merchant/api/reference/rest/datasources_v1/accounts.dataSources#destination),
also known as marketing methods. For example,
[local inventory ads](https://support.google.com/merchants/answer/14615117#localaddons),
and
[free local listings](https://support.google.com/merchants/answer/14615117)
are local marketing methods. For more information about destinations, see
[Marketing methods](https://support.google.com/merchants/answer/15130232).

You define local destinations for products either at the data source level
through
[`Destinations`](https://developers.google.com/merchant/api/reference/rest/datasources_v1/accounts.dataSources#destination),
or at the
`product` level through `ProductAttributes` such as
[`includedDestinations`](https://developers.google.com/merchant/api/reference/rest/products_v1/ProductAttributes#FIELDS.included_destinations).

> [!IMPORTANT]
> **Important:** Specifying in-store information through Inventories sub-API applies only to products that target local destinations.

## Insert in-store information

After you have added local products in your Merchant Center account, you
must specify in-store information for them such as
[`storeCode`](https://developers.google.com/merchant/api/reference/rest/inventories_v1/accounts.products.localInventories#LocalInventory.FIELDS.store_code),
or
[`availability`](https://developers.google.com/merchant/api/reference/rest/inventories_v1/accounts.products.localInventories#LocalInventoryAttributes.FIELDS.availability),
and optional information such as
[`price`](https://developers.google.com/merchant/api/reference/rest/inventories_v1/accounts.products.localInventories#LocalInventoryAttributes.FIELDS.price).
For more information on the fields you can provide, see
[Local inventory data specification](https://support.google.com/merchants/answer/3061342).

In the following example, you add in-store information for a product by using
the
[`localInventories.insert`](https://developers.google.com/merchant/api/reference/rest/inventories_v1/accounts.products.localInventories/insert)
method:

    POST https://merchantapi.googleapis.com/inventories/v1/accounts/{ACCOUNT_ID}/products/{en~US~SKU12345}/localInventories:insert

    {
      "storeCode": "123456",
      "localInventoryAttributes": {
        "price": {
          "amountMicros": "33450000",
          "currencyCode": "USD"
        },
        "availability": "OUT_OF_STOCK"
      }
    }

The following code samples show how to add in-store information for a product:

### Java

    import com.google.api.gax.core.FixedCredentialsProvider;
    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.shopping.merchant.inventories.v1.InsertLocalInventoryRequest;
    import com.google.shopping.merchant.inventories.v1.LocalInventory;
    import com.google.shopping.merchant.inventories.v1.LocalInventoryAttributes;
    import com.google.shopping.merchant.inventories.v1.LocalInventoryAttributes.Availability;
    import com.google.shopping.merchant.inventories.v1.LocalInventoryServiceClient;
    import com.google.shopping.merchant.inventories.v1.LocalInventoryServiceSettings;
    import com.google.shopping.type.Price;
    import shopping.merchant.samples.utils.Authenticator;
    import shopping.merchant.samples.utils.Config;

    /** This class demonstrates how to insert a Local inventory for a given product */
    public class InsertLocalInventorySample {

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

      public static LocalInventory insertLocalInventory(Config config, String productId, String storeCode)
          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)) {

          Price price = Price.newBuilder().setAmountMicros(33_450_000).setCurrencyCode("USD").build();

          InsertLocalInventoryRequest request =
              InsertLocalInventoryRequest.newBuilder()
                  .setParent(parent)
                  .setLocalInventory(
                      LocalInventory.newBuilder()
                          .setStoreCode(storeCode)
                          .setLocalInventoryAttributes(
                              LocalInventoryAttributes.newBuilder()
                                  .setAvailability(Availability.OUT_OF_STOCK)
                                  .setPrice(price)
                                  .build())
                          .build())
                  .build();

          System.out.println("Sending insert LocalInventory request");
          LocalInventory response = localInventoryServiceClient.insertLocalInventory(request);
          System.out.println("Inserted LocalInventory Name below");
          System.out.println(response.getName());
          return response;
        }
      }

      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 code uniquely identifying each store.
        String storeCode = "Example1";
        insertLocalInventory(config, productId, storeCode);
      }
    }

### PHP

    use Google\ApiCore\ApiException;
    use Google\Shopping\Merchant\Inventories\V1\LocalInventory;
    use Google\Shopping\Merchant\Inventories\V1\Client\LocalInventoryServiceClient;
    use Google\Shopping\Merchant\Inventories\V1\InsertLocalInventoryRequest;
    use Google\Shopping\Merchant\Inventories\V1\LocalInventoryAttributes;
    use Google\Shopping\Merchant\Inventories\V1\LocalInventoryAttributes\Availability;
    use Google\Shopping\Type\Price;

    /**
     * Class to insert a `LocalInventory` to a given product in your
     * merchant account.
     *
     * Replaces the full `LocalInventory` resource if an entry with the same
     * [`storeCode`]
     * [google.shopping.merchant.inventories.v1.LocalInventory.storeCode]
     * already exists for the product.
     *
     * It might take up to 30 minutes for the new or updated `LocalInventory`
     * resource to appear in products.
     */

    class InsertLocalInventory
    {
        // 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]';
        // ENSURE you fill in store code for the sample to work.
        private const LOCAL_INVENTORY_STORE_CODE = 'INSERT_STORE_CODE_HERE';

        /**
         * Inserts a local inventory underneath the parent product.
         *
         * @param string $parent The account and product where this inventory will be inserted.
         *     Format: `accounts/{account}/products/{product}`
         * @param string $localInventoryRegion
         *     ID of the region for this
         *     `LocalInventory` resource. See the [Local availability and
         *     pricing](https://support.google.com/merchants/answer/9698880) for more details.
         */
        public function insertLocalInventorySample(
            string $parent,
            string $localInventoryStoreCode
        ): 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);

            // Creates a price object.
            $price = new Price(
                [
                    'currency_code' => "USD",
                    'amount_micros' => 33450000,
                ]
            );

            // Creates a new local inventory object.
            $localInventory = (new LocalInventory())
                ->setStoreCode($localInventoryStoreCode)
                ->setLocalInventoryAttributes((new LocalInventoryAttributes())
                    ->setAvailability(Availability::IN_STOCK)
                    ->setPrice($price));

            $request = (new InsertLocalInventoryRequest())
                ->setParent($parent)
                ->setLocalInventory($localInventory);

            // Calls the API and catches and prints any network failures/errors.
            try {
                /** @var LocalInventory $response */
                $response = $localInventoryServiceClient->insertLocalInventory($request);
                printf('Response data: %s%s', $response->serializeToJsonString(), PHP_EOL);
            } catch (ApiException $ex) {
                printf('Call failed with message: %s%s', $ex->getMessage(), PHP_EOL);
            }
        }

        /**
         * Helper to execute the sample.
         */
        public function callSample(): void
        {
            // Makes the call to insert the local inventory to the parent product
            // for the given region.
            $this->insertLocalInventorySample($this::PARENT, $this::LOCAL_INVENTORY_STORE_CODE);
        }

    }


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

### Python

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


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


    def insert_local_inventory():
      """Inserts a `LocalInventory` to a given product.

      Replaces the full `LocalInventory` resource if an entry with the same
      `region` already exists for the product.

      It might take up to 30 minutes for the new or updated `LocalInventory`
      resource to appear in products.
      """

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

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

      # Creates a Local inventory and populate its attributes.
      local_inventory = merchant_inventories_v1.LocalInventory()
      local_inventory.store_code = _STORE_CODE
      local_inventory.local_inventory_attributes.availability = (
          LocalInventoryAttributes.Availability.IN_STOCK
      )
      local_inventory.local_inventory_attributes.price = {
          "currency_code": "USD",
          "amount_micros": 33450000,
      }

      # Creates the request.
      request = merchant_inventories_v1.InsertLocalInventoryRequest(
          parent=_PARENT,
          local_inventory=local_inventory,
      )

      # Makes the request and catch and print any error messages.
      try:
        response = client.insert_local_inventory(request=request)

        print("Insert successful")
        print(response)
      except RuntimeError as e:
        print("Insert failed")
        print(e)


    if __name__ == "__main__":
      insert_local_inventory()

### cURL

      curl --location
      'https://merchantapi.googleapis.com/inventories/v1/accounts/{ACCOUNT_ID}/products/{en~US~SKU12345}/localInventories:insert' \
      --header 'Content-Type: application/json' \
      --header 'Authorization: Bearer {API_TOKEN}' \
      --data '{
         "storeCode": "123456",
         "localInventoryAttributes": {
           "price": {
             "amountMicros": "33450000",
             "currencyCode": "USD"
           },
           "availability": "OUT_OF_STOCK"
         }
      }'

A successful call returns the newly created
[`LocalInventory`](https://developers.google.com/merchant/api/reference/rest/inventories_v1/accounts.products.localInventories#LocalInventory)
resource with the values you provided, but it might not fully represent the
final inventory data. It might take up to **30 minutes** for the new
`LocalInventory` to appear in the product.