# Upwork Job Fit Ranker: Score Jobs Before You Bid (`fractionalhqforyou/upwork-job-fit-ranker`) Actor

Rank Upwork jobs against your skills, budget and proposal cap. See client history, freshness and scoring reasons before spending Connects. Reuse scraped jobs or run searches; no applications are submitted.

- **URL**: https://apify.com/fractionalhqforyou/upwork-job-fit-ranker.md
- **Developed by:** [Jessy Mariau](https://apify.com/fractionalhqforyou) (community)
- **Categories:** Lead generation, Automation, Jobs
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 jobs

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## Upwork Job Fit Ranker: Score Jobs Before You Bid

Spend your proposal time on briefs worth reading. Combine Upwork job records with your skills and budget preference to get a ranked list, the reason for each score and a starting note for your proposal.

This Actor does not submit applications or spend Connects. Its BID, MAYBE and SKIP labels are a screening rubric, not a prediction of winning work. Read the brief before acting.

### See the result first

Leave searches and optional job records empty, then run. Three fictional jobs show each score band without a scraper run or Actor event charges. Demo scores use the fixture skills and budget settings; enter your own settings for live jobs.

| Fictional job | Score | Band | Proposals | Budget |
| --- | --- | --- | --- | --- |
| n8n and Airtable automation for a booking workflow | 95 | BID | 4 | Fixed price 1500 USD |
| Landing page redesign in Figma, then build in Webflow | 57 | MAYBE | 12 | Hourly 25 to 45 USD |
| Data entry from PDF invoices into a spreadsheet | 2 | SKIP | 50 | Fixed price 40 USD |

These are actual outputs from the built-in fictional demo, not customer results. Open the dataset to inspect every reason, then export the rows as JSON, CSV or Excel.

### Cost of a real run

$0.005 per job ranked. Ranking 100 jobs costs $0.50 in this Actor's events; doing that on 20 working days costs $10.00. Jobs dropped by your proposal cap have no ranking event charge. Supplied job records are charged when ranked.

Live searches run `blackfalcondata/upwork-scraper` on your Apify account, with its own charges and plan requirements. That search cost can still apply to jobs later excluded by your cap. Supply `jobs` to avoid a new search. Check the Pricing tab and your Apify plan for current platform or standby usage costs.

### What I look at

Every post gets a score out of 100. Six lines feed it and they add up to exactly 100.

**Client spend and history, worth 25.** Lifetime spend on Upwork is worth up to 18, and the number of reviewed contracts is worth up to 7. A client with 40k spent across 18 reviewed contracts scores the full line.

**Payment verified, worth 10.** Verified scores 10, not verified scores 0, unknown scores 4.

**Proposals so far, worth 20.** Fewer than five scores 20, then it falls in steps, and fifty or more scores 0.

**Freshness, worth 15.** Up to three hours old scores 15, a day old scores 9, a week old scores 2.

**Skill overlap, worth 20.** I match your skills against the post's skill tags and title. One match is worth 8, two are worth 14, three or more score the full 20. Families count as a match, so n8n on your list matches a post asking for Make or Zapier, and Figma matches Webflow. These are adjacent tool categories, not evidence that you know the exact tool requested.

**Budget against your minimum, worth 10.** With a minimum set, a fixed price or top hourly rate at or above it scores 10 and anything below scores 0. With no minimum set, I use a floor of my own: a fixed price of 500 or an hourly top of 30 scores 10, a fixed price of 100 or an hourly top of 15 scores 6, and anything under that scores 2. No stated budget scores 4 either way.

A score of 60 or more is BID. From 35 to 59 is MAYBE. Below that is SKIP.

### How to run it

Put one search per line, either a query as you would type it into Upwork or a saved-search URL. Put your skills in, one per line. Set a minimum budget if you have one and a cap on proposals so crowded posts are dropped before this Actor's ranking event is charged. Upstream search charges can still apply. Run it and sort the Overview table on the Fit column.

Leave the searches empty and you get three demo rows, one in each band, scored by the same rubric I use on real ones.

### What comes back

One row per post, highest fit first. It holds the score and band, every signal I read, the rubric reasons with their numbers, and a proposal hook. The hook is one sentence written only from that row:

> You have spent 41k on Upwork across 18 reviewed contracts, and this post is 3 hours old with 4 proposals, so here is the n8n and Airtable build you asked for.

Each row also says whether the post is new since the last run on the same watch key. Run it every morning with one key and the new column tells you what arrived overnight.

I also write a summary record with the band counts, how many posts were new, and the ten highest scores with their hooks.

### Honest limits

- The hire count is not on a public Upwork search result. The history line uses the client's reviewed contract count instead, which sits close to hires but is not the same number.
- Skill overlap reads the post's tags and title, not the full description, so a brief that only mentions your tool in the body scores 0 on that line.
- Proposals so far is the count at the moment I read the post. It moves fast on a fresh post.
- The scraper I call has been seen to finish cleanly with no rows when Upwork is throttling it. I retry once and then report the empty search rather than invent a result.
- A high score means the post is worth a look from the numbers on it. Whether the brief is any good is still your call.

### Use it from an AI agent

Because this Actor runs as an MCP server too, an agent can rank a board without you opening the console. The endpoint is `https://fractionalhqforyou--upwork-job-fit-ranker.apify.actor/mcp` and the tool is `rank_upwork_jobs`, which takes the same posts and profile and returns the ranked scores. Each ranked post costs the same per event. A client limited to the Apify MCP server can load `apify/actors-mcp-server` with `fractionalhqforyou/upwork-job-fit-ranker` named as the Actor.

### Help with your first run

Open an issue on this Actor with the run ID and the result you expected. Remove API keys and private records before sharing. Built by [Fractional HQ](https://fractionalhq.uk), independent design and automation.

# Actor input Schema

## `searches` (type: `string`):

One search per line: a query as you would type it into Upwork, or a saved-search URL from upwork.com/nx/search/jobs. Leave empty to get a demo dataset that charges nothing.

## `mySkills` (type: `string`):

Enter one item per line. Overlap with the post's skills and title is worth 20 points. Families count: n8n, Make and Zapier match each other as automation, Figma, Framer and Webflow as design.

## `minBudgetUsd` (type: `integer`):

A fixed price or top hourly rate below your minimum scores 0 on the budget line. With 0, the built-in budget bands apply: fixed 500 or hourly 30 earns 10; fixed 100 or hourly 15 earns 6; lower stated budgets earn 2. Missing budget earns 4.

## `maxApplicants` (type: `integer`):

Posts with more proposals than this are dropped before scoring and not charged. 0 disables the cut.

## `maxJobsPerSearch` (type: `integer`):

Each post read is billed by the Upwork scraper to your account, and each post ranked is one event here.

## `watchKey` (type: `string`):

Name of the memory of job ids already seen. Run again with the same key and new\_since\_last\_run tells you which posts are new.

## `jobs` (type: `array`):

Paste Upwork job records scraped earlier and they are ranked directly with no new search. Fields from blackfalcondata/upwork-scraper and neatrat/upwork-job-scraper are both read.

## Actor input object example

```json
{
  "mySkills": "n8n\nMake\nZapier\nSupabase\nFigma\nFramer\nWebflow\nReact",
  "minBudgetUsd": 0,
  "maxApplicants": 50,
  "maxJobsPerSearch": 50,
  "watchKey": "default"
}
```

# Actor output Schema

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

One row per post, highest fit first: the score and band, client spend and reviewed contracts, payment verified, proposals so far, hours since posted, budget, skill overlap, scope words, whether it is new since the last run, every rubric reason with its numbers, and the proposal hook.

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

The OUTPUT record: posts ranked, how many landed BID, MAYBE and SKIP, how many were new, events charged, search errors, and the top 10 with their hooks.

# 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 = {
    "searches": "",
    "mySkills": `n8n
Make
Zapier
Supabase
Figma
Framer
Webflow
React`
};

// Run the Actor and wait for it to finish
const run = await client.actor("fractionalhqforyou/upwork-job-fit-ranker").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 = {
    "searches": "",
    "mySkills": """n8n
Make
Zapier
Supabase
Figma
Framer
Webflow
React""",
}

# Run the Actor and wait for it to finish
run = client.actor("fractionalhqforyou/upwork-job-fit-ranker").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 '{
  "searches": "",
  "mySkills": "n8n\\nMake\\nZapier\\nSupabase\\nFigma\\nFramer\\nWebflow\\nReact"
}' |
apify call fractionalhqforyou/upwork-job-fit-ranker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fractionalhqforyou/upwork-job-fit-ranker"
        }
    }
}
```

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/5DctLc1A9kbL54fPd/builds/VMhf45lH3L1A51XWr/openapi.json
