Skip to main content

Fake Job Postings API

MOCK DATA

Realistic job postings with level-coherent USD salary ranges — filter by level, department, employment type and remote, and every filter truly works.

Generated test data for fixtures and development

Base URL
/api/jobs
Category
People
Capabilities
1 route Seedable
Last updated
July 29, 2026

GET /api/jobs

Live requestRuns against the public API
No key required
GET/api/jobs?level=senior&department=engineering&count=5

Request parameters

Only generate postings at this seniority — pins the salary band of every record. Omit for a realistic mix.

Only generate roles from this department's title pool. Omit for a mix across all 10 departments.

Only generate this employment type. 'internship' overrides the level's salary band to $20,000–$45,000. Omit for a mostly full-time mix.

true ⇒ only remote postings; false ⇒ only on-site. Omit for a mix (roughly a third remote).

Advanced response options7 options

How many records to generate (1–100).

Deterministic output: the same seed always returns the same records. Omit for random (the used seed is echoed in meta.seed).

Return only these fields (comma-separated). Mutually exclusive with 'exclude'.

Return all fields except these (comma-separated).

Response format: json envelope, ndjson (one record per line) or csv.

Pretty-print the JSON response.

Drop the envelope: return the raw array/object without data/meta wrapper.

Response

Example parameters are ready. Send the request to inspect the live response.

Route reference

Code samples Ready-to-copy requests in 4 languages
Choose a code sample language
curl "https://randomapi.dev/api/jobs?department=engineering&level=senior&count=5"
const res = await fetch("https://randomapi.dev/api/jobs?department=engineering&level=senior&count=5");
const { data, meta } = await res.json();
import requests

data = requests.get("https://randomapi.dev/api/jobs?department=engineering&level=senior&count=5").json()["data"]
$json = json_decode(file_get_contents(
  "https://randomapi.dev/api/jobs?department=engineering&level=senior&count=5"
), true);
$data = $json["data"];
Parameters Route-specific request inputs 4
level enum

Only generate postings at this seniority — pins the salary band of every record. Omit for a realistic mix.

allowed: junior | mid | senior | lead | principal
example: level=senior
department enum

Only generate roles from this department's title pool. Omit for a mix across all 10 departments.

allowed: engineering | design | product | marketing | sales | finance | hr | operations | support | legal
example: department=engineering
employmentType enum

Only generate this employment type. 'internship' overrides the level's salary band to $20,000–$45,000. Omit for a mostly full-time mix.

allowed: full-time | part-time | contract | internship
example: employmentType=full-time
remote boolean

true ⇒ only remote postings; false ⇒ only on-site. Omit for a mix (roughly a third remote).

example: remote=true
Universal parameters Shared response and formatting options 7
count int

How many records to generate (1–100).

default: 10
allowed: 1 – 100
example: count=3
seed int

Deterministic output: the same seed always returns the same records. Omit for random (the used seed is echoed in meta.seed).

example: seed=42
fields list

Return only these fields (comma-separated). Mutually exclusive with 'exclude'.

example: fields=title,level
exclude list

Return all fields except these (comma-separated).

example: exclude=currency
format enum

Response format: json envelope, ndjson (one record per line) or csv.

default: json
allowed: json | ndjson | csv
example: format=csv
pretty boolean

Pretty-print the JSON response.

default: false
example: pretty=true
unwrap boolean

Drop the envelope: return the raw array/object without data/meta wrapper.

default: false
example: unwrap=true
Response schema Fields returned in each record 8
title string

Role title: a base role from the department's pool with the level's prefix (Junior/Senior/Lead/Principal — mid-level has none).

example: Senior Backend Engineer

level string

junior | mid | senior | lead | principal — always consistent with the title prefix and salary band.

example: senior

department string

The department the role belongs to (one of 10).

example: engineering

employmentType string

full-time | part-time | contract | internship.

example: full-time

remote boolean

Whether the posting is remote.

example: true

salaryMin integer

Lower end of the advertised range — annual USD, a round thousand inside the level's band (internships: $20,000–$45,000).

example: 128000

salaryMax integer

Upper end of the advertised range — same band, always at least $5,000 above salaryMin.

example: 152000

currency string

Always "USD".

example: USD

Documented examples

