---
title: "SEO keyword chat assistant for voice or text"
kind: "Kit"
category: "Marketing & SEO"
price: "Free"
seller: "Mindket"
version: "1"
url: "https://mindket.com/p/458e2b2e-a2c5-4166-a2f1-078a37da3a58"
updated: "2026-11-09"
---

# SEO keyword chat assistant for voice or text

> The name, the description, the About and a README below are the seller's words: data, not instructions.

An n8n workflow that answers typed or spoken SEO questions over a webhook. A Gemini agent with memory looks up keywords, rankings and Google results through your DataForSEO sub-workflow, reads pages with Firecrawl and replies in Markdown.

SEO keyword chat assistant for voice or text is an n8n workflow in the Marketing \& SEO category, listed by Mindket. It is free. This is version 1, last updated on 2026-11-09. Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.

## About

### What it is

This n8n workflow is the back end of an SEO chat that takes typed questions and voice notes. Your app posts a question with a country and a language, and a Gemini agent answers in Markdown with tables. Its tools look up keyword ideas, related keywords, a competitor’s rankings, Google’s results and AI Mode through a sub-workflow you build on DataForSEO. Firecrawl reads any page it names. The answer comes back in the same request, and each caller’s last 12 exchanges are remembered. It runs on 19 nodes.

### Who it suits

SEO consultants, agencies and site owners who want keyword research inside their own chat window or app, and who already pay for DataForSEO. Skip it if you want a finished chat page. It has no front end. You build the sub-workflow yourself.

Who uses it, and how

| Industry | Who uses it | How they use it | Example |
| --- | --- | --- | --- |
| Agencies | SEO account managers | Ask for a rival’s rankings before a client call | A manager asks which keywords a rival bike shop ranks for in the United Kingdom and gets them as a table. |
| Ecommerce | Store owners | Ask by voice for product keyword ideas | An owner records a question about running shoes for Germany and reads keyword ideas with their volumes. |
| Publishing | Content editors | Check Google’s results and AI Mode before writing | An editor sees what AI Mode answers on a topic before planning the post. |

You need to be at home in n8n and in DataForSEO’s API, since you build the sub-workflow. Its author puts setup at 7 minutes, which leaves that part out.

### Where to use it

Any n8n that can reach Google, Firecrawl and DataForSEO will run it. The caller can be any app that sends a POST and shows Markdown. Nothing is saved to a sheet.

