Amazon Trends API
Amazon product search volume and best-seller trends. Free key at trendsapi.ai
Install
mcp_config.json
{
"mcpServers": {
"ai-trendsapi-amazon": {
"url": "https://amazon.api.trendsapi.ai/mcp",
"type": "streamable-http"
}
}
}Documentation
Amazon product-search demand API
Amazon search interest and bestseller feeds via the Trends API. Ecommerce research without scrapers.
Key: trendsapi.ai/#get-key. HTTP contract and every source: trendsapi-ai/trendsapi.
Authentication
pip install trendsapi-amazon
export TRENDSAPI_KEY=your_key
Python 3.9+. Same key as the HTTP API.
from trendsapi_amazon import TrendsAPI
client = TrendsAPI() # TRENDSAPI_KEY
# client = TrendsAPI(api_key="YOUR_KEY")
Keyword helpers default to source: "amazon". Pass source= to hit any other platform with the same client. Official full client (every source, no preset): trendsapi.
Methods
| Method | REST mode | Returns |
|---|---|---|
get_time_series(keyword, source=, data_mode=) | get_time_series | list[TrendsDataPoint] |
get_growth(keyword, percent_growth=, source=, data_mode=) | get_growth | GetGrowthResponse |
get_live(limit=, offset=, category=) | get_top_trends | GetTopTrendsResponse |
get_top_trends(type=, ...) | get_top_trends | GetTopTrendsResponse |
source is lowercase (amazon). type is exact (Amazon Best Sellers Top Rated). Mixing them is a 400.
from trendsapi_amazon import TrendsAPI
client = TrendsAPI() # TRENDSAPI_KEY
# client = TrendsAPI(api_key="YOUR_KEY")
series = client.get_time_series("standing desk")
print(series[-1].date, series[-1].value)
growth = client.get_growth("standing desk", percent_growth=["3M", "12M"])
print(growth.results[0].growth, growth.results[0].direction)
hot = client.get_live(limit=10)
print(hot.data) # [[1, "..."], ...]
get_time_series
points = client.get_time_series("standing desk")
Each point:
| Field | Always | Meaning |
|---|---|---|
date | yes | YYYY-MM-DD |
value | yes | 0-100 index for this series |
keyword | yes | Echo |
volume | no | Absolute volume when available |
source or datatype | no | Pipeline label |
Python returns list[TrendsDataPoint]. Use .date and .value, not ["date"].
JS returns the same fields as object properties.
get_growth
g = client.get_growth("standing desk", percent_growth=["12M", "3M", "YTD"])
print(g.results[0].growth, g.results[0].direction)
percent_growth default: ["12M"]. Presets: 7D 14D 30D 1M 2M 3M 6M 9M 12M/1Y 18M 24M/2Y 36M/3Y 48M 60M/5Y MTD QTD YTD. Custom: {"name": "Launch", "recent": "2024-06-01", "baseline": "2024-01-01"}.
| Field | Meaning |
|---|---|
search_term | Keyword |
data_source | Source |
results | One object per window (period, growth, direction, dates, values) |
metadata | Counts / success flag |
Several windows still count as one request. Python: growth.results[0].growth. JS: growth.results[0].growth.
get_live
hot = client.get_live(limit=10)
| Field | Meaning |
|---|---|
as_of_ts | Snapshot time |
type | Feed name |
limit, offset, count | Pagination |
data | [rank, label] rows |
Python: hot.data. JS: hot.data. Optional offset= and category= (Amazon Best Sellers by Category, Top Websites only).
Async
import asyncio
from trendsapi_amazon import AsyncTrendsAPI
async def main():
c = AsyncTrendsAPI()
return await asyncio.gather(
c.get_time_series("standing desk"),
c.get_time_series("standing desk", source="google search"),
)
asyncio.run(main())
Each 200 is one billed request.
Pandas
from dataclasses import asdict
import pandas as pd
from trendsapi_amazon import TrendsAPI
df = pd.DataFrame(asdict(p) for p in TrendsAPI().get_time_series("standing desk"))
df["date"] = pd.to_datetime(df["date"])
print(df.set_index("date")["value"].resample("ME").mean().tail())
JavaScript / TypeScript
npm install trendsapi-amazon
Node 18+, Deno, Bun, Workers. Same API key. Field tables above apply.
Methods
| Method | REST mode | Returns |
|---|---|---|
getTimeSeries(keyword, { source, data_mode }) | get_time_series | weekly points |
getGrowth(keyword, { percent_growth, source, data_mode }) | get_growth | growth object |
getLive({ limit, offset, category }) | get_top_trends | live feed |
getTopTrends({ type, ... }) | get_top_trends | live feed |
import { TrendsAPI } from "trendsapi-amazon";
const client = new TrendsAPI({ apiKey: process.env.TRENDSAPI_KEY! });
const series = await client.getTimeSeries("standing desk");
console.log(series.at(-1)?.date, series.at(-1)?.value);
const growth = await client.getGrowth("standing desk", {
percent_growth: ["3M", "12M"],
});
console.log(growth.results[0].growth, growth.results[0].direction);
const live = await client.getLive({ limit: 10 });
console.log(live.data); // [[1, "..."], ...]
Call (curl)
| Field | Value |
|---|---|
| Endpoint | POST https://api.trendsapi.ai/api |
| Auth | Authorization: Bearer $TRENDSAPI_KEY |
| History | source: amazon with get_time_series or get_growth |
| Keyword | Product phrase, e.g. standing desk |
Live type | Amazon Best Sellers Top Rated, Amazon Best Sellers by Category |
curl -sS -X POST https://api.trendsapi.ai/api \
-H "Authorization: Bearer $TRENDSAPI_KEY" \
-H "Content-Type: application/json" \
-d '{"mode":"get_time_series","source":"amazon","keyword":"standing desk"}'
Source notes
valueis a 0-100 search-interest index, not units sold.- Feeds answer what is selling now. Keyword series answer what is searched.
- Google Shopping is a different
source(google shopping).
Errors
| HTTP | Client |
|---|---|
| 200 | Parsed payload. Python dataclasses / JS typed objects |
| 400 | Raises. Fix source or type spelling |
| 401 | Raises. Check TRENDSAPI_KEY |
| 404 | Raises. No series for that keyword. Do not retry |
| 429 | Raises. Quota |
| 5xx | Client retries, then raises |
The HTTP body field is a JSON string. SDKs decode it. Raw curl must parse body a second time.
Site: https://trendsapi.ai/trends/amazon-trends.
License
MIT. See LICENSE.
Sourced from the repository README.
More in Developer Tools
- N8nFair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.202,280
- Gemini CliAn open-source AI agent that brings the power of Gemini directly into your terminal.106,664
- World MonitorLive global intelligence: real-time markets, conflicts, country risk, chokepoints, energy. 39 tools.84,026
- WorldmonitorReal-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface84,024
- Scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!76,275
- Ruflo🌊 The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated69,270