# Indeed jobs API — $0.001 per job

> Indeed jobs API: Indeed listings with structured salary ranges, per market. $0.001 per delivered job, nothing delivered means nothing charged.

[Home](https://quanticdata.io/)/[Collectors](https://quanticdata.io/collectors/)/*Indeed jobs API*

# Indeed jobs API

An Indeed jobs API with structured salary ranges: job key, title, employer, location, remote model, salary min, max and period, job types, posting age, snippet and employer rating — across 20 markets.

[Get my free API key](https://app.quanticdata.io/register) [See the request](/collectors/indeed-jobs-api/#integration)

$0.001 per delivered job · $2 free every month · Failed runs never billed

POST /v1/scraper/collectors/indeed_jobs/run

```
$ curl $QD/indeed_jobs/run \
    -H "Authorization: Bearer $QD_API_KEY" \
    -d '{"query": "data engineer", "location": "New York", "country": "us", "max_results": 50}'
{ "status": "done", "count": 50,
  "results": [
    {
      "job_key": "…",
      "title": "…",
      "company": "…",
      "location": "…" } ],
  "cost": 0.05 }
# 50 jobs × $0.001 · nothing delivered, nothing charged
```

**$0.001 / job**2,000 jobs on the free $2 every month

**Semantic input**query, location, posted_within_days — no URL lists

**Up to 300**jobs per run, pagination handled for you

**No browser**read over HTTP/TLS — cheaper and faster than rendering

On this page: [What it is](/collectors/indeed-jobs-api/#what) [Output fields](/collectors/indeed-jobs-api/#output) [Inputs](/collectors/indeed-jobs-api/#input) [Pricing](/collectors/indeed-jobs-api/#pricing) [Integration](/collectors/indeed-jobs-api/#integration) [Use cases](/collectors/indeed-jobs-api/#use-cases) [Versus the alternatives](/collectors/indeed-jobs-api/#compare) [FAQ](/collectors/indeed-jobs-api/#faq)

## What an Indeed jobs API does

Indeed's visible cards are a moving target: titles hide in aria labels and class names rotate. But every results page hydrates from one payload, and that payload is richer than the card — it carries the salary as a structured range, the remote-work model and the employer's rating.

This collector parses that payload, so rows survive the CSS churn and arrive with numbers you can filter on instead of strings like "$150,000 - $180,000 a year" to regex later.

Input is meaning, not a URL *query* *location* *posted_within_days* *country* *max_results*

## What one job looks like

Every delivered job carries these fields. Nullable means the source did not publish it — the field stays empty instead of being guessed.

| Field | Type | What it holds |
| --- | --- | --- |
| `rank` | integer | 1-based position across pages. |
| `job_key` | string | Indeed job key (dedupe key). |
| `title` | string | Job title. |
| `company` | string · nullable | Employer. |
| `location` | string · nullable | Location as shown. |
| `remote` | string · nullable | Remote model (REMOTE, REMOTE_HYBRID…). |
| `salary` | string · nullable | Salary as a readable string. |
| `salary_min` | number · nullable | Salary range minimum. |
| `salary_max` | number · nullable | Salary range maximum. |
| `salary_period` | string · nullable | yearly / monthly / hourly. |
| `job_types` | string[] | Employment types when tagged. |
| `posted` | string · nullable | Posting age ("11 days ago"). |
| `snippet` | string · nullable | Listing summary, HTML stripped. |
| `company_rating` | number · nullable | Employer rating on Indeed. |
| `company_reviews` | integer · nullable | Employer review count. |
| `sponsored` | boolean | True for paid placements. |
| `link` | string | Listing URL. |

## Inputs

The whole request. Anything you leave out falls back to the default shown in the catalog.

| Input | Type | Required | What it does |
| --- | --- | --- | --- |
| `query` | string | yes | Job title or keywords, e.g. "data engineer". |
| `location` | string | no | City, state or postcode, e.g. "New York". |
| `posted_within_days` | integer | no | Only listings posted in the last N days (1–30). |
| `country` | string | no | ISO 3166-1 alpha-2 code — picks the local site AND the proxy exit (default us). |
| `max_results` | integer | no | How many jobs to deliver at most (1–300). You pay only for delivered jobs. |

Pricing

## Indeed jobs API pricing

$0.001 per delivered job. A run that delivers nothing costs nothing: blocked pages, challenges and retries are on us, and the $2 monthly allowance covers about 2,000 jobs before you spend anything.

**$0.001**per delivered job*$1 per 1,000 delivered jobs*

**2,000 jobs**on the free allowance*$2 every month, no card*

**Zero rows**zero charge*blocks, captchas and retries are on us*

**−30%**on volume tiers*the catalog returns your key's price*

### Pay as you go

$0/mo

- $2 free credit / month

- 60 requests / min

- List unit prices

### Starter

$19/mo

- $15 free credit / month

- 300 requests / min

- 10% off unit prices

Most popular

### Growth

$79/mo

- $50 free credit / month

- 600 requests / min

- 20% off unit prices

### Scale

$299/mo

- $250 free credit / month

- 1,200 requests / min

- 30% off unit prices

Same wallet, same key and same $2 monthly allowance as every other [Data API](https://quanticdata.io/web-data-api-for-ai/). Prices are launch pricing read live from the billing config — `GET /v1/scraper/collectors` returns the price your key actually pays.

Integration

## One POST, typed rows

Base URL `https://api.quanticdata.io/v1`, Bearer auth, the same key as every other Data API. Endpoint: `POST /v1/scraper/collectors/indeed_jobs/run`.

```
curl -X POST https://api.quanticdata.io/v1/scraper/collectors/indeed_jobs/run \
  -H "Authorization: Bearer $QD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query":"data engineer","location":"New York","country":"us","max_results":50}'
```

```
import requests

r = requests.post(
    "https://api.quanticdata.io/v1/scraper/collectors/indeed_jobs/run",
    headers={"Authorization": f"Bearer {QD_API_KEY}"},
    json={
        "query": "data engineer",
        "location": "New York",
        "country": "us",
        "max_results": 50
    },
    timeout=120,
)
for row in r.json()["payload"]["results"]:
    print(row)
```

```
const res = await fetch(
  "https://api.quanticdata.io/v1/scraper/collectors/indeed_jobs/run",
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.QD_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({"query":"data engineer","location":"New York","country":"us","max_results":50}),
  },
);
const { payload } = await res.json();
console.table(payload.results);
```

```
claude mcp add quantumproxies \
  -e QUANTUMPROXIES_API_KEY=qd_live_your_key_here \
  -- npx -y quantumproxies-mcp

# then, in the chat:
> run the indeed_jobs collector with query="data engineer" and location="New York"
```

## What people build with the Indeed jobs API

Three shapes of work this endpoint was designed around.

### Compensation research

Aggregate real posted ranges by role, market and seniority.

### Labour-market tracking

Count openings per employer over time in a given city.

### Recruitment marketing

Benchmark your own postings against the local field.

## Indeed jobs API versus rolling your own

The differences that actually cost time when you build this in-house.

|  | DIY scraper | This collector |
| --- | --- | --- |
| Salary | A string to parse yourself | min, max and period as numbers |
| Card markup | Breaks on the next redesign | Read from the hydration payload |
| Remote | Guessed from the title | Indeed's own remote model field |

## Reading is closed, posting is open

Indeed's Publisher API — the one that once served listings to affiliates — was closed to new registrations and wound down. What remains is oriented around employers and applicant tracking partners: posting jobs, syncing them, managing sponsored campaigns. There is no current self-serve API for reading search results.

That direction is consistent across major job boards, because the listings are the product. For a compensation dataset the practical consequence is that public results are the available surface — and here the salary is parsed into minimum, maximum and period rather than handed over as "$120,000 - $150,000 a year" for a regex to fail on later.

## Limits, durability and the legal bit

Up to 300 jobs per run. Rows are parsed from the page's hydration payload rather than from CSS selectors, which is why Indeed's frequent restyling does not empty the dataset. `posted_within_days` filters at the source. Throughput is your plan's rate limit rather than anything about the collector: 60 requests/minute on pay-as-you-go, up to 1,200 on the top tier.

Collecting publicly visible data is generally lawful in most jurisdictions, and courts have repeatedly declined to treat reading a public page as unauthorised access. Indeed's terms restrict automated access, listings can name individual hiring contacts, and republishing listing text verbatim raises copyright questions that aggregate analysis does not. None of this is legal advice — get some for your actual use case.

## FAQ

Questions we get about the Indeed jobs API.

[Something else? Ask us →](mailto:hello@quanticdata.io)

### Which countries are covered?

Twenty Indeed markets, selected with `country`: US, UK, IE, CA, AU, IN, DE, FR, IT, ES, NL, SE, PL, BR, MX, JP, SG, AE, ZA.

### Do all listings have a salary range?

No — only where the employer posted one or Indeed extracted it. Those rows carry min, max and period; the rest have nulls, not invented numbers.

### Are sponsored listings marked?

Yes, paid placements are flagged on the row.

### Is there a free Indeed jobs API?

Every account gets $2 of credit every month with no card, which is about 2,000 delivered jobs on this endpoint at $0.001 each. It renews monthly, and a run that delivers nothing is never billed — so a failed or blocked attempt does not eat the allowance.

### How much does one run cost?

Multiply the rows you actually receive by $0.001. A run capped at 300 jobs — the maximum for this collector — costs $0.3 if every row comes back, and less when the source has fewer. Volume tiers take up to 30% off, and `GET /v1/scraper/collectors` returns the price your key actually pays.

### Why does the structured salary matter for a dataset?

Because listings quote pay hourly, weekly, daily and annually. With min, max and period as separate columns, aggregating across them is one query; with a display string it is a text-parsing project per locale and currency.

### Should I exclude sponsored listings?

For demand measurement, yes — sponsored volume tracks recruitment advertising budgets rather than hiring. Every row carries the flag, so keep it as a column and filter at analysis time rather than at collection.

## Run the Indeed jobs API now

$2 of free credit every month, no card. Your key returns its own prices from `GET /v1/scraper/collectors`.

[Get my free API key](https://app.quanticdata.io/register)

Related: [All 32 collectors](https://quanticdata.io/collectors/) [LinkedIn jobs API](https://quanticdata.io/collectors/linkedin-jobs-api/) [Google Jobs API](https://quanticdata.io/collectors/google-jobs-api/) [Company Data API](https://quanticdata.io/collectors/company-data-api/) [Documentation](https://quanticdata.io/docs/)

---

Source: https://quanticdata.io/collectors/indeed-jobs-api/ · Site index for AI: https://quanticdata.io/llms.txt
