After Nebius acquired Tavily for $275M in February 2026, teams using TavilySearchResults in LangChain face vendor uncertainty. Replacing Tavily with Scavio takes one custom tool class that wraps the Scavio API in LangChain's Tool interface. The swap gives you multi-platform search (Google, Reddit, YouTube, Amazon) instead of Tavily's web-only results, with no acquisition risk.
Prerequisites
- Python 3.10+
- langchain and requests installed
- A Scavio API key from scavio.dev
- An existing LangChain agent using Tavily
Walkthrough
Step 1: Create the Scavio search tool for LangChain
Build a custom LangChain Tool that calls the Scavio API as a drop-in replacement for TavilySearchResults.
import os, requests
from langchain.tools import Tool
API_KEY = os.environ['SCAVIO_API_KEY']
def scavio_search(query: str) -> str:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'country_code': 'us'})
results = resp.json().get('organic_results', [])[:5]
if not results: return 'No results found.'
return '\n\n'.join(f"{r['title']}\n{r.get('snippet', '')}\nURL: {r['link']}" for r in results)
scavio_tool = Tool(name='web_search',
description='Search the web for current information.',
func=scavio_search)Step 2: Add multi-platform search variants
Create Reddit and YouTube tools that Tavily never offered.
def scavio_reddit(query: str) -> str:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'platform': 'reddit', 'country_code': 'us'})
results = resp.json().get('organic_results', [])[:5]
if not results: return 'No Reddit discussions found.'
return '\n\n'.join(f"{r['title']}\n{r.get('snippet', '')}\nURL: {r['link']}" for r in results)
def scavio_youtube(query: str) -> str:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'platform': 'youtube', 'country_code': 'us'})
results = resp.json().get('organic_results', [])[:5]
if not results: return 'No YouTube videos found.'
return '\n\n'.join(f"{r['title']}\n{r.get('snippet', '')}\nURL: {r['link']}" for r in results)
reddit_tool = Tool(name='reddit_search', description='Search Reddit for discussions.', func=scavio_reddit)
youtube_tool = Tool(name='youtube_search', description='Search YouTube for videos.', func=scavio_youtube)Step 3: Swap tools in your existing agent
Replace TavilySearchResults with the Scavio tools.
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate
# BEFORE: tools = [TavilySearchResults(max_results=5)]
# AFTER:
tools = [scavio_tool, reddit_tool, youtube_tool]
llm = ChatOpenAI(model='gpt-4o', temperature=0)
prompt = ChatPromptTemplate.from_messages([
('system', 'Use web_search for general queries, reddit_search for opinions, youtube_search for videos.'),
('human', '{input}'),
('placeholder', '{agent_scratchpad}'),
])
agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = executor.invoke({'input': 'What are developers saying about Tavily alternatives?'})
print(result['output'])Step 4: Test the migration
Run comparison queries to verify result quality.
queries = ['best SERP API 2026', 'TikTok API for brands', 'how to build SEO dashboard']
for q in queries:
print(f'\nQuery: {q}')
g = scavio_search(q)
r = scavio_reddit(q)
print(f' Google: {len(g.split(chr(10)+chr(10)))} results')
print(f' Reddit: {len(r.split(chr(10)+chr(10)))} results')
print(f' Cost: $0.01 (2 credits)')Python Example
import os, requests
from langchain.tools import Tool
API_KEY = os.environ['SCAVIO_API_KEY']
def search(query, platform='google'):
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'platform': platform, 'country_code': 'us'})
results = resp.json().get('organic_results', [])[:5]
return '\n\n'.join(f"{r['title']}\n{r.get('snippet', '')}" for r in results) or 'No results.'
tools = [
Tool(name='web_search', description='Search the web.', func=lambda q: search(q)),
Tool(name='reddit_search', description='Search Reddit.', func=lambda q: search(q, 'reddit')),
]
print(search('tavily alternatives 2026'))JavaScript Example
const API_KEY = process.env.SCAVIO_API_KEY;
const H = { 'x-api-key': API_KEY, 'Content-Type': 'application/json' };
async function search(query, platform = 'google') {
const data = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H,
body: JSON.stringify({ query, platform, country_code: 'us' })
}).then(r => r.json());
return (data.organic_results || []).slice(0, 5)
.map(r => `${r.title}\n${r.snippet || ''}`).join('\n\n') || 'No results.';
}
async function main() {
console.log(await search('tavily alternatives 2026'));
console.log(await search('tavily alternatives', 'reddit'));
}
main().catch(console.error);Expected Output
Query: What are developers saying about Tavily alternatives?
> Calling: reddit_search("Tavily alternatives developer opinions 2026")
Tavily acquired by Nebius - what are you switching to?
Several devs switching to Scavio and Exa...
> Final answer: Developers on Reddit discuss several Tavily alternatives...