The official Python SDK for the Scavio Search API. Access real-time data from Google, Amazon, Walmart, YouTube, Reddit, X, TikTok, TikTok Shop, Instagram, and LinkedIn with a single API key. Built for AI agents, LLM applications, and data pipelines.
One API key, ten data sources, structured JSON with knowledge graphs. A powerful alternative to Tavily, SerpAPI, and ScraperAPI for developers who need more than just web search.
| Feature | Scavio | Tavily | SerpAPI | ScraperAPI |
|---|---|---|---|---|
| Google Search | Yes | Yes | Yes | Yes |
| Amazon Products | Yes | No | Yes | No |
| Walmart Products | Yes | No | No | No |
| YouTube Search | Yes | No | Yes | No |
| Reddit Data (12 endpoints) | Yes | No | No | No |
| X Data (11 endpoints) | Yes | No | No | No |
| TikTok Data (11 endpoints) | Yes | No | No | No |
| TikTok Shop Data (8 endpoints) | Yes | No | No | No |
| Instagram Data (12 endpoints) | Yes | No | No | No |
| LinkedIn Data (14 endpoints) | Yes | No | No | No |
| Data Sources | 10 | 1 | 1 per plan | 1 |
| Structured JSON | Yes | Yes | Yes | Raw HTML |
| Knowledge Graphs | Yes | No | Yes | No |
| Async Client | Yes | Yes | No | No |
| Single API Key | Yes | Yes | No | No |
| Rate Limiting Built-in | Yes | No | No | No |
| Automatic Retries + Backoff | Yes | No | No | No |
| Fully Typed Parameters | Yes | No | No | No |
| Type Hints (PEP 561) | Yes | Yes | No | No |
Tavily focuses on AI-optimized web search. SerpAPI offers SERP parsing across search engines with separate plans. ScraperAPI provides raw web scraping with proxy rotation. Scavio combines multi-source structured data in a single search API for AI agents with one SDK and one API key.
pip install scavioGet your free API key at dashboard.scavio.dev.
from scavio import ScavioClient
client = ScavioClient(api_key="sk_...") # or set SCAVIO_API_KEY env var
results = client.search("best noise cancelling headphones 2026")
for r in results["organic_results"]:
print(r["title"], r["link"])Every method returns the raw API response as a plain dict (response shapes are
passed through from the upstream providers and vary by endpoint).
Every endpoint exposes all of its parameters as explicit, documented,
autocomplete-friendly keyword arguments with Literal types for enums. Your
editor shows the full parameter set, allowed enum values, and defaults inline.
# Google web search with the full parameter surface
results = client.google.search(
"electric cars",
gl="us", # country of the search
hl="en", # UI language
location="Austin, Texas, United States",
time_period="last_month",
device="mobile",
)
# YouTube filters. The digit-named API fields (4k, 360, 3d) are exposed as
# valid Python identifiers: four_k, video_360, video_3d.
client.youtube.search("drone footage", four_k=True, hdr=True, duration="long")
# Amazon product lookup: pass the ASIN (sent to the API as `query`).
client.amazon.product("B09XS7JWHH", domain="co.uk", currency="GBP")Any parameter the API adds in the future can be passed via **extra and is sent
verbatim, so you never have to wait for an SDK release:
client.google.search("openai", **{"some_new_param": "value"})The client automatically retries transient failures (HTTP 429 and 5xx, plus
network/timeout errors) with exponential backoff, jitter, and Retry-After
support. Configure or disable it with max_retries.
from scavio import ScavioClient
client = ScavioClient()
results = client.search("latest advances in quantum computing 2026")
context = "\n\n".join(
f"[{r['title']}]({r['link']})\n{r.get('snippet', '')}"
for r in results["organic_results"]
)
prompt = f"Based on these search results, summarize the latest advances:\n\n{context}"
# Pass `prompt` to your LLM of choice (OpenAI, Anthropic, etc.)
print(prompt[:500])from scavio import ScavioClient
client = ScavioClient()
query = "sony wh-1000xm5"
amazon = client.amazon.search(query, domain="com")
walmart = client.walmart.search(query)
print("Amazon:")
for p in amazon["data"]["products"][:3]:
print(f" ${p['price']} - {p['title'][:60]}")
print("\nWalmart:")
for p in walmart["data"]["products"][:3]:
print(f" ${p['price']} - {p['title'][:60]}")from scavio import ScavioClient
client = ScavioClient()
product = client.amazon.product("B0BS1PRC4L")
data = product["data"]
print(f"Brand: {data['brand']}")
print(f"Title: {data['title']}")
print(f"Rating: {data['rating']} ({data['reviews_count']} reviews)")
print(f"Price: ${data['buybox'][0]['price']}")from scavio import ScavioClient
client = ScavioClient()
results = client.search("best project management software", gl="us")
for r in results["organic_results"]:
print(f"{r['position']}. {r['title']}")
print(f" {r['link']}")from scavio import ScavioClient
client = ScavioClient()
news = client.google.news("AI startups")
for article in news["news_results"][:5]:
print(f"[{article['source']}] {article['title']}")
print(f" {article['link']}")
print()from scavio import ScavioClient
client = ScavioClient()
videos = client.youtube.search("python tutorial", sort_by="view_count")
for v in videos["data"]["results"][:5]:
print(f"{v['title']} ({v['view_count']:,} views)")
print(f" {v['url']}")
# Full details for a specific video (metadata() is a deprecated alias of video())
video = client.youtube.video("dQw4w9WgXcQ")
print(f"\n{video['data']['title']}")
print(f" {video['data']['view_count']:,} views")
# Transcript, related videos, comments, channel, and streams
transcript = client.youtube.transcript("dQw4w9WgXcQ", format="text")
related = client.youtube.related("dQw4w9WgXcQ")
comments = client.youtube.comments("dQw4w9WgXcQ")
channel_id = client.youtube.channel_resolve("@mkbhd")["data"]["channel_id"]
channel = client.youtube.channel(channel_id)
streams = client.youtube.streams("dQw4w9WgXcQ")from scavio import ScavioClient
client = ScavioClient()
posts = client.reddit.search("best mechanical keyboard")
for post in posts["data"]["results"]:
print(f"r/{post['subreddit']} - {post['title']}")
print(f" {post['url']}")
print()
# Drill into a subreddit, a post's comments, or a redditor
feed = client.reddit.subreddit_posts("MechanicalKeyboards", sort="TOP")
comments = client.reddit.post_comments("t3_1v6ngaf", sort="TOP")
history = client.reddit.user_posts("spez")
popular = client.reddit.popular()
trending = client.reddit.trending()from scavio import ScavioClient
client = ScavioClient()
hashtag = client.tiktok.hashtag(hashtag_name="python")
info = hashtag["data"]["challengeInfo"]
print(f"#{info['challenge']['title']}")
print(f" Views: {int(info['statsV2']['viewCount']):,}")
print(f" Videos: {int(info['statsV2']['videoCount']):,}")from scavio import ScavioClient
client = ScavioClient()
profile = client.instagram.profile(username="instagram")
user = profile["data"]["user"]
print(f"@{user['username']} - {user['edge_followed_by']['count']:,} followers")
posts = client.instagram.user_posts(username="instagram", count=12)
reels = client.instagram.user_reels(username="instagram")
hashtags = client.instagram.search_hashtags("fashion")from scavio import ScavioClient
client = ScavioClient()
tweets = client.x.search("AI agents", search_type="Latest")
for t in tweets["data"]["timeline"][:5]:
print(f"@{t['screen_name']}: {t['text'][:80]}")
# Profile, a user's tweets, followers, and a single tweet's replies
profile = client.x.user("elonmusk")
timeline = client.x.user_tweets("elonmusk")
followers = client.x.user_followers("elonmusk")
replies = client.x.tweet_comments("1808168603721650364", rank="top")
trending = client.x.trending(country="UnitedStates")from scavio import ScavioClient
client = ScavioClient()
# Member profile (4 credits) and their recent posts
person = client.linkedin.person("williamhgates")
person_posts = client.linkedin.person_posts(username="williamhgates")
# Company profile (1 credit) and hiring signals
company = client.linkedin.company("microsoft")
jobs = client.linkedin.company_jobs(company="microsoft")
# Search people and jobs
people = client.linkedin.search_people(title="data engineer", location="Berlin")
job_results = client.linkedin.search_jobs("software engineer", remote="true")from scavio import ScavioClient
client = ScavioClient()
# Listings carry exact prices
results = client.tiktok_shop.search("phone case")
for p in results["data"]["products"][:5]:
print(p["title"], p["price"]["current"], p["shop"]["shop_name"])
# Detail adds description, variants, stock and shipping -- but NOT a price
# (upstream masks it), and it resolves only about 44% of the ids search returns.
# A 404 there is a normal outcome, not an error: skip the item, do not retry.
from scavio import NotFoundError
product_id = results["data"]["products"][0]["product_id"]
try:
detail = client.tiktok_shop.product(product_id)
print(detail["data"]["title"], len(detail["data"]["variants"]), "variants")
except NotFoundError:
pass # no detail data upstream for this product; skip it, do not retry
reviews = client.tiktok_shop.product_reviews(product_id, page_size=200, sort="relevant")
catalog = client.tiktok_shop.shop_products("7495514739648989419") # exact prices
tree = client.tiktok_shop.categories()
resolved = client.tiktok_shop.resolve("https://vt.tiktok.com/ZT2AHoGsE/")from scavio import ScavioClient
client = ScavioClient()
brand = "scavio"
reddit = client.reddit.search(brand)
tiktok = client.tiktok.search_videos(brand, count=5)
print(f"Reddit mentions ({len(reddit['data']['results'])}):")
for post in reddit["data"]["results"][:3]:
print(f" r/{post['subreddit']}: {post['title']}")
tiktok_videos = tiktok["data"].get("search_item_list", [])
print(f"\nTikTok mentions ({len(tiktok_videos)}):")
for v in tiktok_videos[:3]:
desc = v["aweme_info"].get("desc", "No description")
print(f" {desc[:80]}")from scavio import ScavioClient
client = ScavioClient()
product = client.walmart.product("123456789")
price = product["data"]["price"]
title = product["data"]["title"]
threshold = 50.00
if price and price < threshold:
print(f"PRICE DROP: {title[:60]}")
print(f" Now ${price} (threshold: ${threshold})")
else:
print(f"{title[:60]}: ${price}")import asyncio
from scavio import AsyncScavioClient
async def main():
async with AsyncScavioClient() as client:
google = await client.search("mechanical keyboard")
amazon = await client.amazon.search("mechanical keyboard", domain="com")
print(f"Google: {len(google['organic_results'])} results")
print(f"Amazon: {len(amazon['data']['products'])} products")
for r in google["organic_results"][:3]:
print(f" Web: {r['title'][:60]}")
for p in amazon["data"]["products"][:3]:
print(f" Amazon: ${p['price']} - {p['title'][:50]}")
asyncio.run(main())from scavio import ScavioClient
client = ScavioClient()
usage = client.get_usage()
print(f"Plan: {usage['plan']}")
print(f"Credits remaining: {usage['credit_balance']}")from scavio import (
ScavioClient,
InvalidAPIKeyError,
RateLimitError,
InsufficientCreditsError,
NotFoundError,
BadRequestError,
ScavioConnectionError,
ScavioTimeoutError,
ScavioAPIError,
ScavioError,
)
client = ScavioClient(api_key="sk_...")
try:
results = client.search("query")
except InvalidAPIKeyError:
print("Check your API key")
except RateLimitError:
print("Too many requests - upgrade your plan")
except InsufficientCreditsError:
print("Out of credits - purchase more at dashboard.scavio.dev")
except ScavioAPIError as e:
# Any other non-2xx response; inspect the details:
print(e.status_code, e.response_body)All exceptions inherit from ScavioError. HTTP errors (BadRequestError 400,
InvalidAPIKeyError 401, InsufficientCreditsError 402, NotFoundError 404,
RateLimitError 429, ScavioAPIError for anything else) carry .status_code
and .response_body. Network failures raise ScavioConnectionError /
ScavioTimeoutError after retries are exhausted.
client = ScavioClient(
api_key="sk_...",
base_url="https://api.scavio.dev", # custom base URL
timeout=30.0, # request timeout in seconds
max_requests_per_second=1, # client-side rate limit (1-10)
max_retries=2, # retries on 429/5xx/network (0 disables)
)The async client mirrors the sync one method-for-method. It keeps a single
pooled httpx.AsyncClient alive for its lifetime; close it with
await client.aclose() or use the async context manager.
import asyncio
from scavio import AsyncScavioClient
async def main():
async with AsyncScavioClient(api_key="sk_...") as client:
return await client.google.search("openai", gl="us")
asyncio.run(main())Scavio works with popular AI/LLM frameworks:
- LangChain --
pip install langchain-scavio - MCP Server -- for Claude, Cursor, and other MCP clients
- n8n -- no-code workflow automation
| Service | Endpoints | Credits |
|---|---|---|
search, ai_mode, maps_search, maps_place, maps_reviews, shopping, shopping_product, shopping_stores, flights, hotels, hotels_detail, news, trends, trending |
1 each | |
| Amazon | search, product, options |
1 each (options free) |
| Walmart | search, product |
1 each |
| YouTube | search, shorts, suggestions, video, metadata (deprecated alias of video), comments, comment_replies, transcript, related, channel_search, channel, channel_videos, channel_shorts, channel_community, channel_resolve, streams |
search/shorts 2, transcript 8, streams 3, rest 1 each |
search, search_suggestions, post, post_comments, comment_replies, subreddit, subreddit_posts, user, user_posts, user_comments, popular, trending |
1 each | |
| X | search, tweet, tweet_comments, tweet_retweeters, user, user_tweets, user_replies, user_media, user_followers, user_followings, trending |
1 each |
| TikTok | profile, user_posts, video, video_comments, comment_replies, search_videos, search_users, hashtag, hashtag_videos, user_followers, user_followings |
1 each |
| TikTok Shop | search, search_suggestions, product, product_reviews, categories, category_products, shop_products, resolve |
1 each |
profile, user_posts, user_reels, user_tagged, user_stories, post, post_comments, comment_replies, search_users, search_hashtags, user_followers, user_followings |
8 each (user_posts 2) |
|
person, person_about, person_posts, person_contact, company, company_posts, company_people, company_jobs, search_people, search_jobs, search_posts, job, post, post_comments |
4 each (company/company_posts 1) |
Every method's full parameter list is available inline in your editor (typed keyword arguments with docstrings). See the API docs for field-level details.
MIT
Scavio is a unified search API built for AI agents — one API key, structured JSON, no scraping or proxies. A real-time Tavily alternative and SerpAPI alternative with data from:
- Google Search API — SERP results, news, images, maps, and knowledge graph
- Amazon Product API and Walmart Product API — product search and details
- YouTube API, TikTok API, and Instagram API — video and social media data
- TikTok Shop API — product search, detail, reviews, categories, and shop catalogs
- Reddit API — posts, comments, subreddits, and trending
- X API and LinkedIn API — tweets, profiles, companies, and jobs
For a detailed head-to-head breakdown, see Tavily vs Scavio.
Get a free API key and explore the documentation.