
Google Ads Scraper
scrape.ly/store/querystone/google-ads-scraperLead generationSEO tools
4 monthly users

Scrape job ads from stellenanzeigen.de, one of Germany's largest job boards, by keyword, location and filters, or from search and job URLs. Get title, company, place, salary, working time, home office, dates, the full description, requirements, benefits, contacts and application links.
Scrape job ads from stellenanzeigen.de, one of Germany's largest job boards, by keyword, city and filters, or straight from search and job URLs. You get the title, employer, place, salary, working time, home-office option and dates for every job, and with full ads also the complete description, requirements, tasks, benefits, contact details and application links. No login, no browser, and a 20-job run usually finishes in a few seconds.
online, offline, expired or removed.Software Engineer, Pflegefachkraft) and a location (Berlin, München, Bayern, 10115). Or paste stellenanzeigen.de search or job URLs.| Field | What it does |
|---|---|
searchQueries | Keywords, one search each. Jobs found twice are saved once. |
location | City, district, federal state or postal code in Germany. Empty = all of Germany. |
startUrls | stellenanzeigen.de search pages (/jobs/...) and job ads (/job/...). |
maxResults | Most jobs to save in the run (default 20, 0 = all). |
maxResultsPerQuery | Optional cap per keyword or search URL. |
includeJobDetails | Load each full ad (default on). |
radius | Search radius in km (default 30). |
postedWithinDays | 0 any time, 1 since yesterday, 7 last 7 days, 30 last 30 days. |
sortBy | relevance (the site's order) or newest. |
employmentTypes, contractTypes, homeOffice, positionLevel, company | The site's own filters. |
{
"searchQueries": ["Software Engineer", "DevOps"],
"location": "Berlin",
"radius": 30,
"postedWithinDays": "7",
"maxResults": 100,
"includeJobDetails": true
}
Check whether ads are still online:
{
"startUrls": [
{ "url": "https://www.stellenanzeigen.de/job/devop-m-w-d-syss-ai-offensive-platform-muenchen-frankfurt-am-main-tuebingen-sde-124202/" }
]
}
One row per job. The main fields:
| Field | Example |
|---|---|
title, company | IT-Anwendungsbetreuer DMS & Archivsystem (m/w/d), SBK Siemens-Betriebskrankenkasse |
location, locations, zip_code, state, state_code | Berlin; Berlin, Leipzig, München; 10178; Berlin; BE |
latitude, longitude, distance_km | Coordinates and distance from your location |
salary_text, salary_min, salary_max, salary_period | 66.000 - 85.000 EUR pro Jahr, 66000, 85000, year |
employment_type, remote_option, is_leading_position | full-time, hybrid, false |
hours_per_week_min, hours_per_week_max, experience_months, industries | When the ad states them |
description_text, description_html, description_md | The full ad |
requirements, responsibilities, benefits | Bullet lists from the ad |
contact_salutation, contact_name, contact_email, contact_phone | When the ad names a contact |
apply_url, apply_email, direct_apply | How to apply |
posted_at, originally_posted_at, expires_at | ISO dates |
job_status | online, offline, expired, removed |
job_url, partner_url, company_logo_url | Links |
Example from a real run (trimmed):
{
"id": "SDE-118104",
"title": "IT-Anwendungsbetreuer DMS & Archivsystem - d.3 / helic_21cdocs (m/w/d)",
"company": "SBK Siemens-Betriebskrankenkasse",
"location": "Berlin",
"locations": [
"Berlin",
"Leipzig",
"München"
],
"zip_code": "10178",
"work_address": "10178 Berlin",
"state": "Berlin",
"state_code": "BE",
"country": "DE",
"latitude": 52.51787,
"longitude": 13.40389,
"employment_type": "full-time",
"remote_option": "hybrid",
"is_leading_position": false,
"salary_text": "66.000 - 85.000 EUR pro Jahr",
"salary_min": 66000,
"salary_max": 85000,
"salary_currency": "EUR",
"salary_period": "year",
"description_snippet": "Werde IT-Anwendungsbetreuer für DMS & Archivsysteme bei der SBK! Übernehme die technische Verantwortung und unterstütze unser Team in der Gesundheitsversorgung durch innovative Lösungen.",
"description_text": "IT-Anwendungsbetreuer DMS & Archivsystem –\nd.3 / helic_21cdocs (m/w/d)\nStandort: München, Berlin, Leipzig\n„Was zählt für dich?“ Das fragen wir uns …",
"requirements": [
"Du hast ein abgeschlossenes Studium der (Wirtschafts-)Informatik oder eine Ausbildung zum Fachinformatiker für Systemintegration mit entsprechender Berufserfahrung in der Anwendungsbetreuung.",
"Du verfügst über Erfahrung im technischen Betrieb von Applikationen, im Service Request, Incident-, Problem- und Change-Management sowie in der Dienstleistersteuerung."
],
"responsibilities": [
"Du übernimmst die technische Verantwortung für unsere Dokumentenmanagement- und Archivsystem, vor allem für das Produkt helic_21cdocs und das d.3 Archivsystem.",
"Als zentrale Ansprechperson bist du für den 2nd-Level-Support zuständig und arbeitest eng mit internen Fachbereichen sowie externen Dienstleistern zusammen."
],
"benefits": [
"Nachhaltiger Arbeitgeber",
"Jobticket",
"Gesundheitsangebote",
"Vermögenswirksame Leistung",
"Weiterbildungsangebote",
"Urlaub >= 30",
"Flexible Arbeitszeiten",
"Jobrad",
"Attraktive Konditionen und Rahmenbedingungen: Bezahlung nach Tarif der bayerischen Metall- und Elektroindustrie, 38-Stunden-Woche und 30 Urlaubstage pro Jahr (bei Vollzeit)"
],
"industries": [
"Anwendungsbetreuung",
"ECM",
"Groupware",
"IT-Infrastruktur",
"Systemadministration"
],
"hours_per_week_min": 38,
"hours_per_week_max": 38,
"workload_text": "38-Stunden-Woche",
"contact_email": "recruiting@sbk.org",
"contact_phone": "+49 (89) 62700-701",
"apply_url": "https://sbk.csod.com/ux/ats/careersite/17/requisition/2499/application?c=sbk&sq=req2499&source=stellenanzeigen&jobboardid=0#1",
"direct_apply": false,
"posted_at": "2026-10-15T00:00:00Z",
"originally_posted_at": "2026-08-31T00:00:01Z",
"expires_at": "2026-10-31T21:59:00Z",
"job_status": "online",
"reference_number": "2538006",
"source_portal": "stanz",
"company_logo_url": "https://dxl6houvklhzf.cloudfront.net/public/jobs/SDE-118104/company_logo/70091-160x80.gif",
"job_url": "https://www.stellenanzeigen.de/job/it-anwendungsbetreuer-dms-archivsystem-d-3-helic-21cdocs-m-w-d-leipzig-berlin-muenchen-sde-118104/",
"has_details": true,
"scraped_at": "2026-10-22T02:18:36.106Z"
}
You pay per saved job:
Example: 1,000 jobs with full ads ≈ $5.00, plus about $0.03 of platform usage (compute and proxy traffic, billed separately; measured on a 1,000-job run). 1,000 list-only jobs ≈ $1.75 plus well under a cent of usage. A search that finds nothing costs nothing but that usage. If a full ad cannot be loaded, the job is saved from the search list and charged at the list price.
Is it legal to scrape stellenanzeigen.de? The actor only reads public job ads that anyone can see without an account. Ads can name contact persons: handle that personal data under the GDPR and your own legal basis, and check the site's terms for your use.
Do I need an account, cookies or a proxy? No account or cookies. The default datacenter proxy works; if the site starts refusing requests, the run moves to German residential exits on its own.
How many jobs can I get?
As many as the search holds. Set Maximum results to 0 to take every job of a search. For every job on the site (around 30,000), paste https://www.stellenanzeigen.de/jobs/ as a search URL. In our tests 10,000 jobs with full ads took about 9 minutes and 10,000 list-only jobs about 2 minutes.
Why are some fields empty? Fields such as salary, contact person, phone or weekly hours are only filled when the employer put them in the ad. List-only runs have no description, requirements or contacts.
Why do I see jobs that do not contain my keyword? stellenanzeigen.de also matches related terms and spelling variants, and "newest first" brings in more loosely matching ads. Use "relevance" for the closest matches.
Can I schedule it or use the API? Yes. Save the input as a task, schedule it (for example daily with "since yesterday"), and read the dataset through the API or an integration.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
searchQueriesarrayOptionalSearch keywords
Job titles, skills or company names to search for, one per line (for example `Software Engineer`, `Pflegefachkraft`, `Lagerist`). Each keyword runs as its own search; jobs found by several keywords are saved once. Leave empty to list all jobs in the location.
locationstringOptionalLocation
City, district, federal state or postal code in Germany (for example `Berlin`, `München`, `Kreis Kleve`, `Bayern`, `10115`). Leave empty to search all of Germany.
startUrlsarrayOptionalSearch or job URLs
Optional stellenanzeigen.de URLs: search result pages (for example `https://www.stellenanzeigen.de/jobs/it/berlin/` or a `/jobs/?fulltext=...` link copied from the site) and single job ads (`https://www.stellenanzeigen.de/job/...-sde-123456/`). Job URLs are also a quick check whether an ad is still online: its row says `online`, `offline`, `expired` or `removed`.
maxResultsintegerOptionaldefault 20Maximum results
The most jobs to save in this run, across all keywords and URLs. Set 0 to save every job the searches return (a search can hold tens of thousands of jobs).
maxResultsPerQueryintegerOptionalMaximum results per search
Optional cap for each keyword or search URL. Leave empty to share Maximum results fairly between the searches.
includeJobDetailsbooleanOptionaldefault trueInclude full job ads
On: open every job ad for the full description, requirements, tasks, benefits, contact details, industries and application data (priced per job with details). Off: save only what the search list shows (title, company, place, salary, dates, short summary) at the lower list price.
Narrow the keyword and location searches. Search URLs keep the filters they already contain.
radiusintegerOptionaldefault 30Radius (km)
Search radius around the location in kilometres. The site offers 10, 20, 30, 40, 50, 75, 100 and 200 km; other values work too.
postedWithinDaysenumOptionaldefault "0"Posted within
Only jobs published or refreshed in this period.
sortByenumOptionaldefault "relevance"Sort by
Relevance is the site's own order. Newest lists the most recently published or refreshed jobs first, which suits scheduled runs, but it also brings in loosely matching jobs.
employmentTypesarrayOptionalWorking time
Full-time and/or part-time jobs. Leave empty for both.
contractTypesarrayOptionalContract type
Only jobs with these contract types. Leave empty for all.
homeOfficeenumOptionaldefault "any"Home office
Only jobs that allow working from home.
positionLevelenumOptionaldefault "any"Position level
Leadership or non-leadership positions.
companystringOptionalCompany
Only jobs from employers whose name contains this text (for example `Randstad`).
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work well for stellenanzeigen.de. The run switches to German residential exits by itself if the site starts refusing requests.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| id | string | Job ad id on stellenanzeigen.de (e.g. SDE-124202, YF-52862, JIM-375532) |
| title | string | null | Job title |
| company | string | null | Employer name |
| location | string | null | First place of work (city) |
| locations | array | null | All places of a multi-location ad, in the ad's order |
| zip_code | string | null | Postal code of the first place of work |
| work_address | string | null | Street (when given), postal code and city |
| state | string | null | German federal state (Bundesland) |
| state_code | string | null | Federal state code (BY, BE, NW...) |
| country | string | null | Country code |
| latitude | number | null | Latitude of the first place of work |
| longitude | number | null | Longitude of the first place of work |
| distance_km | number | null | Distance from the searched location in km (location searches only) |
| employment_type | string | null | Working time and contract labels: full-time, part-time, freelance, temporary, internship... |
| remote_option | string | null | remote (100% home office), hybrid (home office possible) or empty |
| is_leading_position | boolean | null | True for leadership positions |
| salary_text | string | null | Salary as a readable range, e.g. 3.500 - 4.300 EUR pro Monat |
| salary_min | number | null | Lower salary bound |
| salary_max | number | null | Upper salary bound |
| salary_currency | string | null | Salary currency |
| salary_period | string | null | month, year or hour; estimated from the amount when the ad gives no period |
| description_snippet | string | null | Short summary shown in the search list |
| description_text | string | null | Full job ad as plain text (full ads only) |
| description_html | string | null | Full job ad as HTML (full ads only) |
| description_md | string | null | Full job ad as Markdown (full ads only) |
| requirements | array | null | Requirement bullets from the profile section (Ihr Profil, Das bringst du mit...) |
| responsibilities | array | null | Task bullets (Ihre Aufgaben, Das erwartet dich...) |
| benefits | array | null | Benefit tags the site detected plus the ad's benefit bullets (Wir bieten...) |
| industries | array | null | Industries of the job (full ads only) |
| experience_months | number | null | Required work experience in months, when the ad states it |
| hours_per_week_min | number | null | Weekly hours, lower bound, when the ad states them |
| hours_per_week_max | number | null | Weekly hours, upper bound |
| workload_text | string | null | Weekly hours as written in the ad |
| contact_salutation | string | null | Contact person salutation (Herr / Frau) |
| contact_name | string | null | Contact person named in the ad |
| contact_email | string | null | Contact email found in the ad |
| contact_phone | string | null | Contact phone number found in the ad |
| apply_url | string | null | External application link |
| apply_email | string | null | Application email address |
| direct_apply | boolean | null | True when you apply on stellenanzeigen.de itself |
| posted_at | string | null | Current publication or refresh date (ISO 8601); the date the newest sort and the posted-within filter use |
| originally_posted_at | string | null | First publication date (ISO 8601) |
| expires_at | string | null | Date the ad runs until (ISO 8601) |
| job_status | string | null | online, offline, expired or removed |
| reference_number | string | null | Employer reference number, or the ad id |
| external_job_id | string | null | Employer-side job id from the ad's structured data |
| product_type | string | null | Ad product: Paid, PaidBackfill, InternalBackfill... |
| source_portal | string | null | Portal the ad comes from (stanz, yourfirm, appcast_stanz...) |
| company_logo_url | string | null | Company logo image |
| job_url | string | Job ad on stellenanzeigen.de |
| partner_url | string | null | The same ad on its partner portal, when it comes from one |
| ad_html_url | string | null | The ad's original HTML layout |
| search_query | string | null | Keyword that found the job |
| search_location | string | null | Location the search used |
| has_details | boolean | null | True when the full ad was loaded |
| scraped_at | string | When the job was scraped (ISO 8601) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Job from the search list | One saved job with the search-list data only (full ads switched off, a removed ad, or a full ad that could not be loaded). | $0.0018 |
| Job with full ad | One saved job with its full ad: description, requirements, tasks, benefits, contacts and application data. | $0.005 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('openrole/stellenanzeigen-scraper').call({
"searchQueries": [
"Software Engineer"
],
"location": "Berlin",
"maxResults": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run openrole/stellenanzeigen-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=openrole/stellenanzeigen-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
No examples yet
The developer hasn't published example inputs for this actor.

Scrape Google Maps places for any search term and city, with no code or with one API call. A real run, its output, its log and its exact cost, plus the limits and the legal side.
Read the article
Paste an Amazon search or product URL into a ready-made Actor and get one row per product with price, ASIN, rating and review count. This guide covers the no-code steps, the API, ZIP code pricing, a real run and its cost.
Read the article
Scrape Google search results by query and country and get each results page as JSON: organic results with positions, People Also Ask and related searches. Run it without code or from Python, with a real run, the cost per page and Google's terms.
Read the articleScrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.