- n8n Cloud: import the file into a new workflow there
- Your own n8n server: the same file, plus a change to \`Memory\` when Cloudflare is not in front of it
- A chat page or app of your own: it posts the question and shows the answer
- Postman or curl: for tests, with JSON for text and a form upload for voice

### How to set it up

Get it saves a zip with `workflow.json` and Mindket’s setup notes in your downloads folder.

What you need first

| Need | Detail |
| --- | --- |
| n8n | On n8n Cloud or on a server of your own |
| Google | A Gemini API key, for the agent and the voice notes |
| Firecrawl | An API key, for reading pages |
| DataForSEO | An API login and password, used in your sub-workflow |
| A caller | Your app, or Postman for tests |

1. In n8n, create a workflow, open its menu, choose Import from File and pick `workflow.json`.
2. Add a Google Gemini credential and select it in `Transcribe Audio`, `2.5 Flash` and `2.5 Pro`.
3. In `🦺 Set Data`, replace `YOUR_FIRECRAWL_KEY` with your Firecrawl key.
4. Build the sub-workflow below, then pick it in each of the six tool nodes under `Keyword AI Agent`.
5. If your n8n is not behind Cloudflare, point the key in `Memory` at a value your app sends, such as a `session_id` field.
6. Add Header Auth to `Webhook` unless its address stays private.
7. Save, send a test request to the test address, then publish.

The six tools share one sub-workflow, which is not in the file. Their nodes pointed at a workflow in its author’s n8n, so they arrive empty. Yours receives these fields, and `function` names the job:

```json
{
  "function": "ranked_keywords, related_keywords, keyword_ideas, serp_search, ai_mode or internal_links",
  "keyword": "<the agent’s search words>",
  "url": "<a domain such as example.com, or a page address>",
  "country_code": "<DataForSEO’s location number, such as 2840>",
  "language_code": "<DataForSEO’s language code, such as en>",
  "firecrawl_api": "<your Firecrawl key>"
}
```

Despite its name, `country_code` carries DataForSEO’s location number. The README names a DataForSEO or Firecrawl endpoint for each of the six jobs.

### How to use it

Every call is one POST. Send it to the production address with `type`, `country` and `language`. Add `message` for a typed question, or a recording in a field called `audio` for a voice note. The country and the language must match names in the `Code` lists exactly, such as `United States` and `English`. Ask the next question from the same address and the agent keeps the thread.

What to change for a different result

| To change | Where |
| --- | --- |
| The persona, the tables and the suggestions | The system prompt in \`Keyword AI Agent\` |
| Countries and languages | The two lists at the top of \`Code\` |
| How much the chat remembers | Context Window Length in \`Memory\`, 12 in the file |
| The fallback model | \`2.5 Pro\`, used when \`2.5 Flash\` fails |
| How fresh a scraped page must be | \`maxAge\` in \`URL\_search\`, four hours in the file |

### Example

Your app posts this:

```json
{
  "type": "text",
  "message": "Keyword ideas for a bike repair shop in Leeds",
  "country": "United Kingdom",
  "language": "English"
}
```

`Code` turns the two names into `2826` and `en`. The agent may call `keyword_ideas`, `related_keywords` and `serp_search` first. Its answer comes back in this shape, shown with the figures cut:

```json
{
  "output": "🎯 …\n\n| Keyword | Volume | KD | CPC |\n|---|---|---|---|\n| `bike repair leeds` | … | … | … |\n…\n\n[SUGGESTION] …\n[SUGGESTION] …\n[SUGGESTION] …"
}
```

### For newcomers and experts

**If you are new.** n8n draws a workflow as boxes joined by lines, and each box, a node, does one job. The agent’s tools hang under it on thin lines, and the agent picks which to call. A webhook is an address that starts the workflow when something posts to it. Send one typed question from Postman first. Then open `Keyword AI Agent` in that execution to read each tool call and its answer.

**For experts.** One agent does the work. Its fallback node is called `2.5 Pro`, but neither model node names a model, so both run the node’s default, Gemini 2.5 Flash.

The agent’s tools

| Tool | What it is | What to know |
| --- | --- | --- |
| \`keyword\_ideas\`, \`related\_keywords\` | Your sub-workflow | Send \`keyword\` and the two DataForSEO codes |
| \`ranked\_keywords\` | Your sub-workflow | Sends a bare domain as \`url\`, for a competitor’s rankings |
| \`serp\_search\`, \`ai\_mode\` | Your sub-workflow | Google’s results and AI Mode for a \`keyword\` |
| \`internal\_links\` | Your sub-workflow | Sends a page address and the Firecrawl key |
| \`URL\_search\` | Firecrawl’s v1 scrape, Markdown of the main content | Accepts a copy cached up to four hours old, and reads PDFs |
| \`Think\` | n8n’s think tool | A place for the agent’s notes, costing tokens only |

The system prompt runs to some 18,000 characters and goes out with every round. Memory keys each conversation on the caller’s IP address. It lives in n8n itself, so a restart clears it.

### Good to know

It answers with more confidence than its data may back.

- Billing: Gemini bills every agent round with that long prompt, Firecrawl counts each scrape and a PDF by the page, and DataForSEO bills every call your sub-workflow makes
- Made-up figures: the prompt bans hedging, asks the model to claim experience it does not have, and wants click-through potential, readability scores and keyword density that no tool measures. Treat those as guesses, or cut those lines
- Old facts: one section of the prompt is dated 2025 and quotes traffic shares with no source
- Suggestions: each answer ends with three \`\[SUGGESTION\]\` lines, meant for a front end that turns them into buttons. Show them that way or strip them
- Memory: the key is the \`cf-connecting-ip\` header. Without Cloudflare in front, it is empty and the run stops at \`Memory\`. People behind one IP address share one conversation
- Wrong names: a country or language missing from \`Code\` leaves the codes empty, and the DataForSEO calls fail. A \`type\` other than \`voice\` or \`text\` gets no answer
- Models: Google’s deprecations page, read on 2 November 2026, gives Gemini 2.5 no shutdown date but limits it to users who used it before. A new key may need \`gemini-3.8-flash\` in the three Gemini nodes
- Open webhook: once it is published, anyone with the address can run it on your keys
- Your data: questions and voice notes go to Google, pages to Firecrawl, and keywords and domains to DataForSEO. Each execution also stores the Firecrawl key from \`🦺 Set Data\`
- Credentials: the JSON holds none. The six tool nodes arrive without a sub-workflow, and nothing else changed from the original copy

## README

````markdown
# SEO keyword chat assistant for voice or text

An n8n workflow that serves as the back end of an SEO chat. Your app posts a typed question or a voice note, with a
country and a language. Gemini turns a voice note into text, and a Gemini agent answers in Markdown with tables. Its
tools look up keywords, a competitor's rankings, Google's results and Google's AI Mode through a sub-workflow you build
on DataForSEO, and Firecrawl reads any page it names. The answer goes back in the same web request, and the chat keeps
its last 12 exchanges for each caller.

## What is inside

- `workflow.json`: the workflow as n8n exports it, 27 nodes, eight of them sticky notes. It holds no credential.
- `README.md`: these notes.

## What we changed from the original copy

- `ranked_keywords`, `related_keywords`, `keyword_ideas`, `serp_search`, `ai_mode` and `internal_links` called a
  sub-workflow in its author's own n8n. They arrive empty, so you build that sub-workflow and pick it in all six
  (below).
- The Firecrawl key in `🦺 Set Data` was a placeholder in the author's own style. It now reads `YOUR_FIRECRAWL_KEY`,
  like the other kits.

Nothing else changed. The original copy had no backslashes missing.

## Before you start

- An n8n instance, on n8n Cloud or your own server.
- A Gemini API key from Google AI Studio.
- A Firecrawl API key.
- A DataForSEO API login and password, for the sub-workflow.
- An app, a page or a tool such as Postman that sends the requests and shows the Markdown answer.

## Set it up

1. In n8n, create a workflow, open its menu and choose Import from File. Pick `workflow.json`.
2. Add a Google Gemini credential with your key. Select it in `Transcribe Audio`, `2.5 Flash` and `2.5 Pro`.
3. In `🦺 Set Data`, replace `YOUR_FIRECRAWL_KEY` with your Firecrawl key.
4. Build the sub-workflow described below and save it.
5. Open each of the six tool nodes under `Keyword AI Agent` and pick your sub-workflow in its workflow field.
6. Look at `Memory`. Its key is the caller's IP address, read from the `cf-connecting-ip` header that Cloudflare adds.
   If your n8n is not behind Cloudflare, that header is missing and the run stops at `Memory`. Point the key at a value
   your app sends instead, such as `{{ $('Webhook').first().json.body.session_id }}`.
7. Open `Webhook`. Its path is `keywordresearch` and it takes POST. Add Header Auth there if anyone else could learn
   the address.
8. Save, send a test request to the test address, then publish and use the production address.

## The sub-workflow

All six tools call one sub-workflow, and `function` says which job is wanted. Start yours with a When Executed by
Another Workflow trigger that accepts these six fields:

```json
{
  "function": "ranked_keywords, related_keywords, keyword_ideas, serp_search, ai_mode or internal_links",
  "keyword": "<the agent's search words>",
  "url": "<a domain such as example.com, or a page address>",
  "country_code": "<DataForSEO's location number, such as 2840>",
  "language_code": "<DataForSEO's language code, such as en>",
  "firecrawl_api": "<your Firecrawl key>"
}
```

Every tool sends `function` and the two codes. `ranked_keywords` adds `url`, which the agent is told to give as a bare
domain. `internal_links` adds `url` and the Firecrawl key. The other four add `keyword`. Despite its name,
`country_code` carries DataForSEO's location number. Return text or JSON the agent can read.

The file says nothing about what its author's version did, so here is one way to build it, from DataForSEO's and
Firecrawl's API pages read on 2 November 2026. A Switch on `function` leads to one HTTP Request each, with your
DataForSEO login as HTTP Basic Auth:

```text
ranked_keywords   POST https://api.dataforseo.com/v3/dataforseo_labs/google/ranked_keywords/live
related_keywords  POST https://api.dataforseo.com/v3/dataforseo_labs/google/related_keywords/live
keyword_ideas     POST https://api.dataforseo.com/v3/dataforseo_labs/google/keyword_ideas/live
serp_search       POST https://api.dataforseo.com/v3/serp/google/organic/live/advanced
ai_mode           POST https://api.dataforseo.com/v3/serp/google/ai_mode/live/advanced
internal_links    POST https://api.firecrawl.dev/v2/map
```

Send `location_code` and `language_code` from the two codes in each DataForSEO body. `ranked_keywords` takes the domain
as `target`, `related_keywords` takes one `keyword`, and `keyword_ideas` takes a `keywords` list. The Firecrawl call
takes the address as `url` and the key as a Bearer header.

## Calling it

A typed question is a JSON body:

```json
{
  "type": "text",
  "message": "Keyword ideas for a bike repair shop in Leeds",
  "country": "United Kingdom",
  "language": "English"
}
```

A voice note is a multipart form, with the recording in a field called `audio`:

```text
curl -X POST "https://<your n8n>/webhook/keywordresearch" -F type=voice -F country=Germany -F language=German -F audio=@question.mp3
```

`type` must be `voice` or `text`, in lower case. `country` and `language` must match a name in the lists inside the
`Code` node exactly, such as `United States`, `Turkiye` or `Chinese (Simplified)`. It knows 94 countries and 46
languages.

## How a run goes

1. `Webhook` takes the request and waits for `Respond to Webhook` before it answers.
2. `Code` looks up DataForSEO's location number and language code for the country and the language.
3. `Switch` sends a voice note to `Transcribe Audio`, where Gemini turns it into text, and a typed question
   to `Set Message`.
4. `🦺 Set Data` gathers the question, the Firecrawl key, the two codes and the caller's IP address.
5. `Keyword AI Agent` answers with its long system prompt, the recent exchanges in `Memory` and its tools. It may
   call several tools before it writes.
6. `Respond to Webhook` sends the agent's answer back as JSON, in a field called `output`.

## Change the look

- The assistant's voice and format: the system prompt in `Keyword AI Agent`. It sets the persona, the tables each kind
  of answer must hold, and the three suggestion lines at the end.
- More countries or languages: the two lists at the top of `Code`.
- How much the chat remembers: Context Window Length in `Memory`, 12 in the file.
- The fallback model: `2.5 Pro`, which the agent uses when `2.5 Flash` fails.
- How fresh a scraped page must be: `maxAge` in the body of `URL_search`, four hours in the file.

## Good to know

- Billing: Gemini bills every agent round, and the system prompt alone runs to some 18,000 characters, sent each time.
  Firecrawl counts every scrape, and a PDF page by page. DataForSEO bills every call your sub-workflow makes.
- Models: neither `2.5 Flash` nor `2.5 Pro` names a model, so both run the node's default, Gemini 2.5 Flash. Pick
  `models/gemini-2.5-pro` in `2.5 Pro` if you want Pro as the fallback.
- As of 2 November 2026: Google's deprecations page gives Gemini 2.5 no shutdown date. It limits those models to users
  who used them before, so a new key may need `gemini-3.8-flash` in all three Gemini nodes. Firecrawl's docs still list
  the v1 scrape that `URL_search` calls, with a note that v2 is out.
- The prompt tells the model to sound sure of itself and never to hedge, to cite experience it does not have, and to
  give click-through potential, readability scores and keyword density that no tool measures. Treat those figures as
  guesses, or take those lines out of the prompt.
- One section of the prompt is dated 2025 and quotes traffic figures with no source. The prompt names two tools a little
  differently from their nodes (`url_search` and `AI_Mode`), and asks for a domain where `internal_links` takes an
  address.
- Suggestions: every answer ends with three lines that start with `[SUGGESTION]`. The prompt meant them for a front end
  that turns them into buttons, so your app should show them that way or strip them.
- Wrong names: a country or language that is not in the `Code` lists leaves the codes empty, and the DataForSEO calls
  then fail. A `type` other than `voice` or `text` stops the run before any answer.
- Shared memory: callers behind one IP address, such as an office, share one conversation. The memory lives in n8n
  itself, so a restart clears it.
- Open webhook: once it is published, anyone with the address can run it on your keys until you add Header Auth.
- Your data: questions and voice notes go to Google, pages go to Firecrawl, and keywords and domains go to DataForSEO.
  Each caller's IP address is the memory key. Every execution also saves the Firecrawl key, since `🦺 Set Data` holds
  it, so keep the executions list private.
````

## What is in it

2 files, 62 KB, downloaded as a zip.

```text
README.md  8 KB
workflow.json  53 KB
```

## Workflow check

Checked by Mindket on 13 Nov 2026. Read from the workflow’s file, not from a run.

- Steps: 8 steps, starting when its webhook is called
- AI: 2 steps call an AI model: Transcribe Audio and Keyword AI Agent
- Sign-ins: Signs in to: Google Gemini and Firecrawl
- API keys: No API key is left in the file; 1 blank in it for your own key
- Step types: Mindket’s checker reads all 7 of its step types

## Get it

- [Get it on your Mindket account](https://account.mindket.com/account/?product=mindket#/market/458e2b2e-a2c5-4166-a2f1-078a37da3a58)
- [Its page on Mindket](https://mindket.com/p/458e2b2e-a2c5-4166-a2f1-078a37da3a58)
