eJobs.ro Job Listings Scraper avatar

eJobs.ro Job Listings Scraper

Pricing

from $1.07 / 1,000 ejobs.ro job listings scrapers

Go to Apify Store
eJobs.ro Job Listings Scraper

eJobs.ro Job Listings Scraper

Collect Romanian eJobs.ro job listings from the JSON API. Get job records with company, location, and descriptions. Run with keyword or filters; no live eJobs account required. Pricing: $0.0011 per dataset item on Free; $0.00005 per Actor Start event.

Pricing

from $1.07 / 1,000 ejobs.ro job listings scrapers

Rating

0.0

(0)

Developer

Vitalii Bondarev

Vitalii Bondarev

Maintained by Community

Actor stats

0

Bookmarked

15

Total users

10

Monthly active users

4 days ago

Last modified

Features

Limited permissions

Share

Collect public Romanian job listings from the api.ejobs.ro JSON API as Apify dataset records. No eJobs account is needed; billing details are in Pricing.

  • Collect Romanian job data for recruiting and lead generation
  • Filter by city, department, industry, career level, contract type, age, and verification
  • Add full job, ideal-candidate, and company descriptions with fetchDetails
  • Analyze company identifiers, locations, taxonomy values, dates, and source URLs

What you get

Each job is one dataset record. Nullable fields are null when the source provides no value.

Field(s)TypeContentsAvailability
id, urlstring; never nullID and public URL; id is "" when absent; a missing or null slug leaves the URL segment empty.Listing
slugstring; "" when omitted, null when sent as nullSlug.Listing
titlestring; null when absentJob title.Listing
company, companySlugstring; null when absentEmployer name and slug.Listing
companyIdinteger; null when absentEmployer ID.Listing
companyVerifiedboolean; null when absentVerification value.Listing
companyLogoUrlstring; null when absentAbsolute logo URL.Listing
locationsarray of objects; [] when none; fields can be nullcityId, cityName, address, latitude, longitude, countyId, countyName.Listing
locationstring; null when no cityFirst city name.Normalized location
cities, countiesarray of strings; [] when noneNormalized city and county names.Listing
positionsinteger; null when absentNumber of positions.Listing
contractTypesIds, careerLevelsIds, departmentsIds, industriesIdsarray of integers; [] when absentTaxonomy IDs.Listing
contractTypes, careerLevels, departments, industriesarray of strings; [] when noneNames resolved from IDs.Listing
educationLevelsIds, languagesIdsarray of integers; [] when absent or details are offEducation and language IDs.Detail; may be empty when off
educationLevels, languagesarray of strings; [] when none or details are offEducation and language names.Detail; may be empty when off
creationDate, publishDateISO 8601 string; null when absentCreation and publication dates; same value.Listing
expirationDateISO 8601 string; null when absentExpiration value, possibly date-only.Listing
lastModified, republishDateISO 8601 string; null when absent or details are offModification and republishing timestamps.Detail; may be null when off
jobTypestring; null when absent or details are offJob-type value.Detail; may be null when off
idealCandidateHtml, descriptionHtml, companyDescriptionHtmlstring; null when not loadedDescriptions in markup.fetchDetails on and successful detail request
idealCandidateText, descriptionText, companyDescriptionTextstring; "" when not loadedThe same descriptions as readable text.fetchDetails on and successful detail request
summarystring; null when not loadedShort detail-response excerpt.fetchDetails on and successful detail request
sourcestring; never null or emptyejobs.ro.Added by the Actor
scrapedAtISO 8601 string; never null or emptyProcessing timestamp.Added by the Actor
detailStatus, detailErrorstring; absent unless a detail request fails"failed" and an error limited to 200 characters.Detail request failure

Sample output

Shortened sample: selected fields from one real dataset record; omitted fields are whole fields from the same record. This record used fetchDetails: false, so descriptionText is empty.

{
"id": "99248571",
"url": "https://www.ejobs.ro/user/locuri-de-munca/contabil/99248571",
"title": "Contabil",
"company": "PREMIER RESTAURANTS ROMANIA SRL",
"companyId": 11389,
"companyVerified": true,
"location": "București",
"cities": ["București"],
"contractTypes": ["Full time"],
"careerLevels": ["Senior-Level (> 5 ani)"],
"departments": ["Financiar / Contabilitate"],
"industries": ["Turism / HoReCa"],
"publishDate": "2026-10-28T05:00:00+02:00",
"descriptionText": "",
"source": "ejobs.ro",
"scrapedAt": "2026-10-28T06:35:59.403555+00:00"
}

Pricing

You pay only for the events below. This Actor does not use the Pay per event + usage option, so compute, proxy traffic, and storage are not billed separately.

  • Actor Start: charged when the Actor starts, with one event per GB of run memory and a minimum of one event.
  • eJobs.ro Job Listings Scraper: one dataset-item event per scraped result.
Apify planActor Start (per event)Dataset item (per event)
Free$0.00005$0.0011
Bronze$0.0000495$0.001089
Silver$0.000049$0.001078
Gold$0.0000485$0.001067
Platinum$0.0000485$0.001067
Diamond$0.0000485$0.001067

