# Freelance Opportunity Intelligence (`moving_beacon-owner1/freelance-opportunity-intelligence`) Actor

Freelancer.com Opportunity Ranker — finds active public projects, scores them by skill fit, budget, competition, and budget clarity, then filters and ranks the best opportunities for bidding.

- **URL**: https://apify.com/moving\_beacon-owner1/freelance-opportunity-intelligence.md
- **Developed by:** [Jamshaid Arif](https://apify.com/moving_beacon-owner1) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $9.99 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Freelance Opportunity Intelligence

Turn the **public Freelancer.com project feed** into a ranked shortlist of the opportunities worth bidding on. Each active project is scored 0–100 on how well it fits your skills, how large its budget is, how little competition it has and how clearly its budget is defined — then filtered by your keywords and budget and sorted best-first. Every score is built from transparent, checkable components; the Actor never invents conclusions.

### What does this Actor do?

1. **Fetch** — pulls active projects from the Freelancer.com public read API for your keyword.
2. **Match & score** — for each project, computes the intersection of your skills with the project's required skills (case-insensitive) and an auditable **opportunity score**.
3. **Filter** — applies an optional keyword filter (title/skills) and your budget bounds.
4. **De-duplicate & rank** — collapses repeats by project URL and sorts by opportunity score.

Runs on the Apify platform with proxy rotation, scheduling, API access and dataset export built in.

### Why use it?

- Freelancers and agencies get a **pre-scored bid list** instead of scrolling an endless feed — the best-fit, best-value, least-crowded projects float to the top.
- Every project shows exactly **which of your skills matched** and how it scored, so you can decide fast.

### How to use it

1. Enter a **keyword** (e.g. `web scraping`).
2. List **your skills** (e.g. `Python`, `Scrapy`) — projects are scored on how many they need.
3. Optionally set **min/max budget** and an extra **keyword filter**.
4. Run the Actor and download the dataset as JSON, CSV or Excel.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `keyword` | string | Keyword passed to the project search. |
| `skills` | array | Your skills, used for match scoring (case-insensitive). |
| `minBudget` | integer | Only keep projects with a minimum budget ≥ this (optional). |
| `maxBudget` | integer | Only keep projects with a maximum budget ≤ this (optional). |
| `maxResults` | integer | Max scored opportunities to return (default 50). |
| `keywordFilter` | array | Optional: keep only projects whose title/skills contain one of these terms. |
| `proxyConfiguration` | object | Proxy settings (optional for this public API). |

#### Input example

```json
{
  "keyword": "web scraping",
  "skills": ["Python", "Scrapy", "Web Scraping"],
  "minBudget": 250,
  "maxBudget": 5000,
  "maxResults": 50,
  "keywordFilter": ["scraping", "crawler"]
}
```

### Output

One dataset record per **unique opportunity**, sorted by `opportunityScore` (highest first):

| Field | Description |
| --- | --- |
| `title` | Project title. |
| `budgetMin`, `budgetMax`, `currency` | Budget range and its currency. |
| `skills` | Required skills for the project. |
| `category`, `type` | Project category / engagement type (e.g. fixed vs hourly). |
| `bidCount`, `postedDate` | Competition and recency signals. |
| `url` | Public project URL. |
| `matchedSkills`, `skillMatchCount` | Which of *your* skills the project needs, and how many. |
| `opportunityScore` | Auditable 0–100 fit/value/competition score. |

#### Output example

```json
{
  "title": "Build a Python web scraper for e-commerce",
  "budgetMin": 250,
  "budgetMax": 750,
  "currency": "USD",
  "skills": ["Python", "Web Scraping", "Scrapy"],
  "category": "fixed",
  "type": "fixed",
  "bidCount": 7,
  "postedDate": 1690000000,
  "url": "https://www.freelancer.com/projects/python/build-scraper",
  "matchedSkills": ["Python", "Scrapy"],
  "skillMatchCount": 2,
  "opportunityScore": 78.5
}
```

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

### How the opportunity score works

The score sums transparent components (max 100):

| Component | Max | Basis |
| --- | --- | --- |
| Skill fit | 40 | Share of *your* requested skills the project needs. |
| Budget size | 30 | Higher upper budget scores higher (caps at ~2,000). |
| Low competition | 20 | Fewer existing bids scores higher. |
| Budget clarity | 10 | Both a minimum and maximum budget are specified. |

### Sources & configuration

- **Freelancer.com** — public read API (`/api/projects/0.1/projects/active/`); returns active, publicly listed projects.
- **Environment variables** — none required. Apify Proxy password is injected by the platform.

### Local execution

```bash
pip install -r requirements.txt
## put input in storage/key_value_stores/default/INPUT.json
python src/main.py
```

### Apify execution

Deploy with `apify push`, then run from the Console or via the API. Schedule it to surface fresh opportunities on a cadence.

### Limitations & legal

- Only **publicly listed** project data is processed. **No private client information is collected** — no contact details, no client identities beyond what the public listing exposes.
- The opportunity score is a **heuristic signal**, not a guarantee — always read the project before bidding.
- Respect Freelancer.com's Terms of Service and applicable laws in your jurisdiction.

# Actor input Schema

## `keyword` (type: `string`):

Keyword passed to the Freelancer.com project search (e.g. 'web scraping', 'logo design').

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

Skills you offer. Each project is scored on how many of these it needs (case-insensitive), and the matches are reported per project.

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

Only keep projects whose minimum budget is at least this value (in the project's own currency). Leave empty for no lower bound.

## `maxBudget` (type: `integer`):

Only keep projects whose maximum budget is at most this value. Leave empty for no upper bound.

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

Maximum number of scored opportunities to return.

## `keywordFilter` (type: `array`):

Optional extra filter: keep only projects whose title or skills contain at least one of these terms (case-insensitive).

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

Proxy settings. Apify Proxy is recommended but not required for this public API.

## Actor input object example

```json
{
  "keyword": "python",
  "skills": [
    "Python",
    "Web Scraping"
  ],
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "keyword": "python",
    "skills": [
        "Python",
        "Web Scraping"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("moving_beacon-owner1/freelance-opportunity-intelligence").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 = {
    "keyword": "python",
    "skills": [
        "Python",
        "Web Scraping",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("moving_beacon-owner1/freelance-opportunity-intelligence").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 '{
  "keyword": "python",
  "skills": [
    "Python",
    "Web Scraping"
  ]
}' |
apify call moving_beacon-owner1/freelance-opportunity-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,moving_beacon-owner1/freelance-opportunity-intelligence"
        }
    }
}

```

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/7sU3V1thxDVdmZT8r/builds/QEgxE72BQ4a5gUphi/openapi.json
