# OnlineJobs.ph Scraper | Philippine Remote & VA Jobs with Wages (`data_daemon/onlinejobs-ph-scraper`) Actor

$0.80 per 1,000 jobs | Scrape OnlineJobs.ph jobs for hiring Filipino virtual assistants and remote workers: title, wage parsed to min/max/currency/period, type of work, hours per week, skills, posting time, full description. Keyword, type, skill and date filters. Only-new feed.

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

## Pricing

from $0.56 / 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.
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

**OnlineJobs.ph Scraper** returns **jobs from [OnlineJobs.ph](https://www.onlinejobs.ph)**, the largest job board for hiring Filipino virtual assistants and remote workers, as JSON, CSV or Excel: job title, type of work, **wage as typed by the employer and parsed into min, max, currency and period**, hours per week, skill tags, posting time and the **full job description**. Search by keyword, filter by type of work, skill and posting date; an **only-new mode** turns it into a daily feed. **$0.80 per 1,000 jobs**, no login. On 1 November 2026 the board received **285 new jobs in 26 hours**; 85% gave a wage figure, with a median of **$5.30 per hour** for hourly jobs and **$700 per month** for monthly ones.

### What can you do with OnlineJobs.ph job data?

| Who | What they get | Typical run |
|---|---|---|
| Outsourcing agencies and VA staffing firms | Every new job for the roles they place (virtual assistant, bookkeeper, video editor), each morning | `keywords` + `onlyNewSinceLastRun`, daily |
| Employers setting a wage | What other employers offer for the same role, by hour or month, in USD or PHP | `keywords: ["bookkeeper"]`, `maxResults: 0` |
| Job boards, newsletters and alert apps | A whole-board feed of new Philippine remote jobs with descriptions | `{}` with `maxResults: 0` and only-new mode, daily |
| Market and labour researchers | Demand by skill tag, part-time vs full-time mix, wage spreads over time | export to Sheets / BigQuery |
| Freelancers and VAs (and tools built for them) | New gigs for a skill as soon as they appear | `skills: ["Shopify"]`, `workTypes: ["gig", "part time"]` |

### How to scrape OnlineJobs.ph jobs

1. Open the **Input** tab. Leave everything empty for the newest jobs on the whole board, or type a few **search keywords** (`virtual assistant`, `bookkeeper`, `video editor`).
2. Optionally keep only some **types of work** (full time, part time, gig), some **skill tags**, or jobs from the last N days.
3. Click **Start**. A 50-job run takes about a minute.
4. Download the dataset as JSON, CSV, Excel or HTML, or read it through the Apify API.
5. For a daily feed, turn on **Only new jobs since the last run** and add a schedule in Apify Console.

### Input

| Field | What it does |
|---|---|
| `keywords` | Searches as typed on OnlineJobs.ph. Each search returns its newest 285 matches at most, which is weeks of history for a niche role ("bookkeeper": 285 matches back to 11 September 2026). Empty = whole board, newest first (about one day). |
| `workTypes` | `full time`, `part time`, `gig`. Jobs the employer marked "Any" match every type. |
| `skills` | Keep jobs tagged with one of these skills (case-insensitive, partial match). |
| `postedWithinDays` | Keep jobs posted in the last N days. |
| `includeDetails` | Default on: opens each job page for the full description, hours per week, date updated and employer id. Off: listing data and a short excerpt only. |
| `maxResults` | Stop after this many jobs (default 50; 0 = no cap). |
| `onlyNewSinceLastRun`, `stateName` | Skip jobs delivered by earlier runs (not charged). |
| `skipIds` | Job ids you already have. |

Example: every part-time bookkeeper job of the last two weeks.

```json
{
    "keywords": ["bookkeeper"],
    "workTypes": ["part time"],
    "postedWithinDays": 14,
    "maxResults": 0
}
```

### Output

```json
{
    "id": "1759486",
    "url": "https://www.onlinejobs.ph/jobseekers/job/outbound-phone-calls-ft-1759486",
    "title": "Outbound Phone Calls - FT",
    "companyName": null,
    "companyLogo": null,
    "workType": "Full Time",
    "postedAt": "2026-11-01T16:22:43.000Z",
    "postedAtPhilippines": "2026-11-02 00:22:43",
    "dateUpdated": "2026-11-01",
    "salaryText": "$3.5/hour",
    "salaryMin": 3.5,
    "salaryMax": 3.5,
    "salaryCurrency": "USD",
    "salaryPeriod": "hour",
    "salaryInferred": false,
    "hoursPerWeek": "48",
    "skills": ["Phone Support", "English Speaking", "Outbound Calls"],
    "skillCategories": ["customer-support--phone-support", "phone-support--english-speaking", "telemarketing--outbound-calls"],
    "summary": "I'm looking for a phone support specialist for immediate hire! Starting today, FT...",
    "description": "I'm looking for a phone support specialist for immediate hire!\n\nStarting today, FT, paid daily for the first few days...",
    "employerId": "686872",
    "detailsAvailable": true,
    "search": null,
    "scrapedAt": "2026-11-01T16:24:41.913Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Fields

| Field | Meaning |
|---|---|
| `id`, `url`, `title` | Job id (the number at the end of the job URL), job page and title. |
| `companyName`, `companyLogo` | The employer's display name and logo when the job card shows one (40 of 285 jobs on 1 November 2026); null otherwise. |
| `workType` | Full Time, Part Time, Gig or Any. |
| `postedAt`, `postedAtPhilippines` | Posting time in UTC and in Philippine time. |
| `dateUpdated` | Date the employer last edited the post. |
| `salaryText` | The wage exactly as the employer wrote it. |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | The wage read from that text: numbers, USD/PHP/AUD/CAD/GBP/EUR, and hour/day/week/month/year/task. `salaryMax` is null for open-ended wages ("$6+"). |
| `salaryInferred` | True when the employer gave no currency or period ("700") and the Actor inferred it from the size of the number: up to 50 per hour, 100 to 4,999 USD per month, 5,000 and more PHP per month. Check `salaryText` for these rows. |
| `hoursPerWeek` | Hours per week (a number or "TBD"). |
| `skills`, `skillCategories` | Skill tags and their OnlineJobs.ph category slugs. |
| `summary`, `description` | Search-page excerpt and the full description. |
| `employerId` | The employer's account id: groups posts by the same employer, also when no name is shown. Employer contact details are not on public pages and are not collected. |

### How much does it cost to scrape OnlineJobs.ph?

**$0.80 per 1,000 jobs** plus $0.001 per run start, on the free plan (lower on paid Apify plans). 50 jobs cost about $0.04; a full daily whole-board feed (about 270 new jobs) costs about $0.22 a day, roughly $6.50 a month. Jobs skipped by filters, only-new mode or `skipIds`, and jobs the employer deleted, are never charged.

### Tips

- **Daily feed:** no keywords, `maxResults: 0`, only-new mode on, schedule once or twice a day. The site shows only the newest 285 jobs per search, which on the whole board is about one day, so run at least daily to miss nothing.
- **History for a role:** use a keyword. Each keyword reaches back up to 285 matches; add related keywords (`bookkeeper`, `bookkeeping`, `quickbooks`) for more.
- **Skill filter** checks the jobs a search returns; combine it with a keyword for niche skills.
- **Faster runs:** turn off `includeDetails` when the title, wage, type and tags are enough (one request per 30 jobs instead of one per job).

### FAQ

**Is there an OnlineJobs.ph API?**
No public API for job listings. This Actor reads the public job search and job pages and returns them as JSON through the Apify API, with scheduling, webhooks and integrations.

**Do I need an OnlineJobs.ph account?**
No. The Actor reads only pages visible without logging in. Applying to jobs and contacting employers still happens on OnlineJobs.ph.

**How far back does it go?**
The site serves the newest 285 results per search. Without keywords that is about the last day of jobs; with a keyword it can be weeks or months. Only-new mode plus a daily schedule builds a complete history from now on.

**What are the typical wages?**
In the 285 jobs posted on 31 October and 1 November 2026, the median hourly wage was $5.30 (87 jobs) and the median monthly wage $700 (125 jobs), in USD. Peso salaries (18 jobs) are mostly monthly.

**How much should I pay a full-time Filipino virtual assistant?**
In 3,489 OnlineJobs.ph posts from 4 October to 3 November 2026 (20 role searches run with this Actor), the median full-time offer was **$900 a month** (middle half $650-$1,250) or **$5.50 an hour**. By role: customer service $750, general VA $800, data entry $825, executive assistant $850, video editor, SEO and appointment setter $1,000, bookkeeper and Shopify $1,025, accountant $1,100, project manager $1,150. Peso offers had a median of ₱45,000 a month. Full tables and method: [How much do you pay a Filipino virtual assistant?](https://dev.to/datadaemon/how-much-do-you-pay-a-filipino-virtual-assistant-wages-in-3489-onlinejobsph-job-posts-oct-nov-1hfa)

**Why is a job I saw on the site missing?**
Employers sometimes delete a post within hours; the Actor skips deleted jobs and does not charge for them.

**Is scraping OnlineJobs.ph legal?**
The Actor collects job posts that the site shows publicly to every visitor, at a modest request rate, and stores no contact details (only the display name an employer chose to show on its job card). Check that your use of the data fits your local laws and the site's terms.

### Related Actors

- [Welcome to the Jungle Jobs Scraper](https://apify.com/data_daemon/welcome-to-the-jungle-jobs-scraper): European jobs with full descriptions and company profiles, only-new feed.
- [Gupy Jobs Scraper](https://apify.com/data_daemon/gupy-jobs-scraper): Brazil jobs with descriptions, workplace and contract type.
- [Cutshort Jobs Scraper](https://apify.com/data_daemon/cutshort-jobs-scraper): India startup and tech jobs with salary ranges and skills.
- [WorkIndia Jobs Scraper](https://apify.com/data_daemon/workindia-jobs-scraper): India jobs with monthly salary range, city and category.
- [Oracle Jobs Scraper](https://apify.com/data_daemon/oracle-hcm-jobs-scraper): every job on any Oracle Recruiting Cloud career site.
- All Actors by [Daemon Data](https://apify.com/data_daemon).

### Support

Found a bug or need another field? Open an issue on the Issues tab; issues are usually answered within a day. Custom variants of this Actor are available on request.

# Actor input Schema

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

Job searches as typed on OnlineJobs.ph, e.g. `virtual assistant`, `bookkeeper`, `video editor`. Each search returns its newest 285 matches at most (weeks of history for a niche role). Leave empty for the newest jobs on the whole board (about one day, ~270 jobs).

## `workTypes` (type: `array`):

Keep only these types. Jobs marked "Any" by the employer match every type. Empty = all.

## `skills` (type: `array`):

Keep only jobs tagged with one of these OnlineJobs.ph skills, e.g. `Shopify`, `Bookkeeping`, `Video Editing` (case-insensitive, partial match). Empty = no skill filter.

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

Keep jobs posted in the last N days (`postedAt`). Results are newest first, so reading stops at the first older job.

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

Adds the full job description, hours per week, date updated and employer id from the job page (one extra request per job). Off: listing data only (title, wage, type, posting time, skill tags, a short excerpt), faster.

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

Stop after this many saved jobs (default 50, about $0.04). 0 = no cap: up to 285 jobs per search.

## `onlyNewSinceLastRun` (type: `boolean`):

Remember delivered job ids in a key-value store named `onlinejobs-ph-state` and skip them next time (not charged). Schedule it daily with no keywords for a full-board feed.

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

Name of the only-new memory. By default it follows the keywords, work types and skills.

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

OnlineJobs.ph job ids you already have (the number at the end of the job URL). Neither saved nor charged.

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

Usually not needed: onlinejobs.ph answers Apify's servers directly. If the site starts rate limiting, the Actor switches to Apify Proxy on its own.

## Actor input object example

```json
{
  "keywords": [
    "virtual assistant"
  ],
  "workTypes": [],
  "skills": [],
  "includeDetails": true,
  "maxResults": 50,
  "onlyNewSinceLastRun": false,
  "skipIds": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

OnlineJobs.ph jobs as JSON items in the default dataset (also CSV, Excel, XML).

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

RUN-SUMMARY record: counts of jobs found, saved, filtered, skipped and charged.

# 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("data_daemon/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("data_daemon/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 data_daemon/onlinejobs-ph-scraper --silent --output-dataset

```

## MCP server setup

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