> ## Documentation Index
> Fetch the complete documentation index at: https://cloro.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Extract Google Search

> Extract structured data from Google Search including organic results, People Also Ask, related searches, and optional AI Overview

## Overview

The Google Search endpoint extracts structured data from Google Search results, including organic results, sponsored ads, People Also Ask questions, related searches, and optional [AI Overview data](/api-reference/endpoint/google/ai-overview).

<Warning title="Check the location availability first">
  AI Overview location availability might be different than regular Google
  Search availability. Use the{" "}
  <a href="/api-reference/endpoint/countries">countries endpoint</a> with
  `model=aioverview` to check supported countries, as the available locations
  differ from Google Search (`model=google`) availability.
</Warning>

## Request parameters

**Required parameters:**

* `query` (string): The search query to execute on Google (1-10,000 characters)

**Optional parameters:**

* `country` (string): ISO 3166-1 alpha-2 country code for localized results. Defaults to `US`
* `location` (string): Google canonical location name for geo-targeted results (e.g., `New York,New York,United States`). See [Google's geo target list](https://developers.google.com/google-ads/api/reference/data/geotargets) for all \~100,000 supported locations. Mutually exclusive with `uule`
* `uule` (string): Pre-encoded Google UULE string for precise geo-targeting. Use this when you have a pre-built UULE value instead of a location name. Mutually exclusive with `location`
* `device` (string): Device type for search results. Options: `desktop` (default), `mobile`.
* `pages` (integer): Number of search results pages to scrape (1-10). Defaults to `1`
* `include.html` (boolean): Include raw HTML response. Defaults to `false`
* `include.aioverview` (object): Include Google AI Overview. Set `markdown: true` for markdown formatting. Defaults to `false` (not included)
* `include.paaAioverview` (boolean): Hydrate AI-Overview-type People Also Ask items with markdown content and cited sources. Defaults to `false`

<Info>
  **Additional credit cost**

  Enabling `include.aioverview` adds +2 credits. Enabling `include.paaAioverview` adds +2 credits. Using both adds +4 credits total. Each page beyond the first adds +2 credits (e.g. `pages: 3` adds +4, `pages: 10` adds +18). See [providers](/guides/providers#google-search-multi-page-pricing) for full pricing details.
</Info>

## Requesting AI Overview

To request AI Overview data, nest the `aioverview` object under the `include` parameter:

```json theme={null}
{
  "query": "best laptops for programming",
  "include": {
    "aioverview": {
      "markdown": true
    }
  }
}
```

**AI Overview options:**

* `markdown` (boolean): Include AI Overview formatted as Markdown. Defaults to `false`
* When `aioverview` is not included in the request, no AI Overview data will be returned

## Error handling

<Warning>
  **AI Overview behavior**

  When `include.aioverview` is requested and Google doesn't return an AI Overview for a specific query (after several retries), the API returns `aioverview: null` in a 200 response. All other Google search data is returned normally.

  Some regions are not supported for AI Overview at all and return an `UnsupportedInputError` when `include.aioverview` is set — this is a region-level error, not a query failure. Use the [`/v1/countries`](/api-reference/endpoint/countries) endpoint with `model=aioverview` to check which regions are currently supported before sending requests.

  ```json theme={null}
  {
    "success": true,
    "result": {
      "organicResults": [...],
      "peopleAlsoAsk": [...],
      "relatedSearches": [...],
      "aioverview": null
    }
  }
  ```
</Warning>

## Response objects

The response includes the following sections. See each subpage for the full schema and examples.

| Section                                                             | Field                    | Description                                                                      |
| ------------------------------------------------------------------- | ------------------------ | -------------------------------------------------------------------------------- |
| [Organic results](/api-reference/endpoint/google/organic-results)   | `result.organicResults`  | Standard non-paid search results from Google                                     |
| [Sponsored ads](/api-reference/endpoint/google/sponsored-ads)       | `result.ads`             | Paid ad placements with sitelinks                                                |
| [People Also Ask](/api-reference/endpoint/google/people-also-ask)   | `result.peopleAlsoAsk`   | Related questions with link or AI Overview answers                               |
| [Related searches](/api-reference/endpoint/google/related-searches) | `result.relatedSearches` | Related query suggestions                                                        |
| [AI Overview](/api-reference/endpoint/google/ai-overview)           | `result.aioverview`      | Google's AI-generated summary with sources, videos, and ads (when requested)     |
| [Knowledge Graph](/api-reference/endpoint/google/knowledge-graph)   | `result.knowledgeGraph`  | Structured entity panel (person, place, organization, film, etc.) — when present |

`result.html` is also returned when `include.html` is `true`.

<Note>
  `result.knowledgeGraph`, `result.shoppingCards`, and `result.peopleAreSaying` are omitted from `result` when the corresponding panel does not appear on the SERP. Treat them as optional rather than expecting `null` or an empty array.
</Note>

## Usage examples

### Scrape multiple pages

```json theme={null}
{
  "query": "best laptops for programming",
  "pages": 3,
  "country": "US"
}
```

This will scrape the first 3 pages of Google search results, combining all organic results, People Also Ask questions, and related searches into a single response. The `peopleAlsoAsk` results include a `page` field indicating which page each question appeared on.

### City and state-level geo-targeting

The `location` parameter accepts any Google canonical location name — including US states and regions, not just cities. Use the [Google Ads geo target reference](https://developers.google.com/google-ads/api/reference/data/geotargets) to look up canonical names for the \~100,000 supported locations.

```json theme={null}
{
  "query": "best restaurants",
  "country": "US",
  "location": "New York,New York,United States"
}
```

For state-level targeting:

```json theme={null}
{
  "query": "best electricians",
  "country": "US",
  "location": "California,United States"
}
```

### UULE geo-targeting

For advanced geo-targeting, use `uule` with a pre-encoded Google UULE string instead of `location`. This is useful when you generate your own UULE values for precise location control:

```json theme={null}
{
  "query": "best restaurants",
  "country": "US",
  "uule": "w+CAIQICIeV2VzdCBOZXcgWW9yayxOZXcgSmVyc2V5"
}
```

<Note>
  `location` and `uule` are mutually exclusive: provide one or the other, not both. Use `location` for city-level targeting with canonical names, and `uule` when you need to supply a pre-encoded UULE string.
</Note>

### Hydrate People Also Ask with AI Overview content

To get AI-Overview-type People Also Ask items with markdown content and cited sources:

```json theme={null}
{
  "query": "best laptops for programming",
  "include": {
    "paaAioverview": true
  }
}
```

You can combine this with AI Overview extraction:

```json theme={null}
{
  "query": "best laptops for programming",
  "include": {
    "aioverview": {
      "markdown": true
    },
    "paaAioverview": true
  }
}
```


## OpenAPI

````yaml api-reference/openapi.json POST /v1/monitor/google
openapi: 3.1.0
info:
  title: cloro
  description: API for monitoring AI responses across different providers and regions
  license:
    name: MIT
  version: 1.0.0
servers:
  - url: https://api.cloro.dev
    description: Production server
security:
  - bearerAuth: []
paths:
  /v1/monitor/google:
    post:
      summary: Monitor Google Search Results
      description: >-
        Extract structured data from Google Search including organic results,
        People Also Ask, related searches, and optional AI Overview
      operationId: monitorGoogle
      requestBody:
        description: Request parameters for monitoring Google search results
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GoogleMonitorRequest'
        required: true
      responses:
        '200':
          description: successful Google monitoring response
          headers:
            X-Concurrent-Limit:
              description: Maximum number of concurrent requests allowed
              schema:
                type: integer
                example: 10
            X-Concurrent-Current:
              description: Current number of concurrent requests
              schema:
                type: integer
                example: 3
            X-Concurrent-Remaining:
              description: Number of remaining concurrent slots available
              schema:
                type: integer
                example: 7
            X-Credits-Remaining:
              description: Number of credits remaining in user account
              schema:
                type: integer
                example: 997
            X-Credits-Charged:
              description: Number of credits charged for this request
              schema:
                type: integer
                example: 3
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GoogleMonitorResponse'
        '400':
          description: Bad Request - Invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
        '401':
          description: Unauthorized - Invalid or missing API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthenticationError'
        '403':
          description: Forbidden - Insufficient credits or access denied
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ForbiddenError'
        '404':
          description: Not Found - Route not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
        '409':
          description: Conflict - Resource conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConflictError'
        '429':
          description: Too Many Requests
          headers:
            X-Concurrent-Limit:
              description: Maximum number of concurrent requests allowed
              schema:
                type: integer
                example: 10
            X-Concurrent-Current:
              description: Current number of concurrent requests
              schema:
                type: integer
                example: 11
            X-Concurrent-Remaining:
              description: Number of remaining concurrent slots available
              schema:
                type: integer
                example: 0
            X-Credits-Remaining:
              description: Number of credits remaining in user account
              schema:
                type: integer
                example: 4
            X-Credits-Charged:
              description: Number of credits charged for this request
              schema:
                type: integer
                example: 0
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConcurrentLimitError'
        '499':
          description: Client Closed Request - Request was canceled
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CanceledError'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalError'
        '502':
          description: Bad Gateway - External service error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ExternalServiceError'
components:
  schemas:
    GoogleMonitorRequest:
      required:
        - query
        - country
      type: object
      properties:
        query:
          description: The search query to execute on Google
          type: string
          minLength: 1
          maxLength: 10000
          example: best laptops for programming
        country:
          description: ISO 3166-1 alpha-2 country code for localized search results
          type: string
          example: US
        location:
          description: >-
            Google canonical location name for geo-targeted results, in
            comma-separated format: 'City,Region,Country' (see
            https://developers.google.com/google-ads/api/reference/data/geotargets
            for all ~100,000 supported locations). Use alongside 'country' for
            city-level precision. Mutually exclusive with 'uule' — provide one
            or the other, not both.
          type: string
          example: New York,New York,United States
        uule:
          description: >-
            Pre-encoded Google UULE string for precise geo-targeting. Use this
            when you have a pre-built UULE value instead of a location name.
            Mutually exclusive with 'location' — provide one or the other, not
            both.
          type: string
          example: w+CAIQICIeV2VzdCBOZXcgWW9yayxOZXcgSmVyc2V5
        device:
          description: Device type for search results
          type: string
          enum:
            - desktop
            - mobile
          default: desktop
          example: desktop
        pages:
          description: Number of search results pages to scrape (1-10)
          type: integer
          minimum: 1
          maximum: 10
          default: 1
          example: 3
        include:
          description: Optional flags for including additional response data
          type: object
          properties:
            html:
              description: Include raw HTML response from Google search
              type: boolean
              default: false
              example: false
            aioverview:
              description: Include Google AI Overview in the response
              type: object
              properties:
                markdown:
                  description: Include AI Overview formatted as markdown
                  type: boolean
                  default: false
                  example: true
              default:
                markdown: false
              additionalProperties: false
            paaAioverview:
              description: >-
                Hydrate AI-Overview-type People Also Ask items with markdown
                content and sources. Costs one extra request per
                AI-Overview-type PAA item (typically 1-2 per page).
              type: boolean
              default: false
              example: true
          default:
            html: false
          additionalProperties: false
      additionalProperties: false
    GoogleMonitorResponse:
      required:
        - success
        - result
      type: object
      properties:
        success:
          type: boolean
          example: true
        result:
          description: Google search results data
          type: object
          properties:
            organicResults:
              type: array
              description: Organic search results from Google
              items:
                type: object
                properties:
                  position:
                    type: number
                    description: Position in search results (1-indexed)
                    example: 1
                  title:
                    type: string
                    description: Title of the search result
                    example: Best Laptops for Programming in 2024
                  link:
                    type: string
                    description: URL of the search result
                    example: https://example.com/best-programming-laptops
                  displayedLink:
                    type: string
                    description: Formatted URL as displayed in search results
                    example: https://example.com
                  snippet:
                    type: string
                    description: Text snippet describing the page content
                    example: >-
                      Looking for the best programming laptops? We've tested and
                      reviewed the top options...
                  date:
                    type: string
                    description: Publication date if available
                    example: 2 days ago
                  page:
                    type: number
                    description: Page number this result appeared on (1-indexed)
                    example: 1
                  sitelinks:
                    type: object
                    description: Sitelinks displayed under the main result
                    properties:
                      inline:
                        type: array
                        description: Inline sitelinks
                        items:
                          type: object
                          properties:
                            title:
                              type: string
                              example: Specifications
                            link:
                              type: string
                              example: https://example.com/specs
            peopleAlsoAsk:
              type: array
              description: People Also Ask questions from Google
              items:
                type: object
                properties:
                  question:
                    type: string
                    description: The question text
                    example: What specs should I look for in a programming laptop?
                  type:
                    type: string
                    enum:
                      - AIOVERVIEW
                      - LINK
                      - UNKNOWN
                    description: Type of question result
                  snippet:
                    type: string
                    description: Answer snippet (for LINK type)
                    example: >-
                      Key specifications include RAM, processor, storage, and
                      display quality...
                  title:
                    type: string
                    description: Result title (for LINK type)
                    example: Essential laptop specs for developers
                  link:
                    type: string
                    description: Result URL (for LINK type)
                    example: https://example.com/laptop-specs
                  markdown:
                    type: string
                    description: >-
                      AI Overview markdown content (for AIOVERVIEW type, when
                      include.paaAioverview is true)
                  sources:
                    type: array
                    description: >-
                      Cited sources (for AIOVERVIEW type, when
                      include.paaAioverview is true)
                    items:
                      type: object
                      properties:
                        label:
                          type: string
                          description: Title of the source
                          example: Programming Laptop Guide
                        url:
                          type: string
                          description: URL of the source
                          example: https://example.com/guide
                        description:
                          type: string
                          description: Description of the source
                        position:
                          type: number
                          description: Position of source (1-indexed)
            peopleAreSaying:
              type: array
              description: >-
                Cards from Google's "What people are saying" / "Trending posts
                and discussions" SERP module. The field is omitted from `result`
                when no such module appears on the SERP, so clients should treat
                it as optional rather than expecting an empty array.
              items:
                type: object
                required:
                  - position
                  - title
                  - link
                  - date
                properties:
                  position:
                    type: number
                    description: Position within the module (1-indexed)
                    example: 1
                  title:
                    type: string
                    description: Card title as displayed on the SERP
                    example: Best running shoes 2026 - what runners are saying
                  link:
                    type: string
                    description: >-
                      Destination URL the card points to (often a Reddit, Quora,
                      or community forum thread)
                    example: https://www.reddit.com/r/running/comments/example/
                  date:
                    type: string
                    description: >-
                      Google's raw relative-time text (e.g., "5 days ago", "2
                      weeks ago"). Free-form string — not normalized to a
                      timestamp.
                    example: 5 days ago
            relatedSearches:
              type: array
              description: Related search suggestions
              items:
                type: object
                properties:
                  query:
                    type: string
                    description: Related search query
                    example: best budget laptop for coding
                  link:
                    type: string
                    description: Google search URL for the related query
                    example: https://google.com/search?q=best+budget+laptop+for+coding
            ads:
              type: array
              description: >-
                Sponsored ad results from Google search, including text ads
                (`type: RESULT`) and shopping-style sponsored cards (`type:
                SHOPPING_CARD`) from the right-hand-side and top-of-page
                carousels.
              items:
                type: object
                properties:
                  position:
                    type: number
                    description: Position within the ad block (1-indexed)
                    example: 1
                  blockPosition:
                    type: string
                    enum:
                      - top
                      - bottom
                      - middle
                      - rhs
                    description: >-
                      Where the ad appeared on the SERP. `top`/`bottom` are
                      text-ad blocks, `middle` covers direct/in-content ads,
                      `rhs` is the right-hand-side sponsored-products carousel.
                    example: top
                  type:
                    type: string
                    enum:
                      - RESULT
                      - SHOPPING_CARD
                    description: >-
                      Discriminates plain text ads (`RESULT`) from
                      shopping-style sponsored cards (`SHOPPING_CARD`). Shopping
                      cards appear in the right-hand-side PLA carousel, the
                      top-of-page PLA carousel, and the top-of-page sponsored
                      shopping-card carousels (vehicles, products, hotels, …).
                    example: RESULT
                  title:
                    type: string
                    description: Ad title
                    example: Best Programming Laptops - Shop Now
                  url:
                    type: string
                    format: uri
                    description: >-
                      Destination URL of the ad. For `type: SHOPPING_CARD` items
                      this is a Google `aclk?`-redirected URL.
                    example: https://example.com/programming-laptops
                  page:
                    type: number
                    description: Page number where the ad was found
                    example: 1
                  displayedUrl:
                    type: string
                    description: Formatted URL as displayed in the ad
                    example: example.com/laptops
                  domain:
                    type: string
                    description: Domain name of the advertiser
                    example: example.com
                  description:
                    type: string
                    description: >-
                      Ad description text. For `type: RESULT` items this is
                      classic ad copy. For `type: SHOPPING_CARD` items it
                      carries category-specific subtitle fragments joined with
                      `·` (e.g. vehicle condition + city: `Used - 94k miles ·
                      Greeley`).
                    example: >-
                      Shop our selection of programming laptops with fast
                      shipping.
                  category:
                    type: string
                    description: >-
                      Carousel header label for shopping-card ads. Examples
                      observed today include `Sponsored products`, `Sponsored
                      vehicles`, and `Sponsored hotels`. Omitted for `type:
                      RESULT` text ads.
                    example: Sponsored products
                  price:
                    type: object
                    description: >-
                      Product price for `type: SHOPPING_CARD` ads. `value` and
                      `currency` are populated only when the visible price
                      string parses unambiguously into a number + symbol. `raw`
                      carries the visible text verbatim (e.g. `"$0 down with 24
                      monthly payments"` on installment offers) so consumers can
                      disambiguate genuine zero prices from down-payment labels.
                    properties:
                      value:
                        type: number
                        nullable: true
                        description: Numeric price value
                        example: 1199
                      currency:
                        type: string
                        nullable: true
                        description: Currency symbol
                        example: $
                      raw:
                        type: string
                        nullable: true
                        description: Visible price text verbatim
                        example: $1,199
                  oldPrice:
                    type: object
                    description: >-
                      Original price before discount on `type: SHOPPING_CARD`
                      ads that surface MSRP / sale messaging. Same shape as
                      `price`.
                    properties:
                      value:
                        type: number
                        nullable: true
                        description: Numeric price value
                        example: 1299
                      currency:
                        type: string
                        nullable: true
                        description: Currency symbol
                        example: $
                      raw:
                        type: string
                        nullable: true
                        description: Visible price text verbatim
                        example: $1,299
                  store:
                    type: string
                    description: >-
                      Merchant/dealer name attached to a `type: SHOPPING_CARD`
                      ad.
                    example: Apple
                  imageUrl:
                    type: string
                    format: uri
                    description: >-
                      Hero image URL served by Google's `encrypted-tbn` CDN for
                      `type: SHOPPING_CARD` ads. Omitted when the lazy-image
                      chain cannot resolve a non-placeholder source.
                    example: https://encrypted-tbn0.gstatic.com/images?q=tbn:...
                  sitelinks:
                    type: array
                    description: Sitelinks displayed under the ad
                    items:
                      type: object
                      properties:
                        url:
                          type: string
                          format: uri
                          description: Sitelink URL
                          example: https://example.com/gaming-laptops
                        title:
                          type: string
                          description: Sitelink title
                          example: Gaming Laptops
                        description:
                          type: string
                          description: Sitelink description
                          example: High-performance laptops for gaming
            aioverview:
              oneOf:
                - type: object
                - type: 'null'
              description: >-
                Google AI Overview data (if requested). Returns null when AI
                Overview is not available after retries.
              properties:
                sources:
                  type: array
                  description: Sources referenced in the AI Overview
                  items:
                    type: object
                    properties:
                      position:
                        type: number
                        description: 1-based position index of the source
                        example: 1
                      url:
                        type: string
                        description: Source URL
                        example: https://example.com/programming-laptops
                      label:
                        type: string
                        description: >-
                          Source title (the display label Google renders on the
                          source rail)
                        example: Best Programming Laptops 2026
                      description:
                        type: string
                        description: Source description / snippet
                        example: >-
                          Comprehensive guide to choosing the perfect laptop for
                          software development
                citationPills:
                  type: array
                  description: >-
                    Inline citation pills extracted from the AI Overview answer.
                    Each entry is one (pill, source) pair: when a pill cites N
                    sources (Google's `[Label +N]` chips), the array contains N
                    entries sharing the same `citationPillId` but carrying
                    per-source `label`, `url`, and `domain`. Group by
                    `citationPillId` to recover the pill-level structure.
                    Omitted from `result.aioverview` when the answer carries no
                    pills.
                  items:
                    type: object
                    required:
                      - label
                      - citationPillId
                      - url
                      - domain
                      - position
                    properties:
                      label:
                        type: string
                        description: >-
                          Per-source title from the sources rail (for example
                          `"Chase Personal Credit Cards"`). Empty string when
                          the rail has no title for this source — consumers
                          should read `domain` / `url` for source identity in
                          that case. Entries grouped under the same
                          `citationPillId` carry different per-source labels.
                        example: Chase Personal Credit Cards
                      citationPillId:
                        type: integer
                        description: >-
                          1-based ordinal shared by all entries from the same
                          chip. Group by `citationPillId` to reconstruct the
                          visible chip; the per-source `label` differs across
                          entries within a chip.
                        example: 1
                      url:
                        type: string
                        description: Direct URL of the cited source.
                        example: https://www.chase.com/personal/credit-cards
                      domain:
                        type: string
                        description: Host extracted from `url`, for grouping and display.
                        example: chase.com
                      description:
                        type: string
                        description: >-
                          Source description from the sources rail when Google
                          ships one. Omitted when the source carries no snippet.
                        example: Personal credit cards from Chase.
                      position:
                        type: integer
                        description: >-
                          1-based position of this source in the sibling
                          `result.aioverview.sources` array.
                        example: 2
                  example:
                    - label: Chase Personal Credit Cards
                      citationPillId: 1
                      url: https://www.chase.com/personal/credit-cards
                      domain: chase.com
                      description: Personal credit cards from Chase.
                      position: 2
                    - label: JustAnswer Computer Help
                      citationPillId: 1
                      url: https://www.justanswer.com/computer/help
                      domain: justanswer.com
                      position: 4
                text:
                  type: string
                  description: AI Overview text content
                  example: >-
                    Based on current information, the best laptops for
                    programming typically include models from Apple MacBook Pro,
                    Dell XPS, and Lenovo ThinkPad series...
                markdown:
                  type: string
                  description: AI Overview content formatted as markdown (if requested)
                  example: >-
                    Based on current information, the best laptops for
                    programming typically include models from Apple MacBook Pro,
                    Dell XPS, and Lenovo ThinkPad series...
                videos:
                  type: array
                  description: Video content included in the AI Overview
                  items:
                    type: object
                    properties:
                      url:
                        type: string
                        format: uri
                        description: Direct URL to the video
                        example: https://www.youtube.com/watch?v=example
                      title:
                        type: string
                        description: Video title
                        example: Best Laptops for Programming 2024
                      thumbnail:
                        type: string
                        format: uri
                        description: Thumbnail image URL
                        example: https://example.com/thumbnail.jpg
                      source:
                        type: string
                        description: Channel or source name
                        example: Tech Channel
                      platform:
                        type: string
                        description: Video platform
                        example: YouTube
                      date:
                        type: string
                        description: Upload date
                        example: 2 days ago
                      duration:
                        type: string
                        description: Video duration
                        example: '12:34'
                ads:
                  type: array
                  description: Sponsored ads injected by Google inside the AI Overview
                  items:
                    type: object
                    required:
                      - position
                      - title
                      - url
                      - type
                    properties:
                      position:
                        type: number
                        description: Position of the ad (1-indexed)
                        example: 1
                      title:
                        type: string
                        description: Ad title
                        example: >-
                          QA Software Testing Services - On-Demand Software
                          Testing
                      url:
                        type: string
                        description: Ad destination URL
                        example: https://www.testlio.com
                      type:
                        type: string
                        enum:
                          - TEXT
                          - SHOPPING
                        description: >-
                          Sub-type discriminator. TEXT ads carry `domain` +
                          `description`; SHOPPING ads carry `price` + `store` (+
                          optional `old_price`). Always present.
                        example: TEXT
                      domain:
                        type: string
                        description: >-
                          Domain name of the advertiser (present when `type` is
                          `TEXT`)
                        example: Testlio
                      description:
                        type: string
                        description: Ad description text (present when `type` is `TEXT`)
                        example: >-
                          Dynamic staffing. Global coverage. Managed manual
                          testing and test automation solutions.
                      price:
                        type: object
                        description: >-
                          Product price (present when `type` is `SHOPPING`).
                          `value` and `currency` are populated only when the
                          visible price string parses unambiguously into a
                          number + symbol; `raw` carries the visible text
                          verbatim.
                        properties:
                          value:
                            type: number
                            nullable: true
                            description: Numeric price value
                            example: 69.99
                          currency:
                            type: string
                            nullable: true
                            description: Currency symbol
                            example: $
                          raw:
                            type: string
                            nullable: true
                            description: Visible price text verbatim
                            example: $69.99
                      old_price:
                        type: object
                        description: >-
                          Original price before discount (present when `type` is
                          `SHOPPING` and the ad has sale pricing). Same shape as
                          `price`.
                        properties:
                          value:
                            type: number
                            nullable: true
                            description: Numeric price value
                            example: 99.99
                          currency:
                            type: string
                            nullable: true
                            description: Currency symbol
                            example: $
                          raw:
                            type: string
                            nullable: true
                            description: Visible price text verbatim
                            example: $99.99
                      store:
                        type: string
                        description: Retailer name (present when `type` is `SHOPPING`)
                        example: Best Buy
                      image:
                        type: string
                        description: >-
                          Ad image URL (product photo for shopping ads, hero
                          image for text ads)
                        example: >-
                          https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ...
            shoppingCards:
              type: array
              description: >-
                Shopping product cards extracted from the SERP's organic
                shopping grids ("Popular products" / "More products"). The field
                is omitted from `result` when no shopping section is present, so
                clients should treat it as optional rather than expecting an
                empty array. Wire shape borrows fields from AI Mode's
                `shopping_cards` for cross-API familiarity but uses camelCase
                keys (`productLink`, `oldPrice`) emitted by the Google mapper.
              items:
                type: object
                required:
                  - title
                  - productLink
                properties:
                  title:
                    type: string
                    description: Product title
                    example: ASICS Women's Gel-Nimbus 28
                  position:
                    type: integer
                    description: >-
                      1-indexed rank across the whole `shoppingCards` array in
                      DOM order (flat, does not reset per `category` section).
                    example: 1
                  productLink:
                    type: string
                    description: >-
                      Direct product URL. Click destinations are JS-hydrated, so
                      this is usually an empty string in the static HTML
                      response — the card opens a Google-side sidebar overlay
                      rather than navigating externally.
                    example: ''
                  category:
                    type: string
                    description: >-
                      Parent section header text. Lets callers distinguish cards
                      from coexisting shopping panels on the same SERP. Current
                      Google-emitted values include "Popular products" and "More
                      products".
                    example: More products
                  price:
                    type: object
                    description: >-
                      Structured pricing information. `value` and `currency` are
                      populated only when the visible price string parses
                      unambiguously into a number + symbol; `raw` carries the
                      visible text verbatim.
                    properties:
                      value:
                        type: number
                        nullable: true
                        description: Numeric price
                        example: 169.99
                      currency:
                        type: string
                        nullable: true
                        description: Currency symbol
                        example: $
                      raw:
                        type: string
                        nullable: true
                        description: Visible price text verbatim
                        example: $169.99
                  oldPrice:
                    type: object
                    description: Original price before discount. Same shape as `price`.
                    properties:
                      value:
                        type: number
                        nullable: true
                        description: Numeric price
                        example: 199.99
                      currency:
                        type: string
                        nullable: true
                        description: Currency symbol
                        example: $
                      raw:
                        type: string
                        nullable: true
                        description: Visible price text verbatim
                        example: $199.99
                  store:
                    type: string
                    description: Merchant/store name
                    example: DICK'S Sporting Goods
                  rating:
                    type: number
                    description: Product rating
                    example: 4.5
                  reviews:
                    type: string
                    description: Review count
                    example: '384'
                  thumbnail:
                    type: string
                    format: uri
                    description: Product image URL
                    example: https://example.com/product.jpg
            knowledgeGraph:
              description: >-
                Google's Knowledge Graph panel for the queried entity. Omitted
                from `result` when no Knowledge Graph panel appears on the SERP
                — treat it as optional rather than expecting null.
              type: object
              properties:
                title:
                  type: string
                  description: Entity name as shown in the panel header
                  example: Eminem
                type:
                  type: string
                  description: >-
                    Entity category label as rendered by Google (e.g. "American
                    rapper", "French museum"). Free-form string, not an enum.
                  example: American rapper
                kgmid:
                  type: string
                  description: Google Knowledge Graph ID for the entity
                  example: /m/01vs_v8
                description:
                  type: string
                  description: >-
                    Short description of the entity (may be sourced from
                    Wikipedia or Google's own knowledge base)
                  example: >-
                    Marshall Bruce Mathers III, known professionally as Eminem,
                    is an American rapper, songwriter, and record producer.
                imageUrl:
                  type: string
                  description: URL of the entity's image as served by Google
                  example: https://encrypted-tbn0.gstatic.com/images?q=tbn:...
                website:
                  type: string
                  description: Official website URL for the entity
                  example: https://www.eminem.com
                menu:
                  type: string
                  description: Menu URL — present for restaurants and food businesses
                  example: https://www.restaurant.com/menu
                trailer:
                  type: string
                  description: Trailer URL — present for films and TV shows
                  example: https://www.youtube.com/watch?v=example
                source:
                  type: object
                  description: >-
                    Attribution source for the entity description (typically
                    Wikipedia)
                  properties:
                    name:
                      type: string
                      description: Display name of the source
                      example: Wikipedia
                    link:
                      type: string
                      description: URL of the source page
                      example: https://en.wikipedia.org/wiki/Eminem
                attributes:
                  type: array
                  description: >-
                    Factual key-value pairs extracted from the panel (e.g. born,
                    genre, label). Keys are free-form strings as rendered by
                    Google.
                  items:
                    type: object
                    properties:
                      key:
                        type: string
                        description: Attribute label
                        example: Born
                      value:
                        type: string
                        description: Attribute value
                        example: October 17, 1972
                profiles:
                  type: array
                  description: Social media and external profile links for the entity
                  items:
                    type: object
                    properties:
                      name:
                        type: string
                        description: Platform or profile name
                        example: Instagram
                      link:
                        type: string
                        description: Profile URL
                        example: https://www.instagram.com/eminem/
                peopleAlsoSearchFor:
                  type: array
                  description: Related entities that users also search for
                  items:
                    type: object
                    properties:
                      name:
                        type: string
                        description: Related entity name
                        example: Jay-Z
                      link:
                        type: string
                        description: Google search URL for this related entity
                        example: https://www.google.com/search?q=Jay-Z
                thingsToKnow:
                  type: array
                  description: '"Things to know" topic clusters extracted from the panel'
                  items:
                    type: object
                    properties:
                      label:
                        type: string
                        description: Topic cluster label
                        example: Albums
                      subtitle:
                        type: string
                        description: Subtitle or supporting text for the topic
                        example: The Slim Shady LP, The Marshall Mathers LP, ...
                ratings:
                  type: array
                  description: >-
                    Review platform ratings (e.g. Rotten Tomatoes, IMDb) —
                    present for films and TV shows
                  items:
                    type: object
                    properties:
                      platform:
                        type: string
                        description: Review platform name
                        example: Rotten Tomatoes
                      rating:
                        type: string
                        description: Rating value as displayed
                        example: 88%
                      link:
                        type: string
                        description: URL to the review page
                        example: https://www.rottentomatoes.com/m/8_mile
                streamingOptions:
                  type: array
                  description: Streaming platform links for films and TV shows
                  items:
                    type: object
                    properties:
                      platform:
                        type: string
                        description: Streaming platform name
                        example: Netflix
                      link:
                        type: string
                        description: Link to the content on the platform
                        example: https://www.netflix.com/title/example
                webRatings:
                  type: array
                  description: >-
                    Web ratings from review platforms — present for local
                    businesses (e.g. Google, Tripadvisor, Yelp)
                  items:
                    type: object
                    properties:
                      platform:
                        type: string
                        description: Rating platform name
                        example: Google
                      rating:
                        type: string
                        description: Rating value as displayed
                        example: '4.5'
                      link:
                        type: string
                        description: URL to the platform's review page
                        example: https://www.google.com/maps/place/...
                      votes:
                        type: string
                        description: >-
                          Number of votes or reviews (omitted when not
                          available)
                        example: 1,234
                statsCard:
                  type: object
                  description: >-
                    Statistics card — present for sports teams, organizations,
                    and similar entities
                  properties:
                    context:
                      type: string
                      description: Context label for the stats (e.g. season or year)
                      example: 2023-24 NBA season
                    stats:
                      type: array
                      description: Individual stat items
                      items:
                        type: object
                        properties:
                          label:
                            type: string
                            description: Stat label
                            example: Points per game
                          value:
                            type: string
                            description: Stat value
                            example: '27.1'
                socialPosts:
                  type: array
                  description: >-
                    Recent social media posts from the entity's official
                    accounts
                  items:
                    type: object
                    properties:
                      platform:
                        type: string
                        description: Social platform name
                        example: X
                      text:
                        type: string
                        description: Post text content
                        example: New album dropping Friday 🔥
                      link:
                        type: string
                        description: URL to the post
                        example: https://x.com/eminem/status/...
                      date:
                        type: string
                        description: Post date as displayed by Google
                        example: 2 days ago
                notableAlumni:
                  type: array
                  description: >-
                    Notable alumni — present for universities and educational
                    institutions
                  items:
                    type: object
                    properties:
                      name:
                        type: string
                        description: Alumni name
                        example: Barack Obama
                      link:
                        type: string
                        description: Google search URL for this person
                        example: https://www.google.com/search?q=Barack+Obama
                contact:
                  type: array
                  description: Contact and ordering links — present for local businesses
                  items:
                    type: object
                    properties:
                      label:
                        type: string
                        description: Link label
                        example: Order online
                      url:
                        type: string
                        description: Link URL
                        example: https://www.restaurant.com/order
                weather:
                  type: object
                  description: >-
                    Current weather — present for geographic entities (cities,
                    regions)
                  properties:
                    temperature:
                      type: string
                      description: Temperature as displayed
                      example: 72°F
                    condition:
                      type: string
                      description: Weather condition
                      example: Sunny
                rating:
                  type: object
                  description: Aggregate star rating — present for local businesses
                  properties:
                    rating:
                      type: string
                      description: Star rating value
                      example: '4.5'
                    count:
                      type: string
                      description: Number of reviews
                      example: 2,847
                admission:
                  type: array
                  description: >-
                    Admission options — present for museums, parks, and ticketed
                    venues
                  items:
                    type: object
                    properties:
                      provider:
                        type: string
                        description: Ticket provider name
                        example: Official website
                      price:
                        type: string
                        description: Admission price as displayed
                        example: $17
                      link:
                        type: string
                        description: URL to purchase tickets
                        example: https://www.louvre.fr/en/tickets
                      badge:
                        type: string
                        description: >-
                          Optional badge text (e.g. "Free", "Best price") —
                          omitted when not present
                        example: Best price
                artworks:
                  type: array
                  description: Notable artworks — present for artists and art institutions
                  items:
                    type: object
                    properties:
                      title:
                        type: string
                        description: Artwork title
                        example: Mona Lisa
                      link:
                        type: string
                        description: Link to more information about the artwork
                        example: https://www.google.com/search?q=Mona+Lisa
                      author:
                        type: string
                        description: Author or creator name — omitted when not present
                        example: Leonardo da Vinci
                has3dModel:
                  type: boolean
                  description: True when Google surfaces a 3D model viewer for the entity
                  example: true
                hotelOptions:
                  type: array
                  description: Hotel booking options — present for hotel entities
                  items:
                    type: object
                    properties:
                      provider:
                        type: string
                        description: Booking provider name
                        example: Booking.com
                      price:
                        type: string
                        description: Price as displayed
                        example: $189/night
                      link:
                        type: string
                        description: URL to book on this provider
                        example: https://www.booking.com/hotel/...
                      note:
                        type: string
                        description: >-
                          Optional note (e.g. "Includes breakfast") — omitted
                          when not present
                        example: Includes breakfast
                trendingProducts:
                  type: array
                  description: Trending products — present for retail brands
                  items:
                    type: object
                    properties:
                      title:
                        type: string
                        description: Product title
                        example: Air Max 90
                      price:
                        type: string
                        description: Price as displayed
                        example: $120
                      link:
                        type: string
                        description: Link to the product
                        example: https://www.nike.com/t/air-max-90
                merchantVideos:
                  type: array
                  description: >-
                    Merchant or brand video content — present for retail
                    businesses
                  items:
                    type: object
                    properties:
                      title:
                        type: string
                        description: Video title
                        example: Foot Locker Week of Greatness
                      link:
                        type: string
                        description: Video URL
                        example: https://www.youtube.com/watch?v=...
                      platform:
                        type: string
                        description: Video platform — omitted when not available
                        example: YouTube
                      duration:
                        type: string
                        description: >-
                          Video duration as displayed — omitted when not
                          available
                        example: '2:34'
                listenOn:
                  type: array
                  description: >-
                    Music streaming platform links — present for musicians and
                    musical acts
                  items:
                    type: object
                    properties:
                      platform:
                        type: string
                        description: Streaming platform name
                        example: Spotify
                      link:
                        type: string
                        description: Link to the artist on the platform
                        example: https://open.spotify.com/artist/...
            html:
              type: array
              description: Raw HTML from Google search page (if requested)
              items:
                type: string
                format: uri
              example:
                - >-
                  https://storage.cloro.dev/results/b83e8dfd-c3a1-4b98-83b9-af91adc21e26/page-1.html
    ValidationError:
      type: object
      properties:
        success:
          type: boolean
          example: false
        error:
          type: string
          example: Request validation failed
        details:
          type: array
          items:
            type: object
            properties:
              field:
                type: string
                example: prompt
              message:
                type: string
                example: Prompt cannot be empty
    AuthenticationError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - MISSING_API_KEY
                - INVALID_API_KEY_FORMAT
                - INVALID_OR_EXPIRED_API_KEY
              example: MISSING_API_KEY
            message:
              type: string
              example: Missing or invalid API key
            timestamp:
              type: string
              format: date-time
              example: '2025-01-15T12:00:00.000Z'
    ForbiddenError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - INSUFFICIENT_PERMISSIONS
                - INSUFFICIENT_CREDITS
              example: INSUFFICIENT_PERMISSIONS
            message:
              type: string
              example: Insufficient permissions
            details:
              type: object
              properties:
                requiredScopes:
                  type: array
                  items:
                    type: string
                  example:
                    - read:monitor
                    - write:monitor
              required: []
            timestamp:
              type: string
              format: date-time
              example: '2025-01-15T12:00:00.000Z'
    NotFoundError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              example: RESOURCE_NOT_FOUND
            message:
              type: string
              example: Route not found
            details:
              type: object
              properties:
                id:
                  type: string
                  example: /v1/invalid-endpoint
            timestamp:
              type: string
              format: date-time
              example: '2025-01-15T12:00:00.000Z'
    ConflictError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              example: RESOURCE_CONFLICT
            message:
              type: string
              example: Resource conflict
            timestamp:
              type: string
              format: date-time
              example: '2025-01-15T12:00:00.000Z'
    ConcurrentLimitError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              example: CONCURRENT_LIMIT_EXCEEDED
            message:
              type: string
              example: Concurrent limit exceeded
            details:
              type: object
              properties:
                limit:
                  type: number
                  example: 10
            timestamp:
              type: string
              format: date-time
              example: '2025-01-15T12:00:00.000Z'
    CanceledError:
      type: object
      properties:
        success:
          type: boolean
          example: false
        error:
          type: string
          example: Request was canceled
    InternalError:
      type: object
      oneOf:
        - properties:
            success:
              type: boolean
              example: false
            error:
              type: string
              example: Maximum retries exceeded
        - properties:
            error:
              type: object
              properties:
                code:
                  type: string
                  example: INTERNAL_SERVER_ERROR
                message:
                  type: string
                  example: Internal server error
                timestamp:
                  type: string
                  format: date-time
                  example: '2025-01-15T12:00:00.000Z'
    ExternalServiceError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              example: EXTERNAL_SERVICE_ERROR
            message:
              type: string
              example: 'External service error: OpenAI'
            details:
              type: object
              properties:
                service:
                  type: string
                  example: OpenAI
            timestamp:
              type: string
              format: date-time
              example: '2025-01-15T12:00:00.000Z'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````