/api/v4/locations/searchSearch locations
Returns a cursor-paginated list of locations matching a keyword, searchable by name, address, or store ID.
Parameters
Query
| Name | Type | Required | Description | Default |
|---|---|---|---|---|
| query | string | optional | Search keyword matched against location name, street address, city, and store ID. Omit to page through every location. | — |
| filter | string | optional | JSON-encoded filter object to narrow results (for example by folder or approval status). | — |
| first | integer | optional | Number of records to fetch, starting from the most recent. | 50 |
| after | string | optional | Cursor to fetch records after (forward pagination). Pass the previous page's `pageInfo.endCursor`. | — |
Responses
200Cursor-paginated list of matching locations.
{
"data": {
"searchLocations": {
"edges": [
{
"cursor": "TG9jYXRpb246MTgwMDI4OQ==",
"node": {
"accountId": 62670,
"accountName": "owner@brightsmile-dental.com",
"addOns": [],
"additionalCategoryIds": [],
"additionalCategoryNames": [],
"additionalGbpSiteCategoryIds": [],
"additionalGbpSiteCategoryNames": [],
"additionalInfo": null,
"additionalPhones": [],
"aiAnalyticsEnabled": false,
"approved": "APPROVED",
"archivalScheduledAt": null,
"archived": false,
"archivedAt": null,
"bizUrl": null,
"bizUrlUtm": false,
"bookingUrl": null,
"businessHours": [],
"cancellationScheduledAt": null,
"categoryId": 15,
"city": "Bengaluru",
"clientName": "owner@brightsmile-dental.com",
"contentPreferredLanguage": "ENGLISH",
"countryCode": "91",
"countryIso": "IN",
"createErrors": [],
"createdDate": "July 06, 2026",
"customAttributes": [],
"databaseId": 1800289,
"defaultAgencyTag": "ownerbrightsmiledentalcom",
"description": "This is a standalone duplex house. A comfortable, private villa located in the Banjara Layout neighbourhood of Bengaluru.",
"discoveredPlaceActionLinks": [],
"enabledSiteIds": [],
"facebookUrl": null,
"folderId": "d90630a7-7af0-450f-bdfe-6457eb438b1f",
"folderName": "root",
"franchise": false,
"googleAdsPhone": null,
"googleVerificationStatus": { "message": null, "status": "NOT_CONNECTED" },
"googleplusUrl": null,
"hideAddress": false,
"id": "TG9jYXRpb246MTgwMDI4OQ==",
"instagramUrl": null,
"isRestaurant": true,
"lastUpdatedDate": "July 06, 2026",
"latitude": "13.0334524",
"linkedinUrl": null,
"locationPhotos": [],
"longitude": "77.6669171",
"managedServiceSiteBuckets": [],
"managedServiceSites": [],
"moreHours": [],
"name": "Jenny Home",
"offeringsUrl": null,
"ownerEmail": null,
"ownerName": null,
"package": "PREMIUM",
"paymentMethods": [],
"phone": "8073326913",
"pinterestUrl": null,
"placeActionLinks": [],
"planId": 3797,
"planName": "Launch",
"postalCode": "560043",
"primaryGbpSiteCategoryId": null,
"primaryGbpSiteCategoryName": null,
"publisherAttributes": [],
"reservationUrl": null,
"serviceArea": null,
"serviceItems": [],
"stateIso": "KA",
"stateName": "Karnataka",
"storeId": null,
"street": "19 east, 5th B cross road, Trinity Enclave Main Rd, Banjara Layout",
"street1": null,
"subCategoryId": 1432,
"subCategoryName": "Restaurants",
"tagline": null,
"tags": ["all"],
"temporarilyClosed": false,
"tiktokUrl": null,
"toplineMessage": null,
"twitterUrl": null,
"uid": "3c92283c-6145-4a43-8a62-0c15fd712021",
"updatedAt": "2026-07-06T18:33:29.664Z",
"videos": [],
"voiceStatus": 3,
"yearOfIncorporation": null,
"youtubeUrl": null
}
}
],
"pageInfo": {
"endCursor": "TG9jYXRpb246MTgwMDI4OQ==",
"hasNextPage": false,
"hasPreviousPage": false,
"total": 1
}
}
}
}401Unauthenticated — missing or invalid API key.
429Rate limit exceeded. Retry after the `Retry-After` header value.
Use this endpoint to find locations by a free-text keyword. The keyword is matched against the location name, street address, city, and store ID, so a single query like ?query=Jenny surfaces "Jenny Home" whether the user typed the brand, a street, or an internal store code.
Use case — type-ahead location picker. Backing a "search your locations" box in a dashboard, call GET /locations/search?query=<term>&first=10 on each keystroke (debounced) and render edges[].node.name with databaseId. Because the node carries the full address, category, and approved status, you can show a rich result row without a second lookup.
Use case — reconcile against your own system. To confirm a store exists in listingsAPI before pushing an update, search by your storeId value; an empty edges array means the location has not been created yet.
Pagination and gotchas.
- Results are cursor-paginated. Pass the previous response's
pageInfo.endCursorasafterto fetch the next page, and stop whenhasNextPageisfalse. Note the page-level count ispageInfo.total, nottotalCount. - Omitting
queryreturns your locations unfiltered (subject tofirst), which is a convenient way to page the whole account. - Search shares the account rate limit. On a
429, back off using theRetry-Afterheader before retrying.
Each matching location returns placeActionLinks (the Google action links listingsAPI manages) and discoveredPlaceActionLinks (links found directly on the business's Google profile that aren't managed yet). See the Place Action Links guide.
curl -X GET 'https://listingsapi.com/api/v4/locations/search' \
-H "Authorization: API $LISTINGSAPI_KEY"