upscaler
uwg · Kit
Holds a set of image upscaling models gathered from the OpenModelDB community, for people who want to enlarge low-resolution pictures with AI on their own comp…
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 . Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.
Web request
It starts when a POST reaches the keywordresearch webhook with:
An SEO answer in Markdown, with keyword tables and three next steps, sent back to the app that asked
What you need before you start.
Language model
Runs Gemini 2.5 Flash for the agent and its fallback, and turns voice notes into text.
NeedsGemini API key
Web scraping
Reads a page the agent names as Markdown, and its key goes to your sub-workflow for the link list.
NeedsFirecrawl API key, typed into `🦺 Set Data`
Keyword data
Answers the keyword, ranking, search result and AI Mode calls your sub-workflow makes.
NeedsAPI login and password, used in your sub-workflow
Checked by Mindket on 13 Nov 2026
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.
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.
| 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.
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.
Memory when Cloudflare is not in front of itGet it saves a zip with workflow.json and Mindket’s setup notes in your downloads folder.
| Need | Detail |
|---|---|
| n8n | On n8n Cloud or on a server of your own |
| 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 |
workflow.json.Transcribe Audio, 2.5 Flash and 2.5 Pro.🦺 Set Data, replace YOUR_FIRECRAWL_KEY with your Firecrawl key.Keyword AI Agent.Memory at a value your app sends, such as a session_id field.Webhook unless its address stays private.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:
{
"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.
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.
| 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 |
Your app posts this:
{
"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:
{
"output": "🎯 …\n\n| Keyword | Volume | KD | CPC |\n|---|---|---|---|\n| `bike repair leeds` | … | … | … |\n…\n\n[SUGGESTION] …\n[SUGGESTION] …\n[SUGGESTION] …"
}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.
| 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.
It answers with more confidence than its data may back.
[SUGGESTION] lines, meant for a front end that turns them into buttons. Show them that way or strip themcf-connecting-ip header. Without Cloudflare in front, it is empty and the run stops at Memory. People behind one IP address share one conversationCode leaves the codes empty, and the DataForSEO calls fail. A type other than voice or text gets no answergemini-3.8-flash in the three Gemini nodes🦺 Set DataAn 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.
workflow.json: the workflow as n8n exports it, 27 nodes, eight of them sticky notes. It holds no credential.README.md: these notes.ranked_keywords, related_keywords, keyword_ideas, serp_search, ai_mode and internal_links called a🦺 Set Data was a placeholder in the author's own style. It now reads YOUR_FIRECRAWL_KEY,Nothing else changed. The original copy had no backslashes missing.
workflow.json.Transcribe Audio, 2.5 Flash and 2.5 Pro.🦺 Set Data, replace YOUR_FIRECRAWL_KEY with your Firecrawl key.Keyword AI Agent and pick your sub-workflow in its workflow field.Memory. Its key is the caller's IP address, read from the cf-connecting-ip header that Cloudflare adds.Memory. Point the key at a value{{ $('Webhook').first().json.body.session_id }}.Webhook. Its path is keywordresearch and it takes POST. Add Header Auth there if anyone else could learnAll 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:
{
"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:
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.
A typed question is a JSON body:
{
"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:
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 theCode node exactly, such as United States, Turkiye or Chinese (Simplified). It knows 94 countries and 46
languages.
Webhook takes the request and waits for Respond to Webhook before it answers.Code looks up DataForSEO's location number and language code for the country and the language.Switch sends a voice note to Transcribe Audio, where Gemini turns it into text, and a typed questionSet Message.🦺 Set Data gathers the question, the Firecrawl key, the two codes and the caller's IP address.Keyword AI Agent answers with its long system prompt, the recent exchanges in Memory and its tools. It mayRespond to Webhook sends the agent's answer back as JSON, in a field called output.Keyword AI Agent. It sets the persona, the tables each kindCode.Memory, 12 in the file.2.5 Pro, which the agent uses when 2.5 Flash fails.maxAge in the body of URL_search, four hours in the file.2.5 Flash nor 2.5 Pro names a model, so both run the node's default, Gemini 2.5 Flash. Pickmodels/gemini-2.5-pro in 2.5 Pro if you want Pro as the fallback.gemini-3.8-flash in all three Gemini nodes. Firecrawl's docs still listURL_search calls, with a note that v2 is out.url_search and AI_Mode), and asks for a domain where internal_links takes an[SUGGESTION]. The prompt meant them for a front endCode lists leaves the codes empty, and the DataForSEO callstype other than voice or text stops the run before any answer.🦺 Set Data holdsREADME.md 8 KB workflow.json 53 KB
uwg · Kit
Holds a set of image upscaling models gathered from the OpenModelDB community, for people who want to enlarge low-resolution pictures with AI on their own comp…
nerijs · Kit
A pixel art style add-on for Stable Diffusion XL that turns text prompts into pixel-style images, with an optional LCM LoRA for faster runs. For game makers, d…
microsoft · Kit
Turns written conversations into spoken audio with up to four speakers and about 90 minutes of speech, an open Microsoft text-to-speech model for research on p…
LiconStudio · Kit
Keeps characters, clothing, objects and backgrounds consistent in generated video by feeding the model up to five reference images. A LoRA for LTX-2.5 in Comfy…
nhathoangfoto · Kit
A LoRA for FLUX.2 Klein 9B that puts a character into the pose shown by a mannequin reference while keeping the character's face and style. For artists and des…
leejet · Kit
Generates images from text on modest GPUs, using quantized Z-Image-Turbo files made for stable-diffusion.cpp. For people who run image models on their own comp…