Google Search related searches
The related queries Google suggests at the foot of the page.
`relatedSearches` returns the suggested follow-on queries with their search URLs, a source of long-tail variants and modifiers for keyword research.
Returned in result
| Field |
|---|
relatedSearches |
Request
curl -X POST "https://api.answerline.dev/v1/monitor/google" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"query":"project management software","country":"US","include":{"aioverview":{"markdown":true}}}'
What related searches are
Related searches are the follow-on queries Google suggests for a search, usually shown near the bottom of the results page. They are Google’s view of where searchers go next: narrower versions of the query, common modifiers, adjacent products and alternative phrasings.
result.relatedSearches returns them as query text plus the Google search URL. They expand a few seeds into long-tail variants, surface modifiers that recur across a topic (“for beginners”, “vs”, “near me”, a year) to build pages around, map topic structure through the suggestions seeds share, and supply searcher phrasings for AI visibility prompt sets.
Field reference
result.relatedSearches[]
| Field | Type | Meaning |
|---|---|---|
query |
string | The suggested related query. |
link |
string | Google search URL for that query. |
relatedSearches is always present in a Google Search result as an array. It is read from the first results page.
Annotated excerpt
Values are illustrative; names and types follow the POST /v1/monitor/google result schema.
{
"result": {
"relatedSearches": [
{
"query": "espresso machine for beginners",
"link": "https://www.google.com/search?q=espresso+machine+for+beginners"
},
{
"query": "espresso machine with grinder",
"link": "https://www.google.com/search?q=espresso+machine+with+grinder"
}
// Empty array, not a missing key, when the page has no suggestions.
]
}
}
Use query as the input for the next request. link is useful for audit trails and manual checks; there is no need to fetch it.
Cost
No include flag is needed. Related searches come with every Google Search request at the base price: $0.00103 for one page. Keep pages at 1 for expansion work; deeper pages add organic results, not suggestions, and each extra page costs $0.00071.
Expansion multiplies requests. A two-level run from 20 seeds that each return 8 new suggestions is 20 + 160 = 180 tasks, or $0.1854 at $0.00103 each. Deduplicating suggestions across seeds before the second level reduces that, which is why the example does it.
Example: two-level expansion with modifier mining
The script expands seeds one level, deduplicates, expands the new queries once more, then reports the modifiers (words added to a seed) that recur most and the suggestions reached from several seeds.
import os
import re
import time
from collections import Counter, defaultdict
from datetime import date
import requests
API = "https://api.answerline.dev"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
SEEDS = ["espresso machine", "coffee grinder", "milk frother"]
MAX_SECOND_LEVEL = 40 # budget guard: at most 40 extra tasks
DAY = date.today().isoformat()
def run_tasks(tasks):
resp = requests.post(f"{API}/v1/async/task/batch", headers=HEADERS, json=tasks, timeout=60)
resp.raise_for_status()
pending = {item["task"]["id"]: tasks[item["index"]] for item in resp.json()["results"] if item["success"]}
done = []
while pending:
time.sleep(10)
for task_id in list(pending):
body = requests.get(f"{API}/v1/async/task/{task_id}", headers=HEADERS, timeout=30).json()
if body["task"]["status"] in ("COMPLETED", "FAILED"):
task = pending.pop(task_id)
if body["task"]["status"] == "COMPLETED":
done.append((task["payload"]["query"], body["response"]["result"]))
return done
def norm(text):
return re.sub(r"\s+", " ", text.lower()).strip()
def expand(queries, level):
tasks = [
{"taskType": "GOOGLE", "payload": {"query": q, "country": "US"}, "idempotencyKey": f"rel-{level}-{norm(q)}-{DAY}"}
for q in queries
]
return {query: [norm(r["query"]) for r in result["relatedSearches"]] for query, result in run_tasks(tasks)}
parents = defaultdict(set) # suggestion -> queries that suggested it
level1 = expand(SEEDS, 1)
for query, suggestions in level1.items():
for s in suggestions:
parents[s].add(query)
seen = {norm(s) for s in SEEDS}
next_level = [s for s in parents if s not in seen][:MAX_SECOND_LEVEL]
seen.update(next_level)
for query, suggestions in expand(next_level, 2).items():
for s in suggestions:
parents[s].add(query)
modifiers = Counter()
for suggestion in parents:
for seed in SEEDS:
if suggestion.startswith(norm(seed) + " "):
modifiers[suggestion[len(seed) + 1:]] += 1
print(f"{len(parents)} unique suggestions from {len(SEEDS)} seeds")
print("Most common modifiers:", modifiers.most_common(15))
print("Suggested from 2+ queries:")
for suggestion, sources in sorted(parents.items(), key=lambda kv: -len(kv[1])):
if len(sources) > 1:
print(f" [{len(sources)}] {suggestion}")
The idempotency key includes the normalized query and the day, so rerunning the script the same day cannot run and charge the same query twice.
Pitfalls
Related searches differ by market, language and time. Store the date and country with every suggestion, and compare runs from the same market.
Each level multiplies requests. Cap the queries per level, deduplicate across seeds, and stop once new levels mostly return queries you have already seen.
Case and whitespace differences create false “new” suggestions. The example lowercases and collapses spaces; add rules for plurals or word order if your keyword tool treats them as one.
Some queries return no suggestions, and relatedSearches is then an empty array.
A related search shows association, not demand. Pair the list with a volume source before prioritizing.
Idempotency keys are unique across your account, so a same-day rerun gets RESOURCE_ALREADY_EXISTS for each batch item and creates nothing. Store results as they arrive instead of relying on a rerun to fetch them again.
Related
- Keyword research and People Also Ask keyword research.
- People Also Ask for full questions and who answers them.
- ChatGPT sources: the pages an AI assistant cites for the same question, a complementary view of the topic.
- Idempotency keys explained and rank tracking pipelines with batches.
- Google Search engine guide for targeting, batches and billing.
Questions
What fields does relatedSearches return?
Each entry has query, the suggested search text, and link, the Google search URL for that query. The array is always present and is empty when the page shows no related searches.
Do related searches cost extra?
No. relatedSearches comes with every Google Search request at the base price of $0.00103 for one page.
Can I expand related searches recursively?
Yes. Run each returned query as a new request. Every expansion level multiplies the number of requests, so cap the depth and deduplicate queries before submitting the next level.
Do extra pages return more related searches?
No. Related searches are read from the first results page. The pages parameter adds organic depth only.
How are related searches different from People Also Ask?
Related searches are short follow-on queries, useful for keyword expansion and modifiers. People Also Ask returns full questions with answers and the domains or AI Overviews that answer them.
More Google Search data
organic results
Ranked Google listings with titles, URLs and snippets, pages 1 through 10.
ads
The ads Google shows for a query, with block position, copy, destination and shopping-card prices.
People Also Ask
The People Also Ask questions Google clusters around a query, with their answers.
People are saying
The 'People are saying' discussion links Google shows for a query.
knowledge graph
The knowledge panel Google shows for an entity: description, website, profiles, key facts and Knowledge Graph ID.
local pack
Map-pack results with names, ratings and positions for local queries.
AI Overview
Google's AI Overview for a query: answer text, cited sources and citation pills, or null when absent.