An Amazon search results API turns a keyword into the products Amazon shows for it. With SellerMagnet, one GET request to /api/amazon-search with q, a marketplace ID and an optional count returns up to 50 results from the first results page as JSON: position, ASIN, title, price, rating, review count and a sponsored flag. It costs one credit per call. There is no page 2, sort or search volume - this reference shows exactly what you get.
Key Takeaways
- One call to /api/amazon-search returns up to 50 results from the first results page, in page order, for one credit.
- Sponsored results are included and numbered; filter on the sponsored flag to get the organic order.
- The price arrives as a string with two decimals, such as "449.00"; parse it as a decimal, not a float.
- There is no page, sort or department parameter, and no search volume - only what page one shows.
- A missing q is a free 400, but a count above 50 is a billed 400: validate count before sending.
What does the Amazon search results API return?
Each call returns data.searchResults, a list of products in the order the first results page shows them. position starts at 1 and counts every returned product, sponsored ones included. Products without a displayed price are skipped and do not use up a position, so position is the product's place among priced results, not a pixel slot. The response for q=playstation 5 on amazon.com looks like this:
Trimmed /amazon-search response (example values from the API docs)
{
"success": true,
"data": {
"searchResults": [
{
"position": 1,
"asin": "B0CL5KNB9M",
"productTitle": "PlayStation®5 Digital Edition (slim)",
"listingPrice": {"price": {"currency_code": "USD", "currency_symbol": "$", "total": "449.00"}},
"on_sale": false,
"reviewRating": 4.7,
"reviewAmount": 7209,
"sponsored": false,
"discount_info": "",
"mainImage": "https://m.media-amazon.com/images/I/51fM0CKG+HL._AC_UY218_.jpg",
"link": "https://www.amazon.com/dp/B0CL5KNB9M"
},
{
"position": 2,
"asin": "B0DGY63Z2H",
"productTitle": "PlayStation 5 Pro Console",
"listingPrice": {"price": {"currency_code": "USD", "currency_symbol": "$", "total": "699.00"}},
"on_sale": false,
"reviewRating": 4.4,
"reviewAmount": 1373,
"sponsored": false
}
]
}
}
| Field | Type | Notes |
|---|---|---|
position | int | 1-based, sponsored results numbered too |
asin | string | The product's ASIN |
productTitle | string | "N/A" when unreadable |
listingPrice.price.total | string | "449.00" - two decimals |
listingPrice.original_price | object | Only with a struck-through price |
on_sale | bool | Struck-through price is higher |
reviewRating | float | null | Null when no stars shown |
reviewAmount | int | 0 when no count shown |
sponsored | bool | Read from the ad label |
mainImage / link | string | Thumbnail, /dp/<asin> URL |

Get Amazon search results as JSON with curl
Send q (the keyword), marketplaceId and optionally count (1 to 50, default 30) with your key in the X-Api-Key header. marketplaceId takes any of the 23 supported marketplaces, for example ATVPDKIKX0DER for amazon.com. Allow up to 120 seconds: the server waits that long for a slow page. This curl call prints position, sponsored flag, price and ASIN per result:
Page-one results for one keyword with curl and jq
curl -sG "https://sellermagnet-api.com/api/amazon-search" \
-H "X-Api-Key: $SELLERMAGNET_API_KEY" --max-time 120 \
--data-urlencode "q=playstation 5" \
--data-urlencode "marketplaceId=ATVPDKIKX0DER" \
--data-urlencode "count=20" \
| jq -r 'if .success then .data.searchResults[]
| [.position, (if .sponsored then "AD" else "-" end), .listingPrice.price.total, .asin]
| @tsv
else error(.message) end'

