# Indeed Scraper — Jobs, Salaries & Company Data (`herus13/indeed-scraper`) Actor

Scrape Indeed jobs in 59 countries from $0.07 per 1,000 — title, company, structured salary, coordinates, skills, benefits, education, certifications and company enrichment. Reads Indeed's own API: no browser, minutes not hours. Pay per result.

- **URL**: https://apify.com/herus13/indeed-scraper.md
- **Developed by:** [bootforge](https://apify.com/herus13) (community)
- **Categories:** Jobs, Business, Lead generation
- **Stats:** 6 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.06 / 1,000 job scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Indeed Job Scraper

The Indeed Job Scraper is an Apify actor that extracts job listings from [Indeed](https://www.indeed.com) by **keyword search** or **pre-built search URL**, across **59 country storefronts** — including the United States, United Kingdom, Canada, Germany, France, Japan, India, Singapore, Brazil, Mexico and Australia. It returns title, company, structured salary (min, max, currency, pay period), location with **latitude/longitude**, workplace type, full description (text + HTML), posting date, and **company enrichment** — website, social links, industry, CEO, and employer size tier.

It queries Indeed's own job-search API — no browser, no CAPTCHA service, no rendering. A 200-job run with full descriptions finishes in minutes on the 512 MB default, which is also why it costs so little to run.

Use it to build an ATS feed, run job-market research, benchmark salaries, generate recruitment leads, or track competitor hiring — exported to JSON, CSV, or Excel.

### Table of contents

- [What the Indeed scraper does](#what-the-indeed-scraper-does)
- [Use cases](#use-cases)
- [How to scrape Indeed jobs](#how-to-scrape-indeed-jobs)
- [Indeed scraper input](#indeed-scraper-input)
- [Indeed job data output](#indeed-job-data-output)
- [How much it costs](#how-much-it-costs)
- [Recommended proxies for Indeed](#recommended-proxies-for-indeed)
- [Why this Indeed scraper](#why-this-indeed-scraper)
- [FAQ](#faq)
- [Rate this actor](#rate-this-actor-)
- [Related actors](#related-actors)

### What the Indeed scraper does

- 🔎 **Keyword search** — search any term and paginate through every matching job across 59 countries.
- 🔗 **Pre-built search URLs** — paste a filtered Indeed URL from your browser; the country is auto-detected from the host.
- 💷 **Structured salary** — `min`, `max`, `currency`, and `period` (yearly/monthly/weekly/daily/hourly) parsed from the raw text, not left as a free string.
- 📍 **Geo coordinates** — `latitude`/`longitude` plus city, region and postal code on every job, so results map and radius-filter directly.
- 🏢 **Company enrichment** — website, Twitter/Instagram/Facebook, industry, CEO, HQ and Indeed employer size tier, alongside the rating breakdown.
- 🧠 **Skills, benefits, education, certifications** — Indeed ships these as one flat untyped bag; we split it into separate fields so you can filter on them.
- 🧩 **Server-side filters** — date posted, job type, workplace type and salary floor are applied by Indeed, so you don't pay to fetch rows you'd throw away.
- ⚡ **No browser** — the run reads Indeed's API, so it needs 512 MB and finishes in minutes instead of hours.
- 📄 **Full descriptions** — optional per-job detail fetch for the complete description in both text and HTML.

### Use cases

**ATS and job-board feeds** — Structured salary (min, max, currency, pay period) rather than a free-text string is what makes listings comparable and sortable. Full description in both text and HTML means the same row serves a parser and a rendered job page.

**Salary benchmarking by role and market** — Ten country storefronts from one input makes it practical to compare what a title pays in the US against the UK, Germany, or Australia without running four different tools.

**Competitor hiring intelligence** — What a company is hiring for, and where, is a reliable read on what it's building. Workplace type, posting dates, and the `is_high_volume_hiring` flag show whether a team is expanding or backfilling.

**Recruitment lead generation** — Companies posting heavily in a niche are the ones with budget to fill roles. Every row carries the company's own website, industry and size tier, so a job feed doubles as a lead list without a second enrichment step.

**Mapping and radius analysis** — `latitude`/`longitude` on every job means results plot straight onto a map, or filter by true distance rather than by matching a location string.

### How to scrape Indeed jobs

1. Click **Try for free** and open the actor.
2. Enter one or more `search_queries` **or** paste `search_urls`.
3. Choose your `country` (59 storefronts — see the list below) and optional `location`.
4. Optional: add filters (`job_type`, `workplace_type`, `date_posted`, `salary_min`).
5. Click **Start** and watch results stream into the dataset.
6. Export as **JSON, CSV, or Excel**, or pull from the [Apify API](https://docs.apify.com/api/v2).

Search by keyword:

```json
{
  "search_queries": ["python developer"],
  "country": "US",
  "location": "New York",
  "date_posted": "week",
  "max_results": 200
}
```

Scrape a filtered search URL (country auto-detected from the host):

```json
{
  "search_urls": ["https://uk.indeed.com/jobs?q=data+scientist&l=London&sc=0kf%3Aattr(DSQF7)%3B"],
  "fetch_descriptions": true
}
```

### Indeed scraper input

| Field | Type | Default | Description |
|---|---|---|---|
| `search_queries` | string\[] | — | Keywords to search. At least one of queries or URLs is required. |
| `search_urls` | string\[] | — | Pre-built Indeed search URLs; country auto-detected from the host. |
| `country` | enum | `US` | Storefront — 59 supported (see below). Each maps to a country TLD (US → indeed.com, GB → uk.indeed.com, SG → sg.indeed.com). |
| `location` | string | — | City, state, postcode, or `Remote`. |
| `job_type` | enum | — | full-time, part-time, contract, temporary, internship. |
| `workplace_type` | enum | — | remote, hybrid, on-site. |
| `date_posted` | enum | — | 24h, 3d, week, 2weeks. |
| `salary_min` | int | — | Annual salary floor, in the country's currency. |
| `fetch_descriptions` | bool | `true` | Fetch the detail page for each job's full description (text + HTML). |
| `max_results` | int | `200` | Cap across all queries (hard limit 10,000). |
| `max_concurrency` | int | `8` | In-flight requests (1–20). Higher = faster but more blocking risk. |
| `max_requests_per_minute` | int | `60` | Request-rate ceiling across all workers. |
| `request_delay` | int | `0` | Fixed delay (seconds) between requests. |
| `proxyProvider` | object | Apify residential | `default` (residential proxy **included**), `dataimpulse`, `apify`, `custom` (uses `proxyUrls`), or `disabled`. |
| `proxyUrls` | object | Apify residential | Your own gateway URLs, one per entry. Only read when `proxyProvider` is `custom`. |
| `proxy` | object | Apify residential | Proxy configuration (see below). |

### Indeed job data output

Each job is one dataset row. Sample from a live run:

```json
{
  "job_id": "a499aa89f203fdc0",
  "url": "https://www.indeed.com/viewjob?jk=a499aa89f203fdc0",
  "title": "Senior Data Engineer",
  "company_name": "Wells Fargo",
  "company_url": "https://www.indeed.com/cmp/Wells-Fargo",
  "company_rating": 3.6,
  "company_review_count": 47727,
  "company_logo_url": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/0eeb19f54dae27ec1c6fcf27c9e62781",
  "company_id": "8b979ddd69dc88d9",
  "company_tier": "ENTERPRISE",
  "company_website": "https://www.wellsfargojobs.com/en/well-life/",
  "company_twitter": "https://twitter.com/WellsFargo",
  "company_instagram": "https://www.instagram.com/wellsfargo",
  "company_facebook": "https://www.facebook.com/wellsfargo",
  "company_industry": null,
  "company_ceo": "Charlie Scharf, CEO and President",
  "company_hq": "San Francisco, CA",
  "rating_count": 47726,
  "rating_work_life_balance": 3.6,
  "rating_management": 3.3,
  "location": "Iselin, NJ 08830",
  "workplace_type": "hybrid",
  "employment_type": "Full-time",
  "latitude": 40.56443,
  "longitude": -74.32623,
  "city": "Iselin",
  "region": "NJ",
  "postal_code": "08830",
  "ref_num": "JOB_POSTING-3-942563_LOCATION_JP109348",
  "employer_url": "https://wd1.myworkdaysite.com/recruiting/wf/WellsFargoJobs/job/CHARLOTTE-NC/Senior-Data-Engineer_R-555078",
  "occupations": ["Data & Database Occupations", "Technology Occupations", "Data Developers"],
  "language": "en",
  "is_expired": false,
  "is_urgent_hire": false,
  "is_high_volume_hiring": false,
  "salary_min": 100000.0,
  "salary_max": 196000.0,
  "salary_currency": "USD",
  "salary_period": "yearly",
  "salary_raw": "$100,000 - $196,000 a year",
  "description_text": "About this role:\n\nWells Fargo is seeking a Senior Data Engineer within the Commercial & Corporate & Investment...",
  "description_html": "<div><p><b>About this role:</b></p><p></p><p>\nWells Fargo is seeking a Senior Data Engineer...</p></div>",
  "posted_relative": "Today",
  "posted_iso": "2026-08-10T05:00:00Z",
  "apply_url": "http://www.indeed.com/rc/clk?jk=a499aa89f203fdc0&bb=L7_w5bPNrKxToieJbdKwVASLRF7...",
  "country": "US",
  "scraped_at": "2026-08-10T18:21:20+00:00"
}
```

| Field | Description |
|---|---|
| `job_id`, `url` | Indeed job key and canonical view URL. |
| `title`, `company_name` | Always present (empty-value cards are dropped, not shipped). |
| `company_url`, `company_rating`, `company_review_count`, `company_logo_url` | Company page, star rating, review count and logo. |
| `company_id`, `company_tier` | Indeed's own employer key (a stable join key across jobs) and the employer's plan tier (`ENTERPRISE`, `FREE`, …). |
| `company_website`, `company_twitter`, `company_instagram`, `company_facebook` | The employer's own site and social profiles, where Indeed holds them. |
| `company_industry`, `company_ceo`, `company_hq` | Firmographics from the Indeed company profile. |
| `rating_count`, `rating_work_life_balance`, `rating_management` | Rating breakdown behind the headline `company_rating`. |
| `location`, `workplace_type`, `employment_type` | Job metadata. `workplace_type` is `remote`/`hybrid`/`on-site`; `employment_type` is Full-time, Contract, Internship, etc. |
| `latitude`, `longitude`, `city`, `region`, `postal_code` | Resolved geo for the posting. |
| `ref_num` | The **employer's own** requisition ID from their ATS — the key to join against an internal system. |
| `employer_url` | The job on the employer's own careers site (Workday, Greenhouse, …), as opposed to `apply_url`'s Indeed redirect. |
| `occupations` | Indeed's normalized occupation taxonomy for the role. |
| `skills` | Skills the posting asks for, e.g. `Python`, `Terraform`, `Communication skills`. |
| `benefits` | Benefits offered, e.g. `Health insurance`, `401(k) matching`, `Paid time off`. |
| `education` | Education requirements, e.g. `Bachelor's degree in computer science`. |
| `certifications` | Licences and certifications, e.g. `RN License`, `Driver's License`. |
| `schedule` | Shift pattern, e.g. `Monday to Friday`, `Night shift`, `On call`. |
| `experience_level` | `Entry level`, `Mid-level` or `Senior level` (the most senior stated). |
| `experience_years` | Years of experience required, as an integer. |
| `language`, `is_expired` | Posting language and whether Indeed has expired the listing. |
| `is_urgent_hire`, `is_high_volume_hiring` | Indeed's hiring-demand signals. |
| `salary_min`, `salary_max`, `salary_currency`, `salary_period`, `salary_raw` | Structured salary plus the original text. |
| `description_text`, `description_html` | Full description (only when `fetch_descriptions` is on). |
| `posted_relative`, `posted_iso`, `apply_url` | Posting metadata. |
| `country`, `scraped_at` | Storefront and capture timestamp. |

Fields Indeed doesn't surface on a given job are emitted as `null` rather than fabricated — fill rates are tracked over time and extractors are added as patterns stabilize.

### How much it costs

This actor uses **pay-per-event** pricing — you pay for what you scrape, not for time.

| Event | USD |
|---|---|
| Actor start (per GB memory) | $0.0005 |
| Job scraped — Free / Bronze | $0.00007 |
| Job scraped — Silver and above | $0.00006 |

| Typical run (default 512 MB) | Cost |
|---|---|
| 200 jobs | ~$0.02 |
| 1,000 jobs | ~$0.07 |
| 10,000 jobs | ~$0.70 |
| 100,000 jobs | ~$7.00 |

The run defaults to 512 MB, so the start fee is a single $0.0005 event however long the run is. No browser is launched, so what you pay is the per-job price, not compute time.

### Recommended proxies for Indeed

**A proxy is optional.** The `proxy` input prefills **Apify Proxy residential**, which works out of the box, but the API path does not depend on it. Residential IPs are worth keeping on large runs — Indeed rate-limits them far less aggressively than datacenter ranges.

If you run your own scrapers outside Apify and need residential proxies for job boards, we use **[DataImpulse](https://dataimpulse.com/?aff=404588\&utm_source=apify)** (referral link) — pay-as-you-go residential IPs with per-country targeting and no monthly minimum.

### Why this Indeed scraper

- **Richer rows than a SERP scrape** — geo coordinates, employer requisition ID, the company's own website and socials, industry, size tier and the direct ATS link all come back on the same row, because the actor reads Indeed's API rather than parsing the search page.
- **Filters cost you nothing** — date, job type, workplace type and salary floor are applied by Indeed before results are returned, so you aren't billed for rows you'd discard client-side.
- **Fast and small** — no browser, no CAPTCHA service, 512 MB. Runs finish in minutes, which is why the run-start fee is one event rather than four.
- **Structured salary** — min/max/currency/period parsed from raw pay text, with the original string kept as `salary_raw`.
- **Two input modes** — keyword search or a pasted, pre-filtered search URL with the country auto-detected.
- **Validated output** — every row is Pydantic-validated; mis-extracted cards (empty title/company, inverted salary range, out-of-range rating) are dropped, not shipped.
- **Open source** — the underlying `indeed-scraper` Python package ships a Typer CLI and a FastAPI server; the Apify wrapper is a thin layer.

### FAQ

**How fast is a run?** A 200-job run with full descriptions takes a few minutes; the actor reads Indeed's API, so there is no page render and no CAPTCHA step. If you need it faster, raise `max_requests_per_minute` and `max_concurrency`; if you see blocks, lower them.

**How does this scraper handle Cloudflare?** It doesn't have to — the API path this actor uses isn't behind Cloudflare's challenge, and no browser or third-party CAPTCHA service is involved.

**Which proxies work best for Indeed?** A proxy is optional and Apify residential works out of the box. On large runs prefer residential IPs with per-country targeting — datacenter ranges get rate-limited sooner. For your own scrapers we recommend [DataImpulse](https://dataimpulse.com/?aff=404588\&utm_source=apify).

**Which countries are supported?** 59 storefronts:

United States (US), United Kingdom (GB), Canada (CA), Australia (AU), Ireland (IE), Germany (DE), France (FR), Italy (IT), Netherlands (NL), Spain (ES), United Arab Emirates (AE), Argentina (AR), Austria (AT), Belgium (BE), Bahrain (BH), Brazil (BR), Switzerland (CH), Chile (CL), Colombia (CO), Costa Rica (CR), Czechia (CZ), Denmark (DK), Ecuador (EC), Egypt (EG), Finland (FI), Greece (GR), Hong Kong (HK), Hungary (HU), Indonesia (ID), Israel (IL), India (IN), Japan (JP), South Korea (KR), Kuwait (KW), Luxembourg (LU), Mexico (MX), Malaysia (MY), Nigeria (NG), Norway (NO), New Zealand (NZ), Oman (OM), Panama (PA), Peru (PE), Philippines (PH), Pakistan (PK), Poland (PL), Portugal (PT), Qatar (QA), Romania (RO), Saudi Arabia (SA), Sweden (SE), Singapore (SG), Thailand (TH), Turkey (TR), Taiwan (TW), Ukraine (UA), Uruguay (UY), Vietnam (VN), South Africa (ZA)

Each maps to a country-specific Indeed TLD. Need another? Open an issue — adding one is a small change.

**Can I just paste an Indeed search URL?** Yes. Use `search_urls` after applying filters on Indeed.com. The country is auto-detected from the URL host (e.g. `uk.indeed.com` → GB), so you don't need to set `country` separately.

**Why are some fields empty?** They simply aren't on every listing: roughly a fifth of jobs carry no employment-type chip, and not every employer has a company profile. Missing fields are emitted as `null` rather than fabricated.

**Is scraping Indeed legal?** This actor collects only publicly available job-listing data. You are responsible for complying with Indeed's terms and applicable laws. Do not collect personal data without a lawful basis.

### Rate this actor ⭐

If the Indeed Job Scraper saved you time, please **leave a review on its Apify Store page** — ratings help other people find it and tell us what to build next. Hit a bug or missing field? Open an issue or contact us through the actor's **Issues** tab and we'll fix it fast — recency and reliability are what keep this actor ranking.

### Related actors

Building a full job-market pipeline? Pair this actor with our other scrapers — same proxy config format, same Pydantic-validated output, all open source.

- **[LinkedIn Jobs Scraper](https://apify.com/herus13/linkedin-jobs-scraper)** — scrape LinkedIn job listings with company enrichment, salary, and recruiter info. The natural pair for cross-board coverage.
- **[LinkedIn Profile Scraper](https://apify.com/herus13/linkedin-profile-scraper)** — scrape LinkedIn profiles for sourcing and recruitment lead-gen.
- **[TikTok Shop Product Scraper](https://apify.com/herus13/tiktok-shop-scraper)** — e-commerce product and pricing intelligence.

# Actor input Schema

## `search_queries` (type: `array`):

<p>Keywords to search on Indeed. Each query opens <code>https://&lt;country&gt;.indeed.com/jobs?q={keyword}</code> and paginates through results.</p><p>Examples: <code>python developer</code>, <code>data scientist</code>, <code>product manager</code></p>
## `search_urls` (type: `array`):

<p>Pre-built Indeed search URLs (paste from your browser after applying filters on Indeed.com). Country is auto-detected from the URL host.</p>
## `country` (type: `string`):

<p>Indeed regional storefront — 59 supported, including the United States, United Kingdom, Germany, France, Japan, India, Singapore, Brazil, Mexico and Australia. Each maps to a country-specific TLD (US -> indeed.com, GB -> uk.indeed.com, JP -> jp.indeed.com).</p>
## `location` (type: `string`):

<p>Location filter — city, state, postcode, or 'Remote'. Example: <code>New York</code>, <code>London</code>, <code>Remote</code>.</p>
## `job_type` (type: `string`):

Filter by employment type.

## `workplace_type` (type: `string`):

Filter by workplace type: remote, hybrid, or on-site. Leave blank for any.

## `date_posted` (type: `string`):

Restrict results to jobs posted within this window (24 hours, 3 days, last week, last 2 weeks). Leave blank for any time.

## `salary_min` (type: `integer`):

Filter to listings paying at least this much (interpreted as annual salary in the country's currency).

## `fetch_descriptions` (type: `boolean`):

<p>For each job card, also fetch the detail page and extract the full description (text + HTML). Doubles the request count but is required for description fields.</p>
## `max_results` (type: `integer`):

Cap on jobs returned across all queries combined. Hard cap 10000.

## `request_delay` (type: `integer`):

Fixed delay inserted between requests. 0 = no added delay (rate is still capped by Max Requests Per Minute).

## `max_concurrency` (type: `integer`):

Maximum number of in-flight HTTP requests. Higher = faster but more likely to trigger rate limiting. Recommended: 4-10.

## `max_requests_per_minute` (type: `integer`):

Hard ceiling on request rate across all workers. Lowering this reduces blocking risk on residential proxies.

## `proxyProvider` (type: `string`):

<b>Default</b> routes the run through DataImpulse residential IPs (falling back to Apify Proxy) and is <b>included in the price of the run</b>. <b>Custom</b> uses the proxy URLs you enter below; <b>Apify Proxy</b> uses the proxy configuration below; <b>No proxy</b> connects directly. Leave this empty to keep the behaviour this actor already had — nothing is imposed on a run that does not choose.

## `proxyUrls` (type: `array`):

Only read when <b>Proxy provider</b> is <b>Custom</b>. One gateway URL per entry, e.g. <code>http://user:pass@host:port</code> — works with any provider that issues URLs (BrightData, Oxylabs, SmartProxy, your own). Leave empty for any other Proxy provider.

## `proxy` (type: `object`):

<p>Indeed's API tolerates datacenter IPs, but residential IPs are rate-limited far less aggressively on large runs.</p><p><strong>You do not need to supply a proxy.</strong> Leaving this as-is (or picking Apify Proxy) routes the run through this actor's own managed residential pool — the Apify selection is a fallback, used only if the managed pool is unavailable, so an Apify Proxy selection here usually does <em>not</em> bill Apify residential traffic. Choosing your own BrightData / Oxylabs / SmartProxy / custom URLs overrides that entirely and is used exactly as given.</p>

## Actor input object example

```json
{
  "search_queries": [
    "python developer"
  ],
  "country": "US",
  "fetch_descriptions": true,
  "max_results": 200,
  "request_delay": 0,
  "max_concurrency": 8,
  "max_requests_per_minute": 60,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

List of Indeed job listings with title, company, structured salary, location, full description, posting date, geo coordinates, company enrichment (website, socials, industry, CEO, size tier), employer requisition ID, direct employer job URL, occupation taxonomy and hiring-demand flags. Geo and company enrichment fields are populated in API search mode only.

# 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 = {
    "search_queries": [
        "python developer"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("herus13/indeed-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 = {
    "search_queries": ["python developer"],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("herus13/indeed-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 '{
  "search_queries": [
    "python developer"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call herus13/indeed-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,herus13/indeed-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/veJKKZIQ7nHdKRhqo/builds/pdqSooF7Khg3q4c8d/openapi.json
