Use cases / Indeed Jobs API
Job market analytics
Last updated September 28, 2026. Response excerpts are recorded from the live API.
Who
Who runs this, and what for
| Team | What they decide with it |
|---|---|
| Economists and researchers | How demand for a skill moves across regions, from postings rather than surveys. |
| Staffing agencies | Which roles and cities to recruit for next quarter. |
| Bootcamps and training providers | Which courses to open, by the roles employers post and the pay they offer. |
Pipeline
The calls, step by step
01Fix the roles, cities, and window
Pick the search terms and locations once and never change them mid-series, or the counts stop being comparable. posted=7d keeps each weekly run to the openings posted since the last one.
GET /v1/search?engine=indeed&q=software+engineer&location=New+York%2C+NY · query
{ "q": "software engineer", "location": "New York, NY", "job_type": null, "remote": false, "posted": null, "page": 1 }Recorded response. Live values differ. 02Read each search
Each result carries the posted salary as min, max, and period, the job type, whether it is remote, and the posting date. Keep only yearly salaries for pay statistics; hourly postings answer a different question.
GET /v1/search?engine=indeed&q=software+engineer&location=New+York%2C+NY · results.0
{ "position": 1, "id": "e6489bd83820f079", "title": "Software Engineer, Early Career, Campus", "company": "Google", "location": "New York, NY", "workplace_type": null, "remote": false, "salary_text": "$123,000 - $174,000 a year", "salary": { "min": 123000, "max": 174000, "median": null, "currency": "USD", "period": "year", "source": "employer" }, "job_type": "Full-time", "posted_age": "30+ days ago", "posted_at": "2026-08-07T05:00:00.000Z", "snippet": "We're looking for engineers who bring fresh ideas from all areas, including information retrieval, distributed computing, large-scale system design, networking", "benefits": [ "Paid holidays", "Dental insurance", "Health insurance", "401(k) matching", "Paid time off" ], "company_rating": 4.3, "company_reviews_count": 6269, "company_url": "https://www.indeed.com/cmp/Google", "easy_apply": false, "urgently_hiring": false, "sponsored": false, "url": "https://www.indeed.com/viewjob?jk=e6489bd83820f079" }Recorded response. Live values differ. 03Open postings when you need the detail
The job endpoint returns the full description, benefits, and when the posting expires. You do not need it for counts, but it is where skills and requirements are.
GET /v1/job?engine=indeed&id=e6489bd83820f079 · job
{ "id": "e6489bd83820f079", "title": "Software Engineer, Early Career, Campus", "company": "Google", "location": "New York, NY", "workplace_type": null, "remote": false, "salary_text": "$123,000 - $174,000 a year", "salary": { "min": 123000, "max": 174000, "median": null, "currency": "USD", "period": "year", "source": null }, "job_type": "Full-time", "posted_at": "2026-08-07T14:17:37.961Z", "valid_through": "2027-01-23T14:14:21.706Z", "company_logo": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/d778456838f54580d43f7dd78b3b0d9c", "company_url": "https://www.indeed.com/cmp/Google", "benefits": [ "Parental leave", "Health insurance", "401(k) matching", "Paid time off" ], "direct_apply": false, "url": "https://www.indeed.com/viewjob?jk=e6489bd83820f079", "highlights": { "qualifications": [ "Bachelor's degree in Computer Science, a similar technical field of study, or equivalent practical experience." ], "responsibilities": [ "Design, develop, test, deploy, maintain, and improve software." ], "benefits": [] }, "paragraphs": [ "Google is hiring early career software engineers in New York." ] }Recorded response. Live values differ.
Code
A script to start from
job_market.py
# Weekly count of new openings and posted pay for a set of roles and cities.
# Appends to market.csv; chart it to see demand and pay move.
import csv, datetime, os, statistics, requests
API = "https://api.clair.im"
HEADERS = {"Authorization": f"Bearer {os.environ['CLAIR_API_KEY']}"}
ROLES = ["data engineer", "machine learning engineer"]
CITIES = ["New York, NY", "Austin, TX", "Seattle, WA"]
def search(q, location):
r = requests.get(f"{API}/v1/search", headers=HEADERS, timeout=90, params={
"engine": "indeed", "q": q, "location": location, "posted": "7d"})
r.raise_for_status()
return r.json()["results"]
week = datetime.date.today().isocalendar()
with open("market.csv", "a", newline="") as f:
out = csv.writer(f)
for role in ROLES:
for city in CITIES:
jobs = search(role, city)
# Annual pay only; hourly and monthly postings are kept out of the median.
mids = [(j["salary"]["min"] + j["salary"]["max"]) / 2 for j in jobs
if j["salary"] and j["salary"]["period"] == "year"
and j["salary"]["min"] and j["salary"]["max"]]
remote = sum(1 for j in jobs if j["remote"])
out.writerow([f"{week.year}-W{week.week:02d}", role, city, len(jobs),
len(mids), statistics.median(mids) if mids else None, remote])
Set CLAIR_API_KEY to a key subscribed to the Indeed Jobs API. Each call is one request against that API's monthly quota.
Cost
What it costs per month
| Schedule | Requests | Plan | Per month | Per 1,000 |
|---|---|---|---|---|
| 5 roles × 5 cities, weekly25 searches × 4 weeks = 100 requests. | 100 | Pay as you go | $0.88 | $8.80 |
| 20 roles × 25 cities, weekly500 searches × 4 weeks = 2,000 requests. | 2,000 | Pay as you go | $17.60 | $8.80 |
| 20 roles × 25 cities, daily500 searches × 30 days = 15,000 requests, with posted=1d. | 15,000 | Pro | $88.53 | $5.90 |
| Weekly counts plus 2,000 full postings2,000 searches a month, plus 2,000 job calls to read descriptions. | 4,000 | Pay as you go | $35.20 | $8.80 |
Limits
What to plan for
- One search returns the one page Indeed shows signed-out visitors, about 45 cards. Busy roles in large cities have more new openings than that per week; split them with job_type, remote, or narrower titles, or count daily.
- Indeed.com only, so United States postings.
- Salary appears only when the posting or Indeed shows one. The share with pay varies by state, since some states require pay ranges in postings.
- Postings are duplicated across boards and re-posted. Deduplicate on id within Indeed, and on company plus title across sources.
FAQ
Common questions
Can I get historical job postings?
No. Indeed shows current postings. The series starts on your first run, which is why fixing the terms early matters.
Should I also use Glassdoor?
For the same question in more depth, yes: Glassdoor job search pages up to 10 pages and adds company ratings. Combine on company and title and deduplicate.
How do I count remote roles?
Each result has remote. Hybrid is inferred from the location text, so check workplace_type when it is set.
Run it on your own products
200 requests a month free on each API, no card. Enough to run the pipeline on a short list before choosing a plan.
Bloomberg News API
Associated Press API
Glassdoor API
Greenhouse Jobs API

Crunchbase API
Website Contacts API