POST /search
Search Google, DuckDuckGo, Brave, or Mojeek and return the top organic results, or results pages as HTML.
POST https://request.usestring.ai/v1/searchRequest body
| Field | Type | Default | Description |
|---|---|---|---|
query | string | — | Required. The search query to run. |
engine | string | "google" | Search engine to query. "google", "duckduckgo", "brave", or "mojeek"; "google_ai_mode" returns Google's AI Mode answer instead of results (see Google AI Mode). |
country | string | "US" | ISO 3166-1 alpha-2 country code used to localize results. |
language | string | — | Optional language tag such as "en" or "pt-br" for result language. |
searchCount | integer | — | Optional number of organic results wanted, 1 to 300. Google is paged until that many are collected; see Result count and paging. Rejected with "format": "raw". |
location | string | — | Optional place name such as "London" to search from. "google" and "google_ai_mode" only; see Location. |
coordinates | object | — | Optional point { latitude, longitude, radius } to search from. "google" and "google_ai_mode" only, and it takes precedence over location; see Location. |
page | integer | 1 | Optional results page to start from, 1 to 30, where page N is the page Google shows as N. "google" only; see Page. |
dateRange | string or object | — | Optional publication window: "hour", "day", "week", "month" or "year" for the past hour through the past year, or { from, to } with ISO dates. "google" only; see Date range and sort order. |
sortBy | string | "relevance" | Optional order: "relevance", or "date" for the newest results first. "google" only; see Date range and sort order. |
format | string | "structured" | Optional: "structured" for results as JSON, or "raw" for the Google results page as HTML, one page per request. We recommend "structured". "google" only; see Raw HTML. |
aiOverview | boolean | false | Optional. true makes a second, sequential fetch to fill the AI Overview Google streams in after the page loads. Adds latency and costs 2x a normal search. "google" only; see Streamed AI Overviews. |
searchType | string | "web" | Optional Google tab to search: "web", "images", "videos", "shopping", "books", "places" or "forums". "google" only; see Search type. |
safeSearch | boolean | false | Optional. true returns SafeSearch's filtered results, with explicit content removed. "google" only; see Filters. |
includeOmittedResults | boolean | false | Optional. true includes the results Google normally hides as very similar to ones already shown. "google" only; see Filters. |
autocorrect | boolean | true | Optional. false searches the query exactly as sent rather than Google's corrected spelling. "google" only; see Filters. |
restrictCountry | string | — | Optional ISO 3166-1 alpha-2 code. Returns only pages from that country. "google" only; see Filters. |
verbatim | boolean | false | Optional. true matches the query's words exactly, without synonyms or variations. "google" only; see Filters. |
Any other field is rejected with a 400. So is a searchCount above 300 (the error names the maximum; the value is
never silently clamped), and so is location or coordinates sent with any engine other than "google" or "google_ai_mode". page,
dateRange, sortBy, aiOverview, searchType and the filters sent with any engine other than "google", Google AI
Mode included, are rejected with a 400 that names the field, and so is "format": "raw". searchCount sent with
"format": "raw" is rejected with a 400; use page instead.
Country codes are case-insensitive and normalized to uppercase, so "gb" and "GB" behave the same way. Country and
language apply to every engine, Google AI Mode included.
curl https://request.usestring.ai/v1/search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "construction consulting firms", "engine": "mojeek", "country": "GB", "language": "en" }'curl https://request.usestring.ai/v1/search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "construction consulting firms", "searchCount": 30 }'Result count and paging
Without searchCount, a search returns one results page — about eight to ten organic results on Google. With it,
a Google search keeps fetching further results pages until it has collected at least searchCount organic results
or it is thirty-six pages deep, whichever comes first, and returns the first searchCount. To start from a later
page, send page.
-
Maximum 300. A larger value is rejected with a
400. -
Google often runs out first. Most queries have between about 100 and 200 Google results, so a large
searchCountusually returns every result Google has, withstoppedBy: "end_of_results", rather than the full count. -
Positions continue across pages.
results[].positionruns 1, 2, 3 … through the whole list rather than restarting on each page, and a document Google repeats on a later page is kept once, at its first position.results[].rankis each result's own Google rank; see Results. -
Surfaces come from the first page only.
places,entity,ads,overviews,relatedSearches,peopleAlsoAskand the rest describe the first results page; later pages contribute organic results and nothing else. -
pagingreports how the request was filled. It is present only whensearchCountwas sent:{ "pages": 3, "complete": true, "stoppedBy": "search_count" }.pagesis the number of results pages that answered.stoppedBysays why paging stopped:stoppedByMeaning completesearch_countsearchCountresults were collected.trueend_of_resultsGoogle had no more organic results, or the first page carried none (a query answered by a local pack or a knowledge panel alone is not paged). truepage_capThe search reached its thirty-six-page limit. Google may have more results. truepage_failedA later page could not be fetched. falsedeadlineThe search's 45-second time budget ran out before searchCountwas reached.falseWhen
completeisfalsethe response is still a200carrying the results collected so far. -
Each page that answered is billed as one search. A request that collected results from three pages is billed as three searches at the rate on Pricing; a later page that failed or came back empty is not billed and is not counted in
pages. Google carries about eight to ten organic results a page, so asearchCountof 100 is typically eleven to thirteen pages and is billed as that many searches. A search that pages to the end of Google's results is typically ten to twenty-five pages, and never more than thirty-six. -
Google AI Mode rejects
searchCountwith a400: it answers with one generated answer, not ranked results. -
"format": "raw"rejectssearchCountwith a400: raw returns one Google results page per request, so ask for each page withpage.
Page
page picks the Google results page to start from, 1-based: page N is the page Google itself shows as N. It is an
integer from 1 to 30 and defaults to 1.
- Without
searchCount, the response is that one page. With"format": "raw"this is the only form: raw returns page N as HTML and rejectssearchCount. - With
searchCount,searchCountresults are collected starting from that page, paged as described in Result count and paging. pageandsearchCounttogether stay within the first 300 results. Page N starts at result (N-1)×10+1, so withpageset,searchCountmay be at most 300 - (N-1)×10; page 30 allows asearchCountof up to 10. A larger value is rejected with a400that states the maximum.positionstays 1-based within the response, andrankis Google's. The first result of page 3 hasposition1 andrank21.- A page past Google's last result is empty, not an error. It returns an empty
resultswithzeroResults: true. - Separate
pagerequests can repeat or skip a result. Page N starts at Google's result (N-1)×10+1, but a Google page holds about eight to ten organic results, so a result can appear on two consecutivepagerequests or on neither. For one list without repeats, send a single request withsearchCountinstead.
curl https://request.usestring.ai/v1/search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "construction consulting firms", "page": 3 }'Date range and sort order
dateRange limits results to a publication window. Send one of "hour", "day", "week", "month" or "year"
for the past hour through the past year, or an object with ISO calendar dates (YYYY-MM-DD) for a custom range:
| Field | Type | Description |
|---|---|---|
from | string | First day of the range, inclusive, such as "2024-01-01". Optional. |
to | string | Last day of the range, inclusive, such as "2024-06-30". Optional. |
A custom range needs from, to or both, and from must not be after to; either mistake, or a date that is not
an ISO calendar date, is rejected with a 400.
sortBy orders the results: "relevance", the default, is Google's own ranking, and "date" puts the newest results
first.
curl https://request.usestring.ai/v1/search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "interest rate decision", "dateRange": "week", "sortBy": "date" }'curl https://request.usestring.ai/v1/search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "interest rate decision", "dateRange": { "from": "2024-01-01", "to": "2024-06-30" } }'News articles are not a /search option: use the Google News site integration,
POST /v1/integrations/googlenews/search.
Search type
searchType picks the Google tab to search. "web", the default, is the ordinary results page that the rest of this
page describes. The other tabs answer in the shape of what they show:
searchType | Answer | Per page | Pages |
|---|---|---|---|
"web" | results, with the page's other blocks beside them | about 10 | 30 |
"videos" | results, each with video: channel, platform and duration | about 10 | 30 |
"books" | results, each with book: authors and published | about 10 | 30 |
"forums" | results, forum and discussion threads | about 10 | 30 |
"images" | images, with the image file's URL and size | about 100 | 3 |
"places" | places, business listings | 20 | 15 |
"shopping" | products, product listings | about 55 | 1 |
With "images", "places" or "shopping", results is empty. Google News is not a searchType: use the Google
News site integration.
- Each page is billed as one search, as on the web. One
"images"search returns about 100 images and one"shopping"search about 55 products, for the price of one search. pageandsearchCountwork on every tab except"shopping". On"images",pageis 1 to 3 and asearchCountof up to 300 collects across the three pages, usually about 270 images, since a later page repeats some of the previous one's and each image is kept once. On"places", page N starts at business (N-1)×20+1. On"shopping", Google shows a single page:pagemust be1, andsearchCountreturns at most the products that page holds.- A page past the tab's last result is empty, not an error, and is billed as one search, as on the web.
dateRange,sortByandverbatimapply to"web","videos"and"forums"only."format": "raw"andaiOverviewapply to"web"only. Any of them sent with another tab is rejected with a400that names the field.
curl https://request.usestring.ai/v1/search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "eames lounge chair", "searchType": "images", "searchCount": 150 }'Filters
These narrow a Google search on every tab, and each one applies to every page a searchCount search fetches.
| Field | Effect |
|---|---|
safeSearch: true | Removes explicit results (Google SafeSearch). |
includeOmittedResults: true | Includes the results Google normally hides as very similar to ones already shown, such as a site's other language editions. |
autocorrect: false | Searches the query exactly as sent. Without it, Google may search a corrected spelling instead and report it in spelling. |
restrictCountry: "FR" | Returns only pages from that country. Unlike country, which sets where the search is made from, this filters the results. |
verbatim: true | Matches the query's words exactly, without synonyms or variations. "web", "videos" and "forums" only. |
curl https://request.usestring.ai/v1/search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "climate policy", "restrictCountry": "FR", "safeSearch": true }'Raw HTML
format is "structured" (the default), for results as JSON, or "raw", for HTML. We recommend "structured". With
"raw" the response is the Google results page as HTML (Content-Type: text/html), one page per request. Choose the
page with page; each raw request is billed as one search.
curl https://request.usestring.ai/v1/search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "heat pump grants", "format": "raw", "page": 2 }'<!doctype html><html lang="en">...</html>Raw supports page only, not searchCount: a raw request with searchCount is rejected with a 400:
{
"error": "Invalid request",
"details": {
"formErrors": [],
"fieldErrors": {
"searchCount": [
"searchCount does not apply to format \"raw\"; raw answers one Google results page per request, so use page"
]
}
}
}For more results as HTML, send one request per page. dateRange and sortBy work with "raw" exactly as they do
with "structured". Sending "format": "raw" with any engine
other than "google", Google AI Mode included, is rejected with a 400.
Location
Send location or coordinates with "engine": "google" to search from a place. The search is sent from that
place's country, and results are biased toward the place. The fields take the same values as for
AI Mode location: a name that cannot be placed is rejected with a 400, and if you send both,
coordinates win.
Location biases results; it does not target a city exactly. The effect is strongest for queries that ask for
something nearby, such as "plumbers near me". A bare query such as "coffee shops" may still return results from a
wider area.
curl https://request.usestring.ai/v1/search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "plumbers near me", "location": "Austin,Texas,United States" }'Google AI Mode
"engine": "google_ai_mode" asks Google AI Mode the query and returns its answer in aiMode: the text, its structure,
the pages it cites, and any products, places and videos the answer shows. results is always empty and
zeroResults is false; no other surface is returned.
curl https://request.usestring.ai/v1/search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "best trail running shoes and where to buy them in Portland", "engine": "google_ai_mode" }'{
"results": [],
"zeroResults": false,
"aiMode": {
"text": "Top trail running shoes\nThe right shoe depends on terrain and how much cushioning you want.\nShoe | Best for | Drop\nHoka Speedgoat 6 | Long, technical trails | 5 mm\nSalomon Speedcross 6 | Mud and soft ground | 10 mm\nWhere to buy in Portland\n- Try them on at a specialty running store that offers gait analysis.",
"markdown": "## Top trail running shoes\n\nThe right shoe depends on terrain and how much cushioning you want.\n\n| Shoe | Best for | Drop |\n| --- | --- | --- |\n| Hoka Speedgoat 6 | Long, technical trails | 5 mm |\n| Salomon Speedcross 6 | Mud and soft ground | 10 mm |\n\n## Where to buy in Portland\n\n- Try them on at a specialty running store that offers gait analysis.",
"blocks": [
{ "type": "heading", "text": "Top trail running shoes", "level": 2 },
{ "type": "paragraph", "text": "The right shoe depends on terrain and how much cushioning you want." },
{
"type": "table",
"header": ["Shoe", "Best for", "Drop"],
"rows": [
["Hoka Speedgoat 6", "Long, technical trails", "5 mm"],
["Salomon Speedcross 6", "Mud and soft ground", "10 mm"]
]
},
{ "type": "heading", "text": "Where to buy in Portland", "level": 2 },
{ "type": "list", "ordered": false, "items": ["Try them on at a specialty running store that offers gait analysis."] }
],
"sources": [
{
"title": "The Best Trail Running Shoes of 2026",
"url": "https://www.runnersworld.com/gear/best-trail-running-shoes",
"snippet": "The Speedgoat remains our pick for long days on rocky, technical terrain.",
"source": "Runner's World"
},
{ "title": "Speedcross 6 review", "source": "Reddit" }
],
"products": [
{
"title": "Hoka Speedgoat 6",
"price": "$124.95",
"oldPrice": "$155.00",
"merchant": "REI",
"moreSellers": true,
"rating": 4.6,
"reviews": 1840,
"thumbnail": "https://encrypted-tbn0.gstatic.com/shopping?q=tbn:example",
"productId": "4127739520180348614",
"url": "https://www.google.com/search?ibp=oshop&prds=pid:4127739520180348614"
}
],
"places": [
{
"name": "Portland Running Company",
"category": "Running store",
"rating": 4.8,
"reviews": 412,
"priceLevel": "$$",
"status": "Open · Closes 7 PM",
"address": "3044 SE Division St, Portland, OR",
"description": "Staff fit you after a gait analysis on the in-store treadmill.",
"url": "https://www.google.com/search?q=Portland+Running+Company&ludocid=1234567890"
}
]
}
}Every field except text and sources is absent when the answer has none.
| Field | Type | Description |
|---|---|---|
text | string | The answer as plain text in reading order: one block per line, list items prefixed - , and a table row per line with its cells joined by |. |
markdown | string | The same answer as Markdown, with headings, lists, tables and fenced code blocks. |
blocks | array | The answer's structure in reading order, one entry per paragraph, heading, list, table or code block. See below. |
sources | array | The pages the answer cites, in order. Empty when Google cited none. See below. |
products | array | Products the answer recommends. See below. |
places | array | Businesses and places the answer names. See below. |
videos | array | Videos the answer cites. See below. |
Each entry in blocks has a type, which decides the other fields it carries:
type | Fields |
|---|---|
"paragraph" | text. |
"heading" | text and level, the heading level. |
"list" | items, one string per item, and ordered, true for a numbered list. |
"table" | header, the column names, and rows, each an array with one cell per column. |
"code" | text with its line breaks kept, and language when the block is labelled with one. |
| Source field | Type | Description |
|---|---|---|
title | string | The cited page's title. Optional. |
url | string | The cited page. Absent when the citation could not be resolved. |
snippet | string | The passage the citation quotes. Optional. |
source | string | The site's name, such as "Reddit". Optional. |
| Product field | Type | Description |
|---|---|---|
title | string | Product name. A product the answer cites without showing a card carries only title, productId and url. |
price | string | Price as displayed, such as "$84.99" or "$33.29/mo". Optional. |
oldPrice | string | The price before a reduction, as displayed. Present only when the product is on sale. |
merchant | string | The seller the product card names. Optional. |
moreSellers | boolean | true when other sellers offer the product too. Optional. |
rating | number | Average rating. Optional. |
reviews | integer | Number of reviews. Optional. |
thumbnail | string | Product image URL. Optional. |
productId | string | Google's product ID. Optional. |
url | string | Google's page for the product. Optional. |
| Place field | Type | Description |
|---|---|---|
name | string | Business or place name. |
category | string | Kind of place, such as "Running store". Optional. |
rating | number | Average rating. Optional. |
reviews | integer | Number of reviews. Returned for English-language answers only. |
priceLevel | string | Price range as displayed, such as "$$". Optional. |
status | string | Opening status as displayed, such as "Open · Closes 7 PM". Optional. |
address | string | Street address. Optional. |
description | string | What the answer says about the place. Optional. |
url | string | Google's page for the place. Optional. |
| Video field | Type | Description |
|---|---|---|
title | string | Video title. |
url | string | The video's page. Optional. |
channel | string | Channel or uploader. Optional. |
duration | string | Length as displayed, such as "8:12". Optional. |
thumbnail | string | Thumbnail image URL. Optional. |
- Country and language apply as for
"google": they choose the Google domain and the answer's locale. Withlocationorcoordinates, the search is sent from that place's country instead, and the answer stays inlanguage(or the default language for thecountryyou sent). - Billed as one search at the same rate as any other search. A request that fails is not billed.
- Unavailable answers fail. If an AI Mode answer isn't available for a query, the request returns a
502rather than a results page. Retrying may succeed. - The same answer is returned when you send a Google AI Mode URL (
https://www.google.com/search?q=...&udm=50) to Fetch.
AI Mode location
AI Mode answers for a place when you send location or coordinates. The answer is given for that place, and the
search is sent from the country the place is in. The same fields work with "engine": "google", where they bias
results toward the place (see Location); sending either with any other engine is rejected with a 400.
-
locationis a place name, 1 to 200 characters: a city such as"London", or a fuller name such as"London,England,United Kingdom"or"Paris,Texas,United States"when the short name is ambiguous. A name that is only a country, such as"France", uses that country with no finer point. A name that cannot be placed is rejected with a400; sendcoordinatesinstead. -
coordinatesis the exact point:Field Type Description latitudenumber Required. Decimal degrees, -90 to 90. longitudenumber Required. Decimal degrees, -180 to 180. radiusinteger How precise the point is, in meters, 1 to 1,000,000. Default 5000. -
If you send both,
coordinateswin. -
Without either, a question that depends on where you are, such as today's weather or "near me", may be answered without a location.
curl https://request.usestring.ai/v1/search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "what is the weather today", "engine": "google_ai_mode", "location": "London" }'curl https://request.usestring.ai/v1/search \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "best bakeries near me", "engine": "google_ai_mode", "coordinates": { "latitude": 48.8566, "longitude": 2.3522 } }'Response
Every field beside results, zeroResults and paging is a surface Google rendered around the ranked documents.
Each one is present only when the page carried it, so a typical response has results and zeroResults alone, and
only Google returns any of them. Nothing in these fields is ever placed in results, and none of them makes a page
with no documents a successful search.
{
"results": [
{
"position": 1,
"title": "How to Choose Running Shoes",
"url": "https://www.rei.com/learn/expert-advice/running-shoes.html",
"displayUrl": "https://www.rei.com › learn",
"displayText": "https://www.rei.com › learn",
"snippet": "A short description of the page as shown on the results page."
},
{
"position": 2,
"title": "Best running shoes for beginners?",
"url": "https://www.reddit.com/r/running/comments/example/best_running_shoes_for_beginners/",
"displayUrl": "",
"displayText": "20+ comments · 3 months ago",
"source": "Reddit · r/running",
"snippet": "A short description of the page as shown on the results page."
}
],
"zeroResults": false,
"spelling": { "kind": "suggested", "query": "running shoes", "asked": "runing shoes" },
"ads": [
{ "position": 1, "format": "text", "block": "top", "title": "Running Shoes Sale", "url": "https://www.example-shop.com/running", "displayUrl": "www.example-shop.com", "advertiser": "Example Shop" }
],
"places": [
{ "position": 1, "name": "Example Running Store", "category": "Shoe store", "rating": 4.8, "reviews": 312, "address": "10 High St", "phone": "(555) 010-2000", "hours": "Open ⋅ Closes 7 PM", "url": "https://www.example-running.com/" }
],
"entity": {
"title": "Example Running Store",
"subtitle": "Shoe store in Springfield, Ohio",
"descriptionSource": { "name": "Example Running Store", "url": "https://www.example-running.com/about" },
"rating": 4.8,
"reviews": 312,
"website": { "url": "https://www.example-running.com/" },
"attributes": [{ "label": "Address", "value": "10 High St, Springfield, OH 45501" }],
"profiles": [],
"unread": []
},
"relatedSearches": ["trail running shoes", "best running shoes 2026"],
"peopleAlsoAsk": [{ "question": "How often should you replace running shoes?" }],
"answers": {
"unitConversion": { "category": "Length", "value": 5, "from": "mile", "result": 8.04672, "to": "kilometer" }
},
"videos": [
{ "position": 1, "title": "How to pick running shoes", "url": "https://www.youtube.com/watch?v=example", "platform": "YouTube", "channel": "Example Channel", "date": "Mar 2, 2026", "duration": "8:12" }
],
"discussions": [
{ "position": 1, "title": "What running shoes do you actually wear?", "url": "https://www.reddit.com/r/running/comments/example", "site": "Reddit", "forum": "r/running", "comments": "140+ comments", "age": "2mo" }
],
"sitelinks": [
{ "position": 1, "resultPosition": 1, "title": "Men's", "url": "https://www.rei.com/c/mens-running-shoes" }
],
"overviews": [
{
"text": "Running shoes are primarily categorized by terrain and by the runner's gait.\n- Daily trainers: cushioned shoes for most weekly mileage.",
"sources": [{ "title": "How to Choose Running Shoes", "url": "https://www.rei.com/learn/expert-advice/running-shoes.html" }]
},
{ "topic": "Types", "question": "What are the different types of running shoes?", "text": "Road, trail, and track shoes differ in outsole and cushioning.", "sources": [] }
]
}| Field | Type | Description |
|---|---|---|
results | array | Ranked web results, in the order the engine ranked them. Empty when the page carried no documents. Not sent with "format": "raw". |
zeroResults | boolean | true when the engine itself reported that nothing matched the query. See below. |
paging | object | How a searchCount request was filled: pages fetched, whether it is complete, and why it stopped (stoppedBy). Present only when searchCount was sent. See Result count and paging. |
spelling | object | Google's correction or suggestion for the query. See below. |
ads | array | Sponsored results, kept apart from results. See below. |
places | array | Business listings from a local pack, or with "searchType": "places" the whole answer. See below. |
products | array | Product listings. Present only with "searchType": "shopping". See below. |
entity | object | The knowledge panel for the one business or person the query named. See below. |
relatedSearches | array | Query strings from the "Related searches" block. |
peopleAlsoAsk | array | Questions from the "People also ask" block, each { question }. Answers load on expansion and are not on the page. |
answers | object | Single-purpose widgets: local time, currency, unit conversion, weather, translation, sports, flights. See below. |
videos | array | Entries of the "Videos" block. See below. |
shortVideos | array | Entries of the "Short videos" block, same shape as videos. |
discussions | array | Threads from "Discussions and forums". See below. |
images | array | Source pages of the "Images" block, or with "searchType": "images" the whole answer. See below. |
sitelinks | array | Sub-pages listed under a navigational result. See below. |
overviews | array | Google's generated summaries, the query's own first and the "Things to know" tabs after it. See below. |
aiMode | object | Google's AI Mode answer: text, markdown, blocks, sources, and any products, places and videos it shows. Present only with "engine": "google_ai_mode". See Google AI Mode. |
Results
Every entry in results is a web document. Nothing else is ever placed in this list, so its length is always the
number of ranked pages the engine returned.
| Field | Type | Description |
|---|---|---|
position | integer | 1-based place in this response's results. Continues across pages on a searchCount request and restarts at 1 on every request. |
rank | integer | The result's absolute Google rank: the offset of the page it came from plus its place on that page, so the first result of page 3 has rank 21. A Google page holds about eight to ten organic results, so ranks can skip numbers. Google only. |
title | string | Result title. |
url | string | The page the result links to, with no redirect or tracking parameters. Safe to fetch directly. Absent when Google linked the result only through a redirect whose destination is not known; the result is still returned with its title, displayed URL and snippet. |
displayUrl | string | Google's displayed URL line: a breadcrumb such as https://site.com › a › b, a bare host, or a host and a date. Empty when Google shows no URL line. Cosmetic; it is not guaranteed to be a fetchable address. |
displayText | string | The source line Google shows under the title, verbatim. It may be a URL, engagement counts such as 20+ comments · 3 months ago or 63K+ followers, or other text. Google only. |
source | string | The site name Google shows beside the result, such as Reddit · r/buildapc. Optional; Google only. |
snippet | string | Result description text. |
video | object | With "searchType": "videos": channel, the publisher; platform, such as "YouTube"; and duration, such as "12:48". Each optional. |
book | object | With "searchType": "books": authors, an array of names, and published, the year or date. Each optional. |
Use url to fetch a result. displayUrl is never built from url. Google shows no URL line for many social and
forum results, including Reddit, YouTube, Instagram, Facebook, LinkedIn, Quora, Stack Overflow, X and Pinterest, and
for those displayUrl is an empty string. displayText holds whatever Google shows in that line, in the results
page's language, so a German search can return Ca. 50 Kommentare · vor 1 Jahr. Treat it as display text, not as a
URL or a number.
Empty results
An empty results array has two different causes, and zeroResults tells them apart:
zeroResults: true— the engine answered and reported that nothing matched. Retrying will not help; broaden the query instead.zeroResults: false— the page carried no ranked documents but was not a no-match page. On Google this is a query answered with a local pack (seeplaces) or a knowledge panel (seeentity); check those fields before treating the response as empty. No other surface can stand in for results: a page with only ads or only a generated summary is a failed search and is reported with a non-200status.
A search that could not be completed at all is reported with a non-200 status code, never as an empty 200.
Spelling
When Google corrects the query, spelling says what it did. kind is "substituted" when Google searched the
corrected query in place of the one asked and the results are for that query, or "suggested" when it only offered
one and the results are for the query as typed. query is the corrected text and asked the original.
Ads
Sponsored results, in page order, kept out of results so a caller counting documents never counts an
advertisement.
| Field | Type | Description |
|---|---|---|
position | integer | 1-based order within the page's ad blocks. |
format | string | "text" or "shopping". |
block | string | Where the ad sat, such as "top" or "bottom". |
title | string | Ad headline. Optional. |
url | string | The advertiser's destination. Absent when Google hid it; the ad is still returned. |
displayUrl | string | Address as shown. Optional. |
advertiser | string | Advertiser name as shown. Optional. |
Places
Google answers some queries — typically one naming a business, a professional, or a service in a town — with a local
pack of business listings and few or no web results. Those listings are returned in places, never in results, so
a caller that counts or iterates results sees only documents. places is present only when the results page
carried a local pack; when it is absent the page had none.
{
"results": [],
"zeroResults": false,
"places": [
{
"position": 1,
"name": "Example Dental",
"category": "Dentist",
"rating": 4.9,
"reviews": 726,
"address": "123 High St #200",
"phone": "(555) 010-4040",
"hours": "Open ⋅ Closes 5 PM",
"url": "https://www.example-dental.com/",
"mapsUrl": "https://www.google.com/maps/dir//Example+Dental,+123+High+St+%23200,+Springfield,+OH+45501"
}
]
}| Field | Type | Description |
|---|---|---|
position | integer | 1-based order of the listing in the pack. |
name | string | Business name. |
category | string | Business category as Google labels it, such as "Dentist". Optional. |
rating | number | Star rating out of 5. Optional. |
reviews | integer | Review count as Google displays it; rounded past a thousand. Optional. |
address | string | Street address line shown on the listing. Optional. |
phone | string | Phone number as shown. Optional. |
hours | string | Opening-hours line as shown, such as "Open ⋅ Closes 5 PM". Optional. |
url | string | The business's own website, when the listing links to one. Optional. |
mapsUrl | string | Google Maps directions link. Its path carries the full postal address, including city and postcode. Optional. |
Images
With "searchType": "images", images is the answer: one entry per image, in Google's order.
| Field | Type | Description |
|---|---|---|
position | integer | 1-based place in this response's images. Continues across pages on a searchCount request. |
title | string | The image's title, as Google shows it. |
url | string | The page the image appears on. |
source | string | The site's name, such as "Wikipedia". Optional. |
imageUrl | string | The image file itself. Optional. |
imageWidth | integer | The image file's width in pixels. Optional. |
imageHeight | integer | The image file's height in pixels. Optional. |
thumbnail | string | Google's resized copy of the image. Optional. |
On a "web" search, images is the page's "Images" block instead, and its entries carry position, title, url
and source only.
Products
With "searchType": "shopping", products is the answer: one entry per product listing, in Google's order.
| Field | Type | Description |
|---|---|---|
position | integer | 1-based place in this response's products. |
title | string | Product name. |
productId | string | Google's product ID. Optional. |
price | string | Price as displayed, currency symbol included, such as "$169.00". Optional. |
originalPrice | string | The price before a reduction, as displayed. Present only when the product is on sale. |
merchant | string | The seller the listing names. Optional. |
moreMerchants | boolean | true when other sellers offer the product too. Optional. |
delivery | string | Delivery terms as displayed, such as "Free delivery". Optional. |
returns | string | Return terms as displayed, such as "30-day returns". Optional. |
rating | number | Average rating out of 5. Optional. |
reviews | integer | Number of reviews, rounded as Google shows it past a thousand. Optional. |
A product listing has no url: Google links it only to its own product page.
Entity panel
When a query names one business or person — a practice in a town, a public figure, a landmark — Google often answers
with a knowledge panel and few or no web results. That card is returned in entity, never in results, so a caller
that counts or iterates results still sees only documents. entity is present only when the results page carried a
panel; when it is absent the page had none. A page can carry both a local pack and a panel, in which case both
places and entity are returned.
{
"results": [],
"zeroResults": false,
"entity": {
"title": "Example Aesthetics and Wellness",
"subtitle": "Medical spa in Springfield, Ohio",
"description": "Example Aesthetics offers injectables, laser treatments and wellness services in a boutique setting.",
"descriptionSource": {
"name": "Example Aesthetics",
"url": "https://www.example-aesthetics.com/about"
},
"rating": 5,
"reviews": 12,
"website": {
"url": "https://www.example-aesthetics.com/"
},
"attributes": [
{ "id": "kc:/local:address", "label": "Address", "value": "26 E Main St B, Springfield, OH 45501" },
{ "label": "Phone", "value": "(555) 010-1056" },
{ "label": "Hours", "value": "Closed ⋅ Opens 8 AM Mon" }
],
"profiles": [
{ "name": "Instagram", "url": "https://www.instagram.com/example-aesthetics/" }
],
"unread": ["kc:/local:popular_times"]
}
}| Field | Type | Description |
|---|---|---|
title | string | The entity's name as the panel heads it. |
subtitle | string | The type line under the name, such as "Medical spa in Springfield, Ohio" or "Theoretical physicist". Optional. |
description | string | The panel's summary paragraph. Optional. |
descriptionSource | object | Where the description came from: name and the resolved url when there is one. Wikipedia for most entities; the business itself for a merchant blurb. |
rating | number | Star rating out of 5. Optional. |
reviews | integer | Review count as Google displays it; rounded past a thousand. Optional. |
website | object | The panel's Website button, with the resolved url when there is one. url is absent when the button led nowhere readable. |
attributes | array | Labelled facts in panel order, each with a label, a value, and the Google attribute id when the row carried one. |
profiles | array | Social-media links from the panel's Profiles module, each with a name and url. |
unread | array | Attribute ids of panel modules that were not read, such as a popular-times chart. Empty when the whole card was read. |
Related searches and People also ask
relatedSearches is the list of query strings Google suggests at the foot of the page. peopleAlsoAsk is the list
of collapsed questions, each as { "question": "…" }; Google fetches an answer only when a reader expands one, so no
answer text is on the page.
Answer widgets
For a query whose shape triggers one, Google renders a single-purpose widget above the results, and answers carries
it under one of localTime, currency, unitConversion, weather, translation, sports, or flights. Each is
present only when the page carried that widget. A conversion carries value, from, result and to; weather
carries current conditions and a forecast list; a translation carries the source and translated text and, when
shown, a dictionary; sports carries a team and its games; flights carries the route and its options.
Ranked blocks
Google shows several ranked lists apart from the documents, and each stays apart here. Every entry carries a
position and a title, and a url when its destination is known.
videosandshortVideosaddplatform,channel,dateanddurationwhere shown.discussionsaddssite,forum,comments,ageandexcerptwhere shown.imagesaddssource, the site the image came from.sitelinksaddsresultPosition, the rank of the result the sub-page sits under, anddescriptionwhere shown.
AI overviews
overviews is every generated summary the page carried. The query's own overview, when Google composed one, comes
first with no topic; entries with a topic and a question are the "Things to know" tabs beneath it, one per
sub-question Google chose. When Google rendered the frame and declined to answer, the list holds one entry with
declined: true and no text; that is a third state, and retrying will not produce an answer. A streamed overview
also comes back as declined: true unless the request set aiOverview; see Streamed AI Overviews. Google omits the
summary on many queries, so absence means nothing about the query.
| Field | Type | Description |
|---|---|---|
topic | string | The tab's title. Absent on the query's own overview. |
question | string | The sub-question a tab answers, as Google phrased it. Absent on the query's own overview. |
declined | boolean | true when Google rendered the frame and did not answer. Absent otherwise. |
text | string | The summary as plain text in reading order. Paragraphs and list items are on their own lines; list items start with - . |
sources | array | The pages the summary cites, in order, each with a title and a url. url is absent when the citation could not be resolved. |
A summary is never a result. A page with an overview and no documents is still a failed search.
Streamed AI Overviews
Google renders many AI Overviews as a placeholder and streams the summary in after the page has loaded. Reading that stream takes a second request, made after the results page, so it is off by default:
- Off by default. Without
aiOverview, an AI Overview already present in the page is returned as usual. A streamed one is returned as an entry withdeclined: trueand no text. "aiOverview": truefills it. The request makes a second, sequential fetch to read the stream, and the overview arrives with itstextandsources.- It adds latency. Measured on production traffic from 2026-09-30 to 2026-10-01, about 64% of results pages carried a streamed overview, and filling it added about 2.8 s at p50 and 5.6 s at p90 to those requests.
- It costs 2x a normal search. A request with
"aiOverview": trueis billed as two searches. WithsearchCount, only the first page carries the overview and the extra charge; later pages bill as one search each. A request that fails is not billed.
curl -X POST https://request.usestring.ai/v1/search \
-H "Authorization: Bearer $STRING_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "best cushioned marathon shoes", "aiOverview": true }'Only Google returns these surfaces. Other engines return results and zeroResults only.
Status codes
| Status | Meaning |
|---|---|
200 | Search completed. |
400 | Validation error (missing query, an invalid option, an unrecognized field, or a location that cannot be placed). |
401 | Missing or invalid API key. |
402 | Insufficient account balance. |
403 | Verification challenge that could not be cleared. |
429 | Rate limit exceeded. |
500 | Internal error. |
502 | The search could not be completed, such as a Google AI Mode answer that could not be read. |
See Search overview for billing.