# Google search results as JSON with site: and filetype:

2026-08-28

> SERP rows as JSON. site:, filetype:, and intitle: pass through. Not Google Ads. Not an SEO retainer.

- Index: https://fetcher.sh/blog.md
- This page (HTML): https://fetcher.sh/blog/google-search-results-json-site-filetype

![A laptop and notebook on a desk during work](https://images.unsplash.com/photo-1454165804606-c3d57bc86b40?auto=format&fit=crop&w=1600&q=80)

Photo by Campaign Creators on [Unsplash](https://unsplash.com/?utm_source=fetcher_sh&utm_medium=referral).

A SERP row is a result, not a ranking campaign. [google.fetcher.sh](https://google.fetcher.sh) returns Google web search as JSON. Operators pass through: `site:`, `filetype:`, `intitle:`, quoted phrases. That is search-as-data, not Google Ads and not a retainer.

The host’s own examples are the right ones: `site:github.com x402 payments`, `agentic commerce filetype:pdf`, `"pay per call api"`. You put those tokens in `query`. You do not invent extra HTTP parameters for `site` or `filetype`.

Custom Search as the official path is the [without-CSE](/blog/serp-without-custom-search-or-serpapi) note. [Live grounding](/blog/grounding-an-agent-on-live-google-results) is the RAG job. X’s `from:` operators are a [different family](/blog/x-search-operators-from-since-until). News headlines are [google-news.fetcher.sh](https://google-news.fetcher.sh). [OSINT](/blog/osint-handle-thread-open-web) uses the same SERP with a journalism frame.

One GET, one query string, JSON rows. Official Custom Search needs a CSE id; this host does not. If you wanted Ads or a ranking retainer, you are in the wrong place.

## A SERP row, not a ranking campaign

`curl -H 'Authorization: Bearer bby_live_…' 'https://google.fetcher.sh/api/search?query=site:github.com+x402+payments'`

What you get back is the public result list as data: titles, links, snippets, in the usual envelope. What you do not get is your own rank history, Search Console, or a promise that you can move a blue link. SEO agencies sell the campaign. This host sells the row.

Quoted phrases matter. `pay per call api` and `"pay per call api"` are different queries. `site:` constrains the corpus. `filetype:pdf` is how you ask for documents instead of homepages. `intitle:` is how you stop matching a word that only appears in a sidebar.

Do not mix X operators into this string. `from:OpenAI` on google.fetcher.sh is not a Twitter search. Do not mix News sections into this host. Headlines have their own API.

## How people actually issue the query

Researchers start with `site:` when they already know the domain and they want Google’s ranking *inside* that domain, not a crawl they have to run. `site:github.com x402` is a reasonable stand-in for “what did the open web index about this repo.” It is not GitHub’s search API.

Legal and policy people use `filetype:pdf` because the memo is a PDF and the blog post is noise. Agents use the same operators for [grounding](/blog/grounding-an-agent-on-live-google-results): constrain the corpus, then write with the snippets in context.

If the question is “is this a headline,” switch hosts. Google Search will return news stories sometimes; Google News is the product that *is* headlines, with editions and topics. Mixing them in one monitoring job is how you double-count.

## A case: `site:github.com` instead of a crawl

A developer advocate is checking whether a protocol name is showing up in public repos and READMEs. They do not have time to crawl GitHub. They do not have a Custom Search engine.

They run `site:github.com x402 payments`, then a quoted phrase pass, then `filetype:pdf` for the deck-shaped results. They keep the URLs. They do not treat snippet text as the full README. They open the interesting rows.

That is a morning, a prepaid key, and no CSE id. If they later want headlines about the same protocol, they add [News](/blog/google-news-headlines-topics-language-editions). If they want tweets, they leave Google entirely.

`intitle:` is the unglamorous operator that stops you matching a footer. Quoted phrases are how you look up the product name when it is also English words. Together with `site:` they are most of what people mean by “Google dorking” without turning this page into a hacker zine. We pass them through. We do not sell a list of “secret operators.”

Pagination, when the endpoint offers it, is how you get past page one. Snippets are truncated. If the row matters, open the URL. Agents that treat the snippet as the document will cite half a sentence. Humans do that too.

## A case: an agent that must not invent citations

A support bot is allowed to answer from `site:docs.example.com` only. The team does not want it quoting a random blog.

Every retrieval is `site:docs.example.com` plus the user question, on this host. The bot cites the URLs in the JSON. If Google returns nothing, the bot says it does not know — it does not fall back to training data and pretend. Payment is the [agent-pays](/blog/how-an-agent-pays-for-a-public-data-request) loop. This note is the query language.

## Operators are the product

`site:`, `filetype:`, `intitle:`, quotes. Put them in `query`. Docs: [google.fetcher.sh](https://google.fetcher.sh). Same 402 or `bby_live_` key as the rest of the catalog. Ads, Search Console, and retainers stay where they were.
