{"openapi":"3.1.0","info":{"title":"Andi AI Search API","version":"1.7.0","description":"Web search and page-fetch API for people and AI agents. `GET`/`POST /api/v1/search` returns structured results with query operators, domain and date filtering, and multiple output formats. `GET /api/v1/fetch` retrieves and extracts a single page. `GET /api/v1/news/:topic` returns a curated, ranked news feed for one of 23 fixed topics — no query required. Search and fetch support `format=context`, which returns markdown suited to language models; the news endpoint returns JSON only. By default (`searchMode=auto`) the API sets the search effort per query — compute, models, and depth — automatically; the fixed modes (`low-cost`, `fast`, `balanced`, `deep`, `exhaustive`) pin an effort level when you want the same behavior on every call. Requests are billed on outcome-based pricing, reported per call in `metrics.cost_dollars`."},"servers":[{"url":"https://api.andiai.com","description":"Production"}],"security":[{"apiKey":[]}],"paths":{"/api/v1/search":{"get":{"operationId":"search","summary":"Search the web","description":"Performs a web search and returns structured results. Search effort is set automatically per query by default (`searchMode=auto`), with fixed modes (low-cost, fast, balanced, deep, exhaustive) available for manual control. Supports domain and date filtering, query operators, and multiple output formats.","parameters":[{"name":"q","in":"query","required":true,"description":"Search query string. Supports query operators when `parseOperators` is enabled. You can also pass a JSON array of up to 5 queries for multi-query searches (e.g., `[\"query one\", \"query two\"]`).","schema":{"type":"string"},"example":"best programming languages"},{"name":"limit","in":"query","description":"Maximum number of results to return.","schema":{"type":"integer","default":10,"minimum":1,"maximum":100}},{"name":"offset","in":"query","description":"Number of results to skip for pagination.","schema":{"type":"integer","default":0,"minimum":0}},{"name":"searchMode","in":"query","description":"Search effort control. `auto` (default) sets the effort per query automatically — simple lookups resolve fast, complex questions get deeper treatment. The fixed modes pin an effort level: `low-cost` caps the work done per request for budget-constrained callers. `fast` returns results in about 1 second. `balanced` is everyday web search with mid-range latency. `deep` searches from multiple angles with spell correction in about 2–3 seconds. `exhaustive` runs multi-round retrieval for the most complete results, up to about 15 seconds. Deeper modes add query expansion, follow-up searches fanned out from initial results, and stronger reranking. Requests are billed on outcome-based pricing (see `metrics.cost_dollars`).","schema":{"type":"string","enum":["auto","low-cost","fast","balanced","deep","exhaustive"],"default":"auto"}},{"name":"effort","in":"query","description":"Thoroughness dial, independent of `searchMode`: `low` favors speed, `medium` is balanced, `high` searches from multiple angles with spell correction, `max` runs multi-round retrieval for the most complete results — the same tiers as pinning `searchMode` to `fast`, `balanced`, `deep`, and `exhaustive` respectively. An explicit `searchMode` always wins over `effort`. With the default `auto` mode, an explicit `effort` pins its equivalent mode. Omit for the adaptive default. Invalid values return a `400` listing the valid tiers.","schema":{"type":"string","enum":["low","medium","high","max"]}},{"name":"reranker","in":"query","description":"Semantic reranker size hint. Larger tiers apply more thorough relevance scoring but need a deeper `searchMode` and may be clamped by the request's time and cost budget (for example, `xl` needs `deep` or `exhaustive`). `auto` (default) selects a tier automatically based on the query and search mode.","schema":{"type":"string","enum":["auto","small","medium","large","xl"],"default":"auto"}},{"name":"intent","in":"query","description":"Force a specific search intent. When not set, the API auto-detects intent from the query. Accepts common aliases like `search`, `news`, `video`, `images`, `weather`, `wiki`, `code`, `recipe`, `place`, `time`, and others. Set `none` to disable intent detection entirely; `auto` is equivalent to omitting the parameter.","schema":{"type":"string"},"examples":{"news":{"value":"news","summary":"Latest news results"},"video":{"value":"video","summary":"Video search results"},"images":{"value":"images","summary":"Image search results"},"weather":{"value":"weather","summary":"Weather data"},"wiki":{"value":"wiki","summary":"Wikipedia/knowledge results"},"code":{"value":"code","summary":"Programming-related results"},"recipe":{"value":"recipe","summary":"Recipe results"},"place":{"value":"place","summary":"Business/place results"},"time":{"value":"time","summary":"Time query results"}}},{"name":"format","in":"query","description":"Response format. `json` returns a JSON object. `context` returns results as markdown text, suitable for passing to language models.","schema":{"type":"string","enum":["json","context"],"default":"json"}},{"name":"metadata","in":"query","description":"Level of metadata to include. `basic` includes standard search metrics. `full` includes extended metadata with content type details and reader data on results.","schema":{"type":"string","enum":["basic","full"],"default":"basic"}},{"name":"extracts","in":"query","description":"Include text extracts from result pages in the response. Defaults to `true` when `format=context`.","schema":{"type":"boolean","default":false}},{"name":"content","in":"query","description":"Fetch and include full page content for results, beyond the standard description and snippet. Increases response time; the time budget scales with `searchMode` (more time is allotted for `deep` and `exhaustive`).","schema":{"type":"boolean","default":false}},{"name":"enrichContent","in":"query","deprecated":true,"description":"Deprecated alias of `content`. Retained for backward compatibility; use `content` instead.","schema":{"type":"boolean","default":false}},{"name":"maxContentLength","in":"query","description":"Maximum number of characters of enriched content to return per result. Only applies when `content` (or its deprecated alias `enrichContent`) is true.","schema":{"type":"integer"}},{"name":"safe","in":"query","description":"Safe search filtering level. `off` disables filtering, `moderate` filters most explicit content, `strict` applies maximum filtering.","schema":{"type":"string","enum":["off","moderate","strict"],"default":"off"}},{"name":"country","in":"query","description":"Two-letter ISO 3166-1 country code to localize results.","schema":{"type":"string","default":"US"},"example":"US"},{"name":"sourceCountry","in":"query","description":"Two-letter ISO 3166-1 country code to restrict results to sources from this country. Unlike `country`, which biases results by locale, `sourceCountry` excludes results from other countries.","schema":{"type":"string"},"example":"GB"},{"name":"language","in":"query","description":"Two-letter ISO 639-1 language code to filter results by language.","schema":{"type":"string","default":"en"},"example":"en"},{"name":"units","in":"query","description":"Unit system for weather and calculation results. Defaults based on the `country` parameter — `imperial` for `US`, `metric` for all other countries.","schema":{"type":"string","enum":["metric","imperial"]}},{"name":"noCache","in":"query","description":"Bypass cached results and fetch fresh data.","schema":{"type":"boolean","default":false}},{"name":"dateRange","in":"query","description":"Relative date range filter for results.","schema":{"type":"string","enum":["day","week","month","year","24h","7d","30d","90d","1y"]}},{"name":"dateFrom","in":"query","description":"Filter results published on or after this date. Format: `YYYY-MM-DD`.","schema":{"type":"string","format":"date"},"example":"2025-01-01"},{"name":"dateTo","in":"query","description":"Filter results published on or before this date. Format: `YYYY-MM-DD`.","schema":{"type":"string","format":"date"},"example":"2025-12-31"},{"name":"includeDomains","in":"query","description":"Comma-separated list of domains to restrict results to. Supports wildcards (`*.example.com`).","schema":{"type":"string"},"example":"github.com,stackoverflow.com"},{"name":"excludeDomains","in":"query","description":"Comma-separated list of domains to exclude from results. Supports wildcards.","schema":{"type":"string"},"example":"pinterest.com,reddit.com"},{"name":"includeTerms","in":"query","description":"Comma-separated terms that must appear in results.","schema":{"type":"string"}},{"name":"excludeTerms","in":"query","description":"Comma-separated terms to exclude from results.","schema":{"type":"string"}},{"name":"parseOperators","in":"query","description":"Parse query operators (like `site:`, `filetype:`, `intitle:`) from the query string. When disabled, the query is treated as literal text.","schema":{"type":"boolean","default":true}},{"name":"linkFormat","in":"query","description":"Field name for result URLs. Use `url` to receive the URL field as `url` instead of the default `link`. Only affects the `/search` endpoint.","schema":{"type":"string","enum":["link","url"],"default":"link"}},{"name":"imageFormat","in":"query","description":"Field naming for image results. `long` (default) uses full field names. `short` uses abbreviated field names.","schema":{"type":"string","enum":["short","long"],"default":"long"}},{"name":"filetype","in":"query","description":"Filter results by file type.","schema":{"type":"string"},"example":"pdf"},{"name":"intitle","in":"query","description":"Filter results to pages with this term in the title.","schema":{"type":"string"}},{"name":"inurl","in":"query","description":"Filter results to pages with this term in the URL.","schema":{"type":"string"}},{"name":"intext","in":"query","description":"Filter results to pages with this term in the body text.","schema":{"type":"string"}}],"responses":{"200":{"description":"Search results. JSON by default; LLM-ready markdown with YAML frontmatter when `format=context`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}},"text/markdown":{"schema":{"type":"string","description":"Markdown results with YAML frontmatter, returned when `format=context`."}}}},"400":{"description":"Bad request — missing or invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"Missing required parameter: q","message":"The q parameter is required"}}}},"401":{"description":"Unauthorized — missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"Unauthorized","message":"Invalid API key"}}}},"402":{"description":"Insufficient credits — account balance depleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"Insufficient Credits","message":"Your account has insufficient credits. Please add credits to continue."}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"Too Many Requests","message":"Rate limit of N requests per second exceeded"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"Internal server error","message":"Unknown error"}}}}}},"post":{"operationId":"searchPost","summary":"Search the web (JSON body)","description":"Same contract as `GET /api/v1/search`, but accepts parameters as a JSON body. Preferred for location-bearing requests because GET-style location encoding is awkward and keeps `latitude`/`longitude` out of HTTP access logs. All GET query parameters are accepted as body fields, plus optional location fields (`latitude`, `longitude`, `accuracy`, `city`, `state`, `countryCode`, `postalCode`, `timezone`, `location`).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["q"],"properties":{"q":{"type":"string","description":"Search query string. Same semantics as the GET `q` parameter."},"limit":{"type":"integer","default":10,"minimum":1,"maximum":100,"description":"Maximum number of results to return."},"offset":{"type":"integer","default":0,"minimum":0,"description":"Number of results to skip for pagination."},"searchMode":{"type":"string","enum":["auto","low-cost","fast","balanced","deep","exhaustive"],"default":"auto","description":"Search effort control. `auto` (default) sets the effort per query automatically — simple lookups resolve fast, complex questions get deeper treatment. The fixed modes pin an effort level: `low-cost` caps the work done per request for budget-constrained callers. `fast` returns results in about 1 second. `balanced` is everyday web search with mid-range latency. `deep` searches from multiple angles with spell correction in about 2–3 seconds. `exhaustive` runs multi-round retrieval for the most complete results, up to about 15 seconds. Deeper modes add query expansion, follow-up searches fanned out from initial results, and stronger reranking. Requests are billed on outcome-based pricing (see `metrics.cost_dollars`)."},"effort":{"type":"string","enum":["low","medium","high","max"],"description":"Thoroughness dial, independent of `searchMode`: `low` favors speed, `medium` is balanced, `high` searches from multiple angles with spell correction, `max` runs multi-round retrieval for the most complete results — the same tiers as pinning `searchMode` to `fast`, `balanced`, `deep`, and `exhaustive` respectively. An explicit `searchMode` always wins over `effort`. With the default `auto` mode, an explicit `effort` pins its equivalent mode. Omit for the adaptive default. Invalid values return a `400` listing the valid tiers."},"reranker":{"type":"string","enum":["auto","small","medium","large","xl"],"default":"auto","description":"Semantic reranker size hint. Larger tiers apply more thorough relevance scoring but need a deeper `searchMode` and may be clamped by the request's time and cost budget (for example, `xl` needs `deep` or `exhaustive`). `auto` (default) selects a tier automatically based on the query and search mode."},"intent":{"type":"string","description":"Force a specific search intent. When not set, the API auto-detects intent from the query. Accepts common aliases like `search`, `news`, `video`, `images`, `weather`, `wiki`, `code`, `recipe`, `place`, `time`, and others."},"format":{"type":"string","enum":["json","context"],"default":"json","description":"Response format. `json` returns a JSON object. `context` returns results as markdown text, suitable for passing to language models."},"metadata":{"type":"string","enum":["basic","full"],"default":"basic","description":"Level of metadata to include. `basic` includes standard search metrics. `full` includes extended metadata with content type details and reader data on results."},"extracts":{"type":"boolean","default":false,"description":"Include text extracts from result pages in the response."},"enrichContent":{"type":"boolean","default":false,"description":"Fetch and include full page content for results, beyond the standard description and snippet. Increases response time; the time budget scales with `searchMode` (more time is allotted for `deep` and `exhaustive`)."},"maxContentLength":{"type":"integer","description":"Maximum number of characters of enriched content to return per result. Only applies when `enrichContent` is true."},"safe":{"type":"string","enum":["off","moderate","strict"],"default":"off","description":"Safe search filtering level. `off` disables filtering, `moderate` filters most explicit content, `strict` applies maximum filtering."},"country":{"type":"string","default":"US","description":"Two-letter ISO 3166-1 country code to localize results."},"sourceCountry":{"type":"string","description":"Two-letter ISO 3166-1 country code to restrict results to sources from this country. Unlike `country`, which biases results by locale, `sourceCountry` excludes results from other countries."},"language":{"type":"string","default":"en","description":"Two-letter ISO 639-1 language code to filter results by language."},"units":{"type":"string","enum":["metric","imperial"],"description":"Unit system for weather and calculation results. Defaults based on the `country` parameter — `imperial` for `US`, `metric` for all other countries."},"noCache":{"type":"boolean","default":false,"description":"Bypass cached results and fetch fresh data."},"dateRange":{"type":"string","enum":["day","week","month","year","24h","7d","30d","90d","1y"],"description":"Relative date range filter for results."},"dateFrom":{"type":"string","format":"date","description":"Filter results published on or after this date. Format: `YYYY-MM-DD`."},"dateTo":{"type":"string","format":"date","description":"Filter results published on or before this date. Format: `YYYY-MM-DD`."},"includeDomains":{"type":"string","description":"Comma-separated list of domains to restrict results to. Supports wildcards (`*.example.com`)."},"excludeDomains":{"type":"string","description":"Comma-separated list of domains to exclude from results. Supports wildcards."},"includeTerms":{"type":"string","description":"Comma-separated terms that must appear in results."},"excludeTerms":{"type":"string","description":"Comma-separated terms to exclude from results."},"parseOperators":{"type":"boolean","default":true,"description":"Parse query operators (like `site:`, `filetype:`, `intitle:`) from the query string. When disabled, the query is treated as literal text."},"linkFormat":{"type":"string","enum":["link","url"],"default":"link","description":"Field name for result URLs. Use `url` to receive the URL field as `url` instead of the default `link`. Only affects the `/search` endpoint."},"imageFormat":{"type":"string","enum":["short","long"],"default":"long","description":"Field naming for image results. `long` (default) uses full field names. `short` uses abbreviated field names."},"filetype":{"type":"string","description":"Filter results by file type."},"intitle":{"type":"string","description":"Filter results to pages with this term in the title."},"inurl":{"type":"string","description":"Filter results to pages with this term in the URL."},"intext":{"type":"string","description":"Filter results to pages with this term in the body text."},"latitude":{"type":"number","description":"Latitude in decimal degrees. Sent in the body to keep coordinates out of HTTP access logs."},"longitude":{"type":"number","description":"Longitude in decimal degrees."},"accuracy":{"type":"number","description":"Location accuracy in meters."},"city":{"type":"string","description":"City name for location-aware queries."},"state":{"type":"string","description":"State or region name."},"countryCode":{"type":"string","description":"Two-letter ISO 3166-1 country code for the caller's location."},"postalCode":{"type":"string","description":"Postal or ZIP code."},"timezone":{"type":"string","description":"IANA timezone, for example America/Los_Angeles."},"location":{"type":"string","description":"Display name for the caller's location, for example \"San Francisco, CA\"."}}},"example":{"q":"best italian restaurants near me","limit":10,"city":"San Francisco","state":"California","countryCode":"US","latitude":37.7794,"longitude":-122.4176}}}},"responses":{"200":{"description":"Search results. JSON by default; LLM-ready markdown with YAML frontmatter when `format=context`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}},"text/markdown":{"schema":{"type":"string","description":"Markdown results with YAML frontmatter, returned when `format=context`."}}}},"400":{"description":"Bad request — missing or invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized — missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Insufficient credits — account balance depleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/fetch":{"get":{"summary":"Fetch a web page","description":"Fetches a single web page and returns clean extracted content (title, article text, metadata) as JSON, or LLM-ready markdown with format=context. The companion to /api/v1/search: search, pick a result, fetch it in full.","operationId":"fetchPage","parameters":[{"name":"url","in":"query","required":true,"description":"Full http(s) URL of the page to fetch.","schema":{"type":"string","format":"uri"}},{"name":"format","in":"query","required":false,"description":"Response format: json (structured, default) or context (LLM-ready markdown).","schema":{"type":"string","enum":["json","context"],"default":"json"}},{"name":"effort","in":"query","required":false,"description":"How thoroughly to retrieve the page: `low` favors speed, `max` spends the most time extracting content — useful for pages that are slow to load or render content client-side. Omit for the server's adaptive default. Invalid values return a `400` listing the valid tiers. Fetch failures (`422`, `503`) are never billed, regardless of `effort`.","schema":{"type":"string","enum":["low","medium","high","max"]}},{"name":"maxContentLength","in":"query","required":false,"description":"Maximum content characters to return (default 200000).","schema":{"type":"integer","minimum":1}},{"name":"query","in":"query","required":false,"description":"Optional query string to scope extraction to. When set, the response includes `query_extracts`, `query_snippet`, and `query_hash` fields scoped to this query.","schema":{"type":"string"}}],"responses":{"200":{"description":"Extracted page content","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"content":{"type":"string","description":"Clean extracted text content"},"markdown":{"type":"string","description":"Clean extracted content as markdown, when available."},"extracts":{"type":"array","items":{"type":"string"},"description":"Key passage extracts from the page, when available."},"snippet":{"type":"string","description":"Short excerpt from the page."},"author":{"type":"string"},"date":{"type":"string"},"site_name":{"type":"string"},"image":{"type":"string"},"lang":{"type":"string"},"word_count":{"type":"integer"},"truncated":{"type":"boolean"},"query_extracts":{"type":"array","items":{"type":"string"},"description":"Text extracts from the page most relevant to `query`. Only present when `query` is set."},"query_snippet":{"type":"string","description":"Short excerpt from the page most relevant to `query`. Only present when `query` is set."},"query_hash":{"type":"string","description":"Hash identifying the `query` used to scope this response. Only present when `query` is set."},"partial":{"type":"boolean","description":"Whether this is a partial response returned before the page finished retrieving. Only present when true."},"retry_after_seconds":{"type":"integer","description":"Seconds to wait before retrying for the full content. Only present on partial responses."},"metrics":{"type":"object","properties":{"duration_ms":{"type":"integer"},"cost_dollars":{"type":"number","description":"Actual cost of this fetch in USD (post-discount). Failed fetches are not billed."}}}}}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"Missing or invalid url parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Credit balance exhausted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The page was reached but its content could not be extracted. Not retriable. Not billed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The page is still being retrieved, or a transient failure occurred. Retriable — retry after the number of seconds in the `Retry-After` header. Not billed.","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"Content warming","message":"The page is still being retrieved. Retry in 5s for the full content.","retry_after_seconds":5,"url":"https://example.com/article"}}}}}}},"/api/v1/news/{topic}":{"get":{"operationId":"getNewsFeed","summary":"Get a curated news feed","description":"Returns a curated, ranked news feed for a fixed topic — there is no query parameter, the topic path segment selects the feed. `results` are ordered by relevance (a semantic pass tuned to the topic, weighted toward fresher articles); `news` holds the same articles in strict reverse-chronological order. `images` includes article images when available.","parameters":[{"name":"topic","in":"path","required":true,"description":"Topic slug selecting the feed.","schema":{"type":"string","enum":["technology","business","finance","politics","sports","health","science","world","entertainment","us","europe","uk","asia","middle-east","africa","latin-america","australia","programming","startups","top","hn-frontpage","ai-news","tech-news"]}},{"name":"limit","in":"query","required":false,"description":"Number of results to return.","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"noCache","in":"query","required":false,"description":"Bypass the cache and fetch a fresh feed.","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Curated news feed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"401":{"description":"Unauthorized — missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"Unauthorized","message":"Invalid API key"}}}},"402":{"description":"Insufficient credits — account balance depleted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"Insufficient Credits","message":"Your account has insufficient credits. Please add credits to continue."}}}},"404":{"description":"Unknown topic. The response includes the full list of valid topic slugs.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"type":"object","properties":{"valid_topics":{"type":"array","description":"Every valid topic slug.","items":{"type":"string"}}},"required":["valid_topics"]}]},"example":{"error":"Unknown topic","message":"No curated news feed exists for topic 'crypto'.","valid_topics":["technology","business","finance","politics","sports","health","science","world","entertainment","us","europe","uk","asia","middle-east","africa","latin-america","australia","programming","startups","top","hn-frontpage","ai-news","tech-news"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"Too Many Requests","message":"Rate limit of N requests per second exceeded"}}}},"503":{"description":"The feed is temporarily unavailable. Retriable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":"Service unavailable","message":"The 'world' news feed is temporarily unavailable. Retry shortly."}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key from the [API Console](https://console.andiai.com)."}},"schemas":{"SearchResponse":{"type":"object","properties":{"results_type":{"type":"string","description":"The type of results returned (e.g., `Search`, `News`, `Weather`, `Calculator`). Determines which optional response sections are present."},"answer":{"type":"string","description":"A generated answer for the query. May be an empty string when no direct answer is available."},"type":{"type":"string","description":"Same as `results_type`. Indicates the category of results."},"title":{"type":"string","description":"A title summarizing the search results."},"results":{"type":"array","description":"Array of search results.","items":{"$ref":"#/components/schemas/SearchResult"}},"metrics":{"$ref":"#/components/schemas/Metrics","description":"Search performance metrics. Always included in the response."},"correctedQuery":{"type":"string","description":"Spell-corrected query. Present when a misspelling in the original query is detected and corrected — any mode can return it; deep and exhaustive modes run the strongest spell correction."},"related_searches":{"type":"array","description":"Related search suggestions. Present on some queries.","items":{"type":"string"}},"topics":{"type":"array","description":"Related topics. Present on some queries.","items":{"type":"string"}},"videos":{"type":"array","description":"Video results. Present when the query triggers a video intent.","items":{"$ref":"#/components/schemas/SearchResult"}},"images":{"type":"array","description":"Image results. Present when the query triggers an image intent.","items":{"$ref":"#/components/schemas/ImageResult"}},"news":{"type":"array","description":"News results. Present when the query triggers a news intent.","items":{"$ref":"#/components/schemas/SearchResult"}},"places":{"type":"array","description":"Place/business results. Present for location-related queries.","items":{"$ref":"#/components/schemas/SearchResult"}},"profiles":{"type":"array","description":"Profile results. Present for people-related queries.","items":{"$ref":"#/components/schemas/SearchResult"}},"social":{"type":"array","description":"Social media results. Present for social-related queries.","items":{"$ref":"#/components/schemas/SearchResult"}},"academic":{"type":"array","description":"Academic results. Present for scholarly queries.","items":{"$ref":"#/components/schemas/SearchResult"}},"weather":{"$ref":"#/components/schemas/WeatherResult","description":"Weather data. Present when the query triggers a weather intent."},"calculation":{"$ref":"#/components/schemas/CalculationResult","description":"Calculation result. Present when the query triggers a calculation intent."}},"required":["results_type","answer","type","title","results","metrics"]},"SearchResult":{"type":"object","properties":{"title":{"type":"string","description":"Page title."},"link":{"type":"string","format":"uri","description":"Page URL."},"desc":{"type":"string","description":"Page description or summary."},"source":{"type":"string","description":"Domain name of the result."},"type":{"type":"string","description":"Result type. Only included when `metadata=full`.","enum":["website","blog","news","video","image","place","profile","social","academic","calculation","weather","computation","instant answer"]},"date":{"type":"string","description":"Publication date of the content, when available."},"image":{"type":"string","format":"uri","description":"Preview image URL, when available. Only included when `metadata=full`."},"snippet":{"type":"string","description":"Query-relevant text excerpt from the page. Distinct from `desc`, which is the general page description."},"answer":{"type":"string","description":"Inline answer for instant answer results."},"extracts":{"type":"array","items":{"type":"string"},"description":"Text extracts from the page, when available. Only included when `extracts=true`."},"contentType":{"type":"string","description":"Content type of the page. Only included when `metadata=full`."},"reader":{"type":"object","description":"Reader data with extracted page content. Only included when `metadata=full`."},"contentSafety":{"type":"object","description":"Safety classification. Only included when `metadata=full`.","properties":{"rating":{"type":"string","enum":["safe","unsafe","unknown"],"description":"Content safety rating."},"safeSearchApplied":{"type":"boolean","description":"Whether safe-search filtering was applied to this result."}}},"bang":{"type":"string","description":"Bang shortcut for the result domain. Only included when `metadata=full`."}},"required":["title","link","desc","source"]},"ImageResult":{"type":"object","properties":{"title":{"type":"string","description":"Image title or alt text."},"link":{"type":"string","format":"uri","description":"URL of the page containing the image."},"image":{"type":"string","format":"uri","description":"Direct URL of the full-size image."},"source":{"type":"string","description":"Domain name of the image source."},"type":{"type":"string","description":"Always `image`.","enum":["image"]},"thumbnail":{"type":"string","format":"uri","description":"Thumbnail URL."},"width":{"type":"string","description":"Image width in pixels (as a string)."},"height":{"type":"string","description":"Image height in pixels (as a string)."}},"required":["title","link","image","source","type"]},"WeatherResult":{"type":"object","properties":{"location":{"type":"object","description":"Location details.","properties":{"name":{"type":"string","description":"Location name."},"country":{"type":"string","description":"Country name or code."},"coordinates":{"type":"object","properties":{"latitude":{"type":"number"},"longitude":{"type":"number"}}}}},"temperature":{"type":"number","description":"Current temperature."},"feelsLike":{"type":"number","description":"Feels-like temperature."},"units":{"type":"string","description":"Unit system: `metric` or `imperial`.","enum":["metric","imperial"]},"description":{"type":"string","description":"Weather condition description."},"humidity":{"type":"number","description":"Humidity percentage."},"windSpeed":{"type":"number","description":"Wind speed."},"windDirection":{"type":"number","description":"Wind direction in degrees."},"pressure":{"type":"number","description":"Atmospheric pressure."},"icon":{"type":"string","description":"Weather icon identifier."},"cloudiness":{"type":"number","description":"Cloud cover percentage."},"visibility":{"type":"number","description":"Visibility distance."},"timestamp":{"type":"string","description":"Timestamp of the weather data."}},"required":["location","temperature","units","description"]},"CalculationResult":{"type":"object","properties":{"expression":{"type":"string","description":"The mathematical expression."},"result":{"type":"string","description":"The calculated result."}},"required":["expression","result"]},"Metrics":{"type":"object","description":"Search performance metrics. Always included in the response.","properties":{"query":{"type":"string","description":"The query as processed."},"intent":{"type":"string","description":"The detected or forced search intent."},"timestamp":{"type":"string","description":"Timestamp of the search request."},"duration":{"type":"number","description":"Total request duration in milliseconds."},"queries_executed":{"type":"integer","description":"Number of search queries executed."},"api_requests_count":{"type":"integer","description":"Number of API requests made during the search."},"results_returned":{"type":"integer","description":"Number of results returned in this response."},"total_results_found":{"type":"integer","description":"Total number of results found across all sources."},"cached":{"type":"boolean","description":"Whether the response was served from cache. Only present on cache hits."},"cache_age_seconds":{"type":"integer","description":"Age of the cached response in seconds. Only present on cache hits."},"cost_dollars":{"type":"number","description":"Amount charged to your account for this request in USD, after any discounts. Pricing is outcome-based — each request is charged for the work performed and the content delivered, whether the effort was set automatically (`auto`) or pinned with a fixed mode."},"effort":{"type":"string","enum":["low","medium","high","max"],"description":"Resolved effort tier for this request — the tier `auto` mode selected, or the one pinned via `searchMode`/`effort`."},"response_time_ms":{"type":"integer","description":"Total server response time in milliseconds."}}},"Error":{"type":"object","properties":{"error":{"type":"string","description":"Error type or message."},"message":{"type":"string","description":"Detailed error description."}},"required":["error","message"]}}}}