Search Amazon products by keyword
Returns organic Amazon search results for a keyword: title, price, list price, rating, image, and ASIN per product. Where Amazon shows its monthly purchase badge, product.ext.bought_past_month_label carries Amazon's text in the marketplace's own language ("9K+ bought in past month", "2000+ Mal im letzten Monat gekauft") and product.ext.bought_past_month its LOWER BOUND as an integer (9000; a badge reading "2000+" means at least 2000, not exactly 2000). Parsed for US, GB, CA, AU, IN, DE, FR, IT, ES, MX, NL, BR and JP. Both are null when the row shows no badge, and the number is null on a badge with no count ("New on Amazon in past month") or in a wording we have not parsed (the label is still returned as-is). Calls served from the secondary source, including depth calls it answers, carry the number without a label. Multiply it by price.current per country for an estimate of monthly spend by marketplace. Results reflect the chosen marketplace (default United States). Sponsored placements and related searches are excluded in v1. Paginate with the universal cursor parameter; pass depth instead if you need a single large page. A depth of 1 to 3 that the depth backend cannot answer within the request budget is served from the default page instead. That answer is cut to depth rows, has data.details.depth_truncated set to true, and is complete: it has no next page (next_cursor is null and has_more is false). A depth of 4 or more is never served that way, and a timeout is auto-refunded.
Request
- Base URL: https://www.socialcrawl.dev/v1
- URL: https://www.socialcrawl.dev/v1/amazon/product-search
- Auth: API key in header x-api-key
Query parameters
Search keyword or phrase.
Amazon marketplace as an ISO 3166-1 alpha-2 country code (default US). Supported: US, GB, CA, DE, FR, IT, ES, JP, IN, MX, BR, AU, NL. Non-US marketplaces are best-effort; an occasional timeout is refunded.
Maximum number of products to return in ONE call (default 20, max 700). Use it when you would rather make a single large request than paginate: it selects a different, slower search backend whose latency grows with depth, and a timeout is auto-refunded. Leave it unset for the fast default page size, which is the better choice for keyword→ASIN resolution. A depth of 1 to 3 falls back to the fast default page when the slower backend times out, so that answer has at most depth rows and carries data.details.depth_truncated: true. When the slower backend answers it may return more rows than depth (it returns its whole first page), as before.
Page number, starting at 1. Prefer the universal cursor parameter. Native upstream cursor param. Send the universal cursor instead: the API maps it to this name for you.
Universal pagination cursor. Send pagination.next_cursor from the previous response back verbatim: the API maps it to this endpoint's native page (page style). You never construct, decode, or look up a cursor. Omit it for page 1.
Headers
Send no-cache to bypass the response cache and force a live fetch. Billed at the normal endpoint cost; the fresh result is written back to cache for the next caller. Only the no-cache directive triggers this. See the Response Schema guide for details.
Optional UUID that makes the request safely retriable. The key is reserved atomically per account before billing. A concurrent retry receives 409 IDEMPOTENCY_IN_PROGRESS with a Retry-After of 1 second while the original is young, growing to a quarter of the time it has been running (at most 30); a crashed reservation expires after 5 minutes. A replay keeps the cached payload immutable except for billing metadata: credits_used becomes 0, idempotent_replay becomes true, and credits_remaining is refreshed to the current balance. A known current balance appears in both the body and X-Credits-Remaining header; no balance row resolves to 0. On a transient lookup failure, body credits_remaining is null and X-Credits-Remaining is omitted. Completed outcomes expire after 24 hours. If the claim store is unavailable, the request fails closed before billing. GET endpoints do not combine idempotent replay with Server-Sent Events: use Accept: application/json when sending this header. The unsupported key-plus-SSE combination is rejected before billing.
Response
Successful response
Example response
{
"success": true,
"platform": "amazon",
"endpoint": "/v1/amazon/product-search",
"credits_used": 1,
"credits_remaining": 4999,
"request_id": "req-abc123",
"idempotent_replay": true,
"meta": {
"hint": {
"code": "search_multi",
"message": "You searched \"matcha\" on 3 platforms one call at a time; /v1/search/multi returns each platform's own search rows in one call at the same price per platform, and a platform with no rows is not charged.",
"method": "GET",
"path": "/v1/search/multi?query=matcha&platforms=instagram,tiktok,youtube"
}
},
"pagination": {
"next_cursor": "sc.eyJ2IjoyLCJjIjoiMiIsInAiOiJwYWdlIn0",
"has_more": true,
"page_size": 30,
"stopped_at": "known_id"
}
}Changes
No recorded changes to this operation across all 1 revision of this API.