# Sortlist Scraper \[$0.8/1k💰] | B2B Leads | Budget & Review Data (`ahmed_jasarevic/sortlist-scraper`) Actor

Scrape B2B agency listings and profiles from Sortlist — services with budget ranges, reviews, team size, offices, social links and websites — for agency lead generation and market research. No official API needed.

- **URL**: https://apify.com/ahmed\_jasarevic/sortlist-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 agency scrapeds

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

## Sortlist Agency Scraper

Scrape **B2B agency listings and profiles from Sortlist.com** — the European B2B marketplace for digital agencies — for **agency lead generation and market research**: services with budget ranges, review scores, team size, founding year, offices, social links and websites.

### Main Use Cases

- **B2B agency lead generation** — build clean, structured lists of web development, SEO, branding and marketing agencies in any country or city, with websites and social profiles for outreach.
- **Agency market research** — analyze team size, founded year, reviews, ratings and budget ranges across the digital-services market.
- **Vendor shortlisting** — evaluate agencies for client projects using services, budgets, ratings and portfolio previews.
- **Partner & reseller prospecting** — find marketed agencies in specific niches for partnerships.
- **Competitor landscape tracking** — monitor how agencies position themselves by service and location.

### How It Works

This Sortlist scraper crawls listing pages (built from service + location slugs, or custom URLs) with automatic pagination, then optionally visits each agency's profile page to extract the full detail record. It parses Sortlist's embedded `__NEXT_DATA__` JSON directly — no browser rendering — so runs are fast and cheap. Each agency is returned as one structured record combining listing-page data (position, section, budget range) with profile-page intelligence (founding year, team size, offices, social profiles, portfolio).

### Build B2B Agency Lead Lists Without an Official Sortlist API

Sortlist does not offer a public API for its agency directory. This actor exports the full public directory surface instead: agency name, tagline, website, review score and count, team size, founded year, services with budget ranges, office addresses and social profiles — ready for outreach lists, CRM imports or market analysis.

### Generate Digital Agency Leads by Service & Location

Pick any service category (`web-development`, `seo`, `branding`, `digital-marketing`, `website-creation`, ...) and any location (`amsterdam-nh-nl`, `london-uk`, `united-states-us`, ...). The actor builds the correct Sortlist listing URLs, paginates through every page, and enriches each agency with profile details when `scrapeAgencyDetails` is enabled. `maxPagesPerListing` controls crawl depth (each later page holds ~100 agencies), and `maxConcurrency` lets you tune speed vs. rate limits.

### Input

| Field | Type | Required | Default | Notes |
|-------|------|----------|---------|-------|
| `startUrls` | array | No | — | Sortlist listing or agency profile URLs, e.g. `https://www.sortlist.com/i/web-development/amsterdam-nh-nl`. If empty, URLs are built from `expertiseSlugs` + `locationSlugs`. |
| `expertiseSlugs` | array | No | `["web-development"]` | Service category slugs to crawl, e.g. `web-development`, `seo`, `branding`, `digital-marketing`, `website-creation`. |
| `locationSlugs` | array | No | `[]` | Location slugs, e.g. `amsterdam-nh-nl`, `united-states-us`, `london-uk`. Empty = global listing for each expertise. |
| `scrapeAgencyDetails` | boolean | No | `true` | Also visit each agency profile page for full details (services with budgets, social links, founding year, offices, portfolio, AI review summary). Roughly doubles requests. |
| `maxItems` | integer | No | `100` | Maximum number of unique agencies (max 1,000,000). Free users capped at 10. |
| `maxPagesPerListing` | integer | No | `5` | Max pagination pages per listing URL (~20 agencies on page 1, ~100 on later pages). |
| `maxConcurrency` | integer | No | `15` | Concurrent requests (1–20). Pure-HTTP crawl, safe to keep high. |
| `proxy` | object | No | off | Standard Apify proxy picker. Enable (residential recommended) if Sortlist rate-limits or challenges at scale. |

### Example Input

```json
{
  "expertiseSlugs": ["web-development", "seo"],
  "locationSlugs": ["amsterdam-nh-nl", "london-uk"],
  "scrapeAgencyDetails": true,
  "maxItems": 200,
  "maxPagesPerListing": 5,
  "maxConcurrency": 15
}
```

### Output

One dataset item per agency. Key columns in the `overview` view (`Agencies`): `name`, `tagline`, `website`, `reviewsRating5`, `reviewsCount`, `teamSize`, `foundedYear`, `address`, `services`, `profileUrl`.

