REQUEST_DENIED and OVER_QUERY_LIMIT in the Google Places API

What the two Places API status codes mean, the billing and key problems behind them, and the legacy API changes that make old projects and new projects behave differently.

REQUEST_DENIED

Short answer

Google Places uses REQUEST_DENIED generally for a missing API key or an invalid key parameter. OVER_QUERY_LIMIT can indicate a request-rate limit, disabled billing, an exceeded usage cap or an invalid payment method, so slowing requests addresses only one possible cause.

Diagnosis checked 2026-11-12; sources below.

Why it happens

Google denied the request, generally because the API key is missing or invalid for it. Places API (Legacy) can no longer be enabled for new Google Cloud projects as of October 2026. Source: Place Details (Legacy) status codes.

Do this now

  1. If the data is yours or your use fits the official terms, switch to the official route: Google Maps Platform Places API (Public API). SKU-based pay-as-you-go. Place Details Essentials is $5.00 per 1,000 after 10,000 free calls per month at the published first paid tier; other SKUs differ.
  2. For place details at volume, run a hosted route instead of patching your own requests: Google Maps Business Finder with Hours, Ratings & Location. The request below runs it with its published example input through the Apify API (your token, billed at the Store price).
  3. Compare every route, with fields and prices, on the Google Maps page.

Python

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
    "mode": "search",
    "searchQuery": "coffee shops in New York",
    "maxResults": 3,
    "language": "en",
    "includeDetails": False,
    "searchTerms": [],
    "locations": [],
    "openNow": False,
    "hasWebsite": False,
    "hasPhone": False,
    "includeClosed": True,
    "excludeCategories": []
}

run = client.actor("vexaloom-labs/google-maps-business-finder-with-hours-ratings").call(run_input=run_input)
if run is None:
    raise RuntimeError("The Actor run was not found.")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

pip install apify-client

JavaScript

import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "<YOUR_APIFY_TOKEN>" });
const input = {
    "mode": "search",
    "searchQuery": "coffee shops in New York",
    "maxResults": 3,
    "language": "en",
    "includeDetails": false,
    "searchTerms": [],
    "locations": [],
    "openNow": false,
    "hasWebsite": false,
    "hasPhone": false,
    "includeClosed": true,
    "excludeCategories": []
};

const run = await client.actor("vexaloom-labs/google-maps-business-finder-with-hours-ratings").call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

npm install apify-client

cURL

curl -X POST "https://api.apify.com/v2/actors/vexaloom-labs~google-maps-business-finder-with-hours-ratings/run-sync-get-dataset-items"   -H "Authorization: Bearer $APIFY_TOKEN"   -H "Content-Type: application/json"   -d '{"mode":"search","searchQuery":"coffee shops in New York","maxResults":3,"language":"en","includeDetails":false,"searchTerms":[],"locations":[],"openNow":false,"hasWebsite":false,"hasPhone":false,"includeClosed":true,"excludeCategories":[]}'

Waits for the run and returns the dataset items (runs over 300 seconds return HTTP 408; start an async run instead).

MCP (AI agents)

{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=vexaloom-labs/google-maps-business-finder-with-hours-ratings",
      "headers": {
        "Authorization": "Bearer <YOUR_APIFY_TOKEN>"
      }
    }
  }
}

Adds this Actor as a tool in an MCP client that takes a remote server URL (Cursor, VS Code, Claude Code) through Apify's hosted MCP server. OAuth sign-in also works without the header. Clients that only start local servers can wrap the URL with npx mcp-remote.

Open Google Maps Business Finder with Hours, Ratings & Location in Apify Store

Routes that work for Google Maps data

The official route first, then the catalogue Actors that fit this problem (place details), by their published fields. Store figures are the publisher's public numbers.

Routes for Google Maps data
RouteCore fieldsPrice / 1KSuccess, 30 daysLink
Public APIGoogle Maps Platform Places APInot comparedbelowOfficial docs
Google Maps Business Finder with Hours, Ratings & Location8/9$0.9918 runs, too few to rateOpen in Apify Store
Google Maps Radius Search Around a Coordinate8/9$0.996 runs, too few to rateOpen in Apify Store
Google Maps Grid-Based Market Saturation Scanner6/9$0.99100% of 25 runsOpen in Apify Store

Official price: SKU-based pay-as-you-go. Place Details Essentials is $5.00 per 1,000 after 10,000 free calls per month at the published first paid tier; other SKUs differ. Compare all 25 Google Maps routes.

The facts behind the error

FactValue
REQUEST_DENIEDThe request was denied, generally because the API key is missing or the key parameter is invalid
OVER_QUERY_LIMITQPS limit exceeded, billing not enabled, a usage cap exceeded, or the payment method is no longer valid
Legacy APIAs of October 2026, Places API (Legacy) can no longer be enabled for new Google Cloud projects; existing projects stay supported
Billing changeOn March 1, 2025 Google replaced the $200 monthly credit with a free monthly usage cap per SKU
Rate limits (New)Places API (New) limits are per minute, per method, per project
Legacy result capLegacy Text Search returns up to 20 results a page and 60 over three pages; each page is billed

Check the key before changing request timing

For REQUEST_DENIED, inspect whether the request includes the API key and whether the key parameter is valid. Retrying the same request leaves those problems unchanged.

Separate rate limits from billing problems

For OVER_QUERY_LIMIT, check request volume, billing status, usage caps and the payment method. Places API (New) applies limits per minute, per method and per project, so inspect the affected method within the project.

Review legacy assumptions

New projects need Places API (New) because Legacy can no longer be enabled for them. Also review billing assumptions: Google replaced the monthly credit with free monthly usage caps per SKU, and Legacy Text Search pagination remains capped with each page billed.

When to stop fighting the error

Stop trying to enable Legacy in a new project and build against Places API (New). If the job requires coverage beyond Legacy Text Search's result cap, request retries and additional pagination cannot deliver it; assess another permitted source or collection route against the required place details and coverage.

Questions people ask

Will waiting fix REQUEST_DENIED?

The status generally points to a missing API key or an invalid key parameter. Check those parts of the request before adding delays.

Does OVER_QUERY_LIMIT always mean requests are too fast?

The status also covers disabled billing, exceeded usage caps and an invalid payment method. Verify which condition applies before changing request timing.

Why can an older project use Legacy while a new project cannot?

Places API (Legacy) can no longer be enabled for new Google Cloud projects as of October 2026. Existing projects remain supported.

Can more pagination retrieve every Legacy Text Search result?

Legacy Text Search has a fixed result cap across its available pages. Each page is billed, so pagination has both a coverage limit and a cost.

Sources

Every dated claim on this page comes from the public sources below. Check the source before you make a business decision on it.

Content updated 2026-11-12Data checked 2026-11-12

Get Google Maps data with a catalogue Actor

Google Maps Review & Contributor Activity Scraper returns 9 of 9 core Google Maps fields at $0.99 per 1,000 results. Compare all 25 Google Maps routes.

Open in Apify Store