# Get on Board Jobs Scraper | LATAM Tech Jobs & Salary (`data_daemon/getonbrd-jobs-scraper`) Actor

Get on Board (getonbrd.com) LATAM tech jobs as JSON, CSV or Excel: full descriptions, company profiles, skills, seniority, remote modality, country eligibility and monthly USD salary. Category and keyword filters, persistent only-new feeds. $0.80/1,000 jobs + $0.001/start.

- **URL**: https://apify.com/data_daemon/getonbrd-jobs-scraper.md
- **Developed by:** [Daemon Data](https://apify.com/data_daemon) (community)
- **Categories:** Jobs
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.56 / 1,000 job with full descriptions

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

**Get on Board Jobs Scraper** returns public tech jobs from [Get on Board](https://www.getonbrd.com/) (getonbrd.com) as **JSON, CSV or Excel** for LATAM recruiters, job aggregators and salary-data pipelines. Each job includes its full description, employer profile, skills, seniority, remote modality, eligible countries, cities and **salary in USD per month** where disclosed. Price: **$0.80 per 1,000 delivered jobs + $0.001 per start**, with descriptions and company data included. On 6 November 2026 the public API exposed **18 job categories**, including programming, data science, design, cybersecurity and sales. No Get on Board account or proxy is needed.

### Who uses Get on Board job data, and what for?

| You are | What this Actor gives you |
|---|---|
| LATAM recruiters and staffing teams | Hiring companies and open roles filtered by country eligibility, remote modality, seniority and disclosed salary. |
| Job aggregators and career platforms | Structured job descriptions, skills, locations and stable source IDs for importing into your application. |
| Salary and labour-market analysts | Disclosed monthly USD salary bands alongside role, seniority and country. Missing salaries stay null. |
| Job-alert and workflow builders | A persistent only-new feed that skips previously delivered IDs without another job charge. |
| AI agents | A bounded jobs API through Apify MCP, with country eligibility preserved instead of assuming every remote role is worldwide. |

### How do I scrape Get on Board jobs?

1. Click **Try for free** and choose categories, or leave them empty to cover all categories.
2. Optionally add keywords and filters for remote modality, seniority, countries, monthly salary or posting age.
3. Click **Start**. Empty input `{}` returns up to **50 jobs across categories**, with descriptions and company data.
4. Download the dataset as JSON, HTML, CSV or Excel, or read it through the API. The **Run summary** tab explains filtered jobs, skipped duplicates and any early stop.

```json
{
  "categories": ["programming"],
  "remoteOnly": true,
  "minSalaryUsd": 1000,
  "maxItems": 20
}
```

Keywords are applied locally to the **title, tags and complete description**, case and accent insensitive. Multiple keywords are ORed. For example, `"keywords": ["python", "ingeniero de datos"]` keeps jobs containing either phrase. Filters across different fields are combined with AND. Narrow filters can legitimately return no jobs.

### How do I get only new LATAM jobs on later runs?

Enable `onlyNew` and reuse the same `stateName` and filters:

```json
{
  "categories": ["programming", "data-science-analytics"],
  "remoteOnly": true,
  "onlyNew": true,
  "stateName": "latam-remote-tech",
  "maxItems": 500
}
```

The Actor stores **successfully delivered IDs** in the persistent named key-value store `getonbrd-jobs-state` in your Apify account. The first run delivers matching unseen jobs; later runs skip those IDs without a job charge. Filtered jobs and rows left behind by `maxItems`, the budget or deadline are not marked as delivered. A later run can therefore return older unseen backlog; “only new” means **not delivered before**, rather than necessarily published after the previous run.

Memory combines the name with normalized categories and filters. Changing a filter creates a separate feed; changing `maxItems` keeps the feed's memory. Use another `stateName` to start a separate feed. IDs have no automatic expiry. **Avoid concurrent runs for the same feed**, and also deduplicate by `id` in your destination: dataset writes and memory writes are separate operations, so an interruption between them can cause a retry. If memory cannot be read or saved, the run fails rather than silently continuing without duplicate protection. A zero-row repeat still incurs the start fee.

### What input filters can I use?

Every field is optional. `{}` covers all public categories with `maxItems: 50` and `onlyNew: false`.

| Input | Meaning |
|---|---|
| `categories` | Source category slugs; empty = all. See the Input tab for all 18 values. Examples: `programming`, `data-science-analytics`, `machine-learning-ai`, `design-ux`, `sysadmin-devops-qa`, `mobile-developer`, `cybersecurity`. |
| `keywords` | ORed substring phrases matched locally on title, tags and description. Empty = any keyword. |
| `remoteModalities` | Exact source values: `fully_remote`, `remote_local`, `hybrid`, `no_remote`. Empty = any. |
| `remoteOnly` | Keep jobs with the source's `remote: true` flag; fully remote or country-restricted remote. Hybrid is excluded. |
| `seniorities` | Source name or code, such as `Junior`, `Semi Senior`, `Senior`, `junior`, `semi_senior`, `senior`. Exact case/accent-insensitive match. |
| `countries` | Match source eligible countries, by name or common ISO code: e.g. `Chile`/`CL`, `Mexico`/`MX`, `Colombia`/`CO`, `Peru`/`PE`, `Argentina`/`AR`, `Brazil`/`BR`. Remote does not imply worldwide eligibility. |
| `minSalaryUsd` | Minimum disclosed **lower bound**, in USD/month. A 2,000–3,000 band fails a 2,500 minimum. Missing salaries are excluded when active. Default 0 = any. |
| `withSalaryOnly` | Require a positive disclosed minimum monthly salary. Default false. |
| `postedWithinDays` | Rolling UTC publication window. 0 = any age; unknown dates are excluded when active. |
| `maxItems` | Delivered-row cap after filters and deduplication, 1–10,000; default 50. |
| `onlyNew`, `stateName` | Persistent delivered-ID memory; default false / `default`. |
| `skipIds` | Explicit source IDs to exclude without a job charge. |

The Actor enumerates category pages and deduplicates IDs across categories. Requests are sequential at **at most one per second**, with exponential backoff and `Retry-After` handling for transient failures. It honors source pagination (up to 120 rows per page), detects repeated pages and stops before the run timeout. Partial runs report the stop reason. Whole-board mode is bounded by `maxItems`, budget, available source pages and run time; it is not a completeness guarantee.

Categories are visited in rounds and the first-page cap is shared across them. **Results preserve source order within each category; they are not globally sorted by publication date.** Salary, keyword and date filters are local, so filtering may require reading many source pages even when few jobs match.

### What fields does each Get on Board job contain?

| Output | Contents |
|---|---|
| `id`, `url`, `title` | Stable source slug, public job URL and original title. |
| `company` | Public ID, name, Get on Board profile URL, website, logo, description and company country where provided. |
| `category`, `categoryId`, `tags` | Source category name, route slug and expanded skill tags. |
| `seniority`, `seniorityCode`, `employmentType` | Source seniority label/code and employment type. |
| `modality`, `remote`, `remoteZone` | Exact remote modality, source remote flag and source zone if present. |
| `countries`, `cities` | Eligible countries and city objects with name/country, as supplied. |
| `salary` | `min`, `max`, `currency: "USD"`, `period: "month"`. Undisclosed bounds are null. These are the API's USD equivalents, not original local-currency amounts from employer prose. |
| `description`, `descriptionHtml` | Complete text and HTML, combining role context, responsibilities, requirements, desirable skills and benefits with section headings. |
| `publishedAt`, `scrapedAt` | Source publication timestamp and collection timestamp, UTC ISO 8601. |
| `applicationCount`, `source` | Public application count when present; `getonbrd.com`. |

Illustrative output, shortened for readability:

```json
{
  "id": "example-developer-acme-santiago",
  "url": "https://www.getonbrd.com/jobs/example-developer-acme-santiago",
  "title": "Software Developer",
  "company": {"id": "acme", "name": "Acme", "url": "https://www.getonbrd.com/companies/acme", "website": null, "logo": null, "description": null, "country": "CL"},
  "category": "Programming",
  "categoryId": "programming",
  "tags": ["Python"],
  "seniority": "Senior",
  "modality": "remote_local",
  "remote": true,
  "countries": ["Chile"],
  "cities": [],
  "salary": {"min": 2000, "max": 3000, "currency": "USD", "period": "month"},
  "description": "Requirements\nPython experience",
  "descriptionHtml": "<h2>Requirements</h2><p>Python experience</p>",
  "publishedAt": "2026-11-05T12:00:00.000Z",
  "scrapedAt": "2026-11-06T03:00:00.000Z"
}
```

### How much does it cost to scrape Get on Board?

**$0.0008 per delivered job with description and company included + $0.001 per start** at Free/Starter rates. Fifty jobs cost **$0.041**; 1,000 jobs cost **$0.801**. Filtered records, within-run duplicates, `skipIds` and IDs already delivered in the same only-new feed have **no job charge**. There is no separate detail fee or required paid proxy.

| Apify plan band | Per job | Per start |
|---|---:|---:|
| Free / Starter (FREE / BRONZE) | $0.0008 | $0.001 |
| Scale (SILVER) | $0.00068 | $0.00085 |
| Business and above (GOLD / PLATINUM / DIAMOND) | $0.00056 | $0.0007 |

Set `maxItems` and Apify's maximum cost per run to bound your bill. Start pricing is per GB of memory with a minimum of one event; the default 256 MB run uses one start event. Empty results still incur that start event.

### Can I call it as an API or from an AI assistant?

```bash
curl -X POST 'https://api.apify.com/v2/acts/data_daemon~getonbrd-jobs-scraper/run-sync-get-dataset-items?clean=1' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"categories":["programming"],"remoteOnly":true,"minSalaryUsd":1000,"maxItems":20}'
```

For larger runs use the asynchronous `/runs` endpoint, then read the run's dataset. The synchronous route waits up to 300 seconds. Add `https://mcp.apify.com/?tools=data_daemon/getonbrd-jobs-scraper` to an MCP-capable assistant. [Python and Node examples](https://github.com/datadmon/apify-data-actors-examples) use an environment variable for your Apify token.

### Frequently asked questions

#### Is salary monthly USD or yearly pay?

The public API's numeric bands are **USD per month**. The Actor preserves those figures without annualizing them. Employer prose may also mention local-currency compensation; it remains in the description and is not substituted into the salary object. Undisclosed salary stays null.

#### Does remote mean I can apply from any country?

No. `remote_local` restricts remote work geographically. Even for fully remote listings, use the source's `countries` field and the original job page to check eligibility. Country filtering never substitutes the employer's headquarters country.

#### ¿Puedo exportar empleos remotos de Get on Board con sueldo?

Sí. Usa `remoteOnly: true`, `countries: ["CL"]` (o tu país) y `minSalaryUsd`. Exporta empleos de tecnología en JSON, CSV o Excel, con descripción, empresa, seniority y sueldo en **USD mensuales**. `onlyNew: true` y el mismo `stateName` omiten empleos ya entregados sin volver a cobrar por ellos.

#### Posso extrair vagas remotas do Get on Board para o Brasil?

Sim. Use `countries: ["BR"]` e `remoteOnly: true`. O filtro respeita os países elegíveis informados pela vaga; remoto não significa aceitação de candidatos do mundo inteiro. A remuneração estruturada é em **USD por mês**. O modo `onlyNew` evita cobrar novamente por vagas já entregues no mesmo feed.

#### Why did a repeat run return more jobs, or no jobs?

The first run may have hit its cap, leaving unseen older jobs for a later run. Once the matching source inventory is exhausted, later runs return zero until new IDs appear. A refreshed existing ID is still considered delivered. See **Run summary** for skipped counts and stop reasons.

#### Is this an official Get on Board integration?

This is an independent Actor using public pages and public JSON, with no login or private candidate data. Get on Board publishes its own API; this Actor adds Apify exports, filters, billing and persistent delivered-ID memory. Follow applicable law and source usage conditions for your intended use. Source availability and fields can change.

#### How do I report a problem?

Open the [Issues tab](https://apify.com/data_daemon/getonbrd-jobs-scraper/issues) with your input and run ID, without credentials. Custom extraction and integration requests can be discussed there.

### Related Actors for job-data pipelines

- [Gupy Jobs Scraper](https://apify.com/data_daemon/gupy-jobs-scraper) — Brazil jobs, full descriptions and only-new feeds.
- [Welcome to the Jungle Jobs Scraper](https://apify.com/data_daemon/welcome-to-the-jungle-jobs-scraper) — France-focused public tech and startup jobs.
- [Career Site Jobs Scraper](https://apify.com/data_daemon/career-site-jobs-scraper) — employer careers pages across major ATS platforms.
- [OnlineJobs.ph Scraper](https://apify.com/data_daemon/onlinejobs-ph-scraper) — Philippine remote and virtual-assistant jobs with wage parsing.
- [Hirist Jobs Scraper](https://apify.com/data_daemon/hirist-jobs-scraper) — India tech jobs and skills.

See all [Daemon Data Actors](https://apify.com/data_daemon).

# Actor input Schema

## `categories` (type: `array`):

Empty = enumerate all 18 public categories. Category slugs from Get on Board.

## `keywords` (type: `array`):

Client-side, case/accent-insensitive substring match. OR between keywords; empty = any. No source search endpoint is used.

## `remoteModalities` (type: `array`):

Exact source labels. fully_remote = fully remote; remote_local = remote restricted to countries; hybrid; no_remote.

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

Keep source remote=true jobs (fully_remote and remote_local). Hybrid jobs are excluded.

## `seniorities` (type: `array`):

Match source name or code, e.g. Junior, Semi Senior, Senior, Expert, junior, semi_senior, senior. Case/accent insensitive.

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

Country names or common ISO codes (CL, MX, CO, PE, AR, BR, US, etc.). Match source eligibility, never infer worldwide eligibility from a remote flag.

## `minSalaryUsd` (type: `integer`):

Keep jobs whose disclosed minimum monthly USD salary is at least this amount. 0 = any.

## `withSalaryOnly` (type: `boolean`):

Exclude jobs without a positive disclosed minimum monthly USD salary.

## `postedWithinDays` (type: `integer`):

Client-side UTC rolling window; unknown dates are excluded when active. 0 = any age.

## `maxItems` (type: `integer`):

Global delivered-row cap after filtering and deduplication. A later only-new run may deliver older unseen backlog left by this cap.

## `onlyNew` (type: `boolean`):

Persistent delivered-ID memory in named getonbrd-jobs-state KV store. Same stateName + normalized filters share memory; skipped repeats have no job charge. Avoid overlapping runs for one feed.

## `stateName` (type: `string`):

Name of your only-new feed, e.g. latam-remote-tech. Combined with normalized filters; cap changes retain memory. Ignored unless onlyNew is enabled.

## `skipIds` (type: `array`):

Explicit exclusions; skipped IDs are neither delivered nor charged.

## Actor input object example

```json
{
  "categories": [],
  "keywords": [],
  "remoteModalities": [],
  "remoteOnly": false,
  "seniorities": [],
  "countries": [],
  "minSalaryUsd": 0,
  "withSalaryOnly": false,
  "postedWithinDays": 0,
  "maxItems": 50,
  "onlyNew": false,
  "stateName": "default",
  "skipIds": []
}
```

# Actor output Schema

## `dataset` (type: `string`):

Get on Board jobs with descriptions and monthly USD salary.

## `runSummary` (type: `string`):

Saved, filtered, previously delivered, requests, charged jobs and stop reason.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("data_daemon/getonbrd-jobs-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("data_daemon/getonbrd-jobs-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 '{}' |
apify call data_daemon/getonbrd-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,data_daemon/getonbrd-jobs-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/S9jm2Eykh93efOMpg/builds/I41kvTsvp13gacrhz/openapi.json
