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
- 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.
- 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).
- 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.
| Route | Core fields | Price / 1K | Success, 30 days | Link |
|---|---|---|---|---|
| Public APIGoogle Maps Platform Places API | not compared | below | Official docs | |
| Google Maps Business Finder with Hours, Ratings & Location | 8/9 | $0.99 | 18 runs, too few to rate | Open in Apify Store |
| Google Maps Radius Search Around a Coordinate | 8/9 | $0.99 | 6 runs, too few to rate | Open in Apify Store |
| Google Maps Grid-Based Market Saturation Scanner | 6/9 | $0.99 | 100% of 25 runs | Open 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
| Fact | Value |
|---|---|
| REQUEST_DENIED | The request was denied, generally because the API key is missing or the key parameter is invalid |
| OVER_QUERY_LIMIT | QPS limit exceeded, billing not enabled, a usage cap exceeded, or the payment method is no longer valid |
| Legacy API | As of October 2026, Places API (Legacy) can no longer be enabled for new Google Cloud projects; existing projects stay supported |
| Billing change | On 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 cap | Legacy 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.
Website pages
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.
- Place Details (Legacy) status codes — checked 2026-11-11
- Text Search (Legacy) — checked 2026-11-11
- Google Maps Platform March 2025 changes — checked 2026-11-11
- Places API usage and billing — checked 2026-11-11
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.