The Problem
Indeed's APIs are partner-facing. The Job Sync and Publisher products documented on their partner site assume you are an ATS or a job board with an agreement in place, not a team that wants to read postings. Search for Indeed API access and the results tell the story: the first page is mostly vendors selling alternatives, a Reddit thread asking whether the API still works for anyone, and an API-comparison directory. Teams that need job data end up scraping a site that does not want to be scraped, or paying per-vertical for a feed that covers Indeed and nothing else.
The Scavio Solution
Scavio returns Indeed postings as structured JSON on a key you get at signup. A search returns 35 postings per page, and each row carries more than a title: the employer's Glassdoor-style rating and review count, the benefits list, the posting attributes and an apply_count all come back inline, so you can score a posting without a second call. Measured 2026-08-12: a python developer search in Austin returned 35 postings in 3.5 seconds for 2 credits. The same key covers Glassdoor and LinkedIn, so employer reviews and salary context do not need a second vendor.
Before
Before Scavio, reading Indeed meant qualifying for a partner agreement written for applicant tracking systems, or maintaining a scraper against anti-bot defences that change without notice.
After
After Scavio, a query and a location return 35 structured postings with employer ratings attached, and the jobs stack is one key rather than three vendors.
Who It Is For
Job boards, recruiting tools, labour-market analysts and anyone who searched for Indeed API documentation and found a partner programme they do not qualify for.
Key Benefits
- Key issued at signup, no partner agreement
- 35 postings per search, about 3.5 seconds
- Employer rating and review count inline on every posting
- Benefits, attributes and apply_count without a second call
- Same key covers Glassdoor and LinkedIn
Python Example
import os, requests
HEADERS = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}"}
res = requests.post(
"https://api.scavio.dev/api/v1/indeed/search",
headers=HEADERS,
json={"query": "python developer", "location": "Austin, TX"},
timeout=60,
).json()["data"]
print(res["count"], "postings")
# company_rating and company_review_count come back on the posting itself, so
# filtering for well-reviewed employers costs no extra call.
well_reviewed = [
j for j in res["jobs"]
if (j.get("company_rating") or 0) >= 4.0
and (j.get("company_review_count") or 0) >= 100
]
for job in well_reviewed[:5]:
print(job["company"], job.get("company_rating"), job.get("city"))
JavaScript Example
const res = await fetch("https://api.scavio.dev/api/v1/indeed/search", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SCAVIO_API_KEY}`,
"content-type": "application/json",
},
body: JSON.stringify({ query: "python developer", location: "Austin, TX" }),
});
const { data } = await res.json();
// Employer rating rides along on each posting -- no second lookup needed.
const wellReviewed = data.jobs.filter(
(j) => (j.company_rating ?? 0) >= 4.0 && (j.company_review_count ?? 0) >= 100,
);
console.log(`${data.count} postings, ${wellReviewed.length} well reviewed`);
Platforms Used
Indeed
Indeed job postings with employer ratings, no partner programme