← Blog

Grounding an agent on live Google results

An agent fetches live Google SERP JSON and cites it. Not a training dump. How it pays is a different page.

Green falling code in the style of a terminal rain
Photo by Markus Spiske on Unsplash.

Grounding, here, means an agent fetches live Google results and writes with those snippets in context. google.fetcher.sh returns rows. The agent cites them. It is not a training-data dump and not a textbook “what is RAG.”

The retrieval set is public web data, because that is the catalog. MCP fetch_data can run the same path. How the agent pays is the 402 loop. site: and filetype: are the operators. News headlines are a different corpus; use Google News if the retrieval set is headlines.

An agent that answers from memory will invent a URL. An agent that must attach a row from this host will invent fewer. That is the whole trick. It is not magic and it is not a guarantee. Empty SERP means say you do not know.

Live rows, then an answer

The agent issues a Google query — often with site: to constrain the corpus — receives JSON, and writes. Payment first, or a key on the connection.

From an agent: pay or send a key, then GET https://google.fetcher.sh/api/search?query=site:docs.example.com+topic.

OSINT uses the same SERP with a journalism frame. Payment stays on the agent-pays note. This note is live grounding.

Practical constraints that keep this from becoming a mess:

  • Constrain with site: when the user is asking about your docs.
  • Use quotes when the phrase is the product.
  • Do not retrieve News and Search into one unsorted list.
  • Cite the URL from the row. Do not cite a URL the model remembers.
  • If status is not success, stop. Do not answer from the prompt.

Grounding is not training

Nothing about this host fine-tunes a model. Nothing dumps a crawl into a vector database for you. You can build those things with the JSON, and then you are doing RAG engineering. The product on this page is live retrieval: a GET, rows, an answer with those rows in context, today.

People still ask for “the dataset.” There is not one. There is a priced GET. That is the point of pay per call for agents. They retrieve what they need for this question, not a month of Common Crawl.

Headlines as a corpus belong on Google News. Tweets as a corpus belong on twitter.fetcher.sh. If your agent is “grounded” on the wrong host, it will sound fluent and cite the wrong kind of object.

A case: docs-only support

A support agent is allowed to use site:docs.example.com only. A user asks about a feature that shipped yesterday. Training data does not have it. The GET does, if Google has indexed the page.

The agent retrieves, cites, answers. If the page is not indexed yet, it says so and points at the docs homepage instead of hallucinating a changelog. The team would rather be late than wrong. Grounding is how they encode that.

Payment is a bby_live_ key in the server environment. End users do not sign USDC. The agent-pays note covers the other shape, when the agent is the user’s wallet.

A case: an hourly brief that must name URLs

The cron in the agent-pays note is a grounding job in disguise. Each hour: Search with site:github.com, optional News pass, a short summary with links from the JSON. No dashboard. No Cloud key. If the summary cannot point at a row, it does not ship.

That bot is not “an LLM with browsing” as a slogan. It is a client of google.fetcher.sh. The model is the writer. The host is the evidence.

If the user question is a headline question — “what did the papers say about X this morning” — Search will return a mix of blogs and news. Prefer google-news.fetcher.sh for that retrieval set, then write. Grounding on the wrong corpus is how a bot cites a forum post as if it were a gazette.

MCP fetch_data does not change the job. It is the same GET on a different transport. Free tools can still describe_endpoint before you spend. Paid retrieval still costs the call. Empty data still means do not answer from memory.

A grounded agent that behaves: constrain with site: or quotes, pay, cite URLs from the row, refuse when the envelope is empty. Training data is allowed to write tone, not facts about yesterday. News as a retrieval set is a different host so a “what did the papers say” question does not cite a random blog from Search.

How it pays is still the other article. This one is only live rows in context.

Live, paid, cited

Not a training dump. Not a textbook RAG essay. Fetch rows, pay for the GET, write with the snippets. Docs on google.fetcher.sh. Operators on the search note. Settlement on the 402 note.