Skip to content

Web search (SERP)

The search functions run a query on Exa and return a list that spills down the column. You get 10 free searches in the trial. After that you need a license and an Exa API key from dashboard.exa.ai/api-keys, added via Set API Keys → Insert EXA API Key. Exa includes free monthly credits on new accounts.

Functions

FunctionReturns
=SERP(query, [number_of_result], [category])URLs, one per row
=SERP_DOMAIN(query, [number_of_result], [category])root domains, one per row (example.com, with co.uk-style suffixes handled)
=SERP_TEXT_RESULT(query, [number_of_result], [category])the text of each result page, up to 10,000 characters per cell
=SERP_COMPANY(query, [number_of_result])company website URLs only

Parameters

  • query (required): what to search for. Natural-language queries work well with Exa.
  • number_of_result (optional): how many results. Default 10, maximum 100.
  • category (optional): restrict the search to one kind of page: company, people, news, publication, personal site or financial report. Leave empty for a general web search.

Examples

=SERP("AI note-taking apps", 5)
=SERP("Series A fintech startups in Europe", 20, "company")
=SERP_DOMAIN("open source CRM", 10)
=SERP_TEXT_RESULT("Q3 2026 earnings call transcript " & A2, 3, "financial report")
=SERP("interviews with " & A2, 5, "news")
=SERP_COMPANY("B2B payroll software", 25)

Working with spilled results

Results fill the cells below the formula. If those cells are not empty, Sheets shows a #REF! error until you clear them.

  • First result only: =INDEX(SERP("best CRM", 1), 1)
  • Results in a row instead of a column: =TRANSPOSE(SERP("best CRM", 5))
  • Join into one cell: =TEXTJOIN(", ", TRUE, SERP_DOMAIN("best CRM", 5))
  • Count: =COUNTA(SERP("best CRM", 50))

A search-to-data pipeline

  1. A2: =SERP_COMPANY("climate tech startups", 20) fills A2:A21 .
  2. B2: =SCRAPE_TITLE(A2) and drag down.
  3. C2: =EXTRACT_INFO(SCRAPE(A2), "one-sentence description") and drag down.
  4. D2: =PPLX("Latest funding round of " & B2) and drag down.

=SERP_TEXT_RESULT() is a shortcut when you only need the text of each result and not the URL: it saves the separate scrape step.

Behaviour worth knowing

  • Search results are not cached. Each recalculation of a =SERP() cell is a new Exa request, and during the trial each one counts as a use. Paste as values when the list is final.
  • =SERP_TEXT_RESULT() is the most expensive of the four because it also fetches page text.
  • Unknown categories return an error listing the valid ones.

Errors

Cell showsMeaning
Error: Free trial for EXA used up (10/10) ...Activate your license and add your Exa key.
Error: EXA API key not set ...Add your key via Set API Keys → Insert EXA API Key.
Error: Exa returned HTTP 401 ...The key was rejected. Re-copy it from the Exa dashboard.
Error: Exa returned HTTP 429 ...Rate limit. Wait and try again.
No results found for the query.Exa returned nothing. Loosen the query or remove the category.
No search query provided.The query cell is empty.