# StartupJobs.cz Scraper ($1.45/1K): Czech IT Jobs & Salaries (`tsutseisoftware/startupjobs-scraper`) Actor

Scrape StartupJobs.cz job offers: salary in CZK or EUR per month and hour, company, town, region, work mode, seniority, contract type, technologies, languages and benefits. Website filters, company profiles, monitoring of new and removed jobs, IT market overview. Unofficial.

- **URL**: https://apify.com/tsutseisoftware/startupjobs-scraper.md
- **Developed by:** [Tomáš Buchta](https://apify.com/tsutseisoftware) (community)
- **Categories:** Jobs, Lead generation
- **Features:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.09 / 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/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

## StartupJobs.cz Scraper: Czech IT Jobs & Salaries

Get job offers from **StartupJobs.cz**, the Czech job board for IT, tech, product, marketing and sales jobs at startups and tech companies, as clean structured data. Search by **keywords**, **categories**, **technologies**, **seniority**, **work mode** (remote, hybrid, on site), **working time**, **contract type** (employment, freelance/IČO, internship), **minimum salary**, **startups only**, **companies**, towns and regions, or paste any StartupJobs.cz search URL. For each job you get the title, company with logo and profile link, towns with **region, district and GPS**, **salary in CZK or EUR with monthly and hourly equivalents**, seniority, working time, contract types and work modes, and (included in the price) the **description** with e-mails and phone numbers removed, **category**, **tech stack**, **required languages with level**, **benefits** and the **posting date**.

Built for **watching the Czech tech job market**: schedule it daily in monitoring mode and you get, and pay for, only jobs that are new or changed, plus, if you want, the jobs that **disappeared** (ended or no longer matching the search) with the number of days they were online. Every run also saves a free **IT market overview**: the website's own counts for your search by category, seniority, contract type, work mode, benefit and language, the share of startups and the **salary distribution with median and quartiles**.

**How big is the website?** StartupJobs.cz is a focused board: about **430 active jobs** (November 2026) from about 260 companies, **about 80 % of them in Prague** (then Brno, Ostrava, Olomouc and a few in Slovakia). The whole website with all details is read in about 15 requests and 30 seconds, so a full daily snapshot costs well under a dollar.

The output uses the same field names and values as our **Jobs.cz**, **Prace.cz**, **Profesia** and **Pracuj.pl** scrapers, so the data can go into one table.

> **Česky:** Scraper nabídek z **StartupJobs.cz** (IT a startupy): mzda, seniorita, technologie, práce z domova, typ smlouvy, jazyky a benefity, s detaily v ceně. Přehled IT trhu zdarma (rozložení mezd a počty podle kategorií), monitoring a volitelně profily firem. Výstup do Excelu, CSV nebo JSON. Podporu poskytujeme i česky.

### Why use this StartupJobs.cz scraper?

- 🧑‍💻 **Tech stack and seniority for every job.** `technologies` (e.g. Python, Docker, Kubernetes), `seniority` (`junior`, `mid`, `senior`), `languagesRequired` with level ("English (professional)"), category and main category, all from the website's structured data, not guessed from the text.
- 📊 **IT market overview for free** (SUMMARY record): how many jobs the search has on the whole website by category, seniority, contract, work mode, benefit and language, how many are at startups, and the **salary median and quartiles** from the website's own salary histogram, plus salary quartiles by seniority, category and region and the top technologies of the jobs the run saved. One extra request per search.
- 💰 **Salaries you can compare.** `salaryMin`/`salaryMax` as numbers in CZK or EUR, the period, and **monthly and hourly equivalents** (160 hours a month).
- 🔎 **The website's own filters** (filtered-out jobs cost nothing): 11 categories and 124 subcategories, technologies, seniority, work mode, working time, contract type, minimum salary (the website converts hourly and EUR salaries itself), startups only, companies. Jobs that match only some of your filters (the website's "partially matching offers") are left out.
- 🧮 **Plus filters the website doesn't have:** towns and Czech regions (optionally with remote jobs elsewhere), only jobs with a salary, salary up to, posted in the last N days, title must (not) contain, exclude companies.
- 🏢 **Company profiles (optional):** industries, team size, website, LinkedIn page, office address and a short description, for lead generation and market maps.
- 📬 **Monitoring mode:** a daily feed of new and changed jobs (`changeType`), optionally with **removed jobs**: `removedReason` `expired` or `noLongerMatches`, with `daysOnline`.
- ⚡ **Fast and cheap:** the website's API gives 100 jobs per request and the details of 50 jobs per request. No browser, 256 MB of memory.
- 🔒 **Privacy first.** No recruiter or team member names, e-mails or phone numbers; e-mails and phone numbers inside descriptions are replaced with `[e-mail removed]` / `[phone removed]`. An employer whose name looks like a private person's name is hidden (see the FAQ).

