The Google Ads API enforces limits on API operations, such as the number of operations
that can be sent in a single mutate request. The following table summarizes some
of the important limits and quotas to be aware of.

| Request type, limitation, and error code |||
|---|---|---|
| Operations with Test access level | 15,000 API operations per day against test accounts | ` https://developers.google.com/google-ads/api/reference/rpc/v26/QuotaErrorEnum.QuotaError#resource_exhausted ` |
| Operations with Explorer access level | 2,880 API operations per day against production accounts 15,000 API operations per day against test accounts | ` https://developers.google.com/google-ads/api/reference/rpc/v26/QuotaErrorEnum.QuotaError#resource_exhausted ` |
| Operations with Basic access level | 15,000 API operations per day against both test and production accounts | ` https://developers.google.com/google-ads/api/reference/rpc/v26/QuotaErrorEnum.QuotaError#resource_exhausted ` |
| Operations with Standard access level | Unlimited API operations per day against both test and production accounts | N/A |
| Mutate requests | 10,000 mutate operations per request | ` https://developers.google.com/google-ads/api/reference/rpc/v26/RequestErrorEnum.RequestError#too_many_mutate_operations ` |
| Planning Service requests | 1 QPS | ` https://developers.google.com/google-ads/api/reference/rpc/v26/QuotaErrorEnum.QuotaError#resource_exhausted ` |
| Conversion Upload Service requests | 2,000 conversions per request | ` https://developers.google.com/google-ads/api/reference/rpc/v26/ConversionUploadErrorEnum.ConversionUploadError#too_many_conversions_in_request ` |
| Billing and Account Budget Service requests | 1 operation per mutate request | ` https://developers.google.com/google-ads/api/reference/rpc/v26/RequestErrorEnum.RequestError#too_many_mutate_operations ` |

## Daily API operation limits

