Indeed Jobs MCP Server & API - 62 Countries avatar

Indeed Jobs MCP Server & API - 62 Countries

Pricing

from $0.05 / 1,000 results

Go to Apify Store
Indeed Jobs MCP Server & API - 62 Countries

Indeed Jobs MCP Server & API - 62 Countries

Indeed jobs for AI agents: an MCP server and live API that searches Indeed's 62 country sites by keyword, city, pay and experience level, and looks jobs up by key. Answers in seconds with title, company, yearly pay, full description, employer details and the apply link.

Pricing

from $0.05 / 1,000 results

Rating

0.0

(0)

Developer

Akhil rajesh

Akhil rajesh

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

33 minutes ago

Last modified

Features

Limited permissionsSingle-tenantServer interface

Share

Give your AI agent Indeed jobs on demand. This Actor is an MCP server and a live HTTP API for Indeed's job search in 62 countries. An agent asks for "registered nurse jobs in Toronto posted this week that pay at least $90,000" and gets the matching jobs back in seconds: title, company, location with map coordinates, pay as posted and as a yearly figure, job type, remote or hybrid, experience level, posting date, the employer's apply link and, when asked for, the full job description.

It runs the same code as Indeed Jobs Scraper, with Apify Standby switched on, so it answers each request at once instead of starting a run. For thousands of jobs, whole-country sweeps, only new jobs or Slack and Telegram alerts on a schedule, use that Actor.

Connect your agent

Authenticate with your Apify API token (Apify Console → Settings → API & Integrations).

MCP server (Streamable HTTP): https://akhil-rajesh--indeed-jobs-mcp-server.apify.actor/mcp

{"mcpServers": {"indeed-jobs": {"type": "http", "url": "https://akhil-rajesh--indeed-jobs-mcp-server.apify.actor/mcp",
"headers": {"Authorization": "Bearer <YOUR_APIFY_TOKEN>"}}}}

In Claude Code:

$claude mcp add --transport http indeed-jobs https://akhil-rajesh--indeed-jobs-mcp-server.apify.actor/mcp --header "Authorization: Bearer <YOUR_APIFY_TOKEN>"

A client that can't send headers can use https://akhil-rajesh--indeed-jobs-mcp-server.apify.actor/mcp?token=<YOUR_APIFY_TOKEN>. Keep that URL private, as it carries your token.

Through Apify's MCP server (https://mcp.apify.com, for Claude, ChatGPT, Cursor and other clients), add the tools with https://mcp.apify.com?tools=akhil_rajesh/indeed-jobs-mcp-server. They appear as akhil_rajesh--indeed-jobs-mcp-server--search_jobs and so on. Add them that way rather than through Apify's generic call-actor tool, which returns the rows only as text.

Then ask in plain words:

  • "Find registered nurse jobs in Toronto posted this week that pay at least $90,000 a year."
  • "Which companies are hiring Python developers in Berlin? One job per company."
  • "Are these three Indeed jobs still open?" (with the links)
  • "Compare remote data analyst pay in London and Manchester."

Tools

ToolWhat it returns
search_jobsJobs for up to 3 searches (separate them with |) in a city, region or whole country, with every field below. Takes Indeed's own filters (posted within 1, 3, 7, 14 or 30 days, job type, remote or hybrid, experience level, radius, newest first) and the Actor's (title words, excluded title words and companies, minimum yearly pay, only jobs with pay, Easy apply or employer site, one job per company). Without full descriptions unless asked for
get_jobsJobs by Indeed job key or link: whether each is still listed, with every field and the full description
list_countriesIndeed's 62 country codes, each site's radius unit and which experience levels it tags (free)
run_actorThe whole input of Indeed Jobs Scraper in one call, for searches the other tools can't express (several keywords and countries, start URLs)

The first request starts a Standby run, which took about 6 seconds in testing; after that, a search of 10 jobs was answered in 1 to 2 seconds and a lookup by key in under half a second.

HTTP API