### What data can you get?

| Field | Example |
|---|---|
| Title (and English title), job ID, URL | Python Developer – Data Ingest, 94731 |
| Company, slug, logo, profile, startup | Powertica Commodities AG, powertica-commodities-ag-1, isStartup `false` |
| Location, all towns, region, district, country, GPS | Praha; \["Praha, Česko"]; Hlavní město Praha; Praha; CZ; 50.0755, 14.4378 |
| Work mode | workArrangement `hybrid`, workModes `["onsite", "hybrid"]`, remote, remotePossible |
| Salary | 55 000 – 75 000 CZK per month (hourly 343.75 – 468.75) |
| Working time, contract, seniority | employmentType `fullTime`; contractTypes `employee`, `freelance`, `internship`; seniority `mid` |
| Details (included) | category, main category, technologies, required languages with level, benefits, description, ad language, posted and updated date, the employer's screening question, the employer's own application form |
| With **Add company profile** | industries, team size, website, LinkedIn, office address and town, short description |
| With **Monitoring** | changeType, firstSeenAt, changedFields; removed jobs with removedReason, removedAt, lastSeenAt, daysOnline; reappeared |

See the **Output** tab for all fields. The dataset has views for **Overview**, **Salaries**, **Tech stack**, **Details**, **Places**, **Companies**, **Monitoring** and **Removed jobs**.

### How to scrape StartupJobs.cz

1. Enter **Search keywords** (e.g. `python`, `product manager`) and/or pick **Categories**, **Technologies**, **Seniority** and **Work mode**, or paste a search URL from the website into **StartupJobs.cz URLs**, e.g. `https://www.startupjobs.cz/nabidky/vyvoj?seniorita=junior`.
2. Optionally set the salary, towns, regions and other filters.
3. Set **Max jobs** (0 = everything) and click **Start**. Download the results as JSON, CSV or Excel, or connect them to Google Sheets, Slack or Make.

### Use cases

#### Python jobs in Prague with a salary

```json
{
  "technologies": ["Python"],
  "locations": ["Praha"],
  "onlyWithSalary": true,
  "maxItems": 50
}
```

#### New remote developer jobs every morning

Schedule a daily run; each run returns only new or changed jobs and the ones that ended.

```json
{
  "categories": ["vyvoj"],
  "workArrangement": ["remote"],
  "onlyNewOrChanged": true,
  "includeRemovedJobs": true,
  "monitoringKey": "remote-dev",
  "maxItems": 0
}
```

#### Companies hiring in Brno, with their profiles

```json
{
  "locations": ["Brno"],
  "includeCompanyInfo": true,
  "maxItems": 100
}
```

#### Senior freelance rates

```json
{
  "seniority": ["senior"],
  "contractTypes": ["freelance"],
  "onlyWithSalary": true,
  "maxItems": 0
}
```

#### The whole website, for a market snapshot

```json
{
  "maxItems": 0
}
```

#### Website filters (applied by StartupJobs.cz)

