curl --request POST \
--url https://api.automindz.co/v1/scrape-stepstone-jobs/async \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Python Entwickler",
"location": "Berlin",
"radius": 30,
"rows": 25,
"posted_within_days": 7,
"work_from_home": "partial"
}
'import requests
url = "https://api.automindz.co/v1/scrape-stepstone-jobs/async"
payload = {
"title": "Python Entwickler",
"location": "Berlin",
"radius": 30,
"rows": 25,
"posted_within_days": 7,
"work_from_home": "partial"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: 'Python Entwickler',
location: 'Berlin',
radius: 30,
rows: 25,
posted_within_days: 7,
work_from_home: 'partial'
})
};
fetch('https://api.automindz.co/v1/scrape-stepstone-jobs/async', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.automindz.co/v1/scrape-stepstone-jobs/async",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => 'Python Entwickler',
'location' => 'Berlin',
'radius' => 30,
'rows' => 25,
'posted_within_days' => 7,
'work_from_home' => 'partial'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.automindz.co/v1/scrape-stepstone-jobs/async"
payload := strings.NewReader("{\n \"title\": \"Python Entwickler\",\n \"location\": \"Berlin\",\n \"radius\": 30,\n \"rows\": 25,\n \"posted_within_days\": 7,\n \"work_from_home\": \"partial\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.automindz.co/v1/scrape-stepstone-jobs/async")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Python Entwickler\",\n \"location\": \"Berlin\",\n \"radius\": 30,\n \"rows\": 25,\n \"posted_within_days\": 7,\n \"work_from_home\": \"partial\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.automindz.co/v1/scrape-stepstone-jobs/async")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"Python Entwickler\",\n \"location\": \"Berlin\",\n \"radius\": 30,\n \"rows\": 25,\n \"posted_within_days\": 7,\n \"work_from_home\": \"partial\"\n}"
response = http.request(request)
puts response.read_body{
"request_id": "run_stepstone_abc123",
"status": "QUEUED"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Scrape Stepstone jobs
Search Stepstone and extract structured German job listings with full descriptions
curl --request POST \
--url https://api.automindz.co/v1/scrape-stepstone-jobs/async \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "Python Entwickler",
"location": "Berlin",
"radius": 30,
"rows": 25,
"posted_within_days": 7,
"work_from_home": "partial"
}
'import requests
url = "https://api.automindz.co/v1/scrape-stepstone-jobs/async"
payload = {
"title": "Python Entwickler",
"location": "Berlin",
"radius": 30,
"rows": 25,
"posted_within_days": 7,
"work_from_home": "partial"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: 'Python Entwickler',
location: 'Berlin',
radius: 30,
rows: 25,
posted_within_days: 7,
work_from_home: 'partial'
})
};
fetch('https://api.automindz.co/v1/scrape-stepstone-jobs/async', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.automindz.co/v1/scrape-stepstone-jobs/async",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => 'Python Entwickler',
'location' => 'Berlin',
'radius' => 30,
'rows' => 25,
'posted_within_days' => 7,
'work_from_home' => 'partial'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.automindz.co/v1/scrape-stepstone-jobs/async"
payload := strings.NewReader("{\n \"title\": \"Python Entwickler\",\n \"location\": \"Berlin\",\n \"radius\": 30,\n \"rows\": 25,\n \"posted_within_days\": 7,\n \"work_from_home\": \"partial\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.automindz.co/v1/scrape-stepstone-jobs/async")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Python Entwickler\",\n \"location\": \"Berlin\",\n \"radius\": 30,\n \"rows\": 25,\n \"posted_within_days\": 7,\n \"work_from_home\": \"partial\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.automindz.co/v1/scrape-stepstone-jobs/async")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"Python Entwickler\",\n \"location\": \"Berlin\",\n \"radius\": 30,\n \"rows\": 25,\n \"posted_within_days\": 7,\n \"work_from_home\": \"partial\"\n}"
response = http.request(request)
puts response.read_body{
"request_id": "run_stepstone_abc123",
"status": "QUEUED"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}request_id to poll for results.
include_details, on by default) adds time per job. Poll every 15–30 seconds.How it works
- Builds the Stepstone search from
title, plus optionallocation,radius(kilometres) and any of the filters below - Walks the search pages (25 listings per page, taken whole) up to
rows, de-duplicating by listing. Stepstone pads a result page with adjacent suggestions; only the jobs that actually match the search are returned, andtotal_foundcounts those - When
include_detailsis true (default), fetches each job’s page for the full description, the exact posting date and the employer’s postal address - Returns structured job listings (search URLs, totals, and the jobs array)
title is required — Stepstone’s search is keyword-based, so there is no location-only search. radius only applies when a location is set.Filters
All optional, and all mapped to Stepstone’s own search facets:| Field | Values | Keeps |
|---|---|---|
work_type | full-time, part-time | jobs with that time model |
posted_within_days | 1, 7 | jobs posted in the last day or week (the only two windows Stepstone offers) |
work_from_home | partial, only | jobs offering some home office, or fully remote ones |
job_language | de, en | listings written in that language |
application_method | company-website, quick-apply | jobs that apply off-site, or Stepstone one-click applications |
discipline | accounting, administration, construction, consulting, customer-service, design, education, engineering, finance, health, hospitality, hr, insurance, it, law, logistics, management, manufacturing, marketing, media, retail, sales, science, security, skilled-trades, social-services, travel | jobs in that broad field (Stepstone’s own taxonomy) |
salary_* comes back null on every job.salary_min, salary_max, salary_currency and salary_period are always null on Stepstone results. They are not omitted, so the shape stays the same as every other job source.rows results. rows is a multiple of 25 (25, 50, 75 or 100) because Stepstone pages its results 25 at a time and pages are taken whole. Stepstone offers no result offset, so to harvest a larger search keep rows fixed and step start_page by rows / 25 across runs: with rows: 100, start_page: 1 → 5 → 9 … Stop when a run returns fewer than rows jobs — that’s the last page.Response
The request is accepted immediately and returns arequest_id — no jobs are returned here. Poll Get Stepstone job scrape status with that id to retrieve the results.
{
"request_id": "run_stepstone_abc123",
"status": "QUEUED"
}
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Job title or keyword to search (required). Stepstone's search is path-based (/jobs/<title>), so there is no location-only search.
City, region or postcode to search around (e.g. Berlin). Omit to search all of Germany.
Search radius in kilometres around location. Ignored when no location is given.
x >= 1Maximum number of jobs to scrape in this run (25, 50, 75 or 100; default 25). Stepstone lists 25 per page and pages are taken whole, so this must be a multiple of 25 — otherwise a partial last page would make start_page stepping skip listings.
25 <= x <= 100Must be a multiple of 25Which Stepstone results page to start from (1-based). Stepstone has no result offset, only page numbers, so page through a search that has more matches than the rows cap by stepping start_page by rows / 25 across runs — e.g. rows: 100 with start_page: 1 returns jobs 1-100, start_page: 5 returns 101-200. Stop when a run returns fewer than rows jobs (that's the last page).
x >= 1Employment time model. Stepstone expresses this as a path segment rather than a filter, so it changes the search URL itself.
full-time, part-time Only jobs posted within the last 1 or 7 days. Stepstone offers exactly these two windows — no other value exists on the site.
1, 7 partial keeps jobs offering some home office, only keeps fully remote ones.
partial, only Language the listing is written in, as Stepstone detects it.
de, en company-website keeps jobs that apply off-site, quick-apply keeps Stepstone's one-click applications.
company-website, quick-apply Stepstone's own job-family filter, which narrows a generic keyword to one field. Validated rather than passed through because Stepstone answers an unrecognised discipline with zero results rather than an error, which would be indistinguishable from a search that simply matched nothing.
accounting, administration, construction, consulting, customer-service, design, education, engineering, finance, health, hospitality, hr, insurance, it, law, logistics, management, manufacturing, marketing, media, retail, sales, science, security, skilled-trades, social-services, travel Fetch each job's detail page for the full description, posting date and postal address (slower; one fetch per job). With this off, jobs carry the search-card teaser instead.