openapi: 3.0.3
info:
  title: Google SERP - Search Results JSON
  version: 1.2.0
  description: |
    Real-time Google search and Google Maps results as structured JSON, in the
    same response format as SerpApi's `google` and `google_maps` engines
    (`organic_results`, `knowledge_graph`, `local_results`, `answer_box`,
    `ai_overview`, `ads`, ...), so existing SerpApi parsing code works unchanged.
    SerpApi URLs work too: same parameter names, `/search.json` included.

    Every result link is the real destination URL (Google's redirect tokens are
    resolved for you); `redirect_link` keeps Google's own tracking URL. Ad links
    are never opened by us, so searching does not register ad clicks.

    **Countries and languages**: `gl` runs the search from a residential
    connection in that country, `hl` sets Google's language. **Location** is best
    effort: the search runs from the connection closest to the requested place,
    and `search_metadata.served_location` says where that was.

    **Pagination**: `start=10` is page 2 of web results (`start=20` for Maps);
    `serpapi_pagination.next` is the next page as a call to this API.

    **Coverage**: Google web search (`/search`, `engine=google`) and Google Maps
    search (`/maps`, or `/search` with `engine=google_maps`). A block the page did
    not have is absent from the response, never empty. Not yet parsed: chart
    series (hourly weather, price history) and the part of an AI Overview that
    Google only loads after "Show more". Maps place details and reviews are not
    available yet.

    **Timing**: most web searches answer in 1-5 s, Maps searches in 1-2 s; a web
    search that needs a fresh connection can take up to ~70 s. Use a client
    timeout of at least 100 s.

    **Authentication**: on RapidAPI, your X-RapidAPI-Key is all you need. Direct
    customers send their SerpGrab key as the `X-API-Key` header, the `api_key`
    parameter, or `Authorization: Bearer <key>`.
servers:
  - url: https://api.serpgrab.com
tags:
  - name: Search
    description: Google web search, parsed or raw
  - name: Maps
    description: Google Maps search (businesses and places)
  - name: AI agents
    description: MCP server (Model Context Protocol) for Claude, Cursor, ChatGPT and other agents
  - name: Status
    description: Service health

