AnswerLine Start free

Google Search

Google Search People are saying

The 'People are saying' discussion links Google shows for a query.

The forum and social threads Google shows under 'People are saying' come back with title, link and relative date, so you can see which discussions searchers are sent to for your brand or topic.

Returned in result

Field
peopleAreSaying

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 “People are saying” is

“People are saying” is the Google results page module that surfaces community discussion for a query: cards labeled “What people are saying” or “Trending posts and discussions”, each pointing to a thread or post, often on Reddit, Quora or a community forum. Each card shows a title and how long ago it was posted.

result.peopleAreSaying returns those cards. This is where Google sends searchers who want first-hand opinions, so a critical thread promoted for your brand query is a visible reputation risk. The platforms and threads that appear show where to take part in discussions, and discussions outranking editorial pages point to questions the existing pages don’t answer. The same threads are often cited by AI answers; see Reddit citations in AI answers.

Field reference

result.peopleAreSaying[]

Field Type Meaning
position number, required 1-indexed position within the module.
title string, required Card title as displayed.
link string, required Destination URL of the card, often a Reddit, Quora or forum thread. When Google served a redirect, this is the resolved destination.
date string, required Google’s relative-time text, such as 5 days ago. Free-form, not normalized to a timestamp.
redirectLink string Google’s /goto redirect for the link, in the absolute form POST /v1/monitor/google/goto accepts. Present only when Google served the link as a redirect.

The whole field is omitted from result when the page has no such module.

Annotated excerpt

Values are illustrative; names and types follow the POST /v1/monitor/google result schema.

{
  "result": {
    // Omitted entirely when the results page has no discussions module.
    "peopleAreSaying": [
      {
        "position": 1,
        "title": "Anyone switched from ExampleVPN? Speeds dropped for me",
        "link": "https://www.reddit.com/r/example/comments/abc123/",
        "date": "5 days ago"          // relative text, not a timestamp
      },
      {
        "position": 2,
        "title": "Is ExampleVPN worth it in 2026?",
        "link": "https://forum.example-tech.org/t/examplevpn-worth-it/8812",
        "date": "2 weeks ago"
      }
    ]
  }
}

Cost

No include flag is needed. The module comes with every Google Search request at the base price: $0.00103 for one page. The module is read from the first results page, so extra pages do not add cards.

Example: discussion presence and platform share

The script checks brand and category queries, then reports how many show the module, each platform’s share of cards, and the threads on brand queries that are newer than 30 days, converting Google’s relative dates using the run time.

import os
import re
import time
from collections import Counter
from datetime import date, datetime, timedelta, timezone
from urllib.parse import urlparse

import requests

API = "https://api.answerline.dev"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
BRAND_QUERIES = ["examplevpn review", "examplevpn reddit", "is examplevpn safe"]
CATEGORY_QUERIES = ["best vpn for streaming", "vpn for travel"]
DAY = date.today().isoformat()
UNITS = {"minute": 1 / 1440, "hour": 1 / 24, "day": 1, "week": 7, "month": 30, "year": 365}


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 age_days(text):
    """Approximate age from text like '5 days ago'; None when the text isn't relative."""
    match = re.match(r"(\d+)\s+(minute|hour|day|week|month|year)s?\s+ago", text.strip().lower())
    return int(match.group(1)) * UNITS[match.group(2)] if match else None


queries = BRAND_QUERIES + CATEGORY_QUERIES
tasks = [
    {"taskType": "GOOGLE", "payload": {"query": q, "country": "US"}, "idempotencyKey": f"pas-{i}-{DAY}"}
    for i, q in enumerate(queries)
]
ran_at = datetime.now(timezone.utc)

platforms = Counter()
with_module = 0
fresh_brand_threads = []
for query, result in run_tasks(tasks):
    cards = result.get("peopleAreSaying", [])
    with_module += bool(cards)
    for card in cards:
        platforms[(urlparse(card["link"]).hostname or "").removeprefix("www.")] += 1
        age = age_days(card["date"])
        if query in BRAND_QUERIES and age is not None and age <= 30:
            posted = (ran_at - timedelta(days=age)).date().isoformat()
            fresh_brand_threads.append((query, card["position"], posted, card["title"], card["link"]))

total = sum(platforms.values()) or 1
print(f"module shown on {with_module}/{len(queries)} queries")
for host, count in platforms.most_common(10):
    print(f"  {host:32} {count / total:5.1%} of cards")
print("\nBrand-query threads from the last 30 days (approximate dates):")
for row in fresh_brand_threads:
    print("  ", *row)

Run it daily and diff the set of link values per brand query: a new thread entering the module is the event worth alerting on, not the module’s presence.

Pitfalls

peopleAreSaying is omitted when the page has no module: result["peopleAreSaying"] raises, result.get("peopleAreSaying", []) doesn’t.

“2 weeks ago” covers a range of days. Store the raw date text and the request time, compute approximate dates at read time, and keep text that doesn’t match a relative pattern as is.

Whether Google shows discussions for a query varies over time and by market, and discussion sources are often language-specific. Measure presence as a rate across runs with country fixed.

The same thread can appear with different URL forms (trailing slashes, query parameters). Normalize before diffing so a URL variant isn’t reported as a new thread.

Questions

What is the People are saying module in Google?

It is the results page module Google titles "What people are saying" or "Trending posts and discussions", a row of cards linking to discussions, often Reddit, Quora or community forum threads. The API returns it as result.peopleAreSaying.

Why is peopleAreSaying missing from my result?

The field is omitted from result when the results page has no such module. Treat it as optional and default to an empty list in code.

Is the date on a People are saying card a timestamp?

No. date is Google's relative text as displayed, such as "5 days ago" or "2 weeks ago". Convert it yourself using the time the request ran.

Does People are saying cost extra?

No. It comes with every Google Search request at the base price: $0.00103 for one page.

Can I see which discussion platforms Google promotes for my keywords?

Yes. Group peopleAreSaying[].link by host across a keyword set to get each platform's share of cards, and count how many keywords show the module at all.

More Google Search data

All Google Search fields · API reference