Separate sponsored and organic results in Python
To use the Amazon search API from Python, filter on sponsored and number the rest yourself: the organic rank is the position among the non-sponsored results. Parse the price with Decimal so "449.00" stays exact. get(), new_session() and ApiError come from the Python quickstart, which also has a retry helper for 429 and 5xx answers.
search_results.py - page one to CSV with an organic rank
"""Page-one Amazon search results as CSV, sponsored flagged, organic rank added (1 credit)."""
import csv
import sys
from decimal import Decimal
from sellermagnet import ApiError, get, new_session
def search(query: str, marketplace_id: str, count: int = 50) -> list:
if not 1 <= count <= 50:
raise ValueError("count must be 1-50; a count above 50 is a billed 400")
results = get(new_session(), "amazon-search", q=query, marketplaceId=marketplace_id, count=count)["searchResults"]
rows, organic_rank = [], 0
for r in results:
organic_rank += not r["sponsored"]
price = r["listingPrice"]["price"]
rows.append({
"position": r["position"],
"organic_rank": None if r["sponsored"] else organic_rank,
"asin": r["asin"],
"price": Decimal(price["total"]), # a string such as "449.00"
"currency": price["currency_code"],
"rating": r["reviewRating"], # None when the page shows no stars
"reviews": r["reviewAmount"], # 0 when no count is shown
"title": r["productTitle"],
})
return rows
if __name__ == "__main__":
try:
rows = search("playstation 5", "ATVPDKIKX0DER", count=20)
except ApiError as err:
sys.exit(f"search failed: {err}") # status and the API's message
print(f"{len(rows)} results, {sum(r['organic_rank'] is None for r in rows)} sponsored")
with open("search.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["position", "organic_rank", "asin", "price", "currency",
"rating", "reviews", "title"])
writer.writeheader()
writer.writerows(rows)
Sponsored detection reads Amazon's ad label markup; the text fallback only knows the English "Sponsored" and German "Gesponsert" labels. For keyword-level analysis built on this list - review barrier, price band, title terms - see the keyword research guide; to follow one ASIN's position over time, use the keyword rank tracker.
Can I get page 2 or sort the results?
No. The endpoint reads only the first results page in Amazon's default order, across all departments; it has no page, sort or category parameter. count caps how many of that page's priced products come back, up to 50. For deeper coverage, search narrower keywords ("playstation 5 controller" rather than "playstation"), or read a category's ranked list from the bestsellers endpoint, which takes a category ID.
- No search volume, no autocomplete and no reverse-ASIN lookup: the API returns what the page shows.
- No price filter: filter the returned list in your code.
geo_location(a ZIP or postcode) localises the results; it is best-effort, and the response does not say which location was used.
Search errors and what they cost
Checks before billing are free; anything the endpoint itself rejects is charged. A missing or blank q or an unknown marketplace ID is a free 400, while a count above 50 is a billed 400. A keyword whose page has no priced products is a normal 200 with an empty list, and is billed like any answer.
| Response | Charged | Client action |
|---|---|---|
400 Missing required parameter(s): q (absent or blank) | No | Send q and marketplaceId |
400 Invalid marketplaceId | No | Use one of the 23 marketplace IDs |
400 Count Max: 50 | Yes | Validate count (1-50) before sending |
200 with an empty searchResults | Yes | Store it; the page had no priced products |
429 per-key concurrency cap | No | Wait Retry-After (2 s), then retry |
429 per-IP limit (600/min, 15,000/h) | No | Slow down; no Retry-After, HTML body |
500 without Retry-After | No - refunded | Retry once |
502 / 503 | Yes | Wait, retry with a cap |
Keep the raw list
Store the full response with the date, keyword, marketplace and geo_location you sent. Results change daily, and a position is only comparable between calls made with the same marketplace and location.
Frequently Asked Questions
Is there an official Amazon search results API?
Amazon's PA-API 5 offered SearchItems but now answers AccessDenied, and its successor is for affiliates. SellerMagnet's /api/amazon-search returns page-one results as JSON with an API key.
How many results does one call return?
Up to 50 priced products from the first results page, set with count (default 30). Sponsored results are included and flagged. A count above 50 is rejected with a billed 400.
Can I get page 2 of the search results?
No. The endpoint reads only page one in Amazon's default order. Use narrower keywords or the bestsellers endpoint for a category's ranked list.
Why is the price a string?
listingPrice.price.total is sent as text with two decimals, for example "449.00". Parse it with a decimal type rather than a float to keep prices exact.
Does the search API work outside amazon.com?
Yes. It accepts all 23 supported marketplace IDs. Sponsored labels are read from markup; the text fallback recognises only English and German labels.
Bottom line: one /api/amazon-search call gives you page one for a keyword as typed JSON - position, ASIN, title, a string price, rating, reviews and the sponsored flag - for one credit. Every parameter is on the search endpoint page, and a free account includes 150 credits after e-mail verification.