Create Bulk GBP Listings API avatar

Create Bulk GBP Listings API

Pricing

Pay per usage

Go to Apify Store
Create Bulk GBP Listings API

Create Bulk GBP Listings API

Create Google Business Profile listings for hundreds of locations in one run. Point it at locations you already have, at new locations it creates first, or both. One result row per location, so a partial failure is visible.

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

Create Google Business Profile listings for hundreds of locations in one run. Point it at locations you already have, at brand new locations you want created first, or at both in the same run.

Creating one Google listing at a time is fine for a single store. Onboarding a franchise with 300 outlets is not that job. This Actor loops the create endpoints of the Listings API for you, paces itself against your plan rate limit, and writes one result row per location so a partial failure is visible instead of silent.

What this Actor does

For each item in the run it does one or both of these:

  1. Creates the location with POST /locations, if you passed a full location payload
  2. Creates the Google Business Profile listing with POST /locations/create/gmb-listing, linking it to your connected Google account

Then it writes a row carrying the new location ID, the database ID, the location status, whether the Google listing request was accepted, and the error if it was not.

Creation is asynchronous

The API answering success: true means your request was accepted, not that the listing is live. Google verifies and provisions on its own schedule. Treat a successful run as work queued, then check the real state later with premiumListingsOfLocation in the Local SEO Analytics API Actor.

What you need

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

You also need a connected Google account ID. Every Google listing is created under one. Get it by running connectedAccounts in the Create Google Listing API Actor, which is also where you connect the Google account in the first place.

Input

FieldTypeRequiredDescription
apiKeystringYesYour Listings API key. Stored as a secret.
connectedAccountIdstringYesThe Google account new listings are created under. Not needed if createLocationsOnly is on.
locationIdsarrayNoLocations that already exist and need a Google listing. One ID per line.
locationsarrayNoFull location payloads. Each is created first, then published to Google.
createLocationsOnlybooleanNoCreate the locations and stop. Default false.
continueOnErrorbooleanNoKeep going past a failure and record it on the row. Default true.
delayMsintegerNoPause between calls. Default 6500, which suits 10 requests per minute.

Pass locationIds, locations, or both. The run fails immediately if both are empty.

Required fields on a new location

A location payload needs name, description, countryIso, subCategoryId, and city for countries that use city level addressing. The description has a 200 character minimum, which is the most common reason a bulk import fails on the first row.

Get valid subCategoryId values from subCategories, and valid country and state codes from countries, both in the Local SEO Analytics API Actor.

Examples

Add Google listings to twelve locations you already have:

{
"apiKey": "<your key>",
"connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",
"locationIds": [
"TG9jYXRpb246MTgwMDI4OQ==",
"TG9jYXRpb246MTgwMDI5MA==",
"TG9jYXRpb246MTgwMDI5MQ=="
]
}

Onboard new stores from scratch, creating each location then its Google listing:

{
"apiKey": "<your key>",
"connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",
"locations": [
{
"input": {
"name": "Acme Dental Downtown",
"description": "Acme Dental Downtown is a family owned dental practice in lower Manhattan offering preventive care, cosmetic dentistry, orthodontics and emergency appointments. Our board certified team combines modern equipment with a gentle, patient first approach, and same week appointments are available for new patients.",
"storeId": "ACME01",
"street": "123 Jump Street",
"city": "New York",
"stateIso": "NY",
"postalCode": "10013",
"countryIso": "US",
"phone": "6443859313",
"subCategoryId": 1432,
"businessHours": [
{ "day": "MONDAY", "type": "OPEN", "slots": [{ "start": "09:00am", "end": "05:00pm" }] },
{ "day": "SUNDAY", "type": "CLOSED", "slots": [] }
]
}
}
]
}

Dry import, creating the locations only so you can review them before anything reaches Google:

{
"apiKey": "<your key>",
"createLocationsOnly": true,
"locations": [ { "input": { "name": "..." } } ]
}

Run faster on a Growth plan:

{
"apiKey": "<your key>",
"connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",
"locationIds": ["TG9jYXRpb246MTgwMDI4OQ=="],
"delayMs": 1200
}

Output

One dataset row per location:

{
"index": 0,
"mode": "new",
"label": "Acme Dental Downtown",
"locationId": "TG9jYXRpb246MTgwMDI5MA==",
"databaseId": 1800290,
"locationStatus": "PENDING",
"locationCreated": true,
"gmbListingRequested": true,
"status": "success",
"error": null
}

A failed row keeps the same shape with status set to failed and the reason in error, so you can filter the dataset to failures, fix the payloads, and rerun just those.

The run also writes a SUMMARY record to the key value store with items processed, succeeded, failed, locations created and Google listings requested.

Rate limits

The Actor sends one request at a time and sleeps delayMs between calls. A location that has to be created costs two calls, so 100 new locations at the default pacing takes roughly 22 minutes. On a 429 it reads retry_after_seconds and waits it out, retrying up to five times.

Plan limits are 10 requests per minute on Launch and 50 on Growth. See rate limits.

Errors

Both endpoints answer with success and errors inside a 200 response, so an accepted HTTP status does not mean the work happened. This Actor reads both and marks the row failed when success is false or errors is not empty, rather than reporting a false positive.

HTTP level failures log the status and the correlation_id you can quote to support. Codes are listed at docs.listingsapi.com/docs/error-codes.

Cost

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