# Contra Freelancers Scraper (`parseforge/contra-freelancers-scraper`) Actor

Sweep Contra and pull freelancer profiles with avatar URL, name, username, headline, location, hourly rate, currency, badge, skills, portfolio count, reviews, and profile URL. Filter by search query, category, location, or hourly rate range for talent sourcing and lead generation.

- **URL**: https://apify.com/parseforge/contra-freelancers-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Automation, Lead generation, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.50 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 🧑‍💻 Contra Freelancers Scraper

> 🚀 **Export Contra independent freelancer profiles in seconds. Name, username, headline, skills, location, hourly rate, badge, portfolio count, and reviews.**

> 🕒 **Last updated:** 2026-06-05 · **📊 14 fields** per record · Full Contra independents directory · Designers, developers, marketers, writers, video, audio

The Contra Freelancers Scraper turns the Contra independents directory into a clean, structured dataset. Provide a directory URL or a keyword query, and the scraper paginates through public freelancer cards, parsing embedded Next.js page data and HTML fallbacks to extract canonical profile fields.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| 🏢 Agencies | Source vetted independents by skill and rate |
| 🚀 Startups | Build a short list of contractors fast |
| 📊 Talent analysts | Benchmark hourly rates by category |
| 🤖 ML engineers | Build talent matching training sets |
| 📰 Future-of-work journalists | Study independent worker trends |
| 👩‍💻 Developers | Mirror Contra public profiles into your CRM |

### 📋 What the Contra Freelancers Scraper does

- Accepts a Contra directory URL or a keyword query.
- Paginates through public profiles.
- Extracts name, username, headline, skills, location, hourly rate, badge, portfolio count, and review count.
- Emits one row per profile with avatar URL and direct link.

> 💡 **Why it matters:** Contra hosts a high-quality, public roster of independents but offers no bulk export. A structured feed lets recruiters and analysts move fast on rate benchmarking and outreach.

### 🎬 Full Demo

_🚧 Coming soon._

### ⚙️ Input

<table>
<tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr>
<tr><td><code>startUrl</code></td><td>string</td><td>No</td><td>Contra directory URL.</td></tr>
<tr><td><code>searchQuery</code></td><td>string</td><td>No</td><td>Skill or role keyword.</td></tr>
<tr><td><code>category</code></td><td>enum</td><td>No</td><td>Design, development, marketing, writing, video, photography, audio, consulting, data.</td></tr>
<tr><td><code>location</code></td><td>string</td><td>No</td><td>Free text location filter.</td></tr>
<tr><td><code>minHourlyRate</code> / <code>maxHourlyRate</code></td><td>integer</td><td>No</td><td>Hourly rate band in USD.</td></tr>
<tr><td><code>maxItems</code></td><td>integer</td><td>No</td><td>Free users get 10, paid users up to 1,000,000.</td></tr>
</table>

**Example 1, all designers:**
````

{
"startUrl": "https://contra.com/independents",
"category": "design",
"maxItems": 50
}

```

**Example 2, React developers in Europe:**
```

{
"searchQuery": "react developer",
"location": "Europe",
"maxHourlyRate": 100,
"maxItems": 25
}

````

> ⚠️ **Good to Know:** Contra hides exact rates and reviews behind login on some profiles. Public profile data only is returned.

### 📊 Output

Each record is a flat object. `avatarUrl` is always first, `error` is always last.

| Field | Type | Description |
|---|---|---|
| 🖼️ `avatarUrl` | string | Profile avatar image. |
| 👤 `name` | string | Full name. |
| 🆔 `username` | string | Contra handle. |
| 💬 `headline` | string | Profile headline. |
| 📍 `location` | string | Reported location. |
| 💵 `hourlyRate` | number | Hourly rate in USD. |
| 💱 `currency` | string | Currency code. |
| 🏅 `badge` | string | Top-rated, rising star, etc. |
| 🛠️ `skills` | array | Self-reported skills. |
| 📁 `portfolioCount` | number | Public project count. |
| ⭐ `reviews` | number | Public review count. |
| 🔗 `profileUrl` | string | Direct profile URL. |
| 🕒 `scrapedAt` | string | ISO timestamp. |
| ❌ `error` | string | Populated only on failure. |

### ✨ Why choose this Actor

| 🌍 | Full Contra directory coverage. |
| 🧹 | Clean column names, ready for BI tools. |
| 🔢 | Numeric casting on rates. |
| 🛟 | Graceful error rows. |
| 💾 | Native dataset export. |

### 📈 How it compares to alternatives

| Approach | Setup time | Clean schema | Pagination |
|---|---|---|---|
| Manual copy paste | hours per page | ❌ | ❌ |
| Generic browser tool | hours | partial | partial |
| **This Actor** | 5 sec | ✅ | ✅ |

### 🚀 How to use

1. Click **Try for free**.
2. Pick a category, search query, or location filter.
3. Click **Start**. Within seconds your dataset is ready.

### 💼 Business use cases

**🎯 Sourcing.** Build a short list of designers in your rate band, in a single CSV.

**📊 Rate benchmarking.** Compare hourly rates across skills and regions.

**🏷️ Talent CRM.** Sync Contra freelancers into your ATS or HubSpot.

**🤖 Talent ML.** Build skill-to-role models from public independent profiles.

### 🔌 Automating Contra Freelancers Scraper