| Field group | Fields |
|-------------|--------|
| Identity | `agencyId`, `name`, `slug`, `tagline`, `description`, `story`, `website`, `logoUrl`, `coverPictureUrl` |
| Company facts | `foundedYear`, `teamSize`, `turnover` |
| Reputation | `reviewsCount`, `reviewsRating5`, `worksCount`, `awardsCount` |
| Services | `services[]` (name, category, `budgetMin`/`budgetMax`, reviews, works counts) |
| Location | `offices[]` (address, lat/lon, city, country) |
| Social | `socialProfiles` (LinkedIn, Facebook, X, Instagram, YouTube, Vimeo, Pinterest) |
| Listing context | `listingSection`, `listingPosition`, `listingBudgetMin/Max`, `listingServices[]` |
| Extras | `portfolio[]`, `languages`, `remotely`, `claimed`, `trustedPartner`, `paidMember`, `profileUrl`, `scrapedAt` |

### Example Output

```json
{
  "agencyId": "915509ff-1346-48d9-850a-a53525ab3a6b",
  "name": "AGCS Works",
  "tagline": "Marketing - Design - Social Media - Video Production",
  "website": "http://www.agcs.works",
  "reviewsCount": 36,
  "reviewsRating5": 4.82,
  "foundedYear": 2010,
  "teamSize": 10,
  "listingSection": "manual",
  "listingPosition": 2,
  "listingBudgetMin": 1000,
  "listingBudgetMax": 1000000,
  "profileUrl": "https://www.sortlist.com/agency/agcs",
  "offices": [{ "address": "49 Mowlem Street, London E2 9HE, England, UK", "city": "London", "country": "United Kingdom" }],
  "socialProfiles": { "linkedin": "https://www.linkedin.com/company/agcs-studios", "vimeo": "https://vimeo.com/agcs" },
  "services": [{ "name": "Marketing", "category": "marketing", "budgetMin": 1000, "budgetMax": 1000000, "worksCount": 11 }],
  "portfolio": [{ "name": "Website design and Development - UA Society", "illustrationUrls": ["https://sortlist-core-api.s3.eu-west-1.amazonaws.com/..."] }]
}
```

Download the dataset as **JSON, HTML, CSV or Excel**, or pull it via the Apify API.

### Extract Agency Reviews, Ratings & Budget Ranges for Market Research

Every record combines review volume and 5-star rating (`reviewsCount`, `reviewsRating5`) with service-level **budget ranges** and portfolio counts — enough to segment the agency market by price bracket, location and service. `scrapeAgencyDetails: false` gives a fast listing-only export; `true` adds offices, socials, founding year and portfolio.

### Integrations & Automation

- **Apify API** — feed leads directly into your CRM or enrichment tooling.
- **Webhooks** — notify your sales team when a lead list run finishes.
- **Scheduling** — run weekly to keep agency lead lists fresh.
- **Export** — JSON, CSV, HTML, Excel.

*Recommended schedule:* **weekly** for lead lists, **monthly** for market research snapshots.

### Related Actors

