<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="customsearch_v1.html">Custom Search API</a> . <a href="customsearch_v1.cse.html">cse</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="customsearch_v1.cse.siterestrict.html">siterestrict()</a></code>
</p>
<p class="firstline">Returns the siterestrict Resource.</p>

<p class="toc_element">
  <code><a href="#list">list(imgSize=None, cx=None, orTerms=None, exactTerms=None, hq=None, relatedSite=None, siteSearch=None, lowRange=None, excludeTerms=None, highRange=None, fileType=None, cr=None, lr=None, imgColorType=None, imgDominantColor=None, gl=None, filter=None, googlehost=None, start=None, num=None, hl=None, sort=None, imgType=None, rights=None, dateRestrict=None, siteSearchFilter=None, q=None, searchType=None, linkSite=None, c2coff=None, safe=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns metadata about the search performed, metadata about the custom</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="list">list(imgSize=None, cx=None, orTerms=None, exactTerms=None, hq=None, relatedSite=None, siteSearch=None, lowRange=None, excludeTerms=None, highRange=None, fileType=None, cr=None, lr=None, imgColorType=None, imgDominantColor=None, gl=None, filter=None, googlehost=None, start=None, num=None, hl=None, sort=None, imgType=None, rights=None, dateRestrict=None, siteSearchFilter=None, q=None, searchType=None, linkSite=None, c2coff=None, safe=None, x__xgafv=None)</code>
  <pre>Returns metadata about the search performed, metadata about the custom
search engine used for the search, and the search results.

Args:
  imgSize: string, Returns images of a specified size. Acceptable values are:

* `&quot;huge&quot;`

* `&quot;icon&quot;`

* `&quot;large&quot;`

* `&quot;medium&quot;`

* `&quot;small&quot;`

* `&quot;xlarge&quot;`

* `&quot;xxlarge&quot;`
  cx: string, The custom search engine ID to use for this request.
  orTerms: string, Provides additional search terms to check for in a document, where each
document in the search results must contain at least one of the additional
search terms.
  exactTerms: string, Identifies a phrase that all documents in the search results must contain.
  hq: string, Appends the specified query terms to the query, as if they were combined
with a logical AND operator.
  relatedSite: string, Specifies that all search results should be pages that are related to the
specified URL.
  siteSearch: string, Specifies a given site which should always be included or excluded from
results (see `siteSearchFilter` parameter, below).
  lowRange: string, Specifies the starting value for a search range. Use `lowRange` and
`highRange` to append an inclusive search range of `lowRange...highRange`
to the query.
  excludeTerms: string, Identifies a word or phrase that should not appear in any documents in the
search results.
  highRange: string, Specifies the ending value for a search range.

* Use `lowRange` and `highRange` to append an inclusive search range of
`lowRange...highRange` to the query.
  fileType: string, Restricts results to files of a specified extension. A list of file types
indexable by Google can be found in Search Console [Help
Center](https://support.google.com/webmasters/answer/35287).
  cr: string, Restricts search results to documents originating in a particular country.
You may use [Boolean
operators](https://developers.google.com/custom-search/docs/xml_results_appendices#booleanOperators)
in the cr parameter&#x27;s value.

Google Search determines the country of a document by analyzing:

* the top-level domain (TLD) of the document&#x27;s URL

* the geographic location of the Web server&#x27;s IP address

See the [Country Parameter
Values](https://developers.google.com/custom-search/docs/xml_results_appendices#countryCollections)
page for a list of valid values for this parameter.
  lr: string, Restricts the search to documents written in a particular language (e.g.,
`lr=lang_ja`).

Acceptable values are:

* `&quot;lang_ar&quot;`: Arabic

* `&quot;lang_bg&quot;`: Bulgarian

* `&quot;lang_ca&quot;`: Catalan

* `&quot;lang_cs&quot;`: Czech

* `&quot;lang_da&quot;`: Danish

* `&quot;lang_de&quot;`: German

* `&quot;lang_el&quot;`: Greek

* `&quot;lang_en&quot;`: English

* `&quot;lang_es&quot;`: Spanish

* `&quot;lang_et&quot;`: Estonian

* `&quot;lang_fi&quot;`: Finnish

* `&quot;lang_fr&quot;`: French

* `&quot;lang_hr&quot;`: Croatian

* `&quot;lang_hu&quot;`: Hungarian

* `&quot;lang_id&quot;`: Indonesian

* `&quot;lang_is&quot;`: Icelandic

* `&quot;lang_it&quot;`: Italian

* `&quot;lang_iw&quot;`: Hebrew

* `&quot;lang_ja&quot;`: Japanese

* `&quot;lang_ko&quot;`: Korean

* `&quot;lang_lt&quot;`: Lithuanian

* `&quot;lang_lv&quot;`: Latvian

* `&quot;lang_nl&quot;`: Dutch

* `&quot;lang_no&quot;`: Norwegian

* `&quot;lang_pl&quot;`: Polish

* `&quot;lang_pt&quot;`: Portuguese

* `&quot;lang_ro&quot;`: Romanian

* `&quot;lang_ru&quot;`: Russian

* `&quot;lang_sk&quot;`: Slovak

* `&quot;lang_sl&quot;`: Slovenian

* `&quot;lang_sr&quot;`: Serbian

* `&quot;lang_sv&quot;`: Swedish

* `&quot;lang_tr&quot;`: Turkish

* `&quot;lang_zh-CN&quot;`: Chinese (Simplified)

* `&quot;lang_zh-TW&quot;`: Chinese (Traditional)
  imgColorType: string, Returns black and white, grayscale, transparent, or color images.
Acceptable values are:

* `&quot;color&quot;`

* `&quot;gray&quot;`

* `&quot;mono&quot;`: black and white

* `&quot;trans&quot;`: transparent background
  imgDominantColor: string, Returns images of a specific dominant color. Acceptable values are:

* `&quot;black&quot;`

* `&quot;blue&quot;`

* `&quot;brown&quot;`

* `&quot;gray&quot;`

* `&quot;green&quot;`

* `&quot;orange&quot;`

* `&quot;pink&quot;`

* `&quot;purple&quot;`

* `&quot;red&quot;`

* `&quot;teal&quot;`

* `&quot;white&quot;`

* `&quot;yellow&quot;`
  gl: string, Geolocation of end user.

* The `gl` parameter value is a two-letter country code. The `gl` parameter
boosts search results whose country of origin matches the parameter value.
See the [Country
Codes](https://developers.google.com/custom-search/docs/xml_results_appendices#countryCodes)
page for a list of valid values.

* Specifying a `gl` parameter value should lead to more relevant results.
This is particularly true for international customers and, even more
specifically, for customers in English- speaking countries other than the
United States.
  filter: string, Controls turning on or off the duplicate content filter.

* See [Automatic
Filtering](https://developers.google.com/custom-search/docs/xml_results#automaticFiltering)
for more information about Google&#x27;s search results filters. Note that host
crowding filtering applies only to multi-site searches.

* By default, Google applies filtering to all search results to improve the
quality of those results.

Acceptable values are:

* `0`: Turns off duplicate content filter.

* `1`: Turns on duplicate content filter.
  googlehost: string, **Deprecated**. Use the `gl` parameter for a similar effect.

The local Google domain (for example, google.com, google.de, or
google.fr) to use to perform the search.
  start: integer, The index of the first result to return. The default number of results per
page is 10, so `&amp;start=11` would start at the top of the second page of
results. **Note**: The JSON API will never return more than 100 results,
even if more than 100 documents match the query, so setting the sum of
`start + num` to a number greater than 100 will produce an error. Also note
that the maximum value for `num` is 10.
  num: integer, Number of search results to return.

* Valid values are integers between 1 and 10, inclusive.
  hl: string, Sets the user interface language.

* Explicitly setting this parameter improves the performance and the
quality of your search results.

* See the [Interface
Languages](https://developers.google.com/custom-search/docs/xml_results#wsInterfaceLanguages)
section of [Internationalizing Queries and Results
Presentation](https://developers.google.com/custom-search/docs/xml_results#wsInternationalizing)
for more information, and (Supported Interface
Languages)[https://developers.google.com/custom-search/docs/xml_results_appendices#interfaceLanguages]
for a list of supported languages.
  sort: string, The sort expression to apply to the results.
  imgType: string, Returns images of a type. Acceptable values are:

* `&quot;clipart&quot;`

* `&quot;face&quot;`

* `&quot;lineart&quot;`

* `&quot;stock&quot;`

* `&quot;photo&quot;`

* `&quot;animated&quot;`
  rights: string, Filters based on licensing. Supported values include: `cc_publicdomain`,
`cc_attribute`, `cc_sharealike`, `cc_noncommercial`, `cc_nonderived` and
combinations of these. See [typical
combinations](https://wiki.creativecommons.org/wiki/CC_Search_integration).
  dateRestrict: string, Restricts results to URLs based on date. Supported values include:

* `d[number]`: requests results from the specified number of past days.

* `w[number]`: requests results from the specified number of past weeks.

* `m[number]`: requests results from the specified number of past months.

* `y[number]`: requests results from the specified number of past years.
  siteSearchFilter: string, Controls whether to include or exclude results from the site named in the
`siteSearch` parameter.

Acceptable values are:

* `&quot;e&quot;`: exclude

* `&quot;i&quot;`: include
  q: string, Query
  searchType: string, Specifies the search type: `image`. If unspecified, results are limited to
webpages.

Acceptable values are:

* `&quot;image&quot;`: custom image search.
  linkSite: string, Specifies that all search results should contain a link to a particular
URL.
  c2coff: string, Enables or disables [Simplified and Traditional Chinese
Search](https://developers.google.com/custom-search/docs/xml_results#chineseSearch).

The default value for this parameter is 0 (zero), meaning that the feature
is enabled. Supported values are:

* `1`: Disabled

* `0`: Enabled (default)
  safe: string, Search safety level. Acceptable values are:

* `&quot;active&quot;`: Enables SafeSearch filtering.

* `&quot;off&quot;`: Disables SafeSearch filtering. (default)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response to a custom search request.
    &quot;queries&quot;: { # Query metadata for the previous, current, and next pages of results.
      &quot;nextPage&quot;: [ # Metadata representing the next page of results, if applicable.
        { # Custom search request metadata.
          &quot;searchType&quot;: &quot;A String&quot;, # Allowed values are `web` or `image`. If unspecified, results are limited
              # to webpages.
          &quot;gl&quot;: &quot;A String&quot;, # Boosts search results whose country of origin matches the parameter
              # value. See [Country
              # Codes](https://developers.google.com/custom-search/docs/xml_results#countryCodes)
              # for a list of valid values.
              #
              # Specifying a `gl` parameter value in WebSearch requests should improve
              # the relevance of results. This is particularly true for international
              # customers and, even more specifically, for customers in English-speaking
              # countries other than the United States.
          &quot;startIndex&quot;: 42, # The index of the current set of search results into the total set of
              # results, where the index of the first result is 1.
          &quot;startPage&quot;: 42, # The page number of this set of results, where the page length is set by
              # the `count` property.
          &quot;googleHost&quot;: &quot;A String&quot;, # Specifies the Google domain (for example, google.com, google.de, or
              # google.fr) to which the search should be limited.
          &quot;title&quot;: &quot;A String&quot;, # A description of the query.
          &quot;count&quot;: 42, # Number of search results returned in this set.
          &quot;highRange&quot;: &quot;A String&quot;, # Specifies the ending value for a search range. Use `cse:lowRange` and
              # `cse:highrange` to append an inclusive search range of
              # `lowRange...highRange` to the query.
          &quot;siteSearchFilter&quot;: &quot;A String&quot;, # Specifies whether to include or exclude results from the site named in
              # the `sitesearch` parameter. Supported values are:
              #
              # * `i`: include content from site
              #
              # * `e`: exclude content from site
          &quot;linkSite&quot;: &quot;A String&quot;, # Specifies that all results should contain a link to a specific URL.
          &quot;imgSize&quot;: &quot;A String&quot;, # Restricts results to images of a specified size. Supported values are:
              #
              # * `icon` (small)
              #
              # * `small | medium | large | xlarge` (medium)
              #
              # * `xxlarge` (large)
              #
              # * `huge` (extra-large)
          &quot;orTerms&quot;: &quot;A String&quot;, # Provides additional search terms to check for in a document, where each
              # document in the search results must contain at least one of the
              # additional search terms. You can also use the [Boolean
              # OR](https://developers.google.com/custom-search/docs/xml_results#BooleanOrqt)
              # query term for this type of query.
          &quot;totalResults&quot;: &quot;A String&quot;, # Estimated number of total search results. May not be accurate.
          &quot;hq&quot;: &quot;A String&quot;, # Appends the specified query terms to the query, as if they were combined
              # with a logical `AND` operator.
          &quot;outputEncoding&quot;: &quot;A String&quot;, # The character encoding supported for search results.
          &quot;imgType&quot;: &quot;A String&quot;, # Restricts results to images of a specified type. Supported values are:
              #
              # * `clipart` (Clip art)
              #
              # * `face` (Face)
              #
              # * `lineart` (Line drawing)
              #
              # * `photo` (Photo)
              #
              # * `animated` (Animated)
              #
              # * `stock` (Stock)
          &quot;relatedSite&quot;: &quot;A String&quot;, # Specifies that all search results should be pages that are related to the
              # specified URL. The parameter value should be a URL.
          &quot;imgDominantColor&quot;: &quot;A String&quot;, # Restricts results to images with a specific dominant color. Supported
              # values are:
              #
              # * `red`
              #
              # * `orange`
              #
              # * `yellow`
              #
              # * `green`
              #
              # * `teal`
              #
              # * `blue`
              #
              # * `purple`
              #
              # * `pink`
              #
              # * `white`
              #
              # * `gray`
              #
              # * `black`
              #
              # * `brown`
          &quot;excludeTerms&quot;: &quot;A String&quot;, # Identifies a word or phrase that should not appear in any documents in
              # the search results.
          &quot;filter&quot;: &quot;A String&quot;, # Activates or deactivates the automatic filtering of Google search
              # results. See [Automatic
              # Filtering](https://developers.google.com/custom-search/docs/xml_results#automaticFiltering)
              # for more information about Google&#x27;s search results filters. Valid values
              # for this parameter are:
              #
              # * `0`: Disabled
              #
              # * `1`: Enabled (default)
              #
              # **Note**: By default, Google applies filtering to all search results to
              # improve the quality of those results.
          &quot;searchTerms&quot;: &quot;A String&quot;, # The search terms entered by the user.
          &quot;imgColorType&quot;: &quot;A String&quot;, # Restricts results to images of a specified color type. Supported values
              #   are:
              #
              # * `mono` (black and white)
              #
              # * `gray` (grayscale)
              #
              # * `color` (color)
          &quot;exactTerms&quot;: &quot;A String&quot;, # Identifies a phrase that all documents in the search results must
              # contain.
          &quot;fileType&quot;: &quot;A String&quot;, # Restricts results to files of a specified extension. Filetypes supported
              # by Google include:
              #
              # * Adobe Portable Document Format (`pdf`)
              #
              # * Adobe PostScript (`ps`)
              #
              # * Lotus 1-2-3 (`wk1`, `wk2`, `wk3`, `wk4`, `wk5`, `wki`, `wks`, `wku`)
              #
              # * Lotus WordPro (`lwp`)
              #
              # * Macwrite (`mw`)
              #
              # * Microsoft Excel (`xls`)
              #
              # * Microsoft PowerPoint (`ppt`)
              #
              # * Microsoft Word (`doc`)
              #
              # * Microsoft Works (`wks`, `wps`, `wdb`)
              #
              # * Microsoft Write (`wri`)
              #
              # * Rich Text Format (`rtf`)
              #
              # * Shockwave Flash (`swf`)
              #
              # * Text (`ans`, `txt`).
              #
              # Additional filetypes may be added in the future. An up-to-date list can
              # always be found in Google&#x27;s [file type
              # FAQ](https://support.google.com/webmasters/answer/35287).
          &quot;disableCnTwTranslation&quot;: &quot;A String&quot;, # Enables or disables the [Simplified and Traditional Chinese
              # Search](https://developers.google.com/custom-search/docs/xml_results#chineseSearch)
              # feature.
              #
              # Supported values are:
              #
              # * `0`: enabled (default)
              #
              # * `1`: disabled
          &quot;rights&quot;: &quot;A String&quot;, # Filters based on licensing. Supported values include:
              #
              # * `cc_publicdomain`
              #
              # * `cc_attribute`
              #
              # * `cc_sharealike`
              #
              # * `cc_noncommercial`
              #
              # * `cc_nonderived`
          &quot;siteSearch&quot;: &quot;A String&quot;, # Restricts results to URLs from a specified site.
          &quot;cr&quot;: &quot;A String&quot;, # Restricts search results to documents originating in a particular
              # country. You may use [Boolean
              # operators](https://developers.google.com/custom-search/docs/xml_results#booleanOperators)
              # in the `cr` parameter&#x27;s value.
              #
              # Google WebSearch determines the country of a document by analyzing the
              # following:
              #
              # * The top-level domain (TLD) of the document&#x27;s URL.
              #
              # * The geographic location of the web server&#x27;s IP address.
              #
              # See [Country (cr) Parameter
              # Values](https://developers.google.com/custom-search/docs/xml_results#countryCollections)
              # for a list of valid values for this parameter.
          &quot;safe&quot;: &quot;A String&quot;, # Specifies the [SafeSearch
              # level](https://developers.google.com/custom-search/docs/xml_results#safeSearchLevels)
              # used for filtering out adult results. This is a custom property not
              # defined in the OpenSearch spec. Valid parameter values are:
              #
              # * `&quot;off&quot;`: Disable SafeSearch
              #
              # * `&quot;active&quot;`: Enable SafeSearch
          &quot;lowRange&quot;: &quot;A String&quot;, # Specifies the starting value for a search range. Use `cse:lowRange` and
              # `cse:highrange` to append an inclusive search range of
              # `lowRange...highRange` to the query.
          &quot;cx&quot;: &quot;A String&quot;, # The identifier of a custom search engine created using the Custom Search
              # [Control Panel](https://cse.google.com/). This is a custom property not
              # defined in the OpenSearch spec. This parameter is **required**.
          &quot;sort&quot;: &quot;A String&quot;, # Specifies that results should be sorted according to the specified
              # expression. For example, sort by date.
          &quot;dateRestrict&quot;: &quot;A String&quot;, # Restricts results to URLs based on date. Supported values include:
              #
              # * `d[number]`: requests results from the specified number of past days.
              #
              # * `w[number]`: requests results from the specified number of past weeks.
              #
              # * `m[number]`: requests results from the specified number of past months.
              #
              # * `y[number]`: requests results from the specified number of past years.
          &quot;inputEncoding&quot;: &quot;A String&quot;, # The character encoding supported for search requests.
          &quot;language&quot;: &quot;A String&quot;, # The language of the search results.
          &quot;hl&quot;: &quot;A String&quot;, # Specifies the interface language (host language) of your user interface.
              # Explicitly setting this parameter improves the performance and the
              # quality of your search results.
              #
              # See the [Interface
              # Languages](https://developers.google.com/custom-search/docs/xml_results#wsInterfaceLanguages)
              # section of [Internationalizing Queries and Results
              # Presentation](https://developers.google.com/custom-search/docs/xml_results#wsInternationalizing)
              # for more information, and [Supported Interface
              # Languages](https://developers.google.com/custom-search/docs/xml_results_appendices#interfaceLanguages)
              # for a list of supported languages.
        },
      ],
      &quot;request&quot;: [ # Metadata representing the current request.
        { # Custom search request metadata.
          &quot;searchTerms&quot;: &quot;A String&quot;, # The search terms entered by the user.
          &quot;disableCnTwTranslation&quot;: &quot;A String&quot;, # Enables or disables the [Simplified and Traditional Chinese
              # Search](https://developers.google.com/custom-search/docs/xml_results#chineseSearch)
              # feature.
              #
              # Supported values are:
              #
              # * `0`: enabled (default)
              #
              # * `1`: disabled
          &quot;fileType&quot;: &quot;A String&quot;, # Restricts results to files of a specified extension. Filetypes supported
              # by Google include:
              #
              # * Adobe Portable Document Format (`pdf`)
              #
              # * Adobe PostScript (`ps`)
              #
              # * Lotus 1-2-3 (`wk1`, `wk2`, `wk3`, `wk4`, `wk5`, `wki`, `wks`, `wku`)
              #
              # * Lotus WordPro (`lwp`)
              #
              # * Macwrite (`mw`)
              #
              # * Microsoft Excel (`xls`)
              #
              # * Microsoft PowerPoint (`ppt`)
              #
              # * Microsoft Word (`doc`)
              #
              # * Microsoft Works (`wks`, `wps`, `wdb`)
              #
              # * Microsoft Write (`wri`)
              #
              # * Rich Text Format (`rtf`)
              #
              # * Shockwave Flash (`swf`)
              #
              # * Text (`ans`, `txt`).
              #
              # Additional filetypes may be added in the future. An up-to-date list can
              # always be found in Google&#x27;s [file type
              # FAQ](https://support.google.com/webmasters/answer/35287).
          &quot;highRange&quot;: &quot;A String&quot;, # Specifies the ending value for a search range. Use `cse:lowRange` and
              # `cse:highrange` to append an inclusive search range of
              # `lowRange...highRange` to the query.
          &quot;siteSearchFilter&quot;: &quot;A String&quot;, # Specifies whether to include or exclude results from the site named in
              # the `sitesearch` parameter. Supported values are:
              #
              # * `i`: include content from site
              #
              # * `e`: exclude content from site
          &quot;imgSize&quot;: &quot;A String&quot;, # Restricts results to images of a specified size. Supported values are:
              #
              # * `icon` (small)
              #
              # * `small | medium | large | xlarge` (medium)
              #
              # * `xxlarge` (large)
              #
              # * `huge` (extra-large)
          &quot;gl&quot;: &quot;A String&quot;, # Boosts search results whose country of origin matches the parameter
              # value. See [Country
              # Codes](https://developers.google.com/custom-search/docs/xml_results#countryCodes)
              # for a list of valid values.
              #
              # Specifying a `gl` parameter value in WebSearch requests should improve
              # the relevance of results. This is particularly true for international
              # customers and, even more specifically, for customers in English-speaking
              # countries other than the United States.
          &quot;exactTerms&quot;: &quot;A String&quot;, # Identifies a phrase that all documents in the search results must
              # contain.
          &quot;startPage&quot;: 42, # The page number of this set of results, where the page length is set by
              # the `count` property.
          &quot;safe&quot;: &quot;A String&quot;, # Specifies the [SafeSearch
              # level](https://developers.google.com/custom-search/docs/xml_results#safeSearchLevels)
              # used for filtering out adult results. This is a custom property not
              # defined in the OpenSearch spec. Valid parameter values are:
              #
              # * `&quot;off&quot;`: Disable SafeSearch
              #
              # * `&quot;active&quot;`: Enable SafeSearch
          &quot;siteSearch&quot;: &quot;A String&quot;, # Restricts results to URLs from a specified site.
          &quot;searchType&quot;: &quot;A String&quot;, # Allowed values are `web` or `image`. If unspecified, results are limited
              # to webpages.
          &quot;cx&quot;: &quot;A String&quot;, # The identifier of a custom search engine created using the Custom Search
              # [Control Panel](https://cse.google.com/). This is a custom property not
              # defined in the OpenSearch spec. This parameter is **required**.
          &quot;rights&quot;: &quot;A String&quot;, # Filters based on licensing. Supported values include:
              #
              # * `cc_publicdomain`
              #
              # * `cc_attribute`
              #
              # * `cc_sharealike`
              #
              # * `cc_noncommercial`
              #
              # * `cc_nonderived`
          &quot;dateRestrict&quot;: &quot;A String&quot;, # Restricts results to URLs based on date. Supported values include:
              #
              # * `d[number]`: requests results from the specified number of past days.
              #
              # * `w[number]`: requests results from the specified number of past weeks.
              #
              # * `m[number]`: requests results from the specified number of past months.
              #
              # * `y[number]`: requests results from the specified number of past years.
          &quot;inputEncoding&quot;: &quot;A String&quot;, # The character encoding supported for search requests.
          &quot;excludeTerms&quot;: &quot;A String&quot;, # Identifies a word or phrase that should not appear in any documents in
              # the search results.
          &quot;hl&quot;: &quot;A String&quot;, # Specifies the interface language (host language) of your user interface.
              # Explicitly setting this parameter improves the performance and the
              # quality of your search results.
              #
              # See the [Interface
              # Languages](https://developers.google.com/custom-search/docs/xml_results#wsInterfaceLanguages)
              # section of [Internationalizing Queries and Results
              # Presentation](https://developers.google.com/custom-search/docs/xml_results#wsInternationalizing)
              # for more information, and [Supported Interface
              # Languages](https://developers.google.com/custom-search/docs/xml_results_appendices#interfaceLanguages)
              # for a list of supported languages.
          &quot;title&quot;: &quot;A String&quot;, # A description of the query.
          &quot;orTerms&quot;: &quot;A String&quot;, # Provides additional search terms to check for in a document, where each
              # document in the search results must contain at least one of the
              # additional search terms. You can also use the [Boolean
              # OR](https://developers.google.com/custom-search/docs/xml_results#BooleanOrqt)
              # query term for this type of query.
          &quot;lowRange&quot;: &quot;A String&quot;, # Specifies the starting value for a search range. Use `cse:lowRange` and
              # `cse:highrange` to append an inclusive search range of
              # `lowRange...highRange` to the query.
          &quot;googleHost&quot;: &quot;A String&quot;, # Specifies the Google domain (for example, google.com, google.de, or
              # google.fr) to which the search should be limited.
          &quot;imgColorType&quot;: &quot;A String&quot;, # Restricts results to images of a specified color type. Supported values
              #   are:
              #
              # * `mono` (black and white)
              #
              # * `gray` (grayscale)
              #
              # * `color` (color)
          &quot;filter&quot;: &quot;A String&quot;, # Activates or deactivates the automatic filtering of Google search
              # results. See [Automatic
              # Filtering](https://developers.google.com/custom-search/docs/xml_results#automaticFiltering)
              # for more information about Google&#x27;s search results filters. Valid values
              # for this parameter are:
              #
              # * `0`: Disabled
              #
              # * `1`: Enabled (default)
              #
              # **Note**: By default, Google applies filtering to all search results to
              # improve the quality of those results.
          &quot;startIndex&quot;: 42, # The index of the current set of search results into the total set of
              # results, where the index of the first result is 1.
          &quot;sort&quot;: &quot;A String&quot;, # Specifies that results should be sorted according to the specified
              # expression. For example, sort by date.
          &quot;linkSite&quot;: &quot;A String&quot;, # Specifies that all results should contain a link to a specific URL.
          &quot;cr&quot;: &quot;A String&quot;, # Restricts search results to documents originating in a particular
              # country. You may use [Boolean
              # operators](https://developers.google.com/custom-search/docs/xml_results#booleanOperators)
              # in the `cr` parameter&#x27;s value.
              #
              # Google WebSearch determines the country of a document by analyzing the
              # following:
              #
              # * The top-level domain (TLD) of the document&#x27;s URL.
              #
              # * The geographic location of the web server&#x27;s IP address.
              #
              # See [Country (cr) Parameter
              # Values](https://developers.google.com/custom-search/docs/xml_results#countryCollections)
              # for a list of valid values for this parameter.
          &quot;imgDominantColor&quot;: &quot;A String&quot;, # Restricts results to images with a specific dominant color. Supported
              # values are:
              #
              # * `red`
              #
              # * `orange`
              #
              # * `yellow`
              #
              # * `green`
              #
              # * `teal`
              #
              # * `blue`
              #
              # * `purple`
              #
              # * `pink`
              #
              # * `white`
              #
              # * `gray`
              #
              # * `black`
              #
              # * `brown`
          &quot;count&quot;: 42, # Number of search results returned in this set.
          &quot;relatedSite&quot;: &quot;A String&quot;, # Specifies that all search results should be pages that are related to the
              # specified URL. The parameter value should be a URL.
          &quot;hq&quot;: &quot;A String&quot;, # Appends the specified query terms to the query, as if they were combined
              # with a logical `AND` operator.
          &quot;imgType&quot;: &quot;A String&quot;, # Restricts results to images of a specified type. Supported values are:
              #
              # * `clipart` (Clip art)
              #
              # * `face` (Face)
              #
              # * `lineart` (Line drawing)
              #
              # * `photo` (Photo)
              #
              # * `animated` (Animated)
              #
              # * `stock` (Stock)
          &quot;outputEncoding&quot;: &quot;A String&quot;, # The character encoding supported for search results.
          &quot;language&quot;: &quot;A String&quot;, # The language of the search results.
          &quot;totalResults&quot;: &quot;A String&quot;, # Estimated number of total search results. May not be accurate.
        },
      ],
      &quot;previousPage&quot;: [ # Metadata representing the previous page of results, if applicable.
        { # Custom search request metadata.
          &quot;hl&quot;: &quot;A String&quot;, # Specifies the interface language (host language) of your user interface.
              # Explicitly setting this parameter improves the performance and the
              # quality of your search results.
              #
              # See the [Interface
              # Languages](https://developers.google.com/custom-search/docs/xml_results#wsInterfaceLanguages)
              # section of [Internationalizing Queries and Results
              # Presentation](https://developers.google.com/custom-search/docs/xml_results#wsInternationalizing)
              # for more information, and [Supported Interface
              # Languages](https://developers.google.com/custom-search/docs/xml_results_appendices#interfaceLanguages)
              # for a list of supported languages.
          &quot;inputEncoding&quot;: &quot;A String&quot;, # The character encoding supported for search requests.
          &quot;disableCnTwTranslation&quot;: &quot;A String&quot;, # Enables or disables the [Simplified and Traditional Chinese
              # Search](https://developers.google.com/custom-search/docs/xml_results#chineseSearch)
              # feature.
              #
              # Supported values are:
              #
              # * `0`: enabled (default)
              #
              # * `1`: disabled
          &quot;imgDominantColor&quot;: &quot;A String&quot;, # Restricts results to images with a specific dominant color. Supported
              # values are:
              #
              # * `red`
              #
              # * `orange`
              #
              # * `yellow`
              #
              # * `green`
              #
              # * `teal`
              #
              # * `blue`
              #
              # * `purple`
              #
              # * `pink`
              #
              # * `white`
              #
              # * `gray`
              #
              # * `black`
              #
              # * `brown`
          &quot;imgSize&quot;: &quot;A String&quot;, # Restricts results to images of a specified size. Supported values are:
              #
              # * `icon` (small)
              #
              # * `small | medium | large | xlarge` (medium)
              #
              # * `xxlarge` (large)
              #
              # * `huge` (extra-large)
          &quot;googleHost&quot;: &quot;A String&quot;, # Specifies the Google domain (for example, google.com, google.de, or
              # google.fr) to which the search should be limited.
          &quot;searchTerms&quot;: &quot;A String&quot;, # The search terms entered by the user.
          &quot;lowRange&quot;: &quot;A String&quot;, # Specifies the starting value for a search range. Use `cse:lowRange` and
              # `cse:highrange` to append an inclusive search range of
              # `lowRange...highRange` to the query.
          &quot;linkSite&quot;: &quot;A String&quot;, # Specifies that all results should contain a link to a specific URL.
          &quot;startPage&quot;: 42, # The page number of this set of results, where the page length is set by
              # the `count` property.
          &quot;cx&quot;: &quot;A String&quot;, # The identifier of a custom search engine created using the Custom Search
              # [Control Panel](https://cse.google.com/). This is a custom property not
              # defined in the OpenSearch spec. This parameter is **required**.
          &quot;startIndex&quot;: 42, # The index of the current set of search results into the total set of
              # results, where the index of the first result is 1.
          &quot;gl&quot;: &quot;A String&quot;, # Boosts search results whose country of origin matches the parameter
              # value. See [Country
              # Codes](https://developers.google.com/custom-search/docs/xml_results#countryCodes)
              # for a list of valid values.
              #
              # Specifying a `gl` parameter value in WebSearch requests should improve
              # the relevance of results. This is particularly true for international
              # customers and, even more specifically, for customers in English-speaking
              # countries other than the United States.
          &quot;imgColorType&quot;: &quot;A String&quot;, # Restricts results to images of a specified color type. Supported values
              #   are:
              #
              # * `mono` (black and white)
              #
              # * `gray` (grayscale)
              #
              # * `color` (color)
          &quot;relatedSite&quot;: &quot;A String&quot;, # Specifies that all search results should be pages that are related to the
              # specified URL. The parameter value should be a URL.
          &quot;dateRestrict&quot;: &quot;A String&quot;, # Restricts results to URLs based on date. Supported values include:
              #
              # * `d[number]`: requests results from the specified number of past days.
              #
              # * `w[number]`: requests results from the specified number of past weeks.
              #
              # * `m[number]`: requests results from the specified number of past months.
              #
              # * `y[number]`: requests results from the specified number of past years.
          &quot;language&quot;: &quot;A String&quot;, # The language of the search results.
          &quot;hq&quot;: &quot;A String&quot;, # Appends the specified query terms to the query, as if they were combined
              # with a logical `AND` operator.
          &quot;title&quot;: &quot;A String&quot;, # A description of the query.
          &quot;highRange&quot;: &quot;A String&quot;, # Specifies the ending value for a search range. Use `cse:lowRange` and
              # `cse:highrange` to append an inclusive search range of
              # `lowRange...highRange` to the query.
          &quot;fileType&quot;: &quot;A String&quot;, # Restricts results to files of a specified extension. Filetypes supported
              # by Google include:
              #
              # * Adobe Portable Document Format (`pdf`)
              #
              # * Adobe PostScript (`ps`)
              #
              # * Lotus 1-2-3 (`wk1`, `wk2`, `wk3`, `wk4`, `wk5`, `wki`, `wks`, `wku`)
              #
              # * Lotus WordPro (`lwp`)
              #
              # * Macwrite (`mw`)
              #
              # * Microsoft Excel (`xls`)
              #
              # * Microsoft PowerPoint (`ppt`)
              #
              # * Microsoft Word (`doc`)
              #
              # * Microsoft Works (`wks`, `wps`, `wdb`)
              #
              # * Microsoft Write (`wri`)
              #
              # * Rich Text Format (`rtf`)
              #
              # * Shockwave Flash (`swf`)
              #
              # * Text (`ans`, `txt`).
              #
              # Additional filetypes may be added in the future. An up-to-date list can
              # always be found in Google&#x27;s [file type
              # FAQ](https://support.google.com/webmasters/answer/35287).
          &quot;siteSearchFilter&quot;: &quot;A String&quot;, # Specifies whether to include or exclude results from the site named in
              # the `sitesearch` parameter. Supported values are:
              #
              # * `i`: include content from site
              #
              # * `e`: exclude content from site
          &quot;rights&quot;: &quot;A String&quot;, # Filters based on licensing. Supported values include:
              #
              # * `cc_publicdomain`
              #
              # * `cc_attribute`
              #
              # * `cc_sharealike`
              #
              # * `cc_noncommercial`
              #
              # * `cc_nonderived`
          &quot;exactTerms&quot;: &quot;A String&quot;, # Identifies a phrase that all documents in the search results must
              # contain.
          &quot;excludeTerms&quot;: &quot;A String&quot;, # Identifies a word or phrase that should not appear in any documents in
              # the search results.
          &quot;safe&quot;: &quot;A String&quot;, # Specifies the [SafeSearch
              # level](https://developers.google.com/custom-search/docs/xml_results#safeSearchLevels)
              # used for filtering out adult results. This is a custom property not
              # defined in the OpenSearch spec. Valid parameter values are:
              #
              # * `&quot;off&quot;`: Disable SafeSearch
              #
              # * `&quot;active&quot;`: Enable SafeSearch
          &quot;sort&quot;: &quot;A String&quot;, # Specifies that results should be sorted according to the specified
              # expression. For example, sort by date.
          &quot;searchType&quot;: &quot;A String&quot;, # Allowed values are `web` or `image`. If unspecified, results are limited
              # to webpages.
          &quot;filter&quot;: &quot;A String&quot;, # Activates or deactivates the automatic filtering of Google search
              # results. See [Automatic
              # Filtering](https://developers.google.com/custom-search/docs/xml_results#automaticFiltering)
              # for more information about Google&#x27;s search results filters. Valid values
              # for this parameter are:
              #
              # * `0`: Disabled
              #
              # * `1`: Enabled (default)
              #
              # **Note**: By default, Google applies filtering to all search results to
              # improve the quality of those results.
          &quot;count&quot;: 42, # Number of search results returned in this set.
          &quot;orTerms&quot;: &quot;A String&quot;, # Provides additional search terms to check for in a document, where each
              # document in the search results must contain at least one of the
              # additional search terms. You can also use the [Boolean
              # OR](https://developers.google.com/custom-search/docs/xml_results#BooleanOrqt)
              # query term for this type of query.
          &quot;imgType&quot;: &quot;A String&quot;, # Restricts results to images of a specified type. Supported values are:
              #
              # * `clipart` (Clip art)
              #
              # * `face` (Face)
              #
              # * `lineart` (Line drawing)
              #
              # * `photo` (Photo)
              #
              # * `animated` (Animated)
              #
              # * `stock` (Stock)
          &quot;siteSearch&quot;: &quot;A String&quot;, # Restricts results to URLs from a specified site.
          &quot;totalResults&quot;: &quot;A String&quot;, # Estimated number of total search results. May not be accurate.
          &quot;outputEncoding&quot;: &quot;A String&quot;, # The character encoding supported for search results.
          &quot;cr&quot;: &quot;A String&quot;, # Restricts search results to documents originating in a particular
              # country. You may use [Boolean
              # operators](https://developers.google.com/custom-search/docs/xml_results#booleanOperators)
              # in the `cr` parameter&#x27;s value.
              #
              # Google WebSearch determines the country of a document by analyzing the
              # following:
              #
              # * The top-level domain (TLD) of the document&#x27;s URL.
              #
              # * The geographic location of the web server&#x27;s IP address.
              #
              # See [Country (cr) Parameter
              # Values](https://developers.google.com/custom-search/docs/xml_results#countryCollections)
              # for a list of valid values for this parameter.
        },
      ],
    },
    &quot;spelling&quot;: { # Spell correction information for a query.
      &quot;htmlCorrectedQuery&quot;: &quot;A String&quot;, # The corrected query, formatted in HTML.
      &quot;correctedQuery&quot;: &quot;A String&quot;, # The corrected query.
    },
    &quot;promotions&quot;: [ # The set of
        # [promotions](https://developers.google.com/custom-search/docs/promotions).
        # Present only if the custom search engine&#x27;s configuration files define any
        # promotions for the given query.
      { # Promotion result.
        &quot;image&quot;: { # Image belonging to a promotion.
          &quot;source&quot;: &quot;A String&quot;, # URL of the image for this promotion link.
          &quot;height&quot;: 42, # Image height in pixels.
          &quot;width&quot;: 42, # Image width in pixels.
        },
        &quot;bodyLines&quot;: [ # An array of block objects for this promotion. See [Google WebSearch
            # Protocol
            # reference](https://developers.google.com/custom-search/docs/xml_results)
            # for more information.
          { # Block object belonging to a promotion.
            &quot;link&quot;: &quot;A String&quot;, # The anchor text of the block object&#x27;s link, if it has a link.
            &quot;htmlTitle&quot;: &quot;A String&quot;, # The block object&#x27;s text in HTML, if it has text.
            &quot;title&quot;: &quot;A String&quot;, # The block object&#x27;s text, if it has text.
            &quot;url&quot;: &quot;A String&quot;, # The URL of the block object&#x27;s link, if it has one.
          },
        ],
        &quot;displayLink&quot;: &quot;A String&quot;, # An abridged version of this search&#x27;s result URL, e.g. www.example.com.
        &quot;title&quot;: &quot;A String&quot;, # The title of the promotion.
        &quot;link&quot;: &quot;A String&quot;, # The URL of the promotion.
        &quot;htmlTitle&quot;: &quot;A String&quot;, # The title of the promotion, in HTML.
      },
    ],
    &quot;items&quot;: [ # The current set of custom search results.
      { # A custom search result.
        &quot;displayLink&quot;: &quot;A String&quot;, # An abridged version of this search result’s URL, e.g. www.example.com.
        &quot;kind&quot;: &quot;A String&quot;, # A unique identifier for the type of current object. For this API, it is
            # `customsearch#result.`
        &quot;link&quot;: &quot;A String&quot;, # The full URL to which the search result is pointing, e.g.
            # http://www.example.com/foo/bar.
        &quot;fileFormat&quot;: &quot;A String&quot;, # The file format of the search result.
        &quot;htmlFormattedUrl&quot;: &quot;A String&quot;, # The HTML-formatted URL displayed after the snippet for each search result.
        &quot;htmlSnippet&quot;: &quot;A String&quot;, # The snippet of the search result, in HTML.
        &quot;formattedUrl&quot;: &quot;A String&quot;, # The URL displayed after the snippet for each search result.
        &quot;cacheId&quot;: &quot;A String&quot;, # Indicates the ID of Google&#x27;s cached version of the search result.
        &quot;htmlTitle&quot;: &quot;A String&quot;, # The title of the search result, in HTML.
        &quot;image&quot;: { # Image belonging to a custom search result.
          &quot;byteSize&quot;: 42, # The size of the image, in pixels.
          &quot;width&quot;: 42, # The width of the image, in pixels.
          &quot;thumbnailWidth&quot;: 42, # The width of the thumbnail image, in pixels.
          &quot;contextLink&quot;: &quot;A String&quot;, # A URL pointing to the webpage hosting the image.
          &quot;height&quot;: 42, # The height of the image, in pixels.
          &quot;thumbnailLink&quot;: &quot;A String&quot;, # A URL to the thumbnail image.
          &quot;thumbnailHeight&quot;: 42, # The height of the thumbnail image, in pixels.
        },
        &quot;pagemap&quot;: { # Contains
            # [PageMap](https://developers.google.com/custom-search/docs/structured_data#pagemaps)
            # information for this search result.
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object.
        },
        &quot;title&quot;: &quot;A String&quot;, # The title of the search result, in plain text.
        &quot;labels&quot;: [ # Encapsulates all information about [refinement
            # labels](https://developers.google.com/custom-search/docs/xml_results).
          { # Refinement label associated with a custom search result.
            &quot;name&quot;: &quot;A String&quot;, # The name of a refinement label, which you can use to refine searches.
                # Don&#x27;t display this in your user interface; instead, use displayName.
            &quot;displayName&quot;: &quot;A String&quot;, # The display name of a refinement label. This is the name you should
                # display in your user interface.
            &quot;label_with_op&quot;: &quot;A String&quot;, # Refinement label and the associated refinement operation.
          },
        ],
        &quot;snippet&quot;: &quot;A String&quot;, # The snippet of the search result, in plain text.
        &quot;mime&quot;: &quot;A String&quot;, # The MIME type of the search result.
      },
    ],
    &quot;searchInformation&quot;: { # Metadata about a search operation.
      &quot;totalResults&quot;: &quot;A String&quot;, # The total number of search results returned by the query.
      &quot;searchTime&quot;: 3.14, # The time taken for the server to return search results.
      &quot;formattedTotalResults&quot;: &quot;A String&quot;, # The total number of search results, formatted according to locale style.
      &quot;formattedSearchTime&quot;: &quot;A String&quot;, # The time taken for the server to return search results, formatted
          # according to locale style.
    },
    &quot;context&quot;: { # Metadata and refinements associated with the given search engine,
        # including:
        #
        # * The name of the search engine that was used for the query.
        #
        # *   A set of [facet
        # objects](https://developers.google.com/custom-search/docs/refinements#create)
        # (refinements) you can use for refining a search.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object.
    },
    &quot;url&quot;: { # OpenSearch template and URL.
      &quot;type&quot;: &quot;A String&quot;, # The MIME type of the OpenSearch URL template for the Custom Search API.
      &quot;template&quot;: &quot;A String&quot;, # The actual [OpenSearch
          # template](http://www.opensearch.org/specifications/opensearch/1.1#opensearch_url_template_syntax)
          # for this API.
    },
    &quot;kind&quot;: &quot;A String&quot;, # Unique identifier for the type of current object. For this API, it is
        # customsearch#search.
  }</pre>
</div>

</body></html>