What are the limits for client side geocoding with Google Maps JavaScript API v3?
My research:
Google Maps PHP API has a limit of 2500 geocode requests per day (https://developers.google.com/maps/documentation/geocoding/#Limits)
Google Maps Javascript API v3 has a limit of 25000 map loads per day (https://developers.google.com/maps/documentation/javascript/usage)
Google suggests using javascript API for geoocoding to avoid the 2500 limit through the PHP API. It states "running client-side geocoding, you generally don't have to worry about your quota" (https://developers.google.com/maps/articles/geocodestrat#client)
However, nowhere does it state in any of the documentation what the geocoding limits are through the Google Maps JavaScript API v.3.
(This has been bothering me for a while, and I have researched it on more than one occasion and failed to find a solid answer)
I work in Maps for Business support at Google. The following is my personal opinion, not Google's, but let's just say I'm rather familiar with this topic!
First, it's important to distinguish between client-side geocoding (JavaScript calls to google.maps.Geocoder) and server-side geocoding (HTTP requests to /maps/api/geocode). This question and answer are specifically about client-side geocoding; for server-side limits, see here. In particular, the oft-mentioned 2,500 requests per IP per day limit applies only to server-side geocoding, not client-side.
So the short answer is, there is no documented query limit specifically for client-side geocoding. Once a client has loaded the Google Maps JavaScript API library, it can make as many geocode requests as it likes, provided they're done at a sane speed. Two rules of thumb to ensure you don't run into problems:
Initiate geocoding in response to user interaction, and you'll be fine even if there are short request bursts (eg. click a button to geocode several addresses).
Catch any OVER_QUERY_LIMIT errors and handle them gracefully (eg. exponential backoff). Here is some sample code in Python.
But please do not try to busy-loop the geocoder or hammer away at it for hours on end, there are protections against abuse.
UPDATE
As of 2017 the client side quota is calculated against corresponding web service quota. Please have a look at Christophe Roussy's answer.
Always read the latest you can find on an official Google website for the proper API version, a dated stackoverflow answer is not an up-to-date reference !!!
https://developers.google.com/maps/documentation/geocoding/usage-limits
Here is what it said when I wrote this answer:
Google Maps Geocoding API Usage Limits
2,500 free requests per day, calculated as the sum of client-side and
server-side queries.
50 requests per second, calculated as the sum of client-side and
server-side queries.
Enable pay-as-you-go billing to unlock higher quotas:
$0.50 USD / 1000 additional requests, up to 100,000 daily.
In general I think Google is happy as long as the queries come from real human users as this is of some value to them.
There are also ways to save a few requests by caching results for up to 30 days:
https://developers.google.com/maps/premium/optimize-web-services#optimize
Based on https://developers.google.com/maps/articles/geocodestrat,
Client-side geocoding through the browser is rate limited per map
session, so the geocoding is distributed across all your users and
scales with your userbase.
So, what is rate limits per map session?
As geocoding limits are per user session, there is no risk that your
application will reach a global limit as your userbase grows.
Client-side geocoding will not face a quota limit unless you perform a
batch of geocoding requests within a user session. Therefore, running
client-side geocoding, you generally don't have to worry about your
quota.
Ok, what is the limit? Here we go
https://developers.google.com/maps/documentation/business/articles/usage_limits
With a rate limit or 10 QPS (queries per second), on sending the 11th
request your application should check the timestamp of the first
request and wait until 1 second has passed. The same should be applied
to daily limits.
Still not clear? me too.
This is the closet answer that I found from their document and it says "rate limit of 10 requests per second"
https://developers.google.com/maps/documentation/business/webservices/quota
I don't think a user session can send 10 requests per second, thus I consider it as limitless.
I asked this recently about the Places library (or rather, researched it and came to a conclusion):
Regarding Places Library for Google Maps API Quota limits
Basically, it seems that Map loads with key are limited to 25,000 per day per domain (that might not be right, but i'm pretty sure thats the case).
Geocoding limits are limited in the following way:
2,500 if you're using an API key without setting up billing
100,000 if you're using an API key and have set up billing
If you're doing server-side geocoding (pre-caching results or similar), then your geocoding is per domain, and you're going to run out of requests pretty quickly. (i.e. in a similar vein to if you're doing places requests using the REST API like so: https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&radius=500&types=food&name=harbour&sensor=false&key=XXXX)
If you're using the javascript library, using the autocomplete functionality or PlacesService like so:
service = new google.maps.Geocoder();
then the limit (2,500 or 100,000 respectively), is per end-user, so your limit scales with your user base.
According to the article you linked (under When to Use Server-Side Geocoding):
The 2,500 request limit is per IP address.
So - what exactly do you mean by limit? Limit for the hosting application, or for a client running it?
The statement above tells me that there is no limit for the "host"; without a key or enforceable referrer URLs, there is no (good) way for Google to determine from whence a geocoding request originates. That's kind of the beauty of REST, among other things.
It also tells me that even if they could enforce it, they haven't set a limit. This would likely be counter-productive to their business model.
Related
I currently have an application based on phonehap cordova and makes use of the maps and services of google mpas.
Some of these services are the geocoding and Directions service, with the geocoding I had problems about the "Over query limit" when geocoding more than 250 addresses so I had to implement the use of SetTimeout and delays in time not to send more than 10 Or 20 requests per second. As with geocoding is made use of the service Directions Service in which routes are made on the map and which sometimes also throws the error "Over_query_limit" so that also makes a setTimeout or a timeout in each Routing request.
But this timeout or setTimeout causes the application to slow down by doing these processes for what we already know.
According to this problem and the different plans and tariffs that google offers which of them could serve me to cover mainly these two problems?
The client side per session limits are the same for Premium and Standard plans. You can execute 10 initial requests and after that 1 request per second.
The rate limit is applied per user session, regardless of how many users share the same project. When you first load the API, you are allocated an initial quota of requests. Once you use this quota, the API enforces rate limits on additional requests on a per-second basis. If too many requests are made within a certain time period, the API returns an OVER_QUERY_LIMIT response code.
The per-session rate limit prevents the use of client-side services for batch requests, such as batch geocoding. For batch requests, use the Google Maps Geocoding API web service.
https://developers.google.com/maps/documentation/javascript/geocoding#UsageLimits
In order to solve the issue you should create server side code and call web services as suggested in documentation. With web services you will have 50 QPS and 2500 daily request for free (100K daily requests with Billing enabled) in Standard plan. With Premium plan there is no daily limit and you have 50 QPS as well.
Have a look at documentation for further details
https://developers.google.com/maps/documentation/geocoding/usage-limits
I have read a lot, 1 but I still think I didn't find clear answers about the following questions:
1) A user of my web or mobile app uses an input in order to find Lat, Long of an address (I am using Javascript). Does this request represented by user's client IP or from my Server's IP?
I am asking because I want to ensure that this is a client side request in order to no overcome Google's 2,500 requests per IP.
2) Then, once I have the lat,long in my database I can draw the google map based on an array of lat, long which my user had store previously. Is this a request from my server's IP or user's IP?
Since the geocoding requests are going directly from the user's machine to Google, you are using what Google calls "client-side geocoding" which falls under slightly different licensing agreements than the 2,500/IP API limits.
Client-side geocoding through the browser is rate limited per map session, so the geocoding is distributed across all your users and scales with your userbase. Geocoding quotas and rate limits drive the strategies outlined in this article.
When running client-side geocode requests at periodic intervals, such as on a mobile app, your requests may be subject to blocking if all of your users are making requests at the same time (e.g. the same second of every minute). To avoid this, consider one of the following:
Use a caching strategy.
Introduce random intervals to your requests (jitter). Ensure requests are random across your entire userbase.
If developing for Android, use an inexact repeating alarm.
If developing for Android, select an appropriate location strategy.
In Google Maps API for Business, quotas are tied to client IDs, which provide much higher quotas. To learn more about Maps API for Business quotas and error handling, we recommend reviewing our article, Usage Limits for Google Maps API Web Services. If you're still running into quota limits using the Google Maps API for Business, file a support request here: http://www.google.com/enterprise/portal/.
I am using the Geocoding API for querying the location coordinates for a set of 100K users. However, because of rate limit, I am unable to fire more than 2500 requests per day. I need unrestricted access for the purpose of my study. This is for a project in my university. Can someone guide me in the right direction?
Per the Usage Limits section of the terms of service, even commercial users of the Google Geocoding API do not have unrestricted use:
Users of the standard API [are allowed] 2,500 free requests per day, calculated as the sum of client-side and server-side queries. ... Premium Plan customers: [receive a] shared daily free quota of 100,000 requests per 24 hours; additional requests applied against the annual purchase of Maps APIs Credits.
50* server-side requests per second. ... These limits are enforced to prevent abuse and/or repurposing of the Google Maps Geocoding API, and may be changed in the future without notice. Additionally, we enforce a request rate limit to prevent abuse of the service. If you exceed the per-day limit or otherwise abuse the service, the Google Maps Geocoding API may stop working for you temporarily. If you continue to exceed this limit, your access to the Google Maps Geocoding API may be blocked.
You may want to review the Geocoding Strategies documentation from Google and/or rethink your implementation approach. Does the geocoding need to be dynamic, or is it from a preexisting set of data? Are you obligated to use the Google Maps Geocoding API, or could you use another service?
It's worth noting that most geocoding services will have a similar limit, and if they don't, hitting them with a run of 100,000 or more requests is generally recognized as being poor practice unless a prior arrangement has been made. You may want to consider using another geocoder service, or hosting your own geocoder (e.g. TwoFishes), to get around these limits.
We are a division of a large corporation and are running into a MAJOR problem with the Google maps and geocoding API. The problem is that all 70 divisions of our corporation are behind the same IP address. So a customer service agent in India would appear to be coming from the same IP address as a developer in Cleveland, OH who would appear to be coming from the same IP address as a division president in western Europe. With over 130,000 employees, we routinely get blocked for exceeding the IP rate limit.
Aside from individuals just browsing to websites that happen to be using Google maps with client-side geocoding requests, any division that attempts to do batch geocoding or provides their own application for showing maps will all contribute to the same limit! We actually use our own Where To Buy service internally, which is publicly available, (http://www.ridgid.com/Tools/Where-To-Buy/), to give customers information about local distributors.
While we are not running into an API limit (at least not yet, and when we do we can always buy the enterprise license), we are running into the IP rate limit and currently have no workaround. We are already following best practices in terms of caching up geocoding results and reducing wasteful calls. Thankfully this isn't a problem for our customers as they are not on the same IP as users within our corporation.
The question is whether there is ANY way we can get an exception from Google to our specific IP address to improve the IP-based limitations given our setup? This is really a question for Google. Thanks for your help!
A division of a large corporation with tens of thousands of employees should have an enterprise licence.
I don't think there's a limit associated with IP if you are using the client-side geocoding as described here:
https://developers.google.com/maps/articles/geocodestrat
Server-side geocoding through the Geocoding Web Service has a quota
of 2,500 requests per IP per day, so all requests in one day count
against the quota. In addition, the Web Service is rate-limited, so
that requests that come in too quickly result in blocking.
Client-side geocoding through the browser is rate limited per map session, so the geocoding > is distributed across all your users and scales with your userbase.
A "map session" means every time the Javascript Map API is loaded. However there might be a limit on that as well, whether or not it's associated with IP / domain / sub-domain / URL still needs further clarification.
And the "rate limited" on client side doesn't mean there is a daily quota or something, I had tested this method, on a single day, it can geocode more than 2500 addresses. You will have to think and test how the "rate limit" works, my observation is it let you burst to around 10 addresses in no time, then limit you to a rate of around 1 geocode per second for the next 150 request, further request from the same "session" would take exponentially longer time.
One possiblity is to use a batch of reverse geocode instead of a single request. Google allows up to 24 waypoints in a single direction request. Instead of sending a single reverse geocode you can wait until you have 24 reverse geocode accumulated in a batch. Or you can use Yahoo map like in this answer: Issue in displaying static Google maps.
I wondering if there is a lot of overlap in the requests, like everyone keeps looking up that same 50 locations? You write a caching proxy that makes requests to a internal database first then requests from Google when the results arn't found. This could be done at the software level changing the GeoCode call to a InternalGeoCode or maybe at the network level and catch all the requests to the Google Geocode servers and redirect them? I'm not 100% how hard this would be to implement or if it would help maybe the requests are all unique.
If you are doing forward geocoding only, I suggest trying out GeocodeFarm. I just got an email from them the other day saying they would start releasing "reverse" geocoding soon too and that they are still working out the kinks. Maybe it would help you since they have no request rate limits in place and the only limit is your daily 2,500 limit, same as google... IDK. Just a suggestion..
http://www.geocodefarm.com == the link
The limit in standard license is in 50 to 100 QPS (Queries per second) limit depending upon the service (i.e. Elevation service has a 50 QPS limit, Geocoding has a 100 QPS limit).
Despite you may have a higher quota you cannot perform more than 50 requests per second otherwise the server will block your IP for about 2 hours (based on my experience). The solution is to cache the requests and perform them on a scheduled basis and not upon occurrence.
I need to know how to reset the query limit for the Google Maps API v3. I know that I exceeded it more than three days ago, but it has not reset and I am still hitting it if I send more then 5 requests. How do I restore it completely to be able to get that 2500 (or whatever the request limit is) again?
I need to geocode some addresses and put them (lat, lon) into a database. I have done so far 2500 addresses. I need to do another 1000 and then it will be just one request on page load.
According to the Google Geocoding API documentation, there are actually two limits. First of all, there is the 2,500 request per day limit, which you say you triggered a few days ago. However, there is also a separate rate limit, which is probably what you are hitting here.
The rate limit will prevent you from making many successive geocoding requests in a short time, which it seems is what you're trying to do. There is no way around this, since making 1,000 requests on a single pageload is not the intended use of the Google Geocoding API.
Additional, according to Google:
Note: the Geocoding API may only be used in conjunction with a Google map; geocoding results without displaying them on a map is prohibited. For complete details on allowed usage, consult the Maps API Terms of Service License Restrictions.
This probably means that your overall plan to use the Google geocoder and store the results in a database is a violation of Google's terms of service.
If (and only if) you are going to show the results & marker on a Google Map (required by ToS), then these articles would probably help you:
Geocoding Strategies to make the right decision as to whether you need to use PHP (server-side) or JavaScript (client-side). It sounds like you're right to use PHP.
Geocoding Addresses with PHP/MySQL to do the batch geocoding, provided your use case complies with the Terms of Use ;) -- mind the paragraph about Timing the Geocode Requests as Rohan points out your issue is likely that you're sending requests too fast.