Job postings API for LinkedIn jobs, Indeed, Glassdoor and career sites
Search job postings on LinkedIn, Indeed, Glassdoor, Upwork and company career sites, plus public LinkedIn profiles, as JSON from an API or agent. Pay per job.
Whether you track who is hiring, benchmark salaries, feed a job board or look for freelance work, you need a job postings API that returns fresh postings in a structured form. Lovely Router searches LinkedIn, Indeed, Glassdoor, Upwork and companies' own career sites and returns each posting as JSON: title, company, location and posted date, plus salary and the full description where the source has them. You pay per job returned, from the same prepaid key you use for models.
Hand it to your AI agent
Copy this prompt into Claude Code, Cursor, Codex or any coding agent. It tells the agent where the docs are and how to use your API key.
Collect job postings from LinkedIn, Indeed, Glassdoor, Upwork and company career sites, plus public LinkedIn profiles. Use the Lovely Router data tools: each returns JSON and is billed per result.
- Docs (read first): https://lovelyrouter.com/docs/tools/find.md and https://lovelyrouter.com/docs/tools/run.md
- Plan first: POST https://lovelyrouter.com/v1/tools/suggest with `{"task": "<my task in plain words>"}` (free). It returns the tools to run in order, each with an example `input`, the `input_required` fields, an estimated cost and a ready-made `run` request. Replace the example values with my task's; if a field is unclear, read the tool with GET https://lovelyrouter.com/v1/tools/<id>. To browse instead, POST https://lovelyrouter.com/v1/tools/discover searches the catalog.
- Show me the plan and its estimated cost (`total_est_cost_usd`) before running anything large.
- Run: POST https://lovelyrouter.com/v1/tools/<id>/run with `{"input": {...}, "max_results": N}`. A 200 has the finished run with `items`; a 202 means it is still running, so poll the `poll` path until `status` is `succeeded`, `failed`, `timed_out` or `stopped`.
- Only delivered results are billed. Keep max_results small on the first run, check the output, then scale up.
- If you support MCP, connect https://lovelyrouter.com/mcp instead (Streamable HTTP, same key; https://lovelyrouter.com/docs/tools/mcp.md) and use suggest_tools, get_tool and run_tool.
- Auth: read my API key from the LOVELY_API_KEY environment variable and send it as `Authorization: Bearer $LOVELY_API_KEY`. Never print or commit the key. If it is not set, ask me to create one at https://lovelyrouter.com/app/keys.
- Billing is prepaid: every call is charged to my balance, so test with a small request before running anything large.
- Every docs page is plain Markdown; the full index is https://lovelyrouter.com/llms.txt.
My task: <the roles, locations, companies and the fields you need>How it works
Describe the search
A title or skill, a location, a time window. Some tools also filter by company, experience level or payment status.
Run it with a cap
Send the input to
POST /v1/tools/{id}/runwithmax_results. The cap is also the most the run can bill, and it caps the tool's ownlimitfield, so you don't need to set both.Store and repeat
Save each posting, then rerun the same search every day or hour with a short time window to pick up only new ones.
Search LinkedIn jobs with one request
LinkedIn jobs searches by title, skill or company and location. This run returns up to 50 software engineering jobs in New York posted in the last week:
curl https://lovelyrouter.com/v1/tools/linkedin-jobs/run \
-H "Authorization: Bearer $LOVELY_API_KEY" \
-H "content-type: application/json" \
-d '{
"input": {
"keywords": "software engineer",
"location": "New York",
"datePosted": "r604800",
"limit": 50
},
"max_results": 50
}'Each job in items has its title, company, location, salary, posted date, applicant count and description. datePosted takes r86400 (24 hours), r604800 (a week) or r2592000 (a month), and companyName narrows the search to a list of companies. A run still going after 60 seconds returns 202; Run a tool shows how to poll.
The tools
LinkedIn job postings for a title/skill and location (or a jobs search URL): title, company, location, salary, posted date, applicants, description.
Indeed job postings by title and location: company, salary, posted date, description.
Glassdoor job postings by keyword and location.
Freelance jobs on Upwork for a search: title, budget or rate, skills, client history, posted time.
Fresh job postings straight from companies' own career sites and ATSs (Greenhouse, Lever, Workday…), searchable by title, location and company.
Public LinkedIn profile by URL: headline, experience, education, skills, location.
| Tool | You send | Each result holds |
|---|---|---|
linkedin-jobs | keywords, location, datePosted, companyName | Title, company, location, salary, posted date, applicants, description |
indeed-jobs | title, location (or "remote"), country, datePosted (days) | Company, salary, posted date, description |
glassdoor-jobs | keywords, location (both required), daysOld | A Glassdoor job posting |
upwork-jobs | query, experienceLevel, jobType, paymentVerified, sort | Title, budget or rate, skills, client history, posted time |
career-site-jobs | titleSearch, locationSearch, organizationSearch, timeRange | A posting from a company's own career site or applicant tracking system |
linkedin-profile | urls or publicIdentifiers | Headline, experience, education, skills, location |
Company career-site jobs reads postings straight from companies' own career sites and applicant tracking systems such as Greenhouse, Lever and Workday. Its titleSearch and organizationSearch accept :* for prefix matches ("Data:*"), and locationSearch wants the exact "City, State/Region, Country" form in English, with US states written out: "Austin, Texas, United States".
Recipes
Run linkedin-jobs with "companyName" set to your target accounts and "datePosted": "r604800". A company hiring three data engineers this week is a warm lead; pair it with the lead generation tools to find the right contact.
Run indeed-jobs with "title": "data analyst" for each city you hire in, keep the postings that list a salary, and compare ranges by location.
Run career-site-jobs once a day at the same time with "timeRange": "24h" and "titleSearch": ["Data Engineer"]. The tool's own guidance is to run at the same time every hour, day or week to get every job without duplicates; "6m" backfills all active jobs when you start.
Run upwork-jobs every hour with "query": "web scraping", "paymentVerified": true and "sort": "newest", and post new jobs with their budget and client history to your team.
For a shortlist of public LinkedIn profile URLs, linkedin-profile returns each person's headline, experience, education and skills in one run.
Personal data
LinkedIn profiles, and job postings that name a recruiter, contain personal data. You are responsible for using it lawfully, for example under the GDPR or CCPA where they apply, and the Acceptable Use Policy forbids using results to profile or discriminate against people.
Your agent can run the same searches. Connect the MCP server and ask: "Find remote senior Python jobs posted on LinkedIn and Indeed in the last 24 hours, drop duplicates, and give me a table of title, company, salary and link. Set max_results on every run."
What you pay
Job tools bill per job returned, and some also charge a fee per run; the cards above show today's prices. Starting a run holds its maximum cost, per-call fee plus per-job fee times max_results, and settles to the jobs it returned, with the rest of the hold back in your balance. A run that fails or times out pays only for the jobs it delivered, and a run refused at the start costs nothing.
There's no subscription and no per-seat fee. Short time windows keep daily runs small, because you only fetch what's new. See pricing for every tool and data tools for how billing works.
Frequently asked questions
Can I filter LinkedIn jobs by date and company?+
Yes. The linkedin-jobs tool takes datePosted for the last 24 hours, week or month, a companyName list, and a location as a city, state or zip code.
Which job sources are covered?+
LinkedIn, Indeed, Glassdoor and Upwork, plus companies' own career sites and applicant tracking systems through the career-site-jobs tool. Each is a separate tool you call with the same API key.
How do I get only new postings each day?+
Use each tool's time filter and run at the same time daily: datePosted r86400 on LinkedIn, datePosted 1 on Indeed, daysOld 1 on Glassdoor, timeRange 24h on career sites, and sort newest on Upwork. Store what you've seen and skip it on the next run.
Do job postings include salaries?+
LinkedIn and Indeed results include a salary field, filled when the posting states one. Upwork jobs come with the budget or hourly rate.
Can I look up a candidate's LinkedIn profile?+
Yes, with the linkedin-profile tool and the profile URL or public identifier. It returns the public profile: headline, experience, education, skills and location. You are responsible for having a lawful reason to process it.
Do I need a LinkedIn or Indeed account?+
No account on those sites is part of the input. You call every tool with your Lovely Router API key and a JSON input of search terms or URLs.
To turn hiring signals into contacts, see lead generation. To plan a multi-step job with costs before you run it, use Find the right tool, and browse every source in the tool catalog.