# OnlineJobs.ph Job Scraper (`yabswannalearn/onlinejobs-public-job-scraper`) Actor

Search public jobs with employment filters and optional full descriptions.

- **URL**: https://apify.com/yabswannalearn/onlinejobs-public-job-scraper.md
- **Developed by:** [Reinael Yabut](https://apify.com/yabswannalearn) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 job scrapeds

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

## OnlineJobs.ph Public Job Scraper

Find public jobs on OnlineJobs.ph and turn them into a structured dataset. Search by keyword, filter by employment type, and choose how many pages or results to collect. Download the jobs or use them in your own workflows through Apify.

Built with Crawlee and Beautiful Soup. No OnlineJobs.ph account is required.

### What does this scraper do?

- 🔎 **Search by keyword** — find roles mentioning Claude, automation, virtual assistant, SEO, or another term. Leave it blank to browse all jobs.
- ⏱️ **Filter employment types** — select part-time, full-time, gig, or all types.
- 📄 **Collect multiple pages** — visit search pages with up to 30 listings each.
- 🎯 **Limit your results** — choose the maximum number of jobs to save.
- 📝 **Fetch full descriptions** — optionally include complete job text and update dates.
- 📤 **Export your dataset** — download results using Apify's supported export formats.

### What data can you get?

| Job information | Description information | Employer information |
| --- | --- | --- |
| Title and direct URL | Search-result preview | Employer name, when shown in logo text |
| Employment type and salary | Optional full description | |
| Posted and updated dates | Listed skills | |

Employer names come from logo text on search results. When no name is shown, `employerName` is null. Salaries are returned as advertised, without currency conversion or hourly/monthly normalization.

### Why use this scraper?

- Build a personal database of remote job opportunities.
- Feed matching jobs into alerts or application trackers.
- Research advertised salaries and in-demand skills.
- Follow hiring activity for a keyword or employment type.

### How to use it

1. Open the Actor's **Input** tab.
2. Enter a **Job keyword**, or leave it blank.
3. Choose an **Employment type**.
4. Set **Maximum pages** and **Maximum results**.
5. Enable **Fetch full descriptions** if you need complete job text and update dates.
6. Click **Start**, then inspect and download the dataset from the **Output** tab.

For a quick first run, use one page, five results, and leave full descriptions disabled.

### Input

All parameters are optional.

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `jobKeyword` | string | `""` | Search keyword. Blank searches all jobs. |
| `employmentType` | string | `"all"` | `all`, `part-time`, `full-time`, or `gig`. |
| `maxPages` | integer | `5` | Maximum search pages to visit, from 1 to 1,000. |
| `maxResults` | integer | `100` | Maximum jobs to save, from 1 to 30,000. |
| `fetchDetails` | boolean | `false` | Visit each matching job for its full description and update date. |

#### Example: part-time jobs mentioning Claude

```json
{
  "jobKeyword": "claude",
  "employmentType": "part-time",
  "maxPages": 2,
  "maxResults": 50,
  "fetchDetails": false
}
```

A specific employment filter excludes listings labelled `Any`. The Actor uses the site's native search filter and checks the label of each listing. Your page limit or the available matching listings may result in fewer jobs than requested.

### Output

Each job is saved as a separate dataset item. This is an illustrative record with detail fetching enabled:

```json
{
  "jobUrl": "https://www.onlinejobs.ph/jobseekers/job/Example-Job-1234567",
  "jobTitle": "AI Automation Assistant",
  "employerName": null,
  "employmentType": "Part Time",
  "salary": "$5/hour",
  "datePosted": "2026-09-28",
  "dateUpdated": "2026-09-28",
  "descriptionSnippet": "Help our team build and maintain automation workflows...",
  "fullDescription": "Help our team build and maintain automation workflows. Experience with AI tools is required.",
  "skills": ["AI Tools", "Automation"]
}
```

#### Output fields

| Field | Type | Description |
| --- | --- | --- |
| `jobUrl` | string | Direct link to the job posting. |
| `jobTitle` | string | Advertised job title. |
| `employerName` | string or null | Employer name from logo text, when available. |
| `employmentType` | string or null | Advertised type, such as `Part Time`, `Full Time`, `Gig`, or `Any`. |
| `salary` | string or null | Original salary text; null when absent. |
| `datePosted` | string or null | Posted date in `YYYY-MM-DD` format, when available. |
| `dateUpdated` | string or null | Update date in `YYYY-MM-DD` format. Null if detail fetching is disabled or the date cannot be read. |
| `descriptionSnippet` | string | Description preview from search results. |
| `fullDescription` | string or null | Complete description with paragraph breaks preserved and filter tags removed. Null if detail fetching is disabled. |
| `skills` | string array | Listed skills; an empty array when none are shown. |

### Speed and run behavior

With `fetchDetails: false`, the Actor reads listing fields directly from search pages. Enabling details adds one request for every matching job.

The crawler follows robots.txt rules and the site's crawl delay. At a five-second delay, fetching details for 30 jobs takes at least about 2½ minutes, plus page fetching and processing time. Allow more time for larger runs or retries.

Jobs are saved as they are collected. Deleted jobs are skipped when their detail pages are visited. Failed requests are retried up to three times. If requests still fail, the run is marked failed; previously saved jobs remain available. The default key-value store's `RUN_SUMMARY` record reports the saved count and failed requests.

### API and integrations

Open the Actor's **API** tab for calls to run it and retrieve its dataset. You can also schedule runs or connect the results to workflows using Apify integrations and webhooks.

### Public data only

This Actor reads public search results and job pages. It does not collect login-only employer information or submit job applications. It is an independent tool and is not affiliated with OnlineJobs.ph.

# Actor input Schema

## `jobKeyword` (type: `string`):

Leave blank to search all jobs.

## `employmentType` (type: `string`):

Filter by the job's advertised employment type.

## `maxPages` (type: `integer`):

Maximum search pages to visit (up to 30 listings per page).

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

Stop collecting once this many jobs have been saved.

## `fetchDetails` (type: `boolean`):

Visit each job page for fullDescription and dateUpdated. Requests are spaced by at least five seconds, so details take substantially longer.

## Actor input object example

```json
{
  "jobKeyword": "",
  "employmentType": "all",
  "maxPages": 5,
  "maxResults": 100,
  "fetchDetails": false
}
```

# Actor output Schema

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

Collected public job listings, including optional full descriptions and update dates.

# 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("yabswannalearn/onlinejobs-public-job-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("yabswannalearn/onlinejobs-public-job-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 yabswannalearn/onlinejobs-public-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yabswannalearn/onlinejobs-public-job-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/0niIq79Y96wDeGdCC/builds/mWOlOclVhutW1oXVe/openapi.json
