# LinkedIn Jobs Scraper – Canada, Full Details, No Login (`loudtzu/linkedin-public-jobs-scraper`) Actor

Privacy-masked LinkedIn jobs: no recruiter names, emails/phones masked. Full details: description, CAD salary min/max, seniority, type, function, industries, applicants. Canada/province filters. No login. $0.39 per 1,000 jobs.

- **URL**: https://apify.com/loudtzu/linkedin-public-jobs-scraper.md
- **Developed by:** [Travis M](https://apify.com/loudtzu) (community)
- **Categories:** Business, Other
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.39 / 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.

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

## LinkedIn Jobs Scraper: Canada filters, full details, no login ($0.39 per 1,000 jobs)

**Privacy-masked by default:** no recruiter names, and emails and phone numbers in descriptions are masked. Search **public LinkedIn job listings** by keyword and location and get one clean row per job with the **full job details**: description, salary, seniority, employment type, job function, industries and applicant count. It's built for Canada, with a Canada-only filter, a province/territory filter, CAD salary parsing and province codes. It works for any location.

You don't need a LinkedIn account, cookies or proxies. The Actor reads only the same logged-out job pages anyone can open in a browser.

### Why this one

| | This Actor | Other LinkedIn jobs Actors on the Store |
|---|---|---|
| Privacy by default | **No personal data.** Recruiter or "hiring team" names are never collected; emails and phone numbers inside job descriptions are masked before saving | Some return poster names or profiles |
| Price | $0.00039 per job on every plan, no start fee, full details included | Store rivals use per-job or per-plan pricing, some with start fees; see their Store pages (checked Oct 24, 2026) |
| Full description, seniority, type, function, industries, applicants | ✅ included at the same price | Varies by Actor |
| Salary parsed into min / max / currency / period | ✅ `CA$89,900/yr – CA$167,100/yr` → `89900`, `167100`, `CAD`, `year` | Varies by Actor |
| Canada-only + province filter, `province` code | ✅ | Varies |
| Honest blocking | Clear "Blocked by LinkedIn" status, keeps the jobs already collected | Varies |

Rival prices per job from the Store on Oct 24, 2026 (Free plan → best plan, start fee): worldunboxer/rapid-linkedin-scraper $0.00035 → $0.0003 detailed ($0.0001 "quick" mode with fewer fields) + $0.00005; automation-lab $0.000575 → $0.00014 + $0.005; valig $0.0004 → $0.00028 + $0.001; memo23 → $0.00025 (Gold+); cheap_scraper $0.0007 → $0.00035 + $0.005; bebity $0.0015; curious_coder $0.002. Several are cheaper per job on some or all plans.

### Input

| Field | Default | Notes |
|---|---|---|
| `keywords` | | e.g. `data analyst`, `registered nurse`, `Shopify` |
| `location` | `Canada` | e.g. `Halifax, Nova Scotia`, `Toronto`, `Canada` |
| `canadaOnly` | `true` | Drops non-Canadian locations that LinkedIn mixes in |
| `provinces` | all | e.g. `["ON","BC"]` |
| `datePosted` | `any` | `24h`, `week`, `month` |
| `jobTypes` / `workplaceTypes` / `experienceLevels` | all | full-time…, on-site/remote/hybrid, entry…executive |
| `includeJobDetails` | `true` | Same price either way |
| `maxItems` | 100 | Up to 50,000 in total, but LinkedIn shows only ~1,000 results per search, so for more jobs run several narrower searches (by province, date or job type) |

```json
{ "keywords": "software developer", "location": "Canada", "provinces": ["ON", "NS"], "datePosted": "week", "maxItems": 200 }
```

### Output (one row per job)

| Field | Example |
|---|---|
| `jobId`, `url` | `4459245596`, `https://www.linkedin.com/jobs/view/4459245596/` |
| `title`, `companyName`, `companyUrl`, `companyLogoUrl` | `Senior Software Developer`, `IBM` |
| `location`, `province`, `isCanada` | `Toronto, Ontario, Canada`, `ON`, `true` |
| `postedDate`, `postedTimeText`, `isActivelyHiring` | `2026-10-22`, `20 hours ago` |
| `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | only when the employer publishes it |
| `seniorityLevel`, `employmentType`, `jobFunction`, `industries` | `Mid-Senior level`, `Full-time` |
| `applicantsText`, `applicantsApprox` | `102 applicants`, `102` |
| `applyType`, `isClosed` | `offsite` / `easy-apply`, `false` |
| `description` | Full text, emails and phone numbers masked |
| `searchKeywords`, `searchLocation`, `detailsIncluded`, `scrapedAt` | |

### Use cases

- Job-market and salary research for Canadian cities and provinces
- Recruiting agencies tracking which companies are hiring for a role
- Career sites and newsletters (link back to the LinkedIn posting)
- AI agents: flat JSON with stable `jobId`s, ready for analysis

### Honest limits

- **Public, logged-out pages only.** The Actor uses no account, cookies or proxies, and it names itself in its user agent. It paces itself at about 1 request every 1–1.4 seconds. 429 and 5xx errors are retried 3 times (2/4/8 seconds); a login wall or a 999/403 response is not retried.
- If LinkedIn blocks this server, the run says **"Blocked by LinkedIn on this server … No bypass attempted"** and keeps every job collected so far. Very large or frequent runs are more likely to be blocked; split them up.
- LinkedIn shows only about 1,000 results per search (`maxItems` above that won't add more for one search), and results can repeat across pages (duplicates are removed).
- Salary appears only when the employer publishes it. Applicant counts are LinkedIn's rounded figures.
- **No proxy.** LinkedIn often blocks or rate-limits datacenter IPs, and this Actor runs without a proxy, so big runs may stop early (you're charged only for jobs saved).
- No company enrichment (company size, followers, website). You get the company name, LinkedIn URL and logo only.
- New Actor with no reviews yet.
- No people data: recruiter, poster and hiring-team names and profiles are never read or stored.

# Actor input Schema

## `keywords` (type: `string`):

Job title, skill or company, e.g. 'data analyst'.

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

City, province or country as you'd type it on LinkedIn, e.g. 'Toronto, Ontario' or 'Canada'.

## `canadaOnly` (type: `boolean`):

Drop results whose location isn't in Canada (LinkedIn sometimes mixes in nearby US jobs).

## `provinces` (type: `array`):

Keep only jobs in these provinces (2-letter codes). Empty = all.

## `datePosted` (type: `string`):

Posted within.

## `jobTypes` (type: `array`):

Empty = all.

## `workplaceTypes` (type: `array`):

Empty = all.

## `experienceLevels` (type: `array`):

Empty = all.

## `includeJobDetails` (type: `boolean`):

Open each job for description, salary, seniority, type, function, industries and applicant count. Same price; turn off only for speed.

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

Total jobs (up to 50,000). LinkedIn shows ~1,000 per search, so split large pulls into several searches. You pay per job saved.

## Actor input object example

```json
{
  "keywords": "software developer",
  "location": "Canada",
  "canadaOnly": true,
  "datePosted": "any",
  "includeJobDetails": true,
  "maxItems": 100
}
```

# Actor output Schema

## `jobs` (type: `string`):

All jobs, overview view.

# 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 = {
    "keywords": "software developer"
};

// Run the Actor and wait for it to finish
const run = await client.actor("loudtzu/linkedin-public-jobs-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 = { "keywords": "software developer" }

# Run the Actor and wait for it to finish
run = client.actor("loudtzu/linkedin-public-jobs-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 '{
  "keywords": "software developer"
}' |
apify call loudtzu/linkedin-public-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,loudtzu/linkedin-public-jobs-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/RSULrqW9Hth7pFgWg/builds/cwc7KLxv41GYWjJUP/openapi.json
