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 toGET /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 withAuthorization: Bearer tvly-YOUR_API_KEY:
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 toGET /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 withx-api-key: <your-api-key>:
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 aGET 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: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:- The status is
200. resultshas at most two entries, becausemax_resultsis an upper bound. Each entry has atitleand aurl.- 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.
/v1/search and send X-API-Key. The response gains a usage object. See API keys.