langchain-scavio

32 LangChain tools for real-time search across Google, Amazon, Walmart, YouTube, Reddit, TikTok, and Instagram -- structured data with knowledge graphs, all through a single package.
pip install langchain-scavio
Get your free API key at dashboard.scavio.dev.
Why Scavio over Tavily?
|
Scavio |
Tavily |
SerpAPI |
| Platforms |
Google, Amazon, Walmart, YouTube, Reddit, TikTok, Instagram |
Google only |
Google + others |
| Tools |
32 |
1 |
1 per wrapper |
| Knowledge graphs |
Yes |
No |
Partial |
| Product data (price, rating, reviews) |
Yes |
No |
No |
| Pricing |
$0.005/credit |
$0.01/search |
$0.05/search |
| Amazon marketplace coverage |
23 countries |
-- |
-- |
| LangChain async |
Yes |
Yes |
Yes |
What Can You Build?
- Shopping agents -- search Amazon and Walmart, compare prices, find deals across 23 marketplaces
- Product research agents -- Google reviews + Amazon listings + YouTube reviews + Reddit opinions in one query
- Content research agents -- YouTube trends + Reddit sentiment + Google news in a single workflow
- Brand monitoring -- track what Reddit and Google say about any topic in real time
- Social media agents -- TikTok and Instagram profile analytics, hashtag tracking, post/video comments, and trend discovery
Quick Start
import os
from langchain_scavio import ScavioSearch
os.environ["SCAVIO_API_KEY"] = "sk_live_..."
tool = ScavioSearch()
result = tool.invoke({"query": "best python web frameworks 2026"})
All 32 Tools
| Tool |
Description |
ScavioSearch |
Google web search with knowledge graphs, PAA questions, news |
ScavioAmazonSearch |
Search Amazon product listings across 23 marketplaces |
ScavioAmazonProduct |
Fetch full details for an Amazon product by ASIN |
ScavioWalmartSearch |
Search Walmart product listings with price/fulfillment filters |
ScavioWalmartProduct |
Fetch full details for a Walmart product by ID |
ScavioYouTubeSearch |
Search YouTube videos with duration/date/type filters |
ScavioYouTubeMetadata |
Fetch metadata for a YouTube video by video ID |
ScavioRedditSearch |
Search Reddit posts or comments with sort/pagination |
ScavioRedditPost |
Fetch a Reddit post's metadata and comment thread by URL |
ScavioTikTokProfile |
Look up a TikTok user profile by username or sec_user_id |
ScavioTikTokUserPosts |
Fetch a TikTok user's posted videos with statistics |
ScavioTikTokVideo |
Fetch details for a single TikTok video |
ScavioTikTokVideoComments |
Fetch comments on a TikTok video |
ScavioTikTokCommentReplies |
Fetch replies to a specific comment on a TikTok video |
ScavioTikTokSearchVideos |
Search TikTok videos by keyword with sort/time filters |
ScavioTikTokSearchUsers |
Search TikTok users by keyword |
ScavioTikTokHashtag |
Look up TikTok hashtag info (video count, views) |
ScavioTikTokHashtagVideos |
Fetch TikTok videos for a specific hashtag |
ScavioTikTokUserFollowers |
Fetch a TikTok user's followers |
ScavioTikTokUserFollowings |
Fetch accounts a TikTok user is following |
ScavioInstagramProfile |
Look up an Instagram user profile by username or user_id |
ScavioInstagramUserPosts |
Fetch an Instagram user's posts with statistics |
ScavioInstagramUserReels |
Fetch an Instagram user's reels with statistics |
ScavioInstagramTaggedPosts |
Fetch posts an Instagram user is tagged in |
ScavioInstagramStories |
Fetch an Instagram user's active stories |
ScavioInstagramPost |
Fetch details for a single Instagram post or reel |
ScavioInstagramPostComments |
Fetch comments on an Instagram post |
ScavioInstagramCommentReplies |
Fetch replies to a specific comment on an Instagram post |
ScavioInstagramSearchUsers |
Search Instagram users by keyword |
ScavioInstagramSearchHashtags |
Search Instagram hashtags by keyword |
ScavioInstagramUserFollowers |
Fetch an Instagram user's followers |
ScavioInstagramUserFollowings |
Fetch accounts an Instagram user is following |
Use with a LangChain Agent
Scavio tools plug into the current create_agent API from langchain.agents:
from langchain.agents import create_agent
from langchain_scavio import (
ScavioSearch,
ScavioAmazonSearch, ScavioAmazonProduct,
ScavioWalmartSearch,
ScavioYouTubeSearch, ScavioYouTubeMetadata,
ScavioRedditSearch, ScavioRedditPost,
ScavioTikTokSearchVideos, ScavioTikTokProfile, ScavioTikTokVideo,
)
agent = create_agent(
"openai:gpt-4o",
tools=[
ScavioSearch(max_results=5),
ScavioAmazonSearch(max_results=5),
ScavioAmazonProduct(),
ScavioWalmartSearch(max_results=5),
ScavioYouTubeSearch(max_results=5),
ScavioYouTubeMetadata(),
ScavioRedditSearch(max_results=5),
ScavioRedditPost(),
ScavioTikTokSearchVideos(max_results=5),
ScavioTikTokProfile(),
ScavioTikTokVideo(),
],
)
response = agent.invoke({
"messages": [{"role": "user", "content": "Find me a Python book on Amazon under $30"}]
})
Async Support
All tools support async invocation:
result = await tool.ainvoke({"query": "async python frameworks"})
Configuration
Google Search
from langchain_scavio import ScavioSearch
tool = ScavioSearch(
scavio_api_key="sk_live_...", # or SCAVIO_API_KEY env var
max_results=5,
light_request=None, # None=light/1 credit, False=full/2 credits
include_knowledge_graph=True,
include_questions=True,
include_related=False,
country_code="us",
language="en",
search_type="classic", # classic|news|maps|images|lens
device="desktop",
)
Amazon
from langchain_scavio import ScavioAmazonSearch, ScavioAmazonProduct
search = ScavioAmazonSearch(
max_results=5,
pages=1, # number of result pages to fetch
domain="com", # see supported marketplaces below
)
product = ScavioAmazonProduct()
result = product.invoke({"query": "B08N5WRWNW"}) # query = ASIN
Targeting a marketplace: use domain to pick which Amazon store to search -- do not use a country code. Supported domains: com (US), co.uk (UK), ca, de, fr, es, it, co.jp, in, com.au, com.br, com.mx, nl, pl, se, sg, ae, sa, eg, cn, com.be, com.tr.
Walmart
from langchain_scavio import ScavioWalmartSearch, ScavioWalmartProduct
search = ScavioWalmartSearch(max_results=5)
result = search.invoke({
"query": "air fryer",
"sort_by": "price_low", # best_match|price_low|price_high|best_seller
"max_price": 5000, # in cents
"fulfillment_speed": "2_days", # today|tomorrow|2_days|anytime
})
product = ScavioWalmartProduct()
result = product.invoke({"product_id": "123456789"})
YouTube
from langchain_scavio import ScavioYouTubeSearch, ScavioYouTubeMetadata
search = ScavioYouTubeSearch(max_results=5)
result = search.invoke({
"query": "python tutorial",
"duration": "medium", # short|medium|long
"upload_date": "this_month", # last_hour|today|this_week|this_month|this_year
"sort_by": "view_count", # relevance|date|view_count|rating
"video_type": "video", # video|channel|playlist
})
metadata = ScavioYouTubeMetadata()
result = metadata.invoke({"video_id": "dQw4w9WgXcQ"})
Reddit
Reddit endpoints cost 2 credits each and typically take 5-15 seconds (JS rendering required).
from langchain_scavio import ScavioRedditSearch, ScavioRedditPost
search = ScavioRedditSearch(max_results=5)
result = search.invoke({
"query": "langchain",
"sort": "top", # new|relevance|hot|top|comments
"type": "posts", # posts|comments
})
# Paginate by passing back the previous response's nextCursor
next_page = search.invoke({
"query": "langchain",
"sort": "top",
"cursor": result["data"]["nextCursor"],
})
post = ScavioRedditPost()
result = post.invoke({
"url": "https://www.reddit.com/r/programming/comments/abc123/example_post/"
})
# result["data"]["post"] + result["data"]["comments"] (flat list with `depth`)
TikTok
from langchain_scavio import (
ScavioTikTokProfile, ScavioTikTokUserPosts, ScavioTikTokVideo,
ScavioTikTokVideoComments, ScavioTikTokCommentReplies,
ScavioTikTokSearchVideos, ScavioTikTokSearchUsers,
ScavioTikTokHashtag, ScavioTikTokHashtagVideos,
ScavioTikTokUserFollowers, ScavioTikTokUserFollowings,
)
# Look up a user profile (returns sec_uid needed by other tools)
profile = ScavioTikTokProfile()
result = profile.invoke({"username": "tiktok"})
sec_uid = result["data"]["user"]["sec_uid"]
# Fetch their recent posts
posts = ScavioTikTokUserPosts(max_results=5)
result = posts.invoke({"sec_user_id": sec_uid, "sort_type": "1"}) # popular
# Search videos by keyword
search = ScavioTikTokSearchVideos(max_results=5)
result = search.invoke({
"keyword": "python tutorial",
"sort_type": "1", # 0=relevance, 1=most likes
"publish_time": "30", # 0=all, 1=day, 7=week, 30=month
})
# Get video details and comments
video = ScavioTikTokVideo()
result = video.invoke({"video_id": "7123456789012345678"})
comments = ScavioTikTokVideoComments(max_results=10)
result = comments.invoke({"video_id": "7123456789012345678"})
# Hashtag research
hashtag = ScavioTikTokHashtag()
result = hashtag.invoke({"hashtag_name": "python"})
hashtag_id = result["data"]["challengeInfo"]["challenge"]["id"]
hashtag_videos = ScavioTikTokHashtagVideos(max_results=5)
result = hashtag_videos.invoke({"hashtag_id": hashtag_id})
Instagram
from langchain_scavio import (
ScavioInstagramProfile, ScavioInstagramUserPosts, ScavioInstagramUserReels,
ScavioInstagramTaggedPosts, ScavioInstagramStories,
ScavioInstagramPost, ScavioInstagramPostComments,
ScavioInstagramCommentReplies, ScavioInstagramSearchUsers,
ScavioInstagramSearchHashtags,
ScavioInstagramUserFollowers, ScavioInstagramUserFollowings,
)
# Look up a user profile (returns user_id usable by other tools)
profile = ScavioInstagramProfile()
result = profile.invoke({"username": "instagram"})
user_id = result["data"]["user"]["id"]
# Fetch their recent posts and reels
posts = ScavioInstagramUserPosts(max_results=5)
result = posts.invoke({"username": "instagram"})
reels = ScavioInstagramUserReels(max_results=5)
result = reels.invoke({"username": "instagram"})
# Get a single post's details and comments
post = ScavioInstagramPost()
result = post.invoke({"shortcode": "C1a2b3c4d5e"})
comments = ScavioInstagramPostComments(max_results=10)
result = comments.invoke({
"shortcode": "C1a2b3c4d5e",
"sort_order": "newest", # popular (default) or newest
})
# Search users and hashtags
search_users = ScavioInstagramSearchUsers(max_results=5)
result = search_users.invoke({"keyword": "cooking"})
search_hashtags = ScavioInstagramSearchHashtags(max_results=5)
result = search_hashtags.invoke({"keyword": "travel"})
Agent-Controllable Parameters
ScavioSearch
| Parameter |
Type |
Description |
query |
str |
Search query |
search_type |
classic|news|maps|images|lens |
Type of search |
country_code |
str |
ISO 3166-1 alpha-2 |
language |
str |
ISO 639-1 |
device |
desktop|mobile |
Device type |
page |
int |
Result page number |
ScavioAmazonSearch
| Parameter |
Type |
Description |
query |
str |
Product search query |
domain |
str |
Amazon marketplace -- the only way to select a store (com, co.uk, de, co.jp, ...) |
sort_by |
str |
featured|most_recent|price_low_to_high|price_high_to_low|average_review|bestsellers |
start_page |
int |
Page number |
category_id |
str |
Category filter |
merchant_id |
str |
Seller filter |
language / currency |
str |
Localization |
zip_code |
str |
Local pricing |
ScavioWalmartSearch
| Parameter |
Type |
Description |
query |
str |
Product search query |
sort_by |
str |
best_match|price_low|price_high|best_seller |
min_price / max_price |
int |
Price range in cents |
fulfillment_speed |
str |
today|tomorrow|2_days|anytime |
delivery_zip |
str |
Delivery ZIP code |
ScavioYouTubeSearch
| Parameter |
Type |
Description |
query |
str |
Search query |
upload_date |
str |
last_hour|today|this_week|this_month|this_year |
video_type |
str |
video|channel|playlist |
duration |
str |
short|medium|long |
sort_by |
str |
relevance|date|view_count|rating |
hd / subtitles / live |
bool |
Content filters |
ScavioRedditSearch
| Parameter |
Type |
Description |
query |
str |
Reddit search query (1-500 chars) |
type |
str |
posts|comments |
sort |
str |
new|relevance|hot|top|comments |
cursor |
str |
Opaque pagination cursor from prior response's nextCursor |
ScavioRedditPost
| Parameter |
Type |
Description |
url |
str |
Full Reddit post URL (www., old., or new. subdomains accepted) |
ScavioTikTokProfile
| Parameter |
Type |
Description |
username |
str |
TikTok handle without @ (provide this or sec_user_id) |
sec_user_id |
str |
Secure user ID from a previous lookup |
ScavioTikTokUserPosts
| Parameter |
Type |
Description |
sec_user_id |
str |
Secure user ID from a profile lookup |
cursor |
str |
Pagination cursor (from data.max_cursor) |
count |
int |
Results per page (1-30, default 20) |
sort_type |
str |
0=latest (default), 1=popular |
ScavioTikTokVideo
| Parameter |
Type |
Description |
video_id |
str |
TikTok video identifier |
ScavioTikTokVideoComments
| Parameter |
Type |
Description |
video_id |
str |
TikTok video identifier |
cursor |
str |
Pagination cursor |
count |
int |
Results per page (1-50, default 20) |
ScavioTikTokCommentReplies
| Parameter |
Type |
Description |
video_id |
str |
TikTok video identifier |
comment_id |
str |
Comment ID from the comments endpoint |
cursor |
str |
Pagination cursor |
count |
int |
Results per page (1-50, default 20) |
ScavioTikTokSearchVideos
| Parameter |
Type |
Description |
keyword |
str |
Search query (1-500 chars) |
cursor |
str |
Pagination offset |
count |
int |
Results per page (1-30, default 20) |
sort_type |
str |
0=relevance (default), 1=most likes |
publish_time |
str |
0=all, 1=day, 7=week, 30=month, 90=3mo, 180=6mo |
ScavioTikTokSearchUsers
| Parameter |
Type |
Description |
keyword |
str |
Search query (1-500 chars) |
cursor |
str |
Pagination offset |
count |
int |
Results per page (1-30, default 20) |
ScavioTikTokHashtag
| Parameter |
Type |
Description |
hashtag_name |
str |
Hashtag text without # (provide this or hashtag_id) |
hashtag_id |
str |
Numeric hashtag identifier |
ScavioTikTokHashtagVideos
| Parameter |
Type |
Description |
hashtag_id |
str |
Hashtag ID from the hashtag info endpoint |
cursor |
str |
Pagination cursor |
count |
int |
Results per page (1-30, default 20) |
ScavioTikTokUserFollowers / ScavioTikTokUserFollowings
| Parameter |
Type |
Description |
sec_user_id |
str |
Secure user ID from a profile lookup |
count |
int |
Results per page (1-20, default 20) |
page_token |
str |
Pagination token from data.next_page_token |
min_time |
int |
Pagination field from data.min_time |
ScavioInstagramProfile / ScavioInstagramStories
| Parameter |
Type |
Description |
username |
str |
Instagram handle without @ (provide this or user_id) |
user_id |
str |
Numeric user ID from a previous lookup |
ScavioInstagramUserPosts / ScavioInstagramUserReels / ScavioInstagramTaggedPosts / ScavioInstagramUserFollowers / ScavioInstagramUserFollowings
| Parameter |
Type |
Description |
username |
str |
Instagram handle without @ (provide this or user_id) |
user_id |
str |
Numeric user ID from a profile lookup |
count |
int |
Results per page (1-50, default 12) |
cursor |
str |
Pagination cursor from a prior response |
ScavioInstagramPost
| Parameter |
Type |
Description |
url |
str |
Full Instagram post or reel URL |
media_id |
str |
Numeric media identifier (provide one of url, media_id, shortcode) |
shortcode |
str |
Shortcode from the post URL (after /p/ or /reel/) |
ScavioInstagramPostComments
| Parameter |
Type |
Description |
shortcode |
str |
Post shortcode (provide this or url) |
url |
str |
Full Instagram post or reel URL |
cursor |
str |
Pagination cursor |
sort_order |
str |
popular (default) or newest |
ScavioInstagramCommentReplies
| Parameter |
Type |
Description |
media_id |
str |
Numeric media ID of the post |
comment_id |
str |
Comment ID from the post comments endpoint |
cursor |
str |
Pagination cursor |
ScavioInstagramSearchUsers / ScavioInstagramSearchHashtags
| Parameter |
Type |
Description |
keyword |
str |
Search query (1-500 chars) |
cursor |
str |
Pagination cursor |
Error Handling
- Empty results raise
ToolException with actionable suggestions for the LLM
- API errors return
{"error": "message"} without crashing the agent
handle_tool_error=True ensures LangChain passes errors to the LLM as context
Architecture
ScavioBaseAPIWrapper # Auth, headers, sync/async HTTP POST
+-- ScavioSearchAPIWrapper # -> /api/v1/google
+-- ScavioAmazonSearchAPIWrapper # -> /api/v1/amazon/search
+-- ScavioAmazonProductAPIWrapper # -> /api/v1/amazon/product
+-- ScavioWalmartSearchAPIWrapper # -> /api/v1/walmart/search
+-- ScavioWalmartProductAPIWrapper # -> /api/v1/walmart/product
+-- ScavioYouTubeSearchAPIWrapper # -> /api/v1/youtube/search
+-- ScavioYouTubeMetadataAPIWrapper # -> /api/v1/youtube/metadata
+-- ScavioRedditSearchAPIWrapper # -> /api/v1/reddit/search
+-- ScavioRedditPostAPIWrapper # -> /api/v1/reddit/post
+-- ScavioTikTokProfileAPIWrapper # -> /api/v1/tiktok/profile
+-- ScavioTikTokUserPostsAPIWrapper # -> /api/v1/tiktok/user/posts
+-- ScavioTikTokVideoAPIWrapper # -> /api/v1/tiktok/video
+-- ScavioTikTokVideoCommentsAPIWrapper # -> /api/v1/tiktok/video/comments
+-- ScavioTikTokCommentRepliesAPIWrapper# -> /api/v1/tiktok/video/comments/replies
+-- ScavioTikTokSearchVideosAPIWrapper # -> /api/v1/tiktok/search/videos
+-- ScavioTikTokSearchUsersAPIWrapper # -> /api/v1/tiktok/search/users
+-- ScavioTikTokHashtagAPIWrapper # -> /api/v1/tiktok/hashtag
+-- ScavioTikTokHashtagVideosAPIWrapper # -> /api/v1/tiktok/hashtag/videos
+-- ScavioTikTokUserFollowersAPIWrapper # -> /api/v1/tiktok/user/followers
+-- ScavioTikTokUserFollowingsAPIWrapper# -> /api/v1/tiktok/user/followings
+-- ScavioInstagramProfileAPIWrapper # -> /api/v1/instagram/profile
+-- ScavioInstagramUserPostsAPIWrapper # -> /api/v1/instagram/user/posts
+-- ScavioInstagramUserReelsAPIWrapper # -> /api/v1/instagram/user/reels
+-- ScavioInstagramTaggedPostsAPIWrapper # -> /api/v1/instagram/user/tagged
+-- ScavioInstagramStoriesAPIWrapper # -> /api/v1/instagram/user/stories
+-- ScavioInstagramPostAPIWrapper # -> /api/v1/instagram/post
+-- ScavioInstagramPostCommentsAPIWrapper # -> /api/v1/instagram/post/comments
+-- ScavioInstagramCommentRepliesAPIWrapper # -> /api/v1/instagram/post/comments/replies
+-- ScavioInstagramSearchUsersAPIWrapper # -> /api/v1/instagram/search/users
+-- ScavioInstagramSearchHashtagsAPIWrapper # -> /api/v1/instagram/search/hashtags
+-- ScavioInstagramUserFollowersAPIWrapper # -> /api/v1/instagram/user/followers
+-- ScavioInstagramUserFollowingsAPIWrapper # -> /api/v1/instagram/user/followings
Each tool splits parameters into init-only (developer-controlled, e.g. max_results, domain) and LLM-controllable (passed via args_schema at invocation time, e.g. query, sort_by).
Migrating from Tavily
- from langchain_tavily import TavilySearch
+ from langchain_scavio import ScavioSearch
- tool = TavilySearch(max_results=5)
+ tool = ScavioSearch(max_results=5)
See the full migration guide for parameter mapping and feature comparison.
License
MIT