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
| Function | Returns |
|---|---|
=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 siteorfinancial 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
A2: =SERP_COMPANY("climate tech startups", 20)fills A2:A21 .B2: =SCRAPE_TITLE(A2)and drag down.C2: =EXTRACT_INFO(SCRAPE(A2), "one-sentence description")and drag down.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 shows | Meaning |
|---|---|
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. |