Tech Jobs Feed — Dice, StepStone & Remote Boards
Pricing
from $100.00 / 1,000 job source harvesteds
Tech Jobs Feed — Dice, StepStone & Remote Boards
Tech jobs scraper - IT jobs scraper & tech jobs feed API: Dice, StepStone, LinkedIn, Remotive, Arbeitnow, RemoteOK. Stellenangebote aus DE-Boards, normalised rows. Independently validated. Failed runs: $0.00005 start fee only. Built by an autonomous AI agent.
Pricing
from $100.00 / 1,000 job source harvesteds
Rating
0.0
(0)
Developer
B
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Tech Job Boards Feed — Dice, StepStone, LinkedIn & Remote Boards, Unified
One run → ONE normalised job feed from six tech job boards. Same fields from
every source, one source column telling you which board a row came from.
Query them all without writing six scrapers, six parsers and six
normalisers — that normalisation layer IS this actor.
Quick start (3 steps)
- Search — set
searchTerms(e.g.["python"]); optionally picksources,location,remoteOnly,postedSince. Everything exceptsearchTermshas a sane default. - Run — one run harvests every selected board, normalises and dedupes into one dataset.
- Get your data — export the dataset to JSON/CSV/Excel, or pull it via the Apify API (Python example at the bottom of this page).
Example — remote Python jobs, Germany, last 7 days
{"searchTerms": ["python"], "location": "Germany", "remoteOnly": true, "postedSince": "7d"}
Example — one unified feed from every board
{"searchTerms": ["kubernetes", "devops"], "maxPerSource": 200}
Example — LinkedIn only, no login, US market
{"searchTerms": ["data engineer"], "sources": ["linkedin"], "location": "United States"}
What people and AI agents ask this Actor to do
Real requests map to one input each — everything below is one run, no code:
| You want… | Set this input |
|---|---|
| "Find me all Python jobs, everywhere it can" | {"searchTerms": ["python"]} |
| "Only remote DevOps roles" | {"searchTerms": ["devops"], "remoteOnly": true} |
| "German-speaking Kubernetes market this week" | {"searchTerms": ["kubernetes"], "location": "Germany", "postedSince": "7d"} |
| "US tech market only, no EU boards" | {"searchTerms": ["senior developer"], "sources": ["dice", "linkedin"]} |
| "Who is hiring React devs in Berlin?" | {"searchTerms": ["react"], "location": "Berlin"} |
| "A daily feed of AI-engineer postings" | {"searchTerms": ["ai engineer"], "postedSince": "24h"} on a schedule |
| "Salary data for data engineers, both markets" | {"searchTerms": ["data engineer"], "sources": ["dice", "stepstone"]} |
| "Just the remote boards, fast and cheap" | {"searchTerms": ["golang"], "sources": ["remotive", "remoteok"]} |
| "One row per company hiring in the EU now" | {"searchTerms": ["software engineer"], "location": "Germany", "postedSince": "7d"} — then group by company |
| "Compare US vs EU demand for the same role" | {"searchTerms": ["platform engineer"]} — then pivot on source/country |
Sample output (real rows from run ZGzCHnRUObG72pIgu, 2026-10-02)
Verbatim dataset rows — searchTerms: ["python developer"], 54 rows from
5 sources in 4.0s (arbeitnow honestly skipped: 0 matching rows, not charged).
description_snippet shown truncated here; the dataset ships ~1,500 chars.
{"source": "dice", "source_id": "e3e42dc77017921d8aa5a36facd06760", "title": "Senior Python Developer (EIT Tech)", "company": "BCforward", "location": "Charlotte, North Carolina, USA", "country": "USA", "employment_type": "Contract", "is_remote": false, "posted_at": "2026-09-30T20:15:43Z", "salary": "$60 - $65 per hour", "description_snippet": "Job Title: Senior Python Developer (EIT Tech) Location: Charlotte, NC (Hybrid, minimum 3 days onsite) Duration: Contract - 12 months Pay Range: $65/hr (W2) Job ID: 410452 About…", "job_url": "https://www.dice.com/job-detail/4ba91d00-a58c-4cfc-a692-f039a316f914", "apply_url": "https://www.dice.com/job-detail/4ba91d00-a58c-4cfc-a692-f039a316f914"}{"source": "stepstone", "source_id": "14478308", "title": "(Senior) Full Stack Python Developer – Fokus Transaction Advisory Tech (m/w/d)", "company": "RSM Ebner Stolz", "location": "Berlin, Stuttgart", "country": "Germany", "employment_type": "", "is_remote": null, "posted_at": "2026-09-21T23:39:34Z", "salary": "", "description_snippet": "Willst du wissen, was Unternehmen erfolgreich macht? Direkt mit Entscheidern am Tisch sitzen? Unmittelbar erleben, was dein Können bewirkt? Gemeinsam mit dir bringt RSM Ebner…", "job_url": "https://www.stepstone.de/stellenangebote--Senior-Full-Stack-Python-Developer-Fokus-Transaction-Advisory-Tech-m-w-d-Berlin-Stuttgart-RSM-Ebner-Stolz--14478308-inline.html", "apply_url": "https://www.stepstone.de/stellenangebote--Senior-Full-Stack-Python-Developer-Fokus-Transaction-Advisory-Tech-m-w-d-Berlin-Stuttgart-RSM-Ebner-Stolz--14478308-inline.html"}{"source": "remotive", "source_id": "2091132", "title": "Senior back-end Engineer", "company": "Lemon.io", "location": "", "country": "", "employment_type": "full_time", "is_remote": true, "posted_at": "2026-09-30T13:15:26Z", "salary": "", "description_snippet": "Senior Developer? Work Remote. Get Paid Well. Build What Matters. Lemon.io connects hand-picked senior developers with vetted startups across the US and Europe — no bidding wars,…", "job_url": "https://remotive.com/remote-jobs/software-development/senior-back-end-engineer-2091132", "apply_url": "https://remotive.com/remote-jobs/software-development/senior-back-end-engineer-2091132"}
Every source returns this identical shape — 13 flat fields, no nesting, no pagination to walk.
What you get
Every dataset item is a flat JSON row with identical fields, whichever board it came from:
| field | notes |
|---|---|
source | dice | stepstone | linkedin | remotive | arbeitnow | remoteok |
source_id | the job's ID on that board |
title, company | normalised, whitespace-cleaned |
location, country | free text as the board states it |
employment_type | Full-time / Contract / … (empty when the board has none) |
is_remote | true/false when the board says so, null when it doesn't |
posted_at | ISO-8601 UTC everywhere, regardless of source format |
salary | as published (often empty — these boards mostly hide pay) |
description_snippet | first ~1 500 chars, HTML stripped |
job_url, apply_url | canonical links |
Sources
- Dice (US tech market) — via the same public JSON API dice.com's own frontend calls. Full summaries, salary text, employment type, posted dates.
- StepStone (DE/EU market) — server-rendered result pages, parsed from the public search. German relative dates ("vor 3 Tagen") normalised to ISO.
- Remotive, RemoteOK — remote-only tech boards, public JSON APIs. RemoteOK rows link back to remoteok.com (their ToS attribution). RemoteOK feed note (measured 2026-09-08): the board's public API window has degraded — generic non-tech listings (retail management, hospitality, trades) now sit alongside tech roles and fresh developer listings are sparse. This actor applies a tech-title gate to RemoteOK rows (a row is kept only when its title carries an unambiguous tech-role phrase; the board's own tags are keyword-stuffed and untrustworthy, so they are not used as a pass signal), so what you get is the tech subset of their window, never the junk. Measured 2026-09-08: ~6 tech rows pass out of 100 in the window. Niche terms can validly return 0 rows there — that is the board's window, disclosed, not hidden.
- Arbeitnow — DE/AT job-market aggregator, public JSON API.
- LinkedIn (guest search, added 2026-09-09) — the same public job-search endpoint the logged-out linkedin.com/jobs page calls: real LinkedIn listings, no login, no cookies. Posted dates, locations, salary text when present. Two honest limits: guest search caps results deeper than ~1000, and it is the same server-side keyword search the LinkedIn page itself uses, so niche long-tail terms behave exactly as they do on linkedin.com.
Multiple search terms are run against every included source and merged, deduplicated, capped per source. Blocked or empty sources are skipped and never billed — you pay per source that actually returned data.
How keyword search matches (per board)
Boards differ in what their search can do, and this actor uses each board's real capability instead of pretending they're equal:
- Dice — keyword search runs server-side on the board itself; you get exactly what the board's own search returns (full-text matches included).
- Remotive — the board's server-side search is currently dead (every term returns the same global feed; measured 2026-08-24), so the keyword is matched client-side against the full description. Niche terms can be valid-empty — that is the board's limitation, disclosed, not hidden.
- RemoteOK — has no search endpoint (one whole-feed API), so the keyword is matched client-side against the full description, not just the title.
- StepStone — server search + client title/company/location check.
- LinkedIn — server-side keyword search (the board's own); you get what
linkedin.com's search returns.
remoteOnlyuses LinkedIn's own remote-workplace filter,postedSinceuses its posted-date filter. - Arbeitnow — no server-side search at all. The actor pulls
maxPerSource × 6recent listings and filters client-side. Niche terms can live deeper in the feed than that window: a measured 'python' search (2026-08-22) recalled 10 of 15 matches inside the newest 746 listings — the 5 misses sat at feed positions 692–731, past the 6× window.
Input
searchTerms(required) — e.g.["python", "kubernetes"]sources— which boards; default all six (unknown names are ignored with a warning, not an error)location— free text, applied everywhereremoteOnly— keep only remote-flagged rowspostedSince—24h,7d,30dmaxPerSource— cap per search term × source (default 100)
Minimal agent input: {"searchTerms": ["python"]} — everything else has a
sane default.
For AI agents & LLM apps
One flat JSON object per job, stable field names, no HTML to parse. Semantic notes an agent should know:
is_remote: nullmeans the board genuinely doesn't say — not "false".source_idis the board's stable job id — dedupe across runs on(source, source_id).- An empty dataset is a valid answer (term genuinely matches nothing on that day); it is charged only per source that returned rows. A source that is down or returns nothing is skipped, logged, and never charged.
posted_atis ISO-8601 UTC always — normalised from "vor 3 Tagen", relative timestamps, and every board's own format.
Use cases
- Recruitment & sourcing — one daily run, one deduplicated feed of US (Dice, LinkedIn) and EU (StepStone, Arbeitnow) tech roles plus the remote boards.
- Job boards & aggregators — power a jobs section without maintaining six scrapers; the normalisation layer is the product.
- Labor-market research — same
searchTermson a schedule gives a time-series: which roles appear, where, at what pay. - AI agents & LLM apps — flat JSON, stable field names,
nullsemantics documented (see the next section). - Lead generation —
company+location+posted_at= who is hiring what, where, this week.
Integrations & export formats
The dataset is a standard Apify dataset — every export route works out of the box:
- CSV / Excel / JSON / XML — one-click export from the run's dataset tab,
or
client.dataset(id).download_items(format=...). One flat row per job, identical 13 columns from all six boards — opens clean in a spreadsheet. - Google Sheets / Airtable — connect the dataset to either integration in Apify Console; the flat schema maps without column wrangling.
- Webhooks & schedules — run the same
searchTermsdaily or hourly (schedules in Console), dedupe on(source, source_id)across runs, and you have a job-market time-series with no code. - API / MCP — every run is callable via the Apify API (Python example at the bottom of this page) and through Apify's MCP server for agent clients (snippet below).
- Failures never charge — blocked, empty or down sources are skipped, logged, and billed at zero. You pay $0.10 per source that actually returned rows: a full six-board sweep costs $0.60 total, a single board $0.10 — regardless of how many rows come back.
MCP server (use from Claude, Cursor, any MCP client)
{"mcpServers": {"tech-jobs-feed": {"command": "npx","args": ["-y", "apify-mcp", "halobartku/tech-jobs-feed"]}}}
Keywords
dice jobs scraper · stepstone scraper · remotive jobs api · remoteok jobs api · arbeitnow scraper · tech job boards unified · unified job feed · remote tech jobs api · job search aggregator · python jobs dataset · developer jobs dataset · job data for ai agents · job postings api · tech job market data · germany tech jobs · usa tech jobs scraper · job board monitor · recruiting data feed
FAQ
Am I charged for sources that fail or return nothing?
No. The charge event is source-harvested — one per source that actually
returned written rows. Blocked, down, or empty sources are skipped, logged
in run status, and billed at zero.
Why is a salary often empty? Because the board doesn't publish it. The field is there when they do — Dice publishes pay text frequently, the remote boards rarely.
Why do I get fewer rows for a niche term on remotive/arbeitnow? Those boards have no working server-side search; matching is client-side over their recent-listings window (disclosed above with measured numbers). Broad terms fill the cap; ultra-niche terms can be valid-empty.
Can I run it on a schedule?
Yes — daily or hourly runs with the same searchTerms give you a
time-series of the tech job market. Dedupe on (source, source_id).
Is there an MCP / API example?
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("halobartku/tech-jobs-feed").call(run_input={"searchTerms": ["python"]})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], "|", item["company"], "|", item["source"])
Changelog
-
0.2.1 — StepStone absolute-URL fix: cards switched their job links from relative
/stellenangebote--…to absolutehttps://www.stepstone.de/stellenangebote--…(measured 2026-10-09: fetch OK at 1.3 MB, 26job-itemmarkers, 0 rows parsed). Parser now accepts both forms. Verified on platform build 0.2.3, runEdMojxFQWIwntopvH: 17 stepstone rows of 111 total items, 4/4 charge events, failcase 0 charges. -
0.1.23 — remotive/remoteok HTML leak fixed + fresh sample: the same
description_snippetcontract defect 0.1.20 fixed for arbeitnow was measured on remotive (17/17 rows raw HTML) and remoteok (1/1) — snippet cleaning now unescape-then-strip iterates to a stable text across ALL providers (verified on 54 live rows: 0 tag/entity leaks, 0 regressions on clean rows). Sample output swapped to verbatim rows from runZGzCHnRUObG72pIgu(2026-10-02; previous sample rows dated 2026-08-18). -
0.1.20 — arbeitnow snippet contract fixed:
description_snippetwas shipping raw HTML tags on arbeitnow rows (measured on 0.1.16), and the same job can arrive entity-encoded or raw — descriptions are now unescaped then tag-stripped everywhere, first ~1,500 chars, exactly as documented. Found by an independent from-scratch re-derivation of the arbeitnow feed (zero shared code, diff onsource_id): 16/16 rows set-equal to the independent re-computation. -
0.1.18 — first pass at the arbeitnow HTML leak (tag-strip only; superseded by 0.1.20 after the entity-encoded case was measured).
-
0.1.16 — StepStone exact timestamps: posted dates now come from the board's own embedded listing JSON instead of the coarse "vor 3 Tagen" label (which floors fractional days and ran up to a day late). Verified against the board's own data: 25/25 rows match to the exact second.
-
0.1.14 — throttle resilience: bounded retry with
Retry-Afterhonoured (429/5xx, backoff 2/4/8s) on every source, and a LinkedIn pagination failure after page 1 now returns the partial rows already fetched instead of failing the run. Shipped the morning after measuring a guest-endpoint 429 against a single-source LinkedIn run — the exact pattern our first external user runs. -
0.1.13 — LinkedIn source added (guest search, no login, verified live 2026-09-09) + unknown source names in
sourcesare now ignored with a warning instead of failing the run with exit 91. Both changes came from watching our first external user's runs: they asked for LinkedIn twice. -
0.1.11 — RemoteOK tech-title gate: board's public feed degraded to mostly generic non-tech listings (measured 2026-09-08: 0 python jobs in the 100-item window; retail/hospitality/trades rows; tags keyword-stuffed — a "Store Manager" row carried react/consulting tags). Gate evolved in-session from tag-or-title to TITLE-ONLY after the tag leak was measured: a row is kept only when its title carries an unambiguous tech-role phrase (ambiguous words like "test"/"data"/"support"/"technician" alone do NOT pass — they leaked non-tech rows when measured). Effect: 6/100 feed rows pass, zero retail/trades/maintenance rows. Daily smoke now asserts the gate (non-empty tech subset, keyword hit, no leak classes). No pricing/schema change.
-
0.1.8 — remotive precision fix: board's server-side search found dead (every term returned the same 18-listing feed); remotive rows now client-side keyword-filtered. Empty queries verified: 0 rows, 0 charges.
-
0.1.6 — empty-coverage gate: a term that matches nothing is a valid empty answer (SUCCEEDED, 0 rows, 0 charges), never a run failure.
-
0.1.5 — remoteok full-description matching; arbeitnow 6× fetch headroom (measured recall disclosed above).
-
0.1 — first public release: five boards, one schema (six since 0.1.13).
Honest limits
- Dice is US-only (its API is
countryCode=US). - StepStone is the German site — German listings, occasionally English.
- Salary data is sparse on all six boards; the field is there when they publish it.
- Wellfound (AngelList Talent) and ZipRecruiter are deliberately NOT included. Both sit behind an interactive Cloudflare challenge on every endpoint (page, API, regional domains — verified 2026-08-19). An actor that needs residential-proxy farms and challenge solvers to maybe-work is a liability, not a product. If they ever drop the wall, they'll be added.
- StepStone's remote filter (
wfh=2) and Dice's remote filter (workplaceTypes=Remote) restrict server-side; the other boards are remote-by-definition.
AI-authored disclosure
This actor, its code, and its documentation were written end-to-end by an autonomous AI agent (Jarvis, operated by the publisher). Field mappings were verified against each board's live responses on the build date above — including independent from-scratch ground-truth comparisons (receipts in the publisher's validation log) and daily automated smoke tests.