Google Maps API

Read Google Maps places and reviews with one API

The Google Maps API returns place, business and review data as clean JSON.

no credit card1,000 free credits · instant API key · live in 10 seconds
Missing a Google Maps endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
G
/google-maps/v1

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.

8 endpoints

place/search

2 cr

Search places by text query with optional lat/lng geo-bias.

required
query
optional
lat, lng, altitude, maxResults, lang, region, include_contacts

place/detail

3 cr

The single richest matching place.

required
query
optional
lat, lng, lang, region, include_contacts

place/by-id

3 cr

Fetch a place directly by its Google id.

required
optional
fid, place_id, cid, query, lat, lng, lang, region

place/nearby

2 cr

Find places of a given type near coordinates (e.g.

required
lat, lng, type
optional
radius, maxResults, lang, region

geocode

1 cr

Turn an address or place name into coordinates.

required
address
optional
lang, region

place/reviews

1 cr

Public Google reviews for a place.

required
optional
query, fid, cid, place_id, sort, max_reviews, cursor, lat, lng, lang, region

place/photos

2 cr

Public photos for a place.

required
optional
query, fid, cid, place_id, lat, lng, lang, region

place/freshness

2 cr

Monitor a place for changes.

required
query
optional
lat, lng, previous, lang, region

Every parameter, every allowed value →

Google Maps API

3 of 8 endpoints, ready to run

View docs ↗

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.

1 credit0 required · 5 optional
POST/google-maps/v1/place/reviews
ok2823 ms · 20 records · sample
{
  "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
    }
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows, with seller names left out. Press Try it for the untrimmed response.

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.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 184 engines.

02
Call
POST /google-maps/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 or 3 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

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.

01search
POST/google-maps/v1/place/search
{"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.

02reviews
POST/google-maps/v1/place/reviews
{"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.

03freshness
POST/google-maps/v1/place/freshness
{"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.

request
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}'
response envelope
{
  "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.

IdentifierMeasured valueCan you look a place up with it?
fid0x89c2598f7ff4aa09:0x313547e757cb8ceaYes. This is the working key for place/by-id, place/reviews and place/photos.
place_id0x89c2598f7ff4aa09:0x313547e757cb8ceaYes, because it is the same string as fid. It is not Google's Places API id.
a ChIJ... idChIJCarr_49ZwokRyozLV-dHNTENo. Sent as place_id it came back with error code MISSING_PARAM.
cid3545819340560108778No. On its own it returned NOT_FOUND, "no place matched". It is returned, and maps_url is built from it.
entity_id/m/03tx_hNo. A Google Knowledge Graph id, returned for reference only.
maps_urlhttps://www.google.com/maps?cid=3545819340560108778The shareable link, always keyed on cid.
rating4.5Out of 5, one decimal, on the place. Individual reviews carry an integer from 1 to 5.
review_count93499An 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 / longitude40.722232999999996 / -73.98742899999999Floats at full precision.
review_idCi9DQUlRQUNvZENodHljRjlvT21OUWVETTVUekpoZEdOVU0yRnNiRmR3VG5GR1drRRABBase64, 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.

What 1,000 reviews cost

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.

How deep one call goes

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.

Asked versus returned

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.

Fields that arrive filled

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.

What you cannot reach

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.

8

endpoints

1/2/3

credits per call

01

Lead-generation tools call place/search to build lists of businesses by category and location.

02

Reputation products use place/reviews to monitor a business's Google ratings and review text.

03

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 →
$0.67–$1.50 / 1,000 credits
  • 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
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}'
python
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"])
FAQ

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.

0/4000

No account needed · we reply from [email protected]

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.