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

Get Kalibrr job listings for the Philippines and Indonesia with company, salary where shown, skills and full descriptions. No login.

- **URL**: https://apify.com/pkpakpoom/kalibrr-jobs-scraper.md
- **Developed by:** [Pakpoom](https://apify.com/pkpakpoom) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 jobs

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

## Kalibrr Jobs Scraper

Search Kalibrr, a job board for the Philippines and Indonesia, and get structured job listings: title, company, salary where the employer shows it, skills, benefits, city and the full description as plain text. Plain HTTP, no browser, no login.

### Who it is for

- **Recruiters and HR teams** tracking who is hiring for which roles, and at what pay, in the Philippines and Indonesia.
- **Market and salary researchers** building a dataset of postings by function, city and employment type.
- **Job aggregators and career sites** that want fresh Kalibrr listings in their own database.
- **Analysts and LLM pipelines** that need clean job text and skill lists to classify or summarize.

### What you get

- **Many searches in one run.** One keyword per line: a job title, a skill or a company. An empty keyword returns all jobs of the country.
- **Philippines or Indonesia.** One country per run, and an optional filter on Kalibrr's job function, for example `IT and Software`.
- **Salary, when the employer shows it and Kalibrr does not convert it.** `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryInterval`. See "Salary" below for the cases that come back as `null`.
- **Descriptions as plain text.** The job description and the qualifications, without HTML. Turn them off for a lighter dataset.
- **Duplicates removed.** A job found by several of your searches is returned, and charged, once.
- **Failures don't fail the run.** A search that fails becomes an `error` item (never charged) and the other searches continue.
- **Options for scheduled runs.** `failOnError` and `minResults` end a run as failed when something is wrong, so a scheduled run with alerts cannot fail silently.

### Input

| Field | Default | What it does |
|---|---|---|
| `queries` | `["developer"]` | Search keywords, one per entry (1 to 50). An empty string returns all jobs. |
| `country` | `Philippines` | `Philippines` or `Indonesia`. |
| `jobFunction` | none | Only jobs in this Kalibrr job function, for example `IT and Software`. |
| `maxResults` | `100` | Stop after this many jobs in total, 1 to 1,500. |
| `postedWithinDays` | none | Keep only jobs activated in the last N days (1 to 365). |
| `includeDescription` | `true` | Include `description` and `requirements`. |
| `failOnError` | `false` | End the run as failed if any search ends in an error item. |
| `minResults` | `0` | End the run as failed if fewer jobs than this came back. |

#### Example: software jobs in the Philippines from the last month

```json
{ "queries": [""], "country": "Philippines", "jobFunction": "IT and Software", "maxResults": 300, "postedWithinDays": 30 }
```

### Output

One dataset item per job. This is a real item from our test runs, with the long texts shortened:

```json
{
  "jobId": 257230,
  "url": "https://www.kalibrr.com/c/thinkbit/jobs/257230/bidding-specialist-work-from-home",
  "title": "Bidding Specialist Work From Home",
  "companyName": "ThinkBIT Solutions",
  "companyId": 2860,
  "salaryMin": 30000,
  "salaryMax": 50000,
  "salaryCurrency": "PHP",
  "salaryOriginalCurrency": null,
  "salaryInterval": "month",
  "employmentType": "Full time",
  "jobFunction": "IT and Software",
  "industries": ["Information Technology / IT"],
  "skills": ["Proposal Writing", "Sales and Marketing Knowledge"],
  "benefits": ["wfh", "food", "med_ins", "sick_leave", "flexitime", "paid_holidays", "paid_leave", "trans", "mat_pat_leave"],
  "locations": ["Quezon City"],
  "region": "Metro Manila",
  "country": "Philippines",
  "address": "75, 8th Ave, Socorro",
  "isRemote": true,
  "isHybrid": false,
  "openToFreshGraduates": false,
  "openings": 1,
  "postedAt": "2026-09-15T05:53:03.209Z",
  "expiresAt": "2026-12-29T16:00:00.000Z",
  "description": "We are seeking a highly motivated and detail-oriented Bidding Specialist to join our growing team. ...",
  "requirements": "• Graduate of any four-year course. ...",
  "query": "developer",
  "scrapedAt": "2026-10-18T09:15:49.941Z"
}
```

| Field | Notes |
|---|---|
| `jobId`, `title`, `query`, `scrapedAt` | Never null. |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryInterval`, `salaryOriginalCurrency` | Null in most jobs. See "Salary". |
| `url`, `companyName`, `companyId`, `employmentType`, `jobFunction`, `region`, `country`, `postedAt`, `expiresAt` | Present on every job in our tests; the schema allows null if Kalibrr leaves them out. |
| `address`, `openings`, `isRemote`, `isHybrid`, `openToFreshGraduates` | Can be null when Kalibrr does not provide them. |
| `skills`, `benefits`, `industries`, `locations` | Arrays; empty when none. `benefits` holds Kalibrr's codes such as `med_ins` or `paid_leave`. |
| `description`, `requirements` | Null when `includeDescription` is off or the employer left them empty. |

A failed search or an invalid input produces `{ "type": "error", "input": ..., "message": ... }`. Error items are never charged.

### Salary

Most Kalibrr jobs show no salary, and the Actor does not guess.

- **Shown by the employer.** In our Philippine runs with descriptions on, 14.7% of jobs had `salaryMin` or `salaryMax` in PHP, per month.
- **Hidden.** When the employer hides the salary on the site, the fields are `null`, even if Kalibrr's data contains a number.
- **Converted by Kalibrr.** Kalibrr's search converts some salaries into another currency based on where the request comes from (an Indonesian salary in IDR came back as PHP from Apify's servers). Those converted amounts do not match what the job page shows, and the job pages are not reachable from Apify's servers, so the Actor does not return them: `salaryMin`, `salaryMax` and `salaryCurrency` are `null` and `salaryOriginalCurrency` tells you which currency the employer used (for example `IDR`). In our Indonesian runs about 6.6% of jobs were in this case.

### Measured limits

From our tests in October 2026 (four runs on Apify with the final build, 2,317 items, 1,885 different jobs, no errors):

- **Depth.** A run for the whole Indonesian board with an empty keyword returned between 1,269 and 1,355 jobs in four runs, in 9 to 26 seconds, and each time stopped because the source ran out. The Philippine board held 769 jobs when we checked from a local address on the same day. The size changes daily, so `maxResults` has a ceiling of 1,500, above both boards.
- **Descriptions.** With descriptions on, 100% of the jobs had a description and qualifications.
- **Other fields.** Skills were tagged on 10% of Philippine jobs, benefit codes on 33% and an address line on 75%. Company, employment type, function, region, country and both dates were present on every job.
- **Speed.** Runs of 135 to 600 jobs finished in 3 to 6 seconds.

### Pricing

Pay per result: **$1.50 per 1,000 jobs**, plus a small start fee per run. No monthly fee (you need an Apify account). Error items and duplicates are never charged.

- 100 jobs: $0.15.
- 1,500 jobs (the per-run maximum): $2.25.

You can set a maximum cost per run in Apify; the Actor stops cleanly when it is reached.

### FAQ

**Does it need a login or cookies?** No. It reads the same public search results any visitor sees.

**Does it use a proxy?** No, it runs from Apify's platform addresses and backs off when the site slows down.

**Is it legal?** It collects only publicly visible job postings and never signs in. You are responsible for how you use the data, including data-protection law for any personal data in descriptions.

**Why is the salary empty for so many jobs?** Most employers on Kalibrr do not show one. See "Salary" for the other two reasons.

**Why can't I get Indonesian salaries?** Kalibrr converts them in its search results, and the job pages that hold the original amounts block Apify's servers. The Actor tells you the original currency instead of returning wrong amounts.

**How many jobs can I get?** Up to 1,500 per run, which is more than either country's board held when we measured. Run several searches for narrower sets.

### More from this developer

- [VietnamWorks Jobs Scraper](https://apify.com/pkpakpoom/vietnamworks-jobs-scraper): job listings from Vietnam with salary, level and skills.
- [JobThai Jobs Scraper](https://apify.com/pkpakpoom/jobthai-jobs-scraper): job listings from Thailand.
- [ITviec Jobs Scraper](https://apify.com/pkpakpoom/itviec-jobs-scraper): IT job listings from Vietnam; no salary field.
- [Google Play Reviews Scraper & Monitor](https://apify.com/pkpakpoom/google-play-reviews-scraper): reviews with ratings, app versions and developer replies.

***

Not affiliated with Kalibrr. Version 1.0.

# Actor input Schema

## `queries` (type: `array`):

One search per entry, for example a job title, skill or company. An empty string returns all jobs of the country.

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

Kalibrr job board to search.

## `jobFunction` (type: `string`):

Optional filter on Kalibrr's job function, for example IT and Software, Sales and Marketing, Accounting and Finance or Customer Service. Leave empty for all functions.

## `maxResults` (type: `integer`):

Stop after this many jobs in total (1 to 1,500), all searches together. Duplicate jobs across searches are returned once.

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

Only jobs activated in the last N days. Jobs are still read from the search results, so this narrows the output, not the pages fetched.

## `includeDescription` (type: `boolean`):

Include the job description and qualifications as plain text. Turn off for a lighter dataset.

## `failOnError` (type: `boolean`):

For scheduled runs with alerts: end the run as failed if any search ends in an error item. Jobs already returned stay saved and charged.

## `minResults` (type: `integer`):

For scheduled runs with alerts: end the run as failed if fewer jobs than this came back in total.

## Actor input object example

```json
{
  "queries": [
    "developer",
    "accountant"
  ],
  "country": "Philippines",
  "maxResults": 100,
  "includeDescription": true,
  "failOnError": false,
  "minResults": 0
}
```

# Actor output Schema

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

All jobs of the run, one item each (error items included).

## `overview` (type: `string`):

The same items as a compact table view.

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

Per search: jobs returned, pages read, why it ended and seconds taken.

# 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 = {
    "queries": [
        "developer",
        "accountant"
    ],
    "country": "Philippines",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("pkpakpoom/kalibrr-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 = {
    "queries": [
        "developer",
        "accountant",
    ],
    "country": "Philippines",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("pkpakpoom/kalibrr-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 '{
  "queries": [
    "developer",
    "accountant"
  ],
  "country": "Philippines",
  "maxResults": 100
}' |
apify call pkpakpoom/kalibrr-jobs-scraper --silent --output-dataset

```

## MCP server setup

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