Create Bulk GBP Listings API
Pricing
Pay per usage
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
Local Business Listings Submission API
Maintained by CommunityActor 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:
- Creates the location with
POST /locations, if you passed a full location payload - 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
| Field | Type | Required | Description |
|---|---|---|---|
apiKey | string | Yes | Your Listings API key. Stored as a secret. |
connectedAccountId | string | Yes | The Google account new listings are created under. Not needed if createLocationsOnly is on. |
locationIds | array | No | Locations that already exist and need a Google listing. One ID per line. |
locations | array | No | Full location payloads. Each is created first, then published to Google. |
createLocationsOnly | boolean | No | Create the locations and stop. Default false. |
continueOnError | boolean | No | Keep going past a failure and record it on the row. Default true. |
delayMs | integer | No | Pause 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.
Related Actors
- Create Google Listing API for connecting the Google account and creating one listing at a time
- Local Business Listings Submission API for creating and syncing locations
- Local SEO Analytics API for checking whether the new listings went live
- Local Business Reviews API for reading and replying to reviews
- Local Business Posts API for publishing to Google, Facebook, Instagram and X
Links
- Documentation: docs.listingsapi.com
- Create a location: docs.listingsapi.com/docs/api/locations-create
- Create a GMB listing: docs.listingsapi.com/docs/api/connected-accounts-create-gmb-listing
- SDKs: docs.listingsapi.com/sdks
- MCP server: listingsapi.com/mcp
- Support: support@listingsapi.com