# Prolinker Project Scraper (`deltaspider/prolinker-project-scraper`) Actor

Scrape Prolinker project listings instantly - The most reliable Prolinker scraper with fast, accurate, real-time data extraction from the leading Dutch & Belgian freelance marketplace.

- **URL**: https://apify.com/deltaspider/prolinker-project-scraper.md
- **Developed by:** [delta spider](https://apify.com/deltaspider) (community)
- **Categories:** Automation, Jobs
- **Stats:** 1 total users, 0 monthly users, 26.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period. You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#rental-actors

## 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

## Prolinker Project Scraper - Get the latest freelance projects from prolinker.com

🚀 **Scrape Prolinker project listings instantly** - The most reliable Prolinker scraper with fast, accurate, real-time data extraction from the leading Dutch & Belgian freelance marketplace.

### Mac Cloudflare challenge probe

Issue [#274](https://github.com/svdwyer/delta-scrapers/issues/274) adds a
bounded diagnostic that launches fresh headful branded Chrome without
overriding its system identity. It must solve or avoid the Managed Challenge,
find a real Belgian Shopify assignment, and open one canonical anonymous detail
page before exiting successfully.

```sh
pnpm --filter prolinker-scraper run probe:cloudflare
```

Exit code `0` means search and detail readiness passed, `2` is a completed
negative target/challenge result, and `1` is a probe/configuration error. See
[the challenge findings](./docs/cloudflare-challenge-findings.md).

### Apify challenge acquisition proof

Issue [#277](https://github.com/svdwyer/delta-scrapers/issues/277) proved that
the same launch policy and shared solver can reach the Belgian search and one
canonical anonymous detail page from a private Apify Actor using exactly one
Patchright context and page when the caller explicitly selects the standard
`RESIDENTIAL` Apify Proxy group. Direct and default datacenter egress both
remained in the documented challenge. The initial observed memory floor is
1024 MB.

The disposable Actor code remains only on the
[`codex/prototype-277-artifact`](https://github.com/svdwyer/delta-scrapers/tree/codex/prototype-277-artifact/apps/prolinker/prototype/issue-277)
branch; no production runtime changed. See
[the recorded proof](./docs/apify-challenge-acquisition-proof.md).

### Single-context browser runtime

The Actor now keeps one headful branded-Chrome Patchright context and one page
for the full run. Search, pagination, optional detail enrichment, and
interested-freelancer JSON all stay inside that context. Chrome keeps its native
locale, User-Agent, viewport, and HTTP identity.

Direct egress remains the default. On Apify, the 2026-07-27 production-equivalent
proof required the caller to select the standard `RESIDENTIAL` proxy group:

```json
{
  "search_url": "https://prolinker.com/be/opdrachten/s/shopify",
  "max_results": 10,
  "include_details": true,
  "include_interested_freelancers": true,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

Proxying is never enabled implicitly, and custom proxy URLs are not accepted.
See the [browser-native crawl contract](./docs/browser-native-crawl-contract.md)
for readiness, pagination, locale, legitimate-zero, interested-data, and
failure/recovery evidence.

### One-shot Access Session portability proof

Issue [#264](https://github.com/svdwyer/delta-scrapers/issues/264) adds a
bounded, non-production proof harness. It is not a minter service or pool
integration. The remote Actor must be private and named exactly
`prolinker-access-session-portability-experiment`; the harness refuses the
public production Actor before opening Chrome or sending target traffic, and
the Actor entrypoint independently requires the fixed private experiment Actor
id before accepting proof mode.

```sh
pnpm --filter prolinker-scraper run build
pnpm --filter prolinker-scraper run test

APIFY_TOKEN=... \
PROLINKER_PORTABILITY_ACTOR_ID=... \
pnpm --filter prolinker-scraper run probe:access-session
```

The probe launches one fresh headful branded-Chrome profile on Mac direct-home
egress, applies the shared Managed Challenge Solver, and requires the Belgian
Shopify search-plus-detail readiness oracle before capturing any Access
Session. It reduces the state locally and advances to two direct-egress Apify
replications only after a fresh P0 control passes. The browser and HTTP paths
share the same target-readiness predicates, cookie-less captures remain valid
test candidates, and a passing `cf_clearance`-only replay triggers one
deliberate UA-mismatch control before P0. Raw cookie values are accepted only
in the one-shot Actor input and are not written to logs or datasets. See
[the recorded proof](./docs/access-session-portability-proof.md).

### Why Choose This Prolinker Scraper?

✅ **Fresh Projects Only** - Access the latest Prolinker project postings as they appear
✅ **Multi-Language Support** - Works with nl.prolinker.com (Dutch), be.prolinker.com (Belgian), and prolinker.com (English)
✅ **Detailed Project Data** - Extract comprehensive project details including budgets, categories, and requirements
✅ **Freelancer Insights** - Optionally scrape profiles of interested freelancers with ratings and rates
✅ **Multiple Export Formats** - Get structured data in JSON, CSV, Excel, or XML
✅ **No Coding Required** - Simply paste Prolinker search URLs and start scraping

### 🎯 Perfect For

- **Freelancers**: Automate your Prolinker project search and never miss opportunities
- **Agencies**: Track multiple project categories and match team skills efficiently
- **Market Researchers**: Analyze freelance trends, rates, and skill demand in the Netherlands/Belgium
- **Business Intelligence**: Monitor client hiring patterns and project types in the Benelux region

### 🚀 Quick Start

#### Copy & Paste Prolinker URLs

The easiest way is to use `search_url` - simply copy any Prolinker search URL from your browser and paste it directly.

```json
{
  "search_url": "https://nl.prolinker.com/opdrachten?category%5B%5D=1&skills=WordPress",
  "max_results": 50,
  "include_details": true,
  "include_interested_freelancers": true
}
```

#### Configuration Options

| Parameter                          | Description                                            | Default | Required |
| ---------------------------------- | ------------------------------------------------------ | ------- | -------- |
| **search\_url**                     | Prolinker search URL                                   | -       | Yes      |
| **max\_results**                    | Maximum projects to extract (minimum: 1)               | 10      | No       |
| **include\_details**                | Get full project descriptions (+1 request per project) | false   | No       |
| **include\_interested\_freelancers** | Get profiles of interested freelancers with ratings    | false   | No       |
| **proxy**                          | Optional caller-selected standard Apify Proxy settings | direct  | No       |

#### URL Examples

**Dutch version (Netherlands):**

```
https://nl.prolinker.com/opdrachten?category%5B%5D=1&skills=WordPress
https://nl.prolinker.com/opdrachten?skills=React&budget_from=500
```

**Belgian version:**

```
https://be.prolinker.com/opdrachten?category%5B%5D=1&skills=WordPress
https://be.prolinker.com/opdrachten?skills=Python&budget_from=1000
```

**English version:**

```
https://prolinker.com/projects?category%5B%5D=1&skills=WordPress
https://prolinker.com/projects?skills=Python&location=remote
```

### 📊 Output Data

Extract structured Prolinker project data in your preferred format (JSON, CSV, Excel, XML).

#### Basic Project Fields

```json
{
  "active_time": "09:46",
  "active_date": "23 oktober 2025",
  "project_name": "WordPress multisite voor juridische websites",
  "project_url": "https://nl.prolinker.com/opdrachten/website-en-apps/wordpress/wordpress-multisite-5WRYC204",
  "main_category": "Website en Apps",
  "sub_category": "WordPress",
  "min_budget": 350,
  "max_budget": 1000,
  "budget_type": "Vaste prijs",
  "location": "Op afstand",
  "status": "Open",
  "interested_count": 3
}
```

#### Enhanced Project Details (include\_details: true)

Enable `include_details` to extract full project descriptions:

```json
{
  "active_time": "14:30",
  "active_date": "5 november 2025",
  "project_name": "React Developer voor SaaS Applicatie",
  "project_url": "https://nl.prolinker.com/opdrachten/website-en-apps/react/react-developer-saas-ABC123",
  "main_category": "Website en Apps",
  "sub_category": "React",
  "min_budget": 2500,
  "max_budget": 5000,
  "budget_type": "Vaste prijs",
  "location": "Amsterdam of op afstand",
  "status": "Open",
  "interested_count": 8,
  "description": "We zijn op zoek naar een ervaren React developer voor het bouwen van een nieuwe SaaS applicatie. De applicatie moet schaalbaar zijn en gebruik maken van moderne best practices. Ervaring met TypeScript, Next.js en state management libraries is vereist. Het project heeft een looptijd van 3-6 maanden..."
}
```

#### Freelancer Data (include\_interested\_freelancers: true)

Enable `include_interested_freelancers` to extract profiles of freelancers who showed interest:

```json
{
  "active_time": "11:20",
  "active_date": "5 november 2025",
  "project_name": "Grafisch ontwerp voor website",
  "project_url": "https://nl.prolinker.com/opdrachten/grafisch-en-design/webdesign/grafisch-ontwerp-XYZ789",
  "main_category": "Grafisch en Design",
  "sub_category": "Webdesign",
  "min_budget": 500,
  "max_budget": 1500,
  "budget_type": "Vaste prijs",
  "location": "Op afstand",
  "status": "Open",
  "interested_count": 12,
  "description": "Modern en clean webdesign voor nieuwe corporate website...",
  "interested_freelancers": [
    {
      "displayName": "Dennis van der Berg",
      "displayDisciplines": "Website en Apps, Grafisch en Design, Marketing en Communicatie",
      "profilePictureUrl": "https://cdn.prolinker.com/profiles/12345.jpg",
      "hourlyRate": 55,
      "hourlyRateCurrency": "EUR",
      "ratings": {
        "overall": 5,
        "freelancer": {
          "quality": 5,
          "deadline": 5,
          "communication": 5,
          "professionalism": 5
        },
        "weighted": {
          "quality": 5,
          "deadline": 5,
          "communication": 5,
          "professionalism": 5
        }
      },
      "cityName": "Bergen",
      "stateName": "Noord-Holland",
      "countryId": "NL",
      "latitude": 52.6667,
      "longitude": 4.7,
      "isPremium": true
    }
  ]
}
```

### 🔧 Use Cases

#### For Freelancers

- **Automated Project Discovery**: Set up scheduled runs to find new opportunities matching your skills in the Dutch market
- **Early Bird Advantage**: Be among the first to apply to fresh project postings
- **Market Rate Analysis**: Track project budgets and freelancer rates in the Benelux region
- **Competition Research**: See who else is interested in projects and their rates

#### For Agencies & Teams

- **Multi-Category Tracking**: Monitor projects across different skill sets for your team
- **Opportunity Matching**: Automatically match team members with suitable projects
- **Competitive Intelligence**: Understand market demand and pricing trends in the Netherlands
- **Lead Generation**: Identify high-value clients with consistent project needs

#### For Market Research

- **Benelux Freelance Market**: Track trends in the Dutch/Belgian freelance economy
- **Skills Demand Analysis**: Identify in-demand skills and technologies in the region
- **Rate Benchmarking**: Understand freelancer hourly rates across different disciplines
- **Budget Distribution**: Analyze project value ranges across categories

### 📈 Start Scraping Prolinker Projects Today

Ready to automate your Prolinker project search or conduct market research on the Dutch freelance market? This Prolinker scraper provides reliable and comprehensive data extraction from the leading Benelux freelance platform.

# Actor input Schema

## `search_url` (type: `string`):

Search URL.

Go to the [Prolinker directory](https://prolinker.com/projects/), select any filters of your choice, and once you are done, click Search and copy the full URL from the address bar and paste it here.

## `max_results` (type: `integer`):

Max number of projects to scrape

## `include_details` (type: `boolean`):

This will increase the number of scraping requests (+1 per project)

## `include_interested_freelancers` (type: `boolean`):

This will increase the number of scraping requests (1 per freelancer)

## `proxy` (type: `object`):

Optional. Direct egress is the default. Proxying is enabled only when useApifyProxy is true.

## Actor input object example

```json
{
  "search_url": "https://prolinker.com/projects?skills=WordPress",
  "max_results": 10,
  "include_details": false,
  "include_interested_freelancers": false
}
```

# 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 = {
    "search_url": "https://prolinker.com/projects?skills=WordPress",
    "max_results": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("deltaspider/prolinker-project-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 = {
    "search_url": "https://prolinker.com/projects?skills=WordPress",
    "max_results": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("deltaspider/prolinker-project-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 '{
  "search_url": "https://prolinker.com/projects?skills=WordPress",
  "max_results": 10
}' |
apify call deltaspider/prolinker-project-scraper --silent --output-dataset

```

## MCP server setup

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