# Amazon Jobs Scraper (`santamaria-automations/amazon-jobs-scraper`) Actor

Scrape job listings from amazon.jobs worldwide. Returns title, team, category, location, posting date, full description, basic and preferred qualifications and the apply link. Pay per job.

- **URL**: https://apify.com/santamaria-automations/amazon-jobs-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Amazon Jobs Scraper

Scrapes job listings from [Amazon Jobs](https://www.amazon.jobs). Each row has the title, team and category, every location, the posting date, the full description, the basic and preferred qualifications and the apply link, ready for a spreadsheet, a database or an AI agent.

### What you can do with it

- Search by one or more keywords, or leave the keywords empty to list all open jobs.
- Narrow the search by country, location and job category.
- Get the newest postings first (`sortBy: recent`, the default), or sort by relevance.
- Keep only recent postings with `postedWithinDays`.
- Paste Amazon Jobs search pages or single job pages into `startUrls`. Tracking parameters such as `utm_source` are ignored.
- Run it on a schedule to build a daily feed of new Amazon jobs.

### Input

| Field | Meaning | Default |
|-------|---------|---------|
| `searchQueries` | Keywords, one search each. Empty means all jobs. | all jobs |
| `location` | Cities, regions or countries, for example `Seattle`, `Texas`, `Germany`, `Berlin, Germany` | all locations |
| `country` | Country names or codes (`Germany`, `DE`, `DEU`) | all countries |
| `category` | Job categories, for example `Software Development` | all categories |
| `sortBy` | `recent` or `relevant` | `recent` |
| `postedWithinDays` | Only jobs posted in the last N days, 0 or empty = no filter | no filter |
| `maxResultsPerQuery` | Cap per keyword, location and start URL | 10 |
| `maxResults` | Cap across all searches, empty = no total cap | no total cap |
| `startUrls` | Amazon Jobs search or job page URLs | none |

An empty input (`{}`) runs a small demo that returns the 5 newest jobs, so you can see the output format.

Each search returns at most 10,000 jobs, so split very large pulls by country or category.

Examples:

```json
{
  "searchQueries": ["data scientist", "solutions architect"],
  "country": ["Germany", "United Kingdom"],
  "sortBy": "recent",
  "postedWithinDays": 14,
  "maxResultsPerQuery": 100
}
```

```json
{
  "category": ["Software Development"],
  "location": ["Seattle, Washington, USA"],
  "maxResultsPerQuery": 200
}
```

```json
{
  "startUrls": [
    "https://www.amazon.jobs/en/search?base_query=python&country=DEU",
    "https://www.amazon.jobs/en/jobs/10588363/head-operations"
  ],
  "maxResultsPerQuery": 50
}
```

#### Supported URLs

| URL | What you get |
|-----|--------------|
| `https://www.amazon.jobs/en/search?base_query=python&country=DEU` | Jobs of that search, with its keyword, country, category and location filters |
| `https://www.amazon.jobs/en/jobs/10588363/head-operations` | That one job |
| `https://www.amazon.jobs/en/search` | All jobs, newest first |

### Output

One row per job. Missing values are `null` (or an empty list), never an empty string.

| Field | Meaning |
|-------|---------|
| `id` | Internal Amazon posting id (UUID) |
| `job_id` | The Job ID shown on the job page, unique per posting |
| `title` | Job title |
| `job_url`, `source_url` | Public job page |
| `source_platform` | `amazon.jobs` |
| `apply_url` | Link to apply |
| `company_name` | Hiring Amazon company |
| `business_category` | Business area, for example `retail` or `aws` |
| `job_category`, `job_family` | Category and family as the site lists them |
| `team`, `team_slug` | Team, when the posting names one |
| `job_schedule_type` | For example `full-time` |
| `is_intern` | Best-effort flag derived from the title and the team: `true` when the title or team names an internship or the team is a student program, otherwise `false`. The site has no such field, so check edge cases yourself |
| `location`, `normalized_location`, `city` | Primary location |
| `state_code`, `state` | State or province code (`WA`) and full name (`Washington`) of the primary location |
| `country_code`, `country_code_iso2`, `country` | Country of the primary location |
| `all_locations` | Every location of the job: city, state, country, type, latitude, longitude, building codes |
| `posted_at` | Posting date (ISO date) |
| `updated_time` | How long ago the posting was updated, as the site shows it |
| `description`, `description_html` | Full description as text and as HTML |
| `basic_qualifications`, `basic_qualifications_html` | Basic qualifications |
| `preferred_qualifications`, `preferred_qualifications_html` | Preferred qualifications, `null` when the posting has none |
| `search_query` | The keyword that found the job (`null` without a keyword or for job URLs) |
| `scraped_at` | When the row was collected (UTC) |

Sample row (long texts shortened):

```json
{
  "id": "d246900d-df77-4ca9-92c0-14cc81e498ea",
  "job_id": "10587034",
  "title": "Principal Applied Scientist, AWS Data Center Services",
  "job_url": "https://www.amazon.jobs/en/jobs/10587034/principal-applied-scientist-aws-data-center-services",
  "apply_url": "https://account.amazon.jobs/jobs/10587034/apply",
  "company_name": "Amazon Data Services, Inc.",
  "business_category": "aws",
  "job_category": "Applied Science",
  "job_family": "Applied Science",
  "team": "Machine learning",
  "job_schedule_type": "full-time",
  "is_intern": false,
  "normalized_location": "Seattle, Washington, USA",
  "city": "Seattle",
  "state_code": "WA",
  "state": "Washington",
  "country_code": "USA",
  "country": "United States",
  "posted_at": "2026-10-22",
  "updated_time": "2 days",
  "description": "Application deadline: Oct 27, 2026 ...",
  "basic_qualifications": "PhD in Machine Learning, Computer Vision, Statistics or in a highly quantitative field. ...",
  "search_query": "data scientist",
  "scraped_at": "2026-10-26T08:39:47Z"
}
```

### Pricing

This Actor uses pay-per-event pricing:

- `job-result`: one event for every job row that lands in the dataset. Duplicates across searches are removed first and are not charged.
- `apify-actor-start`: one event per run.

That is $1.00 per 1,000 jobs + $0.001 per run start. The description and qualifications come with every job at no extra charge. If you set a maximum charge per run, the Actor stops when the next job would exceed it and reports how many jobs were delivered.

Every Apify account includes a monthly free credit, which is enough to try the Actor on real searches.

### Use with AI agents (MCP)

Connect this Actor to any MCP-compatible AI client through the Apify MCP server:

```
https://mcp.apify.com?tools=santamaria-automations/amazon-jobs-scraper
```

Example prompt once connected: "Use amazon-jobs-scraper to list the newest software development jobs at Amazon in Germany posted in the last 7 days, with their basic qualifications."

### FAQ

**How do I find the URL of a search?** Open Amazon Jobs in your browser, set the keyword and filters you want, and copy the address bar into `startUrls`. Or skip URLs and use `searchQueries`, `country`, `location` and `category`.

**Why is a field empty?** Amazon does not fill every field for every posting. `team` is only set when the posting names a team, `preferred_qualifications` is empty for some roles, and `state_code` and `state` are empty in countries without states.

**How do I get only new jobs?** Schedule the Actor with `sortBy: recent` and `postedWithinDays: 1` (or 2 for an overlap). Use `job_id` to de-duplicate against earlier runs.

**How do I stop at a budget?** Set `maxResults`, or the maximum charge per run in the run options. At $1.00 per 1,000 jobs, 500 jobs cost about $0.50.

**Why does a job show a different city than the one I searched?** Many jobs are posted for several cities. `city` is the first one, `all_locations` lists them all.

### Related actors

- [Website Job Extractor](https://apify.com/santamaria-automations/website-job-extractor): jobs from any company career page
- [Indeed HTTP Scraper](https://apify.com/santamaria-automations/indeed-http-scraper): international job board
- [Glassdoor Scraper](https://apify.com/santamaria-automations/glassdoor-scraper): jobs, salaries and reviews
- [Website Email Scraper](https://apify.com/santamaria-automations/website-email-scraper): find contact emails for hiring companies
- [Website Contact Extractor](https://apify.com/santamaria-automations/website-contact-extractor): emails and phones from company websites

### Support

Open an issue in the Issues tab of this Actor, or write to contact@nanoscrape.com.

# Actor input Schema

## `searchQueries` (type: `array`):

Job titles or keywords, one search each. Examples: 'data scientist', 'solutions architect', 'warehouse associate'. Leave empty to get all jobs (newest first), limited by the result caps below.

## `location` (type: `array`):

Cities, regions or countries, for example 'Seattle', 'Texas', 'Germany' or 'Berlin, Germany'. Each location runs as its own search for every keyword. Leave empty for all locations.

## `country` (type: `array`):

Only jobs in these countries. Use country names or codes such as 'Germany', 'DE' or 'DEU'. Combined with every keyword and location.

## `category` (type: `array`):

Only jobs in these categories, for example 'Software Development', 'Machine Learning Science' or 'Fulfillment and Operations Management'. Names are matched the way the Amazon Jobs category filter spells them.

## `sortBy` (type: `string`):

Sort order. Use 'recent' for scheduled scrapes to get the latest postings first.

## `postedWithinDays` (type: `integer`):

Only return jobs posted within the last N days (1 = today and yesterday, 7 = last week). Leave empty or 0 for no age filter.

## `maxResultsPerQuery` (type: `integer`):

Maximum number of jobs per keyword, location and start URL. Leave empty for 10. The site returns at most 10,000 jobs per search.

## `maxResults` (type: `integer`):

Total cap across all searches. Leave empty for no total cap (the per-search cap still applies). When the whole input is empty, a demo run returns 5 jobs.

## `startUrls` (type: `array`):

Optional amazon.jobs search pages (with their filters) or single job pages, for example https://www.amazon.jobs/en/search?base_query=python or https://www.amazon.jobs/en/jobs/10588363/head-operations. Tracking parameters such as utm_source are ignored.

## Actor input object example

```json
{
  "sortBy": "recent"
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset containing the scraped job listings

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/amazon-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/amazon-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call santamaria-automations/amazon-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/amazon-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/oxJ4taEsPeaHDpebm/builds/XKlEaYS8tpTf2jIuC/openapi.json