paths:
  /search:
    get:
      tags: [Search]
      operationId: searchGet
      summary: Google search, parsed to SerpApi-compatible JSON (query parameters)
      description: |
        SerpApi's request form: the same parameter names, so a SerpApi URL
        works with only the host and key changed. `/search.json` is an alias.
      parameters:
        - name: q
          in: query
          required: true
          description: The search, as typed into Google
          schema:
            type: string
          example: best coffee grinder
        - name: location
          in: query
          description: |
            Where to search from, best effort. Leave it out for a country-wide
            search. SerpApi's canonical form, e.g. `Austin,Texas,United States`,
            or looser (`Austin, TX`, `Texas`, `London`).
          schema:
            type: string
        - $ref: '#/components/parameters/gl'
        - $ref: '#/components/parameters/hl'
        - name: start
          in: query
          description: Result offset for pagination. `10` is page 2, `20` page 3.
          schema:
            type: integer
            minimum: 0
            maximum: 1000
            default: 0
        - name: num
          in: query
          description: Results per page (1-100), passed to Google. Since 2025 Google mostly ignores it and shows about 10 a page, so page with `start` instead.
          schema:
            type: integer
            minimum: 1
            maximum: 100
        - name: tbs
          in: query
          description: 'Google''s advanced filters, as in its own URLs: `qdr:h`, `qdr:d`, `qdr:w`, `qdr:m`, `qdr:y` (past hour, day, week, month, year), or a date range `cdr:1,cd_min:1/1/2026,cd_max:2/1/2026`.'
          schema:
            type: string
        - name: safe
          in: query
          description: '`active` filters explicit results; `off` (default) does not.'
          schema:
            type: string
            enum: [active, off]
        - name: lr
          in: query
          description: 'Only pages in these languages: `lang_en`, `lang_fr|lang_de`, ...'
          schema:
            type: string
        - name: cr
          in: query
          description: 'Only pages from these countries: `countryUS`, `countryCA|countryGB`, ...'
          schema:
            type: string
        - name: uule
          in: query
          description: Google's encoded location string, passed through as given. `location` is usually easier.
          schema:
            type: string
        - name: device
          in: query
          description: '`desktop` (default) is the only one available for now; anything else is a 400.'
          schema:
            type: string
            enum: [desktop]
        - name: engine
          in: query
          description: '`google` (default) for web search, or `google_maps` (then the parameters of `/maps` apply). Anything else is a 400.'
          schema:
            type: string
            enum: [google, google_maps]
            default: google
        - name: output
          in: query
          description: '`json` (default) or `html` for the raw results page'
          schema:
            type: string
            enum: [json, html]
            default: json
        - name: resolve
          in: query
          description: Resolve Google's redirect tokens to destination URLs (`false` is faster)
          schema:
            type: boolean
            default: true
        - name: html
          in: query
          description: Also return the raw page as `search_metadata.html`
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: Parsed results (or the raw page with `output=html`)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchResponse'
              examples:
                local:
                  $ref: '#/components/examples/LocalSearch'
            text/html:
              schema:
                type: string
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '502':
          $ref: '#/components/responses/SearchFailed'
        '503':
          $ref: '#/components/responses/Busy'
        '504':
          description: The search did not finish in time (gateway timeout). Retry; it is usually a one-off.
    post:
      tags: [Search]
      operationId: search
      summary: Google search, parsed to SerpApi-compatible JSON (JSON body)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchRequest'
            examples:
              local:
                summary: A local search from a chosen city
                value:
                  query: pizza
                  location: Austin,Texas,United States
              entity:
                summary: An entity with a knowledge panel
                value:
                  query: foo fighters
              country:
                summary: Page 2 from Germany, in German, past week
                value:
                  query: kaffeemühle test
                  gl: de
                  hl: de
                  start: 10
                  tbs: qdr:w
      responses:
        '200':
          description: Parsed results
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchResponse'
              examples:
                local:
                  $ref: '#/components/examples/LocalSearch'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '502':
          $ref: '#/components/responses/SearchFailed'
        '503':
          $ref: '#/components/responses/Busy'
        '504':
          description: The search did not finish in time (gateway timeout). Retry; it is usually a one-off.

  /lookup:
    post:
      tags: [Search]
      operationId: lookup
      summary: Google search, raw HTML of the results page
      description: The same search as `/search`, returning Google's HTML unparsed, for your own parsing.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [query]
              properties:
                query:
                  type: string
                  example: pizza
                location:
                  type: string
                  example: Austin,Texas,United States
      responses:
        '200':
          description: The results page
          content:
            application/json:
              schema:
                type: object
                properties:
                  query:
                    type: string
                  bytes:
                    type: integer
                    description: Size of `html`
                  ms:
                    type: integer
                    description: Time taken
                  html:
                    type: string
                    description: Google's results page
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '502':
          $ref: '#/components/responses/SearchFailed'
        '503':
          $ref: '#/components/responses/Busy'

  /maps:
    get:
      tags: [Maps]
      operationId: mapsSearch
      summary: Google Maps search, parsed to SerpApi's google_maps JSON
      description: |
        Businesses and places from Google Maps, 20 per page, in SerpApi's
        `google_maps` format. The same as `/search?engine=google_maps` (SerpApi's
        form); `/maps.json` is an alias.
      parameters:
        - name: q
          in: query
          required: true
          description: What to look for. Put the place in it (`plumber in denver co`) or give `ll`.
          schema:
            type: string
          example: pizza
        - name: ll
          in: query
          description: Map position as `@latitude,longitude,zoomz` (zoom 3 to 21).
          schema:
            type: string
            pattern: '^@-?\d{1,2}(\.\d+)?,-?\d{1,3}(\.\d+)?,\d{1,2}(\.\d+)?z$'
          example: '@30.2672,-97.7431,14z'
        - name: start
          in: query
          description: Offset in steps of 20 (`20` is page 2).
          schema:
            type: integer
            minimum: 0
            multipleOf: 20
            default: 0
        - $ref: '#/components/parameters/hl'
        - $ref: '#/components/parameters/gl'
        - name: type
          in: query
          description: '`search` (default). Place details (`type=place`, `data_id`, `place_id`) are not available yet.'
          schema:
            type: string
            enum: [search]
            default: search
      responses:
        '200':
          description: The places, 20 per page
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MapsResponse'
              examples:
                pizza:
                  $ref: '#/components/examples/MapsSearch'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '502':
          $ref: '#/components/responses/SearchFailed'
        '503':
          $ref: '#/components/responses/Busy'
    post:
      tags: [Maps]
      operationId: mapsSearchPost
      summary: Google Maps search (JSON body)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [q]
              properties:
                q:
                  type: string
                  example: pizza
                ll:
                  type: string
                  example: '@30.2672,-97.7431,14z'
                start:
                  type: integer
                  example: 20
                hl:
                  type: string
                  example: en
                gl:
                  type: string
                  example: us
      responses:
        '200':
          description: The places, 20 per page
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MapsResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '502':
          $ref: '#/components/responses/SearchFailed'
        '503':
          $ref: '#/components/responses/Busy'

  /mcp:
    post:
      tags: [AI agents]
      operationId: mcp
      summary: MCP server for AI agents (Google search and Maps tools)
      description: |
        A Model Context Protocol server (Streamable HTTP, stateless, JSON replies) with two tools,
        `google_search` and `google_maps_search`, that return results as text for an agent to read.
        Point an MCP client at
        `https://google-serp-search-results-json.p.rapidapi.com/mcp` with the
        `X-RapidAPI-Key` and `X-RapidAPI-Host` headers. Each call to this endpoint is one request
        on your plan, including the client's `initialize` and `tools/list` calls when it connects.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [jsonrpc, id, method]
              properties:
                jsonrpc:
                  type: string
                  example: '2.0'
                id:
                  type: integer
                  example: 1
                method:
                  type: string
                  description: '`initialize`, `tools/list` or `tools/call`'
                  example: tools/call
                params:
                  type: object
            example:
              jsonrpc: '2.0'
              id: 1
              method: tools/call
              params:
                name: google_search
                arguments:
                  query: what is the model context protocol
      responses:
        '200':
          description: A JSON-RPC reply. Tool errors (such as an exhausted quota) come back here with `isError` set.
          content:
            application/json:
              schema:
                type: object
        '401':
          $ref: '#/components/responses/Unauthorized'

  /health:
    get:
      tags: [Status]
      operationId: health
      summary: Liveness check (no key needed)
      responses:
        '200':
          description: The service is up
          content:
            application/json:
              schema:
                type: object
                properties:
                  ok:
                    type: boolean
                    example: true

