Skip to main content
Replace another search API with Keenable by changing the request you send and the fields you read. This page maps each provider’s parameters and fields to Keenable’s. Tavily, Exa and Brave parameters checked against each provider’s API reference on 2026-11-09. Keenable requests run against the production API the same day.

What changes for every provider

A parameter Keenable doesn’t list returns 400 with Unknown parameter(s), so remove the other provider’s parameters instead of sending them along. See Search and Fetch for every parameter, and Authentication for keys.

Tavily

Search request

Search response

Extract request and response

Tavily Extract maps to GET /v1/fetch. Fetch takes one URL per request and returns one page object, not a results list.

Before and after

Before, a Tavily search request body, sent with Authorization: Bearer tvly-YOUR_API_KEY:
After, the same search on Keenable, with no key:
The response has query, mode and up to three results. Each result has a title and a url, and usually a snippet, published_at and acquired_at. Keenable returns sources and has no generated answer field. Pass the snippet text to your own model if you need an answer. Tavily’s date filters use the publish date or the last-updated date. Keenable’s published_after and published_before use the publish date only.

Exa

Search request

Search response

Contents request and response

Exa Contents maps to GET /v1/fetch. Fetch takes one URL per request and returns one page object, not a results list.

Before and after

Before, an Exa search request body, sent with x-api-key: <your-api-key>:
After, the same search on Keenable, with no key:
The response has query, mode and up to three results from arxiv.org. Each result has a title and a url, and usually a snippet, published_at and acquired_at. Keenable returns sources and has no synthesized output. Page text comes back in snippet on every search, so you don’t ask for it with a contents object. Field names are snake_case.

Brave Search API

Web search request

Brave web search is a GET with query parameters and an X-Subscription-Token header. Keenable search is a POST with a JSON body.

Web search response

Before and after

Before, a Brave web search for pages from the past week:
After, the same search on Keenable, with no key:
The response has query, mode and up to 10 results. Each result has a title and a url, and usually a snippet, published_at and acquired_at. Results are a flat results array at the top level, not nested under web. Read page text from snippet. Keenable results also have a description field, but it is deprecated and always empty.

Verify the migration

Run one search without a key:
Check three things in the response:
  1. The status is 200.
  2. results has at most two entries, because max_results is an upper bound. Each entry has a title and a url.
  3. Most entries have a snippet. This is the text your code now reads. It is optional in the response, so handle an entry without one.
Then add your key: change the path to /v1/search and send X-API-Key. The response gains a usage object. See API keys.