Amazon does not post its jobs on Workday or Greenhouse. It runs its own careers site, and the search on amazon.jobs is a public JSON endpoint: no key, no login, and a robots.txt that only closes /internal.
curl -s "https://www.amazon.jobs/en/search.json?offset=0&result_limit=100&sort=recent&base_query=" \
| jq '.hits, (.jobs | length), .jobs[0].title'
Each job carries the title, company_name (the legal entity that hires, such as "Amazon UK Services Ltd."), location and normalized_location, posted_date, the full description with basic_qualifications and preferred_qualifications, job_category, job_path (the link) and id_icims, a stable id. Five things stand between that request and all of the jobs, each measured on 2026-10-26.
1. Ask for more than 100 and you get none
result_limit=200 does not return 100. It returns zero jobs. Page in hundreds.
2. hits says 10,000 and means "at least"
hits stops at 10,000. The real size is in the facets: ask for facets[]=category&facets[]=normalized_country_code and both lists add up to the same number, 21,441 that day. Anything that sizes its loop from hits reads less than half.
3. Past the 10,000th result, jobs is null
Offset 9,900 returned 100 jobs. Offset 10,000 returned "jobs": null, "hits": 0 and "error": "Cannot return more than 10000 results at once", with HTTP 200. Code that expects a list either crashes there or treats it as the end.
To read everything, split the search the way the facets do. category[] takes the category name or slug (software-development), there are 37 categories and the largest held 3,097 jobs, so each one fits under the wall. Join the pages on id_icims.
curl -s -G "https://www.amazon.jobs/en/search.json" \
--data-urlencode "offset=0" --data-urlencode "result_limit=10" --data-urlencode "sort=recent" \
--data-urlencode "base_query=" --data-urlencode "category[]=software-development" | jq '.hits'
4. loc_query filters nothing
loc_query=Tel Aviv on its own still reported 10,000 hits, from London to Bengaluru. The place has to go in base_query, which searches the location text too: base_query=Tel Aviv with sort=relevant returned 102 jobs, the Israeli ones first. For a whole country, normalized_country_code[]=ISR is exact (172 jobs).
5. The date is a sentence
posted_date is "October 26, 2026", not an ISO timestamp, so it sorts wrong as a string. Parse it before you compare.
Hosted
Company Career Page Jobs Scraper on Apify takes "Amazon" (or "AWS") like any other company name, splits past the 10,000 wall by category, and returns the same row shape as the other 23 career systems it reads. The public endpoints of those systems, each with a tested curl, are in job-board-apis.
Top comments (0)