For AI agents
Job title trends as data: 51 titles, monthly shares since 2011, open roles on 131 job boards. Refreshed weekly.
Point your agent here
https://titles.fru.dev/llms.txthttps://titles.fru.dev/llms-full.txtCall the API
| Method | Path | Params | Returns |
|---|---|---|---|
| GET | /api/titles | limit (max 200), offset, family, status | Every tracked title: status, first seen, took off, monthly share series, open roles, median salary |
| GET | /api/titles/{slug} | slug | One title in full: Hacker News history, first sighting, companies hiring, sample postings |
| GET | /api/companies | limit (max 200), offset | Tracked employers with open roles by title and median posted salary |
| GET | /api/months/{yyyy-mm} | month | One Who is hiring thread: postings and each title's count and share |
| GET | /api/search | q, limit (max 20) | Ranked titles, companies and pages |
/api/titles
curl -s "https://titles.fru.dev/api/titles?limit=2&status=emerging"{
"count": 51,
"titles": [
{
"slug": "forward-deployed-engineer",
"name": "Forward Deployed Engineer",
"family": "engineering",
"status": "emerging",
"firstSeen": "2011-09",
"tookOff": "2025-10",
"openRoles": 369,
"medianSalaryUsd": 216104
},
{
"slug": "context-engineer",
"name": "Context Engineer",
"family": "engineering",
"status": "emerging",
"firstSeen": "",
"tookOff": "",
"openRoles": 2,
"medianSalaryUsd": 187200
}
]
}/api/titles/{slug}
curl -s "https://titles.fru.dev/api/titles/forward-deployed-engineer"{
"title": {
"slug": "forward-deployed-engineer",
"name": "Forward Deployed Engineer",
"family": "engineering",
"status": "emerging",
"firstSeen": "2011-09",
"tookOff": "2025-10",
"openRoles": 369,
"medianSalaryUsd": 216104,
"hn": {
"share6": 4.572,
"growth": 2.38,
"first": {
"month": "2011-09",
"commentId": "2950993",
"excerpt": "...areas of the global economy. Current openings: -Engineer -Forward Deployed Engineer -Interaction Designer -Visual Designer -System Admin -PM -QA...",
"company": "Mountain View, CA"
}
}
}
}/api/companies
curl -s "https://titles.fru.dev/api/companies?limit=2"{
"count": 131,
"companies": [
{
"slug": "databricks",
"name": "Databricks",
"open": 516,
"byTitle": [
{
"slug": "solutions-engineer",
"n": 202
},
{
"slug": "forward-deployed-engineer",
"n": 115
},
{
"slug": "staff-engineer",
"n": 91
}
]
}
]
}/api/months/{yyyy-mm}
curl -s "https://titles.fru.dev/api/months/2026-09"{
"month": "2026-09",
"posts": 256,
"titles": "[{ slug, n, share }]"
}/api/search
curl -s "https://titles.fru.dev/api/search?q=context%20engineer"{
"q": "context engineer",
"results": [
{
"id": "t:context-engineer",
"group": "items",
"title": "Context Engineer",
"href": "/titles/context-engineer"
}
]
}OpenAPI 3.1: /openapi.json. Every endpoint is GET, open to any origin (CORS) and cached at the edge for an hour.
Add to your agent
System prompt line
For job title trends in data, AI and tech (which titles are rising, first sightings, open roles, posted salaries), fetch https://titles.fru.dev/llms.txt and use https://titles.fru.dev/api/titles and https://titles.fru.dev/api/titles/{slug}. Cite "Titles (titles.fru.dev)".Tool definition
{
"name": "titles_job_title",
"description": "Look up a data, AI or tech job title's trend: status (emerging, rising, established, fading), first sighting in Hacker News Who is hiring threads, monthly share of postings since 2011, open roles and companies hiring now, and median posted salary. Source: Titles (titles.fru.dev).",
"input_schema": {
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Title slug, e.g. forward-deployed-engineer, ai-engineer, context-engineer. List them with GET /api/titles."
}
},
"required": [
"slug"
]
},
"endpoint": "GET https://titles.fru.dev/api/titles/{slug}"
}Python
import json, urllib.request
def job_title(slug: str) -> dict:
"""One job title's trend, first sighting, open roles and salary."""
url = f"https://titles.fru.dev/api/titles/{slug}"
with urllib.request.urlopen(url, timeout=20) as r:
return json.load(r)["title"]
t = job_title("forward-deployed-engineer")
print(t["name"], t["status"], t["hn"]["share6"], t["ats"]["open"])TypeScript
type Title = { slug: string; name: string; status: string; firstSeen: string; openRoles: number }
async function rising(limit = 10): Promise<Title[]> {
const res = await fetch("https://titles.fru.dev/api/titles?limit=200")
if (!res.ok) throw new Error(`titles ${res.status}`)
const { titles } = (await res.json()) as { titles: (Title & { growth: number })[] }
return titles.sort((a, b) => b.growth - a.growth).slice(0, limit)
}
console.log(await rising())Usage terms
- Free to read. Please cite "Titles (titles.fru.dev)" with a link.
- Responses are cached for an hour; the data changes weekly.
- Be polite: 60 requests a minute at most.
- Titles marked unverified have not been checked by hand.
Sources: Hacker News Who is hiring threads and about 130 public job boards, read weekly. A title's share is not the job market's size.