# Indeed Germany Jobs Scraper (`unfenced-group/indeed-de-scraper`) Actor

Scrape job listings from Indeed Germany. Returns titles, full descriptions, salary, company profiles, geo-coordinates and hiring signals. Pay per result.

- **URL**: https://apify.com/unfenced-group/indeed-de-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** Jobs
- **Stats:** 26 total users, 12 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 jobs

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Indeed DE Scraper

![Indeed DE Scraper](https://api.apify.com/v2/key-value-stores/iWrKTxDceABvh6b4y/records/banner.png)

Extract job listings from de.indeed.com at scale, with the richest field set available: full descriptions, structured salary, company profiles, precise geo-coordinates and hiring signals. No API key required.

***

### Why this scraper?

#### 🎯 Built for Germany

A dedicated German scraper, not a global tool with a country dropdown. Salary parsing, location handling and currency (EUR) are tuned for de.indeed.com.

#### 📄 Complete job data

Full job title, description in both HTML and plain text, apply URL, publish date, and the date the job first appeared on Indeed.

#### 💶 Structured salary

Minimum, maximum, pay period and currency, parsed from the listing. Estimated figures are flagged so you can filter them out.

#### 🏢 Company profiles

Company name, industry, employee count, revenue band, corporate website and logo where Indeed publishes them.

#### 📍 Precise location

Full address, city, postal code, region code, country and latitude/longitude, plus a remote-work flag.

#### 🔁 Repost detection

Every record carries hiring-demand signals so you can spot urgent and high-volume postings at a glance.

***

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `query` | string | `"entwickler"` | Job title or keyword to search for. |
| `location` | string | (empty) | City, region or postal code. Leave empty to search all of Germany. |
| `radius` | integer | `25` | Search radius around the location, in kilometres. |
| `sort` | string | `"relevance"` | Sort by `relevance` or `date` (newest first). |
| `fromDays` | string | (empty) | Limit to jobs posted within the last 1, 3, 7 or 14 days. Empty means any time. |
| `maxItems` | integer | `100` | Maximum number of listings to return. Set to `0` for unlimited. |

***

### Output schema

Every field below is present on every record. Fields that Indeed does not publish for a given job are returned as `null` rather than omitted.

| Field | Type | Description |
|---|---|---|
| `jobKey` | string | Indeed's unique identifier for the listing. |
| `title` | string | Job title. |
| `jobUrl` | string | Direct link to the listing on de.indeed.com. |
| `descriptionHtml` | string | Full job description as HTML. |
| `descriptionText` | string | Full job description as plain text. |
| `descriptionMarkdown` | string | Full job description converted to Markdown. |
| `location.raw` | string | Full address line as published. |
| `location.city` | string | City. |
| `location.postalCode` | string | Postal code (null if not published). |
| `location.streetAddress` | string | Street address (null if not published). |
| `location.countryName` | string | Country name. |
| `location.countryCode` | string | Two-letter country code. |
| `location.admin1Code` | string | Region or province code. |
| `location.admin2Code` | string | Sub-region code (null if not published). |
| `location.latitude` | number | Latitude. |
| `location.longitude` | number | Longitude. |
| `location.isRemote` | boolean | Whether the role is remote. |
| `salary.salaryText` | string | Salary as published (null if not stated). |
| `salary.salaryMin` | number | Minimum salary (null if not published). |
| `salary.salaryMax` | number | Maximum salary (null if not published). |
| `salary.salaryType` | string | Pay period: HOUR, DAY, WEEK, MONTH or YEAR. |
| `salary.salaryCurrency` | string | Currency code (e.g. EUR). |
| `salary.isEstimated` | boolean | Whether the figure is an Indeed estimate rather than employer-stated. |
| `companyName` | string | Employer name (null if not published). |
| `companyUrl` | string | Indeed company profile URL (null if not published). |
| `companyIndustry` | string | Industry (null if not published). |
| `companyNumEmployees` | string | Employee-count band (null if not published). |
| `companyRevenue` | string | Revenue band (null if not published). |
| `companyLogo` | string | Company logo URL (null if not published). |
| `companyHeaderUrl` | string | Company header image URL (null if not published). |
| `corporateWebsite` | string | Employer's own website (null if not published). |
| `datePublished` | string | ISO date the job was published. |
| `dateOnIndeed` | string | ISO date the job first appeared on Indeed. |
| `attributes` | array | Skill and requirement labels attached to the listing. |
| `hiringDemand.isUrgentHire` | boolean | Whether Indeed flags the role as an urgent hire. |
| `hiringDemand.isHighVolumeHiring` | boolean | Whether the role is part of high-volume hiring. |
| `language` | string | Language of the listing. |
| `locale` | string | Locale of the source site (de\_DE). |
| `source` | string | Source host (de.indeed.com). |
| `scrapedAt` | string | ISO timestamp of the scrape. |

#### Example record

```json
{
  "jobKey": "2aa489becfc76419",
  "title": "Softwareentwickler",
  "jobUrl": "https://de.indeed.com/viewjob?jk=2aa489becfc76419",
  "descriptionText": "...",
  "location": {
    "raw": "Friedrichstraße 68, Berlin",
    "city": "Berlin",
    "postalCode": "10117",
    "countryCode": "DE",
    "admin1Code": "BE",
    "latitude": 52.16878,
    "longitude": 4.989674,
    "isRemote": false
  },
  "salary": {
    "salaryText": "55.000 € - 70.000 € pro Jahr",
    "salaryMin": 55000,
    "salaryMax": 70000,
    "salaryType": "YEAR",
    "salaryCurrency": "EUR",
    "isEstimated": false
  },
  "companyName": "Example Company",
  "companyIndustry": "Information Technology",
  "datePublished": "2026-07-01T05:00:00.000Z",
  "dateOnIndeed": "2026-07-01T09:12:00.000Z",
  "attributes": [
    "Java",
    "Spring",
    "Docker",
    "SQL"
  ],
  "hiringDemand": {
    "isUrgentHire": false,
    "isHighVolumeHiring": false
  },
  "language": "de",
  "locale": "de_DE",
  "source": "de.indeed.com",
  "scrapedAt": "2026-07-02T08:00:00.000Z"
}
```

***

### Examples

**Search for entwickler roles in Berlin:**

```json
{
  "query": "entwickler",
  "location": "Berlin",
  "maxItems": 100
}
```

**Recent postings only, sorted by date:**

```json
{
  "query": "entwickler",
  "location": "Berlin",
  "sort": "date",
  "fromDays": "3",
  "maxItems": 200
}
```

**Wide-area search with a larger radius:**

```json
{
  "query": "entwickler",
  "location": "Berlin",
  "radius": 50,
  "maxItems": 500
}
```

**Daily feed of new jobs across Germany:**

```json
{
  "query": "entwickler",
  "location": "",
  "sort": "date",
  "fromDays": "1",
  "maxItems": 1000
}
```

***

### 💰 Pricing

**$0.76 per 1,000 results** — you only pay for successfully retrieved listings. Failed retries are never charged.

| Results | Cost |
|---|---|
| 100 | ~$0.08 |
| 1,000 | ~$0.76 |
| 10,000 | ~$7.60 |
| 100,000 | ~$76.00 |

> Flat-rate alternatives typically charge $29–$49/month regardless of usage.

Subscription tiers lower the rate further, from $0.73 per 1,000 down to $0.64 per 1,000 at the highest tier. Use the **Max results** cap in the input to control your spend exactly.

***

### Performance

| Run size | Typical time |
|---|---|
| 100 results | under 1 minute |
| 1,000 results | 2–4 minutes |
| 10,000 results | 20–35 minutes |

***

### Known limitations

- Salary is only returned when the employer or Indeed publishes it. Many listings have no salary.
- Company profile depth varies by employer. Large companies return full profiles; smaller employers return only what Indeed holds.
- Indeed caps how deep any search can page. Very broad queries return a large but finite slice, not every matching job ever posted.

***

### Technical details

- **Source:** de.indeed.com — Germany job listings
- **Coverage:** nationwide, filterable by location and radius
- **Retry:** automatic retry on network errors with exponential backoff

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

## `query` (type: `string`):

Job title or keyword. Example: 'softwareentwickler', 'krankenpfleger'.

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

City, region or postal code. Example: 'Berlin', 'Munchen'. Leave empty to search all of Germany.

## `radius` (type: `integer`):

Search radius around the location, in kilometres.

## `sort` (type: `string`):

Sort results by relevance or date posted.

## `fromDays` (type: `string`):

Limit to jobs posted within the last N days.

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

Maximum number of job listings to return. Set to 0 for unlimited (up to the source's paging cap).

## Actor input object example

```json
{
  "query": "entwickler",
  "location": "Berlin",
  "radius": 25,
  "sort": "relevance",
  "fromDays": "",
  "maxItems": 100
}
```

# Actor output Schema

## `results` (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 = {
    "query": "entwickler"
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/indeed-de-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 = { "query": "entwickler" }

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

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

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

```

## CLI example

```bash
echo '{
  "query": "entwickler"
}' |
apify call unfenced-group/indeed-de-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=unfenced-group/indeed-de-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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