Beyond API call quotas, Merchant Center enforces other limits on resources.
These are often confused with API quotas, but they are part of
Merchant Center limits. For more information, see
[Understanding quotas in Google Merchant Center](https://support.google.com/merchants/answer/16564100).

## Product limits

To check product limits, you use the
[accounts.limits.get](https://developers.google.com/merchant/api/reference/rest/quota_v1/accounts.limits/get.md.txt)
and
[accounts.limits.list](https://developers.google.com/merchant/api/reference/rest/quota_v1/accounts.limits/list.md.txt)
methods.

To retrieve a specific product limit, for example, to get the Ads EEA quota of
an account, you need to specify the account ID and limit ID in your call to
[accounts.limits.get](https://developers.google.com/merchant/api/reference/rest/quota_v1/accounts.limits/get.md.txt).
The limit ID is a combination of the limit type and scope. For example,
`products~ADS_EEA` for products targeting ads in EEA, and
`products~ADS_NON_EEA` for products targeting ads outside of EEA.

Here's an example request to get the `products~ADS_EEA` limit for a given
account:

```console
GET https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/limits/products~ADS_EEA
```

The following sample demonstrates how to retrieve a specific account limit:

### Java

```java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.quota.v1.AccountLimit;
import com.google.shopping.merchant.quota.v1.AccountLimitsServiceClient;
import com.google.shopping.merchant.quota.v1.AccountLimitsServiceSettings;
import com.google.shopping.merchant.quota.v1.GetAccountLimitRequest;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/**
 * This class demonstrates how to get a single account limit for a given Merchant Center account.
 */
public class GetAccountLimitSample {

  public static void getAccountLimit(String accountId, String limitId) throws Exception {
    GoogleCredentials credential = new Authenticator().authenticate();

    AccountLimitsServiceSettings accountLimitsServiceSettings =
        AccountLimitsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    try (AccountLimitsServiceClient accountLimitsServiceClient =
        AccountLimitsServiceClient.create(accountLimitsServiceSettings)) {

      GetAccountLimitRequest request =
          GetAccountLimitRequest.newBuilder()
              .setName(String.format("accounts/%s/limits/%s", accountId, limitId))
              .build();

      System.out.println("Sending get account limit request:");
      AccountLimit response = accountLimitsServiceClient.getAccountLimit(request);

      System.out.println("Retrieved account limit below");
      System.out.println(response);

    } catch (Exception e) {
      System.out.println("Failed to get account limit.");
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    // The limit ID is a combination of the limit type and the scope, for example:
    // `products~ADS_NON_EEA`
    getAccountLimit(config.getAccountId().toString(), "products~ADS_EEA");
  }
}
```

To learn about the available limit IDs for your account use
[`accounts.limits.list`](https://developers.google.com/merchant/api/reference/rest/quota_v1/accounts.limits/list.md.txt)
with a filter for `type="products"`:

```console
GET https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/limits?filter=type%3D%22products%22
```

The following sample demonstrates how to list account limits:

### Java

```java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.quota.v1.AccountLimit;
import com.google.shopping.merchant.quota.v1.AccountLimitsServiceClient;
import com.google.shopping.merchant.quota.v1.AccountLimitsServiceClient.ListAccountLimitsPagedResponse;
import com.google.shopping.merchant.quota.v1.AccountLimitsServiceSettings;
import com.google.shopping.merchant.quota.v1.ListAccountLimitsRequest;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to list account limits for a given Merchant Center account. */
public class ListAccountLimitsSample {

  public static void listAccountLimits(String accountId) throws Exception {
    GoogleCredentials credential = new Authenticator().authenticate();

    AccountLimitsServiceSettings accountLimitsServiceSettings =
        AccountLimitsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    try (AccountLimitsServiceClient accountLimitsServiceClient =
        AccountLimitsServiceClient.create(accountLimitsServiceSettings)) {

      ListAccountLimitsRequest request =
          ListAccountLimitsRequest.newBuilder()
              .setParent(String.format("accounts/%s", accountId))
              .setFilter("type = \"products\"")
              .build();

      System.out.println("Sending list account limits request:");
      ListAccountLimitsPagedResponse response =
          accountLimitsServiceClient.listAccountLimits(request);

      int count = 0;

      // Iterates over all rows in all pages and prints the account limit in each row.
      // Automatically uses the `nextPageToken` if returned to fetch all pages of data.
      for (AccountLimit accountLimit : response.iterateAll()) {
        System.out.println(accountLimit);
        count++;
      }
      System.out.print("The following count of account limits were returned: ");
      System.out.println(count);

    } catch (Exception e) {
      System.out.println("Failed to list account limits.");
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    listAccountLimits(config.getAccountId().toString());
  }
}
```

## Resource representation limits

The following limits describe notable restrictions for certain string values and
array fields within the resource representations used in the Merchant API.
These limits are the same for both the Merchant API and their corresponding
feature in Merchant Center.

> [!NOTE]
> **Note:** This list of limits may not be complete. We won't extend these limits.

| Resource | Field | Limit |
|---|---|---|
| [`shippingsettings`](https://developers.google.com/merchant/api/reference/rest/accounts_v1/accounts.shippingSettings.md.txt) | Shipping services per country (`services`). Shipping groups per shipping service (`rateGroups`). Labels per shipping group (`applicableShippingLabels`). Subtables per shipping group (`subtables`). Number of rows or columns in a single [rate table](https://developers.google.com/merchant/api/guides/quotas-limits/limits.md.txt#note2). Length of shipping labels. | 20 20 30 100 150 100 |

The number of rows or columns in a rate table affects the following array fields:

- Array fields within `rowHeaders` or `columnHeaders`:
  - `prices[]`
  - `weights[]`
  - `numberOfItems[]`
  - `postalCodeGroupNames[]`
  - `locations[]`
  - `rows[]`
  - `cells[]`