mastra-scavio 0.7.1 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -6
- package/dist/index.cjs +31 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +31 -31
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[Scavio](https://scavio.dev) real-time data tools for [Mastra](https://mastra.ai) agents — **188 tools across 31 platforms** on one API key. Retail (Amazon, Walmart, eBay, Target, Home Depot), real estate (Zillow, Redfin), travel (Booking.com, Airbnb, Tripadvisor), local (Yelp, Google Maps), jobs (Indeed, Glassdoor, LinkedIn), software reviews (G2, Capterra), app stores (App Store, Google Play), company filings (SEC EDGAR, Companies House), ad libraries (Google Ads Transparency, Meta Ad Library), search (Google) and social (YouTube, TikTok, Instagram, X, Reddit, Threads, Kuaishou) — plus `scavioExtract`, which reads any URL as clean Markdown, and five opt-in tools that map a site's URLs, crawl a whole site or batch-extract a URL list.
|
|
4
4
|
|
|
5
|
-
> **Amazon changed (breaking).** The
|
|
5
|
+
> **Amazon changed (breaking).** The Amazon endpoint changed in 2026-07:
|
|
6
6
|
> `domain` is replaced by `country`, a two-letter marketplace code (`us`, `gb`
|
|
7
7
|
> -- the UK is `gb`, not `uk` -- `de`, `jp`, ...), and `sort_by`, `pages`,
|
|
8
8
|
> `category_id`, `merchant_id`, `language`, `currency`, `device`, `zip_code`
|
|
@@ -204,11 +204,10 @@ Most calls cost 1 credit. Every tool states its own cost in its description, so
|
|
|
204
204
|
| `scavioLinkedinPerson`, `scavioLinkedinPersonAbout`, `scavioLinkedinCompany`, `scavioLinkedinPost` | 1 |
|
|
205
205
|
| `scavioLinkedinPersonPosts`, `scavioLinkedinCompanyPosts`, `scavioLinkedinSearchJobs`, `scavioLinkedinPostComments` | 10 |
|
|
206
206
|
| `scavioLinkedinJob` | 30 |
|
|
207
|
-
| `
|
|
208
|
-
|
|
|
209
|
-
| All other Instagram tools | 10 |
|
|
207
|
+
| `scavioInstagramProfile`, `scavioInstagramUserReels`, `scavioInstagramUserTagged` | 1 |
|
|
208
|
+
| All other Instagram tools | 2 |
|
|
210
209
|
|
|
211
|
-
Instagram is priced per endpoint rather than flat,
|
|
210
|
+
Instagram is priced per endpoint rather than flat: profile, reels and tagged 1 credit (reels and tagged 2 the first time a username is looked up), every other Instagram tool 2, and the user and hashtag searches 8 when called with a `cursor`. Any Instagram request can cost up to 10 when it needs extra work; `credits_used` in the response is the exact charge. Paginated tools bill per page. See [scavio.dev/docs](https://scavio.dev/docs).
|
|
212
211
|
|
|
213
212
|
### These surfaces are priced by the request body
|
|
214
213
|
|
|
@@ -217,7 +216,7 @@ No single number is true for these, so each tool states its own price and none o
|
|
|
217
216
|
| Surface | Price |
|
|
218
217
|
|---|---|
|
|
219
218
|
| `scavioWalmartSearch`, `scavioWalmartCategory` | 1 credit on `domain` `com` or `ca`, **2 on `com.mx`**. The other five Walmart tools take no `domain` and are always 1. |
|
|
220
|
-
| `scavioThreadsProfile`, `scavioThreadsUserPosts`, `scavioThreadsUserReplies` | **2 credits addressed by `user_id`, 4 by `username`** — a handle buys a second
|
|
219
|
+
| `scavioThreadsProfile`, `scavioThreadsUserPosts`, `scavioThreadsUserReplies` | **2 credits addressed by `user_id`, 4 by `username`** — a handle buys a second lookup. Pass `user_id` whenever you have it. The other three Threads tools have no username form and are always 2. |
|
|
221
220
|
| Kuaishou | **Per endpoint, 1 to 40.** See the table above; one platform-wide figure would be wrong by up to 40x. |
|
|
222
221
|
| `scavioExtract` | 1 credit on `mode` `normal` or `advanced`, **2 on `ultra`**. Only a successful extraction is billed — a dead link, bot wall or timeout costs nothing. |
|
|
223
222
|
| `scavioMapWebsite` | 1 credit on `mode` `normal`; up to 2 on `advanced`, up to 10 on `ultra`, priced by what the call needed. |
|
package/dist/index.cjs
CHANGED
|
@@ -1461,8 +1461,8 @@ var instagramToolSpecs = [
|
|
|
1461
1461
|
id: "scavio-instagram-profile",
|
|
1462
1462
|
platform: "instagram",
|
|
1463
1463
|
endpoint: "/api/v1/instagram/profile",
|
|
1464
|
-
credits:
|
|
1465
|
-
description: "Fetch an Instagram profile via Scavio (
|
|
1464
|
+
credits: 1,
|
|
1465
|
+
description: "Fetch an Instagram profile via Scavio (1 credit). The profile is inlined at the root of data - pk, username, full_name, biography, follower_count, following_count, is_private, is_verified, profile_pic_url - with no data.user wrapper. Provide username or user_id.",
|
|
1466
1466
|
inputSchema: import_zod8.z.object({ username: username2, user_id: userId }),
|
|
1467
1467
|
call: (client, input) => client.instagram.profile(input)
|
|
1468
1468
|
}),
|
|
@@ -1472,7 +1472,7 @@ var instagramToolSpecs = [
|
|
|
1472
1472
|
platform: "instagram",
|
|
1473
1473
|
endpoint: "/api/v1/instagram/user/posts",
|
|
1474
1474
|
credits: 2,
|
|
1475
|
-
description: "Fetch an account's Instagram timeline posts via Scavio (2 credits
|
|
1475
|
+
description: "Fetch an account's Instagram timeline posts via Scavio (2 credits per page). Items arrive at data.data; pass data.pagination_token as cursor for the next page. Use it when you need the whole timeline; the reels tool is cheaper (1 credit) when reels alone will do.",
|
|
1476
1476
|
inputSchema: import_zod8.z.object({ username: username2, user_id: userId, count: feedCount, cursor: cursor5 }),
|
|
1477
1477
|
call: (client, input) => client.instagram.userPosts(input)
|
|
1478
1478
|
}),
|
|
@@ -1481,8 +1481,8 @@ var instagramToolSpecs = [
|
|
|
1481
1481
|
id: "scavio-instagram-user-reels",
|
|
1482
1482
|
platform: "instagram",
|
|
1483
1483
|
endpoint: "/api/v1/instagram/user/reels",
|
|
1484
|
-
credits:
|
|
1485
|
-
description: "Fetch an account's Instagram reels via Scavio (
|
|
1484
|
+
credits: 1,
|
|
1485
|
+
description: "Fetch an account's Instagram reels via Scavio (1 credit; 2 the first time a username is looked up). Returns data.items with data.next_max_id.",
|
|
1486
1486
|
inputSchema: import_zod8.z.object({ username: username2, user_id: userId, count: feedCount, cursor: cursor5 }),
|
|
1487
1487
|
call: (client, input) => client.instagram.userReels(input)
|
|
1488
1488
|
}),
|
|
@@ -1491,8 +1491,8 @@ var instagramToolSpecs = [
|
|
|
1491
1491
|
id: "scavio-instagram-user-tagged",
|
|
1492
1492
|
platform: "instagram",
|
|
1493
1493
|
endpoint: "/api/v1/instagram/user/tagged",
|
|
1494
|
-
credits:
|
|
1495
|
-
description: "Fetch the posts an Instagram account is tagged in via Scavio (
|
|
1494
|
+
credits: 1,
|
|
1495
|
+
description: "Fetch the posts an Instagram account is tagged in via Scavio (1 credit; 2 the first time a username is looked up). Returns data.items with data.next_max_id. Video items carry video_url null - fetch the video with scavio-instagram-post. This is other accounts posting about them - use it for brand mentions and creator collaborations, not for their own feed.",
|
|
1496
1496
|
inputSchema: import_zod8.z.object({ username: username2, user_id: userId, count: feedCount, cursor: cursor5 }),
|
|
1497
1497
|
call: (client, input) => client.instagram.userTagged(input)
|
|
1498
1498
|
}),
|
|
@@ -1501,8 +1501,8 @@ var instagramToolSpecs = [
|
|
|
1501
1501
|
id: "scavio-instagram-user-stories",
|
|
1502
1502
|
platform: "instagram",
|
|
1503
1503
|
endpoint: "/api/v1/instagram/user/stories",
|
|
1504
|
-
credits:
|
|
1505
|
-
description: "Fetch an Instagram account's currently active stories via Scavio (
|
|
1504
|
+
credits: 2,
|
|
1505
|
+
description: "Fetch an Instagram account's currently active stories via Scavio (2 credits). Returns data.items and data.reels. Stories expire after 24 hours and there is no pagination here - no count, no cursor. Provide username or user_id.",
|
|
1506
1506
|
inputSchema: import_zod8.z.object({ username: username2, user_id: userId }),
|
|
1507
1507
|
call: (client, input) => client.instagram.userStories(input)
|
|
1508
1508
|
}),
|
|
@@ -1511,8 +1511,8 @@ var instagramToolSpecs = [
|
|
|
1511
1511
|
id: "scavio-instagram-post",
|
|
1512
1512
|
platform: "instagram",
|
|
1513
1513
|
endpoint: "/api/v1/instagram/post",
|
|
1514
|
-
credits:
|
|
1515
|
-
description: "Fetch one Instagram post via Scavio (
|
|
1514
|
+
credits: 2,
|
|
1515
|
+
description: "Fetch one Instagram post via Scavio (2 credits). The post is data.items[0]: caption, like_count, comment_count, media_type (1 image, 2 video, 8 carousel), video_versions[].url for video and image_versions2.candidates for the cover. It also carries the media_id that scavio-instagram-comment-replies requires. Provide url, media_id or shortcode.",
|
|
1516
1516
|
inputSchema: import_zod8.z.object({
|
|
1517
1517
|
url: import_zod8.z.string().optional().describe("Full Instagram post URL."),
|
|
1518
1518
|
media_id: import_zod8.z.string().optional().describe("Instagram media id. Highest precedence - url and shortcode are ignored with it."),
|
|
@@ -1525,13 +1525,13 @@ var instagramToolSpecs = [
|
|
|
1525
1525
|
id: "scavio-instagram-post-comments",
|
|
1526
1526
|
platform: "instagram",
|
|
1527
1527
|
endpoint: "/api/v1/instagram/post/comments",
|
|
1528
|
-
credits:
|
|
1529
|
-
description: "Fetch the comments on an Instagram post via Scavio (
|
|
1528
|
+
credits: 2,
|
|
1529
|
+
description: "Fetch the comments on an Instagram post via Scavio (2 credits per page). Returns data.comments with data.comment_count, data.has_more_comments and data.next_min_id. Identify the post by shortcode or url ONLY - media_id is not accepted here, unlike the post and replies tools.",
|
|
1530
1530
|
inputSchema: import_zod8.z.object({
|
|
1531
1531
|
shortcode: import_zod8.z.string().optional().describe("Shortcode from the post URL, e.g. 'DUajw4YkorV'."),
|
|
1532
1532
|
url: import_zod8.z.string().optional().describe("Full Instagram post URL. It is parsed down to the shortcode, so /p/, /reel/ and /tv/ links work and others fail."),
|
|
1533
1533
|
cursor: cursor5,
|
|
1534
|
-
sort_order: import_zod8.z.enum(["popular", "newest"]).optional().describe("popular (default) or newest.
|
|
1534
|
+
sort_order: import_zod8.z.enum(["popular", "newest"]).optional().describe("popular (default) or newest.")
|
|
1535
1535
|
}),
|
|
1536
1536
|
call: (client, input) => client.instagram.postComments(input)
|
|
1537
1537
|
}),
|
|
@@ -1540,8 +1540,8 @@ var instagramToolSpecs = [
|
|
|
1540
1540
|
id: "scavio-instagram-comment-replies",
|
|
1541
1541
|
platform: "instagram",
|
|
1542
1542
|
endpoint: "/api/v1/instagram/post/comments/replies",
|
|
1543
|
-
credits:
|
|
1544
|
-
description: "Fetch the replies to one Instagram comment via Scavio (
|
|
1543
|
+
credits: 2,
|
|
1544
|
+
description: "Fetch the replies to one Instagram comment via Scavio (2 credits). Returns data.child_comments; when data.has_more_tail_child_comments is true, pass data.next_min_child_cursor as cursor. Requires media_id plus comment_id: the comments tool does not return a media_id, so resolve it with scavio-instagram-post first. A shortcode or url will not work here.",
|
|
1545
1545
|
inputSchema: import_zod8.z.object({
|
|
1546
1546
|
media_id: import_zod8.z.string().describe("Instagram media id, from scavio-instagram-post."),
|
|
1547
1547
|
comment_id: import_zod8.z.string().describe("Parent comment id, from scavio-instagram-post-comments."),
|
|
@@ -1554,8 +1554,8 @@ var instagramToolSpecs = [
|
|
|
1554
1554
|
id: "scavio-instagram-search-users",
|
|
1555
1555
|
platform: "instagram",
|
|
1556
1556
|
endpoint: "/api/v1/instagram/search/users",
|
|
1557
|
-
credits:
|
|
1558
|
-
description: "Search Instagram accounts by keyword via Scavio (
|
|
1557
|
+
credits: 2,
|
|
1558
|
+
description: "Search Instagram accounts by keyword via Scavio (2 credits; a request with a cursor costs 8). Returns data.users with data.rank_token. Page size is not controllable - there is no count - so the first page is usually the one to use.",
|
|
1559
1559
|
inputSchema: import_zod8.z.object({ keyword: keyword2, cursor: cursor5 }),
|
|
1560
1560
|
call: (client, input) => client.instagram.searchUsers(input)
|
|
1561
1561
|
}),
|
|
@@ -1564,8 +1564,8 @@ var instagramToolSpecs = [
|
|
|
1564
1564
|
id: "scavio-instagram-search-hashtags",
|
|
1565
1565
|
platform: "instagram",
|
|
1566
1566
|
endpoint: "/api/v1/instagram/search/hashtags",
|
|
1567
|
-
credits:
|
|
1568
|
-
description: "Search Instagram hashtags by keyword via Scavio (
|
|
1567
|
+
credits: 2,
|
|
1568
|
+
description: "Search Instagram hashtags by keyword via Scavio (2 credits; a request with a cursor costs 8). Returns data.hashtags with media counts and data.rank_token. No count parameter, same as the user search.",
|
|
1569
1569
|
inputSchema: import_zod8.z.object({ keyword: keyword2, cursor: cursor5 }),
|
|
1570
1570
|
call: (client, input) => client.instagram.searchHashtags(input)
|
|
1571
1571
|
}),
|
|
@@ -1574,8 +1574,8 @@ var instagramToolSpecs = [
|
|
|
1574
1574
|
id: "scavio-instagram-user-followers",
|
|
1575
1575
|
platform: "instagram",
|
|
1576
1576
|
endpoint: "/api/v1/instagram/user/followers",
|
|
1577
|
-
credits:
|
|
1578
|
-
description: "List an Instagram account's followers via Scavio (
|
|
1577
|
+
credits: 2,
|
|
1578
|
+
description: "List an Instagram account's followers via Scavio (2 credits per page). Returns data.users with data.has_more, and data.next_max_id when there is a next page. Each page costs another 2 credits - cap how deep you walk.",
|
|
1579
1579
|
inputSchema: import_zod8.z.object({ username: username2, user_id: userId, count: followCount, cursor: cursor5 }),
|
|
1580
1580
|
call: (client, input) => client.instagram.userFollowers(input)
|
|
1581
1581
|
}),
|
|
@@ -1584,8 +1584,8 @@ var instagramToolSpecs = [
|
|
|
1584
1584
|
id: "scavio-instagram-user-followings",
|
|
1585
1585
|
platform: "instagram",
|
|
1586
1586
|
endpoint: "/api/v1/instagram/user/followings",
|
|
1587
|
-
credits:
|
|
1588
|
-
description: "List the accounts an Instagram user follows via Scavio (
|
|
1587
|
+
credits: 2,
|
|
1588
|
+
description: "List the accounts an Instagram user follows via Scavio (2 credits per page). Returns data.users with data.next_max_id and data.has_more. The public name is followings (plural), matching TikTok.",
|
|
1589
1589
|
inputSchema: import_zod8.z.object({ username: username2, user_id: userId, count: followCount, cursor: cursor5 }),
|
|
1590
1590
|
call: (client, input) => client.instagram.userFollowings(input)
|
|
1591
1591
|
})
|
|
@@ -2544,7 +2544,7 @@ var ebayToolSpecs = [
|
|
|
2544
2544
|
"price_low",
|
|
2545
2545
|
"price_high"
|
|
2546
2546
|
]).optional().describe(
|
|
2547
|
-
"Result sort order. Defaults to 'best_match'. eBay's 'Distance: nearest first' is deliberately unsupported (it
|
|
2547
|
+
"Result sort order. Defaults to 'best_match'. eBay's 'Distance: nearest first' is deliberately unsupported (it would not rank by the location of the caller)."
|
|
2548
2548
|
),
|
|
2549
2549
|
min_price: import_zod15.z.number().optional().describe("Minimum price, inclusive. Must be 0 or greater."),
|
|
2550
2550
|
max_price: import_zod15.z.number().optional().describe("Maximum price, inclusive. Must be 0 or greater."),
|
|
@@ -2994,7 +2994,7 @@ var bookingToolSpecs = [
|
|
|
2994
2994
|
),
|
|
2995
2995
|
rooms: import_zod19.z.number().int().optional().describe("Rooms required, >= 1 (default 1)."),
|
|
2996
2996
|
currency: import_zod19.z.string().optional().describe(
|
|
2997
|
-
"ISO 4217 currency for prices, 3 letters (default 'USD'). Without it Booking
|
|
2997
|
+
"ISO 4217 currency for prices, 3 letters (default 'USD'). Without it Booking picks a currency itself and identical requests can disagree."
|
|
2998
2998
|
)
|
|
2999
2999
|
}),
|
|
3000
3000
|
call: (client, input) => client.booking.search(input)
|
|
@@ -3025,7 +3025,7 @@ var bookingToolSpecs = [
|
|
|
3025
3025
|
),
|
|
3026
3026
|
rooms: import_zod19.z.number().int().optional().describe("Rooms required, >= 1 (default 1)."),
|
|
3027
3027
|
currency: import_zod19.z.string().optional().describe(
|
|
3028
|
-
"ISO 4217 currency for prices, 3 letters (default 'USD'). Without it Booking
|
|
3028
|
+
"ISO 4217 currency for prices, 3 letters (default 'USD'). Without it Booking picks a currency itself and identical requests can disagree."
|
|
3029
3029
|
)
|
|
3030
3030
|
}),
|
|
3031
3031
|
call: (client, input) => client.booking.hotel(input)
|
|
@@ -3315,7 +3315,7 @@ var airbnbToolSpecs = [
|
|
|
3315
3315
|
"Comma-separated amenities (1-200 characters): wifi, air_conditioning, pool, kitchen, free_parking, washer, self_check_in, tv, or raw numeric Airbnb amenity ids. An unrecognised NAME is rejected before the scrape."
|
|
3316
3316
|
),
|
|
3317
3317
|
currency: import_zod22.z.string().optional().describe(
|
|
3318
|
-
"ISO 4217 currency for prices, 3 letters (default 'USD'). Without it Airbnb
|
|
3318
|
+
"ISO 4217 currency for prices, 3 letters (default 'USD'). Without it Airbnb picks a currency itself and identical requests can disagree."
|
|
3319
3319
|
),
|
|
3320
3320
|
page: import_zod22.z.number().int().optional().describe(
|
|
3321
3321
|
"Results page, 1-based. 18 listings per page. Cannot be combined with cursor."
|
|
@@ -3421,7 +3421,7 @@ var glassdoorToolSpecs = [
|
|
|
3421
3421
|
description: "Up to THREE full Glassdoor reviews - the cap is Glassdoor's login wall - with per-axis scores, pros, cons, advice, job title, location, employment status and employer response, plus complete rating statistics, star distribution, aggregate pro/con highlight terms and per-job-title review counts. There is no page param: move the window with category and employment_status. Provide employer_id or url. Costs 1 credit.",
|
|
3422
3422
|
inputSchema: import_zod23.z.object({
|
|
3423
3423
|
employer_id: import_zod23.z.string().optional().describe(
|
|
3424
|
-
"Glassdoor employer id (1-50 characters): '1699', 'E1699' or 'IE1699'. Must be a STRING - a JSON number is rejected. Addressing by id
|
|
3424
|
+
"Glassdoor employer id (1-50 characters): '1699', 'E1699' or 'IE1699'. Must be a STRING - a JSON number is rejected. Addressing by id takes an extra lookup; the customer price is unchanged."
|
|
3425
3425
|
),
|
|
3426
3426
|
company: import_zod23.z.string().optional().describe(
|
|
3427
3427
|
"Employer name as it appears in a Glassdoor slug (1-200 characters). COSMETIC: ignored when url is set, and it does not satisfy the employer_id-or-url requirement."
|
|
@@ -3454,7 +3454,7 @@ var glassdoorToolSpecs = [
|
|
|
3454
3454
|
description: "Glassdoor salaries by job title, 10 titles per page: base-pay and total-pay percentiles P10-P90 with medians called out, sample counts, currency, pay period and last-reported date. The figures are Glassdoor's ESTIMATES for the title, not individual reported salaries. Provide employer_id or url. Costs 1 credit.",
|
|
3455
3455
|
inputSchema: import_zod23.z.object({
|
|
3456
3456
|
employer_id: import_zod23.z.string().optional().describe(
|
|
3457
|
-
"Glassdoor employer id (1-50 characters): '1699', 'E1699' or 'IE1699'. Must be a STRING - a JSON number is rejected. Addressing by id
|
|
3457
|
+
"Glassdoor employer id (1-50 characters): '1699', 'E1699' or 'IE1699'. Must be a STRING - a JSON number is rejected. Addressing by id takes an extra lookup; the customer price is unchanged."
|
|
3458
3458
|
),
|
|
3459
3459
|
company: import_zod23.z.string().optional().describe(
|
|
3460
3460
|
"Employer name as it appears in a Glassdoor slug (1-200 characters). COSMETIC: ignored when url is set, and it does not satisfy the employer_id-or-url requirement."
|
|
@@ -3501,7 +3501,7 @@ var yelpToolSpecs = [
|
|
|
3501
3501
|
"What to look for (1-200 characters): a category ('plumbers'), a dish, or a business name. Required together with location unless url is given."
|
|
3502
3502
|
),
|
|
3503
3503
|
location: import_zod24.z.string().optional().describe(
|
|
3504
|
-
"Where to look (1-200 characters): city and region, a full address, or a postcode. Effectively required - Yelp
|
|
3504
|
+
"Where to look (1-200 characters): city and region, a full address, or a postcode. Effectively required - without it Yelp picks a location itself, so the same request can answer about a different metro run to run."
|
|
3505
3505
|
),
|
|
3506
3506
|
page: import_zod24.z.number().int().optional().describe(
|
|
3507
3507
|
"Results page, 1-based. Yelp fixes the page size at 10."
|