Categories, technologies, seniority, work mode, working time, contract type, minimum salary, startups only and companies are sent to the website, which returns only matching jobs. With several filters the website also lists jobs that match only some of them after all the full matches; the actor leaves those out. A technology is looked up on the website first (`React` is the website's "React JS"); a technology the website doesn't know is reported in the status message.

#### Filters (applied by the actor, you don't pay for filtered-out jobs)

Towns (Czech or English name, e.g. `Praha` or `Prague`), Czech regions, **Also remote jobs elsewhere**, only jobs with a salary, salary up to, posted in the last N days, title must (not) contain and exclude companies. The website's own location filter needs a map location, so a website URL with a location (`lokalita=`) keeps it, but the input uses town names.

#### Monitoring mode explained

With **Monitoring: only new or changed jobs** the actor remembers the jobs of the previous run with the same **Monitoring key** and saves only jobs that are new (`changeType: new`) or whose title, company, salary, towns, work mode, seniority, working time or contract types changed (`updated`; `changedFields` lists them). If a run is interrupted (crash, out of memory), the next run does not return the jobs that were already saved again. Unchanged jobs are free, and details are read only for new and changed jobs. With **Monitoring: include removed jobs**, jobs of the previous run that are no longer in the search are checked on the website and returned as `removed` with `removedReason` `expired` (the ad ended or was deleted) or `noLongerMatches` (the ad is live but left the search). When a removed job comes back it is returned as `reappeared`. Removed jobs are only checked when the run read every search completely.

#### IT market overview and summary (SUMMARY)

Every run saves a free JSON record `SUMMARY` in the key-value store. It has two parts:

- **`itMarket`** (one entry per search, with **IT market overview** on): the website's own counts for the search, i.e. all its matching jobs, also those the run did not save: jobs by main category and category, seniority, contract type, working time, work mode, top 15 benefits, required languages, the number and share of startup jobs, and the salary distribution in CZK per month (the website's histogram in 10 000 CZK steps, with estimated median and quartiles). The towns, regions and other actor filters are not part of these counts.
- the **summary of the jobs this run found**: salary median and quartiles in CZK per month overall and by seniority, main category and region, the top 20 companies and top 25 technologies, work arrangement, working time, contract types, seniority, startups and regions.

### How much does it cost to scrape StartupJobs.cz?

This actor uses pay-per-event pricing (see the **Pricing** tab for the current prices):

| Event | Price per 1 000 | Bronze | Silver | Gold |
|---|---|---|---|---|
| Job saved in the dataset (details included) | **$1.45** | $1.39 | $1.29 | $1.09 |
| Company info ("Add company profile") | + $0.50 | + $0.50 | + $0.50 | + $0.50 |

No start fee. The whole website (about 430 jobs with details) costs about **$0.62**; a daily monitoring run that finds 10 new jobs costs about $0.015. Filtered-out jobs, unchanged jobs in monitoring mode and the market overview are free; jobs whose company profile could not be read are not charged the company price. You can set a maximum cost per run; the actor stops when it is reached.

### Input example

```json
{
  "searchQueries": ["python"],
  "seniority": ["junior", "mid"],
  "maxItems": 100
}
```

### Output example

```json
{
  "id": "startupjobs:94731",
  "source": "startupjobs.cz",
  "url": "https://www.startupjobs.cz/nabidka/94731/python-developer-data-ingest",
  "jobId": "94731",
  "title": "Python Developer – Data Ingest",
  "titleEn": "Python Developer - Data Ingest",
  "company": "Powertica Commodities AG",
  "companySlug": "powertica-commodities-ag-1",
  "companyUrl": "https://www.startupjobs.cz/startup/powertica-commodities-ag-1",
  "isStartup": false,
  "location": "Praha",
  "locations": ["Praha, Česko"],
  "region": "Hlavní město Praha",
  "district": "Praha",
  "country": "CZ",
  "gpsLat": 50.0755381,
  "gpsLon": 14.4378005,
  "workArrangement": "hybrid",
  "remote": false,
  "remotePossible": false,
  "workModes": ["onsite", "hybrid"],
  "salaryMin": null,
  "salaryMax": null,
  "employmentType": ["fullTime"],
  "contractTypes": ["employee", "freelance"],
  "seniority": ["mid"],
  "category": "Back-End Developer",
  "mainCategory": "Development",
  "technologies": ["JavaScript", "PostgreSQL", "Python", "REST API", "Azure", "Airflow", "Docker", "Pandas"],
  "languagesRequired": ["English (professional)", "Czech (intermediate)"],
  "benefits": ["Cafeteria", "Extra days of holiday", "Home office", "Multisport card", "Meal vouchers"],
  "description": "Hledáme zkušeného Senior Python Developera, který posílí a pomůže rozvíjet náš Data Ingest Team…",
  "language": "cs",
  "postedAt": "2025-07-23T12:13:37Z",
  "updatedAt": "2026-10-09T08:11:58Z",
  "detailScraped": true,
  "companyInfoScraped": false,
  "sourceUrl": "https://www.startupjobs.cz/nabidky?klicove-slovo=python",
  "scrapedAt": "2026-11-06T13:28:47Z"
}
```

