# Track Google Search results

`POST https://api.answerline.dev/v1/monitor/google`

Get structured output from Google Search: organic listings, related searches, People Also Ask and, optionally, the AI Overview

From $1.00 per 1,000 requests. Failed requests are free. Also runs as an async task of type `GOOGLE`.

## Body

- `query` (string): Query to run on Google. Mandatory when 'url' is not given; send one or the other, never both.
- `url` (string): A full URL of a Google web search, executed as-is in place of a request assembled from 'query' plus the targeting fields. It has to be absolute and http(s), hosted on one of Google's web search domains (google.com, google.co.uk, www.google.de, ...), with '/search' as its path and a 'q' that is not empty. Cannot be combined with 'query', 'location', 'uule' or 'pages', since the URL already determines them. It may carry only these query parameters, which are kept: 'q', 'gl', 'num' (treated as result depth), 'hl' and 'uule'; a URL with any other (such as 'start', 'tbs' or 'safe') is refused with a 400. Without 'uule', the search is localized to the requested country. A URL containing 'tbm' is refused: it points at a Google vertical that has a separate endpoint and price (for tbm=nws, call POST /v1/monitor/google/news).
- `country` (string): Country for localized search results, as an ISO 3166-1 alpha-2 code. Mandatory in the standard request form. If you send 'url' instead, the country is taken from the URL's 'gl' parameter; set it yourself to override that value, or when the URL carries no 'gl'.
- `gl` (string): Google's own name for the result-geography parameter, usable in place of `country`. Takes ISO 3166-1 alpha-2 codes, as `country` does, in upper or lower case (`us` or `US`), and the country has to be one this endpoint supports (list them with `GET /v1/countries`; Google News has no `model` value there, and its edition countries are listed at https://answerline.dev/docs/coverage#countries). Send either `country` or `gl`; if both are sent with differing values, the request fails with `400`.
- `state` (string): US state code (e.g. "CA", "DC" included). Sent without a country, the request asks for the US; sent with any country other than "US", it is refused with a 400, uncharged. ChatGPT and Gemini answer as a person in that state sees it; every other engine accepts it and answers for the whole US, at the price of a request without it. provenance.requestedState reports the state asked. See https://answerline.dev/docs/coverage#states
- `hl` (string): Interface language, in the format of Google's `hl` parameter (for example `en`, `de`, `pt-BR`). Case-insensitive free text; Google defines which codes exist. Takes precedence over the language Answerline infers from the country, which lets interface language and result geography differ.
- `location` (string): Location name in Google's canonical comma-separated form 'City,Region,Country' (roughly 100,000 accepted locations are listed at https://developers.google.com/google-ads/api/reference/data/geotargets). Combine with 'country' to target a specific city. Cannot be sent together with 'uule'; choose one of the two. Not allowed when 'url' is set.
- `uule` (string): A ready-made Google UULE string for exact geo-targeting, in the location-name form (starting w+CAIQICI); the coordinate form (a+) is refused with a 400. Supply it when you already have an encoded UULE rather than a location name. Cannot be sent together with 'location'; pass only one of the two. Not allowed together with 'url'; in that case add 'uule' to the URL's query string.
- `device` ("desktop" | "mobile" | "ios" | "android"): Device to run the search on. 'desktop' gives the desktop SERP, while 'ios' (Safari on an iPhone), 'android' (Chrome on an Android phone) and 'mobile' (same as 'android') each give the mobile SERP.
- `pages` (integer): How many pages of search results to retrieve (1-10). Not allowed together with 'url': when 'url' is given, depth is taken from the URL's 'num' parameter (rounded up to full 10-result pages, at most 10 pages).
- `include` (object): Flags that add extra data to the response (optional)
  - `include.html` (boolean): A copy of each Google results page as it was when the answer was captured, stored on our file host and linked in `html`, to check the answer against. No extra cost.
  - `include.aioverview` (object): Add Google's AI Overview to the response
  - `include.paaAioverview` (boolean): Fill People Also Ask items of the AI Overview type with markdown content and their sources. Free: only include.aioverview is billed, as the AI Overview add-on. Every hydrated item needs one more fetch (usually 1-2 on a page), which makes responses slower.
  - `include.googleGoto` (boolean): Has had no effect since 8th September 2026. Each redirect link is now always returned as `redirectLink` next to its target, so you get both without setting this flag. Requests that still include it are handled as though it were omitted.
  - `include.rawWire` (boolean): Return the engine's own response as received in result.rawWire: the answer stream, the rendered results pages or the RSS feed, without Gemini's detected location or ChatGPT's session tokens; null where it was not captured. Free. See https://answerline.dev/docs/output-formats#raw-wire
  - `include.screenshot` (boolean): Return a full-page PNG screenshot of the engine's page as it showed the finished answer, in result.screenshot: a link, or one link per results page on Google Search. On ChatGPT, Gemini, AI Mode, Google Search, Perplexity and Grok; other engines refuse it with a 400. Absent when the answer was read without a rendered page or its page was not available. Free. See https://answerline.dev/docs/output-formats#screenshots
