# Google Maps Weak Profile Finder (`coregent/google-maps-weak-profile-finder`) Actor

Find local businesses on Google Maps with weak or incomplete profiles - missing websites, low reviews, low ratings, missing phones - ranked with transparent weakness scoring, reason tags, and a recommended pitch angle for SEO, GBP, web design, and reputation outreach.

- **URL**: https://apify.com/coregent/google-maps-weak-profile-finder.md
- **Developed by:** [Delowar Munna](https://apify.com/coregent) (community)
- **Categories:** Lead generation, SEO tools, Other
- **Stats:** 18 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 weak profile results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Maps Weak Profile Finder

![Google Maps Weak Profile Finder](https://raw.githubusercontent.com/coregentdevspace/google-maps-weak-profile-finder-assets/main/thumbnail-google-maps-weak-profile-finder.jpg)

Find local businesses on Google Maps with **weak or incomplete profiles** — missing websites, missing phones, low review counts, low ratings, missing categories or hours. Each row is ranked with a transparent **weakness score**, **reason tags**, and a **recommended pitch angle** for SEO, GBP, web design, and reputation outreach.

V1 deliberately avoids website crawling, email extraction, full review scraping, photos, menus, and AI enrichment so the run stays **fast and cheap**. You only pay for **unique weak-profile rows** that pass your filters and are successfully written to the dataset.

### ✨ Why this scraper

- **Weakness-focused** — returns only businesses with at least one visible weakness signal, with explainable scoring and reason tags.
- **Pay-Per-Event** — you pay per saved row. No subscription, no monthly fee, no hidden compute charges.
- **No login, no cookies, no sessions** — just keyword + location.
- **CSV-friendly output** — flat 27-field structure, no nested objects.
- **Transparent scoring** — rule-based (no AI), explained below.
- **Five weakness modes** — bias scoring towards `missingWebsite`, `lowReviews`, `lowRating`, `incompleteProfile`, or run `balanced`.

***

### 🚀 Quick start — sample inputs

#### Example 1 — single query, balanced

```json
{
  "searchQueries": [
    { "key": "plumbers", "value": "Canberra ACT" }
  ],
  "maxResults": 100,
  "country": "AU",
  "language": "en",
  "minWeaknessScore": 40,
  "weaknessMode": "balanced",
  "websiteFilter": "any",
  "phoneFilter": "any",
  "maxRating": 4.2,
  "maxReviewCount": 30,
  "categoryFilter": "",
  "includeOpeningHours": true,
  "includeCoordinates": true,
  "deduplicateResults": true,
  "enrichFromDetail": false,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

#### Example 2 — multi-query, only businesses with no website (web-design lead list)

```json
{
  "searchQueries": [
    { "key": "electricians", "value": "Sydney NSW" },
    { "key": "dentists",     "value": "Melbourne VIC" },
    { "key": "cafes",        "value": "Brisbane QLD" }
  ],
  "maxResults": 200,
  "country": "AU",
  "language": "en",
  "minWeaknessScore": 60,
  "weaknessMode": "missingWebsite",
  "websiteFilter": "missingWebsite",
  "phoneFilter": "any",
  "maxRating": 4.2,
  "maxReviewCount": 30,
  "categoryFilter": "",
  "includeOpeningHours": true,
  "includeCoordinates": true,
  "deduplicateResults": true,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

> The `searchQueries` field uses Apify's **Key/Value form editor** — the **Key** column is the business keyword (e.g. `plumbers`), the **Value** column is the location (e.g. `Canberra ACT`). Add one row per search.

***

### 📦 Output

The dataset has five views:

| Tab | Filter |
|---|---|
| **Weak profile leads** | All saved rows (full 27-column flat table). |
| **High opportunity** | `weakness_score >= 75` |
| **Missing website** | `has_website = false` |
| **Low reviews** | Reviews `< 30` (or missing) |
| **Low rating** | Rating `< 3.8` (or missing) |

#### Weak profile leads — table view

![Weak profile leads — table view](https://raw.githubusercontent.com/coregentdevspace/google-maps-weak-profile-finder-assets/main/google-maps-weak-profile-finder-output-weak-profile-leads-table-view.png)

##### Sample record — Weak profile leads

```json
{
  "search_keyword": "plumbers",
  "search_location": "Canberra ACT",
  "business_name": "MTA Plumbing & Gas",
  "category": "Plumber",
  "rating": 5,
  "review_count": 17,
  "phone": "+61 439 451 555",
  "website": "",
  "website_domain": "",
  "address": "Canberra ACT",
  "city": "Canberra",
  "state": "ACT",
  "postcode": "",
  "country": "Australia",
  "google_maps_url": "https://www.google.com/maps/place/MTA+Plumbing+%26+Gas/",
  "place_id": "0x6b164d85a3f912bd:0x8a2c3d4e5f6a7b8c",
  "latitude": -35.2809,
  "longitude": 149.13,
  "opening_hours": "",
  "is_open_now": null,
  "has_website": false,
  "has_phone": true,
  "weakness_score": 60,
  "weakness_label": "Medium Opportunity",
  "weakness_tags": [
    "missing_website",
    "low_review_count",
    "missing_opening_hours",
    "website_design_opportunity",
    "review_generation_opportunity",
    "local_seo_opportunity"
  ],
  "recommended_pitch_angle": "Website design opportunity",
  "scraped_at": "2026-05-06T13:55:53.315Z"
}
```

##### Sample record — High opportunity (score ≥ 75)

```json
{
  "search_keyword": "plumbers",
  "search_location": "Canberra ACT",
  "business_name": "Example Local Plumbing",
  "category": "Plumber",
  "rating": 3.6,
  "review_count": 4,
  "phone": "",
  "website": "",
  "website_domain": "",
  "address": "Canberra ACT, Australia",
  "city": "Canberra",
  "state": "ACT",
  "postcode": "",
  "country": "Australia",
  "google_maps_url": "https://www.google.com/maps/place/example-local-plumbing/",
  "place_id": "0x6b164d0fe0a3a3ad:0x1234567890abcdef",
  "latitude": -35.2809,
  "longitude": 149.13,
  "opening_hours": "",
  "is_open_now": null,
  "has_website": false,
  "has_phone": false,
  "weakness_score": 90,
  "weakness_label": "High Opportunity",
  "weakness_tags": [
    "missing_website",
    "missing_phone",
    "very_low_review_count",
    "low_rating",
    "missing_opening_hours",
    "incomplete_profile",
    "website_design_opportunity",
    "reputation_opportunity",
    "review_generation_opportunity",
    "gbp_optimization_opportunity",
    "local_seo_opportunity"
  ],
  "recommended_pitch_angle": "Website design opportunity",
  "scraped_at": "2026-05-06T14:00:00.000Z"
}
```

##### Sample record — Missing website

```json
{
  "search_keyword": "plumbers",
  "search_location": "Canberra ACT",
  "business_name": "MTA Plumbing & Gas",
  "category": "Plumber",
  "rating": 5,
  "review_count": 17,
  "phone": "+61 439 451 555",
  "website": "",
  "website_domain": "",
  "address": "Canberra ACT",
  "city": "Canberra",
  "state": "ACT",
  "postcode": "",
  "country": "Australia",
  "google_maps_url": "https://www.google.com/maps/place/MTA+Plumbing+%26+Gas/",
  "place_id": "0x6b164d85a3f912bd:0x8a2c3d4e5f6a7b8c",
  "latitude": -35.2809,
  "longitude": 149.13,
  "has_website": false,
  "has_phone": true,
  "weakness_score": 60,
  "weakness_label": "Medium Opportunity",
  "weakness_tags": ["missing_website", "low_review_count", "website_design_opportunity"],
  "recommended_pitch_angle": "Website design opportunity"
}
```

##### Sample record — Low reviews

```json
{
  "search_keyword": "electricians",
  "search_location": "Sydney NSW",
  "business_name": "The Local Electrician Sydney Level 2 & Emergency Specialists",
  "category": "Electrician",
  "rating": 4.9,
  "review_count": null,
  "phone": "+61 439 823 190",
  "website": "https://www.thelocalelectrician.com.au/",
  "website_domain": "thelocalelectrician.com.au",
  "address": "",
  "google_maps_url": "https://www.google.com/maps/place/The+Local+Electrician+Sydney/",
  "place_id": "0x6b12bb6df74fac53:0xb207cd5a2b9b9258",
  "has_website": true,
  "has_phone": true,
  "weakness_score": 40,
  "weakness_label": "Low Opportunity",
  "weakness_tags": [
    "very_low_review_count",
    "missing_address",
    "missing_opening_hours",
    "review_generation_opportunity"
  ],
  "recommended_pitch_angle": "Review generation opportunity"
}
```

##### Sample record — Low rating

```json
{
  "search_keyword": "cafes",
  "search_location": "Brisbane QLD",
  "business_name": "Example Cafe",
  "category": "Cafe",
  "rating": 3.4,
  "review_count": 87,
  "phone": "+61 7 0000 0000",
  "website": "https://example-cafe.com.au/",
  "website_domain": "example-cafe.com.au",
  "address": "100 Example Rd, Brisbane QLD 4000, Australia",
  "city": "Brisbane",
  "state": "QLD",
  "postcode": "4000",
  "country": "Australia",
  "google_maps_url": "https://www.google.com/maps/place/example-cafe/",
  "place_id": "0x6b915a0fe0a3a3ad:0xabcdef1234567890",
  "has_website": true,
  "has_phone": true,
  "weakness_score": 30,
  "weakness_label": "Low Opportunity",
  "weakness_tags": ["low_rating", "reputation_opportunity"],
  "recommended_pitch_angle": "Reputation improvement opportunity"
}
```

#### Output fields (27)

`search_keyword`, `search_location`, `business_name`, `category`, `rating`, `review_count`, `phone`, `website`, `website_domain`, `address`, `city`, `state`, `postcode`, `country`, `google_maps_url`, `place_id`, `latitude`, `longitude`, `opening_hours`, `is_open_now`, `has_website`, `has_phone`, `weakness_score`, `weakness_label`, `weakness_tags`, `recommended_pitch_angle`, `scraped_at`.

***

### 🎯 Weakness scoring

Transparent rule-based score (0–100) computed from visible fields — no AI, no website crawling, no enrichment.

#### Base formula

| Signal                                | Points |
| ------------------------------------- | -----: |
| Missing website                       |    +30 |
| Missing phone                         |    +20 |
| Reviews missing or `< 10`             |    +20 |
| Reviews `10–29`                       |    +10 |
| Rating missing                        |    +10 |
| Rating `< 3.8`                        |    +20 |
| Rating `3.8–4.2`                      |    +10 |
| Missing address                       |    +10 |
| Missing opening hours                 |    +10 |
| Missing category                      |    +10 |

Score is capped at 100.

#### Weakness mode bias (stacks on top)

| Mode                | Bonus                                                                 |
| ------------------- | --------------------------------------------------------------------- |
| `balanced`          | (default formula only)                                                |
| `missingWebsite`    | +15 if no website                                                     |
| `lowReviews`        | +15 if review count `< 30`                                            |
| `lowRating`         | +15 if rating `< maxRating`                                           |
| `incompleteProfile` | +10 each for missing website, phone, address, category, opening hours |

#### Labels

| Score    | Label              |
| -------: | ------------------ |
| `75–100` | High Opportunity   |
| `50–74`  | Medium Opportunity |
| `25–49`  | Low Opportunity    |
| `0–24`   | Weakness Not Clear |

#### Recommended pitch angle

Derived from the highest-priority weakness tag — non-AI rule mapping.

| Top weakness          | Pitch angle                          |
| --------------------- | ------------------------------------ |
| `missing_website`     | Website design opportunity           |
| `low_rating`          | Reputation improvement opportunity   |
| `low_review_count`    | Review generation opportunity        |
| `missing_phone`       | Profile completion opportunity       |
| `incomplete_profile`  | GBP optimization opportunity         |

***

### ⚙️ Filters

| Filter              | Effect                                                                                       |
| ------------------- | -------------------------------------------------------------------------------------------- |
| `minWeaknessScore`  | Save only rows with weakness score ≥ this value (default 40, range 0–100).                  |
| `weaknessMode`      | Bias scoring towards a specific kind of weakness (`balanced` keeps everything broad).        |
| `websiteFilter`     | `any` / `missingWebsite` / `hasWebsite`.                                                     |
| `phoneFilter`       | `any` / `missingPhone` / `hasPhone`.                                                         |
| `maxRating`         | When `weaknessMode = lowRating`, drop businesses rated above this value.                     |
| `maxReviewCount`    | When `weaknessMode = lowReviews`, drop businesses with more reviews than this value.         |
| `categoryFilter`    | Case-insensitive contains match against the business category.                               |
| `deduplicateResults`| Drop duplicates across queries (recommended ON).                                              |
| `enrichFromDetail`  | Open each place's detail page to reliably capture website/phone/address when missing from the list. **⏱️ Slower and 💲 costs an extra event per row** (see below). Turn off for fast, cheapest list-only discovery. |

Filters are applied **after** extraction and weakness scoring, **before** dataset push or event charge.

***

### ⚖️ Website & phone enrichment — read before enabling

The **`enrichFromDetail`** option controls a real speed/cost tradeoff:

- **OFF (default)** — fast, cheapest. Reads only the search results list. Website/phone are taken from the list (often blank). **You are charged only the standard `weak-profile-result` event — the enrichment event is never charged.**
- **ON** — accurate, but **slower** (it opens one extra detail page per result, so runs take materially longer) and **more expensive** (each saved row is billed an **additional** `weak-profile-detail-enrichment` event **on top of** `weak-profile-result` — i.e. **two charges per row instead of one**).

👉 **Rule of thumb:** leave it OFF for quick, low-cost discovery; turn it ON only when you specifically need reliable website/phone data (e.g. building a verified outreach list) and accept the longer runtime and the extra per-row charge.

> The extra `weak-profile-detail-enrichment` charge applies **only while this option is enabled**. With it disabled you never pay that event.

***

### 💰 Pricing

**Pay-Per-Event** with two events:

| Event                             | When charged                                                                                                              | Frequency |
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | --------- |
| `weak-profile-result`             | Each unique, filtered, weak-profile row successfully written to the dataset. **Always charged.**                          | Per row   |
| `weak-profile-detail-enrichment`  | **Only when `enrichFromDetail` is enabled** — added to each saved row to cover the extra detail page load that recovers accurate website, phone, and address. Charged *alongside* `weak-profile-result`. **Never charged when the option is off.** | Per row (enrichment runs only) |

> **No enrichment = single charge.** With `enrichFromDetail` **off** (fast list-only discovery) you pay just `weak-profile-result` per row, and the enrichment event is not billed at all. With it **on**, each saved row is billed **both** events. Per-event prices are configured on the Apify platform.

#### 🚦 Proxy policy

Use **Apify Datacenter** proxy or **no proxy** for normal runs — both work reliably for Google Maps search at this actor's conservative concurrency (`max=5`).

**Apify Residential proxy is not supported.** The actor will fail at startup if `apifyProxyGroups` includes `RESIDENTIAL`. Reason: in pay-per-event actors, residential bandwidth (~proxy/GB) is billed to the developer, not the run user, so a single bandwidth-heavy run could exceed the per-result event revenue.

If you genuinely need residential routing, supply your own residential provider via the proxy editor's **Custom proxy URLs** field — that traffic goes through your provider, not Apify, and is unaffected:

```
http://user:pass@proxy.iproyal.com:12321
http://user:pass@proxy.brightdata.com:22225
http://user:pass@proxy.oxylabs.io:7777
```

#### Spending-cap behavior

The actor honors the user-configured per-run spending cap (Apify `eventChargeLimitReached`) and stops cleanly when reached.

#### Not charged for `weak-profile-result`

- Duplicates (de-duplicated by `place_id`, listing URL, name+address, name+phone, or name+location).
- Rows filtered out by `minWeaknessScore`, `websiteFilter`, `phoneFilter`, `maxRating`, `maxReviewCount`, or `categoryFilter`.
- Rows missing a `business_name`.
- Rows with no meaningful weakness signal.
- Failed dataset pushes.
- Anything after the per-run spending cap is reached.

***

### 📊 Run summary

After each run, a `RUN_SUMMARY` entry is written to the key-value store:

```json
{
  "inputs_total": 3,
  "successful_inputs": 3,
  "failed_inputs": 0,
  "raw_results_found": 240,
  "results_saved": 100,
  "duplicates_removed": 20,
  "filtered_out": 120,
  "charged_events": 100,
  "blocked_requests": 0,
  "retry_count": 0,
  "runtime_seconds": 180,
  "scraped_at": "2026-05-07T00:00:00.000Z"
}
```

`charged_events` always equals `results_saved` for the `weak-profile-result` event.

***

### 🚧 Limitations (V1)

- **Cards-only extraction**: V1 reads each business row directly from the search results panel and **does not click into individual place detail panels**. Phone, website, full opening hours, and `place_id` only appear when Google surfaces them on the card itself; otherwise these fields are empty/`null`.
- No website crawling, email extraction, or social link extraction.
- No full review text or sentiment.
- No photos, menus, prices, or popular times.
- No login/cookie/session-based scraping.
- Address parsing into city/state/postcode is best-effort; the full `address` field is the source of truth.
- Per-query hard cap is **500 results**; per-run hard cap is **5,000 results**.

***

### 🛠️ Technical notes

- **Stack**: Node.js 22 · Apify SDK 3 · Crawlee · Puppeteer.
- **Concurrency**: `min=1`, `max=3` (conservative to reduce blocking).
- **Memory**: 1 GB min · 2 GB default · 4 GB max.
- **Proxy**: Apify Proxy enabled by default (datacenter). **Apify Residential is rejected at startup** — use Custom proxy URLs (IPRoyal / BrightData / Oxylabs) if you need residential routing. See the Proxy policy section above.
- **Diagnostics**: On the first failed render (no feed, or feed but zero cards), the actor saves the page HTML and URL to the key-value store as `debug-no-feed-html` / `debug-zero-cards-html`.

# Actor input Schema

## `searchQueries` (type: `array`):

List of keyword + location pairs to search on Google Maps. Add one row per search - "Key" is the business keyword (e.g. plumbers), "Value" is the location (e.g. Canberra ACT). Each row becomes one search like "plumbers in Canberra ACT".

## `maxResults` (type: `integer`):

Maximum saved weak-profile rows per search query. Hard cap is 500 per query and 5000 per run.

## `country` (type: `string`):

Optional ISO country code used as a Google Maps locale hint, for example AU, US, GB. Leave empty to use the default Google locale.

## `language` (type: `string`):

Language code used for Google Maps UI (IETF BCP-47), for example en, es, de.

## `minWeaknessScore` (type: `integer`):

Save only businesses whose weakness score is at least this value (0-100). Higher = stronger weakness signals. Default 40 saves Low/Medium/High Opportunity rows; set to 0 to save everything that passes other filters.

## `weaknessMode` (type: `string`):

Biases weakness scoring (and which signals lead to filtering). "balanced" uses the default formula. "missingWebsite" boosts businesses with no website. "lowReviews" boosts businesses with few reviews. "lowRating" boosts low-rated businesses. "incompleteProfile" rewards missing fields generally.

## `websiteFilter` (type: `string`):

Filter by website availability. "any" keeps everything; "hasWebsite" keeps only businesses with a website; "missingWebsite" keeps only businesses without a website.

## `phoneFilter` (type: `string`):

Filter by phone availability. "any" keeps everything; "missingPhone" keeps only businesses with no phone; "hasPhone" keeps only businesses with a phone.

## `maxRating` (type: `number`):

When weaknessMode = lowRating, filter out businesses with a rating above this value. Range 0-5. Leave default 4.2 to target weakly-rated businesses.

## `maxReviewCount` (type: `integer`):

When weaknessMode = lowReviews, filter out businesses with more reviews than this value. Default 30 targets businesses with thin review history.

## `categoryFilter` (type: `string`):

Optional case-insensitive contains match against the business category. Leave empty to disable.

## `includeOpeningHours` (type: `boolean`):

Include opening hours summary when visible without expensive extra steps.

## `includeCoordinates` (type: `boolean`):

Include latitude/longitude when available from the listing URL.

## `enrichFromDetail` (type: `boolean`):

OFF by default. When ON, the actor opens each place's detail page to reliably capture website, phone, and full address that the results list often hides — this keeps the missing\_website / missing\_phone signals accurate. ⏱️ SLOWER: it loads one extra page per result, so runs take noticeably longer. 💲 EXTRA COST: each saved row is billed an ADDITIONAL 'weak-profile-detail-enrichment' event on top of the standard 'weak-profile-result' event (two charges per row instead of one). While this option stays OFF, the extra enrichment event is NEVER charged — you pay only the standard per-row event for fast list-only discovery. Turn it ON only when you specifically need reliable website/phone data and accept the longer runtime and extra per-row charge.

## `deduplicateResults` (type: `boolean`):

Remove duplicate businesses across queries using place\_id, listing URL, name+address, name+phone, and name+location keys.

## `proxyConfiguration` (type: `object`):

Apify Proxy configuration. Defaults to Apify Proxy enabled. Recommended for most real runs because Google Maps may rate-limit unproxied traffic.

## Actor input object example

```json
{
  "searchQueries": [
    {
      "key": "plumbers",
      "value": "Canberra ACT"
    },
    {
      "key": "electricians",
      "value": "Sydney NSW"
    }
  ],
  "maxResults": 100,
  "country": "",
  "language": "en",
  "minWeaknessScore": 40,
  "weaknessMode": "balanced",
  "websiteFilter": "any",
  "phoneFilter": "any",
  "maxRating": 4.2,
  "maxReviewCount": 30,
  "categoryFilter": "",
  "includeOpeningHours": true,
  "includeCoordinates": true,
  "enrichFromDetail": false,
  "deduplicateResults": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Flat 27-field table view of every weak-profile business row pushed to the dataset.

## `highOpportunity` (type: `string`):

Only rows scored as High Opportunity (weakness\_score >= 75).

## `missingWebsite` (type: `string`):

Only rows where the business has no website.

## `lowReviews` (type: `string`):

Only rows where the business has fewer than 30 reviews (or none).

## `lowRating` (type: `string`):

Only rows where the business rating is below 3.8 (or missing).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        {
            "key": "plumbers",
            "value": "Canberra ACT"
        },
        {
            "key": "electricians",
            "value": "Sydney NSW"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("coregent/google-maps-weak-profile-finder").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": [
        {
            "key": "plumbers",
            "value": "Canberra ACT",
        },
        {
            "key": "electricians",
            "value": "Sydney NSW",
        },
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("coregent/google-maps-weak-profile-finder").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    {
      "key": "plumbers",
      "value": "Canberra ACT"
    },
    {
      "key": "electricians",
      "value": "Sydney NSW"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call coregent/google-maps-weak-profile-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=coregent/google-maps-weak-profile-finder",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/DP0d67MR1vIcvvhNh/builds/a1vb0mC0q2cdQ8e4G/openapi.json
