# Indeed API for agents

> API for Agents · https://apiforagents.dev/platforms/indeed · HTML twin: https://apiforagents.dev/platforms/indeed

Job search and job listings from Indeed, by country.

Endpoint: `POST https://apiforagents.dev/v1/indeed`. One op per call. Quote first with `"estimateOnly": true`.

## Prices (USD per record, pay as you go)

| Record | Per record |
|---|---|
| jobs | $0.000045 |

## Operations

### search

Search Indeed the way a seeker would. Keyword and place, with Indeed's own filters. Every hit is a full posting with salary, skills and employer signals.

| Field | Required | Type | Meaning |
|---|---|---|---|
| query | yes | string (≤300 chars) |  |
| location | no | string (≤120 chars) |  |
| country | no | enum |  Values: US, GB, CA, AU, IN, DE, FR, JP, BR, MX, IT, ES, NL, BE, CH, AT, SG, HK, IE, NZ, AR, CL, CO. |
| workplace | no | list of enum | Indeed filters remote only; hybrid/onsite are not filterable there. Values: remote. |
| employmentType | no | list of enum |  Values: full_time, part_time, contract, internship, temporary. |
| postedWithin | no | enum |  Values: 1d, 3d, 7d, 15d, 30d, any. |
| sort | no | enum |  Values: relevance, newest. |
| limit | no | integer (1-100) |  |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| jobId | string |
| jobUrl | string |
| applyUrl | string |
| jobTitle | string |
| normalizedTitle | string |
| companyName | string |
| companyKey | string |
| company | any |
| jobDescription | string |
| employmentType | list of string |
| workplaceType | string |
| workSetting | list of string |
| shift | list of string |
| experienceLevel | string |
| educationLevel | string |
| salaryText | string |
| salaryMin | number |
| salaryMax | number |
| salaryCurrency | string |
| salaryPeriod | string |
| posted | string |
| applyStarts | string |
| city | string |
| state | string |
| country | string |
| postalCode | string |
| streetAddress | string |
| fullAddress | string |
| latitude | number |
| longitude | number |
| skills | list of string |
| certifications | list of string |
| benefits | list of string |
| eligibility | list of string |
| physicalRequirements | list of string |
| travel | list of string |
| occupation | string |
| occupationCategories | list of string |
| sponsored | boolean |
| urgentHire | boolean |
| highVolumeHiring | boolean |
| numberOfHires | string |
| employerResponseRate | number |
| employerAvgResponseTimeDays | number |
| employerResponsive | boolean |
| sourceName | string |
| sourceType | string |
| language | string |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/indeed \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"search","query":"software engineer","location":"Austin, TX","country":"US","postedWithin":"7d","limit":10}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "jobTitle": "Barista",
    "companyName": "Brewlab Coffee",
    "city": "Austin",
    "state": "TX",
    "country": "US",
    "employmentType": "Part-time",
    "workplaceType": "On-site",
    "salaryText": "$16 – $19 an hour",
    "salaryMin": 16,
    "salaryMax": 19,
    "salaryCurrency": "USD",
    "salaryPeriod": "hour",
    "posted": "2026-10-14",
    "jobId": "3889282693",
    "jobUrl": "https://www.indeed.com/barista-1000",
    "applyUrl": "https://www.indeed.com/barista-1000",
    "companyKey": "barista",
    "details": {}
  },
  {
    "jobTitle": "Shift Supervisor, Coffee Bar",
    "companyName": "Daily Grind",
    "city": "Austin",
    "state": "TX",
    "country": "US",
    "employmentType": "Full-time",
    "workplaceType": "On-site",
    "salaryText": "$19 – $22 an hour",
    "salaryMin": 19,
    "salaryMax": 22,
    "salaryCurrency": "USD",
    "salaryPeriod": "hour",
    "posted": "2026-10-13",
    "jobId": "2184679905",
    "jobUrl": "https://www.indeed.com/shift-supervisor-coffee-bar-1001",
    "applyUrl": "https://www.indeed.com/shift-supervisor-coffee-bar-1001",
    "companyKey": "shift-supervisor-coffee-bar",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=indeed&op=search (sign in first).

### jobs

Full postings for up to ten Indeed job keys or job URLs.

| Field | Required | Type | Meaning |
|---|---|---|---|
| subjects | yes | list of string (1-10 items) | Job keys or job URLs. |
| country | no | enum |  Values: US, GB, CA, AU, IN, DE, FR, JP, BR, MX, IT, ES, NL, BE, CH, AT, SG, HK, IE, NZ, AR, CL, CO. |

Response fields (each row of data; every field present, null when the source had nothing):

| Field | Type |
|---|---|
| jobId | string |
| jobUrl | string |
| applyUrl | string |
| jobTitle | string |
| normalizedTitle | string |
| companyName | string |
| companyKey | string |
| company | any |
| jobDescription | string |
| employmentType | list of string |
| workplaceType | string |
| workSetting | list of string |
| shift | list of string |
| experienceLevel | string |
| educationLevel | string |
| salaryText | string |
| salaryMin | number |
| salaryMax | number |
| salaryCurrency | string |
| salaryPeriod | string |
| posted | string |
| applyStarts | string |
| city | string |
| state | string |
| country | string |
| postalCode | string |
| streetAddress | string |
| fullAddress | string |
| latitude | number |
| longitude | number |
| skills | list of string |
| certifications | list of string |
| benefits | list of string |
| eligibility | list of string |
| physicalRequirements | list of string |
| travel | list of string |
| occupation | string |
| occupationCategories | list of string |
| sponsored | boolean |
| urgentHire | boolean |
| highVolumeHiring | boolean |
| numberOfHires | string |
| employerResponseRate | number |
| employerAvgResponseTimeDays | number |
| employerResponsive | boolean |
| sourceName | string |
| sourceType | string |
| language | string |
| details | object |

`details` is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is `{}` when there is nothing more.

Example request:

```bash
curl -X POST https://apiforagents.dev/v1/indeed \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"jobs","subjects":["https://www.indeed.com/viewjob?jk=<job-key>"],"country":"US"}'
```

Example response rows (made-up names, real field names; a live row carries every field above):

```json
[
  {
    "jobTitle": "Customer Success Manager",
    "companyName": "Northfold",
    "city": "London",
    "country": "GB",
    "employmentType": "Full-time",
    "workplaceType": "Hybrid",
    "salaryText": "£45,000 – £55,000 a year",
    "salaryMin": 45000,
    "salaryMax": 55000,
    "salaryCurrency": "GBP",
    "salaryPeriod": "year",
    "posted": "2026-10-14",
    "state": null,
    "jobId": "982748018",
    "jobUrl": "https://www.indeed.com/customer-success-manager-1000",
    "applyUrl": "https://www.indeed.com/customer-success-manager-1000",
    "companyKey": "customer-success-manager",
    "details": {}
  },
  {
    "jobTitle": "Senior Data Analyst",
    "companyName": "Kitebank",
    "city": "Austin",
    "country": "US",
    "employmentType": "Full-time",
    "workplaceType": "Remote",
    "salaryText": "$110,000 – $135,000 a year",
    "salaryMin": 110000,
    "salaryMax": 135000,
    "salaryCurrency": "USD",
    "salaryPeriod": "year",
    "posted": "2026-10-12",
    "state": "TX",
    "jobId": "1707840656",
    "jobUrl": "https://www.indeed.com/senior-data-analyst-1001",
    "applyUrl": "https://www.indeed.com/senior-data-analyst-1001",
    "companyKey": "senior-data-analyst",
    "details": {}
  }
]
```

Try it in the playground: https://apiforagents.dev/dashboard/run?platform=indeed&op=jobs (sign in first).

## Notes for the agent

Measured Indeed job data, one operation per call. ops: search (query + location on one country's Indeed, with workplace, employmentType, postedWithin and sort filters. Every hit a full posting: title, company with industry and size, salary range and period, employment type, workplace type, skills, benefits, hiring signals like urgent-hire and employer response rate, apply link), jobs (full postings for up to ten job keys or job URLs). Fresh fetches are charged per record; your own answer is free while fresh.
