# StepStone Jobs API — job search, full job postings and employer jobs (Germany, Austria, Belgium, Netherlands)

> Search live StepStone job ads by keyword and location with the site's own filters — radius, posted date, salary bucket, home office, full/part time, contract type, experience, quick apply, industry, skill and ad language. 25 jobs per page.
> ReefAPI engine `stepstone` · 3 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/stepstone/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Clients that add connectors by URL, such as ChatGPT and the Claude app, connect with OAuth 2.1 (the user pastes their key once on a ReefAPI page; discovery at `/.well-known/oauth-protected-resource/mcp`). Config files send the key as `Authorization: Bearer <key>`. `?key=<key>` in the URL also works as a last-resort fallback.

## Endpoints

### POST https://api.reefapi.com/stepstone/v1/search — 2 credits
Search live StepStone job ads by keyword and location with the site's own filters — radius, posted date, salary bucket, home office, full/part time, contract type, experience, quick apply, industry, skill and ad language. 25 jobs per page.

**Parameters:**
- `query` (string, optional) — Job title, skill or keyword, as you would type it into StepStone's 'what' box. Either `query` or `location` is required.
- `location` (string, optional) — City, region or postcode (StepStone's 'where' box). Either `query` or `location` is required.
- `radius` (integer, optional, default 30) — Search radius around `location` in km (site default 30). Measured: Hamburg software engineer 30 km = 512 jobs, 100 km = 698.
- `market` (enum, optional, default "de") — Which StepStone site to read. stepstone.fr no longer runs a job board (it redirects to the group's corporate site), so France is not offered. [one of: de, at, be, nl]
- `page` (integer, optional, default 1) — Result page, 25 jobs per page. `has_more` / `last_page` in the answer say when to stop.
- `posted_within_days` (enum, optional) — Only jobs published in the last N days (1, 3, 7 or 14). Measured: 512 → 26 (1 day) → 284 (7 days). [one of: 1, 3, 7, 14]
- `min_salary` (enum, optional) — Minimum yearly salary bucket (EUR, steps of 10000). StepStone applies it to its own salary estimate for the job. Measured 512 → 398 at 60000. [one of: 10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000, 100000]
- `work_from_home` (enum, optional) — partial = 'Teilweise Home-Office', full = remote only. Measured 512 → 377 (partial), 20 (full). [one of: partial, full]
- `work_type` (enum, optional) — Full-time or part-time. Measured 512 → 57 (part_time). [one of: full_time, part_time]
- `contract_type` (enum, optional) — Contract type: permanent, fixed term, temp agency, trainee, freelance, apprenticeship, thesis, internship, working student. [one of: permanent, fixed_term, temp_agency, trainee, freelance, apprenticeship, thesis, internship, working_student]
- `experience` (enum, optional) — Experience level. Measured 512 → 120 (no_experience). [one of: no_experience, with_experience, management]
- `application_method` (enum, optional) — quick_apply = StepStone's own one-click application, company_website = apply on the employer's site. Measured 512 → 53 (quick_apply). [one of: quick_apply, company_website]
- `sector_id` (string, optional) — Industry id from the `facets.sectors` list of a previous search (e.g. 21000 = IT & Internet). Measured 512 → 304.
- `skill_id` (string, optional) — Skill id from `facets.skills` of a previous search (e.g. 657911 = Python). Measured 512 → 88.
- `language` (string, optional) — Language the ad is written in, two letters (de, en, nl, fr…), from `facets.detectedLanguages`. Measured 512 → 51 (en).
- `exact_matches_only` (boolean, optional, default false) — StepStone pads results with nearby-region and similar-title jobs (`match_type` regional / semantic). true drops those rows from the answer (the page still costs one call); the count of each kind is in `counts`.

**Returns:** jobs[] (job_id, title, url, company_id, company_name, location, date_posted, publish_to, snippet, benefits[], home_office, salary{min,max,currency,period,is_estimate}, quick_apply, labels, match_type …), total, counts by match type, page/last_page/has_more, applied_filters (as echoed by StepStone) and facets (every filter value with its live count and the parameter it feeds).

**Example request body:**
```json
{
  "query": "software engineer",
  "location": "Berlin",
  "market": "de"
}
```

### POST https://api.reefapi.com/stepstone/v1/job — 3 credits
The full job posting: every text section (intro, tasks, profile, benefits, extra info), company card, address with coordinates when published, posted and expiry dates, contract and work type, employment type, industry, benefits, StepStone's salary estimate.

**Parameters:**
- `job_id` (string, optional) — The `job_id` of a search row. Either `job_id` or `url` is required.
- `url` (string, optional) — A StepStone job URL (any of the four sites). The market is taken from the URL's host.
- `market` (enum, optional, default "de") — Which StepStone site to read. stepstone.fr no longer runs a job board (it redirects to the group's corporate site), so France is not offered. [one of: de, at, be, nl]

**Returns:** job{} — job_id, title, company{company_id, name, open_jobs, employees, sectors, address, founded, about}, location, address{street, postal_code, city, country, latitude, longitude}, date_posted, valid_through, employment_type, contract_type, work_type, industry, salary (StepStone's estimate, is_estimate=true), benefits[], sections[{name,title,text}], description_text, description_html, quick_apply, is_offline.

**Example request body:**
```json
{
  "url": "https://www.stepstone.de/stellenangebote--Software-Engineer--14711651-inline.html"
}
```

### POST https://api.reefapi.com/stepstone/v1/company_jobs — 2 credits
All open jobs of one employer on StepStone, 25 per page — the employer's own job list.

**Parameters:**
- `company_id` (string, required) — The employer's `company_id` from a search row or a job.
- `query` (string, optional) — Optional keyword to narrow the employer's jobs.
- `market` (enum, optional, default "de") — Which StepStone site to read. stepstone.fr no longer runs a job board (it redirects to the group's corporate site), so France is not offered. [one of: de, at, be, nl]
- `page` (integer, optional, default 1) — Result page, 25 jobs per page.

**Returns:** jobs[] (same row shape as search), company_id, company_name, total, page/last_page/has_more.

**Example request body:**
```json
{
  "company_id": "378466"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=stepstone
- Human docs page: https://reefapi.com/docs/stepstone
- Overview page: https://reefapi.com/stepstone-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
