# Talent.com Jobs Scraper \[Just 💰$1.25] - 62 Countries (`corvuslab/talent-scraper`) Actor

Scrape Talent.com jobs from 62 country sites in one run: many countries, keywords and locations at once. Get title, company, salary range, job type, remote flag, city & coordinates, O\*NET code, apply link and full description. Quick Apply & salary-only filters, incremental monitoring, alerts.

- **URL**: https://apify.com/corvuslab/talent-scraper.md
- **Developed by:** [Corvuslab](https://apify.com/corvuslab) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.25 / 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.

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

### What does Talent.com Jobs Scraper do?

Talent.com Jobs Scraper pulls job listings from **62 [Talent.com](https://www.talent.com/) country sites**, the widest Talent.com coverage on the Apify Store, and returns each job as a clean record with **40 structured fields** (48 with change tracking on): title, company, salary range, job type, remote flag, city and coordinates, O\*NET occupation code, Quick Apply flag, apply link and the **full job description**, which is on by default. No code needed; export to JSON, CSV, Excel, the API or straight into an AI agent.

Give it search terms (`registered nurse`, `python developer`, `warehouse`), pick one or more countries and, optionally, cities or regions. Every combination runs as its own search, and the results are merged and de-duplicated into one dataset. You can also paste Talent.com search URLs or job URLs from any country site instead of filling in the form. Leave everything empty and it returns the newest jobs in the United States (a few dozen; add a search term for more). No login, Talent.com account or proxy is needed.

> New to Apify? Sign up free and use the included monthly platform credit to try this Actor — no credit card needed.

***

### What data can you extract from Talent.com?

A standard record carries **40 fields**; incremental mode adds 8 more for change tracking.

| Group | Fields |
|---|---|
| **Job & employer** | `id`, `title`, `company`, `url` (Talent.com job page), `applyUrl` (employer's apply link), `isQuickApply`, `isSponsored`, `sourcePlatform` (the job board or applicant-tracking system the ad came from), `snippet` |
| **Location & geo** | `location` (as the employer wrote it), `city`, `region`, `country`, `market` (which Talent.com site), `latitude`, `longitude`, `isRemote` |
| **Pay & contract** | `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` (hour, week, month, year), `salaryText` (ready to read, e.g. `1,645–1,820 USD / week`), `jobTypes` |
| **Classification & dates** | `onetCode` (O\*NET-SOC occupation code), `language`, `postedAt`, `repostedAt` |
| **Full description & contacts** | `description` (plain text), `descriptionHtml`, `descriptionMarkdown`, plus `extractedEmails`, `extractedPhones`, `extractedUrls` and `socialProfiles` when the employer wrote them into the ad |
| **Search & monitoring** | `source`, `searchKeyword`, `searchLocation`, `scrapedAt`, `detailFetched`, `contentHash`; in incremental mode also `changeType` (NEW / UPDATED / REAPPEARED / UNCHANGED / EXPIRED), `firstSeenAt`, `lastSeenAt`, `previousSeenAt`, `expiredAt`, `isRepost`, `repostOfId`, `repostDetectedAt` |

***

### Key features

- 🌍 **62 Talent.com country sites in one run.** Covers North America, Europe, the Middle East, Africa, Asia-Pacific and Latin America, and every site is verified to return jobs.
- 🔀 **Multi-country × multi-keyword × multi-location.** Pick 5 countries, 10 search terms and 3 cities and the Actor runs every combination, then merges and de-duplicates the results. There is no one-market-per-run limit and nothing to stitch together afterwards.
- 🧠 **Full job descriptions by default.** Each job comes with its complete description as plain text, HTML and Markdown, not just the search-page snippet.
- ⚡ **Quick Apply filter.** Keep only jobs candidates can apply to in one click on Talent.com. Every record also carries an `isQuickApply` flag.
- 💰 **Only jobs with a salary.** Skip postings that hide the pay range. Pay comes back structured as min, max, currency and period.
- 🎚️ **Site filters.** Filter by posted within (24 hours to 14 days), job type, distance from a location and remote-only.
- 🏷️ **O\*NET occupation codes.** Every job is tagged with a standard occupation code, so "RN", "Registered Nurse – ICU" and "Staff Nurse" roll up into one category for analysis.
- ♻️ **Stable incremental monitoring.** Schedule it and get only new, updated and reappeared jobs, even though Talent.com reshuffles its results between visits.
- 🔔 **Alerts and AI-ready output.** Send alerts to Telegram, Slack, Discord or any webhook. Compact and drop-empty modes keep payloads small for LLMs and MCP.

***

### 🚀 How to scrape Talent.com

1. Open the Actor and enter one or more **search terms** (e.g. `registered nurse`), pick the **countries** and, optionally, **locations** — or paste a Talent.com URL.
2. Add filters if you need them — **posted within**, **job type**, **distance**, **remote only**, **Quick Apply only**, **only jobs with a salary**.
3. Set **Max results** and decide whether to keep **full job descriptions** on (the default).
4. (Optional) Turn on **incremental mode** and an **alert** channel, then **Schedule** it.
5. Click **Start** — jobs stream into the Output tab. Download as **JSON, CSV or Excel**, or pull them from the **API**.

#### Quick-start example input

```json
{
  "searchTerms": ["registered nurse"],
  "countries": ["us"],
  "locations": ["Chicago"],
  "postedWithin": "7",
  "salaryOnly": true,
  "maxResults": 100
}
```

This finds up to 100 registered-nurse jobs around Chicago posted in the last 7 days that publish a pay range, each with its full description, salary band, job type and direct apply link — a ready-made shortlist for a recruiter or a salary benchmark in one click.

***

### Input

Configure it in the visual editor — no code needed — or pass JSON via the API. **33 inputs** are available, grouped exactly as in the Actor's input form.

#### 🔎 Search

| Field | Type | What it does |
|---|---|---|
| `searchTerms` | array | Job titles, skills or company names, e.g. `registered nurse`, `python developer`. Without a term Talent.com lists only a few dozen jobs per country, so add one. Outside English-speaking countries a local-language title works best. |
| `countries` | array (select) | Which of the 62 Talent.com country sites to search, e.g. `us`, `gb`, `de`, `in`, `br`, `ae`, `sg`. Defaults to the United States. |
| `locations` | array | Cities, states or regions inside each country, e.g. `New York`, `Austin, TX`, `Toronto`. Leave empty to search the whole country. |
| `startUrls` | array | Talent.com search URLs (filters in the URL are kept) or job URLs from any country site. Replaces the search form when set. |
| `maxResults` | integer | Maximum jobs across all searches (default 25, `0` = no limit). |
| `maxResultsPerSearch` | integer | Cap each single search so multi-country runs come back balanced (`0` = off). |

#### 🎚️ Filters

Filters are applied by Talent.com itself, so jobs they exclude are never fetched or billed.

| Field | Type | What it does |
|---|---|---|
| `postedWithin` | enum | `any`, `1` (last 24 hours), `3`, `7` or `14` days. |
| `jobTypes` | array (select) | `full-time`, `part-time`, `permanent`, `temporary`, `internship`. Several types run as separate searches and are merged. US, Canada, UK and France sites only. |
| `radius` | enum | Distance around each location: `5`, `10`, `15`, `25`, `50` or `100` km (2–60 miles on the US site). |
| `remoteOnly` | boolean | Only remote jobs. US, Canada, UK, India, Switzerland, Spain, Netherlands, Italy, Germany and France sites. |
| `quickApplyOnly` | boolean | Only jobs you can apply to directly on Talent.com. |
| `salaryOnly` | boolean | Skip jobs that do not publish a pay range. Skipped jobs are not charged. |

#### 📄 Output

| Field | Type | What it does |
|---|---|---|
| `includeDetails` | boolean | Add each job's full description plus any emails, phones and links in it (default **on**). Turn off for the fastest runs with a short snippet. |
| `descriptionFormat` | enum | `all`, `text`, `html` or `markdown`. |
| `descriptionMaxLength` | integer | Cut descriptions to this many characters (`0` = full length). |
| `compact` | boolean | Core fields only (title, company, location, salary, job type, link, snippet), for lean AI and MCP payloads. |
| `excludeEmptyFields` | boolean | Drop null, empty-string and empty-list fields from each record. |

#### ♻️ Incremental monitoring

| Field | Type | What it does |
|---|---|---|
| `incrementalMode` | boolean | Track jobs between runs and tag each record NEW / UPDATED / REAPPEARED. Unchanged jobs are skipped and not charged. |
| `stateKey` | string | Stable name for the tracked search (auto-derived from your settings if blank). |
| `emitUnchanged` | boolean | Also emit jobs that have not changed since the previous run. |
| `emitExpired` | boolean | Emit jobs that were open last time but are gone now (needs a run that reads the whole search). |
| `skipReposts` | boolean | Leave out jobs an employer took down and posted again under a new link. Every new job still carries `isRepost`. |

#### 🔔 Notifications

`telegramToken`, `telegramChatId`, `slackWebhookUrl`, `discordWebhookUrl`, `webhookUrl`, `webhookHeaders`, `notificationLimit` and `notifyOnlyChanges` — see [How to set up Talent.com alerts](#-how-to-set-up-talentcom-alerts) below.

#### ⚙️ Advanced

| Field | Type | What it does |
|---|---|---|
| `proxyConfiguration` | object | Optional — not needed; the Actor works without it. |
| `ignoreUrlFailures` | boolean | Skip start URLs that cannot be interpreted instead of failing the run (default on). |
| `maxRequestRetries` | integer | Retries for a failed request (0–10, default 3). |

#### More example inputs

A multi-country remote search across Europe and North America:

```json
{
  "searchTerms": ["python developer", "data engineer"],
  "countries": ["us", "ca", "gb", "de", "nl"],
  "remoteOnly": true,
  "postedWithin": "7",
  "maxResults": 500
}
```

Pasting Talent.com URLs from different country sites:

```json
{
  "startUrls": [
    { "url": "https://uk.talent.com/jobs?k=nurse&l=London&date=7" },
    { "url": "https://www.talent.com/jobs/k-software-engineer-l-austin-tx" }
  ],
  "maxResults": 100
}
```

A daily monitor for new Quick Apply warehouse jobs, pinged to Slack:

```json
{
  "searchTerms": ["warehouse"],
  "countries": ["us"],
  "locations": ["Dallas, TX", "Houston, TX"],
  "quickApplyOnly": true,
  "incrementalMode": true,
  "notifyOnlyChanges": true,
  "slackWebhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ",
  "maxResults": 0
}
```

***

### Output

Each dataset item is one job. A real record (description shortened; `descriptionHtml` and `descriptionMarkdown` omitted):

```json
{
  "id": "630575307265998928",
  "title": "School Registered Nurse",
  "company": "AB Staffing",
  "url": "https://www.talent.com/view?id=630575307265998928",
  "applyUrl": "https://www.abstaffing.com/jobs/school-registered-nurse/",
  "isQuickApply": true,
  "location": "Chicago, IL, US",
  "city": "Chicago",
  "region": "Illinois",
  "country": "US",
  "market": "us",
  "latitude": 41.8781136,
  "longitude": -87.6297982,
  "isRemote": false,
  "jobTypes": ["Full-time"],
  "salaryMin": 1645,
  "salaryMax": 1820,
  "salaryCurrency": "USD",
  "salaryPeriod": "week",
  "salaryText": "1,645–1,820 USD / week",
  "onetCode": "29-1141.00",
  "language": "en",
  "postedAt": "2026-07-31T22:36:54+00:00",
  "repostedAt": "2026-10-09T10:13:20+00:00",
  "snippet": "AB Staffing is looking for an experienced .Active Illinois Registered Nurse (RN) License required...",
  "sourcePlatform": "AB Staffing Solutions",
  "isSponsored": false,
  "description": "School Registered Nurse\n\nAB Staffing is looking for an experienced School Registered Nurse that is available for the 2026/2027 school year.\n\nRequirements:\n\n- Active Illinois Registered Nurse (RN) License required. …",
  "source": "talent.com",
  "searchKeyword": "registered nurse",
  "searchLocation": "Chicago",
  "scrapedAt": "2026-10-09T14:59:50.944866+00:00",
  "detailFetched": true,
  "contentHash": "172f87de065ff04ede800bddfd6555c1a0f1a60a"
}
```

Empty values come back as `null`. The contact fields (`extractedEmails`, `extractedPhones`, `extractedUrls`, `socialProfiles`) only appear on jobs where something was found, and the incremental fields only appear in incremental mode. `descriptionFormat` decides which of the three description fields you get. **Compact mode** returns the core fields only; **`excludeEmptyFields`** drops empties entirely. The Output tab also has a ready-made **Overview** table: title, company, location, country, salary, job type, remote, posted date, job link and apply link.

***

### ♻️ How to monitor Talent.com with incremental mode

Schedule the Actor and turn on **incremental mode**. Each run compares against the last one and emits only **NEW / UPDATED / REAPPEARED** jobs, plus UNCHANGED and EXPIRED if you ask for them. Unchanged jobs are recognised from the search results before their full description is opened, so a run where nothing changed opens no descriptions and bills no records.

Talent.com does not show the same search in the same order twice. The Actor tracks every job by its ID across the whole search and only treats a job as expired after it has been missing more than once, so a reshuffled result page does not resurface old jobs as new or bill you for them again. A job that comes back after expiring is tagged **REAPPEARED**, and an employer re-posting the same job under a new link is flagged with `isRepost`.

#### Setting up scheduled monitoring

1. Configure your search terms, countries, locations and filters.
2. Turn on **Incremental mode** (and **Skip re-posted jobs** if you only want genuinely new roles).
3. Run it once — this seeds the baseline.
4. Open the **Schedules** tab and set a recurring run (e.g. hourly or daily).
5. Add an alert channel with **Alert only on changes** on.

***

### 🔔 How to set up Talent.com alerts

Get pinged the moment a matching job appears on any of the 62 Talent.com sites. Fill in only the channels you want. Credentials are secret inputs: encrypted at rest, masked in the UI and never written to the run log.

| Channel | What to configure |
|---|---|
| ✈️ **Telegram** | `telegramToken` (from @BotFather) + `telegramChatId` (chat or channel ID) |
| 💬 **Slack** | `slackWebhookUrl` (Incoming Webhook URL) |
| 🎮 **Discord** | `discordWebhookUrl` (channel webhook URL) |
| 🪝 **Webhook** | `webhookUrl` (+ optional `webhookHeaders`) receives the matched jobs as JSON — ideal for n8n / Make / Zapier |

Each channel fires independently, so a broken channel can't stop the scrape or the others. `notificationLimit` sets how many jobs each message lists (1–20, default 5). Pair incremental mode with `notifyOnlyChanges` (**Alert only on changes**) to hear only about new, updated and reappeared jobs, with no duplicates across runs.

***

### 💡 What can you do with Talent.com data?

#### Salary benchmarking across countries

Pull the same role in 10, 20 or all 62 markets and compare structured salary ranges by currency and period. Turn on **Only jobs with a salary** to build a clean pay dataset without filtering by hand.

#### Recruiting and staffing market intelligence

See which employers are hiring for a role, in which cities, and through which job board or applicant-tracking system the ad originated. Staffing agencies use it to spot demand before competitors call the same clients.

#### Sales prospecting from hiring signals

A company posting ten warehouse or nursing jobs this week is a company with a budget. Build account lists from company names, locations and apply links, and trigger outreach the day new postings appear.

#### Job boards, aggregators and niche job sites

Feed a niche or regional job site with fresh, de-duplicated listings — full descriptions in HTML or Markdown, apply links and posting dates included — refreshed on a schedule with incremental mode.

#### Labour market and occupation research

Every job carries an O\*NET occupation code, a language and coordinates, so you can map demand by occupation and region over time and export the history to trend dashboards.

#### Personal job alerts

Watch a handful of searches across several countries and get Telegram or Slack pings for new Quick Apply or remote jobs only — no more refreshing the site.

#### Feed AI agents and LLM pipelines

Compact JSON straight into an LLM context, an MCP tool or a vector store. `excludeEmptyFields`, compact mode and `descriptionMaxLength` keep token costs low.

***

### 💰 How much does it cost to scrape Talent.com?

This Actor uses Apify's **pay-per-event** model: a small fee when a run starts, plus a fee for each job saved to your dataset. See the Actor's **Pricing** tab for the current numbers — they're rendered live, so this page never goes stale.

It runs with lightweight requests and no browser, which keeps the per-record fee at the low end of the market even with full descriptions on. Three things cut your bill further:

- **Site filters**: posted within, job type, distance, remote and Quick Apply are applied by Talent.com, so jobs they exclude are never fetched or billed.
- **Only jobs with a salary**: postings without a pay range are dropped before they are saved.
- **Incremental mode**: after the first run you pay only for jobs that are new or changed, so the cost tracks how much Talent.com changes rather than how much you watch. Re-posts can be skipped for free.

***

### 🔌 Integrations & export

Export to **JSON, CSV, Excel** or an HTML table, or pull from the **REST API** and the **JavaScript / Python** clients. Runs on a **schedule**, connects to **Google Sheets, Slack, Make, Zapier and n8n**, and works as an **MCP tool** for AI agents — compact mode keeps token usage small.

***

### 🔗 Using the API

Run this Actor from your own code. Example with the Apify Python client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run_input = {
    "searchTerms": ["registered nurse"],
    "countries": ["us", "ca", "gb"],
    "salaryOnly": True,
    "maxResults": 200,
}

run = client.actor("corvuslab/talent-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["company"], item["country"], item["salaryText"])
```

It also works with the JavaScript/TypeScript client, the Apify CLI and the REST API.

***

### ❓ FAQ

**Which Talent.com countries are supported?** All 62 country sites: United States, Canada, United Kingdom, Ireland, Australia, New Zealand, Germany, France, Spain, Italy, Netherlands, Belgium, Switzerland, Austria, Luxembourg, Portugal, Poland, Czechia, Hungary, Romania, Greece, Sweden, Norway, Denmark, Finland, Turkey, India, Pakistan, Singapore, Malaysia, Indonesia, Thailand, Vietnam, Philippines, Hong Kong, Taiwan, Japan, South Korea, United Arab Emirates, Saudi Arabia, Qatar, Kuwait, Bahrain, Oman, Egypt, Morocco, Nigeria, Kenya, South Africa, Mexico, Brazil, Argentina, Chile, Colombia, Peru, Ecuador, Uruguay, Venezuela, Costa Rica, Panama, Guatemala and Puerto Rico. Pick as many as you like in one run.

**How many jobs can I get from one search?** Talent.com itself shows up to roughly 130 jobs for a search with a term, and only a few dozen for a search without one. To collect more, add search terms, locations, countries or job types — each combination is its own search, and the results are merged and de-duplicated. Set `maxResults` to `0` for no overall limit.

**Why is the salary empty on many jobs?** Because the employer did not publish one. In our tests about a third of US jobs carried a pay range and only around 1 in 15 elsewhere. Turn on **Only jobs with a salary** to keep just the ones that do — the rest are not charged.

**Why is `jobTypes` empty on some country sites?** Talent.com only labels job types on some of its sites: in our tests every US, UK and France job had one, and German, Indian, Brazilian and UAE jobs had none. The **Job types** filter works on the US, Canada, UK and France sites.

**What is Quick Apply?** Jobs a candidate can apply to directly on Talent.com instead of going through the employer's own site — about one in five jobs in our tests. **Quick Apply only** keeps just those and works on every country site we tested.

**Do records include recruiter emails and phone numbers?** Only when the employer wrote them into the job ad, which is rare — roughly 1 in 20 descriptions contains an email and fewer contain a phone number. They are a bonus, not the point of this Actor; for hiring-company leads use `company`, `applyUrl` and `sourcePlatform`.

**What are `onetCode`, `repostedAt` and `isRepost`?** `onetCode` is the standard O\*NET-SOC occupation code for the job (e.g. `29-1141.00` = Registered Nurses). `repostedAt` is when Talent.com last refreshed the posting. `isRepost` (incremental mode) flags a job the employer took down and published again under a new link.

**Why do some jobs have coordinates but no city?** When the employer only names a country or a region, `city` is empty and `latitude` / `longitude` point to the centre of that country or region.

***

### ⚖️ Is it legal to scrape Talent.com?

This Actor collects only **publicly available** job listings — the same postings anyone can see on Talent.com without logging in. You're responsible for how you use the data — in particular any personal information that appears in a job ad — and for complying with Talent.com's terms and applicable law (including the GDPR/LGPD where they apply). Not affiliated with, endorsed by or sponsored by Talent.com.

***

**Keywords:** talent.com scraper · talent.com api · talent.com jobs scraper · scrape talent.com jobs · talent.com job listings · global job search aggregator · job scraper 62 countries · salary data scraper · job postings dataset · remote jobs scraper · O\*NET job data · job monitoring · recruitment market research · lead generation · export to CSV · export to Excel · no-code scraper · MCP tool for AI agents

# Changelog

This Actor's version history is a separate document: https://apify.com/corvuslab/talent-scraper/changelog.md

# Actor input Schema

## `searchTerms` (type: `array`):

Job titles, skills or company names, e.g. "registered nurse", "python developer", "warehouse". Without a search term Talent.com lists only a few dozen jobs per country, so add one. Outside English-speaking countries a job title in the local language works best.

## `countries` (type: `array`):

Which Talent.com country sites to search — each has its own job inventory. Defaults to the United States.

## `locations` (type: `array`):

Cities, states or regions inside the chosen country, e.g. "New York", "Austin, TX", "Toronto". Leave empty to search the whole country.

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

Optional. Paste Talent.com search URLs (filters in the URL are kept) or job URLs (…/view?id=…) from any country site. When set, these replace the search form above.

## `maxResults` (type: `integer`):

Maximum number of jobs to return across all searches. Set 0 for no limit. Talent.com shows up to roughly 130 jobs per search — add more search terms or locations to collect more.

## `maxResultsPerSearch` (type: `integer`):

Optional. Cap each single search (one country × search term × location × job type) so a multi-country or multi-keyword run comes back balanced. 0 = no per-search cap.

## `postedWithin` (type: `string`):

Only jobs posted recently.

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

Only jobs of these types. Several types run as separate searches and are merged. Available on the United States, Canada, United Kingdom and France sites.

## `radius` (type: `string`):

How far around each location to search. Talent.com's own default is 25 km (15 mi). In the United States the site uses miles: 5 km = 2 mi, 10 = 5 mi, 15 = 10 mi, 25 = 15 mi, 50 = 30 mi, 100 = 60 mi.

## `remoteOnly` (type: `boolean`):

Only remote jobs. Available on the US, Canada, UK, India, Switzerland, Spain, Netherlands, Italy, Germany and France sites.

## `quickApplyOnly` (type: `boolean`):

Only jobs you can apply to directly on Talent.com with Quick Apply.

## `salaryOnly` (type: `boolean`):

Skip jobs that do not publish a pay range. Skipped jobs are not charged.

## `includeDetails` (type: `boolean`):

Open every job to add its full description (text, HTML and Markdown) plus any emails, phone numbers and links written in it. Turn off for the fastest runs — records then carry a short snippet.

## `descriptionFormat` (type: `string`):

Which representation(s) of the job description to include.

## `descriptionMaxLength` (type: `integer`):

Cut descriptions to this many characters. 0 = full length.

## `compact` (type: `boolean`):

Emit only the core fields (title, company, location, salary, job type, link, snippet). Ideal for AI agents and MCP clients.

## `excludeEmptyFields` (type: `boolean`):

Remove null, empty-string and empty-list fields from each record.

## `incrementalMode` (type: `boolean`):

Track jobs between runs and tag every record NEW / UPDATED / UNCHANGED / EXPIRED. Unchanged jobs are skipped and not charged.

## `stateKey` (type: `string`):

Stable name for the tracked search. Leave empty to derive one automatically from your search settings.

## `emitUnchanged` (type: `boolean`):

Also emit jobs that have not changed since the previous run.

## `emitExpired` (type: `boolean`):

Emit jobs that were open last run but are gone now. Needs a run that reads the whole search (Max results 0 or above the number of matches).

## `skipReposts` (type: `boolean`):

Leave out jobs that an employer took down and posted again under a new link (same title, company and location as a job already tracked). They are not charged. Every new job still carries isRepost either way.

## `telegramToken` (type: `string`):

Bot token from @BotFather.

## `telegramChatId` (type: `string`):

Chat or channel ID, e.g. "-100123456789" or "@yourchannel".

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL.

## `discordWebhookUrl` (type: `string`):

Discord incoming-webhook URL.

## `webhookUrl` (type: `string`):

Any HTTPS endpoint. Receives a JSON POST with the matched jobs — works with n8n, Make and Zapier.

## `webhookHeaders` (type: `object`):

Extra headers for the webhook request, e.g. {"Authorization": "Bearer xyz"}.

## `notificationLimit` (type: `integer`):

How many jobs to include in each notification message.

## `notifyOnlyChanges` (type: `boolean`):

In incremental mode, alerts list only new, updated and reappeared jobs, even when Include unchanged jobs is on.

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

Optional. Not needed — the actor works without a proxy. Enable it only if your runs get refused.

## `ignoreUrlFailures` (type: `boolean`):

Skip start URLs that cannot be interpreted instead of failing the whole run.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed request before giving up on it.

## Actor input object example

```json
{
  "searchTerms": [
    "software engineer"
  ],
  "countries": [
    "us"
  ],
  "locations": [
    "New York"
  ],
  "maxResults": 25,
  "maxResultsPerSearch": 0,
  "postedWithin": "any",
  "remoteOnly": false,
  "quickApplyOnly": false,
  "salaryOnly": false,
  "includeDetails": true,
  "descriptionFormat": "all",
  "descriptionMaxLength": 0,
  "compact": false,
  "excludeEmptyFields": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "skipReposts": false,
  "notificationLimit": 5,
  "notifyOnlyChanges": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "ignoreUrlFailures": true,
  "maxRequestRetries": 3
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `allItems` (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 = {
    "searchTerms": [
        "software engineer"
    ],
    "locations": [
        "New York"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("corvuslab/talent-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 = {
    "searchTerms": ["software engineer"],
    "locations": ["New York"],
}

# Run the Actor and wait for it to finish
run = client.actor("corvuslab/talent-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 '{
  "searchTerms": [
    "software engineer"
  ],
  "locations": [
    "New York"
  ]
}' |
apify call corvuslab/talent-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corvuslab/talent-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/IhscLvSaYOwZddJwk/builds/HLtykFOX8pfEiOXJ1/openapi.json