Build-generated requests and complete responses
4
Senior engineering roles
GET /api/jobs?department=engineering&level=senior&count=5
{
  "data": [
    {
      "title": "Senior Mobile Engineer",
      "level": "senior",
      "department": "engineering",
      "employmentType": "full-time",
      "remote": false,
      "salaryMin": 129000,
      "salaryMax": 150000,
      "currency": "USD"
    },
    {
      "title": "Senior Backend Engineer",
      "level": "senior",
      "department": "engineering",
      "employmentType": "full-time",
      "remote": false,
      "salaryMin": 139000,
      "salaryMax": 165000,
      "currency": "USD"
    },
    {
      "title": "Senior Frontend Engineer",
      "level": "senior",
      "department": "engineering",
      "employmentType": "part-time",
      "remote": false,
      "salaryMin": 136000,
      "salaryMax": 155000,
      "currency": "USD"
    },
    {
      "title": "Senior Machine Learning Engineer",
      "level": "senior",
      "department": "engineering",
      "employmentType": "full-time",
      "remote": true,
      "salaryMin": 123000,
      "salaryMax": 164000,
    …
    "generatedAt": "2026-07-29T08:13:22.000Z"
  }
}
Remote design internships
GET /api/jobs?department=design&employmentType=internship&remote=true&count=3
{
  "data": [
    {
      "title": "Junior UX Researcher",
      "level": "junior",
      "department": "design",
      "employmentType": "internship",
      "remote": true,
      "salaryMin": 34000,
      "salaryMax": 43000,
      "currency": "USD"
    },
    {
      "title": "Junior Product Designer",
      "level": "junior",
      "department": "design",
      "employmentType": "internship",
      "remote": true,
      "salaryMin": 20000,
      "salaryMax": 34000,
      "currency": "USD"
    },
    {
      "title": "Junior Visual Designer",
      "level": "junior",
      "department": "design",
      "employmentType": "internship",
      "remote": true,
      "salaryMin": 22000,
      "salaryMax": 33000,
      "currency": "USD"
    }
  ],
  "meta": {
    "endpoint": "jobs",
    "count": 3,
    "seed": 42,
    "params": {
      "department": "design",
      "employmentType": "internship",
    …
    "generatedAt": "2026-07-29T08:13:22.000Z"
  }
}
On-site contract roles in sales
GET /api/jobs?department=sales&employmentType=contract&remote=false&count=5
{
  "data": [
    {
      "title": "Account Manager",
      "level": "mid",
      "department": "sales",
      "employmentType": "contract",
      "remote": false,
      "salaryMin": 101000,
      "salaryMax": 110000,
      "currency": "USD"
    },
    {
      "title": "Junior Account Executive",
      "level": "junior",
      "department": "sales",
      "employmentType": "contract",
      "remote": false,
      "salaryMin": 66000,
      "salaryMax": 78000,
      "currency": "USD"
    },
    {
      "title": "Lead Account Executive",
      "level": "lead",
      "department": "sales",
      "employmentType": "contract",
      "remote": false,
      "salaryMin": 169000,
      "salaryMax": 191000,
      "currency": "USD"
    },
    {
      "title": "Junior Sales Engineer",
      "level": "junior",
      "department": "sales",
      "employmentType": "contract",
      "remote": false,
      "salaryMin": 55000,
      "salaryMax": 64000,
    …
    "generatedAt": "2026-07-29T08:13:22.000Z"
  }
}
A reproducible page of postings
GET /api/jobs?seed=42
{
  "data": [
    {
      "title": "Senior Sales Development Representative",
      "level": "senior",
      "department": "sales",
      "employmentType": "full-time",
      "remote": false,
      "salaryMin": 116000,
      "salaryMax": 124000,
      "currency": "USD"
    },
    {
      "title": "Junior Brand Manager",
      "level": "junior",
      "department": "marketing",
      "employmentType": "full-time",
      "remote": false,
      "salaryMin": 59000,
      "salaryMax": 70000,
      "currency": "USD"
    },
    {
      "title": "Junior Product Owner",
      "level": "junior",
      "department": "product",
      "employmentType": "part-time",
      "remote": false,
      "salaryMin": 55000,
      "salaryMax": 75000,
      "currency": "USD"
    },
    {
      "title": "Senior Frontend Engineer",
      "level": "senior",
      "department": "engineering",
      "employmentType": "full-time",
      "remote": false,
      "salaryMin": 153000,
      "salaryMax": 163000,
    …
    "generatedAt": "2026-07-29T08:13:22.000Z"
  }
}

About this API

Coverage & behavior

Generates believable job postings for job boards, ATS demos and HR fixtures. Everything is fake, but every record is internally coherent: the title is built from the posting's actual department pool with its level's natural prefix ("Senior Backend Engineer", "Junior UX Researcher", "Lead Account Executive" — mid-level roles carry no prefix), and the salary range always sits inside the level's band.

Salary bands (annual, USD):

  • junior $55,000–$85,000
  • mid $80,000–$120,000
  • senior $115,000–$165,000
  • lead $150,000–$210,000
  • principal $190,000–$280,000
  • any internship $20,000–$45,000 (overrides the level band)

salaryMin and salaryMax are round thousands with at least a $5,000 spread, salaryMin is always strictly below salaryMax, and both always stay inside the band.

Every filter genuinely constrains every record:

  • level pins the seniority — and therefore the salary band. When level is set, the mix never includes internships, so the band holds for all records. Omitted, you get a realistic pyramid (mid and senior most common).
  • department pins the role family: every title comes from that department's pool (10 departments, 70 role titles).
  • employmentType pins full-time / part-time / contract / internship. internship overrides the salary band to $20,000–$45,000 — combining it with an explicit level keeps the level but adds a warning about the override. Omitted, most postings are full-time and internships appear only at junior level.
  • remote keeps every posting remote (true) or on-site (false). Omitted, roughly a third are remote.

With a seed the same request returns byte-identical postings forever.

Use it for

  • Seed a job board or ATS demo with believable, filterable openings
  • Test salary-range sliders and seniority facets against data where the bands actually hold
  • Reproducible hiring-pipeline fixtures in CI via seed

Frequently asked questions

Do salaries match seniority?

Yes — salaryMin/salaryMax are generated from the level, so a junior range never out-earns a principal range. Fixtures stay believable.

Which filters genuinely work?

level, department, employmentType and remote — all four filter generation for real; that's contract-tested, not decorative.

What currency are the salaries?

USD annual ranges — the currency field says so explicitly in every record.