- **Make and Zapier**, trigger weekly runs, push new freelancers to Slack.
- **Cron schedule**, native Apify scheduler.
- **Webhooks**, POST when each run finishes.
- **Warehouse**, native connectors for BigQuery, Snowflake, Postgres.

### 🌟 Beyond business use cases

**🎓 Research.** Track independent worker rate trends over time.

**🧪 Personal.** Spot rising talent in a specific niche.

**🤝 Community.** Publish public dashboards of freelance ecosystems.

**🧰 Tinkering.** Build a freelance directory clone with this data.

### 🤖 Ask an AI assistant about this scraper

Paste this README into ChatGPT, Claude, or any AI assistant and ask it to map your workflow to the actor inputs.

### ❓ Frequently Asked Questions

**❓ Does it need a Contra account?** No, only public profiles are scraped.

**❓ Can I filter by skill?** Use the search query.

**❓ Which currencies?** USD primarily, freelancers may set custom.

**❓ Will images be full resolution?** The avatar URL is returned as published.

**❓ Can I schedule runs?** Yes, native Apify scheduler.

**❓ Is the data normalized?** Yes, rates are cast to numbers.

**❓ Will the schema change?** Core fields are stable.

**❓ Can I get DMs or contact info?** No, only public profile data.

**❓ Is it legal?** Only public data is collected, you are responsible for ToS compliance.

**❓ Does pagination stop automatically?** Yes, on maxItems or empty page.

### 🔌 Integrate with any app

Apify ships native integrations with Make, Zapier, Slack, Discord, Google Drive, Google Sheets, Gmail, Airbyte, Keboola, Telegram, GitHub, and any REST or webhook endpoint.

### 🔗 Recommended Actors

| Actor | What it does |
|---|---|
| [ParseForge Argos UK Scraper](https://apify.com/parseforge/argos-uk-scraper) | UK general retailer. |
| [ParseForge Darty France Scraper](https://apify.com/parseforge/darty-france-scraper) | French electronics. |
| [ParseForge OBI Germany Scraper](https://apify.com/parseforge/obi-de-scraper) | German DIY. |
| [ParseForge Screwfix UK Scraper](https://apify.com/parseforge/screwfix-uk-scraper) | UK tools and hardware. |

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for 900+ production-grade scrapers across business intelligence, real estate, e-commerce, sports, finance, and public records.

---

**Disclaimer:** This actor scrapes only publicly available data. ParseForge is not affiliated with, endorsed by, or sponsored by any of the third-party services referenced. Users are responsible for complying with the target site's terms of service and applicable law. [Create a free account w/ $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp).

# Actor input Schema

## `startUrl` (type: `string`):

Contra independents directory URL or a category page. Example, https://contra.com/independents
## `maxItems` (type: `integer`):

Free users, limited to 10 profiles (preview). Paid users, optional, max 1,000,000.
## `searchQuery` (type: `string`):

Optional keyword to filter freelancers by skill or role. Whitespace will be trimmed.
## `category` (type: `string`):

Freelancer specialization category.
## `location` (type: `string`):

Filter by freelancer location, free text. Whitespace will be trimmed.
## `minHourlyRate` (type: `integer`):

Lower bound for hourly rate in USD.
## `maxHourlyRate` (type: `integer`):

Upper bound for hourly rate in USD.

## Actor input object example

```json
{
  "startUrl": "https://contra.com/independents",
  "maxItems": 10,
  "category": "all"
}
````

# 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 = {
    "startUrl": "https://contra.com/independents",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/contra-freelancers-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 = {
    "startUrl": "https://contra.com/independents",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/contra-freelancers-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrl": "https://contra.com/independents",
  "maxItems": 10
}' |
apify call parseforge/contra-freelancers-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/contra-freelancers-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Contra Freelancers Scraper",
        "description": "Sweep Contra and pull freelancer profiles with avatar URL, name, username, headline, location, hourly rate, currency, badge, skills, portfolio count, reviews, and profile URL. Filter by search query, category, location, or hourly rate range for talent sourcing and lead generation.",
        "version": "0.1",
        "x-build-id": "SYxgSddfsGItPEZbr"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~contra-freelancers-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-contra-freelancers-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/parseforge~contra-freelancers-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-contra-freelancers-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/parseforge~contra-freelancers-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-contra-freelancers-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrl": {
                        "title": "Start URL",
                        "type": "string",
                        "description": "Contra independents directory URL or a category page. Example, https://contra.com/independents"
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users, limited to 10 profiles (preview). Paid users, optional, max 1,000,000."
                    },
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Optional keyword to filter freelancers by skill or role. Whitespace will be trimmed."
                    },
                    "category": {
                        "title": "Category",
                        "enum": [
                            "all",
                            "design",
                            "development",
                            "marketing",
                            "writing",
                            "video",
                            "photography",
                            "audio",
                            "consulting",
                            "data"
                        ],
                        "type": "string",
                        "description": "Freelancer specialization category.",
                        "default": "all"
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Filter by freelancer location, free text. Whitespace will be trimmed."
                    },
                    "minHourlyRate": {
                        "title": "Minimum hourly rate (USD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Lower bound for hourly rate in USD."
                    },
                    "maxHourlyRate": {
                        "title": "Maximum hourly rate (USD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Upper bound for hourly rate in USD."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
