SEO API

SEO Local pack API

Get the Google local pack for a keyword in a city: the short list of businesses Google shows in the map box on its normal search results page, in pack order, with rating, review count, address, category, opening hours, phone, website, booking link, and Google listing ids. Sponsored listings are left out. For the full Google Maps results list, use maps.search.

$1.50/1k req, pay per request, no subscription.

What the API returnedplaces[0]
{
"position":ย 1,
"name":ย "Ember & Bean Coffee Roasters",
"rankGroup":ย 1,
"rankAbsolute":ย 1,
"rating":ย 4.8,
"reviewsCount":ย 612,
"description":ย "1204 S Congress Ave\nOpen until 6 PM\n\"Best cortado on South Congress.\"",
"phone":ย "(512) 555-0143",
... 11 more fields
}
Uptime
95.33%
30d ยท 107 calls
Requests
130
30d ยท weekly, last 12 wks
Response
8.9s
median ยท 30d

Pricing and providers

SEO Local pack API pricing: one API, 2 interchangeable providers

The cheapest provider serves first. If it fails, the next one takes over in the same call.

You pay
$15.00
$1.50/1k req, only for what you use. No monthly plan.
Your first 66 requests are free with the $0.10 starting balance.

Try it

Get SEO local pack in one request

requireFieldsarray
Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `address` or `cid`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a business that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge.
Open in
Get a free key
Sample response
Free runs return only the first 3 results. Fund a key to get the full response.

This sample shows 14 of 23 fields. See every field

{
  "found": true,
  "data": {
    "places": [
      {
        "position": 1,
        "name": "Ember & Bean Coffee Roasters",
        "rankGroup": 1,
        "rankAbsolute": 1,
        "rating": 4.8,
        "reviewsCount": 612,
        "description": "1204 S Congress Ave\nOpen until 6 PM\n\"Best cortado on South Congress.\"",
        "phone": "(512) 555-0143",
        "url": "https://www.emberandbeancoffee.com/",
        "domain": "emberandbeancoffee.com",
        "cid": "4821937465012938471"
      },
      {
        "position": 2,
        "name": "Radiant Grind Coffee Bar",
        "rankGroup": 2,
        "rankAbsolute": 2,
        "rating": 4.6,
        "reviewsCount": 388,
        "description": "800 W 6th St\nOpen until 9 PM",
        "phone": "(512) 555-0187",
        "url": "https://www.radiantgrind.com/",
        "domain": "radiantgrind.com",
        "cid": "11930284756102938475"
      },
      {
        "position": 3,
        "name": "Lowland Coffee Collective",
        "rankGroup": 3,
        "rankAbsolute": 3,
        "rating": 4.5,
        "reviewsCount": 241,
        "description": "2100 Manor Rd\nCloses soon\n\"Quiet spot to work with great pastries.\"",
        "url": "https://www.lowlandcoffee.co/",
        "domain": "lowlandcoffee.co",
        "cid": "7392018465720193846"
      }
    ]
  }
}

Full parameter and response reference - every field, type, and example for this endpoint.

Reference

One request, one response shape.

Every field you send and every field you get back, each with a real example.

Last verified 2026-10-31 ยท uptime and latency measured over 30d

Request body

JSON, posted to this endpoint.

  • keywordstring

    coffee shop

    Search keyword, for example coffee shop or plumber.

  • locationstring

    Austin,Texas,United States

    Location to search from, formatted like City,Region,Country; for example, New York,New York,United States.

  • languagestring

    en

    Language code for the search results.

  • limitinteger

    Maximum number of local pack businesses to return. Google usually shows three. Billing is flat per request.

  • requireFieldsarray

    Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `address` or `cid`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a business that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge.

You send. A small JSON body. The values shown are examples to replace with your own.

Response

JSON, one example value per field.

each placedata.places[]

