Read Google Maps places and reviews with one API
The Google Maps API returns place, business and review data as clean JSON.
8 active endpoints, on 1, 2 and 3 credit tiers.
- POST/google-maps/v1/place/search
- POST/google-maps/v1/place/detail
- POST/google-maps/v1/place/by-id
- POST/google-maps/v1/place/nearby
- POST/google-maps/v1/geocode
- POST/google-maps/v1/place/reviews
- POST/google-maps/v1/place/photos
- +1 more
What Google Maps endpoints does ReefAPI ship?
8 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Google Maps API
3 of 8 endpoints, ready to run
Public reviews for a place, paged as deep as you ask. Each row carries the star rating, the text, the language, a relative date and a real date, plus the owner's reply when there is one.
{ "ok": true, "meta": { "api": "google-maps", "endpoint": "place/reviews", "mode": "live", "latency_ms": 2823.4, "record_count": 20, "cache_hit": false, "completeness_pct": 100 }, "data": { "place": { "fid": "0x89c2598f7ff4aa09:0x313547e757cb8cea", "place_id": "0x89c2598f7ff4aa09:0x313547e757cb8cea", "cid": "3545819340560108778", "entity_id": "/m/03tx_h", "name": "Katz's Delicatessen", "rating": 4.5, "review_count": 93521, "address": "205 E Houston St, New York, NY 10002", "maps_url": "https://www.google.com/maps?cid=3545819340560108778" }, "reviews": [ { "review_id": "Ci9DQUlRQUNvZENodHljRjlvT2s5MWFuYzVObWRFVmpGVFgxODVXamx6UkcxS2NrRRAB", "rating": 5, "text": "Tried reuben, pastrami and brisket.<br>Each has its own taste. Worth trying each. …", "language": "en", "relative_date": "2 months ago", "date": "2026-05-29T00:46:10Z", "photos": [ "https://lh3.googleusercontent.com/grass-cs/ACvplmMjPlyiX8c1zVCxhzTlRO4GwwdF8_l1TnmsqjDSR0B9UgzFy26VV3crMoVIUoV66DMDYU4wPvIdsUD0ym8ch7X9mDDUGtq_NPBUUAIt9IruaH6Dvz8tkRTfiIm9VnawXeQNMqPi40u7S5lp=k-no", "https://lh3.googleusercontent.com/grass-cs/ACvplmMXDmGLhvMbIXkKdwCF6Fxv-8rOBIZgpFG1NkFjOHiM559BH5M8Kvqz8CtLo0jYs21hau4HMrh7NGhp-pWa8M7gtdU--a3-LrYF5r5QERuIN-_PanDV9iFZhbAhaL3Zd6Wo74YUn-MmcX8=k-no", "https://lh3.googleusercontent.com/grass-cs/ACvplmNuLExM6XpdQWNjfFhOOVZ8D9WZyCrV4Ic14zxqYNEb8lOpWm5XsrrevtUBrmq1JDqp42KZllf35KeErRyOLiPsVfOdgG4q-f6xUtFpzn0HGoK8WV7qgISlhht85QiKJNeEXnE2fLF9YoPg=k-no" ], "photo_count": 6, "owner_response": { "text": "We're so glad you enjoyed your first visit! And yes - though during peak hours we can get quite busy, if you ever want to try dodging the crowds, drop by at an off-peak hour: breakfast, between lunch and dinner, or late nights on the weekend. Hope to see you back again soon!", "relative_date": "2 months ago" } }, { "review_id": "Ci9DQUlRQUNvZENodHljRjlvT2pGb2NVRldWV3RDYldoTlgweFVhR3hNY3pkWWFIYxAB", "rating": 3, "text": "Even though the they had several lines going, and the line was contained within the store - each person in line felt like they took close to 5 minutes to get …", "language": "en", "relative_date": "2 months ago", "date": "2026-06-28T16:38:02Z", "photos": [ "https://lh3.googleusercontent.com/grass-cs/ACvplmP0-S1VfgMHCamjX6ZvX8_FNMkiPbjmt5HHsPqEVSgGqSxjF4HIHHZxaSXPtkEd1V0d1yyugEVQqtLh0WbFYet270rx3SZFRGkzhAl-8K1aw3QXLymWiGq-kwTZoSuEO9LOweRokwF8wc0f=k-no", "https://lh3.googleusercontent.com/grass-cs/ACvplmM0njiEaBqJ1ESjyzIN3LNoJAVplUNgXq-JJ4VmkrigZxQt9QWFP8EV19-uVeVW4Aj7LQLDhyyg3Y8erM7ejJx6TStqbKJ3xag0hGLCmQG6U-t39gJPXEJQauRPmjYfCYDbgM3OD-o5ObZj=k-no", "https://lh3.googleusercontent.com/grass-cs/ACvplmM39brNc9a3TCXkpoYAqeAzBmm209awI-goi-NUL99p6nHcpcr4Ozt6jQ6SxQZWW26pbUzf8BC8g2ZXuyMCOEHvF5wT87UZUD0yPPAbMbrxU9GzFEHXZlhWy-n3OPSukFJy4K2k0HQovPWA=k-no" ], "photo_count": 8, "owner_response": null }, { "review_id": "Ci9DQUlRQUNvZENodHljRjlvT2xOMWMybGhiekIyUWtoTlgwOWtUMUYwYmxad1FsRRAB", "rating": 5, "text": "Katz's has been open since 1888 and it shows in the best possible way. The walls are covered in celebrity photos going back decades, the staff have clearly been …", "language": "en", "relative_date": "2 months ago", "date": "2026-06-11T19:27:42Z", "photos": [ "https://lh3.googleusercontent.com/grass-cs/ACvplmPn8fikf6UzxrxV60qGGs-0aYEGKft7V0-dRt2rPpFgkcSY0-OiVZRw5aJ6QUVj2ZKss8JDkOssgLNS-h0zfOIJ4LreXDrHM8SErfQeyfzfONfOFp-NVOsSrztrB0vMAAeKrrGVD11QKlXw=k-no", "https://lh3.googleusercontent.com/grass-cs/ACvplmM9V0drtnvH0no4_dtV3WrvlxUMVY4L_5XcfOKBwBJ9R_6yxqTBe-jy1ANOH8hrvqsDDhZWJuy-L6QiAUxc4MwOK1Q1AYsTb0st4mnFoAw-Maai_aZKDXCn8TWE16IGv2OIMm43XDZXP_LH=k-no", "https://lh3.googleusercontent.com/grass-cs/ACvplmNcL7-8jJK5S09oXh-MTexHft-Axda8olvEg66QUQFUuLeBT7Hl9jYP9kUaPhSOdFWhK3eRrr7L9WP6xkFzBGdsbxoRblqB6RskmIgMpl_7hY_a10VaAuBFZ-hMNgdOE147IW3sYLIp0__Y=k-no" ], "photo_count": 4, "owner_response": null } ], "count": 20, "pagination": { "cursor": "CjEIARIpCgoAP7_LAA8C____EhCxkM3JmW_Di7eyW9YAAAAAGgn92PACYLLPGDMYACIA", "has_more": true }, "aggregate": { "rating": 4.5, "total": 93521 } } }
How the Google Maps API works
Google Maps is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 184 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Find the place once, then page its reviews
A place has three ids — fid, place_id and cid — and all three are stable. Resolve once, store the fid, and every later pull skips the search entirely.
{"query": "specialty coffee Times Square", "lat": 40.7589, "lng": -73.9881}Take places[0].fid. It survives a name change, so it is the id to keep in your own database.
{"fid": "0x...", "max_reviews": 2000, "sort": "newest"}One call, up to two thousand rows. The response returns a cursor and has_more so a later pass can continue where this one stopped.
{"query": "...", "previous": "<snapshot_hash>"}For monitoring rather than collection: it returns a typed diff of what changed since the snapshot you pass in.
Two thousand reviews for 100 credits, or twenty for the 3-credit floor. Reviews are metered per 20 rows, so bigger pulls are strictly cheaper per review.
curl -X POST https://api.reefapi.com/google-maps/v1/place/reviews \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"Katz's Delicatessen Manhattan","lat":40.7223,"lng":-73.9874,"max_reviews":20}'{
"ok": true,
"data": { … },
"meta": {
"api": "google-maps",
"endpoint": "place/reviews",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}Google Maps place ids: fid, place_id, cid and entity_id
Google hands the same business four different identifiers and they are not interchangeable. This API returns all four on every place, and only some of them can be sent back as a lookup key. Each row was measured on 2026-08-27 against Katz's Delicatessen in Manhattan and cross-checked on four Times Square coffee shops.
| Identifier | Measured value | Can you look a place up with it? |
|---|---|---|
| fid | 0x89c2598f7ff4aa09:0x313547e757cb8cea | Yes. This is the working key for place/by-id, place/reviews and place/photos. |
| place_id | 0x89c2598f7ff4aa09:0x313547e757cb8cea | Yes, because it is the same string as fid. It is not Google's Places API id. |
| a ChIJ... id | ChIJCarr_49ZwokRyozLV-dHNTE | No. Sent as place_id it came back with error code MISSING_PARAM. |
| cid | 3545819340560108778 | No. On its own it returned NOT_FOUND, "no place matched". It is returned, and maps_url is built from it. |
| entity_id | /m/03tx_h | No. A Google Knowledge Graph id, returned for reference only. |
| maps_url | https://www.google.com/maps?cid=3545819340560108778 | The shareable link, always keyed on cid. |
| rating | 4.5 | Out of 5, one decimal, on the place. Individual reviews carry an integer from 1 to 5. |
| review_count | 93499 | An integer on place/detail. It can come back null on place/search, see below. |
| hours_today | ["8 AM-11 PM"], ["Open 24 hours"] | Today only, as an array of strings. A full week of opening hours is not returned. |
| latitude / longitude | 40.722232999999996 / -73.98742899999999 | Floats at full precision. |
| review_id | Ci9DQUlRQUNvZENodHljRjlvT21OUWVETTVUekpoZEdOVU0yRnNiRmR3VG5GR1drRRAB | Base64, from place/reviews. Reviews also carry date (2026-08-19T23:08:23Z) and relative_date ("6 days ago"). |
cid is the decimal form of the hexadecimal half of fid that follows the colon: 0x313547e757cb8cea is 3545819340560108778, and the same conversion held on all four coffee shops checked. entity_id follows Google's own split, where long-established entities get an /m/... Freebase-style id (Katz's is /m/03tx_h) and everything else gets a machine-generated /g/11... id (787 coffee is /g/11y31_2b88). There is no business_status or plus_code field in this response.
Two thousand rows a call, and where the price floor bites
Measured on 2026-08-27 against one Manhattan restaurant that reports 93,509 reviews, by raising max_reviews until the parameter refused.
Reviews are metered per 20 rows with a floor of 3 credits: a thousand rows is 50 credits and two thousand is 100. The floor is the trap — a 20-review call and a 60-review call both cost 3, so asking for 20 throws away two-thirds of what you paid for.
2,000 rows, delivered exactly, in under a minute — and has_more was still true, with a cursor to continue from. This is the deepest single call in the batch by a wide margin.
Exact at every size we tried: 20, 200, 1,000 and 2,000 each returned that number, all ids distinct, no duplicates inside the window. Ask for 4,000 and the call is rejected with a named parameter error rather than quietly returning 2,000.
On 2,000 rows: review id, author, star rating, body, language, a relative date and an absolute date on 100% of them. The owner's reply on 36% and photos on 78% — both genuinely optional on the source.
Against us: 2,000 of 93,509 is 2%. For a place with tens of thousands of reviews the cursor is the only route deeper, and sort gives you four different starting points rather than one long list.
What people build with Google Maps
The jobs this data is most often used for.
endpoints
credits per call
Lead-generation tools call place/search to build lists of businesses by category and location.
Reputation products use place/reviews to monitor a business's Google ratings and review text.
Local-data apps use place/detail and geocode to enrich a location with hours, contact and coordinates.
What Google Maps data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 184 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/google-maps/v1/place/reviews \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"Katz's Delicatessen Manhattan","lat":40.7223,"lng":-73.9874,"max_reviews":20}'import requests
r = requests.post(
"https://api.reefapi.com/google-maps/v1/place/reviews",
headers={"x-api-key": REEF_KEY},
json={
"query": "Katz's Delicatessen Manhattan",
"lat": 40.7223,
"lng": -73.9874,
"max_reviews": 20
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Google Maps.
Get a free key →What is the difference between place_id, fid and cid on Google Maps?▾
fid is Google's feature id, two hexadecimal halves joined by a colon, for example 0x89c2598f7ff4aa09:0x313547e757cb8cea. In this API place_id holds exactly the same string, so it is an alias for fid and not the ChIJ... id from Google's Places API. cid is a single decimal number, 3545819340560108778, and it is what maps.google.com/?cid= links use. All three are returned on every place, but only fid, or place_id carrying the fid, works as a lookup key.
Can I look up a place with just the cid?▾
No. Measured on 2026-08-27, place/by-id with only cid 3545819340560108778 returned ok:false with error.code NOT_FOUND and the message "no place matched", while the same place resolved in under a second from its fid. Treat cid as an output you store for building share links, and keep the fid alongside it if you plan to refresh the record later.
Does this accept a ChIJ... place_id from the Google Places API?▾
No. Passing ChIJCarr_49ZwokRyozLV-dHNTE as place_id returned ok:false with error.code MISSING_PARAM, because the parameter is documented as an alias of fid and a ChIJ string is not a fid. If a ChIJ id is all you hold, look the business up again by name and coordinates with place/search or place/detail and store the fid that comes back.
How do I derive cid from fid myself?▾
Take the part of fid after the colon, drop the 0x, and read it as a hexadecimal integer. 0x313547e757cb8cea becomes 3545819340560108778. That held for all five places checked on 2026-08-27, including 0x57cf5d10e4d1b9a5 giving 6327378328618645925 and 0x2be347662f0035e giving 197653116721562462. The conversion is lossless in that direction, but you cannot recover the first half of the fid from a cid, which is why cid alone is not a lookup key.
Why does review_count sometimes come back null?▾
place/search is served from more than one Google result surface and only one of them publishes the count. The identical request for "specialty coffee Times Square" was run three times in a row on 2026-08-27: two runs returned review_count null for all four places while rating was populated on every row, and one run returned 3526, 958, 559 and 2835. Until that is evened out, treat a null review_count from place/search as unknown rather than zero, and read counts from place/detail or place/by-id, which returned 93,499 for Katz's on every attempt.
What comes back for a permanently closed business?▾
There is no business_status field, so closure shows up as absence. Barneys New York on Madison Avenue, closed for years, came back from place/search with name, address and rating 4.2, and with review_count, hours_today, website and phone all null. Times Square Toys R Us returned a name and a partial address and nothing else. If you are monitoring closures, watch for hours_today and phone dropping to null on a record that previously had them.
What opening hours do I get?▾
Only today's, as hours_today, an array of strings. Measured values are ["8 AM-11 PM"], ["7 AM-7:30 PM"] and ["Open 24 hours"] for round-the-clock pharmacies. The array shape allows split shifts, for example separate lunch and dinner service on one day. A seven-day schedule is not part of this response, so if you need a full week you have to poll once a day and build it up.
How does place/freshness work, and what is snapshot_hash?▾
It returns the current place block plus a freshness object. On 2026-08-27 that was first_seen true, changed false, snapshot_hash "0e71d7ba7e625683" and an empty changes object. The hash is a 16-character digest of the place record, so you can store it and compare it yourself on the next run to detect a change. Two things measured the same day are worth knowing: passing that hash back in the previous parameter returned ok:false with error.code PARSE_ERROR, so the built-in comparison path is not usable yet, and the place block from freshness came back with review_count null while place/detail reported 93,499 for the same fid.
What is the Google Maps API?▾
Google Maps API is a ReefAPI endpoint group for places, business details, ratings and reviews. It returns live JSON through POST requests under /google-maps/v1.
Is the Google Maps API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Google Maps calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Google Maps login or account?▾
No login to Google Maps is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Google Maps data?▾
The page example is captured from a live place/search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Google Maps API use?▾
Google Maps actions currently cost 1-3 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Google Maps from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call google-maps actions with the same key, credit pool and JSON envelope used by normal REST requests.
14 Reputation & Reviews APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Google Maps, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 183 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-27.