On the Free plan: 1,000 dataset items = $1.10; 10,000 = $11.00; 1,000 starts = $0.05; 10,000 = $0.50; 10 results = $0.011.

At the Actor's default 512 MB memory, a default Free-plan run of 10 results costs $0.01105 ($0.00005 + 10 × $0.0011, one start event), so the $5 Free-plan monthly credit covers 452 full runs (4,520 results).

The apify-default-dataset-item event is one event per record written. Filtered listings, maxAgeDays exclusions, repeated job IDs within one run, unparseable listings, and empty pages create no dataset-item charge. A record with detailStatus: "failed" is delivered and charged.

The job-record event has no price, so you are not charged for it.

How to use

  1. Enter an optional keyword and set maxResults.
  2. Turn fetchDetails on to fill the description fields; with it off they stay empty.
  3. Add filters, maxAgeDays, or verifiedOnly when needed.
  4. Start the run, inspect the dataset, and repeat it through Apify Schedules (daily suits job listings).

Example input:

{
"keyword": "contabil",
"maxResults": 10,
"fetchDetails": true,
"cities": ["București"],
"careerLevels": ["Senior-Level (> 5 ani)"],
"verifiedOnly": true
}

Export the dataset as JSON or CSV, or read it through the Apify dataset API.

The Actor calls the public JSON API with curl_cffi; it does not launch a browser, use Playwright or Selenium, or scrape eJobs HTML pages. The default proxy uses the RESIDENTIAL group with Romania as the proxy country; custom settings use proxyConfiguration.

Input parameters

ParameterWhat it doesDefault
keywordOptional keyword for the listing request.""
fetchDetailsRequests detail data and descriptions.true
maxResultsMaximum records; integers from 1 through 5000.100
citiesCity names or numeric IDs.Not set
departmentsDepartment names or numeric IDs.Not set
industriesIndustry names or numeric IDs.Not set
careerLevelsCareer-level names or numeric IDs.Not set
contractTypesContract-type names or numeric IDs.Not set
maxAgeDaysKeeps jobs with a parsed creation or publication date no older than the supplied days.Not set
verifiedOnlyKeeps records marked verified.false
proxyConfigurationConfigures Apify Proxy requests.useApifyProxy: true, group RESIDENTIAL, country RO
disableUsageStatsSet to true to turn off the run summary described in Usage statistics.false

Each filter value must equal a full name or numeric ID; case and diacritics are ignored. A partial name such as Buc matches nothing. Values within one filter are alternatives, and different filters must all pass.

Limits and edge cases

ConditionWhat you seeWhat to do
Free-plan cap is reached.Succeeded with at most 10 records and stopReason: "PREVIEW_CAP"; only delivered records are charged.Use the preview or upgrade.
maxResults is below 1.Failed with an empty dataset; OUTPUT contains emptyReason and message.Use an integer from 1 through 5000.
A keyword returns HTTP 404 on page 1 after a second try, or no listings are returned.Succeeded with an empty dataset; OUTPUT contains emptyReason: "NO_MATCH_FOR_INPUT" and message.Check spelling, broaden the keyword, or remove it.
Filters, maxAgeDays, or verifiedOnly exclude every scanned listing.Succeeded with an empty dataset; OUTPUT contains emptyReason: "FILTERED_OUT". With an active filter, up to 150 pages of 50 are scanned; otherwise ceil(maxResults / page size) + 5.Loosen or remove filters.
A listing has no usable date while maxAgeDays is set.It does not pass the age filter.Remove maxAgeDays or use a value supported by the dates.
A detail request fails after two attempts.The record is delivered and charged with detailStatus: "failed" and detailError cut to 200 characters.Use listing fields or rerun with fetchDetails off.
Before any record is delivered, a block, source error, taxonomy failure, time limit, or total parse failure occurs.The run ends Failed with an empty dataset; OUTPUT contains an emptyReason (BLOCKED, UNKNOWN, or PARSE_FAILED) and message; nothing is charged.Check the source and proxy, retry, lower maxResults, or turn fetchDetails off.
Records are being collected.Records reach the dataset in batches of 10.Inspect the dataset and OUTPUT.
A block, source error, HTTP 404, page limit, or time limit occurs after delivery begins.Succeeded with partial results; OUTPUT carries totalItems, message, stoppedEarly, and stopReason.Run again later for the rest.
The run is aborted or killed.Written records stay; up to 9 unwritten records are lost. Unwritten records are not charged.Rerun the same input.

FAQ

How much does it cost to scrape Romanian job listings?

$0.0011 per result on the Free plan; 10 results = $0.011. See Pricing for all plans.

Why did the run return no records?

The keyword may have no matches, filters may exclude every listing, or a missing usable date may fail maxAgeDays. OUTPUT explains the empty condition.

The Actor collects data from the public api.ejobs.ro JSON API. Whether a use is legal or allowed depends on source terms, applicable law, and your use case; review those requirements before using the data. The Actor provides no legal guarantee.

Usage statistics

This Actor creates a small, content-free summary at the end of each run, used only to monitor reliability and improve this Actor. No input values, credentials or scraped data are sent.

A copy of the exact record for your run is saved as USAGE_STATS in your own Apify key-value store.

To opt out, set disableUsageStats to true in the input. Nothing is sent then.

Full list of collected fields