NueCareer for developers and agents
NueCareer publishes a free, keyless, read-only HTTP API over its career directory: 923 U.S. occupations built from O*NET 30.3, BLS OEWS May 2025 wages, BLS Employment Projections 2024-2034 and BEA Regional Price Parities 2024. It is the same data behind the public occupation pages at https://nuecareer.com/careers, in JSON.
When to use the NueCareer API
Reach for it when you need grounded U.S. occupational facts rather than a guess:
- Pay for a specific job, nationally or in one state, at a named percentile rather than a single "average".
- Whether a job is growing or shrinking through 2034, and how many openings a year it actually produces.
- What it takes to get in: typical entry education, O*NET job zone, on-the-job training, day-to-day tasks, skills and knowledge areas.
- Building a shortlist against constraints — "pays over $70,000, no bachelor’s degree required, remote-friendly" — in one request instead of scraping a directory.
- Automation exposure, before advising somebody to enter or leave a field.
- Resolving a messy job title to a canonical occupation, using O*NET alternate titles.
It is deliberately not for:
- Job listings or vacancies. There are none in this dataset.
- Salaries outside the United States. Every wage figure here is BLS, so it is U.S.-only.
- Personal, account, résumé or subscription data. None of it is exposed, at any endpoint, with any credential.
- Calling the free AI tools programmatically. Those are rate-limited HTML forms for people; send a person the URL instead.
Quick start
No key, no signup, no headers required.
curl "https://nuecareer.com/api/v1/careers?q=nurse&limit=3"
curl "https://nuecareer.com/api/v1/careers/registered-nurse?include=salary_by_state"
curl "https://nuecareer.com/api/v1/collections/highest-paying-trades"
Start from https://nuecareer.com/api/v1 for a machine-readable index of every endpoint.
OpenAPI description
An OpenAPI 3.1 document describes the whole surface, with a unique operationId, a prose
description and typed schemas on every operation — enough to load straight into a function-calling
tool definition.
- JSON: https://nuecareer.com/openapi.json
- YAML: https://nuecareer.com/openapi.yaml
- Well-known: https://nuecareer.com/.well-known/openapi.json
Endpoints
| Operation | Method and path | What it returns |
|---|---|---|
getApiIndex |
GET /api/v1 |
The endpoint index, rate limit, dataset vintage and OpenAPI URL. |
searchCareers |
GET /api/v1/careers |
Occupations matching a text query and filters, with total-count pagination. |
getCareerBySlug |
GET /api/v1/careers/{slug} |
One occupation in full. |
listCareerCollections |
GET /api/v1/collections |
Curated shortlists such as "highest-paying trades". |
getCareerCollection |
GET /api/v1/collections/{slug} |
One collection with its ranked members. |
listCareerTools |
GET /api/v1/tools |
Catalogue of the free career tools and their page URLs. |
Searching occupations
GET /api/v1/careers accepts:
| Parameter | Type | Meaning |
|---|---|---|
q |
string | Free text over titles, O*NET alternate titles and descriptions. Exact and prefix title matches rank first. |
category |
string | Restrict to one category slug, taken from any result’s categorySlug. |
facet |
string, repeatable | Require a derived characteristic. ANDed when repeated. |
min_salary / max_salary |
number | Bound the national median annual wage, in USD. |
min_growth |
number | Minimum BLS projected percent employment change, 2024-2034. Pass 0 to drop declining occupations. |
education |
string | Exact match on the BLS typical entry-level education string. |
sort |
string | One of relevance, median_wage_desc, median_wage_asc, growth_desc, openings_desc, ai_resilience_desc, title_asc. |
limit |
integer | 1 to 100. Defaults to 20. |
offset |
integer | Items to skip. Page against pagination.total. |
Valid facet values: noDegreeRequired, trade, remoteFriendly, outdoor, physical, helpsPeople, creative, analytical, worksWithAnimals, lowStress, paysWell, fastGrowing, declining, brightOutlook.
Fetching one occupation
GET /api/v1/careers/{slug} returns a compact record by default. The heavy parts are opt-in
through include, repeatable or comma-separated: salary_by_state, tasks, skills, personality, narrative.
salary_by_state adds all 54 U.S. jurisdictions with a BEA cost-of-living-adjusted median.
skills adds the O*NET skill, knowledge, ability, work-style, software and work-context inventories.
personality adds fit scores for all 16 MBTI types — a NueCareer-derived figure, not a government one.
Authentication
There is none, and there is nothing to authenticate to. Do not send an Authorization header,
a cookie or an API key to /api/v1; every endpoint is public, read-only, and holds no user data.
Rate limits
120 requests per 10 minutes per IP address, shared across all /api/v1 endpoints. Over the
limit you get HTTP 429 with code: "rate_limited". Responses are CDN-cached for 24 hours, so
repeating an identical request usually costs you nothing.
Errors
Every non-2xx response from /api/v1 is JSON in one envelope. HTML is never returned, for any
status, including 404 and 405.
{
"error": "No occupation matches the slug \"registered-nurses\".",
"code": "not_found",
"message": "No occupation matches the slug \"registered-nurses\".",
"hint": "Search for the right slug with GET https://nuecareer.com/api/v1/careers?q=registered%20nurses.",
"status": 404,
"docs": "https://nuecareer.com/developers#errors",
"parameter": "slug"
}
Branch on code, never on message. hint always names the next action — a corrected value,
or the endpoint that lists the valid ones. error duplicates message and exists only for
older clients.
code |
Status | Meaning |
|---|---|---|
bad_request |
400 | The request could not be understood at all. |
invalid_parameter |
400 | A named query or path parameter was malformed or had an unknown value. parameter names it. |
not_found |
404 | The path is valid but nothing is served at it, or the slug does not exist. |
method_not_allowed |
405 | The endpoint exists but does not accept that HTTP verb. The Allow header lists the ones it does. |
unauthorized |
401 | The endpoint requires a signed-in session. No public endpoint returns this. |
forbidden |
403 | Authenticated, but not permitted. |
rate_limited |
429 | Too many requests from this IP inside the window. |
unsupported_media_type |
415 | The request body was not in a format the endpoint accepts. |
internal_error |
500 | Something failed on our side. Safe to retry. |
The full list of codes is also enumerated in the OpenAPI document: bad_request, invalid_parameter, not_found, method_not_allowed, unauthorized, forbidden, rate_limited, unsupported_media_type, internal_error.
Markdown representations
Every public page on this domain answers Accept: text/markdown with a CommonMark
representation of itself, per acceptmarkdown.com, and sets
Vary: Accept so a shared cache cannot hand you the wrong one.
curl -H "Accept: text/markdown" https://nuecareer.com/careers/registered-nurse
The same documents are reachable by URL suffix if you would rather not negotiate:
https://nuecareer.com/index.md, https://nuecareer.com/developers.md, https://nuecareer.com/api.md, https://nuecareer.com/agents.md, and .md on any career,
tool or blog URL.
Other machine-readable files
- https://nuecareer.com/llms.txt — the site index, and when to reach for NueCareer.
- https://nuecareer.com/sitemap.xml — every indexable URL.
- https://nuecareer.com/feed.xml — RSS 2.0 for the blog.
- https://nuecareer.com/robots.txt — crawl policy. Every major AI crawler is allowed.
Data licence and attribution
O*NET-derived fields are used under CC BY 4.0.
Every API response carries the required attribution in its attribution object; reproduce it if
you redistribute the data. BLS and BEA figures are U.S. public domain (17 U.S.C. 105).
Personality-fit and AI-resilience scores are NueCareer-derived, not government figures, and are
labelled as such wherever they appear. Full derivation rules: https://nuecareer.com/careers/methodology.
Contact
hello@nuecareer.com. Tell us what you are building — if the API is missing a field you need, it is usually already in the bank.