Building a Google Search .NET Client: Step-by-Step Tutorial

Getting Started with Google Search .NET: A Beginner’s Guide

This guide shows a clear, minimal path to integrate Google Search functionality into a .NET application. It covers setup, authentication, basic queries, parsing results, and simple pagination. Assumptions: you’re using .NET 7+ and C#. Replace placeholders (API keys, CX IDs) with your own.

1. Choose the right API

Google offers programmable search endpoints (Custom Search JSON API) suited for app-based search. This guide uses the Custom Search JSON API for web search. Note: the API is paid beyond free quota—check current pricing before production.

2. Create API credentials and search engine

  1. In Google Cloud Console create a project.
  2. Enable the Custom Search API.
  3. Create an API key (Credentials > Create > API key).
  4. Go to Programmable Search Engine (cse.google.com), create a search engine, and note the Search Engine ID (cx). Configure sites to search (or set to search the entire web).

3. Install required NuGet packages

Use HttpClient (built-in) or a lightweight wrapper. For JSON parsing, add System.Text.Json or Newtonsoft.Json. Command:

Code

dotnet add package System.Text.Json

4. Minimal C# example: single-page search

This example performs a single query and prints titles and links.

csharp

using System; using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; class Program { static async Task Main() { string apiKey = “YOUR_API_KEY”; string cx = “YOUR_SEARCH_ENGINE_ID”; string query = “dotnet google search example”; string url = \("https://www.googleapis.com/customsearch/v1?key=</span><span class="token interpolation-string interpolation" style="color: rgb(57, 58, 52);">{</span><span class="token interpolation-string interpolation expression language-csharp">apiKey</span><span class="token interpolation-string interpolation" style="color: rgb(57, 58, 52);">}</span><span class="token interpolation-string" style="color: rgb(163, 21, 21);">&cx=</span><span class="token interpolation-string interpolation" style="color: rgb(57, 58, 52);">{</span><span class="token interpolation-string interpolation expression language-csharp">cx</span><span class="token interpolation-string interpolation" style="color: rgb(57, 58, 52);">}</span><span class="token interpolation-string" style="color: rgb(163, 21, 21);">&q=</span><span class="token interpolation-string interpolation" style="color: rgb(57, 58, 52);">{</span><span class="token interpolation-string interpolation expression language-csharp">Uri</span><span class="token interpolation-string interpolation expression language-csharp">.</span><span class="token interpolation-string interpolation expression language-csharp">EscapeDataString</span><span class="token interpolation-string interpolation expression language-csharp">(</span><span class="token interpolation-string interpolation expression language-csharp">query</span><span class="token interpolation-string interpolation expression language-csharp">)</span><span class="token interpolation-string interpolation" style="color: rgb(57, 58, 52);">}</span><span class="token interpolation-string" style="color: rgb(163, 21, 21);">"</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span> <span> </span><span class="token" style="color: rgb(0, 0, 255);">using</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">var</span><span> http </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">new</span><span> </span><span class="token constructor-invocation" style="color: rgb(43, 145, 175);">HttpClient</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">var</span><span> resp </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">await</span><span> http</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">GetAsync</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span>url</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span> resp</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">EnsureSuccessStatusCode</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">var</span><span> json </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">await</span><span> resp</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span>Content</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">ReadAsStringAsync</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span> <span> </span><span class="token" style="color: rgb(0, 0, 255);">using</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">var</span><span> doc </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> JsonDocument</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">Parse</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span>json</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">if</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span>doc</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span>RootElement</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">TryGetProperty</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(163, 21, 21);">"items"</span><span class="token" style="color: rgb(57, 58, 52);">,</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">out</span><span> </span><span class="token" style="color: rgb(0, 0, 255);">var</span><span> items</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span> </span><span> </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">foreach</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(0, 0, 255);">var</span><span> item </span><span class="token" style="color: rgb(0, 0, 255);">in</span><span> items</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">EnumerateArray</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span> </span><span> </span><span class="token" style="color: rgb(57, 58, 52);">{</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">string</span><span> title </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> item</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">GetProperty</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(163, 21, 21);">"title"</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">GetString</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">??</span><span> </span><span class="token" style="color: rgb(163, 21, 21);">""</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span> </span><span class="token" style="color: rgb(0, 0, 255);">string</span><span> link </span><span class="token" style="color: rgb(57, 58, 52);">=</span><span> item</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">GetProperty</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(163, 21, 21);">"link"</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">GetString</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">)</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">??</span><span> </span><span class="token" style="color: rgb(163, 21, 21);">""</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span> Console</span><span class="token" style="color: rgb(57, 58, 52);">.</span><span class="token" style="color: rgb(57, 58, 52);">WriteLine</span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token interpolation-string" style="color: rgb(163, 21, 21);">\){title}\n{link}\n”); } } else { Console.WriteLine(“No results.”); } } }

5. Handle pagination (next page)

The Custom Search API returns up to 10 results per request. Use the start parameter to fetch subsequent pages (start=11 for page 2, etc.). Respect API quota.

Example URL with pagination: https://www.googleapis.com/customsearch/v1?key=API_KEY&cx=CX&q=QUERY&start=11

6. Common options and parameters

  • q — search query
  • start — index of first result (1-based)
  • num — number of results (1–10)
  • lr — language restrict (e.g., lang_en)
  • safe — safeSearch (off, medium, high)
  • siteSearch — restrict to a site (e.g., siteSearch=example.com)
  • fields — reduce response payload

Include only needed fields in production to save bandwidth; use fields parameter

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *