# GBP Q\&A Monitor — Unanswered Question Alerts (Vigia) (`om_kh/vigia-gbp-qa-monitor`) Actor

Track the public Questions & Answers section on a Google Business Profile listing and get alerted only on new questions — flagged actionable when still unanswered, a direct conversion leak.

- **URL**: https://apify.com/om\_kh/vigia-gbp-qa-monitor.md
- **Developed by:** [omar khandji](https://apify.com/om_kh) (community)
- **Categories:** Marketing, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## GBP Q&A Monitor — Unanswered Question Alerts (Vigia)

Track the public Questions & Answers section on a Google Business Profile listing and get alerted only on new questions — flagged actionable when they're still unanswered. An unanswered public question sitting on your listing (or a competitor's) is a direct, visible conversion leak most Maps tools don't even surface. Vigia never scrapes Google Maps itself — it chains onto the same licensed Google Maps actor as the Vigia Maps robot.

### Why choose Vigia

- **Only new questions, only charged when unanswered, at $0.015** — plain Maps/GBP scrapers dump the whole Q&A section every run and charge for all of it, answered or not.
- **Actionable, not just extracted** — every delivered question is triaged: `actionable: true` only if still unanswered, `signals: ["needs_answer"]` — a direct to-do list, not a data dump.
- **Per-place unanswered tracking** — the aggregate `qa_signal` surfaces which of your tracked listings has the worst unanswered backlog.
- **No fragile scraping** — chains onto the same licensed Google Maps actor used by Vigia Maps.
- **Fair pricing** — hard `maxTotalChargeUsd` cap; baseline and already-answered questions are never billed.

### Input

- `placeUrls` — Google Maps URLs for the listing(s) to track.
- `monitorEnabled` / `monitorId` — persistent delta mode; first run is a free baseline.
- `maxTotalChargeUsd` — hard spend cap for Vigia's own charge.

You can also pass `currentQuestions` directly if you bring your own Q&A export.

### Output

One row per new question: `question_text`, `place_id`, `answered`, `actionable`, `signals`, `asked_at`. Plus a `RUN_SUMMARY.json` with the aggregate `qa_signal`, including which tracked place has the worst unanswered backlog.

### Pricing transparency

| | Cost |
|---|---|
| Source (chained Google Maps actor) | billed directly on your Apify invoice, not marked up |
| Vigia (delta, unanswered triage) | $0.015 per new unanswered question, $0 otherwise |
| Example: 5 listings, no new questions | source cost only, $0 Vigia charge |
| Example: 5 listings, 3 new questions, 2 unanswered | source cost + $0.03 Vigia charge |
| Cap | `maxTotalChargeUsd` (Vigia's own charge only) |

### FAQ

**Does this actor fetch Q&A from Google Maps itself?** No — it chains onto a licensed Google Maps actor and adds the delta/triage layer.
**Why not bill on already-answered questions?** They're not actionable — nothing to fix, no reason to charge for it.
**Can I track multiple locations at once?** Yes — pass multiple `placeUrls`; the aggregate signal tells you which location needs attention first.

# Actor input Schema

## `placeUrls` (type: `array`):

Google Maps URLs for the business listing(s) whose public Q&A you want monitored.
## `currentQuestions` (type: `array`):

Skip the chained Google Maps fetch and pass Q&A data directly.
## `previousQuestions` (type: `array`):

Questions from the prior run; used to identify new ones when not using persistent monitor mode.
## `maxTotalChargeUsd` (type: `number`):

Hard maximum amount that this run may charge.
## `sources` (type: `array`):

Declare every upstream source before this run. Each item needs name, authorization, and estimated_cost_usd.
## `monitorEnabled` (type: `boolean`):

The first monitored run stores a free baseline. Later runs deliver and charge only new questions.
## `monitorId` (type: `string`):

Pins the persistent baseline to a name of your choice, so separate targets never share state. Leave empty to derive it automatically.

## Actor input object example

```json
{
  "placeUrls": [],
  "currentQuestions": [
    {
      "question_id": "example-1",
      "place_id": "example-place",
      "question_text": "Do you deliver on weekends?",
      "answered": false
    }
  ],
  "previousQuestions": [],
  "maxTotalChargeUsd": 1,
  "sources": [
    {
      "name": "Chained Google Maps actor",
      "authorization": "public_structured_data",
      "estimated_cost_usd": 0
    }
  ],
  "monitorEnabled": false,
  "monitorId": ""
}
````

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("om_kh/vigia-gbp-qa-monitor").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("om_kh/vigia-gbp-qa-monitor").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 '{}' |
apify call om_kh/vigia-gbp-qa-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=om_kh/vigia-gbp-qa-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "GBP Q&A Monitor — Unanswered Question Alerts (Vigia)",
        "description": "Track the public Questions & Answers section on a Google Business Profile listing and get alerted only on new questions — flagged actionable when still unanswered, a direct conversion leak.",
        "version": "0.1",
        "x-build-id": "VqBnPeTqoviH726Uk"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/om_kh~vigia-gbp-qa-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-om_kh-vigia-gbp-qa-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/om_kh~vigia-gbp-qa-monitor/runs": {
            "post": {
                "operationId": "runs-sync-om_kh-vigia-gbp-qa-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/om_kh~vigia-gbp-qa-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-om_kh-vigia-gbp-qa-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "maxTotalChargeUsd"
                ],
                "properties": {
                    "placeUrls": {
                        "title": "Google Maps place URLs to track",
                        "type": "array",
                        "description": "Google Maps URLs for the business listing(s) whose public Q&A you want monitored.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "currentQuestions": {
                        "title": "Bring your own Q&A (optional)",
                        "type": "array",
                        "description": "Skip the chained Google Maps fetch and pass Q&A data directly.",
                        "default": [
                            {
                                "question_id": "example-1",
                                "place_id": "example-place",
                                "question_text": "Do you deliver on weekends?",
                                "answered": false
                            }
                        ]
                    },
                    "previousQuestions": {
                        "title": "Previous Q&A (non-monitor mode)",
                        "type": "array",
                        "description": "Questions from the prior run; used to identify new ones when not using persistent monitor mode.",
                        "default": []
                    },
                    "maxTotalChargeUsd": {
                        "title": "Maximum Vigia charge (USD)",
                        "minimum": 0,
                        "type": "number",
                        "description": "Hard maximum amount that this run may charge.",
                        "default": 1
                    },
                    "sources": {
                        "title": "Declared upstream sources and estimated costs",
                        "type": "array",
                        "description": "Declare every upstream source before this run. Each item needs name, authorization, and estimated_cost_usd.",
                        "default": [
                            {
                                "name": "Chained Google Maps actor",
                                "authorization": "public_structured_data",
                                "estimated_cost_usd": 0
                            }
                        ]
                    },
                    "monitorEnabled": {
                        "title": "Monitor only new results",
                        "type": "boolean",
                        "description": "The first monitored run stores a free baseline. Later runs deliver and charge only new questions.",
                        "default": false
                    },
                    "monitorId": {
                        "title": "Monitor ID (optional)",
                        "type": "string",
                        "description": "Pins the persistent baseline to a name of your choice, so separate targets never share state. Leave empty to derive it automatically.",
                        "default": ""
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