- `answerDepth` ("any" | "full" | "quick"): Accepted so existing requests stay valid; it does not change the answer or the price. Every engine writes one depth: Perplexity answers every request with its Quick Search answer, and provenance.answerDepth says quick. See https://answerline.dev/docs/engine-features/#answer-depth

## Returns

- `result.organicResults` (object[]): Google organic results
- `result.peopleAlsoAsk` (object[]): Google's "People also ask" questions
- `result.peopleAreSaying` (object[]): Items from the Google results module titled "What people are saying" or "Trending posts and discussions". When the page has no such module, `result` leaves this field out instead of returning an empty array, so treat it as optional.
- `result.localResults` (object[]): Businesses in Google's local pack (the map-based "3-pack" of nearby businesses shown for local-intent searches, e.g. "best ramen in seattle"). If the SERP has no local pack, `result` does not contain this field at all, so treat it as optional instead of relying on an empty array. Applies to desktop only; neither the mobile layout nor the hotels/travel pack (a separate panel) is returned.
- `result.localResultsMoreLink` (string): Full URL of the "More places" / "More businesses" control shown under the local pack; it opens Google's larger Local Finder for this query. Present only together with `localResults`, and only if the SERP shows that control.
- `result.relatedSearches` (object[]): Suggested related searches
- `result.ads` (object[]): Sponsored results in Google search: text ads (`type: RESULT`), plus sponsored shopping cards (`type: SHOPPING_CARD`) drawn from the carousels at the top of the page and in the right-hand column.
- `result.aioverview` (object): Data from Google's AI Overview, when requested; null if no AI Overview could be obtained after retrying.
- `result.shoppingCards` (object[]): Product cards taken from the organic shopping grids on the results page ("Popular products" / "More products"). When the page has no shopping section, `result` does not include this field at all, so clients should handle it as optional instead of relying on an empty array. The shape reuses field names from `shopping_cards` in AI Mode for consistency across endpoints, but its keys are camelCase (`productLink`, `oldPrice`) in the Google response.
- `result.knowledgeGraph` (object): Knowledge Graph panel Google shows for the entity in the query. Not included in `result` if the results page has no such panel. Handle the field as optional: it is not sent as null.
  - `result.knowledgeGraph.title` (string): Name of the entity from the panel's heading
  - `result.knowledgeGraph.type` (string): Category label for the entity exactly as Google shows it (for instance "British singer", "Italian cathedral"). Any string is possible; it is not an enum.
  - `result.knowledgeGraph.kgmid` (string): The entity's ID in the Google Knowledge Graph
  - `result.knowledgeGraph.description` (string): Brief summary of the entity (can come from Wikipedia or from Google's knowledge base)
  - `result.knowledgeGraph.imageUrl` (string): Image URL for the entity, as Google delivers it
  - `result.knowledgeGraph.website` (string): The entity's official website URL
  - `result.knowledgeGraph.menu` (string): Link to the menu (given for restaurants and other food businesses)
  - `result.knowledgeGraph.trailer` (string): Link to the trailer; included for movies and TV series
  - `result.knowledgeGraph.source` (object): Where the entity description comes from (usually Wikipedia)
  - `result.knowledgeGraph.attributes` (object[]): Facts from the panel as key-value pairs (such as founded, headquarters, CEO). Keys are arbitrary strings, taken as Google shows them.
  - `result.knowledgeGraph.profiles` (object[]): Links to the entity's social media and other external profiles
  - `result.knowledgeGraph.peopleAlsoSearchFor` (object[]): Other entities people search for alongside this one
  - `result.knowledgeGraph.thingsToKnow` (object[]): Topic groups parsed from the "Things to know" panel
  - `result.knowledgeGraph.ratings` (object[]): Ratings from review platforms (e.g. Rotten Tomatoes, IMDb); included for movies and TV series
  - `result.knowledgeGraph.streamingOptions` (object[]): Links to streaming platforms for movies and TV series
  - `result.knowledgeGraph.webRatings` (object[]): Ratings collected from online review sites; included when the result is a local business (such as Google, Tripadvisor, Yelp)
  - `result.knowledgeGraph.statsCard` (object): Card with statistics; included for entities such as sports teams and organizations
  - `result.knowledgeGraph.socialPosts` (object[]): Latest social media posts published by the entity's official accounts
  - `result.knowledgeGraph.notableAlumni` (object[]): Well-known alumni (given for universities and other educational institutions)
  - `result.knowledgeGraph.contact` (object[]): Links for contacting or ordering; included for local businesses
  - `result.knowledgeGraph.weather` (object): Weather right now; included for geographic entities such as cities and regions
  - `result.knowledgeGraph.rating` (object): Overall star rating; included for local businesses
  - `result.knowledgeGraph.admission` (object[]): Ticket choices; included for museums, parks and other venues that charge entry
  - `result.knowledgeGraph.artworks` (object[]): Well-known artworks (given for artists and for art institutions)
  - `result.knowledgeGraph.has3dModel` (boolean): True if Google offers an interactive 3D view of the entity
  - `result.knowledgeGraph.hotelOptions` (object[]): Options for booking the hotel, only for hotel entities
  - `result.knowledgeGraph.trendingProducts` (object[]): Products currently trending; included for retail brands
  - `result.knowledgeGraph.merchantVideos` (object[]): Videos from the merchant or brand (given for retail businesses)
  - `result.knowledgeGraph.listenOn` (object[]): Links to music streaming services (given for musicians and bands)
  - `result.knowledgeGraph.redirectLink` (string): The `/goto` redirect Google used for this link, given in the absolute form that `POST /v1/monitor/google/goto` takes. Only set when Google delivered the link through a redirect; the neighbouring link field contains the destination Answerline reached by following it.
- `result.html` (string[]): Present when include.html is true: the links to the stored copy of each results page, in page order.
- `result.screenshot` (string[]): Present when include.screenshot is true and the pages were rendered: the links to the PNG screenshot of each results page, in page order.
- `result.recipes` (object[]): The cards of Google's Recipes carousel, in the order shown. Absent when the page shows none.
- `result.videos` (object[]): Cards of Google's Videos and Short videos blocks
- `result.images` (object[]): Pictures of Google's Images block
- `result.spelling` (object): The query Google corrected the search to, when it shows a correction above the results
  - `result.spelling.query` (string): The corrected query
  - `result.spelling.type` ("DID_YOU_MEAN" | "SHOWING_RESULTS_FOR" | "INCLUDING_RESULTS_FOR" | "NO_RESULTS_FOUND_FOR"): How Google showed it: "Did you mean", "Showing results for", "Including results for" or "No results found for"

## Responses

- 200: Google monitoring result (success)
- 400: Bad Request - one or more parameters are not valid
- 401: Unauthorized - API key absent or not valid
- 403: Forbidden - INSUFFICIENT_CREDITS: the balance does not cover this request
- 404: Not Found - No such route, or the engine is paused
- 409: Conflict - the resource is in a conflicting state
- 429: Too Many Requests - the call could not start now (`CONCURRENT_LIMIT_EXCEEDED`), or the service dropped the request because it was overloaded (`SERVICE_OVERLOADED`); that case returns `Retry-After` without any limit headers. `RATE_LIMIT_EXCEEDED`, with `Retry-After`, is sent only when one address presented too many unknown keys
- 499: Client Closed Request - the client cancelled the request
- 500: Internal Server Error
- 502: Bad Gateway - the engine failed

## Request

curl:

```bash
curl -X POST "https://api.answerline.dev/v1/monitor/google" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"project management software","country":"US","include":{"aioverview":{"markdown":true}}}'
```

TypeScript:

```ts
import { Client } from "@answerline/sdk";

const client = new Client({ apiKey: process.env.API_KEY! });
const answer = await client.monitor.google({
  "query": "project management software",
  "country": "US",
  "include": {
    "aioverview": {
      "markdown": true
    }
  }
});
```

Python:

```python
import os
from answerline import Client

with Client(os.environ["API_KEY"]) as client:
    answer = client.monitor.google(
        query="project management software",
        country="US",
        include={
            "aioverview": {
                "markdown": True
            }
        },
    )
```


## Example responses

200:

```json
{
  "success": true,
  "result": {
    "organicResults": [
      {
        "position": 1,
        "title": "The Best Monitors for Developers in 2024",
        "link": "https://example.com/best-programming-laptops",
        "source": "Serious Eats",
        "displayedLink": "https://example.com",
        "snippet": "Shopping for a tablet to draw on? We compared and ranked the leading models...",
        "date": "2 days ago",
        "rating": 4.7,
        "ratingMax": 5,
        "reviews": 14,
        "price": {
          "value": 169.99,
          "currency": "$",
          "raw": "$169.99"
        },
        "page": 1,
        "sitelinks": {
          "inline": [
            {
              "title": "Specifications",
              "link": "https://example.com/specs",
              "snippet": "Full specifications and dimensions.",
              "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
            }
          ]
        },
        "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
      }
    ],
    "peopleAlsoAsk": [
      {
        "question": "How much RAM does a coding laptop really need?",
        "type": "AIOVERVIEW",
        "snippet": "The main factors to weigh are screen size, battery life, and stylus support...",
        "title": "Key hardware specs for coding laptops",
        "link": "https://example.com/laptop-specs",
        "markdown": "string",
        "sources": [
          {
            "label": "Coding Notebook Buyer's Notes",
            "url": "https://example.com/guide",
            "description": "string",
            "position": 0,
            "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
          }
        ],
        "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
      }
    ],
    "peopleAreSaying": [
      {
        "position": 1,
        "title": "Top trail shoes of 2026 - runner reviews",
        "link": "https://www.reddit.com/r/running/comments/example/",
        "date": "5 days ago",
        "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
      }
    ],
    "localResults": [
      {
        "position": 1,
        "title": "Corner Slice Midtown",
        "placeId": "/g/11bw4ws2mt",
        "rating": 4.4,
        "reviews": "26K",
        "price": "$10–20",
        "type": "Pizza",
        "yearsInBusiness": "45+ years in business",
        "address": "1435 Broadway",
        "phone": "(212) 555-0100",
        "hours": "Open · Closes 10 PM",
        "description": "\"Friendly staff, a cozy patio, and the best tacos in town.\"",
        "links": {
          "website": "https://villageplumbing.com/",
          "directions": "https://www.google.com/maps/dir//Village+Plumbing,+Air+%26+Electric",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      }
    ],
    "localResultsMoreLink": "https://www.google.com/search?q=italian+restaurants+in+toronto&udm=1",
    "relatedSearches": [
      {
        "query": "cheap laptop for software development",
        "link": "https://google.com/search?q=best+budget+laptop+for+coding"
      }
    ],
    "ads": [
      {
        "position": 1,
        "blockPosition": "top",
        "type": "RESULT",
        "title": "Coding Monitors on Sale - Buy Today",
        "url": "https://example.com/programming-laptops",
        "page": 1,
        "displayedUrl": "example.com/laptops",
        "domain": "example.com",
        "description": "Order ergonomic coding keyboards with free returns.",
        "category": "Sponsored products",
        "price": {
          "value": 1199,
          "currency": "$",
          "raw": "$1,199"
        },
        "oldPrice": {
          "value": 1299,
          "currency": "$",
          "raw": "$1,299"
        },
        "store": "Apple",
        "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:...",
        "sitelinks": [
          {
            "url": "https://example.com/gaming-laptops",
            "title": "Gaming Laptops",
            "description": "Budget monitors for home offices"
          }
        ]
      }
    ],
    "aioverview": null,
    "shoppingCards": [
      {
        "title": "Brooks Women's Ghost 17",
        "position": 1,
        "productLink": "",
        "promoLabel": "20% OFF",
        "category": "More products",
        "price": {
          "value": 169.99,
          "currency": "$",
          "raw": "$169.99"
        },
        "oldPrice": {
          "value": 199.99,
          "currency": "$",
          "raw": "$199.99"
        },
        "store": "Runner's Depot",
        "rating": 4.5,
        "reviews": "384",
        "thumbnail": "https://example.com/product.jpg"
      }
    ],
    "knowledgeGraph": {
      "title": "Eminem",
      "type": "American rapper",
      "kgmid": "/m/01vs_v8",
      "description": "Robyn Rihanna Fenty, known professionally as Rihanna, is a Barbadian singer, businesswoman, and actress.",
      "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:...",
      "website": "https://www.eminem.com",
      "menu": "https://www.restaurant.com/menu",
      "trailer": "https://www.youtube.com/watch?v=example",
      "source": {
        "name": "Wikipedia",
        "link": "https://en.wikipedia.org/wiki/Eminem",
        "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
      },
      "attributes": [
        {
          "key": "Born",
          "value": "March 3, 1968"
        }
      ],
      "profiles": [
        {
          "name": "Instagram",
          "link": "https://www.instagram.com/eminem/",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      ],
      "peopleAlsoSearchFor": [
        {
          "name": "Jay-Z",
          "link": "https://www.google.com/search?q=Jay-Z",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      ],
      "thingsToKnow": [
        {
          "label": "Albums",
          "subtitle": "Abbey Road, Revolver, Let It Be, ..."
        }
      ],
      "ratings": [
        {
          "platform": "Rotten Tomatoes",
          "rating": "88%",
          "link": "https://www.rottentomatoes.com/m/8_mile",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      ],
      "streamingOptions": [
        {
          "platform": "Netflix",
          "link": "https://www.netflix.com/title/example",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      ],
      "webRatings": [
        {
          "platform": "Google",
          "rating": "4.5",
          "link": "https://www.google.com/maps/place/...",
          "votes": "1,234",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      ],
      "statsCard": {
        "context": "2024-25 regular season",
        "stats": [
          {
            "label": "Points per game",
            "value": "27.1"
          }
        ]
      },
      "socialPosts": [
        {
          "platform": "X",
          "text": "Tour dates announced tonight 🎤",
          "link": "https://x.com/eminem/status/...",
          "date": "2 days ago",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      ],
      "notableAlumni": [
        {
          "name": "Barack Obama",
          "link": "https://www.google.com/search?q=Barack+Obama",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      ],
      "contact": [
        {
          "label": "Order online",
          "url": "https://www.restaurant.com/order",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      ],
      "weather": {
        "temperature": "72°F",
        "condition": "Sunny"
      },
      "rating": {
        "rating": "4.5",
        "count": "2,847"
      },
      "admission": [
        {
          "provider": "Official website",
          "price": "$17",
          "link": "https://www.louvre.fr/en/tickets",
          "badge": "Best price",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      ],
      "artworks": [
        {
          "title": "Mona Lisa",
          "link": "https://www.google.com/search?q=Mona+Lisa",
          "author": "Claude Monet",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      ],
      "has3dModel": true,
      "hotelOptions": [
        {
          "provider": "Booking.com",
          "price": "$189/night",
          "link": "https://www.booking.com/hotel/...",
          "note": "Includes breakfast",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      ],
      "trendingProducts": [
        {
          "title": "Cloudsurfer 7",
          "price": "$120",
          "link": "https://www.nike.com/t/air-max-90",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      ],
      "merchantVideos": [
        {
          "title": "Spring Running Shoe Event",
          "link": "https://www.youtube.com/watch?v=...",
          "platform": "YouTube",
          "duration": "2:34",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      ],
      "listenOn": [
        {
          "platform": "Spotify",
          "link": "https://open.spotify.com/artist/...",
          "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
        }
      ],
      "redirectLink": "https://www.google.com/goto?url=CAESaAHrOzAVev0pi_wnTxm1qpiZTmMyAllabLr1or10ZCfvJKPk"
    },
    "html": [
      "https://files.answerline.dev/html/b83e8dfd-c3a1-4b98-83b9-af91adc21e26/1/page-1.html"
    ],
    "screenshot": [
      "https://files.answerline.dev/html/c45a5081-808d-4ed3-9c86-e4baf16c8ab8/1/3f9a1c2e8b7d4a6f9e0c1b2a3d4e5f60/page-1.png"
    ],
    "recipes": [
      {
        "position": 1,
        "title": "Moist Banana Bread Recipe",
        "link": "https://natashaskitchen.com/banana-bread-recipe-video/",
        "source": "Natasha's Kitchen",
        "ingredients": "Eggs, baking soda, raisins, ripe bananas, all purpose flour",
        "totalTime": "1 hr 10 min",
        "rating": 5,
        "reviews": 7100
      }
    ],
    "videos": [
      {
        "position": 1,
        "url": "https://www.youtube.com/watch?v=example",
        "title": "Top Monitors for Coding 2024",
        "source": "Tech Channel",
        "platform": "YouTube",
        "date": "Oct 18, 2026"
      }
    ],
    "images": [
      {
        "position": 1,
        "title": "Chocolate chip cookies on a cooling rack",
        "link": "https://example.com/cookies",
        "thumbnail": "data:image/jpeg;base64,/9j/4AAQ..."
      }
    ],
    "spelling": {
      "query": "chocolate chip cookie recipe",
      "type": "SHOWING_RESULTS_FOR"
    }
  }
}
```

400:

```json
{
  "success": false,
  "error": "Request validation failed",
  "details": [
    {
      "field": "prompt",
      "message": "Prompt must not be empty"
    }
  ]
}
```

502:

```json
{
  "error": {
    "code": "EXTERNAL_SERVICE_ERROR",
    "message": "External service error: the service failed",
    "details": {
      "service": "CHATGPT"
    },
    "timestamp": "2025-01-15T12:00:00.000Z"
  }
}
```