components:
  # No securitySchemes on purpose: RapidAPI turns them into required consumer
  # parameters, but its subscribers only have their RapidAPI key (which reaches
  # us as X-RapidAPI-Proxy-Secret). Direct-key auth is described in info above.
  parameters:
    gl:
      name: gl
      in: query
      description: Country, as a two-letter code (`us`, `uk`, `de`, `fr`, `jp`...). The search runs from a connection in that country. Default `us`, or the country of `location`.
      schema:
        type: string
      example: us
    hl:
      name: hl
      in: query
      description: Interface language (`en`, `de`, `es`, `pt-BR`...). Default `en`.
      schema:
        type: string
      example: en
  responses:
    BadRequest:
      description: Missing query, invalid JSON, an unsupported engine, a location we could not place, or a bad parameter value; `error` names it
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            location:
              value:
                error: Unsupported `Nowheresville` location - try "City,Region,Country", e.g. "Austin,Texas,United States".
            gl:
              value:
                error: Unsupported `zz` gl (country) - use a two-letter country code like us, uk or de.
            ll:
              value:
                error: Unsupported `austin` ll - use @latitude,longitude,zoomz, e.g. @30.2672,-97.7431,14z (zoom 3 to 21).
    Unauthorized:
      description: Missing or invalid API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Invalid API key. Pass it as the X-API-Key header or the api_key parameter.
    SearchFailed:
      description: Google could not be reached after every retry; `error` names the failure kind. Safe to retry.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: entry-blocked
            message: 'session search failed: entry-blocked'
    Busy:
      description: Too many searches queued; retry after the `Retry-After` seconds
      headers:
        Retry-After:
          schema:
            type: integer
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: busy
              pending:
                type: integer
              max:
                type: integer

  schemas:
    Error:
      type: object
      required: [error]
      properties:
        error:
          type: string
        message:
          type: string

    SearchRequest:
      type: object
      required: [query]
      properties:
        query:
          type: string
          description: The search, as typed into Google
          example: pizza
        location:
          type: string
          description: |
            Where to search from, best effort. SerpApi's canonical form
            ("Austin,Texas,United States") or looser ("Austin, TX", "Texas",
            "New York"). Omit for a country-wide search.
          example: Austin,Texas,United States
        gl:
          type: string
          description: Country (two-letter code; `uk` for the United Kingdom). The search runs from a connection there.
          example: de
        hl:
          type: string
          description: Interface language.
          example: de
        start:
          type: integer
          description: Result offset (`10` is page 2).
          example: 10
        num:
          type: integer
          description: Results per page; Google mostly ignores it since 2025.
        tbs:
          type: string
          description: Google's advanced filters, e.g. `qdr:w` (past week).
          example: qdr:w
        safe:
          type: string
          enum: [active, off]
        lr:
          type: string
          example: lang_en
        cr:
          type: string
          example: countryUS
        uule:
          type: string
        resolve:
          type: boolean
          default: true
          description: Resolve Google's redirect tokens to destination URLs. `false` is faster and leaves `google.com/goto` links.
        html:
          type: boolean
          default: false
          description: Also return the raw results page as `search_metadata.html`.
        api_key:
          type: string
          description: Your key, if you prefer the body to a header.

    SearchResponse:
      type: object
      properties:
        search_metadata:
          $ref: '#/components/schemas/SearchMetadata'
        search_parameters:
          $ref: '#/components/schemas/SearchParameters'
        search_information:
          $ref: '#/components/schemas/SearchInformation'
        ads:
          type: array
          description: Text ads, top and bottom of the page
          items:
            $ref: '#/components/schemas/Ad'
        local_ads:
          $ref: '#/components/schemas/LocalAds'
        sports_results:
          type: object
          additionalProperties: true
          description: 'Team or league panel: title, rankings, thumbnail, games[] (tournament, venue, status, date, time, teams[] with name/score/kgmid, video_highlights)'
        events_results:
          type: array
          description: 'Events ("concerts this weekend") and an artist''s tour dates: title, date, time, address or venue, link, ticket_info[]'
          items:
            type: object
            additionalProperties: true
        jobs_results:
          type: object
          additionalProperties: true
          description: 'Google Jobs box: link, link_text, jobs[] (title, link, company_name, location, via, extensions[], detected_extensions{posted_at, schedule_type, salary, ...})'
        recipes_results:
          type: array
          description: 'Recipe cards: title, link, source, rating, reviews, total_time, ingredients[]'
          items:
            type: object
            additionalProperties: true
        answer_box:
          $ref: '#/components/schemas/AnswerBox'
        local_map:
          type: object
          description: The map beside the local pack
          properties:
            link:
              type: string
            image:
              type: string
            gps_coordinates:
              type: object
              properties:
                latitude:
                  type: number
                longitude:
                  type: number
        local_results:
          $ref: '#/components/schemas/LocalResults'
        inline_images:
          type: array
          description: The image strip
          items:
            type: object
            properties:
              title:
                type: string
              source:
                type: string
                description: The page the image is on
              source_name:
                type: string
              thumbnail:
                type: string
              original:
                type: string
                description: The full-size image
        immersive_products:
          type: array
          description: Shopping cards ("Popular products", "Deals on ...")
          items:
            $ref: '#/components/schemas/ImmersiveProduct'
        ai_overview:
          $ref: '#/components/schemas/AiOverview'
        knowledge_graph:
          $ref: '#/components/schemas/KnowledgeGraph'
        inline_videos:
          type: array
          items:
            $ref: '#/components/schemas/InlineVideo'
        short_videos:
          type: array
          items:
            $ref: '#/components/schemas/ShortVideo'
        related_questions:
          type: array
          description: '"People also ask" questions'
          items:
            type: object
            properties:
              question:
                type: string
        top_stories:
          type: array
          items:
            $ref: '#/components/schemas/TopStory'
        top_stories_link:
          type: string
          description: Google News search for the query
        perspectives:
          type: array
          description: '"What people are saying" posts'
          items:
            $ref: '#/components/schemas/Perspective'
        latest_posts:
          type: array
          description: '"Latest posts from <entity>"'
          items:
            $ref: '#/components/schemas/LatestPost'
        organic_results:
          type: array
          items:
            $ref: '#/components/schemas/OrganicResult'
        filters:
          type: array
          description: The chips above the results ("Open now", "Job type"...), each with the search it runs; dropdowns carry options[]
          items:
            type: object
            additionalProperties: true
        related_searches:
          type: array
          items:
            type: object
            properties:
              block_position:
                type: integer
              query:
                type: string
              link:
                type: string
        refine_this_search:
          type: array
          description: '"Refine this search" chips on shopping searches'
          items:
            type: object
            properties:
              query:
                type: string
              link:
                type: string
        things_to_know:
          type: object
          description: '"Things to know" topics'
          properties:
            buttons:
              type: array
              items:
                type: object
                properties:
                  text:
                    type: string
                  search_link:
                    type: string
        discussions_and_forums:
          type: array
          description: 'Forum threads (Reddit, Quora...): title, link, date, source, extensions[], answers[]'
          items:
            type: object
            additionalProperties: true
        pagination:
          $ref: '#/components/schemas/Pagination'
        serpapi_pagination:
          $ref: '#/components/schemas/Pagination'

    SearchInformation:
      type: object
      properties:
        query_displayed:
          type: string
        total_results:
          type: integer
          description: Google's own rough count
        page_number:
          type: integer
          description: From page 2 on
        time_taken_displayed:
          type: number
        organic_results_state:
          type: string
          example: Results for exact spelling
        results_for:
          type: string
          example: Chicago, IL
        spelling_fix:
          type: string
        showing_results_for:
          type: string
          description: The corrected query Google searched instead

    Pagination:
      type: object
      description: '`pagination` has Google''s page links; `serpapi_pagination` the same pages as calls to this API'
      properties:
        current:
          type: integer
        previous:
          type: string
        next:
          type: string
        other_pages:
          type: object
          additionalProperties:
            type: string

    Ad:
      type: object
      properties:
        position:
          type: integer
        block_position:
          type: string
          enum: [top, bottom]
        title:
          type: string
        link:
          type: string
          description: The landing page as the ad states it (usually the site root)
        displayed_link:
          type: string
        tracking_link:
          type: string
          description: Google's click URL (we never open it)
        description:
          type: string
        source:
          type: string
        rating:
          type: number
        reviews:
          type: integer
        extensions:
          type: array
          items:
            type: string
        sitelinks:
          type: array
          items:
            type: object
            properties:
              title:
                type: string
              link:
                type: string

    LocalAds:
      type: object
      description: Local Services ads ("Sponsored plumbers")
      properties:
        title:
          type: string
        see_more_text:
          type: string
        link:
          type: string
        ads:
          type: array
          items:
            type: object
            properties:
              position:
                type: integer
              title:
                type: string
              link:
                type: string
              rating:
                type: number
              rating_count:
                type: integer
              type:
                type: string
              service_area:
                type: string
              hours:
                type: string
              years_in_business:
                type: string
              highlighted_details:
                type: array
                items:
                  type: string

    ImmersiveProduct:
      type: object
      properties:
        category:
          type: string
        title:
          type: string
        source:
          type: string
          description: The store
        price:
          type: string
        extracted_price:
          type: number
        original_price:
          type: string
        extracted_original_price:
          type: number
        rating:
          type: number
        reviews:
          type: integer
        delivery:
          type: string
        extensions:
          type: array
          items:
            type: string
        thumbnail:
          type: string
        source_logo:
          type: string
        product_id:
          type: string

    MapsResponse:
      type: object
      properties:
        search_metadata:
          type: object
          properties:
            status:
              type: string
              example: Success
            created_at:
              type: string
              format: date-time
            google_maps_url:
              type: string
            total_time_taken:
              type: number
            fetch_ms:
              type: integer
            parse_ms:
              type: integer
        search_parameters:
          type: object
          additionalProperties: true
          properties:
            engine:
              type: string
              example: google_maps
            type:
              type: string
              example: search
            q:
              type: string
            ll:
              type: string
        search_information:
          type: object
          properties:
            local_results_state:
              type: string
              example: Results for exact spelling
            query_displayed:
              type: string
        local_results:
          type: array
          items:
            $ref: '#/components/schemas/MapsPlace'
        serpapi_pagination:
          type: object
          properties:
            next:
              type: string
              description: The next 20, as a call to this API (present when the page was full)

    MapsPlace:
      type: object
      properties:
        position:
          type: integer
        title:
          type: string
        place_id:
          type: string
        data_id:
          type: string
        data_cid:
          type: string
        gps_coordinates:
          type: object
          properties:
            latitude:
              type: number
            longitude:
              type: number
        provider_id:
          type: string
        rating:
          type: number
        reviews:
          type: integer
        price:
          type: string
        type:
          type: string
        types:
          type: array
          items:
            type: string
        address:
          type: string
        country:
          type: string
        open_state:
          type: string
        hours:
          type: string
        operating_hours:
          type: object
          additionalProperties:
            type: string
          example:
            monday: 11 AM–10 PM
        phone:
          type: string
        website:
          type: string
        description:
          type: string
        extensions:
          type: array
          description: Attributes the place has, grouped (accessibility, service_options, ...)
          items:
            type: object
            additionalProperties:
              type: array
              items:
                type: string
        unsupported_extensions:
          type: array
          description: Attributes Google lists as not offered
          items:
            type: object
            additionalProperties:
              type: array
              items:
                type: string
        order_online:
          type: string
        reserve_a_table:
          type: string
        book_online:
          type: string
        thumbnail:
          type: string

    SearchMetadata:
      type: object
      properties:
        status:
          type: string
          example: Success
        created_at:
          type: string
          format: date-time
        google_url:
          type: string
          description: The Google URL this search fetched
        total_time_taken:
          type: number
          description: Seconds
        fetch_ms:
          type: integer
        parse_ms:
          type: integer
        resolve_ms:
          type: integer
        links_resolved:
          type: integer
        links_failed:
          type: integer
        served_location:
          type: object
          description: Where the search actually ran (the exit's city per IP geolocation)
          properties:
            city:
              type: string
            region:
              type: string
            country:
              type: string
              example: US
            distance_km:
              type: integer
              description: Distance from the requested location (only with `location`)
        html:
          type: string
          description: "Raw results page (only with `html: true`)"

    SearchParameters:
      type: object
      properties:
        engine:
          type: string
          example: google
        q:
          type: string
        location_requested:
          type: string
        location_used:
          type: string
          description: The place `location_requested` resolved to, as "City,Region,Country"
        google_domain:
          type: string
          example: google.com
        hl:
          type: string
        gl:
          type: string
        start:
          type: integer
        num:
          type: integer
        tbs:
          type: string
        device:
          type: string
          example: desktop

    Sitelinks:
      type: object
      properties:
        expanded:
          type: array
          items:
            type: object
            properties:
              title:
                type: string
              link:
                type: string
              snippet:
                type: string
        inline:
          type: array
          items:
            type: object
            properties:
              title:
                type: string
              link:
                type: string
        list:
          type: array
          description: Forum threads under a Reddit/Quora result
          items:
            type: object
            properties:
              title:
                type: string
              link:
                type: string
              answer_count:
                type: integer
              date:
                type: string

    OrganicResult:
      type: object
      properties:
        position:
          type: integer
        title:
          type: string
        link:
          type: string
          description: Destination URL
        redirect_link:
          type: string
          description: Google's tracking URL for the result
        displayed_link:
          type: string
          description: The breadcrumb Google shows, or "3.6M+ views · 6 years ago" for a video
        source:
          type: string
        favicon:
          type: string
        thumbnail:
          type: string
        date:
          type: string
        snippet:
          type: string
        snippet_highlighted_words:
          type: array
          items:
            type: string
        read_more_link:
          type: string
          description: Link to the snippet's passage on the page
        duration:
          type: string
          description: Video results only
        sitelinks:
          $ref: '#/components/schemas/Sitelinks'

    KnowledgeGraph:
      type: object
      description: |
        The entity panel. Besides the fixed fields, every fact the panel shows
        becomes a key named after its label ("Release date" -> `release_date`)
        with a matching `<key>_links` array, and carousels become arrays
        (`members`, `songs`, `albums`, `cast`, `players`, `profiles`, `listen`, ...).
      additionalProperties: true
      properties:
        title:
          type: string
        type:
          type: string
        entity_type:
          type: string
          example: music, people
        kgmid:
          type: string
          example: /m/02r3zy
        knowledge_graph_search_link:
          type: string
        description:
          type: string
        source:
          type: object
          properties:
            name:
              type: string
            link:
              type: string
        header_images:
          type: array
          items:
            type: object
            properties:
              image:
                type: string
              source:
                type: string
        people_also_search_for:
          type: array
          items:
            $ref: '#/components/schemas/KgItem'
    KgItem:
      type: object
      properties:
        name:
          type: string
        title:
          type: string
        extensions:
          type: array
          items:
            type: string
        link:
          type: string
        image:
          type: string
        thumbnail:
          type: string

    LocalResults:
      type: object
      properties:
        more_locations_link:
          type: string
        places:
          type: array
          items:
            type: object
            properties:
              position:
                type: integer
              title:
                type: string
              type:
                type: string
              rating:
                type: number
              reviews:
                type: integer
              price:
                type: string
              description:
                type: string
              thumbnail:
                type: string
              links:
                type: object
                properties:
                  phone:
                    type: string
                  website:
                    type: string
              place_id:
                type: string
              provider_id:
                type: string
              gps_coordinates:
                type: object
                properties:
                  latitude:
                    type: number
                  longitude:
                    type: number
              address:
                type: string
              hours:
                type: string
              phone:
                type: string

    AnswerBox:
      type: object
      description: |
        The one-off widget at the top of the page; its fields depend on `type`:
        `weather_result` (temperature, unit, precipitation, humidity, wind,
        location, date, weather, forecast[]), `finance_results` (exchange,
        stock, currency, price, price_movement, market, table[]),
        `currency_converter` (result, price, currency, date,
        currency_converter.from/to), `google_flights` (title, flights[],
        search_information).
      additionalProperties: true
      properties:
        type:
          type: string
          enum: [weather_result, finance_results, currency_converter, google_flights]

    AiOverview:
      type: object
      properties:
        text_blocks:
          type: array
          items:
            type: object
            properties:
              type:
                type: string
                enum: [paragraph, heading, list]
              snippet:
                type: string
              snippet_highlighted_words:
                type: array
                items:
                  type: string
              snippet_links:
                type: array
                items:
                  type: object
                  properties:
                    text:
                      type: string
                    link:
                      type: string
              reference_indexes:
                type: array
                items:
                  type: integer
              list:
                type: array
                items:
                  type: object
                  properties:
                    title:
                      type: string
                    snippet:
                      type: string
                    reference_indexes:
                      type: array
                      items:
                        type: integer
        references:
          type: array
          items:
            type: object
            properties:
              index:
                type: integer
              title:
                type: string
              link:
                type: string
              snippet:
                type: string
              source:
                type: string
              thumbnail:
                type: string

    InlineVideo:
      type: object
      properties:
        position:
          type: integer
        title:
          type: string
        link:
          type: string
        snippet:
          type: string
        thumbnail:
          type: string
        channel:
          type: string
        duration:
          type: string
        platform:
          type: string
        date:
          type: string

    ShortVideo:
      type: object
      properties:
        position:
          type: integer
        title:
          type: string
        link:
          type: string
        thumbnail:
          type: string
        source:
          type: string
        source_logo:
          type: string
        profile_name:
          type: string
        duration:
          type: string
        extensions:
          type: array
          items:
            type: string

    TopStory:
      type: object
      properties:
        title:
          type: string
        link:
          type: string
        source:
          type: string
        date:
          type: string
        source_logo:
          type: string
        thumbnail:
          type: string

    Perspective:
      type: object
      properties:
        author:
          type: string
        source:
          type: string
        duration:
          type: string
        extensions:
          type: array
          items:
            type: string
          example: [122.8K+ views]
        thumbnails:
          type: array
          items:
            type: string
        title:
          type: string
        link:
          type: string
        date:
          type: string

    LatestPost:
      type: object
      properties:
        title:
          type: string
        link:
          type: string
        source:
          type: string
        source_icon:
          type: string
        channel:
          type: string
        date:
          type: string
        likes:
          type: string
          example: 2.5K+ likes
        extracted_likes:
          type: integer
          example: 2500

  examples:
    LocalSearch:
      summary: '"pizza" from Austin, TX (trimmed)'
      value:
        search_metadata:
          status: Success
          created_at: '2026-10-19T01:36:41.172Z'
          total_time_taken: 4.1
          fetch_ms: 2310
          parse_ms: 371
          resolve_ms: 1419
          links_resolved: 27
          links_failed: 0
          served_location:
            city: San Antonio
            region: Texas
            country: US
            distance_km: 125
        search_parameters:
          engine: google
          q: pizza
          location_requested: Austin,Texas,United States
          location_used: Austin,Texas,United States
          google_domain: google.com
          device: desktop
        search_information:
          query_displayed: pizza
          total_results: 126
          time_taken_displayed: 0.3
          organic_results_state: Results for exact spelling
        local_results:
          places:
            - position: 1
              title: Home Slice Pizza
              type: Pizza restaurant
              rating: 4.7
              reviews: 11164
              price: $10–20
              links:
                phone: tel:(512) 444-7437
                website: https://homeslicepizza.com/location/south-congress/
              place_id: '12299280573550492680'
              provider_id: /g/1tg35m2r
              gps_coordinates:
                latitude: 30.24923
                longitude: -97.749535
              address: 1415 S Congress Ave, Austin, TX 78704
              hours: Open · Closes 11 PM
              phone: (512) 444-7437
        organic_results:
          - position: 1
            title: All About Pizza in Austin, TX
            link: https://www.austinfoodadventures.com/blog/the-best-pizza-spots-in-austin-tx/
            displayed_link: https://www.austinfoodadventures.com › Local Eats
            source: Austin Food Adventures
            date: Sep 2, 2025
            snippet: Our unfiltered reviews of every pizza spot worth visiting in Austin, TX. Neapolitan, New York style, Detroit, and everything in between.
            snippet_highlighted_words:
              - every pizza spot worth visiting in Austin, TX
            sitelinks:
              inline:
                - title: Pedrosos Pizza
                  link: https://www.austinfoodadventures.com/blog/the-best-pizza-spots-in-austin-tx/#pedrosos-pizza
        related_searches:
          - block_position: 1
            query: Best pizza austin tx
            link: https://www.google.com/search?q=Best+pizza+austin+tx
    MapsSearch:
      summary: '"pizza" at @30.2672,-97.7431,14z (Austin; one result shown)'
      value:
        search_metadata:
          status: Success
          created_at: '2026-10-20T01:12:08.698Z'
          google_maps_url: https://www.google.com/maps/search/pizza/@30.2672,-97.7431,14z?hl=en
          total_time_taken: 1.299
          fetch_ms: 1173
          parse_ms: 126
        search_parameters:
          engine: google_maps
          type: search
          q: pizza
          ll: '@30.2672,-97.7431,14z'
          google_domain: google.com
        search_information:
          local_results_state: Results for exact spelling
          query_displayed: pizza
        local_results:
          - position: 6
            title: Via 313 Pizza
            place_id: ChIJAQCw-7a1RIYRpVobzBNIsoQ
            data_id: 0x8644b5b6fbb00001:0x84b24813cc1b5aa5
            data_cid: '9561784208726907557'
            gps_coordinates:
              latitude: 30.2621915
              longitude: -97.7231488
            provider_id: /g/11f4vy660s
            rating: 4.6
            reviews: 2737
            type: Pizza restaurant
            types: [Pizza restaurant, Bar, Gluten-free restaurant, Restaurant]
            address: 1802 E 6th St, Austin, TX 78702
            country: United States
            open_state: Open · Closes 10 PM
            hours: Open · Closes 10 PM
            operating_hours:
              monday: 11 AM–10 PM
              friday: 11 AM–12 AM
            phone: (737) 353-0313
            website: https://locations.via313.com/locations/1802-e-6th-street/
            description: Detroit-style pizzas in a casual setting. Local pizzeria chain known for its square, Detroit-style pizzas & inventive toppings.
            extensions:
              - accessibility: [Wheelchair accessible entrance, Wheelchair accessible restroom]
            thumbnail: https://lh3.googleusercontent.com/grass-cs/...
            reserve_a_table: https://www.google.com/maps/reserve/v/dine/c/...
            order_online: https://www.google.com/searchviewer/42?cvd=...
        serpapi_pagination:
          next: https://api.serpgrab.com/search.json?engine=google_maps&type=search&q=pizza&ll=%4030.2672%2C-97.7431%2C14z&start=20
