# exa_search

tool by [@c0va23](/marketplace/@c0va23/tools)

A tool that fetches api.exa.ai.

- First published 2026-10-27 · release 2 on 2026-10-28
- [Download release 2](/marketplace/listings/01a17d8f-e4d9-7721-a3e1-71fd8053ac40/latest.bylm.json)
- [0 stars](/marketplace/listings/01a17d8f-e4d9-7721-a3e1-71fd8053ac40/stars)
- Needs a key: **EXA** — sent to https://api.exa.ai. Hint: Dashboard › API Keys: create a key at dashboard.exa.ai/api-keys and paste it here. [Get a key](https://dashboard.exa.ai/api-keys)

## What it holds

### What the model is told

**Tool the model sees**: `fetch_url-exa_search`

```text
Search the web with the Exa Search API (POST https://api.exa.ai/search). Returns ranked results with title, URL, published date and query-relevant highlights. Use it to find pages, then pass the best result URLs to the exa_contents tool to read their full text. Highlights alone are only a hint — never answer a question from them alone.
```

### Request

**Method and address**: `POST https://api.exa.ai/search`

**Headers sent**:

- `x-api-key: {secrets.apiKey}`

**Body**: `application/json`

```json
{
  "query": "{query}",
  "type": "auto",
  "numResults": {numResults},
  "contents": {
    "highlights": {
      "maxCharacters": 800
    }
  }
}
```

**Accepted responses**: `application/json`

### Arguments the model passes

| Name | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `query` | string | yes |  | The search query. Write it like a person would type into a search engine. You can include a site: restriction in the query. |
| `numResults` | integer | no | `5` | How many results to return (1-100). 5 is a good default. |

### Responses

**Statuses that are errors**: 400 to 599

**A response filtered to nothing is an error**: no

**What the model reads for an error**: The status line, then the body

**Retries**: A 429 or a 503 is sent again, 3 times at most, waiting 1000 ms first and doubling, 60000 ms at most

**Kept for the app's response details screen**: the first 65536 characters of the body and of each filter's output; the model never reads them

### Filters over the response, in order

#### Step 1

A jq program, giving `text/markdown`

```
def clip: if (length > 600) then .[0:600] + " ..." else . end;
[ .results[] |
    "### " + (.title // "(untitled)")
    + "\nURL: " + (.url // "")
    + (if ((.publishedDate // "") | length) > 0 then "\nPublished: " + .publishedDate else "" end)
    + (if ((.author // "") | length) > 0 then "\nAuthor: " + .author else "" end)
    + "\n\n" + (if ((.highlights // []) | length) > 0 then ([.highlights[] | clip] | join("\n\n")) else "(no highlights returned)" end)
] | if length == 0 then "No results were returned for this query." else join("\n\n---\n\n") end
```

When the program outputs several values, only the first is passed on. A string is passed on without its quotes.

### Keys

**`apiKey`**: **EXA**, an API key

## Downloads

Downloaded 6 times directly. Included in 3 downloads of other listings. 6 downloads in the last 30 days.

## Releases

| Release | Published | Downloads | File |
| --- | --- | --- | --- |
| [2](/marketplace/listings/01a17d8f-e4d9-7721-a3e1-71fd8053ac40/releases/2) | 2026-10-28 | [3](/marketplace/listings/01a17d8f-e4d9-7721-a3e1-71fd8053ac40?release=2) | [download](/marketplace/listings/01a17d8f-e4d9-7721-a3e1-71fd8053ac40/v/2.bylm.json) |
| [1](/marketplace/listings/01a17d8f-e4d9-7721-a3e1-71fd8053ac40/releases/1) | 2026-10-27 | [3](/marketplace/listings/01a17d8f-e4d9-7721-a3e1-71fd8053ac40?release=1) | [download](/marketplace/listings/01a17d8f-e4d9-7721-a3e1-71fd8053ac40/v/1.bylm.json) |

---

[Bring Your LM](/) · [Docs](/docs/features) · [Marketplace](/marketplace)

[Articles](/articles) · [Releases](/releases) · [Bundle Format](/marketplace/bundle-format) · [Marketplace Terms](/terms) · [App Privacy](/privacy) · [Website Privacy](/website-privacy) · [Open Source](/open-source) · [llms.txt](/llms.txt)
