# OnlineJobs.ph Scraper | Filipino Remote Jobs & VA Postings (`trev0n/onlinejobs-ph-scraper`) Actor

Scrape OnlineJobs.ph, the top board for Filipino VAs and remote workers: title, job type, salary parsed into min/max/currency/period, skills, posting time, hours and full description. Search by keyword or skill, filter by type and age, or watch for new jobs.

- **URL**: https://apify.com/trev0n/onlinejobs-ph-scraper.md
- **Developed by:** [Paweł](https://apify.com/trev0n) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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

## 🇵🇭 OnlineJobs.ph Scraper

🎯 **Get every fresh job posting from OnlineJobs.ph, the #1 board for hiring Filipino virtual assistants and remote workers, as clean, ready-to-use data.**

Collect job titles, job type, salary (as posted *and* parsed into min, max, currency and period), skills, posting time, hours per week, the date the job was updated and the full job description. Search by keyword or skill category, filter by job type and posting age, and run it on a schedule to catch new jobs the moment they appear.

### 🚀 What Does It Do?

This scraper automatically reads the OnlineJobs.ph job board and turns every posting into a **structured, ready-to-use record**. No manual browsing: set your keywords and hit Start.

💡 **Three ways to use it:**

1. **🔍 Search mode**: give keywords (e.g. `virtual assistant`, `video editor`, `bookkeeper`) or skill categories (`video-editing`, `seo`) and get every matching job.
2. **👀 Watch mode**: schedule it hourly or daily. Each run returns only the jobs that are **new or changed** since the last run, and can alert you on Slack, Discord, Telegram or any webhook.
3. **📋 Direct links**: paste job pages, search-result pages or skill pages straight from the site.

### 👥 Who Is This For?

| 🏢 Use Case | 💬 How It Helps |
| --- | --- |
| 🧑‍💻 **Filipino freelancers & VAs** | Get alerted to new jobs in your niche minutes after they're posted, before the inbox of the employer fills up |
| 🏢 **Staffing & outsourcing agencies** | Track which roles and rates foreign employers are hiring for, and spot clients who might need an agency |
| 📊 **Market researchers** | Build salary benchmarks for Philippine remote work by role, job type and skill |
| 🎓 **Training & upskilling providers** | See which skills are in demand right now and shape courses around them |
| 🤝 **Recruiters & job aggregators** | Feed OnlineJobs.ph postings into your own job board, CRM or newsletter |

### ✨ Features

- 🔍 **Keyword search**: one search per keyword, as many as you like
- 🏷️ **Skill categories**: search the board's own skill pages, by name or link
- 🕒 **Job type filter**: full time, part time or gig/project
- 📅 **Freshness filter**: only jobs posted in the last N days
- 💰 **Salary parsing**: "$5-$7 Per hour", "Php20,000 - Php70,000 per month", "35-45K" → min, max, currency and period, plus the original text
- 📄 **Full job page on demand**: hours per week, date updated and the complete description
- 👀 **Watch mode**: only new or changed jobs on each run, with alerts on Slack, Discord, Telegram or webhook
- 🐢 **Polite, adjustable pace**: requests go one at a time, 5 seconds apart by default (the site's own request), and you choose the pause
- 🔗 **Paste links**: job, search and skill-category pages work as input
- ⚡ **Fast & Scalable**: hundreds of jobs per run, no browser needed
- 🧹 **Deduplication**: each job appears once, with the searches that matched it
- 📤 **Export Anywhere**: download results as JSON, CSV or Excel, or push them to Google Sheets, Zapier, Make or your CRM

### 🎛️ Filters & Options

| Option | What It Does |
| --- | --- |
| 🔍 **Keywords** | One search per keyword; leave everything empty for the latest jobs |
| 🏷️ **Skill categories** | Skill pages such as `video-editing` or `accounting--bookkeeping` |
| 🕒 **Job type** | Full time, part time or gig (jobs marked "Any" match every type) |
| 📅 **Posted within (days)** | Only jobs posted in the last N days |
| 🔗 **OnlineJobs.ph links** | Job, search-result or skill-category pages |
| 🔢 **Max jobs per search** | Limit per search; 0 = all the board shows (about 270–290) |
| 📄 **Include full job page** | Hours per week, date updated and full description |
| 🐢 **Seconds between requests** | Pause between page requests, 1–60 s (default 5) |
| 👀 **Watch mode** | Only new or changed jobs on each run |
| 🔔 **Alerts** | Webhook, Slack, Discord or Telegram |
| 🧰 **Compact output** | Only the key fields |

### 📦 What You Get (Output Fields)

Every job includes:

#### Job

| Field | Example |
| --- | --- |
| jobId | `1736973` |
| title | `Real Estate Video Editor` |
| jobType | `Full Time` |
| skills | `["Real Estate Marketing", "Video Editing"]` |
| skillSlugs | `["marketing--real-estate-marketing", "video-editing"]` |
| url | `https://www.onlinejobs.ph/jobseekers/job/real-estate-video-editor-1736973` |

#### Pay

| Field | Example |
| --- | --- |
| salary | `$5-$7 Per hour` |
| salaryMin | `5` |
| salaryMax | `7` |
| salaryCurrency | `USD` |
| salaryPeriod | `hour` |

#### Dates

| Field | Example |
| --- | --- |
| postedAt | `2026-10-20T12:48:45.000Z` |
| postedAtManila | `2026-10-20 20:48:45` |
| dateUpdated | `2026-10-20` |

#### Full job page (optional)

| Field | Example |
| --- | --- |
| hoursPerWeek | `40` |
| hoursPerWeekMin | `40` |
| hoursPerWeekMax | `40` |
| description | `About Us\n\nAt Real Tours Photography, we don't settle for ordinary…` |

#### Watch mode

| Field | Example |
| --- | --- |
| changeType | `NEW` |
| firstSeenAt | `2026-10-20T13:00:00.000Z` |
| matchedSearches | `["video editor"]` |

### 📊 Example Output

```json
{
    "jobId": "1736973",
    "title": "Real Estate Video Editor",
    "jobType": "Full Time",
    "salary": "$5-$7 Per hour",
    "salaryMin": 5,
    "salaryMax": 7,
    "salaryCurrency": "USD",
    "salaryPeriod": "hour",
    "postedAt": "2026-10-20T12:48:45.000Z",
    "postedAtManila": "2026-10-20 20:48:45",
    "skills": ["Real Estate Marketing", "Video Editing"],
    "skillSlugs": ["marketing--real-estate-marketing", "video-editing"],
    "descriptionSnippet": "About Us\n\nAt Real Tours Photography, we don't settle for ordinary. We create visual masterpieces that redefine real estate marketing…",
    "url": "https://www.onlinejobs.ph/jobseekers/job/real-estate-video-editor-1736973",
    "matchedSearches": ["video editor"],
    "hoursPerWeek": "40",
    "hoursPerWeekMin": 40,
    "hoursPerWeekMax": 40,
    "dateUpdated": "2026-10-20",
    "description": "About Us\n\nAt Real Tours Photography, we don't settle for ordinary…\n\nJob Description\nWe're on the hunt for a Senior Video Editor…",
    "detailScraped": true,
    "scrapedAt": "2026-10-20T13:00:00.000Z"
}
```

### 📋 Dataset Views

The Apify Console gives you **3 ready-made table views** to quickly browse your results:

| View | What It Shows |
| --- | --- |
| 📊 **Jobs** | Title, type, salary (text and parsed), posted time, skills and link |
| 📄 **Job details** | Hours per week, date updated and the full description |
| 👀 **Watch changes** | What changed (NEW / UPDATED), when it was first seen and which search matched it |

### ❓ FAQ

**🤔 How do I get alerted to new jobs?**
Add your keywords or skills, turn on **Watch mode**, add a Slack, Discord, Telegram or webhook target, and schedule the task hourly or daily. The first run saves what's there today; every later run sends only new jobs.

**🤔 Why does the run take a few seconds per page?**
OnlineJobs.ph asks automated visitors to wait 5 seconds between requests, and this scraper respects that by default. You can change the pause with **Seconds between requests** (1–60 s). Shorter is faster, but the site is more likely to refuse you.

**🤔 How many jobs can I get?**
The board shows about 270–290 jobs per search. Use several keywords or skill categories to cover more ground; duplicates are merged.

**🤔 Why do "Any" jobs appear when I filter by full time?**
Employers can mark a job as "Any" type, and the site shows those jobs under every job-type filter.

**🤔 Can I export the data?**
Yes. Export as JSON, CSV, Excel, XML, HTML or RSS, or push the data directly to Google Sheets, Zapier, Make or any webhook/API endpoint.

**🤔 How often should I run this?**
For job alerts, hourly or a few times a day. For market research, daily or weekly. You can schedule automatic runs on Apify with a few clicks.

**🤔 Does it work with proxies?**
No proxy is needed. You can turn one on if your runs ever get refused.

### 🛠️ Need Custom Filters or Features?

**I'm happy to customize this scraper for your specific needs!** 🤝

Whether you need:

- 🎯 Additional filters (minimum salary, specific currencies, hours per week, excluded keywords)
- 📊 Extra data fields or custom output formats
- 🔄 Integration with your CRM, ATS, Google Sheets or database
- ⏰ Scheduled scraping with automatic deduplication
- 🌐 Scraping other remote-work boards alongside OnlineJobs.ph

👉 **Don't hesitate to reach out via private message.** I respond quickly and I'm always open to building exactly what you need. No request is too small or too specific!

### ⚖️ Legal & Ethical Use

This scraper collects **only publicly visible job postings** from OnlineJobs.ph. It does not log in, does not access job-seeker profiles, and keeps a polite pace between requests by default. OnlineJobs.ph's terms of use restrict automated access, so make sure your use complies with them and with applicable laws, and use the data responsibly.

# Actor input Schema

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

One search per keyword, e.g. <code>virtual assistant</code>, <code>video editor</code>, <code>bookkeeper</code>. Leave everything empty to get the latest jobs on the board.

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

Skill pages of the board, by name or link: <code>video-editing</code>, <code>accounting--bookkeeping</code>, <code>https://www.onlinejobs.ph/jobseekers/search/c/seo</code>.

## `jobTypes` (type: `array`):

Only these kinds of jobs. Empty = all.

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

Only jobs posted in the last N days. 0 = any age.

## `startUrls` (type: `array`):

Job pages, search-result pages or skill-category pages copied from the site.

## `maxResultsPerSearch` (type: `integer`):

Stop each search after this many jobs. 0 = all the board shows (about 270–290 per search).

## `includeDetails` (type: `boolean`):

Also open each job: hours per week, date updated and the full description. Charged as an extra event per job.

## `requestDelaySecs` (type: `integer`):

Pause between page requests. The site asks crawlers for 5 seconds; lower values are faster but less polite and more likely to be refused. Allowed 1–60.

## `incrementalMode` (type: `boolean`):

Remember what earlier runs found and output only new or changed jobs. Schedule it hourly or daily.

## `stateKey` (type: `string`):

Name of the watch memory. Empty = derived from the searches.

## `emitUnchanged` (type: `boolean`):

In watch mode, output every job tagged NEW / UPDATED / UNCHANGED.

## `emitExpired` (type: `boolean`):

In watch mode, output jobs found before but gone now.

## `webhookUrl` (type: `string`):

POST new and changed jobs to this URL as JSON.

## `telegramBotToken` (type: `string`):

Bot token from @BotFather.

## `telegramChatId` (type: `string`):

Chat or channel to post to.

## `discordWebhookUrl` (type: `string`):

Post alerts to a Discord channel.

## `slackWebhookUrl` (type: `string`):

Post alerts to a Slack channel.

## `notifyOnlyChanges` (type: `boolean`):

Skip the alert when nothing is new.

## `notificationLimit` (type: `integer`):

How many jobs one alert lists.

## `includeRunSummary` (type: `boolean`):

Include the counts in the webhook payload.

## `compact` (type: `boolean`):

Only key fields (title, type, salary, posted, skills, link). Job pages are not read in this mode.

## `excludeEmptyFields` (type: `boolean`):

Leave out fields with no value.

## `proxyConfiguration` (type: `object`):

Not needed. Turn on only if your runs get refused.

## Actor input object example

```json
{
  "keywords": [
    "virtual assistant"
  ],
  "postedWithinDays": 0,
  "maxResultsPerSearch": 60,
  "includeDetails": false,
  "requestDelaySecs": 5,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "notifyOnlyChanges": true,
  "notificationLimit": 10,
  "includeRunSummary": true,
  "compact": false,
  "excludeEmptyFields": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `details` (type: `string`):

No description

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

No description

# 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 = {
    "keywords": [
        "virtual assistant"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("trev0n/onlinejobs-ph-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 = { "keywords": ["virtual assistant"] }

# Run the Actor and wait for it to finish
run = client.actor("trev0n/onlinejobs-ph-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 '{
  "keywords": [
    "virtual assistant"
  ]
}' |
apify call trev0n/onlinejobs-ph-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,trev0n/onlinejobs-ph-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/o1Xm2QyH5dxT8YKeB/builds/lfswHXnpD2gnFLw83/openapi.json
