LinkedIn LATAM Tech Jobs Scraper + Company Domain
Eighteen Latin American countries, no login, and the filters LinkedIn ignores applied anyway.
LinkedIn tech job postings in Brazil, Mexico, Argentina, Colombia, Chile and thirteen more Latin American countries, read from the public job pages LinkedIn shows signed-out visitors. Each job carries the hiring company's website and domain, the tech stack extracted from the description, workplace type, English level and, optionally, the company's LinkedIn profile.
oswaldocarabano/linkedin-latam-tech-jobs-scraper
{
"outputType": "jobs",
"keywords": ["react"],
"countries": ["LATAM"],
"workplaceTypes": ["remote"],
"inferEmailPattern": true,
"maxItems": 30
}- Version
- v0.1.9
- Memory
- 512 MB
- Browser
- none
- Proxy
- Built-in residential connection
Short answer
The LinkedIn LATAM Tech Jobs Scraper reads LinkedIn's public job pages for 18 Latin American countries without an account or cookies, and adds the hiring company's website and domain — filled on 97.6% of 639 jobs measured on 1 October 2026 across 8 countries and 4 role searches. The tech stack was found on 99.4% of those jobs, workplace type on 64.5% and a LinkedIn salary range on 2.7%. LinkedIn ignores workplace, seniority and job-type filters for signed-out visitors, so the Actor applies them itself from each job page. LinkedIn's robots.txt disallows all paths for unnamed crawlers. Pricing is $2 per 1,000 jobs, plus $0.003 per distinct company profile.
Key points
- The LinkedIn LATAM Tech Jobs Scraper covers 18 Latin American countries plus the Latin America region, reading public job pages with no account or cookies.
- Company website and domain were filled on 97.6% of 639 jobs measured on 1 October 2026 across 8 countries and 4 role searches.
- A salary range published on LinkedIn appeared on 2.7% of 639 jobs, from 0% in Brazil and Argentina to 7.5% in Chile.
- LinkedIn ignores workplace type, experience level and job type for signed-out visitors — 13 of 13 tested variants returned the same jobs — so the Actor filters those itself.
- One LinkedIn search stops at 1,000 jobs; each keyword and country pair is a separate search, so adding pairs is how a run goes further.
- LinkedIn's robots.txt, fetched on 10 October 2026, disallows every path for crawlers it has not named, and its User Agreement prohibits scraping.
What it does
LinkedIn tech job postings in Brazil, Mexico, Argentina, Colombia, Chile and thirteen more Latin American countries, read from the public job pages LinkedIn shows signed-out visitors. Each job carries the hiring company's website and domain, the tech stack extracted from the description, workplace type, English level and, optionally, the company's LinkedIn profile.
{
"jobId": "4443434628",
"jobUrl": "https://www.linkedin.com/jobs/view/4443434628/",
"title": "Staff Frontend Software Engineer",
"companyName": "Tractian",
"location": "São Paulo, São Paulo, Brazil",
"countryCode": "BR",
"postedDate": "2026-09-26",
"applicants": 200,
"employmentType": "Full-time",
"roleCategory": "frontend",
"workplaceType": "remote",
"latamEligible": true,
"englishLevel": "fluent",
"stack": ["React"],
"applyType": "external",
"website": "http://www.tractian.com",
"domain": "tractian.com",
"companySize": "501-1,000 employees",
"companyHeadquarters": "Atlanta, Georgia",
"emailPattern": "first.last",
"emailPatternConfidence": 0.1,
"emailPatternInferred": true,
"mxValid": true,
"catchAll": null
}Why this one
Filters LinkedIn drops, applied from the job page
For a visitor without an account LinkedIn honours only keyword, location and posted-within; workplace type, experience level and job type returned exactly the same jobs in 13 of 13 tested variants. The LinkedIn LATAM Tech Jobs Scraper reads each job page and applies those three filters itself, and skipped jobs are never charged.
Padding is filtered out
LinkedIn fills searches with unrelated jobs when few match — a nonsense keyword still returns 10 jobs per page. By default a job is kept only if it mentions every word of the keyword and is a tech role, and a search with 5 pages in a row of nothing relevant is treated as exhausted rather than read to 1,000.
The company domain is always there
Website and domain come from the job page itself and ship with every job at the job price, filled on 97.6% of 639 measured jobs. The company profile — industry, size, headquarters, specialties, recent posts — is a separate optional charge, once per company per run.
Per-country rates, not one average
Fill rates differ sharply by country in the 639-job sample: the job poster ranges from 5.0% in Brazil to 21.3% in Peru, and workplace type from 55.0% in Brazil to 71.3% in Peru and Costa Rica. Those ranges are published because a regional average would mislead anyone working one market.
Use cases
- Find remote or hybrid tech jobs across Latin America filtered by stack, English level and seniority.
- Map which companies are growing engineering teams in a country, with their domain and LinkedIn profile.
- Measure tech-stack demand by country from the stack extracted from each description.
- Build a hiring-company list with headquarters, size and recent post activity.
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.
| Field | Default | What it does |
|---|---|---|
outputTypeenum | jobs | What to scrape`jobs` for one row per posting, or `companies` for one row per company hiring for your search. |
keywordsstring[] | ["software engineer"] | KeywordsTitles or skills, like the LinkedIn search box. Each keyword is a separate search in every country. Up to 10. |
countriesstring[] | ["BR","MX","AR","CO","CL"] | CountriesLatin American countries, or the whole region. The row budget is shared in turns between every keyword and country. |
postedWithinenum | month | Posted within`any`, `day`, `week` or `month`. Applied by LinkedIn itself. |
workplaceTypesstring[] | [] | Workplace typeRemote, hybrid or on-site, read from each posting because LinkedIn ignores the filter for visitors. |
experienceLevelsstring[] | [] | Experience levelApplied by the Actor from each job page. |
employmentTypesstring[] | [] | Employment typeApplied by the Actor from each job page. |
techOnlyboolean | true | Tech jobs onlySkip postings that are not software, data, cloud, QA, security, product or IT roles. |
requireKeywordMatchboolean | true | Only jobs that mention your keywordDrops the unrelated jobs LinkedIn pads thin searches with. |
includeCompanyDetailsboolean | true | Company profileThe company's public LinkedIn profile, charged once per company per run. Website and domain are included without it. |
inferEmailPatternboolean | false | Email patternpersonal dataDNS-only email format with MX check and provider, plus the poster's likely email when known. Charged only when backed by published emails. |
includePersonalEmailsboolean | false | Include personal emailspersonal dataPersonal-provider addresses are withheld and only counted unless this is on. |
maxItemsinteger | 100 | Max itemsRows to deliver, jobs or companies. |
maxConcurrencyinteger | 3 | Parallel requestsEach on its own connection at about one request per second, the pace measured to stay clear of rate limits. |
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.
| Field | Filled | Meaning |
|---|---|---|
titlestring | 100% | With job id and URL, company, location, country, posted date and description. |
senioritystring | 100% | With `employmentType`, as LinkedIn labels them. |
industriesstring[] | 99.7% | As listed on the job page. |
stackstring[] | 99.4% | At least one of about 170 technologies extracted from the description. |
applyTypestring | 98.7% | Company site 73.7%, LinkedIn 25.0%. |
domainstring | 97.6% | With `website`. Always shipped, with or without the company profile. |
companyHeadquartersstring | 97% | Of 329 jobs whose company page was read. |
applicantsinteger | 65.9% | As a number; the rest say "Be among the first 25" and are kept as an upper bound. |
workplaceTypestring | 64.5% | Remote, hybrid or on-site; 55.0% in Brazil to 71.3% in Peru and Costa Rica. |
englishLevelstring | 29.6% | English mentioned on 47.6%; a level stated on 29.6%. |
posterNamestring | 10.2% | With `posterHeadline` and `posterProfileUrl`, when LinkedIn shows a poster; withheld for EU, EEA, UK and Swiss jobs. Personal data. |
contactEmailsstring[] | 6.7% | Emails in the description. All corporate in the sample; 0 personal-provider emails. |
salaryMinnumber | 2.7% | With `salaryMax`, `salaryCurrency` and `salaryPeriod`: LinkedIn's published pay range; 0% in Brazil and Argentina, 7.5% in Chile. |
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, or one row per hiring company with `outputType: companies`. Views: Jobs, Outreach, Salary, Hiring companies, Errors.billedRUN_SUMMARYRows delivered and charged, jobs skipped by reason, network summary.never billedERRORSPages that could not be read. 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.
| Event | Price | Notes |
|---|---|---|
apify-actor-startActor start | $0.00001 | Platform minimum, one event per GB of memory. |
jobJob | $0.002 | One LinkedIn job with its full page, tech stack, workplace type, English level, salary when published, job poster when shown, and the company website and domain. $2 per 1,000. |
companyCompany profile | $0.003 | The hiring company's public LinkedIn profile. Charged once per company per run. |
email-patternEmail pattern with evidence | $0.01 | Once per domain per run, only when backed by emails the company published. Inferred patterns are free. |
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.
Fill-rate sample
639 jobs, 8 countries × 4 searches
1 October 2026: Brazil, Mexico, Argentina, Colombia, Chile, Peru, Uruguay, Costa Rica × software engineer, data engineer, frontend developer, devops. About 80 jobs per country.
Company fields
329 jobs with a company page read
Company headquarters, specialties and founded year are rates within those 329 jobs, not within all 639.
Ignored filters
13 of 13 variants identical
Workplace, experience and job-type filters for a signed-out visitor returned exactly the same jobs as no filter.
Platform reliability
0 blocked in 4,039 requests
42 runs on Apify: 60 HTTP 429 (1.5%) and 13 network errors, all retried with no page lost.
Distinct companies per 100 jobs
63–70
Two 100-job runs on Apify on 2 October 2026, which sets the company-profile cost at about $3.90–4.10 per 1,000 jobs.
What it will not do
Stated plainly so you can judge fit before spending anything.
- LinkedIn's robots.txt disallows all paths for unnamed crawlers and its User Agreement prohibits scraping; the Actor reads public job pages regardless, and that is a decision with legal risk for the operator.
- One LinkedIn search reaches at most 1,000 jobs.
- Salary is rare: 2.7% of 639 jobs carry a LinkedIn pay range and 3.0% mention a salary in the text.
- Workplace type is stated on 64.5% of jobs; with a workplace filter set, jobs that do not state it are skipped.
- The job poster is shown on 10.2% of jobs, between 5.0% and 21.3% by country.
- Across 42 runs and 4,039 requests, 1.5% were rate-limited with HTTP 429 and retried; none were blocked.
Privacy
- Job posters are delivered as LinkedIn shows them publicly — name, headline and profile on 10.2% of 639 jobs — except for jobs located in the EU, EEA, UK or Switzerland, where they are always withheld.
- Corporate emails published in postings are included; addresses at personal providers are withheld and masked in the text unless `includePersonalEmails` is on.
- Names and photos of a company's employees on its LinkedIn page are never read.
- The email pattern is DNS-only: no email is sent and no mailbox is probed.
- Removal requests: privacy@actorstack.dev
See also the data removal process.