AI and web functions
ai.generate, web.crawl, google.search, perplexity.search, twitter.search, reddit.search, wiki.search, file.extract and http.request — calling a model or the network once per row, from a formula. A paid capability, billed by your own provider.
These are written on a column and run per row like any other function, except each row fires a model call or a network request. They are part of the paid AI plugins capability, and need an API key of your own on top of that. The precise argument list is whatever the in-app function help says; this page gives each one's purpose, a typical shape, and what to watch for.
One call per row: a 5,000-row table is 5,000 calls. Try it on a few dozen rows first — split the table, confirm the prompt and the arguments, then run it across everything. What goes out is that row's content, so keep data that must not leave the machine out of these functions — see privacy.

ai.generate
Hands a prompt plus this row's content to the model and returns text.
ai.generate("Say whether this review is positive or negative. Answer only positive or negative:", AA5)
ai.generate("Normalise this address into country / region / city / street:", AA3)
ai.generate("Pull the product model out of this description; answer none if there isn't one:", AA4)
- Spell out the output format, especially for classification — list every allowed value, and set the result column's field type to Dropdown.
- Results vary with the model; this is not strictly reproducible.
- Which model is used comes from Model in Desktop settings → AI.
web.crawl
Fetches a web page and returns its body text.
web.crawl(AA2) AA2 holds one URL per row
Anti-bot measures, login walls and pages rendered by script may not come back. When a row is empty, open that address in a browser first. The body text is usually piped into an ai.generate to pull fields out of it.
Failures surface as Webpage not found, Access forbidden by server, Unauthorized access by server or Access error from server — which tells you whether it is your URL or their server.
google.search / perplexity.search
Search by keyword and return a summary of the results.
google.search(concat(AA2, " official site"))
perplexity.search(concat(AA2, " company profile founded"))
perplexity.search returns a synthesised answer; google.search returns a summary of the result list. Both depend on the corresponding service being reachable; No results found means exactly that.
twitter.search / reddit.search / wiki.search
Search one particular place: social discussion, community threads, encyclopedia entries.
wiki.search(AA2) one topic name per row
reddit.search(concat(AA2, " review"))
file.extract
Pulls text out of a file in an attachment column (PDF, documents).
file.extract(AA7) AA7 is an attachment column
Then use ai.generate on the extracted text to pull fields: ai.generate("Extract the first party's name from this contract:", AB2). A row whose attachment is missing returns File missing.
http.request
Calls any endpoint and returns the response text; pair it with json.select to pick a field out.
http.request(concat("https://api.example.com/orders/", AA2))
json.select(AB2, "$.data.status")
For endpoints needing auth headers, follow the argument list in the function help; a simple public endpoint just takes the URL. Failures read HTTP request failed. To pull in batches on a schedule rather than row by row, an HTTP data connection is the better tool.
Common problems
- The whole column is empty. No key, an invalid key, no paid licence, or no network. See AI errors.
- Some rows are empty. Those rows had empty input, or the model / site failed on that particular request. Right-click the cell → Refresh Cell(s) to retry one row.
Function not found. The function name is misspelled, or that function is not available in this build.- It is slow. Requests go one row at a time; a few hundred rows taking minutes is normal.
- Cost. Whatever your provider charges. The network functions do not go through the model provider, but the target service may have its own quota.