# Companies Hiring in LATAM: Greenhouse, Lever, Ashby + CNPJ (`latsouth/latam-expansion-signals`) Actor

Foreign companies opening roles in Brazil, Mexico, Colombia, Chile, Argentina and all of LATAM, live from 10 public ATS feeds (Greenhouse, Lever, Ashby, Workable...). By country, function and seniority, with the local CNPJ / registry entity.

- **URL**: https://apify.com/latsouth/latam-expansion-signals.md
- **Developed by:** [LatSouth Data](https://apify.com/latsouth) (community)
- **Categories:** Lead generation, Jobs
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 company expansion signals

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## LATAM Expansion Signals: foreign companies hiring in Latin America

**By [LatSouth](https://latsouth.com).** Find the foreign companies that are **opening roles in Brazil, Mexico,
Colombia, Chile, Argentina, Peru and the rest of Latin America right now**, read live from the public job feeds of 10
applicant-tracking systems. A US SaaS company posting an *Account Executive, São Paulo* or a *Country Manager Mexico* is
entering the market: it is about to buy payroll, EOR, legal, office space, local data, tools and services. This actor
turns those postings into **one row per company**, with roles by country and function, seniority, sample postings,
the company's HQ country and, when its domain matches, **the local legal entity in the official registry** (e.g. the
Brazilian CNPJ of the subsidiary).

Generic ATS scrapers give you every posting of a board you already know. This actor starts from the region: it
**filters to Latin American locations, drops companies headquartered in Latin America and staffing firms, classifies
the function** (go-to-market vs engineering hub) and **joins the local registry**.

| | |
|---|---|
| ATS feeds | Greenhouse, Lever, Ashby, Workable, Recruitee, Personio, Teamtailor, SmartRecruiters, BambooHR, Breezy (public, no login) |
| Boards | 2,078 bundled boards (companies seen hiring in LATAM + large global employers) + any board or domain you add |
| Countries | BR, MX, CO, AR, CL, PE, UY, EC, CR, PA, GT, DO, BO, PY, VE, SV, HN, NI + region-wide remote ("LATAM") |
| Registry join | Brazil (CNPJ), Mexico (DENUE), Colombia (RUES) by the company's own domain |
| Price | **US$0.02 per company** (`company-signal`) · **US$0.003 per posting** (`posting-result`) |
| Full sweep (measured 2026-11-04) | 2,078 boards in 14 min: 168,594 postings read, 18,957 in Latin America, **1,284 foreign companies** hiring there (632 with go-to-market roles) |

### Use cases

- **Sell into companies entering LATAM**: EOR / payroll / HR tech, legal and accounting, coworking, recruiting, local
  data and lead lists, logistics, payments. `signal_type = market_leadership` (country manager, GM, head of LATAM) is
  the earliest and strongest sign; `gtm_team` = they are building a sales team.
- **Scheduled alerts**: run daily or weekly with `only_new_since: last_run` and get only the companies and postings
  that appeared since the previous run.
- **Watch a list of accounts**: put your target accounts in `extra_domains` / `extra_boards`, turn off the bundled list,
  and get told the day they open a role in Brazil or Mexico.
- **Nearshore talent hubs**: `signal_type = talent_hub` lists foreign companies hiring engineers / ops in the region
  without a go-to-market team (relevant for EOR, office, relocation, dev-tools vendors).

### Input examples

**Foreign companies hiring go-to-market roles in Brazil or Mexico**

```json
{ "mode": "companies", "countries": ["BR", "MX"], "functions": ["go-to-market"], "max_results": 200 }
```

**Weekly alert: new LATAM sales leadership roles since the last run**

```json
{ "mode": "postings", "functions": ["executive", "sales"], "only_new_since": "last_run", "state_key": "weekly-gtm",
  "max_results": 500 }
```

**Watch your own accounts only**

```json
{ "mode": "companies", "use_bundled_boards": false,
  "extra_domains": ["stripe.com", "deel.com"], "extra_boards": ["https://jobs.lever.co/acme"] }
```

### Output

`companies` mode, one row per company (abridged):

```json
{
  "company_name": "Acme", "domain": "acme.com", "hq_country": "US", "hq_basis": "curated",
  "signal_type": "market_leadership", "matching_roles": 4, "gtm_roles": 3, "latam_open_roles": 4,
  "total_open_roles": 120, "latam_share": 0.03,
  "countries": ["BR", "MX"], "roles_by_country": {"BR": 3, "MX": 1},
  "roles_by_function": {"sales": 2, "executive": 1, "engineering": 1}, "seniority_mix": {"senior": 2, "executive": 1, "unspecified": 1},
  "first_posted_at": "2026-09-30", "most_recent_posted_at": "2026-11-02",
  "sample_postings": [{"title": "Country Manager Mexico", "countries": ["MX"], "location": "Mexico City",
                       "function": "executive", "seniority": "executive", "published_at": "2026-11-02",
                       "url": "https://job-boards.greenhouse.io/acme/jobs/123"}],
  "boards": [{"ats": "greenhouse", "slug": "acme", "url": "https://job-boards.greenhouse.io/acme", "open_roles": 120}],
  "new_company": null, "new_postings": null,
  "registry_match_status": "matched", "has_local_entity_in_hiring_country": true,
  "local_entities": [{"country": "BR", "tax_id_formatted": "11.222.333/0001-81", "legal_name": "ACME BRASIL TECNOLOGIA LTDA",
                      "city": "SAO PAULO", "registration_date": "2021-03-01", "match_method": "domain_site",
                      "match_confidence": 0.97, "source": "Receita Federal do Brasil - Dados Abertos CNPJ"}]
}
```

`postings` mode: one row per LATAM posting with `company_name`, `domain`, `hq_country`, `ats`, `title`, `function`,
`seniority`, `countries`, `location`, `workplace_type`, `department`, `published_at`, `url`, `is_new`,
`registry_match_status` and the `local_entity` in the posting's country when matched.

The run summary (key-value store record `OUTPUT`) lists boards listed / fetched / **unreachable** (never counted as "no
jobs"), LATAM postings by country and function, companies excluded (LATAM HQ, staffing), registry match counts,
timings and HTTP bytes.

#### Field notes

- `countries`: from the ATS's structured country field when it has one, else from the location text (EN/ES/PT
  country and city names; ambiguous cities such as Santiago, Guadalajara or Córdoba only without a foreign marker;
  "New Mexico", "Mexico, NY", "Denver, CO" are not Latin America), else from the title ("Account Executive, Brazil").
  `LATAM` = region-wide role. Worldwide listings that name 5+ other countries are skipped.
- `function`: sales, marketing, customer_success, partnerships, executive (country leadership), engineering, data,
  product, design, operations, support, finance, legal, people, other; rules on the title (EN/ES/PT) with the ATS
  department as tiebreak. `go-to-market` = the first five.
- `hq_country` / `hq_basis`: `curated` (our list), `wikidata_P159`, `domain_tld` (.com.br, .mx...), or
  `postings_majority` = **a guess** from where most of the company's postings are. Null when unknown.
- `signal_type`: `market_leadership` (country manager / GM / head of LATAM) > `gtm_team` (2+ go-to-market roles) >
  `gtm_role` > `talent_hub` (no go-to-market role). Rows are sorted in that order.

#### How the registry match works

The company's domain (from our curated list, or a site linked by its own careers feed whose name matches the board)
is looked up in the registries that publish websites / e-mail domains: Brazil (Receita Federal CNPJ), Mexico (INEGI
DENUE), Colombia (RUES). A domain used by several registry companies is resolved only when exactly one has it as its
own verified website or one name clearly agrees; otherwise `ambiguous`, never a guess. **Names alone never match**
(a foreign brand's name collides with unrelated local companies). A matched Brazilian branch is replaced by its head
office (same CNPJ root), the branch kept in `matched_establishment`. Each entity carries `match_method` and
`match_confidence`; below 0.6 it is `low_confidence`.

Measured on the full sweep (2026-11-04): of 754 companies with a known domain hiring in Brazil, Mexico or Colombia, **104 (13.8%) have a matched local entity** (110 of all 1,284 rows; 140 entities: BR 70, MX 40, CO 27), plus 49 `low_confidence` and 38 `ambiguous`. A hand check of 30 random matches found **30 consistent** (the brand's own local subsidiary, e.g. QUALTRICS BRASIL LTDA., CABIFY MEXICO, VALTECH COLOMBIA S.A.S.).

### Pricing

Pay per event: **US$0.02 per company row** (`company-signal`) and **US$0.003 per posting row** (`posting-result`),
plus Apify's tiny start event. Reading boards is free: you pay only for rows delivered, and the run stops at your
spending limit. `max_results` also stops the scan early (boards are read in order of past LATAM hiring), so a 20-row
test run reads only a few dozen boards.

**Never charged for a broken run.** `OUTPUT.ats` counts boards per ATS (ok, absent, errors, postings). If the feeds
could not be read (an ATS whose boards all errored, or all answered an empty feed, i.e. blocked or changed format) and
the run has no row, it **fails** naming the ATS and nothing is charged; a scan that simply finds nothing new succeeds
with 0 rows. When rows were found despite a broken ATS, the status message carries a warning.

### Limitations

- Coverage = the bundled boards + what you add. Companies on Workday, SAP SuccessFactors, iCIMS, Taleo or LinkedIn-only
  postings are not covered (no keyless per-company feed).
- Location text is free text typed by employers: the parser favours precision, so a few LATAM postings with unusual
  location strings are missed.
- HQ is unknown for some companies (`hq_country: null`); they are kept. `postings_majority` is a guess.
- The registry join covers Brazil, Mexico and Colombia (the registries that publish domains). A foreign company often
  hires through an Employer of Record before it opens a local entity: no match is itself information.
- A board that does not answer after retries is reported in `OUTPUT.board_errors_sample` and is never read as "no jobs".

### Privacy

Company data only. The actor reads job titles, locations, departments, dates and posting URLs from public employer
feeds; it never reads descriptions, recruiter names, application mailboxes or candidate data, and titles/locations
are scrubbed of e-mail addresses and phone numbers. Registry fields are company records (legal name, tax id, city,
activity), never contact data.

### Sources and attribution

Postings link to the employer's own ATS page (`url`). Matched local entities carry `source` / `source_license`
(Receita Federal CNPJ open data; INEGI DENUE; Confecámaras RUES, CC BY-SA 4.0).

### Related

- [LATAM Jobs & Hiring Signals](https://apify.com/latsouth/latam-jobs-hiring-signals): local job boards (Gupy,
  Computrabajo) joined to the registry.
- LatSouth country company finders (Brazil, Mexico, Colombia, Chile, Argentina, Peru...) for the full registries.

### Português

**Quais empresas estrangeiras estão abrindo vagas no Brasil, México, Colômbia e no resto da América Latina**, lidas ao
vivo dos feeds públicos de 10 ATS (Greenhouse, Lever, Ashby, Workable, Recruitee, Personio, Teamtailor, SmartRecruiters,
BambooHR, Breezy). Uma linha por empresa: vagas por país e função, senioridade, exemplos de vagas, país-sede e, quando o
domínio bate, **o CNPJ da subsidiária brasileira** (ou o registro no México/Colômbia) com método e confiança do match.
Exclui por padrão empresas com sede na LATAM e recrutadoras. `only_new_since: last_run` devolve só o que é novo desde o
último run (ideal para agendar). Preço: US$0,02 por empresa, US$0,003 por vaga. Só dados de empresa: nenhum dado de
recrutador ou candidato é lido.

### Español

**Qué empresas extranjeras están abriendo vacantes en México, Colombia, Chile, Argentina, Perú y el resto de América
Latina**, leídas en vivo de los feeds públicos de 10 ATS. Una fila por empresa: vacantes por país y función, seniority,
ejemplos, país de la sede y, cuando el dominio coincide, la entidad local en el registro oficial (DENUE en México, RUES
en Colombia, CNPJ en Brasil). Excluye por defecto empresas con sede en LATAM y agencias de reclutamiento.
`only_new_since: last_run` devuelve solo lo nuevo desde la última ejecución. Precio: US$0,02 por empresa, US$0,003 por
vacante. Solo datos de empresas.

# Actor input Schema

## `mode` (type: `string`):

`companies`: one row per foreign company hiring in Latin America (open roles by country and function, sample postings, HQ country, local registry entity). `postings`: one row per LATAM posting.

## `countries` (type: `array`):

Empty = all of Latin America. Add `LATAM` to include region-wide roles (e.g. 'Account Executive, Remote - LATAM').

## `functions` (type: `array`):

Empty = all functions. `go-to-market` = companies selling into the region; engineering-only hiring = a nearshore talent hub.

## `only_new_since` (type: `string`):

`last_run` (postings never returned before under the same state key: schedule the actor and get only what is new), an ISO date (`2026-10-01`, by posting date) or `30 days`. Empty = everything open now.

## `state_key` (type: `string`):

Name of the memory used by `only_new_since: last_run`. Use one key per saved search/schedule.

## `exclude_latam_hq` (type: `boolean`):

The signal is FOREIGN companies entering the region. HQ comes from a curated list, Wikidata, the domain's LATAM ccTLD or (labelled as a guess) where most of the company's postings are.

## `exclude_staffing` (type: `boolean`):

Their postings are other companies' jobs or offshore seats, not a market-entry signal. Also drops offshore talent pools: unknown HQ and hiring in 8+ LATAM countries (or 80%+ of all roles in 5+ LATAM countries).

## `ats` (type: `array`):

Empty = all 10.

## `extra_boards` (type: `array`):

Board URLs or `ats:slug`, e.g. `https://jobs.lever.co/acme`, `greenhouse:stripe`, `acme.recruitee.com`. Scanned first.

## `extra_domains` (type: `array`):

e.g. `acme.com`: the actor tries the domain's name as a board on every ATS (10 lookups per domain).

## `use_bundled_boards` (type: `boolean`):

Boards that had at least one Latin American posting in our probes plus large global employers. Turn off to watch only your own boards/domains.

## `include_registry` (type: `boolean`):

Local entity (Brazilian CNPJ, Mexican DENUE, Colombian RUES record) whose registered website or e-mail domain is the company's domain, with match method and confidence.

## `max_results` (type: `integer`):

Companies (companies mode) or postings (postings mode). You pay per row. The scan stops once this many are found (boards are read in order of past LATAM hiring); set it high for a full sweep.

## `max_boards` (type: `integer`):

Cap on boards read (your extra boards always count). Empty = the whole list.

## Actor input object example

```json
{
  "mode": "companies",
  "state_key": "default",
  "exclude_latam_hq": true,
  "exclude_staffing": true,
  "use_bundled_boards": true,
  "include_registry": true,
  "max_results": 25
}
```

# Actor output Schema

## `rows` (type: `string`):

Download as JSON, CSV, Excel or XML via the dataset API.

## `summary` (type: `string`):

Boards listed / fetched / unreachable, LATAM postings by country and function, companies excluded (LATAM HQ, staffing), registry match counts, timings, HTTP requests and bytes.

# 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 = {
    "max_results": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("latsouth/latam-expansion-signals").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 = { "max_results": 25 }

# Run the Actor and wait for it to finish
run = client.actor("latsouth/latam-expansion-signals").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 '{
  "max_results": 25
}' |
apify call latsouth/latam-expansion-signals --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,latsouth/latam-expansion-signals"
        }
    }
}
```

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/la1abgviNvbWlTeNW/builds/VOkZyASkQVPQCMMjm/openapi.json
