# Moj Posao HR Scraper: Croatia Jobs, Salaries & Employers (`santamaria-automations/mojposao-hr-scraper`) Actor

Scrape job listings from mojposao.hr, Croatia's #1 job board. Returns title, company, Croatian county (zupanija), location, employment type, remote/hybrid/on-site, EUR salary, and full HTML description.

- **URL**: https://apify.com/santamaria-automations/mojposao-hr-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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?

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

## Moj Posao HR Scraper: Croatia Jobs, Salaries & Employers

Collect job listings from [mojposao.hr](https://mojposao.hr), Croatia's largest job board with over 10,000 active listings. Returns structured data including job title, company, Croatian county (zupanija), location summary, salary in EUR, employment type, remote/hybrid/on-site status, full job description, employer address and about blurb, and job category.

Croatia joined the Eurozone in January 2023, so all current salary data is in EUR.

### What you get

Each result row contains:

- **Job**: title, URL, posted date, category, category URL
- **Company**: name, logo URL, website (when available), street address, about blurb
- **Location**: location summary, Croatian county (zupanija), country code HR
- **Compensation**: salary range in EUR (or HRK for legacy listings), pay period
- **Job details**: employment type (Full-time/Contract/Part-time/Internship/Seasonal/Studentski ugovor), workplace type (remote/hybrid/on-site)
- **Description**: snippet (200 chars), plain text, HTML, and Markdown (when includeJobDetails=true)
- **Contacts**: emails, phones, and external URLs from the job description
- **Apply URL**: direct application link or external ATS URL

### Use cases

- Job market research in Croatia: EUR salary benchmarking across Zagreb, Split, Rijeka
- Competitive intelligence: track hiring activity by Croatian county (zupanija)
- HR analytics: map employment type distribution and remote-work adoption
- Recruiting tools: aggregate Croatian IT, logistics, and hospitality postings
- Academic research: Croatian labor market trends post-Eurozone accession

### Pricing

This actor uses Pay-Per-Event (PPE) pricing:

| Event | Cost |
|---|---|
| Actor start | $0.001 |
| SERP result (job card data) | $0.003 |
| Full job detail (description + all fields) | $0.005 |

**$5 free monthly credit** is included with every Apify account: enough for roughly 1,000 SERP results or 500 full detail fetches per month.

Enable `includeJobDetails: true` (default) for complete descriptions, region, employment type, workplace type, company\_about, company\_address, and category. Disable for fast bulk collection at the lower per-event rate.

### Input

```json
{
  "searchQueries": ["programer", "vozac", "prodavac"],
  "location": "Zagreb",
  "includeJobDetails": true,
  "maxResults": 100
}
```

| Field | Type | Description |
|---|---|---|
| `searchQueries` | string\[] | Croatian job keywords. Examples: `programer`, `vozac`, `racunovodja`, `prodavac`, `kuhar` |
| `searchUrls` | string\[] | Direct mojposao.hr search URLs to crawl |
| `startUrls` | string\[] | Direct mojposao.hr job detail page URLs |
| `location` | string | City or region filter: `Zagreb`, `Split`, `Rijeka`, `Osijek`, `Varazdin` |
| `sortBy` | string enum | Sort order. Single value: `newest` (site-native ordering - featured/promoted first, then publication date descending). See Notes. |
| `includeJobDetails` | boolean | Fetch full description, region, employment type, workplace type, company\_about, company\_address, category (default: true) |
| `includeCompanyDetails` | boolean | Include company logo URL and website (default: false) |
| `maxResults` | integer | Total results cap (default: 5, max: 5000) |
| `maxResultsPerQuery` | integer | Cap per keyword (default: 5) |
| `maxConcurrency` | integer | Parallel detail page fetches, 1-20 (default: 5) |

### Output sample

```json
{
  "_type": "job",
  "id": "fbd11f96-b017-11f1-9e17-0280a8fb46bd",
  "title": "Vozac (m/z)",
  "job_url": "https://mojposao.hr/posao/fbd11f96-b017-11f1-9e17-0280a8fb46bd/vozac-m-z",
  "source_url": "https://mojposao.hr/posao/fbd11f96-b017-11f1-9e17-0280a8fb46bd/vozac-m-z",
  "source_platform": "mojposao.hr",
  "company_name": "PIK VRBOVEC plus d.o.o.",
  "company_website": null,
  "company_logo_url": "https://images-preview.moj-posao.net/company-logo/ab/example-fit-300x300x100.png",
  "company_about": "PIK VRBOVEC plus d.o.o. vodeca je mesna industrija u regiji, s tradicijom dugom vise od 80 godina.",
  "company_address": "Zagrebacka 148, 10340 Vrbovec",
  "location": "Vrbovec",
  "country": "HR",
  "region": "Zagrebacka",
  "posted_at_text": "2026-09-10T08:00:00.000Z",
  "posted_at_datetime": "2026-09-10T08:00:00Z",
  "employment_type": "Full-time",
  "workplace_type": "on-site",
  "salary_min": null,
  "salary_max": null,
  "salary_currency": null,
  "salary_period": null,
  "salary_text": null,
  "description": "Trazimo vozaca kategorije C za prijevoz robe na medunarodnim relacijama...",
  "description_full": "Trazimo vozaca kategorije C za prijevoz robe na medunarodnim relacijama.\n\nUvjeti:\n- Vozacka kategorija C/CE\n- Iskustvo u medunarodnom transportu",
  "description_html": "<p>Trazimo vozaca kategorije C za prijevoz robe na medunarodnim relacijama.</p>\n<ul>\n<li>Vozacka kategorija C/CE</li>\n<li>Iskustvo u medunarodnom transportu</li>\n</ul>",
  "description_md": "Trazimo vozaca kategorije C za prijevoz robe na medunarodnim relacijama.\n\n- Vozacka kategorija C/CE\n- Iskustvo u medunarodnom transportu",
  "description_snippet": "Trazimo vozaca kategorije C za prijevoz robe na medunarodnim relacijama.",
  "category": "Skladistenje i logistika",
  "category_url": "https://mojposao.hr/pretraga-poslova?positions=22",
  "contact_emails": [],
  "contact_phones": [],
  "contact_urls": [],
  "apply_url": "https://mojposao.hr/posao/fbd11f96-b017-11f1-9e17-0280a8fb46bd/vozac-m-z",
  "search_query": "vozac",
  "scraped_at": "2026-09-14T10:30:00Z"
}
```

### Croatian coverage

mojposao.hr covers all 20 Croatian zupanije (counties) plus Grad Zagreb:

- **Grad Zagreb**: capital, largest IT and finance hub (Zagreb city)
- **Zagrebacka**: Zagreb County surrounding the capital
- **Splitsko-dalmatinska**: Split, Dalmatia coast
- **Primorsko-goranska**: Rijeka, Kvarner region
- **Osjecko-baranjska**: Osijek, Slavonia
- **Varazdinska**: Varazdin, northwestern Croatia
- **Istarska**: Istria peninsula (Pula, Rovinj), high tourism employment
- **Brodsko-posavska, Karlovacka, Sibensko-kninska**: regional centers

The `region` field returns the Croatian zupanija name (e.g. `Grad Zagreb`, `Splitsko-dalmatinska`, `Primorsko-goranska`). The `location` field returns the location summary as displayed on the job card.

### Notes and limits

- **Currency**: Croatia joined the Eurozone on 1 January 2023. All current listings use EUR. Legacy listings from before 2023 may show HRK (Croatian kuna) amounts. The `salary_currency` field always reflects the data from the site.
- **Salary disclosure**: Many Croatian employers do not publish salaries. When `salary_from` and `salary_to` are both 0 in the site data, all salary fields will be null.
- **Employment types** on mojposao.hr: Stalni radni odnos (permanent), Na odredeno vrijeme (fixed-term), Praksa (internship), Honorarno (part-time/freelance), Sezonski (seasonal), Studentski ugovor (student contract), Volontiranje (volunteering).
- **Workplace types**: Remote (remote), Hibridno (hybrid), Na lokaciji (on-site). Some listings show EXCLUSIVE-HOME format.
- **Pagination**: the scraper uses `?page=N` pagination. mojposao.hr returns approximately 100 job groups per page; each group may contain 1-3 individual job postings.
- **Sort order**: mojposao.hr accepts `?sortBy=` on the SERP URL, but the Vue SSR payload returns identical ordering for every tested value (`adtype`, `newest`, `oldest`, `published-desc`, `salary-desc`) - verified 2026-09-03 with first-UUID comparison. The site's native default (featured/promoted ads first, then publication date descending) is used. The `sortBy` input field is present for fleet consistency with a single supported value: `newest`.
- **No login required**: the scraper works entirely without credentials. Saved/applied status is not scraped.
- **company\_about / company\_address**: populated when the employer has a company profile on mojposao.hr. Approximately 40-60% of listings include these fields.
- **category / category\_url**: populated from the Kategorije row on the job detail page. Present on approximately 90% of listings.
- **description layout variants**: mojposao.hr uses two description layouts. Standard listings use `article.standard-html`; approximately 30% use `div.job-section__content` (plain text with line breaks). Both are handled and produce equivalent description\_html and description\_md output.

### MCP

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=santamaria-automations/mojposao-hr-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}
```

Configure your MCP client with the Moj Posao HR Scraper preconfigured at `mcp.apify.com?tools=santamaria-automations/mojposao-hr-scraper`. You can connect via clients like Tester MCP Client, Claude Desktop, Cursor, or any other MCP client of your choice. See the Apify MCP docs for implementation details, the MCP protocol introduction for an overview, or the Apify blog post for a walkthrough.

### API integration

See the [auto-generated API tab](https://console.apify.com/actors/x2y5OrgPdJ8Xq2pdn/info/api) for language-specific examples (cURL, JavaScript, Python, .NET, Ruby, PHP) that stay in sync with the input schema.

### Why this scraper

- **HTTP-only Go**: no browser, no Playwright, no Puppeteer. Runs in 128 MB RAM.
- **Vue SSR payload extraction**: parses the structured Vue 3 SSR JSON directly instead of fragile CSS selectors, making it resilient to layout changes.
- **Dual description layout support**: handles both `article.standard-html` and `div.job-section__content` layouts that mojposao.hr uses across different job postings.
- **Croatian diacritics**: handles c, c, z, s, d correctly throughout title, description, and region fields.
- **EUR-native**: built for post-2023 Croatia with EUR as the base currency.
- **Streaming output**: each job is pushed to the dataset and charged as soon as it is scraped.

### Related actors

Feed the `company_website` field from this scraper's output into one of the two extractors below to enrich rows with contact data:

- [Website Email & Phone Scraper](https://apify.com/santamaria-automations/website-email-scraper): regex-based, fast and cheap; extracts emails + phones from a website.
- [Website Contact Extractor](https://apify.com/santamaria-automations/website-contact-extractor): LLM-based, higher precision on structured contact data (names, roles, department-scoped emails).

Other related job actors:

- [Job Feed](https://apify.com/santamaria-automations/job-feed): unified Croatian + EU job feed aggregator
- [Career Site Jobs Scraper](https://apify.com/santamaria-automations/career-site-jobs-scraper): scrape jobs from any company career page
- [Website Job Extractor](https://apify.com/santamaria-automations/website-job-extractor): extract job listings from any website
- [Indeed Scraper](https://apify.com/santamaria-automations/indeed-scraper): international job board
- [eJobs.ro Scraper](https://apify.com/santamaria-automations/ejobs-ro-scraper): Romania jobs (CEE peer)
- [Profession.hu Scraper](https://apify.com/santamaria-automations/profession-hu-scraper): Hungary jobs (CEE peer)

### Support

Questions, bugs, or feature requests: <contact@nanoscrape.com>

Use the [Issues tab](https://console.apify.com/actors/x2y5OrgPdJ8Xq2pdn/info/issues) to report problems.

# Actor input Schema

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

One or more job titles or keywords to search on mojposao.hr. Each entry runs as a separate search. Croatian keywords give best results. Examples: 'programer', 'racunovodja', 'vozac', 'prodavac'.

## `searchUrls` (type: `array`):

Direct mojposao.hr search result URLs to crawl. Example: https://mojposao.hr/pretraga-poslova?search=programer

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

Direct mojposao.hr job detail page URLs to scrape. Example: https://mojposao.hr/posao/8e028c5e-a060-11f1-9e17-0280a8fb46bd/agent-za-videoidentifikaciju-na-njemackom-m-z

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

Croatian city or county to filter results. Examples: 'Zagreb', 'Split', 'Rijeka', 'Osijek'. Leave empty for all of Croatia.

## `sortBy` (type: `string`):

How to order results. mojposao.hr does expose ?sortBy= in the URL but the Vue SSR payload only ships one effective ordering: 'adtype' (featured/promoted ads first, then by publication date descending). Alternative values (newest, oldest, published-desc, salary-desc) return the same SSR ordering -- verified 2026-09-03 (first UUIDs identical across all tested values). This field is present for fleet consistency; the sole supported value is 'newest' (native date-descending order after featured slots).

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

When enabled, fetches the full job detail page for each listing to populate description\_full, description\_html, description\_md, region (zupanija), employment type, workplace type, company website, and contact fields. Charges the job-detail-result PPE event instead of job-serp-result.

## `includeCompanyDetails` (type: `boolean`):

Surface company logo URL and website from the job detail page. Requires a detail page fetch per listing.

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

Total cap across all search queries.

## `maxResultsPerQuery` (type: `integer`):

Maximum results per individual search keyword or URL.

## `maxConcurrency` (type: `integer`):

Maximum number of parallel detail page fetches (when includeJobDetails=true).

## Actor input object example

```json
{
  "searchQueries": [
    "programer"
  ],
  "location": "Zagreb",
  "sortBy": "newest",
  "includeJobDetails": true,
  "includeCompanyDetails": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset containing scraped mojposao.hr job listings. Each row includes title, company (name, website, logo, about, address), location, region (zupanija), employment\_type, workplace\_type, EUR salary, full description in plain/HTML/Markdown, description\_snippet, category, category\_url, and contact fields.

# 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": [
        "programer"
    ],
    "sortBy": "newest",
    "includeJobDetails": true,
    "includeCompanyDetails": false,
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/mojposao-hr-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": ["programer"],
    "sortBy": "newest",
    "includeJobDetails": True,
    "includeCompanyDetails": False,
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/mojposao-hr-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": [
    "programer"
  ],
  "sortBy": "newest",
  "includeJobDetails": true,
  "includeCompanyDetails": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 5
}' |
apify call santamaria-automations/mojposao-hr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/mojposao-hr-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/x2y5OrgPdJ8Xq2pdn/builds/GuTAvkCImBMyctbjq/openapi.json
