Levels APIlevels.fyi ↗
Access Levels.fyi salary data via API. Get compensation by level, H-1B records, internship pay, benefits, and company profiles across tech roles.
What is the Levels API?
The Levels.fyi API exposes 8 endpoints covering tech compensation data including level-by-level salary breakdowns, internship pay, H-1B visa records, and company benefits. The get_salary_data endpoint returns percentile distributions across base salary, total compensation, bonus, and stock grant for a given company and job family. Developers can pair it with get_job_families and get_popular_companies to build fully parameterized compensation queries without hardcoding slugs.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/3244ceba-7834-4c1c-a737-e75a4f234a74/get_job_families' \ -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 levels-fyi-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: Levels.fyi SDK — bounded, re-runnable; every call capped."""
from parse_apis.levels_fyi_salary_company_data_api import (
LevelsFyi, JobFamilySlug, CompanyNotFound,
)
client = LevelsFyi()
# List popular companies — capped to 5 items
for company in client.popularcompanies.list(limit=5):
print(company.value, company.slug)
# Browse job families
family = client.jobfamilies.list(limit=1).first()
if family:
print(family.name, family.category, family.slug)
# Construct a company by slug and fetch its overview
google = client.company("google")
profile = google.overview()
print(profile.company.name, profile.company.industry)
for jf in profile.job_families[:3]:
print(jf.name, jf.category)
# Fetch salary data with enum-typed job family
salary_data = google.salaries(job_family_slug=JobFamilySlug.SOFTWARE_ENGINEER)
print(salary_data.job_family, salary_data.location_currency)
# Iterate level averages from the salary data
for avg in salary_data.averages[:3]:
print(avg.primary_level_name, avg.base, avg.total)
# Get benefits for a company — capped
for benefit in google.benefits(limit=3):
print(benefit.id, benefit.perk_id)
# Paginated H-1B records — capped
for record in client.h1brecords.list(year=2025, limit=3):
print(record.c, record.j, record.w)
# Typed error handling for unknown company
try:
bad = client.company("nonexistent-company-xyz")
bad.salaries()
except CompanyNotFound as exc:
print(f"Company not found: {exc.company_slug}")
print("exercised: popularcompanies.list / jobfamilies.list / company.overview / company.salaries / company.benefits / h1brecords.list")
Retrieve the full directory of job titles and families organized as a flat list. Each job family includes slug, name, category, focus tags, and job titles. Covers categories like Technology, Design, Business, Finance, Engineering, Human Resources, Healthcare, and more. Returns all families in one call — no pagination.
No input parameters required.
{
"type": "object",
"fields": {
"job_families": "array of job family objects with slug, name, category, description, focusTags, and jobTitles"
},
"sample": {
"data": {
"job_families": [
{
"id": 1,
"icon": "https://static.levels.fyi/custom/job_family_icons/software-engineer.png",
"name": "Software Engineer",
"slug": "software-engineer",
"aliases": [],
"category": "Technology",
"focusTags": [],
"jobTitles": [],
"description": "Designing, building, and maintaining software applications..."
}
]
},
"status": "success"
}
}About the Levels API
Salary and Compensation Data
The core endpoint, get_salary_data, accepts a company_slug and an optional job_family_slug and returns a structured response including levels, averages, percentiles, and median. The percentiles field breaks down distributions for base_salary, tc (total compensation), bonus, and stock_grant. The averages array groups salary samples by level, so you can see how compensation shifts from entry-level to senior individual contributor or management tracks at a given company.
Job Families and Company Directory
get_job_families returns the full taxonomy of roles organized by category (Technology, Design, Finance, and others), each with slugs suitable for passing directly into get_salary_data. get_popular_companies returns company slugs and display names from the Levels.fyi directory. For richer company context, get_company_overview returns fields like industry, ticker, year_founded, emp_count, and an array of related_companies, plus the job families that company has data for.
Internship and H-1B Records
get_internship_salaries returns a flat array of internship records with fields for monthlySalary, hourlySalary, location, season, year, and company — useful for building intern compensation trackers or comparing seasonal pay across firms. get_h1b_salaries accepts page and year parameters and returns paginated records with wage, job_title, location, and certificationStatus, sorted by date descending. The records response object includes totalPages and totalRecords for pagination handling.
Benefits and Markdown Summaries
get_company_benefits returns a structured benefits array with each perk's category, tag, fields, and monetary value. This is useful for comparing benefits packages between companies rather than just cash compensation. get_salary_summary_md returns a pre-formatted Markdown string with median compensation, level breakdowns, and attribution — designed for embedding in documentation, reports, or LLM contexts where structured prose is more useful than raw JSON.
The Levels API is a managed, monitored endpoint for levels.fyi — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when levels.fyi 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 levels.fyi 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?+
- Build a compensation benchmarking tool that compares total comp percentiles across companies for a given job family using
get_salary_data - Track internship pay trends by season and location using
monthlySalaryandhourlySalaryfields fromget_internship_salaries - Generate company compensation summaries in Markdown for embedding in internal wikis or Notion pages via
get_salary_summary_md - Analyze H-1B wage filings by year and employer using paginated records from
get_h1b_salaries - Compare benefits packages across competing employers using category and monetary value fields from
get_company_benefits - Populate a job role autocomplete or filter UI from the full taxonomy returned by
get_job_families - Display related companies alongside a firm's compensation data using
related_companiesfromget_company_overview
| 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 Levels.fyi have an official developer API?+
What does `get_salary_data` return and how do I filter it by role?+
get_salary_data requires a company_slug and accepts an optional job_family_slug. When a job family slug is provided, the response scopes percentiles, averages, and median to that role at the given company. Omitting the slug returns an aggregate across all roles. Slugs for both inputs come from get_popular_companies and get_job_families respectively.Does the H-1B endpoint cover all years of records?+
get_h1b_salaries accepts a year parameter and returns paginated results with totalPages and totalRecords. Coverage depends on what Levels.fyi has indexed; not all historical years may be available. The response reflects whatever year range the source publishes.Can I filter salary data by geographic location or remote status?+
get_salary_data response includes a location_meta field and location_currency, but the endpoint does not currently accept a location filter as an input parameter — it returns the data with location metadata attached. You can fork this API on Parse and revise it to add location-based filtering if your use case requires it.Does the API expose individual salary submissions or survey-level data?+
averages array within get_salary_data includes sample data points grouped by level, and the internships array from get_internship_salaries contains individual records. The API does not currently expose user profile data, submission timestamps, or verification status for individual entries. You can fork it on Parse and revise to surface additional fields if they become available.