# Jobware Job Scraper: German Jobs with Company and Location (`bogdiehard/jobware-de-job-scraper`) Actor

Extracts German job postings from jobware.de with title, company, location, posting date and remote flag. Optional full description for jobs with a public job page. Public data only.

- **URL**: https://apify.com/bogdiehard/jobware-de-job-scraper.md
- **Developed by:** [Demetrius Greses Jr](https://apify.com/bogdiehard) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Jobware Job Scraper: German Jobs with Company and Location

Extracts German job postings from jobware.de with title, company, city, posting date, employment type and remote flag, for recruiters, staffing agencies and labor-market analysts who need new jobs by keyword and city.

### Use cases

- **Recruiters and staffing agencies** pull the newest postings for a role and city each morning.
- **Job aggregators** add German job postings with company, city and posting date to their own search pages.
- **Labor-market analysts** count postings per keyword, city and employment type over time.
- **Sales teams** build lists of companies that are hiring for a given role in a region.
- **Career-site teams** track competitors' open positions in the cities where they hire.

### Sample output

| Title | Company | Location | Posted | Type | Remote |
| --- | --- | --- | --- | --- | --- |
| Senior Referent Personalentwicklung & Talentmanagement (m/w/d) - Achern | Securiton GmbH Alarm- und Sicherheitssysteme | Achern | 2026-10-12T14:45:57.000Z | Vollzeit | No |
| Bereichsleiter\*in Serviceprozesse und IT-Beschaffung | Deutsche Rentenversicherung Bund | Würzburg | 2026-10-12T13:43:46.000Z | Vollzeit | No |
| Director (m/w/d) E-Compliance / IT Governance | Daiichi Sankyo Europe GmbH | Pfaffenhofen an der Ilm | 2026-10-12T12:35:28.000Z | Vollzeit | No |

One item as JSON, from a run with the keyword Entwickler and no city:

```json
{
    "id": "064585036",
    "title": "Bereichsleiter*in Serviceprozesse und IT-Beschaffung",
    "company": "Deutsche Rentenversicherung Bund",
    "location": "Würzburg",
    "locations": ["Würzburg"],
    "postalCode": null,
    "region": null,
    "postedAt": "2026-10-12T13:43:46.000Z",
    "datePostedDetail": null,
    "validThrough": null,
    "employmentType": "Vollzeit",
    "remote": false,
    "isNew": true,
    "description": null,
    "companyWebsite": null,
    "jobUrl": "https://www.jobware.de/job/bereichsleiter-in-serviceprozesse-und-it-beschaffung-064585036",
    "logoUrl": "https://www.jobware.de/jobresources/logo/118/57118/594/005855594/4/160x80.gif",
    "sourceUrl": "https://www.jobware.de/job/bereichsleiter-in-serviceprozesse-und-it-beschaffung-064585036",
    "scrapedAt": "2026-10-12T23:00:40.136Z"
}
```

With **Fetch full job details** switched on, a job with a public job page also gets `description`, `datePostedDetail`, `validThrough`, `postalCode`, `region` and `companyWebsite`.

### Pricing

**$3.00 per 1,000 results.** A 500-result run costs about $1.50. You pay only for results saved to your dataset, plus Apify's standard start fee of $0.00005 per run. Apify Silver and Gold plan users get lower per-result prices automatically.

Full job details cost the same per result: each job is one result, however many pages were read to build it.

Set **Max results** to cap what a run can cost. The Actor stops cleanly when it reaches your spending limit.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `queries` | array | Job keywords, one per entry, for example Entwickler or Buchhalter. Each keyword is searched newest first. Required unless Start URLs are given. |
| `location` | string | Optional city or region for every keyword, for example Berlin. Leave empty to search all of Germany. |
| `startUrls` | array | Optional jobware.de search result pages (paths /jobsuche or /jobs--...) or job pages (paths /job/...). Other sites and other paths are ignored. Job pages given here are always read in full. |
| `maxPagesPerQuery` | integer | Search result pages to read for each keyword or start URL, 20 jobs per page. Default 10, maximum 250. |
| `fetchDetails` | boolean | Also open each job page for the full description, the posting and validity dates, postal code and region. Job pages are public for only part of Jobware's jobs (in our October 2026 samples about 15–30% of a search page, fewer deep in the results); the other jobs keep their search-page fields (title, company, location, date, employment type). Default off. |
| `maxItems` | integer | Maximum number of jobs to return. Default 100, maximum 50,000. You are charged per result. |
| `proxyConfiguration` | object | Apify datacenter proxy is used by default. |

Example input:

```json
{
    "queries": ["Entwickler"],
    "location": "Berlin",
    "maxItems": 20
}
```

See the input tab for every option.

### Integrations

- **API:** run the Actor and fetch results with the [Apify API](https://docs.apify.com/api/v2) or the JavaScript and Python clients.
- **AI agents:** call it as a tool through the [Apify MCP server](https://mcp.apify.com).
- **No-code:** connect it to Make, Zapier or n8n, or export results straight to Google Sheets.
- **Scheduling:** run it daily or hourly with Apify Schedules and get only fresh data.

### FAQ

**What are the limits?** jobware.de repeats the same jobs after page 250, so one search yields at most about 5,000 jobs. To reach more, search by city or with narrower keywords and combine the results by the `id` field. Jobs can move between pages while a run is going, so a few may appear twice; the Actor removes those by `id`. With **Fetch full job details** on, only public job pages are read, at about 40 per minute, so the extra time is at most about 25 minutes per 1,000 jobs.

**Why do some jobs have no description?** Job pages are public for only part of Jobware's jobs (in our October 2026 samples about 15–30% of a search page, fewer deep in the results); the other jobs keep their search-page fields (title, company, location, date, employment type). Their job links send anonymous visitors to a login page, so the Actor does not open them and never logs in. The run message says how many jobs had a public job page.

**Does the Actor return salaries?** Salaries are not included: Jobware does not publish them in machine-readable form on job pages.

**Is this legal?** The Actor collects public data only, with no login and no CAPTCHA solving, and it crawls at a polite rate. It is not affiliated with, endorsed by or connected to jobware.de. You are responsible for how you use the data.

**Does it collect personal data?** No. The Actor reads company and job data only, and it has no field for a named contact person. Job descriptions are kept as the employer published them, so they can contain contact details the employer chose to publish.

**Something broke or a field is missing?** Open an issue on the Actor's Issues tab. We answer within one business day and usually ship a fix within 48 hours.

### Related Actors

- [Personio Jobs Scraper: Open Positions from Career Pages](https://apify.com/bogdiehard/personio-jobs-scraper) — open positions from companies that publish their jobs through Personio.

### Changelog

- **0.1** (2026-10-12) — First release.

# Actor input Schema

## `queries` (type: `array`):

Job keywords to search on jobware.de, one per entry, for example Entwickler or Buchhalter. Each keyword is searched newest first. Required unless Start URLs are given.

## `location` (type: `string`):

Optional city or region for every keyword, for example Berlin or Nürnberg. Leave empty to search all of Germany.

## `startUrls` (type: `array`):

Optional jobware.de search result pages (paths /jobsuche or /jobs--...) or job pages (paths /job/...). Other sites and other paths are ignored. Job pages given here are always read in full.

## `maxPagesPerQuery` (type: `integer`):

Search result pages to read for each keyword or start URL, 20 jobs per page. Capped at 250, which is about 5,000 jobs per search on jobware.de.

## `fetchDetails` (type: `boolean`):

Also open each job page for the full description, the posting and validity dates, postal code and region. Job pages are public for only part of Jobware's jobs (in our October 2026 samples about 15–30% of a search page, fewer deep in the results); the other jobs keep their search-page fields (title, company, location, date, employment type). One extra page request per public job page, so runs are slower.

## `maxItems` (type: `integer`):

Maximum number of jobs to return. You are charged per result.

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy is used by default.

## Actor input object example

```json
{
  "queries": [
    "Entwickler"
  ],
  "location": "Berlin",
  "maxPagesPerQuery": 10,
  "fetchDetails": false,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `stats` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "Entwickler"
    ],
    "location": "Berlin",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bogdiehard/jobware-de-job-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "queries": ["Entwickler"],
    "location": "Berlin",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("bogdiehard/jobware-de-job-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "Entwickler"
  ],
  "location": "Berlin",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call bogdiehard/jobware-de-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bogdiehard/jobware-de-job-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/zbc8Nyt2Rmzuvdw0e/builds/WN4hYv2vUqeZcIj6U/openapi.json
