# Kalibrr Jobs Scraper (`crawlerbros/kalibrr-scraper`) Actor

Scrape live job listings from Kalibrr.com, Southeast Asia's leading job board (Philippines, Indonesia, Vietnam). Search by keyword, industry, seniority level, and tenure, filter by location/salary, or fetch full job details from listing URLs. No login, no cookies, no paid proxy required.

- **URL**: https://apify.com/crawlerbros/kalibrr-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Kalibrr Jobs Scraper

Scrape live job listings from [Kalibrr.com](https://www.kalibrr.com), Southeast Asia's leading job board covering the **Philippines, Indonesia, and Vietnam**. Search by keyword, industry, seniority level, and tenure, filter by location and salary, or fetch full job details from listing URLs. No login, no cookies, no paid proxy required.

### What this actor does

- **Two modes:** `search` (keyword + filters) and `byUrls` (direct listing fetch)
- **20 industries/functions** — IT and Software, Sales and Marketing, Health and Medical, and more
- **5 seniority levels** — Internship/OJT through Director/Executive
- **4 employment types** — full-time, part-time, contractual, freelance
- **Filters:** keyword, industry, seniority, tenure, location, hybrid-only, fresh-grads-only, company, minimum salary
- **Rich fields per job:** full description and qualifications (HTML + plain text), salary band (only when the employer/Kalibrr marks it publicly visible), company info
- **Empty fields are omitted** — every record only contains data actually present on the listing

### Output per job

- `jobId` — Kalibrr's internal listing ID
- `title`, `function`, `tenure`, `seniorityLevel`, `workExperienceCode`, `monthsWorkExperience`
- `educationLevelCode`, `educationLevelMinCode`, `educationLevelMaxCode`
- `location`, `region`, `country`
- `isHybrid`, `isWorkFromHome`, `isOpenToFreshGrads`
- `numberOfOpenings`
- `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryInterval` (only when publicly disclosed)
- `descriptionHtml`, `descriptionText`, `qualificationsHtml`, `qualificationsText`
- `datePosted`, `applicationEndDate`, `jobCreatedAt`, `jobUpdatedAt`
- `isFeatured`, `perks[]`, `perksDescriptionHtml`, `bannerImageUrls[]`
- `companyName`, `companyCode`, `companyIndustry`, `companyUrl`, `companyLogoUrl`, `companyVerified`, `companyResponseRatePct`
- `externalApplyUrl` (only when the employer routes applications off-platform, e.g. Ashby/Greenhouse)
- `sourceUrl` — canonical listing URL
- `recordType: "job"`, `scrapedAt`
- (mode=byUrls / `fetchFullDetails=true` only) `acceptWillingToRelocate`, `sexRequirement`, `minAge`, `maxAge`, `preferredCourses[]`, `requiredSkills[]`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search` / `byUrls` |
| `country` | select | `PH` | `PH` (kalibrr.com) / `ID` (kalibrr.id) / `VN` (kalibrr.vn) — each is a genuinely separate job pool, not a mirror (mode=search) |
| `keywords` | string | `developer` | Free-text search query (mode=search). Leave empty to browse an industry/level. |
| `industry` | select | – | One of 20 Kalibrr industries/functions |
| `workExperienceLevel` | select | – | One of 5 seniority levels. Leave empty to automatically gather more results across all 5 (see FAQ). |
| `tenure` | select | – | `fullTime` / `partTime` / `contractual` / `freelance` |
| `location` | string | – | Free-text location, e.g. `Manila`, `Cebu`, `Jakarta` (matched server-side by Kalibrr, region-aware) |
| `hybridOnly` | boolean | `false` | Only hybrid roles |
| `remoteOnly` | boolean | `false` | Only fully remote (work-from-home) roles |
| `freshGradsOnly` | boolean | `false` | Only roles explicitly open to fresh graduates |
| `companySlug` | string | – | Restrict to one employer's Kalibrr company code |
| `sortBy` | select | `relevance` | `relevance` / `newest` |
| `minSalary` | integer | – | Drop jobs with disclosed salary below this. Undisclosed-salary jobs always pass through. |
| `maxSalary` | integer | – | Drop jobs with disclosed salary above this. Undisclosed-salary jobs always pass through. |
| `fetchFullDetails` | boolean | `false` | Visit each job's detail page for extra fields (age/sex requirements if listed, relocation willingness). The search listing already includes the full description/qualifications, and the detail-page route is less reliable than search (see FAQ), so this defaults off. |
| `jobUrls` | array | – | Kalibrr job listing URLs (mode=byUrls) |
| `maxItems` | integer | `30` | Hard cap on emitted records (1–300) |

#### Example: IT jobs in Manila, newest first

```json
{
  "mode": "search",
  "keywords": "",
  "industry": "it-and-software",
  "location": "Manila",
  "sortBy": "newest",
  "maxItems": 50
}
```

#### Example: fetch specific listings

```json
{
  "mode": "byUrls",
  "jobUrls": [
    "https://www.kalibrr.com/c/monde-nissin-corporation/jobs/270874/channel-development-manager-4"
  ]
}
```

### Use cases

- **Recruitment intelligence** — track live Philippine/Indonesian/Vietnamese vacancies by industry/location
- **Salary benchmarking** — aggregate disclosed salary bands across roles
- **Labour-market research** — analyze demand by industry/seniority over time
- **Talent sourcing** — bulk-collect employer and job data for outreach
- **Job-alert bots** — poll with `sortBy: newest` for fresh listings

### FAQ

**What's Kalibrr?** A leading Southeast Asian job board and recruitment platform spanning the Philippines, Indonesia, and Vietnam, with over 800 active listings across every industry and seniority level. See [kalibrr.com](https://www.kalibrr.com).

**Is a login or API key required?** No — search and job-detail pages are fully public.

**Is `mode=byUrls` reliable?** Yes. Kalibrr's job-detail pages (`/c/{company}/jobs/{id}/{slug}`) sit behind noticeably stricter bot-detection than its search-listing pages. The actor tries, in order: direct request, Apify's free AUTO datacenter proxy, a Google-Translate mirror, and finally Apify's RESIDENTIAL proxy — verified on the cloud to resolve real listings even when every earlier tier 403s. `mode=search` — the default mode — hits only the search-listing route (never needs the residential tier) and already returns each job's full description and qualifications, so most use cases don't need `byUrls` at all; reach for it when you need the extra detail-only fields (age/sex requirements, relocation willingness) or a lookup by URL alone.

**Why does `workExperienceLevel` left empty gather more results than picking one?** Kalibrr's live search page returns at most 15 results for any single filter combination (true "next page" pagination isn't exposed publicly). This actor works around that by automatically fanning out across the 5 seniority-level buckets when you don't pin one — since every job belongs to exactly one bucket, the combined results are real, duplicate-free data covering up to ~75 jobs instead of 15. Pinning a specific `workExperienceLevel` yourself skips the fan-out (single, faster request, capped at 15).

**Why is `salaryMin`/`salaryMax` sometimes missing?** Many employers list a salary internally but choose not to display it publicly; the actor only ever exposes salary figures Kalibrr itself marks as `salaryShown`, never leaking an undisclosed figure.

**Why did a nonsense keyword still return jobs?** Kalibrr's own search silently falls back to its general job listing when a keyword text has no real matches, rather than showing zero results — this is upstream platform behavior, not something this actor can override.

**How does the `location` filter work?** It's passed directly to Kalibrr's own location search, which matches by metro region (e.g. filtering `Manila` also returns Taguig, Pasig, and Makati — all Metro Manila). This is more accurate than a literal city-name match.

**Does this actor cover Indonesia and Vietnam?** Yes — set `country` to `ID` (kalibrr.id) or `VN` (kalibrr.vn) in mode=search. These are genuinely separate job pools with their own listings (kalibrr.id alone lists 1,000+ Indonesia-specific jobs), not mirrors of the Philippines (`PH`/kalibrr.com) default. `jobUrls` in mode=byUrls also work for any of the three domains directly — the actor detects the country from the URL automatically.

**How fresh is the data?** Real-time — every run hits Kalibrr's live search and detail pages directly.

# Actor input Schema

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

What to fetch.

## `country` (type: `string`):

Kalibrr runs a genuinely separate job pool per country domain (confirmed live: kalibrr.id lists ~1,150 Indonesia-specific jobs, distinct from kalibrr.com's Philippines-centric pool). Pick which market's listings to search.

## `keywords` (type: `string`):

Free-text job search query, e.g. `developer`, `accountant`, `sales manager`. Leave empty to browse a whole industry/level.

## `industry` (type: `string`):

Restrict results to a Kalibrr job industry/function.

## `workExperienceLevel` (type: `string`):

Restrict results to one seniority level. Leave empty to fan out across all 5 levels for broader coverage (Kalibrr's search page caps each unique query at 15 results, so pinning one level yields fewer, more targeted results faster; leaving it empty gathers more total records).

## `tenure` (type: `string`):

Restrict results to one employment type.

## `location` (type: `string`):

Only keep jobs whose city contains this (e.g. `Manila`, `Cebu`, `Makati`, `Jakarta`).

## `hybridOnly` (type: `boolean`):

Only keep hybrid (part-remote, part-office) roles.

## `freshGradsOnly` (type: `boolean`):

Only keep roles explicitly open to fresh graduates.

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

Only keep fully remote (work-from-home) roles. Applied client-side against each job's remote flag — Kalibrr has no working server-side fully-remote filter (unlike hybridOnly).

## `companySlug` (type: `string`):

Restrict results to one employer's Kalibrr company code, e.g. `monde-nissin-corporation` (from the company's Kalibrr URL: kalibrr.com/c/{slug}/jobs).

## `sortBy` (type: `string`):

Order of results.

## `minSalary` (type: `integer`):

Drop jobs whose disclosed salary is below this amount. Jobs with an undisclosed salary always pass through (not penalized for missing data).

## `maxSalary` (type: `integer`):

Drop jobs whose disclosed salary is above this amount. Jobs with an undisclosed salary always pass through (not penalized for missing data).

## `fetchFullDetails` (type: `boolean`):

Visit each job's detail page for extra fields (education range, age/sex requirements if listed, months of experience, relocation willingness). The search-result listing already includes the full description and qualifications, so this is optional and roughly doubles run time.

## `jobUrls` (type: `array`):

Kalibrr job listing URLs, e.g. `https://www.kalibrr.com/c/monde-nissin-corporation/jobs/270874/channel-development-manager-4`.

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

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "search",
  "country": "PH",
  "keywords": "developer",
  "industry": "",
  "workExperienceLevel": "",
  "tenure": "",
  "hybridOnly": false,
  "freshGradsOnly": false,
  "remoteOnly": false,
  "sortBy": "relevance",
  "fetchFullDetails": false,
  "jobUrls": [],
  "maxItems": 30
}
```

# Actor output Schema

## `jobs` (type: `string`):

Dataset containing all scraped Kalibrr job listings.

# 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 = {
    "mode": "search",
    "country": "PH",
    "keywords": "developer",
    "industry": "",
    "workExperienceLevel": "",
    "tenure": "",
    "hybridOnly": false,
    "freshGradsOnly": false,
    "remoteOnly": false,
    "sortBy": "relevance",
    "fetchFullDetails": false,
    "jobUrls": [],
    "maxItems": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/kalibrr-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 = {
    "mode": "search",
    "country": "PH",
    "keywords": "developer",
    "industry": "",
    "workExperienceLevel": "",
    "tenure": "",
    "hybridOnly": False,
    "freshGradsOnly": False,
    "remoteOnly": False,
    "sortBy": "relevance",
    "fetchFullDetails": False,
    "jobUrls": [],
    "maxItems": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/kalibrr-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 '{
  "mode": "search",
  "country": "PH",
  "keywords": "developer",
  "industry": "",
  "workExperienceLevel": "",
  "tenure": "",
  "hybridOnly": false,
  "freshGradsOnly": false,
  "remoteOnly": false,
  "sortBy": "relevance",
  "fetchFullDetails": false,
  "jobUrls": [],
  "maxItems": 30
}' |
apify call crawlerbros/kalibrr-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/kalibrr-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/rfLfKaCAu4gFEONwG/builds/rBTvOsORVZQXW5Irf/openapi.json
