# MQL5 Freelance Jobs Scraper (`amulr/mql5-freelance-jobs-scraper`) Actor

Scrape new jobs from the MQL5.com Freelance board with budget, applicant-count, keyword and category filters. Schedule it and get every fresh MT4/MT5/cTrader job as a clean dataset, minutes after it is posted.

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

## Pricing

from $5.00 / 1,000 results

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

## MQL5 Freelance Jobs Scraper

Get every new job from the **MQL5.com Freelance board** as clean, filtered data — minutes after it is posted.

MQL5 Freelance is the largest job board for MetaTrader (MT4/MT5), cTrader and TradingView development. It has no RSS feed, no API and no alerts. Jobs that pay well get 20–40 applications within hours, so the developers who win are the ones who see a job in the first hour. This Actor is that alert.

### What it does

- Reads the public job board (no login, no MQL5 API — public HTML only), newest first, as many pages as you ask for.
- Applies your filters: minimum budget, maximum applications already placed, keywords / exclude-keywords, categories, and optional red-flag detection (grid/martingale requests, "my strategy — as discussed" briefs with no spec, reverse-engineer-my-account, teach-me, pay-only-if-it-works).
- Outputs one record per job with title, budget (raw and parsed min/max), applications, categories, skills, language, posted time, full description text, link, and — when a job is skipped — the exact reasons, so you can tune the filters.
- **Only-new mode** remembers job ids between runs so a scheduled run outputs each job exactly once — ideal for alerts.

### Typical setup

1. Set **Minimum budget** 30, **Maximum applications** 40, **Categories** Experts / Indicators / Libraries / Scripts / Converting, **Skip red flags** on, **Only new** on.
2. Schedule the Actor every 15–30 minutes.
3. Add an integration on the run: e-mail, Slack, Telegram, Make, n8n or Zapier — Apify sends you the new dataset items.

Result: a message with every fresh job that fits your profile, while it still has under a handful of applicants.

### Output example

```json
{
  "id": 246812,
  "url": "https://www.mql5.com/en/job/246812",
  "title": "Convert MT4 indicator to MT5 with alerts",
  "budgetRaw": "30 - 90 USD",
  "budgetMin": 30,
  "budgetMax": 90,
  "applications": 7,
  "language": "English",
  "categories": ["Converting", "Indicators"],
  "skills": ["MQL5", "MQL4"],
  "posted": "2 hours ago",
  "personalJob": false,
  "description": "I have a working MT4 indicator (source included) and need the same logic on MT5 ...",
  "matched": true,
  "skipReasons": [],
  "scrapedAt": "2026-09-16T10:15:00.000Z"
}
```

### Input

| Field | Default | Notes |
|---|---|---|
| `maxPages` | 1 | ~30 jobs per page, newest first |
| `minBudget` | 0 | Skip jobs whose top budget is below this (USD) |
| `maxApplications` | 0 | Skip jobs with this many applicants or more; 0 = no cap |
| `keywords` | \[] | Any must appear in title or description |
| `excludeKeywords` | \[] | Skip if any appears |
| `categories` | \[] | Loose match on board categories |
| `skipPersonalJobs` | true | "(personal job)" posts are addressed to one developer |
| `skipRedFlags` | false | See the list above; reasons are recorded |
| `minDescriptionLength` | 0 | Skip thin briefs |
| `includeSkipped` | false | Output skipped jobs too, with `matched: false` |
| `onlyNew` | false | Remember ids across runs (key-value store `mql5-jobs-seen`) |
| `proxyConfiguration` | off | Apify Proxy only if you get rate-limited |

### Cost

One page is one small HTTP request; a run with `maxPages: 1` uses well under 0.01 compute units. Running every 15 minutes all month costs a few cents of platform usage plus the Actor's per-result price.

### Who built it

Built and used daily by an MQL5 Market seller (Risk Guard Prop, Smart Loss Exit) to bid on jobs within the hour. The same filter is what decides which jobs I apply to myself.

### Notes and limits