- [Sortlist Company Agency Scraper](https://apify.com/saswave/sortlist-company-agency-scraper) — the most-used Sortlist actor on the Store (lead-gen cluster authority).
- [Sortlist Agency Scraper — B2B Agency Leads, Websites & Socials](https://apify.com/scrapersdelight/sortlist-agency-scraper) — sitemap-wide agency export with social links.
- [Sortlist Agency Scraper](https://apify.com/great_pistachio/sortlist-agency-scraper) — agency listings with budgets and languages.
- [Sortlist Agencies Scraper](https://apify.com/parseforge/sortlist-agencies-scraper) — service + country agency profiles.
- [Sortlist Agency Leads Scraper](https://apify.com/xavier_rx/sortlist-agency-leads-scraper) — enriched agency leads with website contact discovery.

### FAQ

#### Why use this actor instead of the official Sortlist API?

Sortlist does not provide a public API for its agency directory. This actor reads the same `__NEXT_DATA__` JSON the public website renders, so you get structured agency + profile data without an API key — and with automatic pagination across the entire directory, not just page one.

#### What are alternatives to this actor / Sortlist agency data?

- [saswave/sortlist-company-agency-scraper](https://apify.com/saswave/sortlist-company-agency-scraper) — Sortlist + sortlist.fr, $0.0015/result.
- [scrapersdelight/sortlist-agency-scraper](https://apify.com/scrapersdelight/sortlist-agency-scraper) — sitemap-wide export with LinkedIn.
- [parseforge/sortlist-agencies-scraper](https://apify.com/parseforge/sortlist-agencies-scraper) — by service and country.
- Other B2B directory scrapers on Apify (Clutch, DesignRush, GoodFirms) — search the Store for "agency leads".

#### How can I build a digital agency lead list for a specific city?

Set `expertiseSlugs` (e.g. `seo`) + `locationSlugs` (e.g. `london-uk`) and run — the actor paginates that city's listing and enriches every agency with website, social profiles and budget ranges. See the tasks on this page for ready-made country/city configs.

#### What is the best way to track agency market prices?

Use the `services[].budgetMin`/`budgetMax` fields across a broad scrape (all agencies, `scrapeAgencyDetails: true`) and group by `services[].category` and location. Re-run monthly to spot market drift.

### For AI Agents & LLM Apps

- **Purpose:** returns one structured agency record per Sortlist listing/profile (identity, website, reviews, team size, founded year, services with budgets, offices, socials, portfolio).
- **Minimal input:**

```json
{ "expertiseSlugs": ["web-development"], "maxItems": 100 }
```

- **Variant input — location-scoped lead list with profiles:**

```json
{
  "expertiseSlugs": ["seo"],
  "locationSlugs": ["london-uk"],
  "scrapeAgencyDetails": true,
  "maxItems": 200
}
```

Behaviors an agent should know:

- If `startUrls` is non-empty it **overrides** `expertiseSlugs`/`locationSlugs`.
- `scrapeAgencyDetails` roughly doubles request count — set `false` for fast listing-only exports.
- `maxItems` is the hard cap on unique agencies; free-tier accounts are limited to 10.
- `maxPagesPerListing` bounds pagination depth per listing URL (~20 agencies on page 1, ~100 on later pages).
- Listing-card data is always exported even if a profile page fails to parse.
- **Billing:** pay-per-event — `$0.0008` per agency record; `$0.0015` per contact-data unit if contact enrichment applies.

### Legal & Compliance Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Sortlist BV. It accesses only publicly available agency listing and profile pages published on sortlist.com — no login bypass, no account-gated data. Users are responsible for complying with Sortlist's Terms of Service and applicable law, including data-protection rules (e.g. GDPR/CCPA where applicable) when contacting the agencies or processing their public business data. Export multiple pages and re-run only as often as your legitimate business need requires.

### SEO Keywords

sortlist scraper, digital agency leads, b2b agency leads, agency lead generation, b2b agency lists, marketing agency prospecting, sortlist agency data, agency market research, web development agencies list, seo agencies by location, agency budget data, agency reviews data, sortlist alternative, agency directory export, b2b directory scraping, agency team size data, digital agency database

# Actor input Schema

## `startUrls` (type: `array`):

Sortlist listing pages (e.g. https://www.sortlist.com/i/web-development/amsterdam-nh-nl or https://www.sortlist.com/web-development) or agency profile URLs (e.g. https://www.sortlist.com/agency/webfluencer). If empty, the actor builds listing URLs from the expertise and location slugs below.

## `expertiseSlugs` (type: `array`):

Sortlist service category slugs to crawl, e.g. web-development, seo, branding, digital-marketing, website-creation. Used to build listing URLs when startUrls is empty.

## `locationSlugs` (type: `array`):

Sortlist location slugs, e.g. amsterdam-nh-nl, united-states-us, london-uk. Empty = global listing for each expertise.

## `scrapeAgencyDetails` (type: `boolean`):

When enabled, the actor also visits each agency's profile page to extract full details: services with budget ranges, social links, founding year, offices with full addresses, portfolio preview and AI review summary. Richer data but roughly doubles the number of requests.

## `maxItems` (type: `integer`):

Maximum number of unique agencies to return. Free users are capped at 10.

## `maxPagesPerListing` (type: `integer`):

Maximum number of pagination pages to crawl per listing URL (each page holds ~20 agencies).

## `maxConcurrency` (type: `integer`):

Number of concurrent requests. Pure-HTTP crawl so higher values are safe; reduce only if you hit rate limiting.

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

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "startUrls": [],
  "expertiseSlugs": [
    "web-development"
  ],
  "locationSlugs": [],
  "scrapeAgencyDetails": true,
  "maxItems": 100,
  "maxPagesPerListing": 5,
  "maxConcurrency": 15,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Scraped agency listings and profiles

# 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 = {
    "startUrls": [],
    "expertiseSlugs": [
        "web-development"
    ],
    "locationSlugs": [],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/sortlist-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 = {
    "startUrls": [],
    "expertiseSlugs": ["web-development"],
    "locationSlugs": [],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/sortlist-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 '{
  "startUrls": [],
  "expertiseSlugs": [
    "web-development"
  ],
  "locationSlugs": [],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/sortlist-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/sortlist-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/srIDyYt55kyKEc4Jj/builds/C1a7bhh5utVsEWNKV/openapi.json
