Indeed APIca.indeed.com ↗
Access Indeed Canada job listings, company profiles, employee reviews, and salary data via 6 structured API endpoints. Filter by keyword, location, and date.
What is the Indeed API?
The Indeed Canada API provides access to Canadian job market data across 6 endpoints, covering job search, job details, company profiles, employee reviews, reported salaries, and company-specific job listings. The search_jobs endpoint accepts keyword, location, sort order, and recency filters, returning job keys you can pass directly to get_job_details for structured compensation, description, and employer data.
curl -X GET 'https://api.parse.bot/scraper/3ca3409d-7717-4c1b-8854-c204b951ef8a/search_jobs?sort=date&query=software+engineer&fromage=14&location=Toronto%2C+ON' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace ca-indeed-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Indeed Canada SDK — search jobs, drill into details, explore companies."""
from parse_apis.indeed_canada_api import IndeedCanada, Sort, CompanyNotFound
client = IndeedCanada()
# Search for recent software engineer jobs in Toronto
for job in client.jobsummaries.search(query="software engineer", location="Toronto, ON", sort=Sort.DATE, limit=5):
print(job.title, job.company, job.location)
# Drill into the first result for full details
listing = client.jobsummaries.search(query="data analyst", limit=1).first()
if listing:
detail = listing.details()
print(detail.title, detail.job_key)
# Explore a company: profile, reviews, salaries, open positions
rbc = client.company("Royal-Bank-of-Canada")
profile = rbc.profile()
print(profile.page_title, profile.overview)
reviews = rbc.reviews()
print(reviews.company, reviews.reviews_data)
salaries = rbc.salaries()
print(salaries.company, salaries.salaries_data)
# Typed error handling for unknown companies
try:
unknown = client.company("Nonexistent-Corp-12345").profile()
print(unknown.page_title)
except CompanyNotFound as exc:
print(f"Company not found: {exc.company}")
company_jobs = rbc.jobs()
print(company_jobs.total_count, company_jobs.filtered_count)
for item in company_jobs.jobs[:3]:
print(item.title, item.location, item.indeedApply)
print("exercised: jobsummaries.search / details / company.profile / reviews / salaries / jobs")
Full-text search over job listings on ca.indeed.com. Matches query against job titles, skills, and company names. Results are scoped by location and recency (fromage). Returns up to ~15 listings per call (single page; no server-side pagination is exposed without authentication). Each result carries a jobkey usable with get_job_details for the full posting.
| Param | Type | Description |
|---|---|---|
| sort | string | Sort order for results. |
| queryrequired | string | Search keyword(s) for job title, skills, or company name. |
| fromage | integer | Maximum age of listings in days. |
| location | string | Location to search in (city, province, or country). |
{
"type": "object",
"fields": {
"jobs": "array of job listing objects with jobkey, title, company, location, and url",
"query": "string query used for the search",
"location": "string location used for the search",
"total_results": "integer total number of results found"
},
"sample": {
"data": {
"jobs": [
{
"url": "https://ca.indeed.com/viewjob?jk=92347315ab929f6a",
"title": "Lead Full Stack Developer - Vice President",
"jobkey": "92347315ab929f6a",
"company": "Citi",
"location": "Mississauga, ON L5B 3P7"
}
],
"query": "software engineer",
"location": "Toronto, ON",
"total_results": 16
},
"status": "success"
}
}About the Indeed API
Job Search and Detail
The search_jobs endpoint takes a required query string along with optional location, sort ('date' or 'relevance'), and fromage (maximum listing age in days) parameters. It returns an array of job objects — each with a jobkey, title, company, location, and url — plus the total result count. Note that results are limited to the first page without authentication; deep pagination is not available.
The get_job_details endpoint accepts a jk job key (the hexadecimal identifier from search results) and returns a title, job_key, a job_info object reflecting Indeed's internal data model, and a description_html field containing the full HTML-formatted job description when available.
Company Data
The get_company_profile endpoint retrieves a company's overview using a slug that matches the Indeed URL path (e.g., Royal-Bank-of-Canada). The response includes a data object with sub-sections for aboutSectionViewModel, reviews, salaries, jobs, and Q&A, alongside a page_title and overview meta description. This gives a broad picture of the employer in a single call.
For more granular data, three dedicated endpoints go deeper. get_company_reviews returns a reviews_data object containing the reviews list, per-review ratings, submission dates, job titles, and pagination metadata. get_company_salaries returns salaries_data organized by job category and role. get_company_jobs returns an array of open postings per company, each with jobKey, title, location, url, indeedApply, and sponsored fields, plus a total_count of open positions.
The Indeed API is a managed, monitored endpoint for ca.indeed.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when ca.indeed.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official ca.indeed.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Aggregate Canadian job listings by keyword and province for a niche job board
- Track new postings at specific companies using
get_company_jobsandtotal_countover time - Pull compensation benchmarks by role from
get_company_salariesto populate salary guides - Display employer reputation data using review ratings and text from
get_company_reviews - Build a company research tool that combines profile, reviews, and salaries in one view
- Filter recent postings by setting
fromageto monitor a specific job category's hiring velocity - Cross-reference
description_htmlfrom job details against keyword lists to classify roles automatically
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Indeed have an official developer API?+
What does `get_job_details` return beyond the search listing?+
job_info object with structured data from Indeed's internal job model — typically including compensation details, employer information, and employment type — plus a description_html field with the full job description in HTML. The description_html field may be null if the posting does not include a formatted description.How do I find the correct company slug for profile and review endpoints?+
Royal-Bank-of-Canada or Td-bbaa945d. Some companies have a hash suffix in their slug. If the plain name doesn't resolve, check the URL on ca.indeed.com for the exact slug format.Is pagination supported for job search results?+
search_jobs endpoint returns the first page of results only. Multi-page traversal is not available through this endpoint. You can fork the API on Parse and revise it to add an offset or page parameter if your use case requires deeper result sets.