- Public board only. Job detail pages, attachments and the applicant list are not scraped. Log-in-only data is never touched.
- If MQL5 changes the board markup the run logs "parsed 0 jobs" and stops instead of silently outputting nothing — report it and it will be fixed quickly.
- This Actor is not affiliated with MetaQuotes or MQL5.com.

# Actor input Schema

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

Each page of the MQL5 Freelance board holds about 30 jobs, newest first. 1 page is enough for a schedule that runs every 15–30 minutes.

## `minBudget` (type: `integer`):

Skip jobs whose top budget is below this. 0 = no minimum.

## `maxApplications` (type: `integer`):

Skip jobs that already have this many applicants or more. Wins on MQL5 are early bids — 20–40 is a sensible cap. 0 = no cap.

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

Case-insensitive words or phrases searched in the title and description, e.g. "indicator", "cTrader", "convert", "Pine". Empty = no keyword filter.

## `excludeKeywords` (type: `array`):

Skip a job if any of these appear in the title or description.

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

Board categories, matched loosely: Experts, Indicators, Libraries, Scripts, Converting, Integration, Custom graphics, Consultation, Trading robot/indicator debugging, Strategy optimization, Statistics and mathematics, Product design, Forex, Stocks, Futures/Options, Panels and dialog boxes, Collection of data on the internet, Other.

## `skipPersonalJobs` (type: `boolean`):

Jobs marked "(personal job)" are addressed to one specific developer and cannot be applied to by anyone else.

## `skipRedFlags` (type: `boolean`):

Skip grid/martingale requests, "my strategy / as discussed" briefs with no spec, reverse-engineer-my-account requests, teach-me posts and pay-only-after-success posts. The reason is recorded in skipReasons.

## `minDescriptionLength` (type: `integer`):

Skip briefs shorter than this many characters. 0 = off.

## `includeSkipped` (type: `boolean`):

When on, every job is output with matched=false and its skipReasons, so you can tune the filters. When off, only matching jobs are output.

## `onlyNew` (type: `boolean`):

Remembers job ids in a key-value store named mql5-jobs-seen, so a scheduled run outputs each job once. Turn on for alerts; leave off for a full snapshot.

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

Not normally needed — the board is public. Use Apify Proxy if your runs get rate-limited.

## Actor input object example

```json
{
  "maxPages": 1,
  "minBudget": 30,
  "maxApplications": 40,
  "keywords": [],
  "excludeKeywords": [],
  "categories": [
    "Experts",
    "Indicators",
    "Libraries",
    "Scripts",
    "Converting"
  ],
  "skipPersonalJobs": true,
  "skipRedFlags": false,
  "minDescriptionLength": 0,
  "includeSkipped": false,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Matched jobs (and skipped ones when includeSkipped is on), one record per job: title, budget, applications, categories, skills, description, link, matched, skipReasons.

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

Totals for the run: jobs read, matched, skipped, pages, and the input used.

# 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 = {
    "maxPages": 1,
    "minBudget": 30,
    "maxApplications": 40,
    "keywords": [],
    "excludeKeywords": [],
    "categories": [
        "Experts",
        "Indicators",
        "Libraries",
        "Scripts",
        "Converting"
    ],
    "minDescriptionLength": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("amulr/mql5-freelance-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 = {
    "maxPages": 1,
    "minBudget": 30,
    "maxApplications": 40,
    "keywords": [],
    "excludeKeywords": [],
    "categories": [
        "Experts",
        "Indicators",
        "Libraries",
        "Scripts",
        "Converting",
    ],
    "minDescriptionLength": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("amulr/mql5-freelance-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 '{
  "maxPages": 1,
  "minBudget": 30,
  "maxApplications": 40,
  "keywords": [],
  "excludeKeywords": [],
  "categories": [
    "Experts",
    "Indicators",
    "Libraries",
    "Scripts",
    "Converting"
  ],
  "minDescriptionLength": 0
}' |
apify call amulr/mql5-freelance-jobs-scraper --silent --output-dataset

```

## MCP server setup

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