# Sortlist Scraper & API - Marketing & IT Agency Leads (`rel8ble/sortlist-scraper`) Actor

Get B2B leads from Sortlist agency directories by service and country or city. One result = one marketing, design or IT agency: website, team size, budget, founded, revenue, offices, social links, rating, reviews. Details included, no start fee. $0.75 per 1,000, the cheapest.

- **URL**: https://apify.com/rel8ble/sortlist-scraper.md
- **Developed by:** [Giovanni Rich](https://apify.com/rel8ble) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.75 / 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/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 Scraper & API - Marketing & IT Agency Leads

This **Sortlist scraper** turns sortlist.com, the agency marketplace used across Europe and the US, into clean **B2B lead lists of agencies**: give it a Sortlist directory such as *Advertising agencies in the United States*, *SEO agencies in Paris* or *Digital marketing agencies* and get one row per agency with **website, team size, minimum budget, founding year, revenue, full address with GPS, every office, services with budgets, industries, languages, social links, awards, rating and client reviews**, as JSON, CSV or Excel.
Use it as a **Sortlist API**, an **agency directory scraper**, a **marketing agency lead list** builder for partnerships, white-label and SaaS sales, or a **Clutch / GoodFirms alternative** data source from your own code, Make, Zapier or n8n.

It reads the public directory and agency pages over plain HTTP, with **no headless browser and no login**. 450 agencies with agency-page details take under two minutes, and it costs **$0.75 per 1,000 agencies with details included and no start fee**, the lowest price of any Sortlist scraper on the Store.

### How to use

1. Open sortlist.com, pick a service and a place (e.g. *Advertising > United States*, or *SEO > Paris*) and copy the URL into **Sortlist directory URLs**. Service-only pages (`/digital-marketing`), country, state and city pages, and the local sites (sortlist.fr, .be, .de, .es, .it, .nl, .ch) all work.
2. Set **Max agencies per directory** (0 = the whole directory).
3. Keep **Open each agency page** on for founding year, revenue, offices, social links, awards and reviews.
4. Optionally filter: only agencies with a website, a minimum rating or number of reviews, a team size range, or a minimum project budget.
5. Click **Start** and download the leads from the **Output** tab, or fetch them through the Apify API.

### What you get

- **Contact**: agency name, website (tracking parameters removed), LinkedIn / Facebook / X / Instagram / YouTube links.
- **Company data**: team size, founding year, declared annual revenue, registration / VAT number, member since, verified / claimed / paying-member flags.
- **Location**: main office street address, city, country and GPS, plus every other office.
- **Offer**: services with their budget range, project and review counts, minimum and maximum project budget, industries served, languages spoken, works-remotely flag.
- **Reputation**: rating out of 5, number of reviews, awards and partner badges (e.g. HubSpot or Google partner), Sortlist's AI review summary and the client reviews (reviewer, title, company, service, summary, pros and cons, date).
- **Directory context**: the directory that listed it and its position in Sortlist's order.

### Sample output

Real rows from a cloud run of the default demo (advertising agencies in the United States, agency pages on; full rows in `sample-output.json`):

| name | website | location | team | founded | min budget | rating |
|---|---|---|---|---|---|---|
| Boundify | https://www.boundify.io | Greenville, United States | 5 | 2011 | €1,000 | 5.0 (2) |
| DASH TWO | https://dashtwo.com | Inglewood, United States | 11 | 2009 | €3,000 | 5.0 (25) |
| NinjaPromo | https://ninjapromo.io | Dubai, United Arab Emirates | 300 | 2017 | €3,000 | 5.0 (52) |
| ADVIDS | https://www.advids.co | San Francisco, United States | 89 | 2012 | €1,000 | 5.0 (23) |
| Quantum IT Innovation | https://quantumitinnovation.com | Dallas, United States | 200 | 2010 | €1,000 | 5.0 (160) |

Fill rates in a 451-agency local test run (advertising agencies in the US, digital marketing agencies, SEO agencies in Paris; (website and at-least-one-review filters on): website, address, GPS, team size, rating 100%, founding year 97%, social links 97%, budget 87%, registration number 71%, awards 56%, revenue 53%, AI review summary 26%.

### Use cases

- **Agency partnerships and white-label sales**: build lists of agencies by service and country to pitch tools, outsourcing or referral deals
- **SaaS prospecting**: agencies are heavy buyers of marketing, analytics, design and hosting software; filter by team size and budget
- **Vendor shortlisting**: compare agencies by rating, reviews, budget and services before you send an RFP
- **Market research**: count and map agencies per service and city, with team sizes and declared revenue
- **CRM enrichment**: add founding year, revenue, offices and social links to the agencies you already track

### Pricing

**$0.75 per 1,000 agencies** (pay per result; one result = one agency saved to the dataset). **No start fee**, and the same price with or without the agency-page details. Platform usage is included. Agencies skipped by your filters, duplicates, removed profiles and failed requests are never charged. If you set a maximum cost per run, the scraper stops cleanly when it reaches it.

| Agencies | Cost |
|---|---|
| 20 (the prefilled demo) | $0.015 |
| 100 | $0.075 |
| 1,000 | $0.75 |
| 10,000 | $7.50 |

On the Apify free plan ($5 of monthly credit) that is about 6,600 agencies a month.

It is the cheapest Sortlist scraper on the Store (prices per 1,000 on the free tier, October 2026):

| Sortlist scraper (30-day users) | Price per 1,000 agencies |
|---|---|
| **This one** | **$0.75, details included, no start fee** |
| ahmed_jasarevic sortlist-scraper (1) | $0.80 per listing + $1.50 per agency profile detail + $0.00005 per run |
| reventadata sortlist-scraper (1) | $1.00 + $0.00005 per run |
| saswave sortlist-company-agency-scraper (10) | $2.00 + $0.00005 per run |
| xavier_rx sortlist-agency-leads-scraper (1) | $3.00 |
| scrapingmonkey sortlist-agencies-scraper (1) | $3.00 + $0.00005 per run |
| scrapersdelight sortlist-agency-scraper (1) | $3.50 |
| tagadanar agency-leads-scraper, Clutch + DesignRush + Sortlist (5) | $5.00 + $3.00 per contact + $0.001 per run |
| great_pistachio sortlist-agency-scraper (1) | $8.00 + $0.00005 per run |

### Input

| Field | Default | Description |
|---|---|---|
| `startUrls` | - | Sortlist directory pages (`https://www.sortlist.com/advertising/united-states-us`, `https://www.sortlist.fr/seo/paris-fr`) or agency pages (`/agency/<name>`) |
| `maxResultsPerDirectory` | 100 | Agencies per directory URL. 0 = all |
| `scrapeDetails` | true | Open each agency page for founded, revenue, offices, social, awards, reviews |
| `maxReviewsPerAgency` | 10 | Client reviews kept per row (0-50) |
| `requireWebsite` | false | Only keep agencies with a website |
| `minRating` / `minReviews` | - / 0 | Only keep agencies rated at least this / with at least this many reviews |
| `minTeamSize` / `maxTeamSize` | 0 / 0 | Team size range (0 = no limit) |
| `minBudget` | 0 | Skip agencies whose largest budget is below this (EUR) |

With no input at all, a 20-agency demo (advertising agencies in the United States) runs.

### Input example

```json
{
    "startUrls": [
        "https://www.sortlist.com/advertising/united-states-us",
        "https://www.sortlist.fr/seo/paris-fr"
    ],
    "maxResultsPerDirectory": 200,
    "scrapeDetails": true,
    "requireWebsite": true,
    "minReviews": 1
}
```

### Output example

```json
{
    "slug": "boundify",
    "name": "Boundify",
    "website": "https://www.boundify.io",
    "tagline": "We help B2B brands grow better with paid media-focused demand generation.",
    "location": "Greenville, United States",
    "address": "Boundify, Traction Street, Greenville, SC, USA",
    "countryCode": "US",
    "latitude": 34.8432345,
    "longitude": -82.4231339,
    "teamSize": 5,
    "founded": 2011,
    "revenue": 300000,
    "budgetMin": 1000,
    "budgetMax": 1000000,
    "rating": 5,
    "reviewCount": 2,
    "services": ["Digital Strategy", "Online Advertising", "Growth Marketing", "Advertising", "SEO"],
    "industries": ["Technology Hardware & Equipment", "Real Estate", "Software & Computer Services"],
    "languages": ["es", "en"],
    "socialLinks": ["https://www.linkedin.com/company/boundify", "https://www.facebook.com/boundify"],
    "awards": [{ "name": "HubSpot Gold Solutions Partner", "category": null, "year": 2018 }],
    "reviews": [{ "rating": 5, "reviewerTitle": "CEO", "reviewerCompany": "Designli", "service": "Digital Strategy", "summary": "Boundify's work improved the client's lead tracking process ...", "date": "2026-07-27" }],
    "registrationNumber": "472140693",
    "verified": true,
    "url": "https://www.sortlist.com/agency/boundify",
    "directory": "Top Advertising Agencies in the United States",
    "position": 4,
    "detailsScraped": true
}
```

(Shortened: rows also carry description, story, offices, serviceDetails with per-service budgets, projectsCount, reviewSummary, memberSince, logo and flags; lists are cut here.)

The dataset has four views: **Leads**, **Profile**, **Reviews** and **Directory order**. The `RUN_SUMMARY` record lists per directory how many agencies Sortlist has, how many were saved, how many your filters skipped and why each directory stopped, plus any URL that returned nothing.

### Integrations

- **Our Website Contact Extractor**: Sortlist does not publish e-mails or phones; pass the `website` column to collect them from each agency site.
- **Our Capterra Reviews and YellowPages scrapers**: software reviews and local business leads in the same flat format.
- **Make, Zapier and n8n**: run the actor and push the leads to your CRM, a mailing tool or Slack.
- **Google Sheets**: export the dataset straight to a spreadsheet.
- **Apify API**: start runs and download results over REST, or with the JavaScript and Python clients.
- **MCP for AI agents**: the Apify MCP server (https://mcp.apify.com) lets Claude, ChatGPT, Cursor and other agents call this Sortlist scraper as a tool.

### Limits

- **No e-mails or phone numbers**: Sortlist routes contact through its own briefs. Use the website column with a contact extractor.
- Revenue, founding year, awards and the AI summary appear only when the agency publishes them, and need `scrapeDetails` on.
- Reviews come from the agency page (up to 50 per agency).
- Results come in Sortlist's own order.

### FAQ

**Does Sortlist have an official API?**
Not a public, self-serve one for its agency directory (its /api/ paths are also closed to crawlers in robots.txt). This actor works as a Sortlist API: start it over REST or from Make, Zapier or n8n and get JSON back.

**How much does a typical run cost?**
$0.75 per 1,000 agencies. The 20-agency demo costs $0.015, a 100-agency city directory $0.075 and a 3,600-agency country directory about $2.70, agency-page details included.

**Does it need a browser, cookies or a Sortlist account?**
No. Plain HTTPS requests to the public pages, no login.

**Which proxy should I use?**
None: leave the default. The actor connects directly and retries any blocked request through Apify Proxy automatically.

**Is scraping Sortlist legal?**
The actor reads only public directory and agency pages that robots.txt allows (it never touches search queries, embeds or review submission pages). You are responsible for how you use the data, including reviewers' names under GDPR.

**How do I find the right directory URL?**
On sortlist.com pick a service, then a country or city in the location filter, and copy the address bar.

# Actor input Schema

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

Sortlist directory pages, one per line: a service (https://www.sortlist.com/digital-marketing), a service in a country, state or city (https://www.sortlist.com/advertising/united-states-us, https://www.sortlist.com/seo/new-york-city-ny-us), or a local Sortlist site (https://www.sortlist.fr/seo/paris-fr). Every page of the directory is read. Agency pages (https://www.sortlist.com/agency/<name>) also work.

## `maxResultsPerDirectory` (type: `integer`):

Optional. Agencies saved per directory URL, integer >= 0. Default 100; 0 = the whole directory. You pay per agency, so start small.

## `scrapeDetails` (type: `boolean`):

Default true. Opens every agency page to add founding year, revenue, all offices with address and GPS, social links, per-service budgets, awards, AI review summary and client reviews. Turn off for a faster directory-only run.

## `maxReviewsPerAgency` (type: `integer`):

Optional. Client reviews kept in each row (needs agency pages on), 0-50. Default 10. No extra requests.

## `requireWebsite` (type: `boolean`):

Optional. Skip agencies without a website. Not charged.

## `minRating` (type: `number`):

Optional. Keep only agencies rated at least this; unrated agencies are skipped when set. Not charged.

## `minReviews` (type: `integer`):

Optional. Keep only agencies with at least this many Sortlist reviews. Default 0. Not charged.

## `minTeamSize` (type: `integer`):

Optional. Keep only agencies with at least this many people. Default 0. Not charged.

## `maxTeamSize` (type: `integer`):

Optional. Keep only agencies with at most this many people (0 = no limit). Not charged.

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

Optional. Skip agencies whose largest listed budget is below this. Default 0. Not charged.

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

Optional, advanced. Parallel requests, 1-20. Default 6.

## `maxRequestRetries` (type: `integer`):

Optional, advanced. Retries per failed or blocked request, 0-20. Default 6.

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

Optional, advanced. Leave as is. Default {"useApifyProxy": false} = automatic: direct connection first, and only requests that get blocked are retried through Apify Proxy (datacenter, then residential).

## Actor input object example

```json
{
  "startUrls": [
    "https://www.sortlist.com/advertising/united-states-us"
  ],
  "maxResultsPerDirectory": 20,
  "scrapeDetails": true,
  "maxReviewsPerAgency": 10,
  "requireWebsite": false,
  "minReviews": 0,
  "minTeamSize": 0,
  "maxTeamSize": 0,
  "minBudget": 0,
  "maxConcurrency": 6,
  "maxRequestRetries": 6,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `agencies` (type: `string`):

One row per agency: website, team size, budgets, services, offices, social links, ratings and reviews.

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

Counts per directory, filtered agencies and any URL that returned nothing.

# 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": [
        "https://www.sortlist.com/advertising/united-states-us"
    ],
    "maxResultsPerDirectory": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("rel8ble/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": ["https://www.sortlist.com/advertising/united-states-us"],
    "maxResultsPerDirectory": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("rel8ble/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": [
    "https://www.sortlist.com/advertising/united-states-us"
  ],
  "maxResultsPerDirectory": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call rel8ble/sortlist-scraper --silent --output-dataset

```

## MCP server setup

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