ActorStack.dev
JobsLead generationv0.1.3updated 30 September 2026

elempleo.com Jobs Scraper — Colombia Job Offers & Salaries

Salary bands parsed to pesos and checked against the page, 216 of 216.

Job offers from elempleo.com, one of Colombia's largest job boards, with the salary band parsed into Colombian pesos, the city, contract type, work modality and employer on every row. An optional full-page read adds 32 fields, including the complete description, expiry date, education, experience and vacancies.

oswaldocarabano/elempleo-jobs-scraper

input.json
{
  "searchQuery": "desarrollador",
  "workModality": "remote",
  "maxItems": 200,
  "scrapeDetails": true
}
Version
v0.1.3
Memory
512 MB
Browser
none
Proxy
None needed; fallback only

Short answer

The elempleo.com Jobs Scraper extracts job offers from Colombia's elempleo.com with the salary band parsed into COP — filled on 75.9% of 1,000 offers measured on 30 September 2026, with the rest published as confidential. The parsed bands matched the salary in the job page's structured data on 216 of 216 offers checked. 31.5% of offers hide the employer's name, and those rows return `company_name: null` rather than the site's placeholder. elempleo's search stops at 10,000 results, so larger pulls are split by job area. The site's robots.txt allows the paths the Actor uses but carries a notice prohibiting automated extraction without written permission. Pricing is $0.70 per 1,000 offers.

Key points

  • The elempleo.com Jobs Scraper parses salary bands into COP numbers, filled on 75.9% of 1,000 offers measured on 30 September 2026.
  • Parsed salary bands matched the job page's structured data on 216 of 216 offers checked, with the page adding 1 peso to the lower bound.
  • 31.5% of 1,000 offers were published as confidential, and those rows return a null company name instead of elempleo's placeholder.
  • elempleo's search returns at most 10,000 results per query, and asking for result 10,001 produces a server error rather than an empty page.
  • Search results cut long descriptions at about 2,000 characters on 159 of 1,000 offers; the full job page returned 0 of 300 truncated.
  • elempleo's robots.txt, fetched on 10 October 2026, allows the Actor's paths for all crawlers but states that automated extraction without written permission is prohibited.
On this page11 sections

What it does

Job offers from elempleo.com, one of Colombia's largest job boards, with the salary band parsed into Colombian pesos, the city, contract type, work modality and employer on every row. An optional full-page read adds 32 fields, including the complete description, expiry date, education, experience and vacancies.

output — one row
{
  "job_id": 1886771176,
  "title": "Gestor de nuevos negocios b2b entidad financiera - bogota",
  "company_name": "SUMMAR PRODUCTIVIDAD S.A.S",
  "is_confidential": false,
  "city": "Bogotá",
  "salary_text": "$2,5 a $3 millones",
  "salary_min": 2500000,
  "salary_max": 3000000,
  "salary_currency": "COP",
  "contract_type": "Por obra o labor",
  "work_modality": "Presencial",
  "published_at": "2026-09-23T00:00:00Z",
  "keywords": ["VENTAS"],
  "related_positions": ["Asesor comercial"],
  "description_is_truncated": false,
  "detail_fetched": false
}

Why this one

Salary parsed and checked

elempleo publishes bands such as "$2,5 a $3 millones" with a decimal comma. The elempleo.com Jobs Scraper turns that into 2,500,000 and 3,000,000 and checked the result against the salary in the job page's structured data: 216 of 216 matched on 30 September 2026.

Confidential stays confidential

When an employer hides its name, elempleo shows a placeholder name and a default logo. The Actor returns `company_name: null`, `company_logo_url: null` and `is_confidential: true` rather than passing the default image off as the company's logo — 31.5% of 1,000 measured offers.

Past the 10,000 cap without overreaching

elempleo answers a request beyond result 10,000 with a server error. The Actor never asks for that page; when a search matches more than 10,000 offers it splits by job area, spreads the quota across areas and removes duplicates, because an offer can belong to several areas.

Filters that do nothing are not offered

Every filter was tested against the site's own counter — Medellín returned 1,431 offers and the counter said 1,431. Two parameters the site accepts and silently ignores, minimum experience and sort order, are left out of the input so they cannot appear to work.

Use cases

  • Build a Colombian labour-market dataset: 20,876 live offers on 30 September 2026, with city, contract and modality on every row.
  • Benchmark salaries in Colombia from parsed COP bands, separating confidential offers from missing ones.
  • Track hiring demand by city, job area or industry on a daily schedule, deduplicated on `job_id`.
  • Identify employers hiring now, with name, industry and profile page where the offer is not confidential.

Input

Every field has a default, and the defaults are deliberately small so a first run is cheap enough to inspect before you commit to a sweep. This table mirrors the Actor's own input schema field for field.

FieldDefaultWhat it does
searchQuerystring""KeywordFree text like the site's search box. Letters, numbers and . , & + # ' ( ) / - only, because the site's firewall blocks anything that looks like a URL or code.
citiesstring[][]CitiesOne or more of 60 cities as elempleo lists them. Empty is all of Colombia.
areasstring[][]Job areasOne or more of 33 areas in elempleo's own taxonomy.
industryenum""IndustryThe sector of the offer, which can differ from the employer's own industry.
workModalityenumanyWork modalityOn-site, hybrid or remote.
contractTypeenumanyContract typePermanent, fixed term, service contract, apprenticeship, per project or other.
positionLevelenumanyPosition levelAs classified by elempleo.
publishedWithinenumanyPublished withinToday and yesterday, last week, last 2 weeks or last month.
salaryRangesstring[][]Salary rangesMonthly bands in millions of COP. Empty includes confidential offers.
maxItemsinteger50Maximum job offersHard cap on offers delivered and charged. Above 10,000 the search is split by job area.
scrapeDetailsbooleanfalseInclude full job pageAdds 32 fields from each offer page. One extra request per offer, charged separately.
maxConcurrencyinteger3Parallel job pages5 ran at 5.4 pages per second with no refusals.
proxyConfigurationobjectnoneConnection settingsNot needed: elempleo answers directly. Used only as a fallback.

