12 pay-per-event data APIs: Maps, TikTok, Instagram, YouTube, LinkedIn, RAG, reviews, fuel, AEO.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Check any WEBSITE's AI visibility with a 7-criteria technical AEO audit: JSON-LD, llms.txt, AI bots in robots.txt and more. Use when you need to know if a site can be cited by ChatGPT, Perplexity or Claude — returns a 0-7 score with exact fixes plus a generated llms.txt draft. This audits ONLY the website (no Google Business Profile data, no reviews): use local_presence_audit instead when you need the full local-business picture (GBP + reviews + website) with a /100 score and sales deliverables. FREE — no per-run charge. Auth: Apify API token required (Authorization: Bearer) even though the actor itself is free. Rate limit: 60 calls/min/IP on this facade; full report returned in one response, no pagination.
Full URL of the site to audit (e.g. https://example.lu). The checker fetches the homepage, /llms.txt and /robots.txt.
Also generate a ready-to-publish llms.txt draft for the audited site (delivered in the dataset and in the key-value store as llms.txt).
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Check any WEBSITE's AI visibility with a 7-criteria technical AEO audit: JSON-LD, llms.txt, AI bots in robots.txt and more. Use when you need to know if a site can be cited by ChatGPT, Perplexity or Claude — returns a 0-7 score with exact fixes plus a generated llms.txt draft. This audits ONLY the website (no Google Business Profile data, no reviews): use local_presence_audit instead when you need the full local-business picture (GBP + reviews + website) with a /100 score and sales deliverables. FREE — no per-run charge. Auth: Apify API token required (Authorization: Bearer) even though the actor itself is free. Rate limit: 60 calls/min/IP on this facade; full report returned in one response, no pagination.
| Argument | Type | Description |
|---|---|---|
| url* | string | Full URL of the site to audit (e.g. https://example.lu). The checker fetches the homepage, /llms.txt and /robots.txt. |
| generateLlmsTxt | boolean | Also generate a ready-to-publish llms.txt draft for the audited site (delivered in the dataset and in the key-value store as llms.txt). |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"title": "Website URL",
"editor": "textfield",
"prefill": "https://adagasolutions.lu",
"description": "Full URL of the site to audit (e.g. https://example.lu). The checker fetches the homepage, /llms.txt and /robots.txt."
},
"generateLlmsTxt": {
"type": "boolean",
"title": "Generate llms.txt draft",
"editor": "checkbox",
"default": true,
"description": "Also generate a ready-to-publish llms.txt draft for the audited site (delivered in the dataset and in the key-value store as llms.txt)."
}
},
"additionalProperties": true
}Monitor public APIs and detect breaking changes by diffing OpenAPI specs and classifying changelogs — a radar for the APIs you depend on. Use when you need early warning before an API change breaks your integration. Returns change events classified by severity. Pricing: $0.50 per run + $0.005 per API checked.
| Argument | Type | Description |
|---|---|---|
| apis* | array | List of APIs to watch. For type 'openapi', url must point to a raw OpenAPI spec (JSON or YAML). For type 'github-releases', url must be 'owner/repo' or a GitHub repo URL. For type 'rss', url must be an RSS/Atom changelog feed. |
| dryRun | boolean | When true, the actor performs the full detection but does NOT charge any pay-per-event fee. Use for testing your configuration. |
| maxApis | integer | Safety cap on the number of APIs processed in one run. |
| webhookUrl | string | POST endpoint called at the end of each run with a JSON summary (counts by class + top critical changes). Slack/Discord/Teams incoming-webhook compatible payload is included. |
{
"type": "object",
"required": [
"apis"
],
"properties": {
"apis": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"type",
"url"
],
"properties": {
"url": {
"type": "string",
"title": "Source URL",
"description": "Raw spec URL, 'owner/repo', or feed URL."
},
"name": {
"type": "string",
"title": "API name",
"description": "Short identifier, e.g. 'stripe' or 'github'."
},
"type": {
"enum": [
"openapi",
"github-releases",
"rss"
],
"type": "string",
"title": "Source type",
"description": "openapi = OpenAPI spec diffed with oasdiff (most precise). github-releases = GitHub releases classified by rules. rss = RSS/Atom changelog feed classified by rules."
},
"owner": {
"type": "string",
"title": "Owner (optional)",
"description": "Team or person responsible for this API on your side — copied into output events for routing."
}
}
},
"title": "APIs to monitor",
"editor": "json",
"prefill": [
{
"url": "https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json",
"name": "github",
"type": "openapi"
},
{
"url": "https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json",
"name": "stripe",
"type": "openapi"
}
],
"description": "List of APIs to watch. For type 'openapi', url must point to a raw OpenAPI spec (JSON or YAML). For type 'github-releases', url must be 'owner/repo' or a GitHub repo URL. For type 'rss', url must be an RSS/Atom changelog feed."
},
"dryRun": {
"type": "boolean",
"title": "Dry run (no billing)",
"editor": "checkbox",
"default": true,
"description": "When true, the actor performs the full detection but does NOT charge any pay-per-event fee. Use for testing your configuration."
},
"maxApis": {
"type": "integer",
"title": "Max APIs per run",
"default": 25,
"maximum": 500,
"minimum": 1,
"description": "Safety cap on the number of APIs processed in one run."
},
"webhookUrl": {
"type": "string",
"title": "Webhook URL (optional)",
"editor": "textfield",
"description": "POST endpoint called at the end of each run with a JSON summary (counts by class + top critical changes). Slack/Discord/Teams incoming-webhook compatible payload is included."
}
},
"additionalProperties": true
}Get live fuel prices for about 10,000 gas stations across France (official open data, Hermès Revenu API). Use when comparing fuel prices, estimating route costs or building price datasets for France. Returns station objects with prices per fuel type. Pricing: $0.20 per run + $0.01 per 1k stations.
| Argument | Type | Description |
|---|---|---|
| carburant | string | Filtrer par type de carburant |
| departement | string | Filtrer par code département (ex: '75' pour Paris, '69' pour Lyon). Laissez vide pour toute la France. |
{
"type": "object",
"required": [],
"properties": {
"carburant": {
"enum": [
"",
"Gazole",
"SP95",
"SP98",
"E10",
"E85",
"GPLc"
],
"type": "string",
"title": "Type de carburant (optionnel)",
"editor": "select",
"enumTitles": [
"Tous",
"Gazole",
"SP95",
"SP98",
"E10",
"E85",
"GPLc"
],
"description": "Filtrer par type de carburant"
},
"departement": {
"type": "string",
"title": "Département (optionnel)",
"editor": "textfield",
"description": "Filtrer par code département (ex: '75' pour Paris, '69' pour Lyon). Laissez vide pour toute la France."
}
},
"additionalProperties": true
}Extract local business data from Google Maps IN BULK: names, addresses, phones, ratings, review counts, websites, GPS coordinates — up to 100 businesses per call (refine the query for narrower results). Use when you need lead lists, competitor maps or market research across a city or search query — i.e. MANY businesses as raw data, with no scoring or audit. Use local_presence_audit instead when you need a deep scored audit of ONE business (GBP + reviews + website AI-readiness + deliverables); use review_radar instead to detect only NEW reviews on businesses you already track. Returns an array of business objects, everything in one response (no pagination; truncated beyond 100 items). Auth: Apify API token required (Authorization: Bearer). Rate limit: 60 calls/min/IP on this facade. Pricing: $1.00 per run + $0.03 per business scraped.
| Argument | Type | Description |
|---|---|---|
| queries | array | Array of search queries to scrape. Use this for multiple searches in one run. |
| language | string | Language code for Google Maps results (e.g., 'fr', 'en', 'de', 'es') |
| maxResults | integer | Maximum number of businesses to extract per query |
| maxReviews | integer | Maximum number of reviews to extract per business |
| searchQuery | string | What to search on Google Maps (e.g., 'restaurants Paris', 'plumbers London', 'hotels New York') |
| includeReviews | boolean | Whether to extract user reviews for each business |
Monitor hotel rates across booking sources for revenue management. Use when tracking competitor hotel pricing or building rate intelligence. Returns rate observations per hotel and date. Micro-pricing per event.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": true
}Scrape Instagram profiles and hashtag posts: followers, posts, engagement metrics. Use when vetting influencers, monitoring brands or tracking competitors on Instagram. Returns profile objects with recent posts. Pricing: $0.01 per profile scraped.
| Argument | Type | Description |
|---|---|---|
| profiles* | array | List of Instagram usernames to scrape (without @). Example: ["nasa", "cristiano"] |
{
"type": "object",
"required": [
"profiles"
],
"properties": {
"profiles": {
"type": "array",
"title": "Instagram profiles",
"editor": "json",
"prefill": [
"nasa"
],
"description": "List of Instagram usernames to scrape (without @). Example: [\"nasa\", \"cristiano\"]"
}
},
"additionalProperties": true
}Extract public LinkedIn profile data with this scraper: name, headline, experience, company. Use when enriching B2B leads or doing recruiting research on LinkedIn. Returns structured profile objects. Pricing: $0.02 per profile scraped.
| Argument | Type | Description |
|---|---|---|
| profileUrls* | array | List of LinkedIn profile URLs to scrape (e.g., ['https://www.linkedin.com/in/williamhgates/']) |
| includeSkills | boolean | Whether to extract the skills section |
| includeExperience | boolean | Whether to extract work experience details |
{
"type": "object",
"required": [
"profileUrls"
],
"properties": {
"profileUrls": {
"type": "array",
"title": "LinkedIn Profile URLs",
"editor": "stringList",
"prefill": [
"https://www.linkedin.com/in/williamhgates/"
],
"description": "List of LinkedIn profile URLs to scrape (e.g., ['https://www.linkedin.com/in/williamhgates/'])"
},
"includeSkills": {
"type": "boolean",
"title": "Include Skills",
"default": true,
"description": "Whether to extract the skills section"
},
"includeExperience": {
"type": "boolean",
"title": "Include Experience",
"default": true,
"description": "Whether to extract work experience details"
}
},
"additionalProperties": true
}Deep audit of ONE local business's online presence in a single run: Google Business Profile data (rating, review count, category, contact), recent reviews with urgency classification and owner-response detection, website AI-readiness scan (llms.txt, JSON-LD, robots.txt AI-crawler rules), a transparent presence score /100, and ready-to-use deliverables (publishable llms.txt, LocalBusiness JSON-LD, AI-drafted review responses, prioritized action plan). Use when you need the FULL picture on one specific business — e.g. before selling it marketing services, or to check whether ChatGPT, Perplexity and Gemini can 'see' it. Use google_maps_scraper instead when you need a raw LIST of many businesses (no audit); use aeo_ai_visibility_checker instead when you only need the free website-only technical check (no Google Business data, no reviews); use review_radar instead for ongoing monitoring that flags only NEW reviews over time. Auth: Apify API token required (Authorization: Bearer). Rate limits: 60 calls/min/IP on this facade; results capped at 100 items per call, no pagination. Pricing: $1.00 per run + $0.50 per business audited.
| Argument | Type | Description |
|---|---|---|
| query | string | Business name + city used to find its Google Maps profile (e.g. 'Boulangerie Paul Mersch' or 'restaurant Esch-sur-Alzette'). The first, most relevant place is audited. Optional if websiteUrl alone is enough for you. |
| dryRun | boolean | When true, the actor runs fully but skips all pay-per-event charges. Use it for testing and integration QA. |
| language | string | Google Maps interface language code (fr, en, de...). Affects localized labels parsing. |
| maxReviews | integer | Number of most recent Google reviews to scrape and classify (urgency detection, owner-response check). Between 1 and 30. |
Fetch web pages and convert them into clean LLM-ready text for RAG pipelines. Use when an agent needs readable page content from the web without HTML noise — a lightweight browser alternative for retrieval. Returns per-page cleaned text with metadata. Pricing: $0.003 per page crawled.
| Argument | Type | Description |
|---|---|---|
| lang | string | Language code for search results (e.g. en, fr, de) |
| urls | array | Direct page URLs to extract content from (instead of searching). Example: ["https://example.com/article"] |
| query | string | Google search query. Top results are fetched and extracted. Example: 'best crm software 2026' |
| maxResults | integer | Maximum number of search results / pages to process |
| outputFormat | string | Content format: markdown (best for LLM/RAG) or plain text |
{
"type": "object",
"required": [],
"properties": {
"lang": {
"type": "string",
"title": "Search language",
"editor": "textfield",
"default": "en",
"description": "Language code for search results (e.g. en, fr, de)"
},
"urls": {
"type": "array",
"title": "URLs to extract",
"editor": "json",
"description": "Direct page URLs to extract content from (instead of searching). Example: [\"https://example.com/article\"]"
},
"query": {
"type": "string",
"title": "Search query",
"editor": "textfield",
"prefill": "apify actor monetization",
"description": "Google search query. Top results are fetched and extracted. Example: 'best crm software 2026'"
},
"maxResults": {
"type": "integer",
"title": "Max results",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Maximum number of search results / pages to process"
},
"outputFormat": {
"enum": [
"markdown",
"text"
],
"type": "string",
"title": "Output format",
"editor": "select",
"default": "markdown",
"enumTitles": [
"Markdown",
"Plain text"
],
"description": "Content format: markdown (best for LLM/RAG) or plain text"
}
},
"additionalProperties": true
}Generate pre-sales reports from a business's worst Google Maps reviews: HTML report plus ready-to-send pitch. Use when doing agency outbound and you want to show prospects their visible bad reviews. Use review_radar instead to monitor for NEW reviews over time; use local_presence_audit instead for a full presence audit with score and marketing deliverables; use google_maps_scraper instead for raw bulk business lists. Returns pitch text and a shareable report URL per business. SIDE EFFECT: can email the pitch directly to prospects via your own SMTP account, but ONLY when you explicitly set sendApproval: true AND provide smtpUser/smtpPassword — with default settings it sends nothing and only generates reports. Outbound sends are rate-limited: max 5 emails per run (configurable), 20 s between sends, 20 emails/day global cap. Auth: Apify API token required (Authorization: Bearer). Facade rate limit: 60 calls/min/IP. Pricing: $0.25 per run + $0.10 per pitch generated.
| Argument | Type | Description |
|---|---|---|
| mode | string | generate = scrape + pitch + delivery. check-engagement = IMAP reply watch only (no Maps scraping, runs even under Google rate-limit) |
| query | string | Google Maps search, e.g. 'restaurants Esch-sur-Alzette' — takes the first maxPlaces results. Ignored if placeUrls is non-empty. |
| dryRun | boolean | Testing mode: skips report publishing and billing events |
| emailMap | object | Mapping place name or Maps URL -> recipient email for outbound delivery. Only used when sendApproval is true. |
| smtpUser | string | Gmail address used to send reports (requires an app password). Secret input. |
Monitor Google Maps reviews and detect only NEW ones since previous runs (stateful tracking per business), with Bayesian urgency classification and optional Slack alerts — your reputation radar. Use when tracking review activity OVER TIME for businesses you already know. Use google_maps_scraper instead for one-shot bulk extraction of business data; use review_pitch_generator instead to turn existing bad reviews into a sales pitch and shareable report; use local_presence_audit instead for a one-time full presence audit. Returns review objects flagged isNew with urgency scores. Side effects: sends a Slack notification ONLY if you provide your own Slack webhook URL in the input — no messages are sent otherwise. Auth: Apify API token required (Authorization: Bearer). Rate limit: 60 calls/min/IP on this facade. Pricing: $0.25 per run + $0.01 per new review.
| Argument | Type | Description |
|---|---|---|
| query | string | Google Maps search, e.g. 'restaurants Esch-sur-Alzette' — takes the first maxPlaces results. Ignored if placeUrls is non-empty. |
| dryRun | boolean | Testing mode: skips Slack alerts, state writes, and billing events |
| maxPlaces | integer | How many businesses to monitor (from placeUrls or the search query) |
| placeUrls | array | Google Maps place URLs (/maps/place/...) to monitor |
| alertThreshold | integer | New reviews with this rating or lower trigger a Slack alert |
| slackConnector | string | MCP connector to your Slack workspace. Authorize once in Apify Console → Settings → Integrations. The Actor only sees a connector ID. Leave empty to skip alerts (dataset only). |
Scrape TikTok profiles and videos: follower counts, likes, video metadata and stats. Use when researching influencers, tracking social engagement or analyzing TikTok content. Returns profile and video objects. Pricing: $0.01 per profile + $0.002 per video.
| Argument | Type | Description |
|---|---|---|
| hashtags | array | List of hashtags to scrape trending videos from (without #) |
| profiles* | array | List of TikTok usernames or profile URLs to scrape (e.g., ['mrbeast', 'https://www.tiktok.com/@charlidamelio']) |
| maxVideosPerProfile | integer | Maximum number of videos to extract per profile |
{
"type": "object",
"required": [
"profiles"
],
"properties": {
"hashtags": {
"type": "array",
"title": "Hashtags",
"editor": "stringList",
"description": "List of hashtags to scrape trending videos from (without #)"
},
"profiles": {
"type": "array",
"title": "TikTok Profiles",
"editor": "stringList",
"prefill": [
"mrbeast",
"charlidamelio"
],
"description": "List of TikTok usernames or profile URLs to scrape (e.g., ['mrbeast', 'https://www.tiktok.com/@charlidamelio'])"
},
"maxVideosPerProfile": {
"type": "integer",
"title": "Max Videos per Profile",
"default": 10,
"maximum": 100,
"minimum": 0,
"description": "Maximum number of videos to extract per profile"
}
},
"additionalProperties": true
}Scrape YouTube videos and channels: views, subscribers, metadata, descriptions. Use when researching content trends, analyzing creators or building YouTube datasets. Returns video and channel objects. Pricing: $0.002 per video scraped.
| Argument | Type | Description |
|---|---|---|
| videoUrls | array | YouTube video URLs or IDs to scrape. Supports youtube.com/watch, youtu.be, and /shorts/ formats. |
| maxResults | integer | Maximum number of results per search query (1-50) |
| channelUrls | array | YouTube channel URLs to scrape. Supports @handle, /channel/, and /c/ formats. |
| searchQueries | array | Search YouTube for videos matching these queries. Returns top results with full video data. |
{
"type": "object",
"required": [],
"properties": {
"videoUrls": {
"type": "array",
"title": "Video URLs",
"editor": "stringList",
"prefill": [
"https://www.youtube.com/watch?v=dQw4w9WgXcQ"
],
"description": "YouTube video URLs or IDs to scrape. Supports youtube.com/watch, youtu.be, and /shorts/ formats."
},
"maxResults": {
"type": "integer",
"title": "Max Results per Search",
"editor": "number",
"default": 10,
"maximum": 50,
"minimum": 1,
"prefill": 10,
"description": "Maximum number of results per search query (1-50)"
},
"channelUrls": {
"type": "array",
"title": "Channel URLs",
"editor": "stringList",
"prefill": [],
"description": "YouTube channel URLs to scrape. Supports @handle, /channel/, and /c/ formats."
},
"searchQueries": {
"type": "array",
"title": "Search Queries",
"editor": "stringList",
"prefill": [],
"description": "Search YouTube for videos matching these queries. Returns top results with full video data."
}
},
"additionalProperties": true
}| proxyConfiguration | object | Proxy settings. Residential proxies are recommended for Google Maps. |
{
"type": "object",
"required": [],
"properties": {
"queries": {
"type": "array",
"title": "Multiple Search Queries",
"editor": "json",
"prefill": [
"restaurants Paris",
"hotels Lyon"
],
"description": "Array of search queries to scrape. Use this for multiple searches in one run."
},
"language": {
"type": "string",
"title": "Language",
"editor": "textfield",
"default": "fr",
"description": "Language code for Google Maps results (e.g., 'fr', 'en', 'de', 'es')"
},
"maxResults": {
"type": "integer",
"title": "Maximum Results",
"default": 20,
"maximum": 500,
"minimum": 1,
"description": "Maximum number of businesses to extract per query"
},
"maxReviews": {
"type": "integer",
"title": "Max Reviews per Business",
"default": 5,
"maximum": 100,
"minimum": 0,
"description": "Maximum number of reviews to extract per business"
},
"searchQuery": {
"type": "string",
"title": "Search Query",
"editor": "textfield",
"prefill": "restaurants Paris",
"description": "What to search on Google Maps (e.g., 'restaurants Paris', 'plumbers London', 'hotels New York')"
},
"includeReviews": {
"type": "boolean",
"title": "Include Reviews",
"default": true,
"description": "Whether to extract user reviews for each business"
},
"proxyConfiguration": {
"type": "object",
"title": "Proxy configuration",
"editor": "proxy",
"prefill": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
},
"description": "Proxy settings. Residential proxies are recommended for Google Maps."
}
},
"additionalProperties": true
}| websiteUrl | string | Full URL of the business website (e.g. https://example.lu). Scanned without a browser for AI-readiness: JSON-LD structured data, LocalBusiness schema, meta description, H1, Open Graph, /llms.txt, and robots.txt rules for AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot). |
| proxyConfiguration | object | Apify proxy settings. Residential proxies are strongly recommended — Google Maps blocks datacenter IPs. Defaults to RESIDENTIAL. |
{
"type": "object",
"required": [],
"properties": {
"query": {
"type": "string",
"title": "Business search query",
"editor": "textfield",
"prefill": "restaurant Esch-sur-Alzette",
"description": "Business name + city used to find its Google Maps profile (e.g. 'Boulangerie Paul Mersch' or 'restaurant Esch-sur-Alzette'). The first, most relevant place is audited. Optional if websiteUrl alone is enough for you."
},
"dryRun": {
"type": "boolean",
"title": "Dry run (no billing events)",
"editor": "checkbox",
"default": false,
"prefill": true,
"description": "When true, the actor runs fully but skips all pay-per-event charges. Use it for testing and integration QA."
},
"language": {
"type": "string",
"title": "Interface language",
"editor": "textfield",
"default": "fr",
"description": "Google Maps interface language code (fr, en, de...). Affects localized labels parsing."
},
"maxReviews": {
"type": "integer",
"title": "Max reviews to analyze",
"editor": "number",
"default": 15,
"maximum": 30,
"minimum": 1,
"prefill": 5,
"description": "Number of most recent Google reviews to scrape and classify (urgency detection, owner-response check). Between 1 and 30."
},
"websiteUrl": {
"type": "string",
"title": "Business website URL",
"editor": "textfield",
"prefill": "https://adagasolutions.lu",
"description": "Full URL of the business website (e.g. https://example.lu). Scanned without a browser for AI-readiness: JSON-LD structured data, LocalBusiness schema, meta description, H1, Open Graph, /llms.txt, and robots.txt rules for AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot)."
},
"proxyConfiguration": {
"type": "object",
"title": "Proxy configuration",
"editor": "proxy",
"prefill": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
},
"description": "Apify proxy settings. Residential proxies are strongly recommended — Google Maps blocks datacenter IPs. Defaults to RESIDENTIAL."
}
},
"additionalProperties": true
}| vertical | string | Sector template for pitch/report: chr (hotels/restaurants), immobilier, sante, artisanat |
| maxPlaces | integer | How many prospects to analyze |
| placeUrls | array | Google Maps place URLs (/maps/place/...) of the prospects to analyze |
| sendApproval | boolean | Explicit approval gate: without it, NO email is ever sent (reports are generated only) |
| smtpPassword | string | Gmail app password for the SMTP user. Secret input, never logged. |
| worstThreshold | integer | Reviews at or below this rating are included in the pitch report |
| maxEmailsPerRun | integer | Rate limit: maximum reports emailed in one run (plus 20s inter-send delay and a 20/day global cap) |
| telemetryEndpoint | string | Base URL of our tracking receiver (e.g. https://track.example.com). Embeds an HMAC-signed 1px pixel in each HTML report; opens trigger CONVERSION_RECORDED. |
| maxReviewsPerPlace | integer | How many recent reviews to scan per business when looking for the worst |
| proxyConfiguration | object | A residential proxy is strongly recommended — Google Maps blocks datacenter IPs. |
{
"type": "object",
"required": [],
"properties": {
"mode": {
"enum": [
"generate",
"check-engagement"
],
"type": "string",
"title": "Mode",
"editor": "select",
"default": "generate",
"description": "generate = scrape + pitch + delivery. check-engagement = IMAP reply watch only (no Maps scraping, runs even under Google rate-limit)"
},
"query": {
"type": "string",
"title": "Search query (alternative)",
"editor": "textfield",
"prefill": "restaurants Luxembourg",
"description": "Google Maps search, e.g. 'restaurants Esch-sur-Alzette' — takes the first maxPlaces results. Ignored if placeUrls is non-empty."
},
"dryRun": {
"type": "boolean",
"title": "Dry run",
"editor": "checkbox",
"default": false,
"prefill": true,
"description": "Testing mode: skips report publishing and billing events"
},
"emailMap": {
"type": "object",
"title": "Email map (optional)",
"editor": "json",
"description": "Mapping place name or Maps URL -> recipient email for outbound delivery. Only used when sendApproval is true."
},
"smtpUser": {
"type": "string",
"title": "SMTP user (optional, secret)",
"editor": "textfield",
"isSecret": true,
"description": "Gmail address used to send reports (requires an app password). Secret input."
},
"vertical": {
"enum": [
"chr",
"immobilier",
"sante",
"artisanat"
],
"type": "string",
"title": "Vertical",
"editor": "select",
"default": "chr",
"description": "Sector template for pitch/report: chr (hotels/restaurants), immobilier, sante, artisanat"
},
"maxPlaces": {
"type": "integer",
"title": "Max places",
"editor": "number",
"default": 5,
"maximum": 20,
"minimum": 1,
"prefill": 2,
"description": "How many prospects to analyze"
},
"placeUrls": {
"type": "array",
"title": "Place URLs",
"editor": "stringList",
"default": [],
"description": "Google Maps place URLs (/maps/place/...) of the prospects to analyze"
},
"sendApproval": {
"type": "boolean",
"title": "Approve sending (required for outbound)",
"editor": "checkbox",
"default": false,
"description": "Explicit approval gate: without it, NO email is ever sent (reports are generated only)"
},
"smtpPassword": {
"type": "string",
"title": "SMTP app password (optional, secret)",
"editor": "textfield",
"isSecret": true,
"description": "Gmail app password for the SMTP user. Secret input, never logged."
},
"worstThreshold": {
"type": "integer",
"title": "Worst threshold (stars)",
"editor": "number",
"default": 3,
"maximum": 5,
"minimum": 1,
"description": "Reviews at or below this rating are included in the pitch report"
},
"maxEmailsPerRun": {
"type": "integer",
"title": "Max emails per run",
"editor": "number",
"default": 5,
"maximum": 20,
"minimum": 1,
"description": "Rate limit: maximum reports emailed in one run (plus 20s inter-send delay and a 20/day global cap)"
},
"telemetryEndpoint": {
"type": "string",
"title": "Telemetry endpoint (optional)",
"editor": "textfield",
"description": "Base URL of our tracking receiver (e.g. https://track.example.com). Embeds an HMAC-signed 1px pixel in each HTML report; opens trigger CONVERSION_RECORDED."
},
"maxReviewsPerPlace": {
"type": "integer",
"title": "Max reviews per place",
"editor": "number",
"default": 15,
"maximum": 50,
"minimum": 5,
"prefill": 5,
"description": "How many recent reviews to scan per business when looking for the worst"
},
"proxyConfiguration": {
"type": "object",
"title": "Proxy configuration",
"editor": "proxy",
"description": "A residential proxy is strongly recommended — Google Maps blocks datacenter IPs."
}
},
"additionalProperties": true
}| maxReviewsPerPlace | integer | How many recent reviews to scrape per business |
| proxyConfiguration | object | A residential proxy is strongly recommended — Google Maps blocks datacenter IPs. |
{
"type": "object",
"required": [],
"properties": {
"query": {
"type": "string",
"title": "Search query (alternative)",
"editor": "textfield",
"prefill": "restaurant Esch-sur-Alzette",
"description": "Google Maps search, e.g. 'restaurants Esch-sur-Alzette' — takes the first maxPlaces results. Ignored if placeUrls is non-empty."
},
"dryRun": {
"type": "boolean",
"title": "Dry run",
"editor": "checkbox",
"default": false,
"prefill": true,
"description": "Testing mode: skips Slack alerts, state writes, and billing events"
},
"maxPlaces": {
"type": "integer",
"title": "Max places",
"editor": "number",
"default": 3,
"maximum": 20,
"minimum": 1,
"prefill": 1,
"description": "How many businesses to monitor (from placeUrls or the search query)"
},
"placeUrls": {
"type": "array",
"title": "Place URLs",
"editor": "stringList",
"default": [],
"description": "Google Maps place URLs (/maps/place/...) to monitor"
},
"alertThreshold": {
"type": "integer",
"title": "Alert threshold (stars)",
"editor": "number",
"default": 3,
"maximum": 5,
"minimum": 1,
"description": "New reviews with this rating or lower trigger a Slack alert"
},
"slackConnector": {
"type": "string",
"title": "Slack connector (optional)",
"mcpServers": [
{
"url": "*",
"tools": {
"readOnly": false,
"required": [
"*message*",
"*chat*",
"*post*",
"*send*"
]
}
}
],
"description": "MCP connector to your Slack workspace. Authorize once in Apify Console → Settings → Integrations. The Actor only sees a connector ID. Leave empty to skip alerts (dataset only).",
"resourceType": "mcpConnector"
},
"maxReviewsPerPlace": {
"type": "integer",
"title": "Max reviews per place",
"editor": "number",
"default": 10,
"maximum": 50,
"minimum": 1,
"prefill": 5,
"description": "How many recent reviews to scrape per business"
},
"proxyConfiguration": {
"type": "object",
"title": "Proxy configuration",
"editor": "proxy",
"description": "A residential proxy is strongly recommended — Google Maps blocks datacenter IPs."
}
},
"additionalProperties": true
}