# GEO Prompt Research — AI Visibility Prompt Panel Builder (`memo23/geo-prompt-research`) Actor

Discover and prioritize buyer questions into reusable, versioned prompt panels for AI visibility tracking and generative engine optimization (GEO). JSON or CSV out.

- **URL**: https://apify.com/memo23/geo-prompt-research.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 scraped items

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## GEO Prompt Research — AI Visibility Prompt Panel Builder

<p align="center"><img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/geo-prompt-logo.png" width="140" alt="GEO Prompt Research"></p>

Discover and prioritize buyer questions into reusable, versioned prompt panels for AI visibility tracking and generative engine optimization (GEO). Feed seed keywords, get back a deduplicated, prioritized panel of prompts ready to track across ChatGPT, Gemini, Perplexity, and Google AI Overviews.

***

### Why use this tool

- **Real buyer questions.** Pulls related queries from DuckDuckGo's autocomplete API — what people actually search for.
- **Question variants.** Generates question-form prompts (what/how/best/is/why/when/where/which) from each keyword and its related queries.
- **Deduplicated.** Every prompt is unique — no duplicates across keywords or sources.
- **Prioritized.** Seed keywords rank first, then related searches, then question variants.
- **Versioned panels.** Each run produces a panel with a unique ID and version label, so you can track the same prompts over time and compare AI visibility month over month.

***

### Overview

This actor takes seed keywords, discovers related buyer questions via DuckDuckGo's autocomplete API, generates question-form variants, deduplicates everything, and outputs a versioned prompt panel. Each row is a single prompt with its source (seed, related-search, or question-variant) and the seed keyword it came from.

The output feeds directly into AI visibility trackers — run the panel against ChatGPT, Gemini, Perplexity, and Google AI Overviews to measure brand mentions over time.

***

### Use cases

- **AI visibility tracking** — build a prompt panel, then track brand mentions across AI engines.
- **Generative engine optimization (GEO)** — discover what questions buyers ask, then optimize content to answer them.
- **Content research** — find real buyer questions to inform blog posts, FAQs, and landing pages.
- **Prompt versioning** — run the same panel monthly to track how AI visibility changes over time.

***

### How it works

<p align="center"><img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-geo-prompt.png" width="900" alt="How it works"></p>

1. You provide seed keywords.
2. The actor queries DuckDuckGo's autocomplete API for related queries.
3. It generates question variants (what/how/best/is/why/when/where/which) from each keyword and its related queries.
4. It deduplicates and prioritizes all prompts (seed > related-search > question-variant).
5. Each prompt becomes one row in a versioned prompt panel.

***

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `keywords` | array | — | Seed keywords to research. |
| `maxPromptsPerKeyword` | integer | 50 | Max prompts to generate per keyword. |
| `includeQuestions` | boolean | true | Generate question variants (what/how/best/...). |
| `panelVersion` | string | `1.0` | Version label for this panel (for tracking changes). |
| `proxy` | object | Apify proxy | Proxy configuration. |

```json
{
  "keywords": ["coffee maker", "CRM software"],
  "maxPromptsPerKeyword": 50,
  "panelVersion": "2026-10"
}
```

***

### Output

One row per prompt:

```json
{
  "type": "prompt",
  "panelId": "panel-1727989200000",
  "panelVersion": "2026-10",
  "prompt": "best coffee maker machine",
  "seedKeyword": "coffee maker",
  "source": "related-search",
  "createdAt": "2026-10-03T22:30:00.000Z"
}
```

#### Key output fields

- **`panelId`** — unique ID shared by all prompts in this run. Use it to group prompts into a panel.
- **`panelVersion`** — version label you set (e.g. `2026-10`). Track the same panel over time.
- **`prompt`** — the buyer question or search query.
- **`seedKeyword`** — the seed keyword this prompt was derived from.
- **`source`** — `seed` (the keyword itself), `related-search` (from DDG autocomplete), or `question-variant` (generated).

***

### FAQ

**How does it find buyer questions?**
It queries DuckDuckGo's autocomplete API, which returns the most common search completions for each keyword — what people actually type.

**What are question variants?**
For each keyword and related search, the actor generates question-form prompts by prepending common question words (what, how, best, is, why, when, where, which, can, should, do, does). These are the prompts buyers ask AI engines.

**How do I use the output?**
Feed the `prompt` field into an AI visibility tracker (like `memo23/ai-visibility-tracker`) to measure brand mentions across ChatGPT, Gemini, Perplexity, and Google AI Overviews.

**Can I track the same panel over time?**
Yes — set `panelVersion` to a date label (e.g. `2026-10`) and re-run monthly. The `panelId` groups prompts within a run; the `panelVersion` lets you compare across runs.

***

### ⚠️ Disclaimer

This Actor uses DuckDuckGo's public autocomplete API to discover related search queries. It does not access authenticated or private content. You are responsible for using the output in line with DuckDuckGo's terms and any applicable law in your jurisdiction.

***

### SEO Keywords

geo prompt research, ai visibility prompts, prompt panel builder, generative engine optimization, geo seo, ai search optimization, buyer question research, prompt discovery, ai visibility tracking, chatgpt visibility, gemini visibility, perplexity visibility, prompt versioning, ai seo prompts, llm optimization, generative search optimization, ai answer tracking, brand visibility ai, prompt monitoring, ai search visibility

# Actor input Schema

## `keywords` (type: `array`):

Keywords to research buyer questions for. One SERP fetch per keyword.

## `maxPromptsPerKeyword` (type: `integer`):

Maximum prompts to generate per seed keyword.

## `includeQuestions` (type: `boolean`):

Generate question variants (what/how/best/is/why/when/where/which) from related searches.

## `panelVersion` (type: `string`):

Version label for this prompt panel (for tracking changes over time).

## `proxy` (type: `object`):

Apify proxy to use.

## Actor input object example

```json
{
  "keywords": [
    "coffee maker",
    "CRM software"
  ],
  "maxPromptsPerKeyword": 50,
  "includeQuestions": true,
  "panelVersion": "1.0",
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "keywords": [
        "coffee maker",
        "CRM software"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/geo-prompt-research").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 = { "keywords": [
        "coffee maker",
        "CRM software",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/geo-prompt-research").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "keywords": [
    "coffee maker",
    "CRM software"
  ]
}' |
apify call memo23/geo-prompt-research --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/geo-prompt-research"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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