Businesses in the Google local pack, in the order Google shows them. Populated whenever the provider has data for the entity.

  • addressstringcan require

    The address line Google shows for the business in the pack. For a business that serves an area rather than a storefront, Google shows years in business and the city here instead.

  • bookingUrlstringcan require

    Booking link Google shows for the business, when it has one. The query string carries the booking session, so it is kept.

  • categorystringcan require

    Business category Google shows, such as Coffee shop or Plumber.

  • cidstringcan require

    4821937465012938471

    Google customer id (CID) of the business listing.

  • descriptionstringcan require

    1204 S Congress Ave Open until 6 PM "Best cortado on South Congress."

    The text Google prints under the business name in the pack. Usually it is every line: the street address or years in business, opening hours, and a review quote. On some responses it is only the review quote, with the address and hours in their own fields.

  • directionsUrlstringcan require

    Google Maps directions link to the business, with tracking query parameters removed.

  • domainstring

    emberandbeancoffee.com

    Host name of the business website, such as www.example.com.

  • hoursstringcan require

    Opening hours text Google shows, such as Open 24 hours or Closed - Opens 7 AM.

  • imagestringcan require

    Thumbnail photo URL Google shows for the business.

  • knowledgeGraphIdstringcan require

    Google Knowledge Graph id of the business, such as /g/11vb1r7rlr.

  • namestring

    Ember & Bean Coffee Roasters

    Business name. Populated whenever the provider has data for the entity.

  • phonestring

    (512) 555-0143

    Business phone number, when Google shows one, as Google prints it: national format such as (512) 890-2933 or international format such as +1 512-890-2933.

  • positioninteger

    1

    One-based position of the business in the local pack, counting only unpaid listings. Populated whenever the provider has data for the entity.

  • priceLevelstringcan require

    Price range Google shows for the business, such as $10-20.

  • rankAbsoluteinteger

    1

    Position of the business among every element of the Google results page, counting from the top.

  • rankGroupintegercan require

    1

    Position Google gives the business inside the local pack, counting sponsored listings, so it can be higher than position when an ad sits above it.

  • ratingnumber

    4.8

    Average Google star rating out of 5. Populated whenever the provider has data for the entity.

  • reviewsCountinteger

    612

    Number of Google reviews behind the rating. Populated whenever the provider has data for the entity.

  • urlstring

    https://www.emberandbeancoffee.com/

    Business website URL, when listed, with tracking query parameters removed.

top level
  • foundboolean

    true

  • reason"not_found"

    Present only when `found` is false, and says why there is no result. `not_found`: the source states the target does not exist, or returned nothing for it. A `found: false` answer is a successful call, not an error, and `costUsd` is what it actually cost.

You get back. Named, typed fields in the same shape whichever source answers.

FAQ

About the SEO Local pack API

The AnyAPI SEO Local pack API returns SEO local pack data as normalized JSON from one POST call to /v1/run/seo.local_pack. Get the Google local pack for a keyword in a city: the short list of businesses Google shows in the map box on its normal search results page, in pack order, with rating, review count, address, category, opening hours, phone, website, booking link, and Google listing ids. Sponsored listings are left out. For the full Google Maps results list, use maps.search. AnyAPI routes each request across 2 sources and falls back automatically when one fails. It costs from $1.50 per 1,000 requests, in US dollars with no subscription and no monthly minimum. Over the last 30 days, 95.3% of SEO local pack calls through AnyAPI succeeded, with a median response time of 8.9 seconds across 107 measured calls.

It costs from $1.50 per 1,000 requests, in US dollars with no subscription and no monthly minimum. You fund one USD wallet and each call draws it down. Some failed wallet-funded requests incur processing charges that we pass through at cost, with no markup; the error response shows the amount charged.

Get the Google local pack for a keyword in a city: the short list of businesses Google shows in the map box on its normal search results page, in pack order, with rating, review count, address, category, opening hours, phone, website, booking link, and Google listing ids. Sponsored listings are left out. For the full Google Maps results list, use maps.search. The response is normalized JSON with the same envelope every AnyAPI endpoint returns, so parsing a second endpoint is a change of URL and nothing else.

Over the last 30 days, 95.3% of SEO local pack calls through AnyAPI succeeded, with a median response time of 8.9 seconds across 107 measured calls. These are AnyAPI's own measurements of traffic through the gateway, recomputed continuously, not a published service-level target.

Yes. A new AnyAPI account starts with $0.10 of free balance and no card required, which covers 66 SEO Local pack calls at $0.0015 each.

AnyAPI asks the next of its 2 sources in the same request, cheapest first, so one source going down does not fail your call.

Send a POST request to https://api.getanyapi.com/v1/run/seo.local_pack with your AnyAPI key in an "Authorization: Bearer" header and the input as a JSON body. The same key and the same wallet work on every AnyAPI endpoint.

No. You add US dollars to one prepaid AnyAPI balance and each request draws it down. There is no monthly plan and no minimum, and the same balance pays for every AnyAPI endpoint.

Yes. Install @getanyapi/sdk from npm for TypeScript or getanyapi from pip for Python. Both call every AnyAPI endpoint with the same key, and any HTTP client works too.

Yes. An agent can connect to the AnyAPI MCP server at https://api.getanyapi.com/mcp, or create its own free-trial key with one unauthenticated POST to https://api.getanyapi.com/agent/signup and call this endpoint over HTTP.