Local SEO Analytics API avatar

Local SEO Analytics API

Pricing

Pay per usage

Go to Apify Store
Local SEO Analytics API

Local SEO Analytics API

Pull Google, Facebook and Bing performance for every business location, plus live listing coverage across 80 plus directories, duplicate listings and voice assistant presence.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

4 days ago

Last modified

Categories

Share

Pull Google, Facebook and Bing performance data for every business location you manage, plus live listing coverage, duplicate suppression status and voice assistant presence.

This Actor wraps the analytics and listing endpoints of the Listings API. It answers the two questions a local SEO report has to answer: where are we listed, and what did those listings actually do.

What this Actor does

Performance

  • Google performance for a location: views, searches, direction requests, calls, website clicks
  • Facebook performance for a location
  • Bing performance for a location

Listing coverage

  • Live listings for a location, so you can see which of the 80 plus directories are publishing your data
  • Duplicate listings for a location, or every duplicate across the account in one run
  • Voice assistant listings, covering the assistants your data reaches
  • Mark a listing as a duplicate, or clear that flag

Reference data

  • Sites included in your plan
  • Subcategories and supported countries and states

Run one operation per location and the dataset becomes a per location report you can pivot in a sheet or load into a warehouse.

Who this is for

  • Agencies producing monthly local SEO reports across a client portfolio
  • Multi location brands tracking map pack visibility store by store
  • Anyone auditing citation coverage and cleaning up duplicate listings
  • Teams feeding local performance into an internal dashboard instead of screenshotting a vendor UI

What you need

A Listings API account and an API key. Create one at listingsapi.com.

Access levelCovers
ReadEvery analytics, listing and reference operation
WritemarkAsDuplicate, markAsNotDuplicate

Publisher analytics need the matching profile connected and matched to the location. Google performance requires a connected Google account, Facebook performance a connected Facebook account. Use the Create Google Listing API Actor to link them and to check that nothing has dropped its connection.

Input

FieldTypeRequiredDescription
apiKeystringYesYour Listings API key. Stored as a secret.
operationstringYesWhich endpoint to call. See the operations table.
pathParamsobjectNoValues for placeholders in the path, for example { "locationId": "123" }.
queryobjectNoQuery string values such as limit, after, startDate or endDate.
bodyobjectNoJSON payload for the duplicate marking operations.
paginatebooleanNoKeep requesting pages while pageInfo.hasNextPage is true. Default false.
maxItemsintegerNoStop after this many dataset items. 0 means no limit.

Operations

OperationMethod and pathReturns
allLocationsGET /locationsYour locations, used to look up location IDs
searchLocationsGET /locations/searchLocations matching a search term
locationsByIdsGET /locations-by-idsA specific set of locations
locationsByStoreCodesGET /locations-by-store-codesLocations matched on your own store codes
googleAnalyticsOfLocationGET /locations/{locationId}/google-analyticsGoogle performance for a location
facebookAnalyticsOfLocationGET /locations/{locationId}/facebook-analyticsFacebook performance for a location
bingAnalyticsOfLocationGET /locations/{locationId}/bing-analyticsBing performance for a location
premiumListingsOfLocationGET /locations/{locationId}/listings/premiumLive listings and their status per site
duplicateListingsOfLocationGET /locations/{locationId}/listings/duplicatesDuplicates found for one location
allDuplicateListingsGET /locations/listings/duplicatesEvery duplicate across the account
voiceAssistantsOfLocationGET /locations/{locationId}/voice-assistantsVoice assistant listings for a location
markAsDuplicatePOST /locations/listings/mark-as-duplicateFlags a listing for suppression
markAsNotDuplicatePOST /locations/listings/mark-as-not-duplicateClears the duplicate flag
planSitesGET /plan-sitesDirectories included in your plan
subCategoriesGET /sub-categoriesCategory IDs used when creating locations
countriesGET /countriesSupported countries and states

Field level detail is at docs.listingsapi.com/docs/analytics and docs.listingsapi.com/docs/listings.

Examples

Google performance for one location over a date range:

{
"apiKey": "<your key>",
"operation": "googleAnalyticsOfLocation",
"pathParams": { "locationId": "123" },
"query": { "startDate": "2026-08-01", "endDate": "2026-08-31" }
}

Check where a location is live across the citation network:

{
"apiKey": "<your key>",
"operation": "premiumListingsOfLocation",
"pathParams": { "locationId": "123" }
}

Audit every duplicate in the account in one run:

{
"apiKey": "<your key>",
"operation": "allDuplicateListings",
"query": { "limit": 50 },
"paginate": true
}

Suppress a duplicate you have confirmed:

{
"apiKey": "<your key>",
"operation": "markAsDuplicate",
"body": {
"input": {
"locationId": "123",
"listingId": "yelp-4471"
}
}
}

Confirm which directories your plan covers before you promise a client a number:

{
"apiKey": "<your key>",
"operation": "planSites"
}

Output

Each item becomes one dataset row. A Google performance row looks roughly like this:

{
"locationId": "123",
"site": "GOOGLE",
"periodStart": "2026-08-01",
"periodEnd": "2026-08-31",
"searchViews": 4821,
"mapViews": 3117,
"directionRequests": 288,
"phoneCalls": 141,
"websiteClicks": 402
}

A listing coverage row carries the site, the live URL, the publish status and the last sync time, which is what you need to compute a coverage percentage per location.

Exact fields follow the API response. Download the dataset as JSON, CSV, Excel or XML, or read it from the Apify API. The run also writes a SUMMARY record to the key value store.

Running it on a schedule

Set a monthly schedule on the first of the month with googleAnalyticsOfLocation and a fixed date range to build a rolling performance history in one dataset. Run allDuplicateListings weekly and send the output to a webhook so new duplicates get triaged instead of accumulating.

For a portfolio, run one task per location using the same Actor with different pathParams, or chain runs from your own script using the Apify API.

Rate limits and pagination

Requests go out one at a time. The Actor reads pageInfo.hasNextPage before fetching the next page, waits out a 429 using retry_after_seconds, and retries server errors with a backoff. Plan limits are 10 requests per minute on Launch and 50 on Growth. See rate limits.

Errors

A non success response stops the run and logs the status, the URL and the response body including the correlation_id. Codes are listed at docs.listingsapi.com/docs/error-codes.

If a publisher analytics call returns empty, the usual cause is that the profile is not connected rather than that traffic was zero. Run connectedAccounts in the Create Google Listing API Actor to confirm before you report a zero to a client.

Cost

You pay Apify for platform usage of the run. Analytics and listing data are billed by your Listings API plan, which starts at 99 dollars a month with a 14 day trial.