Daily API usage limits are based on the number of [API operations](https://developers.google.com/google-ads/api/docs/api-policy/rate-sheet)
made by your Google Cloud project. API operations are the total sum of `Search`
and `SearchStream` requests, individual mutate operations, and other service
requests. The limits for daily API operations depend on
the API access level of your Google Cloud project. The [Access levels and
permissible use guide](https://developers.google.com/google-ads/api/docs/api-policy/access-levels) outlines the specific API operation limits
for each access level.

Requests that violate these limits are rejected with the error:
[`RESOURCE_EXHAUSTED`](https://developers.google.com/google-ads/api/reference/rpc/v26/QuotaErrorEnum.QuotaError#resource_exhausted).

## gRPC limitations

All of the Google Ads API [client libraries](https://developers.google.com/google-ads/api/docs/client-libs) use [gRPC](https://grpc.io/) for
generating requests and responses. By default, gRPC has a message size of 4 MB,
but our client libraries set the max message size to
**64 MB** in order to increase efficiency.

Responses must not exceed this limit. For example, a search request that
includes a lot of fields may generate a response that exceeds 64 MB in size. To
avoid this limit, you can reduce the number of selected fields, or use
[streaming](https://developers.google.com/google-ads/api/docs/reporting/streaming). For mutates, send fewer operations per request.

Requests that violate this limitation will *not* generate a
[`GoogleAdsError`](https://developers.google.com/google-ads/api/reference/rpc/v26/GoogleAdsError), but will generate a
`RESOURCE_EXHAUSTED` (gRPC code `8` / HTTP `429`) error. Refer to the
[list of gRPC error codes and messages](https://grpc.github.io/grpc/core/md_doc_statuscodes.html).

## Mutate requests

In addition to counting against the user's daily operation quota, a mutate
request cannot contain more than **10,000** mutate operations per request.
Requests that violate this limitation are rejected with the error:
[`TOO_MANY_MUTATE_OPERATIONS`](https://developers.google.com/google-ads/api/reference/rpc/v26/RequestErrorEnum.RequestError#too_many_mutate_operations).

Additional limits and considerations for specific services and request types are
outlined next.

## Search requests

A `Search` or `SearchStream` request counts as one operation against the user's
daily operation quota. One `SearchStream` request counts as one API operation
irrespective of the number of batches.

## Paginated requests

Paginated requests (for example, requests that contain a valid
`next_page_token`) are not counted against a user's daily operation quota.
However, pagination requests that contain an expired or invalid page token will
generate an exception and will count against the daily operation quota.

For more details on pagination, refer to [Paging through results](https://developers.google.com/google-ads/api/docs/reporting/paging).

## Other types of requests

A request that is not a `Mutate`, `Search`, or `SearchStream` request
counts as one operation against the user's daily operation quota.

A few examples of such requests include:

- [`BatchJobService.ListBatchJobResults`](https://developers.google.com/google-ads/api/reference/rpc/v26/BatchJobService/ListBatchJobResults)
- [`ConversionUploadService.UploadCallConversions`](https://developers.google.com/google-ads/api/reference/rpc/v26/ConversionUploadService/UploadCallConversions)
- [`ConversionUploadService.UploadClickConversions`](https://developers.google.com/google-ads/api/reference/rpc/v26/ConversionUploadService/UploadClickConversions)
- [`OfflineUserDataJobService.AddOfflineUserDataJobOperations`](https://developers.google.com/google-ads/api/reference/rpc/v26/OfflineUserDataJobService/AddOfflineUserDataJobOperations)
- [`OfflineUserDataJobService.CreateOfflineUserDataJob`](https://developers.google.com/google-ads/api/reference/rpc/v26/OfflineUserDataJobService/CreateOfflineUserDataJob)
- [`UserDataService.UploadUserData`](https://developers.google.com/google-ads/api/reference/rpc/v26/UserDataService/UploadUserData)

## Requests that return API exceptions

Requests that are rejected with a [`GoogleAdsFailure`](https://developers.google.com/google-ads/api/reference/rpc/v26/GoogleAdsFailure) still
count against the user's daily operation quota.

Requests that fail but don't return a [`GoogleAdsFailure`](https://developers.google.com/google-ads/api/reference/rpc/v26/GoogleAdsFailure),
such as from an error at the network level, won't count against the user's daily
operation quota since the requests would never reach the service. An example of
this is a network connectivity failure.

## Keyword planning service

Due to cost and complexity, the following Keyword Planning service methods are
subject to separate limits from other types of requests.

- Limited to **1** request per second per CID:

  - [`KeywordPlanIdeaService.GenerateKeywordIdeas`](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordPlanIdeaService/GenerateKeywordIdeas)
  - [`KeywordPlanIdeaService.GenerateKeywordHistoricalMetrics`](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordPlanIdeaService/GenerateKeywordHistoricalMetrics)
  - [`KeywordPlanIdeaService.GenerateKeywordForecastMetrics`](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordPlanIdeaService/GenerateKeywordForecastMetrics)

  Requests that violate these limitations are rejected with the error:
  [`RESOURCE_EXHAUSTED`](https://developers.google.com/google-ads/api/reference/rpc/v26/QuotaErrorEnum.QuotaError#resource_exhausted).
- 1 QPS is calculated as 60 requests per 60 seconds.

- Limited to **2** requests per second per CID:

  - [`KeywordPlanIdeaService.GenerateAdGroupThemes`](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordPlanIdeaService/GenerateAdGroupThemes)

Keep in mind these limits when creating a keyword plan.

| Keyword plan object | Maximum number |
|---|---|
| [`KeywordPlan`](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordPlan) per account | 10,000 |
| [`KeywordPlanAdGroup`](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordPlanAdGroup) per [`KeywordPlan`](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordPlan) | 200 |
| [`KeywordPlanAdGroupKeyword`](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordPlanAdGroupKeyword) per [`KeywordPlan`](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordPlan) | 10,000 |
| [`KeywordPlanCampaignKeyword`](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordPlanCampaignKeyword) (negative keywords) per [`KeywordPlan`](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordPlan) | 1,000 |
| [`KeywordPlanCampaign`](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordPlanCampaign) per [`KeywordPlan`](https://developers.google.com/google-ads/api/reference/rpc/v26/KeywordPlan) | 1 |

## Audience insights service

The following methods within
[`AudienceInsightsService`](https://developers.google.com/google-ads/api/reference/rpc/v26/AudienceInsightsService) are subject to specific
quota limits.

- Limited to approximately **200** requests per day per CID:
  - [`AudienceInsightsService.GenerateAudienceCompositionInsights`](https://developers.google.com/google-ads/api/reference/rpc/v26/AudienceInsightsService/GenerateAudienceCompositionInsights)
  - [`AudienceInsightsService.GenerateSuggestedTargetingInsights`](https://developers.google.com/google-ads/api/reference/rpc/v26/AudienceInsightsService/GenerateSuggestedTargetingInsights)
- Limited to **2** requests per second per Google Cloud project:
  - [`AudienceInsightsService.GenerateTargetingSuggestionMetrics`](https://developers.google.com/google-ads/api/reference/rpc/v26/AudienceInsightsService/GenerateTargetingSuggestionMetrics)

## Conversion upload service

- Limited to **2,000** call or click conversions per request:

  - [`ConversionUploadService.UploadCallConversions`](https://developers.google.com/google-ads/api/reference/rpc/v26/ConversionUploadService/UploadCallConversions)
  - [`ConversionUploadService.UploadClickConversions`](https://developers.google.com/google-ads/api/reference/rpc/v26/ConversionUploadService/UploadClickConversions)

  Requests that violate these limits are rejected with the error:
  [`TOO_MANY_CONVERSIONS_IN_REQUEST`](https://developers.google.com/google-ads/api/reference/rpc/v26/ConversionUploadErrorEnum.ConversionUploadError#too_many_conversions_in_request).

> [!NOTE]
> **Note:** Starting June 15, 2026, [`ConversionUploadService.UploadClickConversions`](https://developers.google.com/google-ads/api/reference/rpc/v26/ConversionUploadService/UploadClickConversions) is restricted for new adopters (returning [`NotAllowlistedError.CUSTOMER_NOT_ALLOWLISTED_FOR_THIS_FEATURE`](https://developers.google.com/google-ads/api/reference/rpc/v26/NotAllowlistedErrorEnum.NotAllowlistedError#customer_not_allowlisted_for_this_feature)). New conversion upload integrations must use the [Data Manager API](https://developers.google.com/data-manager).

## Conversion adjustment upload service

- Limited to **2,000** conversion adjustments per request:

  - [`ConversionAdjustmentUploadService.UploadConversionAdjustments`](https://developers.google.com/google-ads/api/reference/rpc/v26/ConversionAdjustmentUploadService/UploadConversionAdjustments)

  Requests that violate these limits are rejected with the error:
  [`TOO_MANY_ADJUSTMENTS_IN_REQUEST`](https://developers.google.com/google-ads/api/reference/rpc/v26/ConversionAdjustmentUploadErrorEnum.ConversionAdjustmentUploadError#too_many_adjustments_in_request).

## Conversion value rules

- Limited to **100,000** conversion value rules per account.

  Requests that violate this limit are rejected with the error
  [`ResourceCountLimitExceededError.ACCOUNT_LIMIT`](https://developers.google.com/google-ads/api/reference/rpc/v26/ResourceCountLimitExceededErrorEnum.ResourceCountLimitExceededError#account_limit).

> [!NOTE]
> **Note:** Conversion value rules created using the Google Ads API are only active if they are part of a conversion value rule set that includes the [`ConversionValueRule`](https://developers.google.com/google-ads/api/reference/rpc/v26/ConversionValueRule) resource names in its `conversion_value_rules` field, and which has the [`ConversionValueRuleSet`](https://developers.google.com/google-ads/api/reference/rpc/v26/ConversionValueRuleSet) status set to `ENABLED`. Conversion value rules that are not part of any conversion value rule set are not visible in the Google Ads UI and can only be managed using the API.

If a [`ConversionValueRuleSet`](https://developers.google.com/google-ads/api/reference/rpc/v26/ConversionValueRuleSet) with an
`attachment_type` of `CUSTOMER` already exists for the account, you must add any
new conversion value rules to that set for them to become active. If no such
conversion value rule set exists, you must create one and add your conversion
value rules to it as described in [Create rule sets](https://developers.google.com/google-ads/api/docs/conversions/conversion-value-rules#create-rule-sets).

## Billing and account budget services

- Mutates can only be made against accounts configured for monthly invoicing.

  Requests that violate this limitation are rejected with the error:
  [`MUTATE_NOT_ALLOWED`](https://developers.google.com/google-ads/api/reference/rpc/v26/MutateErrorEnum.MutateError#mutate_not_allowed).
- Only **1** operation is permitted for mutate requests.

  Requests that violate this limitation are rejected with the error:
  [`TOO_MANY_MUTATE_OPERATIONS`](https://developers.google.com/google-ads/api/reference/rpc/v26/RequestErrorEnum.RequestError#too_many_mutate_operations).
- You should wait at least **12** hours between account budget
  ([`AccountBudget`](https://developers.google.com/google-ads/api/reference/rpc/v26/AccountBudget) or
  [`AccountBudgetProposal`](https://developers.google.com/google-ads/api/reference/rpc/v26/AccountBudgetProposal)) changes to the same
  account. Making changes before 12 hours have elapsed may result in
  unrecoverable failures which can only be resolved by your Google Ads account
  representative.

## Invitations to customer accounts

New users can be invited to existing client accounts with the
[`CustomerUserAccessInvitationService`](https://developers.google.com/google-ads/api/reference/rpc/v26/CustomerUserAccessInvitationService).
Because this feature sends invitation emails to other users, it has the
potential to be misused, and thus there are limitations to its behavior:

- Users cannot receive more than one pending invitation for the same client
  account. If a subsequent request is made to send an invitation to a user
  that already has a pending invitation, this error is returned:
  [`EMAIL_ADDRESS_ALREADY_HAS_PENDING_INVITATION`](https://developers.google.com/google-ads/api/reference/rpc/v26/AccessInvitationErrorEnum.AccessInvitationError#email_address_already_has_pending_invitation).

- Client accounts cannot have more than **70** invitations pending at one
  time. If a request is sent that causes this value to be exceeded, this error
  is returned:
  [`PENDING_INVITATIONS_LIMIT_EXCEEDED`](https://developers.google.com/google-ads/api/reference/rpc/v26/AccessInvitationErrorEnum.AccessInvitationError#pending_invitations_limit_exceeded).

## User data

User data is managed with the [`UserDataService`](https://developers.google.com/google-ads/api/reference/rpc/v26/UserDataService) and the
[`OfflineUserDataJobService`](https://developers.google.com/google-ads/api/reference/rpc/v26/OfflineUserDataJobService).

> [!NOTE]
> **Note:** Starting April 1, 2026, [`UserDataService`](https://developers.google.com/google-ads/api/reference/rpc/v26/UserDataService) and [`OfflineUserDataJobService`](https://developers.google.com/google-ads/api/reference/rpc/v26/OfflineUserDataJobService) for Customer Match are restricted for new adopters (returning [`NotAllowlistedError.CUSTOMER_NOT_ALLOWLISTED_FOR_THIS_FEATURE`](https://developers.google.com/google-ads/api/reference/rpc/v26/NotAllowlistedErrorEnum.NotAllowlistedError#customer_not_allowlisted_for_this_feature)). New Customer Match integrations must use the [Data Manager API](https://developers.google.com/data-manager).

Each [`UserData`](https://developers.google.com/google-ads/api/reference/rpc/v26/UserData) object in a `create` or `remove` operation pertains
to a single end-user. The [`user_identifiers`](https://developers.google.com/google-ads/api/reference/rpc/v26/UserData#user_identifiers%5B%5D) field within a
single `UserData` object is limited to a maximum of 20 identifiers. Exceeding
this limit in a single `UserData` object will result in an
[`OfflineUserDataJobError.TOO_MANY_USER_IDENTIFIERS`](https://developers.google.com/google-ads/api/reference/rpc/v26/OfflineUserDataJobErrorEnum.OfflineUserDataJobError#too_many_user_identifiers)
or [`UserDataError.TOO_MANY_USER_IDENTIFIERS`](https://developers.google.com/google-ads/api/reference/rpc/v26/UserDataErrorEnum.UserDataError#too_many_user_identifiers)
error.

### Handle users with more than 20 identifiers

If a single end-user possesses more than 20 identifiers that you need to upload,
you should distribute these identifiers across multiple `UserData` objects. To
make sure Google can associate all these identifiers with the same end-user,
each `UserData` object for that user must include at least one common
`user_identifier`, such as the same `hashed_email`, `hashed_phone_number`, or
`third_party_user_id`. Google uses these shared identifiers to link and merge
the information from the separate `UserData` operations to the correct end-user
profile.

If you rely on PII such as hashed emails or phone numbers, ensure they are
normalized and hashed according to the Google Ads API requirements (SHA-256, lowercase,
no whitespace) to prevent linkage failures.

For example, if a user has 30 email addresses, you can send two `UserData`
objects that share a common `third_party_user_id` (putting `thirdPartyUserId`
plus emails 1 through 19 in the first object to stay within the 20-identifier
limit, and `thirdPartyUserId` plus emails 20 through 30 in the second):

    {
      "userIdentifiers": [
        { "thirdPartyUserId": "user123" },
        { "hashedEmail": "SHA256_OF_EMAIL_1" },
        // Hashed emails 2 through 18 are omitted here.
        { "hashedEmail": "SHA256_OF_EMAIL_19" }
      ]
    }

    {
      "userIdentifiers": [
        { "thirdPartyUserId": "user123" },
        { "hashedEmail": "SHA256_OF_EMAIL_20" },
        // Hashed emails 21 through 29 are omitted here.
        { "hashedEmail": "SHA256_OF_EMAIL_30" }
      ]
    }

The total limit for `user_identifiers` across all operations in a single
[`AddOfflineUserDataJobOperationsRequest`](https://developers.google.com/google-ads/api/reference/rpc/v26/AddOfflineUserDataJobOperationsRequest) is 100,000 (an
`OfflineUserDataJob` can accept multiple
`AddOfflineUserDataJobOperationsRequest` calls, up to a recommended maximum of
1,000,000 operations per job). For synchronous uploads using
[`UploadUserDataRequest`](https://developers.google.com/google-ads/api/reference/rpc/v26/UploadUserDataRequest)
([`UserDataService.UploadUserData`](https://developers.google.com/google-ads/api/reference/rpc/v26/UserDataService/UploadUserData)), each request is limited
to a maximum of **10** operations and **100** `user_identifiers` across the
entire request.

## Other types of limits

A repeated field, such as a list of operations, that has too many items in a
request can incur the error:
[`REQUEST_SIZE_LIMIT_EXCEEDED`](https://developers.google.com/google-ads/api/reference/rpc/v26/SizeLimitErrorEnum.SizeLimitError#request_size_limit_exceeded). This same error
message can also be due to other issues.

If you encounter this limitation and are making requests that use a repeated
field, try reducing the number of items in the repeated field by splitting the
list of operations across multiple mutate requests.

When making a [GAQL](https://developers.google.com/google-ads/api/docs/query/overview) query, the maximum number of items within
an `IN` clause is 20,000. If you exceed that limit, a
[`FILTER_HAS_TOO_MANY_VALUES`](https://developers.google.com/google-ads/api/reference/rpc/v26/QueryErrorEnum.QueryError#filter_has_too_many_values) error is returned.