Output and fill rates

A field being in the schema is not the same as it having a value. The percentages below were counted on real runs; the sample sizes are in Measurements. Anything not listed here is not promised.

FieldFilledMeaning
titlestring100%With `job_id`, `url`, `city`, `published_at`, `keywords` and `related_positions`.
contract_typestring100%With `work_modality`, `is_remote` and `is_hybrid`, as elempleo publishes them in Spanish.
salary_textstring100%The band as displayed, with `has_salary` and `salary_currency`.
salary_mininteger75.9%Parsed COP. The rest are "Salario confidencial" (23.2%).
salary_maxinteger76.6%Null for the open band "Más de $21 millones".
company_namestring68.5%With `company_id`. Null on confidential offers.
company_logo_urlstring64.5%Null on confidential offers and companies without a logo.
description_is_truncatedboolean100%True on 159 of 1,000 search rows; full-page descriptions are never truncated.
valid_throughdate100%Expiry date. Full job page only, of 300 pages.
education_levelstring90%Full job page only, of 300 pages.
work_schedulestring75%Full job page only, of 300 pages.
company_descriptionstring34.7%Full job page only, of 300 pages.
contact_phonesstring[]4.3%Recruitment phones written into the offer: 4.3% of 300 full pages, 2.8% of 1,000 search rows.

Every key is always present. A field that exists but is empty comes back as explicit null, so a parser never has to guess.

Datasets

Different record types go to different datasets, so the main table never carries columns that are blank on most rows.

  • defaultOne row per job offer, 69 fields with every key always present.billed
  • Error rowsA filter that matches nothing or a rejected keyword, with the reason. Never charged.never billed

Pricing

Pay per delivered result. Charges are applied as each row is produced rather than in a lump at the end, so an aborted run bills only for what it actually gave you.

EventPriceNotes
apify-actor-startActor start$0.00001Platform minimum, once per run.
jobJob offer$0.0007One offer row: title, company, city, salary band parsed to COP, contract, modality, keywords, related positions and description. $0.70 per 1,000.
job-detailFull job page$0.00004Adds 32 fields from the offer page. Only when turned on and the page was read.

Measurements

Each figure is shown with the method that produced it. A benchmark without a method is a marketing claim wearing a number's clothes.

Search-row sample

1,000 offers

The newest 1,000 offers nationwide, measured on Apify on 30 September 2026. Median of 30 filled fields per row.

Full-page sample

300 offers

Same day, with the full job page. Median of 58 filled fields per row.

Salary parse check

216 of 216 matched

Parsed band against the salary in the job page's structured data, 30 September 2026.

Publisher type

494 of 494 from company accounts

Offers measured on 23 September 2026, confidential ones included.

Filter check

Medellín 1,431 = site counter 1,431

Every filter was compared against elempleo's own result counter on 23 September 2026.

Inventory

20,876 live offers

Nationwide counter on 30 September 2026; Bogotá alone 13,072.

What it will not do

Stated plainly so you can judge fit before spending anything.

  • elempleo's robots.txt notice and its terms restrict automated extraction and commercial use of the site's content; that is a constraint on the operator's use, not something the Actor resolves.
  • Salary is published on 75.9% of offers; 23.2% say "Salario confidencial".
  • One search returns at most 10,000 results, so full-country pulls are split by job area.
  • The search result truncates about 15.9% of descriptions; the full job page, at $0.00004 extra per offer, returns them complete.
  • Values are returned as elempleo publishes them, in Spanish, such as "Presencial" and "Indefinido".

Privacy

  • Only registered company accounts can publish offers on elempleo: 494 of 494 measured offers came from a company account, confidential ones included.
  • Recruitment phone numbers and emails that employers write into an offer are delivered in `contact_phones` and `contact_emails` — 4.3% and 4.0% of 300 full job pages.
  • Nothing about candidates or site users is collected, and account, CV and application paths are blocked in the code.
  • Removal requests: privacy@actorstack.dev

See also the data removal process.

Frequently asked questions

Does the elempleo scraper need an account?
No. The elempleo.com Jobs Scraper reads what any visitor sees, without logging in, and account, CV and application paths are blocked in the code.
Can I get every job offer in Colombia?
Yes, by setting `maxItems` above the number of offers — 20,876 on 30 September 2026. elempleo's search stops at 10,000 results, so the Actor splits the search by job area and removes duplicates.
Why is company_name empty on some rows?
The employer published the offer as confidential, which 31.5% of 1,000 offers did on 30 September 2026. `company_display_name` shows the placeholder the site displays, and `is_confidential` is true.
Does elempleo allow scraping?
Its robots.txt, fetched on 10 October 2026, allows the paths the Actor uses for all crawlers, but its comments say automated extraction without prior written permission is prohibited, and the terms bar unauthorised commercial use. That is a question for the operator and their lawyer.
How much does a full pull cost?
About $14.60 for 20,876 offers at $0.0007 each, plus $0.00004 per offer if full job pages are on. An empty input returns the 50 newest offers for about $0.035.

Guides for this Actor