### Limitations

- **A small website.** About 430 active jobs (November 2026), most of them in Prague. Use it together with our Jobs.cz and Prace.cz scrapers for the whole Czech market.
- Only about **4 in 10 jobs show a salary** (measured on all 426 jobs, 2026-11-06: 41 %). Other measured fill rates: description, category, seniority, work mode, working time 100 %, posting date 99 %, region 96 % (jobs abroad or fully remote have none), benefits 95 %, technologies 90 %, required languages 86 %, contract types 77 %.
- Most ads are in Czech (descriptions about 78 % Czech and 22 % English, told apart in `language`; 7 % of the jobs have an English title next to the Czech one). Categories, technologies, benefits and languages are always in English.
- `postedAt` is the publication of the ad; the website lets companies keep an ad running for months (see `updatedAt`).
- A town name shared by several Czech municipalities (e.g. "Vestec", "Staré Město") gets its region from the job's details; without details it stays null.
- Free text may still name a contact person (e.g. "Write to Petra"): e-mails and phone numbers are removed, names in the text are not.
- Runs without a proxy by default (tested from a Czech IP address). If StartupJobs.cz (Cloudflare) rejects the requests, the run stops with a clear message: use Apify Proxy. The actor never solves challenges or changes IP addresses to get around a block.

### For AI agents and API users

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("tsutseisoftware/startupjobs-scraper").call(run_input={
    "technologies": ["Python"], "seniority": ["junior"], "maxItems": 100,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], job["company"], job["salaryMin"], job["technologies"])
