# Indeed Jobs API | Search Listings, Salaries, Descriptions (`johnvc/indeed-jobs-api`) Actor

Indeed job listings as clean, structured JSON. Search by keyword and location on any Indeed country site, list every job on a company page, or fetch exact job URLs. Get title, company, pay, type, benefits, apply link, and the full description as Markdown, text, or HTML. MCP-ready.

- **URL**: https://apify.com/johnvc/indeed-jobs-api.md
- **Developed by:** [John](https://apify.com/johnvc) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.43 / 1,000 job returneds

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 API for Job Listings, Salaries and Descriptions

An **indeed api** for live [Indeed](https://www.indeed.com) job listings as clean, structured JSON.
Search by keyword and location, collect jobs from a search URL you already hold, or list every role
on a company jobs page. Every row includes structured pay, listing flags, and the full description
as Markdown, plain text, or HTML. Not affiliated with, endorsed by, or connected to Indeed.

### What this API returns

| Field | What it is |
| --- | --- |
| `jobTitle`, `companyName` | The role and who is hiring |
| `location`, `city`, `state`, `postalCode`, `country` | Where the job is |
| `isRemote`, `workModel` | Remote or hybrid, as the listing states it |
| `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryCurrency`, `salaryIsEstimated` | Structured pay range, plus `salaryText` exactly as written |
| `jobType`, `benefits`, `shiftSchedule` | Employment type and what the posting promises |
| `isEasyApply`, `isSponsored`, `isUrgentlyHiring`, `isHiringMultiple`, `isNew` | Listing flags for filtering and prioritising |
| `companyRating`, `companyReviewsCount`, `companyLogo`, `companyUrl` | Employer reputation and pages |
| `companyIndustry`, `companySize`, `companyRevenue`, `companyHeadquarters`, `companyDescription` | Optional company details (see below) |
| `datePosted`, `datePostedText` | ISO timestamp plus the human form ("5 days ago") |
| `applyUrl`, `jobUrl` | Direct apply link and the canonical posting |
| `descriptionMarkdown` / `descriptionText` / `descriptionHtml` | The full description, your format |
| `summary` | One-line plain-language digest, handy for AI agents |

### Use cases

- **Recruiters** benchmarking pay and competition for a role in a specific market (salary api depth on every row)
- **Job seekers and career tools** watching new postings for a role and location, sorted by date
- **Market researchers** measuring hiring volume by employer, title, region or work model
- **Sales teams** spotting companies that are actively hiring as a growth signal (job board api style watch on a company page)
- **AI agents** that need job data as structured, readable Markdown

### Indeed API as a jobs API: listings as structured JSON

This Actor is a **jobs api**: one call returns one flat row per job, ready for CSV, Sheets, a CRM, or
an agent. You pay per job returned. Empty runs and failed inputs are free. There is no start fee and no
minimum charge.

### Job Search API: keyword, location and filters

**Job search api** mode (`mode=search`) is the default. Pass `keywords` plus an optional `location`,
then filter with job type, remote or hybrid, experience level, date posted, sort by newest, easy apply,
a yearly pay floor (`minPay`), and a location radius. Set `country` to pick which Indeed country site
to read (US, GB, CA, AU, IN, DE, FR and about 55 more).

### Job Posting API: collect from URLs you already hold

**Job posting api** mode (`mode=url`) takes `jobUrls`: Indeed search-results pages (filters kept) or
individual viewjob links. Prefer a fresh search-results URL for demos; individual postings expire.
`mode=company` takes `companyJobUrls` such as `https://www.indeed.com/cmp/<slug>/jobs` and lists every
open role on that page.

### Input parameters

| Parameter | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `mode` | string enum | yes | `search` | `search`, `url`, or `company` |
| `keywords` | string list | no | - | Search keywords (search mode). Up to 5 per run. |
| `location` | string | no | - | City, region, zip, or `Remote` (search mode). |
| `country` | string | no | `US` | Two-letter Indeed country code. |
| `domain` | string | no | - | Optional host override (`www.indeed.com`, `uk.indeed.com`, ...). |
| `datePosted` | string enum | no | any | Last 24 hours, 3 / 7 / 14 days. |
| `jobType` | string list | no | - | fulltime, parttime, contract, temporary, internship, permanent, new\_grad, commission. |
| `remote` | string enum | no | `any` | `any`, `remote`, or `hybrid`. |
| `experienceLevel` | string enum | no | any | `entry`, `mid`, or `senior`. |
| `sortBy` | string enum | no | `relevance` | `relevance` or `date` (newest first). |
| `easyApplyOnly` | boolean | no | false | Only Easy Apply postings. |
| `minPay` | integer | no | - | Yearly pay floor; other periods converted. |
| `locationRadiusMiles` | integer | no | site default | 0 to 100 miles. |
| `jobUrls` | string list | no | - | Job or search URLs (url mode). Up to 100. |
| `companyJobUrls` | string list | no | - | Company jobs page URLs (company mode). Up to 10. |
| `maxResultsPerInput` | integer | no | 50 | Cap per keyword, search URL, or company page (1 to 1000). |
| `uniqueJobsOnly` | boolean | no | true | Dedupe jobs within a run. |
| `includeCompanyDetails` | boolean | no | false | Optional add-on for employer industry, size, revenue, HQ, and profile text. Charged once per distinct employer when details are found. Leave off unless the add-on is enabled for your account. |
| `descriptionFormat` | string enum | no | `markdown` | `markdown`, `text`, `html`, or `all`. |

### Example output

```json
{
  "result_type": "job",
  "jobId": "c5f86dd00cb355b5",
  "jobTitle": "Junior Data Analyst",
  "companyName": "Anovaeon, LLC",
  "companyUrl": "https://www.indeed.com/cmp/Anovaeon%2C-LLC-1",
  "companyRating": 5,
  "companyReviewsCount": 2,
  "location": "Remote",
  "city": "Remote",
  "country": "US",
  "domain": "www.indeed.com",
  "jobUrl": "https://www.indeed.com/viewjob?jk=c5f86dd00cb355b5",
  "applyUrl": "https://www.indeed.com/applystart?jk=c5f86dd00cb355b5&from=jobsearch",
  "datePosted": "2026-08-26T19:46:53.000Z",
  "datePostedText": "12 days ago",
  "jobType": "Full-time",
  "salaryText": "$60,000 - $65,000 a year",
  "salaryMin": 60000,
  "salaryMax": 65000,
  "salaryPeriod": "YEARLY",
  "salaryCurrency": "USD",
  "salaryIsEstimated": false,
  "isRemote": true,
  "workModel": "Remote",
  "shiftSchedule": ["Holidays", "Weekends as needed"],
  "isExpired": false,
  "isSponsored": false,
  "isEasyApply": true,
  "isUrgentlyHiring": false,
  "isHiringMultiple": false,
  "isNew": false,
  "descriptionMarkdown": "The Junior Data Analyst supports the collection, cleaning, analysis, and reporting of business data ...",
  "searchKeyword": "data analyst",
  "searchLocation": "Remote",
  "sourceInput": "data analyst",
  "summary": "Junior Data Analyst at Anovaeon, LLC in Remote. Pay: $60,000 - $65,000 a year. Full-time. Remote. Posted 12 days ago."
}
```

### Pricing

You pay per job returned, and nothing else: no start fee and no minimum. A run that returns
**no jobs is never charged**, and rows that report a failed input, such as a posting that has been
taken down, are never charged either.

Company details are an optional add-on, charged once per distinct employer whose details were
added, only when `includeCompanyDetails` is on and details were found. See the Pricing tab for the
current rates.

### Speed and result limits

Results come straight from the live site, so nothing is served from a stale cache. Keywords run
in parallel, and a typical 50-job search finishes in about a minute; a few hundred jobs take a few
minutes. If you ask for more than can finish in the time available, the run trims itself and says
so in the log rather than being cut off part way.

### How to get started

1. Open the Actor on [Apify](https://apify.com/johnvc/indeed-jobs-api?fpr=9n7kx3)
2. Pick a mode, fill in the keywords or URLs, choose your filters, and click Start
3. Grab the results as JSON, CSV, or Excel, or via the API

[View on Apify Store](https://apify.com/johnvc/indeed-jobs-api?fpr=9n7kx3)

### 🔌 Use this API from Claude (MCP)

This Actor is MCP-ready, so [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial) and
[Claude Cowork](https://claude.ai/referral/uIlpa7nPLg) (free trial) and other AI agents can call it
directly. See the [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp).

Add this MCP server URL:

```
https://mcp.apify.com/?tools=actors,docs,johnvc/indeed-jobs-api
```

Then just ask: *"Find remote Python developer jobs posted in the last week, sorted by date, with
salary."*

https://www.youtube.com/watch?v=jREWahDGhJM

### 💸 Pay per run with crypto (x402)

Prefer to pay per call in USDC instead of holding an account balance? This Actor is reachable over
the x402 payment standard, which lets an agent settle each run on-chain with no subscription.

See the [Apify x402 documentation](https://docs.apify.com/platform/integrations/x402) for setup.

### Output views

The dataset ships with four ready-made views, so you can jump straight to what you need:

- **Job listings** - title, company, location, remote flag, pay, type, posted date, easy apply
- **Pay and benefits** - structured pay range and period next to type, remote flag and benefits
- **Hiring employers** - rating, review count, industry, size, revenue, headquarters and website
- **Full descriptions** - the complete description with qualifications, benefits and apply link

### 🔌 Integrations: Automate Job Listing Monitoring

A single run answers one question. The real value comes from running it repeatedly: watch a role and
location for new postings, track a company's open jobs week over week, and pipe fresh rows into Sheets,
Slack, or your own database. Wire it through [Apify platform integrations](https://docs.apify.com/platform/integrations)
without running your own servers.

#### Tasks + Schedules: register a regular monitoring run

The core pattern is **one [saved task](https://docs.apify.com/platform/actors/running/tasks) per search
or company you care about, one [schedule](https://docs.apify.com/platform/schedules) across all of them**.

1. **Create a task.** Save the Actor with a fixed input, for example remote "software engineer" jobs
   sorted by date, or a specific `companyJobUrls` page. Click **Create empty task** on the Actor page,
   fill the input, and save.
2. **Attach a schedule.** From the Actor's **Actions**, then **Schedule**, or from Console Schedules,
   add a cron: `0 7 * * *` (daily 7 AM), `0 */6 * * *` (every 6 hours), or `0 9 * * 1` (Mondays at 9 AM).
   One schedule can trigger many tasks.
3. **Review the history.** Each run appends rows to the task dataset. Export JSON, CSV, or Excel when
   you need a snapshot.

Keep `maxResultsPerInput` modest on shared proxy capacity (for example 25 for demos, 1 for keep-alive).

#### n8n

Use the [Apify n8n integration](https://docs.apify.com/platform/integrations/n8n) to run this Actor from
a workflow. A typical alert flow: **Schedule Trigger** → Apify **Run Actor and get dataset** → Filter
(new or matching roles) → Slack or email. A dedicated community node may land later; until then the
official Apify node is the supported path.

#### Make and Zapier

[Make](https://docs.apify.com/platform/integrations/make) and
[Zapier](https://docs.apify.com/platform/integrations/zapier) both support Apify Run Actor and Get
Dataset Items. Same pattern: schedule, run, filter, notify or store.

#### Supabase: store listing history

Accumulate job rows in [Supabase](https://supabase.com/) (or any Postgres):

- **No code:** n8n Apify node → Supabase node, insert one row per job.
- **Python:** run the Actor and bulk-insert flat fields.

```python
from apify_client import ApifyClient
from supabase import create_client

apify = ApifyClient("YOUR_APIFY_TOKEN")
supabase = create_client("https://YOUR_PROJECT.supabase.co", "YOUR_SERVICE_ROLE_KEY")

run = apify.actor("johnvc/indeed-jobs-api").call(
    run_input={
        "mode": "search",
        "keywords": ["software engineer"],
        "location": "Austin, TX",
        "maxResultsPerInput": 25,
        "descriptionFormat": "markdown",
    }
)

rows = []
for item in apify.dataset(run["defaultDatasetId"]).iterate_items():
    if item.get("result_type") != "job":
        continue
    rows.append(
        {
            "job_title": item.get("jobTitle"),
            "company_name": item.get("companyName"),
            "location": item.get("location"),
            "salary_min": item.get("salaryMin"),
            "salary_max": item.get("salaryMax"),
            "apply_url": item.get("applyUrl"),
            "date_posted": item.get("datePosted"),
        }
    )
if rows:
    supabase.table("indeed_jobs").insert(rows).execute()
```

#### MCP and AI agents

Apify exposes this Actor on the [Apify MCP server](https://mcp.apify.com/), so
[Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial), Cursor, and other MCP clients can
ask for live jobs and get structured rows back. See the dedicated MCP section above for the server URL.

#### Webhooks

Attach an [Apify webhook](https://docs.apify.com/platform/integrations/webhooks) to
`ACTOR.RUN.SUCCEEDED` when a scheduled run finishes. Your endpoint receives the run details (including
the dataset ID) and can push to Sheets, Slack, or any custom handler.

### Related tools

- [Indeed Company API](https://apify.com/johnvc/indeed-company-api?fpr=9n7kx3) - employer profiles,
  ratings and firmographics by company page, keyword, or industry and state
- [Google Jobs Scraper](https://apify.com/johnvc/google-jobs-scraper---pay-per-result?fpr=9n7kx3) -
  the same kind of structured job rows from Google Jobs
- [LinkedIn Jobs API](https://apify.com/johnvc/linkedin-jobs-api?fpr=9n7kx3) - job listings from
  LinkedIn
- [Indeed Jobs Scraper (cheap\_scraper)](https://apify.com/cheap_scraper/indeed-job-scraper?fpr=9n7kx3) -
  a thinner keyword-only Indeed listing Actor for comparison

### ❓ FAQ

#### Does Indeed have an API?

Indeed's own partner API is limited to approved businesses. This Actor is a separate **indeed api** on
Apify that reads public [Indeed](https://www.indeed.com) listing pages and returns structured JSON. It
is not Indeed's official product and is not affiliated with Indeed.

#### How do you use the Indeed API without a partner key?

Open [johnvc/indeed-jobs-api](https://apify.com/johnvc/indeed-jobs-api?fpr=9n7kx3), pick `search`,
`url`, or `company`, set filters, and run. No Indeed partner program or API key is required. You need
an Apify account to run Actors.

#### Is the Indeed API free?

This Actor is pay-per-result on Apify's free tier and paid plans. Empty runs cost nothing. See the
Pricing tab for current event rates. Relative phrasing only: there is no start fee and no minimum
charge.

#### How do you get job listings in JSON?

Every successful run writes one dataset row per job. Export as JSON, CSV, or Excel from the dataset, or
fetch via the [Apify API](https://docs.apify.com/api/v2).

#### How do you get salary data from job postings?

Each row includes `salaryText` as written plus structured `salaryMin`, `salaryMax`, `salaryPeriod`,
and `salaryCurrency`, with `salaryIsEstimated` when the range is an estimate rather than the employer's
figure. That is the salary api surface on this Actor.

#### Does the Indeed Jobs API return the full job description?

Yes. Every job carries the complete description as Markdown by default, or as plain text, the original
HTML, or all three via `descriptionFormat`.

#### Which countries are supported?

About 60 Indeed country sites, selected with the two-letter `country` code: US, GB, CA, AU, IN, DE,
FR, NL, ES, IT, BR, MX, JP, SG and more.

#### Can I filter by job type, remote work or date?

Yes. Search mode supports job type, remote or hybrid, experience level, date posted, sort by newest,
easy apply, a yearly pay floor and a location radius.

#### Can I pass my own Indeed search URL?

Yes. URL mode accepts search-results URLs with your own filters, as well as individual job posting
URLs. Prefer search-results URLs for stable demos; viewjob links expire.

#### Can I schedule this Indeed Jobs API?

Yes. Save a [task](https://docs.apify.com/platform/actors/running/tasks) with your input, then attach
an [Apify schedule](https://docs.apify.com/platform/schedules) from **Actions → Schedule**. Useful
crons: `0 7 * * *` (daily 7 AM), `0 */6 * * *` (every 6 hours), `0 9 * * 1` (Mondays at 9 AM). One
schedule can trigger many tasks. See [Integrations: Automate Job Listing Monitoring](#-integrations-automate-job-listing-monitoring)
for the full monitoring recipe.

#### Should I use an API or a Web Scraper?

An official partner [API](https://en.wikipedia.org/wiki/API) is often gated, quota-bound, and missing
fields you need. A [web scraper](https://en.wikipedia.org/wiki/Web_scraping) or this Actor returns the
same public listing data as structured JSON you can call like an API, without a partner approval
process. This Actor leads with an API identity and MCP surface while still scraping public pages.

#### Can I integrate this Indeed Jobs Scraper with other apps?

Yes. Connect through [Apify integrations](https://docs.apify.com/platform/integrations):
[Make](https://docs.apify.com/platform/integrations/make),
[Zapier](https://docs.apify.com/platform/integrations/zapier),
[Slack](https://docs.apify.com/platform/integrations/slack), n8n, and
[webhooks](https://docs.apify.com/platform/integrations/webhooks) on `ACTOR.RUN.SUCCEEDED`. Full
recipes are in the Integrations section above.

#### Can I use this Actor with the Apify API?

Yes. Run, schedule, and fetch datasets through the Apify API and the `apify-client` packages for
Python and Node.js. Open the Actor's
[API tab](https://apify.com/johnvc/indeed-jobs-api/api?fpr=9n7kx3) for generated snippets.

#### Can I use this Actor through an MCP Server?

Yes. Add it as a tool via the [Apify MCP server](https://mcp.apify.com/) with
`https://mcp.apify.com/?tools=actors,docs,johnvc/indeed-jobs-api`. Works with
[Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial), Cursor, and other MCP clients. See
the [MCP docs](https://docs.apify.com/platform/integrations/mcp).

#### How else can I collect job data?

Related Actors in this portfolio:

- [Indeed Company API](https://apify.com/johnvc/indeed-company-api?fpr=9n7kx3)
- [Google Jobs Scraper](https://apify.com/johnvc/google-jobs-scraper---pay-per-result?fpr=9n7kx3)
- [LinkedIn Jobs API](https://apify.com/johnvc/linkedin-jobs-api?fpr=9n7kx3)

For a thinner Indeed-only keyword scraper, see
[cheap\_scraper/indeed-job-scraper](https://apify.com/cheap_scraper/indeed-job-scraper?fpr=9n7kx3).

#### Is the data fresh?

Every run reads the live site at request time; nothing is cached.

### 🌐 About Alpha OSINT

This Actor is part of [Alpha OSINT](https://alphaosint.com), a catalogue of open source
intelligence and web data tools. Browse the full set of data APIs there.

Last Updated: 2026.09.12

# Actor input Schema

## `mode` (type: `string`):

Search finds jobs from keywords, a location and filters. URLs collects exact postings or search-results pages you already hold. Company lists every job on an Indeed company jobs page.

## `keywords` (type: `array`):

Job titles or keywords to search, for example "software engineer" or "registered nurse". Each keyword is searched separately and they run in parallel. Indeed's own query syntax works: quotes for an exact phrase, a leading minus to exclude a word, title:("...") to match titles only. Used in search mode. Up to 5 per run. Need larger batches? Contact us and we can raise this limit for your account.

## `location` (type: `string`):

Where to search, for example "New York, NY", "Austin, TX", "90210" or "Remote". Leave empty to search the whole country. Used in search mode.

## `country` (type: `string`):

Two-letter country code of the Indeed site to search, for example US, GB, CA, AU, IN, DE, FR, NL, ES, IT, BR, MX, JP or SG. About 60 countries are supported; the matching country site is selected automatically.

## `domain` (type: `string`):

Optional override for the Indeed host, for example www.indeed.com, uk.indeed.com or fr.indeed.com. Leave empty and the correct host is chosen from the country code above.

## `datePosted` (type: `string`):

Only return jobs posted within this window. Leave as Any time for no date filter. Used in search mode.

## `jobType` (type: `array`):

Only return these employment types. Leave empty for all types. Each selected type is searched separately for every keyword, so several types cost more time than one. Used in search mode.

## `remote` (type: `string`):

Only return remote or hybrid roles. Leave as Any for all work arrangements. Used in search mode.

## `experienceLevel` (type: `string`):

Only return roles Indeed classifies at this level. Leave as Any for all levels. Used in search mode.

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

Relevance returns Indeed's best matches first. Date returns the newest postings first, which is the right choice for a scheduled watch. Used in search mode.

## `easyApplyOnly` (type: `boolean`):

Only return postings that accept Indeed's one-click apply. Used in search mode.

## `minPay` (type: `integer`):

Only return jobs whose stated pay is at least this much per year, in the local currency of the Indeed site being searched. Hourly, daily, weekly and monthly figures are converted to a yearly amount before comparing. Jobs that state no pay are left out when a floor is set. Leave empty for no pay filter. Used in search mode.

## `locationRadiusMiles` (type: `integer`):

How far from the location to search, in miles. Indeed offers 0, 5, 10, 15, 25, 35, 50 or 100; other values snap to the nearest. Leave empty for the site default. Used in search mode.

## `jobUrls` (type: `array`):

Indeed URLs to collect. A job posting URL such as https://www.indeed.com/viewjob?jk=1234567890abcdef returns that one job. A search-results URL such as https://www.indeed.com/jobs?q=nurse\&l=Dallas%2C+TX returns up to the result limit below, keeping every filter in the URL. Country sites such as fr.indeed.com are accepted. Used in URL mode. Up to 100 per run. Need larger batches? Contact us and we can raise this limit for your account.

## `companyJobUrls` (type: `array`):

Indeed company jobs pages, for example https://www.indeed.com/cmp/Semrush/jobs. Every job found on each page is returned, up to the result limit below. Used in company mode. Up to 10 per run. Need larger batches? Contact us and we can raise this limit for your account.

## `maxResultsPerInput` (type: `integer`):

How many jobs to return for each keyword or search URL in search and URL modes, or for each page in company mode. You are charged per job returned, so this is also your cost control. Ignored for single job URLs, which return one job each. A run that returns no jobs is never charged.

## `uniqueJobsOnly` (type: `boolean`):

Return each job once per run, even when several keywords or URLs find it. Turn off to keep duplicates and see which input found which job.

## `includeCompanyDetails` (type: `boolean`):

Add the employer's industry, size, revenue, headquarters and profile description to each job, from Indeed's company pages. Charged once per distinct employer on top of the per-job fee. Off by default.

## `descriptionFormat` (type: `string`):

How to return the job description. Markdown keeps the headings and bullet lists and is the most compact form for an AI agent to read. Plain text strips all formatting. HTML is the original rich text. All returns every format on the same row.

## Actor input object example

```json
{
  "mode": "search",
  "keywords": [
    "software engineer"
  ],
  "location": "Austin, TX",
  "country": "US",
  "datePosted": "",
  "jobType": [],
  "remote": "any",
  "experienceLevel": "",
  "sortBy": "relevance",
  "easyApplyOnly": false,
  "maxResultsPerInput": 50,
  "uniqueJobsOnly": true,
  "includeCompanyDetails": false,
  "descriptionFormat": "markdown"
}
```

# Actor output Schema

## `allResults` (type: `string`):

Every dataset item from this run.

## `jobs` (type: `string`):

One row per job with title, company, location, advertised pay, employment type, and posting date.

## `salaries` (type: `string`):

Advertised pay alongside employment type, shift schedule, and the benefits each posting lists.

## `employers` (type: `string`):

Employer view: company rating, review count, website, and the role being hired for.

## `descriptions` (type: `string`):

The complete job description with qualifications, benefits, and the apply link.

# 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 = {
    "keywords": [
        "software engineer"
    ],
    "location": "Austin, TX"
};

// Run the Actor and wait for it to finish
const run = await client.actor("johnvc/indeed-jobs-api").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 = {
    "keywords": ["software engineer"],
    "location": "Austin, TX",
}

# Run the Actor and wait for it to finish
run = client.actor("johnvc/indeed-jobs-api").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 '{
  "keywords": [
    "software engineer"
  ],
  "location": "Austin, TX"
}' |
apify call johnvc/indeed-jobs-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,johnvc/indeed-jobs-api"
        }
    }
}

```

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/lXNhuFdXgfOzO1mAE/builds/mlLMidAmAzpjf58GQ/openapi.json
