# eJobs.ro Scraper: Romania Jobs, Salaries & Employers (`santamaria-automations/ejobs-ro-scraper`) Actor

Scrape job listings from eJobs.ro, Romania's #1 job board. Returns title, company, Romanian county (județ), city, employment type, remote type, RON/EUR salary, career level, languages required, and full HTML description.

- **URL**: https://apify.com/santamaria-automations/ejobs-ro-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

## eJobs.ro Scraper: Romania Jobs, Salaries & Employers

Collect job listings from [eJobs.ro](https://www.ejobs.ro), Romania's largest job board with over 15,000 active listings. Returns structured data including job title, company, Romanian county (județ), city, salary in RON or EUR, employment type, remote type, career level, languages required, full job description, contact URLs embedded in descriptions, and company website plus social profiles.

### What you get

Each result row contains:

- **Job**: title, URL, posted date, apply URL (external ATS only -- null for internal ejobs.ro apply)
- **Company**: name, logo URL, website URL, social media profiles (when `includeCompanyDetails=true`)
- **Location**: city, county (județ), country code RO
- **Compensation**: salary range (RON or EUR), pay period (luna/month)
- **Job details**: employment type (Full-time/Part-time/Internship), remote type (Remote/Hibrid/On-site)
- **Career level**: Fara experienta / Junior / Mid / Senior / Manager
- **Industry**: IT/Telecom, Comert/Retail, Inginerie, etc.
- **Languages required**: English, French, German and other foreign language requirements
- **Description**: plain text, HTML, and Markdown (when `includeJobDetails=true`)
- **Contacts**: emails, phones, and external URLs extracted from the job description (including bare URLs in plain-text sections appended after the HTML body)

### Use cases

- Job market research in Romania: salary benchmarking for RON/EUR positions
- Competitive intelligence: track which companies are hiring in Cluj, Timisoara, Iasi
- HR analytics: map employment types and career level distribution
- Recruiting tools: aggregate Romanian IT/telecom postings
- Lead generation: extract company websites and social profiles from active employers
- Academic research: Romanian labor market trends

### 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 |
| Company detail (website + social URLs, cached per employer) | $0.002 |

**$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` for complete descriptions, county, career level, and language requirements. Enable `includeCompanyDetails: true` to also fetch company profiles for `company_website` and `company_social_urls`. Company pages are cached per unique employer within a run, so the `company-detail-result` event fires once per company regardless of how many listings that company posted.

### Input

```json
{
  "searchQueries": ["programator", "contabil", "manager vanzari"],
  "location": "Bucuresti",
  "includeJobDetails": true,
  "includeCompanyDetails": true,
  "maxResults": 100
}
```

| Field | Type | Description |
|---|---|---|
| `searchQueries` | string\[] | Romanian job keywords. Examples: `programator`, `contabil`, `inginer`, `manager` |
| `searchUrls` | string\[] | Direct eJobs.ro search URLs |
| `startUrls` | string\[] | Direct eJobs.ro job detail page URLs |
| `location` | string | Romanian city filter: `Bucuresti`, `Cluj-Napoca`, `Timisoara`, `Iasi`, `Brasov` |
| `employmentType` | string | `any`, `full-time`, `part-time`, `internship` |
| `remoteOnly` | boolean | Filter for remote positions only |
| `includeJobDetails` | boolean | Fetch full description, county, career level, languages, contact fields (default: false) |
| `includeCompanyDetails` | boolean | Fetch company profile for `company_website` and `company_social_urls`. Cached per unique employer (default: false) |
| `sortBy` | string | Sort order: `newest` (default) or `relevance`. Use `newest` for scheduled scrapes. |
| `maxResultsPerQuery` | integer | Cap per keyword (default: 5) |
| `maxResults` | integer | Total results cap across all queries (default: 5, max: 5000) |
| `maxConcurrency` | integer | Parallel detail page fetches when `includeJobDetails=true`. Safe to set up to 10 (default: 5). |

### Output sample

```json
{
  "_type": "job",
  "id": "1986388",
  "title": "Programator SAP ABAP - Bucuresti, Bacau",
  "job_url": "https://www.ejobs.ro/user/locuri-de-munca/programator-sap-abap-bucuresti-bacau/1986388",
  "source_url": "https://www.ejobs.ro/user/locuri-de-munca/programator-sap-abap-bucuresti-bacau/1986388",
  "source_platform": "ejobs.ro",
  "company_name": "DEDEMAN",
  "company_website": "https://dedeman.ro",
  "company_logo_url": "https://content.ejobs.ro/img/logos/2/29986.png",
  "company_social_urls": ["http://www.facebook.com/dedeman.ro"],
  "location": "Bucuresti",
  "country": "RO",
  "county": "Bucuresti",
  "city": "Bucuresti",
  "posted_at_text": "14 Sept. 2026",
  "posted_at_datetime": "2026-09-14T00:00:00Z",
  "employment_type": "Full-time",
  "remote_type": "Hibrid",
  "experience_level": "Mid",
  "industry": "IT / Telecom",
  "languages_required": ["Engleza"],
  "salary_min": null,
  "salary_max": null,
  "salary_currency": null,
  "salary_period": null,
  "salary_text": null,
  "description": "Cautam un Programator SAP ABAP care sa contribuie...",
  "description_full": "...",
  "description_html": "...",
  "description_md": "...",
  "contact_emails": [],
  "contact_phones": [],
  "contact_urls": ["https://www.dedeman.ro/ro/nota-informare-candidati.html"],
  "apply_url": null,
  "search_query": "programator",
  "scraped_at": "2026-09-14T16:00:00Z"
}
```

### Field notes

- **`apply_url`**: populated only when a job uses an external ATS (Workday, Lever, Greenhouse, Bamboo HR, etc.) and eJobs.ro embeds the external redirect URL in its Nuxt payload. The majority of Romanian employers use eJobs.ro's internal apply flow -- for those jobs `apply_url` is null and the canonical `job_url` is the landing page. This is by design, not a data gap.
- **`contact_urls`**: extracted from the full description text, including bare URLs in plain-text sections that appear after the HTML job body (e.g. company privacy-notice links). Self-domain (ejobs.ro) URLs are filtered out.
- **`company_website`**: the first non-social link found in the company profile's social block. Null when `includeCompanyDetails=false` or when the company has no profile page.
- **`company_social_urls`**: sorted array of social media profile links (Facebook, LinkedIn, Instagram, TikTok, YouTube, Twitter/X) from the company profile. Empty array when none are present or `includeCompanyDetails=false`.

### Romanian coverage

eJobs.ro covers all major Romanian counties (judete):

- **Bucuresti**: capital, largest IT/finance hub
- **Cluj**: second-largest tech hub (Cluj-Napoca)
- **Timis**: western Romania tech cluster (Timisoara)
- **Iasi**: northeast Romania hub
- **Brasov**, **Prahova**, **Constanta**, **Dolj**, **Bihor**: regional centers

The `county` field returns the Romanian judet name (e.g. `Bucuresti`, `Cluj`, `Timis`, `Iasi`). The `city` field returns the city name with Romanian diacritics (e.g. `Bucuresti`, `Cluj-Napoca`, `Timisoara`).

### Related actors

- [LinkedIn Jobs Scraper](https://apify.com/apify/linkedin-jobs-scraper): global job board
- [Indeed Scraper](https://apify.com/santamaria-automations/indeed-scraper): international job board
- [Prace.cz Scraper](https://apify.com/santamaria-automations/prace-cz-scraper): Czech Republic jobs (CEE peer)
- [Profession.hu Scraper](https://apify.com/santamaria-automations/profession-hu-scraper): Hungary jobs (CEE peer)
- [Google Maps Scraper](https://apify.com/santamaria-automations/google-maps-scraper): enrich companies with location data
- [Website Contact Extractor](https://apify.com/santamaria-automations/website-contact-extractor): extract emails and phones from company websites
- [Website Email Scraper](https://apify.com/santamaria-automations/website-email-scraper): find contact emails for hiring companies

### Support

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

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

# Actor input Schema

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

One or more job titles or keywords to search on eJobs.ro. Each entry runs as a separate search. Romanian keywords give best results. Examples: 'programator', 'contabil', 'manager vanzari', 'inginer'.

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

Direct eJobs.ro search result URLs to crawl. Example: https://www.ejobs.ro/locuri-de-munca/programator

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

Direct eJobs.ro job detail page URLs to scrape. Example: https://www.ejobs.ro/user/locuri-de-munca/programator-junior-bucuresti/1980327

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

Romanian city to filter results. Examples: 'Bucuresti', 'Cluj-Napoca', 'Timisoara', 'Iasi', 'Brasov'. Leave empty for all of Romania.

## `employmentType` (type: `string`):

Filter by employment type. Leave as 'any' for all types.

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

Sort order for search results. Use 'newest' for scheduled scrapes to get latest postings first.

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

When enabled, only return jobs with remote work options.

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

When enabled, fetches the full job detail page for each listing to populate description\_full, description\_html, description\_md, county, city, career level, remote type, languages required, and contact fields (emails, phones, URLs). Charges the job-detail-result PPE event instead of job-serp-result.

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

When enabled, fetches the eJobs.ro company profile page for each unique employer to extract company\_website and company\_social\_urls (Facebook, LinkedIn, Instagram, etc.). Results are cached per company so each unique employer is fetched only once per run. Charges a company-detail-result PPE event per unique company fetched.

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

Maximum results per individual search keyword or URL.

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

Total cap across all search queries.

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

Maximum number of parallel detail page fetches. Higher values speed up runs with includeJobDetails=true. Safe to increase up to 10 -- the actor uses per-worker rotating proxy sessions to avoid blocks.

## Actor input object example

```json
{
  "searchQueries": [
    "programator"
  ],
  "location": "Bucuresti",
  "employmentType": "any",
  "sortBy": "newest",
  "remoteOnly": false,
  "includeJobDetails": false,
  "includeCompanyDetails": false,
  "maxResultsPerQuery": 5,
  "maxResults": 5,
  "maxConcurrency": 5
}
```

# Actor output Schema

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

Dataset containing scraped eJobs.ro job listings. Each row includes title, company, city, county, employment\_type, remote\_type, salary in RON/EUR, experience\_level, languages\_required, description, contact\_urls (bare URLs from description), company\_website, and company\_social\_urls (when includeCompanyDetails=true).

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

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

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

```

## MCP server setup

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