summary = client.key_value_store(run["defaultKeyValueStoreId"]).get_record("SUMMARY")["value"]
print(summary["itMarket"][0]["salaryMonthlyCzk"])
```

### Troubleshooting

- **"rejecting requests (Cloudflare)"**: set **Proxy configuration** to Apify Proxy (automatic group; RESIDENTIAL with country Czechia if that is rejected too).
- **"Technologies not found"**: write the technology as on the website (`Python`, `React`, `Kotlin`, `AWS`).
- **"skipped … URL with filters the actor can't apply"**: the URL has a salary, benefit or language filter; set the salary with **Salary from** instead.
- **Fewer jobs than expected**: check the filters summary in the status message ("filtered out: …"). With several website filters, jobs matching only some of them are left out on purpose.

### Custom scrapers and changes

Need a custom version of this actor, another field or filter, or a scraper for a different website? Write to **info@tsutsei-software.com** with the website, the data you need and how often, and we will reply with a fixed quote. We work mainly with clients from the Czech Republic and from outside the EU.

More about us and all our actors: [tsutsei-software.com](https://tsutsei-software.com).

### More Czech job scrapers

The same output format for the other Czech job sources (many jobs are published on several of them):

- [Czech Jobs Aggregator](https://apify.com/tsutseisoftware/czech-jobs-aggregator): all these Czech job boards in one run: duplicates merged, one output format, monitoring
- [Jobs.cz Scraper](https://apify.com/tsutseisoftware/jobs-cz-scraper): Czech jobs with salary, region, requirements, monitoring and optional ARES company data
- [Prace.cz Scraper](https://apify.com/tsutseisoftware/prace-cz-scraper): Czech jobs with salary, region, monitoring and optional ARES company data
- [Úřad práce Scraper](https://apify.com/tsutseisoftware/urad-prace-scraper): all Czech Labour Office vacancies (MPSV open data) with salary, profession, shifts and jobs for foreigners
- [Pracezarohem.cz Scraper](https://apify.com/tsutseisoftware/pracezarohem-scraper): jobs near a town (GPS distance search) from all big Czech job sources, with the portal of every ad
- [JenPráce.cz Scraper](https://apify.com/tsutseisoftware/jenprace-scraper): Czech jobs and side jobs with salary, own ads told apart from Labour Office vacancies
- [Profesia.sk & .cz Scraper](https://apify.com/tsutseisoftware/profesia-scraper): Slovak and Czech jobs from Profesia with salary, region and monitoring
- [Fajn-brigady.cz & INwork.cz Scraper](https://apify.com/tsutseisoftware/fajn-brigady-scraper): Czech temporary and part-time jobs from two websites: hourly wage, town, start date, monitoring
- [GastroJobs.cz Scraper](https://apify.com/tsutseisoftware/gastrojobs-scraper): Czech hotel, restaurant and catering jobs: salary, type of venue, employer company ID, monitoring

### FAQ

#### Is it legal to scrape StartupJobs.cz?

The actor reads only data that StartupJobs.cz publishes for everyone without logging in, at a moderate speed (at most 30 requests per minute). It returns no recruiter or team member contacts, removes e-mails and phone numbers from descriptions and hides employer names that look like a private person's name. The website's terms of use restrict extracting its database; you are responsible for how you use the data (GDPR, database rights and the website's terms). If in doubt, consult a lawyer. This actor is not affiliated with StartupJobs.cz.

#### Why is the company empty for some jobs?

When the employer's name looks like a private person's name (for example a freelancer who advertises under their own name), the name is personal data, so `company`, its slug, logo and profile are null and the name is replaced with `[employer]` in the title and texts. It is a heuristic over lists of Czech, Slovak and other first names, and in doubtful cases privacy wins: on all 264 company names of the website (2026-11-06) it hid one name ("Leo Prague", a first name next to a town).

#### How are salaries converted?

The website stores salaries per month or per hour in CZK or EUR. Monthly amounts are divided by 160 hours for the hourly equivalent and hourly amounts multiplied by 160 for the monthly one. EUR is never converted to CZK; the market overview uses the website's own conversion.

#### Do I need a proxy?

Not by default: the actor reads the website's public API without a proxy. If the website starts rejecting requests from Apify's IP addresses, use Apify Proxy.

#### Can I get recruiters' e-mails or phone numbers?

No. The actor deliberately returns no contact persons, team members, e-mails or phone numbers.

***

Also known as a StartupJobs.cz API, StartupJobs scraper, "nabídky práce StartupJobs", "IT práce Praha" or "práce ve startupu".

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search for, e.g. "python", "product manager", "react", "marketing". The website searches titles and ad texts. Each keyword is a separate search (combined with the filters below). At most 20. Empty = all jobs that match the filters.

## `categories` (type: `array`):

Only jobs in these categories (a main category includes all its subcategories), applied by the website.

## `technologies` (type: `array`):

Only jobs that ask for at least one of these technologies, e.g. "Python", "React", "Kotlin", "AWS". Written as on the website (the actor looks each one up there; an unknown one is reported). Applied by the website.

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

Search URLs from the website (set the filters on https://www.startupjobs.cz/nabidky and paste the URL, e.g. https://www.startupjobs.cz/nabidky/vyvoj?seniorita=junior), company pages (https://www.startupjobs.cz/startup/medevio) or job URLs (https://www.startupjobs.cz/nabidka/109135/…). The filters below fill in what a URL doesn't set. A URL with a salary, benefit or language filter is skipped (use the inputs instead), so you never get unfiltered jobs.

## `jobIds` (type: `array`):

Job IDs (the number in a job URL, e.g. 109135) or job URLs to read one by one. Ended ads are skipped. At most 1000.

## `companies` (type: `array`):

Only jobs of these companies: the end of the company page URL (medevio from https://www.startupjobs.cz/startup/medevio) or the whole URL. Applied by the website.

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

Maximum number of jobs saved. You pay per saved job. 0 = no limit (the whole website has about 400 jobs).

## `maxItemsPerSearch` (type: `integer`):

Limit for each keyword or URL separately, so one large search doesn't use up the whole Max jobs. 0 = no limit.

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

Add the description (e-mails and phone numbers removed), category, technologies, required languages with level, benefits, posting and update date, the town's GPS and the employer's screening question. The website gives the details of 50 jobs in one request, so this is included in the price of a job.

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

Shorten the description to about this many characters (e.g. 300 for a snippet). 0 = full text.

## `includeCompanyInfo` (type: `boolean`):

Add the company's industries, team size, website, LinkedIn page, address and short description from its StartupJobs.cz profile (one request per company). Never the team members or e-mails. Extra charge "Company info" (see the Pricing tab) per saved job with a company profile.

## `marketOverview` (type: `boolean`):

Add the website's own counts for each search to the SUMMARY record in the key-value store (free): jobs by category, seniority, contract type, working time, work mode, benefit and language, the share of startups and the salary distribution with quartiles. One extra request per search.

## `seniority` (type: `array`):

Only jobs open to these levels. Several values = any of them.

## `workArrangement` (type: `array`):

Only jobs offering one of these work modes.

## `employmentType` (type: `array`):

Only these working times.

## `contractTypes` (type: `array`):

Only these kinds of cooperation. Several values = any of them.

## `minSalary` (type: `integer`):

Only jobs whose salary reaches at least this amount (the website compares the top of the salary range and converts hourly and EUR salaries itself), in "Salary currency" per "Salary period", e.g. 80000 CZK per month or 500 CZK per hour. Jobs without a salary are left out (about 6 in 10 jobs on the website show none).

## `salaryCurrency` (type: `string`):

The currency of "Salary from" and "Salary up to".

## `salaryPeriod` (type: `string`):

The period of "Salary from" and "Salary up to".

## `onlyStartups` (type: `boolean`):

Only jobs of companies the website marks as startups (a small part of the website, about 3 % of jobs).

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

Only jobs in these towns, e.g. "Praha", "Brno", "Ostrava" (Czech or English name, diacritics optional). Checked by the actor on the towns of each job.

## `regions` (type: `array`):

Only jobs in these Czech regions (kraje), from the job's towns.

## `includeRemoteJobs` (type: `boolean`):

With "Towns" or "Regions": also keep jobs in other places that can be done remotely.

## `onlyWithSalary` (type: `boolean`):

Skip jobs that show no salary.

## `maxSalary` (type: `integer`):

Skip jobs whose salary starts above this amount (in "Salary currency" per "Salary period"). Jobs without a salary are kept.

## `postedWithinDays` (type: `integer`):

Only jobs published in the last N days. The date is in the details, which the actor then reads also with "Add description and details" off. 0 = any time.

## `titleKeywords` (type: `array`):

Keep only jobs whose title contains at least one of these words (case and diacritics don't matter).

## `excludeKeywords` (type: `array`):

Skip jobs whose title contains any of these words, e.g. "senior", "sales".

## `excludeCompanies` (type: `array`):

Skip jobs of companies whose name contains any of these texts.

## `onlyNewOrChanged` (type: `boolean`):

Return only jobs that are new or whose title, company, salary, towns, work mode, seniority, working time or contract types changed since the previous run with the same Monitoring key. Unchanged jobs are free.

## `monitoringKey` (type: `string`):

Name of the saved state. Use a different key for each watched search (e.g. "python-brno"). Empty = "default". The value is stored encrypted.

## `includeRemovedJobs` (type: `boolean`):

With "Monitoring: only new or changed jobs": also return jobs of the previous run that are no longer in the search, as rows with changeType "removed" and removedReason "expired" (the ad ended or was deleted) or "noLongerMatches" (the ad is live but no longer matches the search). Checked only when the run reads every search completely (limits, unread pages or rejected requests skip the check, and the status message says why). Removed rows are charged like any other job.

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

No proxy by default. If StartupJobs.cz (Cloudflare) rejects the requests, use Apify Proxy (automatic group; RESIDENTIAL with country Czechia if that is rejected too).

## Actor input object example

```json
{
  "searchQueries": [
    "python"
  ],
  "maxItems": 20,
  "maxItemsPerSearch": 0,
  "includeDetails": true,
  "descriptionMaxLength": 0,
  "includeCompanyInfo": false,
  "marketOverview": true,
  "salaryCurrency": "CZK",
  "salaryPeriod": "month",
  "onlyStartups": false,
  "includeRemoteJobs": false,
  "onlyWithSalary": false,
  "onlyNewOrChanged": false,
  "includeRemovedJobs": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "searchQueries": [
        "python"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tsutseisoftware/startupjobs-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 = {
    "searchQueries": ["python"],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("tsutseisoftware/startupjobs-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 '{
  "searchQueries": [
    "python"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call tsutseisoftware/startupjobs-scraper --silent --output-dataset

```

## MCP server setup

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