🔥Indeed real-time job scraper
Pricing
from $0.05 / 1,000 results
🔥Indeed real-time job scraper
Search a continuously updated database of Indeed job listings in 🇨🇦Canada, 🇩🇪Germany, the 🇳🇱Netherlands, the 🇺🇸United States, and the 🇬🇧United Kingdom. Filter by title, location, company, country, and more, and export structured job and company data (JSON, CSV, or Excel).
Pricing
from $0.05 / 1,000 results
Rating
5.0
(6)
Developer
Hermann Samimi
Maintained by CommunityActor stats
7
Bookmarked
10
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Pingrole Job Search
Search a continuously updated database of LinkedIn job listings across five markets. Filter by title, location, company, country, language, remote and contract type, and posting date. Each match returns structured job and company fields ready to export or pipe into your stack.
Coverage: Germany · Canada · United States · Netherlands · United Kingdom (LinkedIn only)
Quick start (Apify Console)
- Open this Actor in the Apify Console.
- Go to the Input tab.
- Fill in the four required fields: Job Title, Location, Country, and Limit.
- Optionally set company, language, booleans, date range, skip, and sort.
- Click Start.
- When the run finishes, open the Dataset tab to browse results or download as JSON, CSV, Excel, or XML.
The four required fields (Job Title, Location, Country, Limit) open with default values you can edit before running. Optional fields like Skip and Sort use their own defaults.
Input fields
| Field | Required | Description |
|---|---|---|
Job Title (title) | Yes | Default: software engineer. Partial, case-insensitive match. Comma-separated values are OR’d. |
Location (location) | Yes | Default: toronto. Partial, case-insensitive match. Comma-separated OR supported. |
Country (country) | Yes | Default: canada. Exact match: canada, germany, netherlands, United States, United Kingdom. |
Company (company) | No | Partial match on company name. Comma-separated OR supported. |
Language (language) | No | Exact match: en, fr, or de. |
| Remote | No | Checked = remote jobs only. Unchecked with explicit false in API = exclude remote. Leave empty to ignore. |
| Part Time | No | Part-time roles only (same true / false / ignore behavior). |
| Freelancer | No | Freelance roles only. |
| Academic | No | Academic roles only. |
| Research | No | Research roles only. |
| B2B | No | B2B contract roles only. |
Date From (datetime_from) | No | Jobs scraped on or after this time. Formats: 2026-01-01 or 2026-01-01@11:00 (use @ instead of T for time). |
Date To (datetime_to) | No | Jobs scraped on or before this time. Same format as Date From. |
| Limit | Yes | Default: 10. Number of jobs to return per run (1–100). |
| Skip | No | Offset for pagination (default 0). |
| Sort Field | No | datetime_from (newest/oldest by scrape time, default), title, company, language, or country. |
| Sort Direction | No | -1 = descending (newest first when sorting by date). 1 = ascending. |
Boolean filters: In the Console, check a box to require that flag. In the API, use true to include only matching jobs, false to exclude them, or omit the field to ignore it.
Example inputs
Software engineers in Toronto
{"title": "software engineer","location": "Toronto","country": "canada","limit": 20}
Remote data roles in Germany (German listings)
{"title": "data","location": "Berlin","country": "germany","Remote": true,"language": "de","limit": 50}
Product roles at a specific company, posted in May 2026 (page 2)
{"title": "product manager","location": "Amsterdam","country": "netherlands","company": "Booking","datetime_from": "2026-05-01","datetime_to": "2026-05-31","limit": 10,"skip": 10,"sort_field": "datetime_from","sort_direction": -1}
Multiple title keywords (OR)
{"title": "backend, full stack, fullstack","location": "London","country": "United Kingdom","limit": 25}
Output
Each run writes one dataset record per job to your run’s default dataset. Fields are omitted or null when not available on the listing.
| Field | Description |
|---|---|
title | Job title |
company | Company name |
location | Location string |
country | Country |
language | Listing language (en, fr, de, …) |
job_type | e.g. fulltime, parttime |
job_level | Seniority, e.g. mid-senior |
job_url | LinkedIn job posting URL |
description | Full job description text |
timestamp | When the listing was scraped (UTC) |
site | Source site (always linkedin for this Actor) |
job_id | Stable job identifier |
Remote, PartTime, Freelancer, Academic, Research, B2B | Job-type flags |
salary_source, currency | Salary info when present |
company_logo | Logo image URL |
company_url | LinkedIn company page |
company_url_direct | Company website |
company_addresses | Company address data when available |
company_industry | Industry |
company_num_employees | Employee count range |
company_revenue | Revenue band when available |
company_description | Company description |
company_rating | Company rating when available |
The run also saves the same job array to the key-value store under OUTPUT (useful for API consumers that read KV store instead of the dataset).
Example record
{"title": "Software Engineer","company": "Example GmbH","location": "Berlin, DE","country": "germany","language": "de","job_type": "fulltime","job_level": "mid-senior","job_url": "https://www.linkedin.com/jobs/view/4374072722","description": "We are looking for...","timestamp": "2026-05-16 14:50:09.053000","site": "linkedin","salary_source": null,"currency": null,"company_logo": null,"company_url": "https://linkedin.com/company/example-gmbh","company_url_direct": "https://example.com","company_addresses": null,"company_industry": "Software Development","company_num_employees": "51-200","company_revenue": null,"company_description": "Example GmbH is a Berlin-based...","company_rating": null,"Remote": true,"PartTime": false,"Freelancer": false,"Academic": false,"Research": false,"B2B": false,"job_id": "li-4374072722"}
Pagination
Use Limit and Skip together to page through results:
| Page | limit | skip |
|---|---|---|
| 1 | 10 | 0 |
| 2 | 10 | 10 |
| 3 | 10 | 20 |
Each page returns at most limit jobs (max 100 per run). If a page returns fewer records than limit, you have reached the end of the matching set for that query. Run again with a higher skip to fetch the next page.
Run from your code (Apify API)
Replace YOUR_ACTOR_ID with this Actor’s ID or username/name slug from the Apify Store.
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('YOUR_ACTOR_ID').call({title: 'software engineer',location: 'Toronto',country: 'canada',limit: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("YOUR_ACTOR_ID").call(run_input={"title": "software engineer","location": "Toronto","country": "canada","limit": 20,})items = client.dataset(run["defaultDatasetId"]).list_items().items
cURL (start a run)
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"title":"software engineer","location":"Toronto","country":"canada","limit":20}'
Fetch dataset items from the run’s defaultDatasetId in the API response, or download exports from the Console.
Scheduling and integrations
In the Apify Console you can schedule this Actor (e.g. daily) so fresh jobs land in a dataset automatically. Connect the dataset to Google Sheets, Slack, Zapier, Make, Airtable, webhooks, or other Apify integrations without writing custom export code.
Tips
- Start broad on Job Title and Location within your Country, then narrow with boolean flags and optional Company.
- Use Date From / Date To to focus on recently scraped listings.
- Sort by
datetime_fromwith direction -1 for the newest jobs first. - For large pulls, chain multiple runs with increasing
skip(respect the 100-per-run cap).
Support
Built by Hermann Samimi · Pingrole
- Live dashboard: realtime.pingrole.com
- Email: hermannsamimi@gmail.com
- Book a call: calendly.com/hermannsamimi/30min