The same searches as plain HTTP requests, with the same token (header Authorization: Bearer <token>):

curl "https://akhil-rajesh--indeed-jobs-mcp-server.apify.actor/jobs?q=registered%20nurse&l=Toronto,%20ON&country=ca&max=50&days=7&minSalary=80000" \
-H "Authorization: Bearer <YOUR_APIFY_TOKEN>"
EndpointParameters (defaults in brackets)
GET /jobsq, l, country, max (50), days, type, arrangement, level, sort, radius, title, excludeTitle, excludeCompany, minSalary, withSalary, apply, onePerCompany, descriptions (true)
GET /jobkeys (job keys or links), country, descriptions (true)
GET /countriesnone (free)
POST /runThe Indeed Jobs Scraper input as the JSON body

Separate several searches, title words or job keys with |. The Actor's Endpoints tab in Apify Console lists every parameter and lets you try them.

What each job holds

GroupFields
Jobtitle, jobTypes, experienceLevels, isRemote, remoteType, attributes, occupations, isUrgentHire, isHighVolumeHiring, language
PaysalaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryText, salaryIsEstimated, salaryYearlyMin, salaryYearlyMax
Descriptiondescription (plain text), descriptionHtml
Locationlocation, city, state, postalCode, country, latitude, longitude, streetAddress
ApplyingapplyUrl (the employer's careers page when there is one), easyApply
Employercompany, companyPostedName, companyKey, companyWebsite, companyIndustry, companySize, companyRevenue, companyCeo, companyHeadquarters, companyDescription, companyLogo, companyRating, companyReviewCount, companyUrl
TimingdatePosted, dateOnIndeed, isExpired
Provenanceurl, jobKey, jobSource, source, searchQuery, searchLocation, searchCountry, sourceUrl, scrapedAt

salaryYearlyMin and salaryYearlyMax turn hourly, daily, weekly and monthly pay into a yearly figure, so an agent can compare a $38.50-an-hour job with a $90,000 salary. attributes holds every tag Indeed attaches to a job: benefits, shifts, skills and education included. Fields without a value are left out of a row.

A job, shortened:

{
"title": "Senior Full Stack Developer",
"company": "Example Technologies",
"location": "Toronto, ON M5V 2T6",
"latitude": 43.6453,
"longitude": -79.3806,
"remoteType": "Hybrid work",
"salaryText": "$110,000–$140,000 a year",
"salaryYearlyMin": 110000,
"salaryYearlyMax": 140000,
"salaryCurrency": "CAD",
"jobTypes": ["Full-time", "Permanent"],
"experienceLevels": ["Senior level"],
"datePosted": "2026-09-16T14:00:00+00:00",
"applyUrl": "https://careers.example.com/jobs/4821",
"easyApply": false,
"companyRating": 3.7,
"companySize": "1,001 to 5,000",
"url": "https://ca.indeed.com/viewjob?jk=1a2b3c4d5e6f7890",
"jobKey": "1a2b3c4d5e6f7890"
}

Searching well

  • Any of Indeed's 62 country sites, from Canada (ca) and the US (us) to Germany (de), India (in) and Japan (jp). list_countries lists them. When no country is given, the location's country is used.
  • Indeed's search syntax works: title:(nurse) for the title only, nurse -travel to leave a word out, company:(Amazon) for one employer, "registered nurse" for the exact phrase.
  • Search in the local language outside English-speaking countries (softwareentwickler in Germany, comptable in France), and write places the way the local site does (Sydney NSW, Mumbai, Maharashtra, München).
  • Leave the location empty for a whole country, or name a region (Ontario, TX, Bayern). When Indeed cuts a wide search off, the Actor goes on city by city, up to the request's limit.
  • Pay coverage varies by country: in a September 2026 test, 69% of Canadian jobs and 51% of British ones showed pay, against 17% in Germany and 9% in New Zealand.

Answers and limits

Every answer carries the rows, notFound (job keys Indeed no longer lists: free), notLoaded (searches Indeed didn't answer), notRead (what a limit left out: not charged) and notes.

A request that reads nothing gets an error, and nothing is charged:

  • HTTP 400 for an argument it can't read (a tool error over MCP).
  • 503 when Indeed didn't answer or the run was busy (send it again).
  • 402 when your spending limit for the run is reached (it lifts when the run ends, after 2 minutes without requests).

A 503 can also carry rows, when the platform stopped the run while a request was being read: those were stored and charged, and notRead names the rest.

SearchesJobsJob keysAnswer sizeTime
MCP tool call310050about 350 kB50 seconds
HTTP request101,000200about 6 MB170 seconds

The MCP limits keep answers inside what MCP clients wait for (60 seconds) and what Apify's MCP server passes on (about 1 MB). A request that has started runs to its end even if you stop waiting: Apify's Standby proxy keeps it open, so its jobs are read and charged. Ask for what you need.

How much does it cost?

Pay-per-event, the same prices per job as Indeed Jobs Scraper:

Your planPer 1,000 jobs
Free$0.10
Starter$0.09
Scale$0.07
Business and above$0.05

Plus $0.001 when a Standby run starts, and the run's platform usage while it serves you and until it has been idle for 2 minutes, at Apify's usual rates. That's why the Store page's pricing box mentions platform usage. list_countries, job keys Indeed no longer lists, and jobs a filter leaves out cost nothing.

Agents that pay per call

Apify's MCP server doesn't offer Actors with a live endpoint to agents that pay per call with x402 or Skyfire. Those agents can use Indeed Jobs Scraper through https://mcp.apify.com instead: it takes the same searches and returns the same rows, as a normal run that starts for each call (a 100-job search took about 10 seconds in testing) instead of a live answer. An agent with an Apify account or API token can use either.

FAQ

Why did a search return fewer jobs than I asked for?

The search ran out of jobs, a filter left the rest out (notes counts them), or a limit was reached (notRead says which). One search ends at about 1,000 jobs on Indeed. For more, run Indeed Jobs Scraper, which has no per-request limits.

Can it return only jobs I haven't seen before, or post them to Slack?

Not over the live endpoint, which answers each request on its own and ignores those fields. A normal run of this Actor does both, with the same input as Indeed Jobs Scraper: schedule it, or schedule the scraper. Each Actor keeps its own history of delivered jobs (this one's is indeed-jobs-mcp-history by default), because Apify lets an Actor open only the history stores it created itself: a History name the other Actor created stops the run before anything is charged.

Why is salary missing on some jobs?

Many employers don't publish pay, and how often they do varies by country and occupation. salaryIsEstimated says whether the employer stated the pay or Indeed estimated it.

Why did the experience level filter return every level?

Indeed tags entry, mid and senior level on its US site only. Elsewhere every level comes back and the answer's notes say so. No experience needed works in every country.

Other Actors by this developer

Data source

All data comes from Indeed, a public job board, through the same job search service that powers Indeed's own apps: one site per country, from ca.indeed.com to vn.indeed.com. This Actor reads publicly available listings only and never signs in to an account.

Disclaimer: This is an independent tool. It is not affiliated with, endorsed by, or sponsored by Indeed, Inc. or any related entity. All product and company names are the property of their respective owners.

Limitations

  • Indeed only: jobs posted exclusively elsewhere aren't included
  • About 1,000 jobs per search, and per-request limits on top (see above)
  • A keyword is required for every search
  • Entry, mid and senior level are tagged on Indeed's US site only
  • Canadian postal codes aren't accepted as a location; US ZIP codes are
  • No promoted-listing flag: Indeed's search service doesn't say which jobs employers pay to promote
  • Indeed's search has off days: new listings can lag for a few hours, and a very broad search can come back nearly empty without an error
  • If Indeed's search service is unavailable, the endpoint names the searches it didn't answer in notLoaded rather than falling back to Indeed's web pages
  • Listings change constantly, and a job can close between requests