# Agency Leads Scraper 🏢 Clutch, DesignRush, Sortlist + contacts (`tagadanar/agency-leads-scraper`) Actor

Build a prospecting list of marketing, design and software agencies: website, services, hourly rate, minimum budget, team size, rating, plus phone, email and address from the agency's own profile. Clutch, DesignRush and Sortlist in one run, 28 categories, 69 countries. No API key.

- **URL**: https://apify.com/tagadanar/agency-leads-scraper.md
- **Developed by:** [Tagada Data](https://apify.com/tagadanar) (community)
- **Categories:** Lead generation, SEO tools, Automation
- **Features:** Limited permissions
- **Stats:** 15 total users, 7 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 agency leads

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

## Agency Leads Scraper

Build a prospecting list of marketing, design and software agencies, with the
phone numbers and email addresses to actually contact them.

Pick a service ("digital marketing", "web design", "software development"),
optionally pick a country, set how many you want. You get back a clean
spreadsheet of agencies: who they are, what they sell, how big they are, what
they charge, how well they are reviewed, and how to reach them.

Three directories are covered in a single run, Clutch, DesignRush and
Sortlist, so one export gives you a wider list than any single-site scraper.
No API key, no login, no browser. One flat price per agency, platform usage
included.

### Why three directories and not one

Most agency-lead tools read a single site, and most of them read Clutch. A
single-site list inherits that site's blind spots: Clutch is strongest on
client reviews and rates, DesignRush is where agencies publish a phone number
and an email address, and Sortlist is the only one carrying official company
registration numbers and exact headcounts. Reading all three in one run gives
you the union, one row per directory listing, with a `source` column so you
can compare how the same agency presents on each.

It also makes the list resilient. Clutch spent part of August 2026 refusing
automated traffic outright, and every Clutch-only scraper on this Store spent
those weeks failing. When one directory closes its door, this actor says so
loudly in the run status and still delivers the other two.

### How "Max agencies" is shared between directories and categories

With more than one directory ticked, `maxResults` is split evenly between them
and the run reads one listing page from each in turn. Several categories (or
several pasted URLs) are shared the same way: `["seo", "web-design"]` with 100
gives about 50 of each, not 100 SEO agencies. Ask for 300 with all
three and you get about 100 DesignRush, 100 Sortlist and 100 Clutch rows, not
300 from whichever site is read first; ask for 20 and you still get 7 / 7 / 6.

When a directory runs out of agencies for your search, or blocks us, its
unused share goes to the others straight away, so the total is still met as
long as any directory has more to give. The run status spells the split out,
for example `Split across 3 directories: 390 DesignRush, 120 Sortlist, 390
Clutch. Sortlist ran dry after 120, so its unused share went to the other
directories.` With several categories it also gives the rows per category
(`By search: 50 SEO, 50 Web design.`) and names any category that delivered
nothing. A run that reads a single directory for a single category works
exactly as before.

### What you get

One row per agency, same columns whichever directory it came from.

| Field | What it is | Source |
| --- | --- | --- |
| `name`, `website`, `tagline`, `description` | Who they are and how they pitch | all |
| `services` | The services they sell | all |
| `phone` | Direct phone number | DesignRush, Clutch |
| `email` | Direct email address | DesignRush |
| `streetAddress`, `city`, `region`, `postalCode`, `country` | Postal address | DesignRush, Clutch |
| `location` | The city and region the directory listed for this search | all |
| `offices` | Every office they run, not just the head office | Sortlist |
| `teamSize` | Exact headcount | Sortlist |
| `employeesLabel`, `employeesMin`, `employeesMax` | Headcount band | all |
| `hourlyRateLabel`, `hourlyRateMin`, `hourlyRateMax` | Average hourly rate | DesignRush, Clutch |
| `minBudget`, `maxBudget`, `budgetCurrency` | Smallest project they take | all |
| `rating`, `reviewCount` | Client rating out of 5 | all |
| `portfolioCount`, `awards` | Published work and awards | DesignRush, Sortlist |
| `registrationNumber`, `registrationCountry` | Official company registration number | Sortlist |
| `languages`, `sectors` | Languages spoken, client industries served | Sortlist |
| `linkedinUrl`, `facebookUrl`, `twitterUrl`, `instagramUrl`, `youtubeUrl` | Social profiles | DesignRush |
| `isVerified`, `isClaimed`, `isSponsored` | Directory badges, and whether the slot was paid for | all |
| `source`, `profileUrl`, `sourceUrl`, `scrapedAt` | Where each row came from | all |

A field is `null` when that directory does not publish it, never a guess. The
`source` column tells you which one you are looking at.

Two things worth knowing before you sort the spreadsheet:

Budgets are not all in the same currency. DesignRush and Clutch quote US
dollars, Sortlist quotes euros, and `budgetCurrency` records which. Sortlist
publishes no phone number or email address at all, so those columns are empty
on its rows and you are never charged the contact fee for them; Clutch
publishes a phone number and address on most profiles but no email.

### Pricing

Pay per agency actually delivered, and pay the enrichment fee only when there
really is a phone number or an email address on the row.

| Event | What it means | Price |
| --- | --- | --- |
| `agency-lead` | One agency delivered, with its profile, services, budget and reviews | **$0.005** ($5 per 1,000) |
| `agency-contact` | Charged on top only when that agency row carries a phone number or an email address | **$0.003** ($3 per 1,000) |
| `actor-start` | Charged once when a run starts | **$0.001** per run |

So 100 agencies of which 60 have a phone or an email cost $0.50 + $0.18 +
$0.001 = **$0.68**. A Sortlist row never bills the contact fee, because Sortlist
publishes no phone number or email at all. Platform usage is included, no
subscription: no proxy to configure and no API key to buy. `agency-lead` carries
the 10 / 20 / 30 % Apify Store discount tiers (Bronze / Silver / Gold and up);
`agency-contact` and `actor-start` are flat.

### Categories

digital-marketing, seo, ppc-paid-media, social-media-marketing,
content-marketing, email-marketing, public-relations, advertising,
influencer-marketing, lead-generation, web-design, web-development, ecommerce,
software-development, mobile-app-development, ui-ux-design, branding,
graphic-design, video-production, ai, cybersecurity, cloud-consulting,
blockchain, market-research, it-services, marketing-strategy,
marketing-automation, game-development.

Plain English works too: "web design", "PPC", "google ads", "logo design" and
"mobile app" all resolve to the right category.

### Who uses this

**Agencies selling to agencies.** White-label developers, freelancers and
contractors who subcontract for bigger shops. Filter on `employeesMin` and
`hourlyRateMin` to find the ones large enough to outsource and expensive enough
to have margin.

**Software and SaaS vendors.** Anyone selling project management, reporting,
SEO tooling or hosting to agencies. `services` and `teamSize` tell you who fits
your plan tiers; `email` and `linkedinUrl` tell you where to send it.

**Buyers running a pitch.** Shortlist agencies by budget, rating and location
before you talk to anyone, instead of filling in one lead form at a time.

**M\&A and market researchers.** `registrationNumber` from Sortlist is the
official company number, so a row can be matched straight against a company
register.

**Recruiters** hiring creative and technical staff, using headcount, services
and location to find the shops worth approaching.

### Examples

Fifty digital marketing agencies with contact details, anywhere, about a
third from each directory:

```json
{
  "categories": ["digital-marketing"],
  "maxResults": 50
}
```

German web design agencies (the country filter applies to DesignRush and
Sortlist; Clutch rows stay worldwide and say so in the log):

```json
{
  "categories": ["web-design"],
  "location": "Germany",
  "maxResults": 200
}
```

A fast, cheap sweep of several categories with no profile lookups:

```json
{
  "categories": ["seo", "ppc-paid-media", "content-marketing"],
  "location": "us",
  "includeContactDetails": false,
  "maxResults": 500
}
```

Sortlist only, for company registration numbers and headcounts:

```json
{
  "categories": ["software-development"],
  "sources": ["sortlist"],
  "maxResults": 300
}
```

Clutch only, for reviewed agencies with rates and phone numbers:

```json
{
  "categories": ["digital-marketing"],
  "sources": ["clutch"],
  "maxResults": 100
}
```

A specific city page, pasted straight in:

```json
{
  "directoryUrls": [
    "https://www.designrush.com/agency/digital-marketing/new-york/new-york-city"
  ],
  "maxResults": 100
}
```

### FAQ

**Is this a Clutch.co scraper?**
Clutch is one of its three sources, so yes, and you also get the two
directories Clutch-only scrapers cannot see. Pass `"sources": ["clutch"]` if
you only want Clutch rows. When Clutch tightens its anti-bot wall, as it did
for part of August 2026, the run says so in its status message and still
delivers DesignRush and Sortlist instead of failing outright.

**How do I find marketing agencies to sell to?**
Pick `digital-marketing` (or `seo`, `social-media-marketing`, `advertising`),
set a country, leave contact details on. You get names, emails, phone numbers,
headcounts and hourly rates in one export.

**Where do the contact details come from?**
DesignRush and Clutch agency profiles, where the agency itself published a
public business phone number or address; email addresses are DesignRush only.
Sortlist does not publish contact details, so its rows have none. You are only
charged the contact fee when a phone number or an email actually comes back.

**How many agencies can I get?**
DesignRush lists 50 per page and pages up to 483 deep on its biggest category,
so roughly 24,000 agencies for web design alone. Clutch lists about 60 per
page and its digital-marketing directory alone runs over 2,500 pages deep.
Sortlist returns 100 per page for up to 48 pages, about 4,800 per category.
Country filters and `maxResults` cut those down, which is usually what you
want. With several directories or categories, `maxResults` is the total for
the run, shared evenly between them (see "How Max agencies is shared" above).

**Does a country filter mean the agency is based there?**
Not always. DesignRush and Sortlist also list agencies that serve a country
from elsewhere, and the filter does not apply to Clutch's worldwide directory
pages at all (paste a Clutch location URL into `directoryUrls` for those).
Check the `country` column (and `city`, on enriched rows) if you only want
local head offices.

**Why does `location` sometimes disagree with `city`?**
`location` is the office the directory showed for your search, and `city` comes
from the agency's own profile, which is its main address. An agency with a
Berlin office and a New York head office will show both.

**Can I get the same agency from several directories?**
Yes, and that is on purpose. Well-known agencies are listed on two or all
three, and you get one row per directory so you can compare what each one
holds. Dedupe on `website` if you want a single row per company.

**Are sponsored listings included?**
Yes, flagged with `isSponsored` rather than hidden, so you can drop them or
keep them.

**Can I search a city or a US state?**
Paste the directory URL into `directoryUrls`. The `location` field covers
countries; city and state pages have a different URL shape on each site and are
passed straight through instead. A `location` that is not a country the actor
knows (a city, a state, a typo) stops the run with an input message listing
the accepted countries, rather than returning agencies from everywhere.

**Is it fast?**
A run with no profile lookups is a page fetch per 50 to 100 agencies. Turning
contact details on adds one lookup per DesignRush and Clutch agency, which is
the slow part, so use `includeContactDetails: false` when you only need the
firmographic columns.

### Related actors

- [BBB Business Scraper](https://apify.com/tagadanar/bbb-scraper) for accredited
  US businesses with ratings and complaints
- [Yellow Pages US Scraper](https://apify.com/tagadanar/yellowpages-us) for
  local business leads with phone numbers
- [Europages Scraper](https://apify.com/tagadanar/europages) for European B2B
  suppliers with emails
- [German Company KYC](https://apify.com/tagadanar/german-company-kyc) to check
  a Sortlist `registrationNumber` against the German commercial register

***

agency leads, marketing agency list, digital agency directory, agency contact
database, b2b agency prospecting, clutch scraper, clutch alternative, find
marketing agencies, agency email list, web design companies list, seo agency
leads, agency directory export, designrush scraper, sortlist scraper, clutch
agency list, agency lead generation

# Changelog

This Actor's version history is a separate document: https://apify.com/tagadanar/agency-leads-scraper/changelog.md

# Actor input Schema

## `categories` (type: `array`):

The service you want agencies for, in plain words: <code>digital marketing</code>, <code>seo</code>, <code>web design</code>, <code>branding</code>, <code>software development</code>. Add several to build one combined list; <b>Max agencies</b> is shared evenly between them. Full list: digital-marketing, seo, ppc-paid-media, social-media-marketing, content-marketing, email-marketing, public-relations, advertising, influencer-marketing, lead-generation, web-design, web-development, ecommerce, software-development, mobile-app-development, ui-ux-design, branding, graphic-design, video-production, ai, cybersecurity, cloud-consulting, blockchain, market-research, it-services, marketing-strategy, marketing-automation, game-development.

## `location` (type: `string`):

Limit the list to one country, by name or ISO code: <code>United States</code>, <code>us</code>, <code>Germany</code>, <code>de</code>. Leave empty for agencies worldwide. Both directories list agencies that <i>serve</i> a country as well as ones headquartered there, so check the <code>country</code> column if you only want local head offices. For a city or a US state, paste the directory URL into the field below instead: a location that is not a known country stops the run with an input message instead of returning agencies worldwide.

## `sources` (type: `array`):

Leave all three ticked for the widest list. DesignRush brings phone numbers, email addresses and street addresses; Sortlist adds company registration numbers, exact headcounts, spoken languages and client sectors; Clutch adds verified client reviews, hourly rates, minimum project sizes and phone numbers. An agency on several directories is returned once per directory so you can compare. With more than one ticked, <b>Max agencies</b> is shared evenly between them, so you get a mix rather than one directory filling the list.

## `includeContactDetails` (type: `boolean`):

Opens each DesignRush agency's profile to add the phone number, email address, street address, star rating and social profiles. Leave this on for prospecting. Turning it off makes a run several times faster and cheaper when you only need names, services, rates and websites. Sortlist rows are unaffected: that directory publishes no phone or email at all, so nothing extra is fetched or charged for them.

## `directoryUrls` (type: `array`):

Paste DesignRush, Sortlist or Clutch listing URLs to scrape exactly those pages, for example <code>https://www.designrush.com/agency/digital-marketing/new-york/new-york-city</code>, <code>https://www.sortlist.com/i/branding/germany-de</code> or <code>https://clutch.co/agencies/digital-marketing</code>. Use this for city and state pages, or any filtered listing the fields above do not cover. Agency profile URLs are not accepted here.

## `maxResults` (type: `integer`):

Total agencies to return across every category and directory in this run. With several directories or categories the total is split evenly between them (300 with all three directories = about 100 each), read one listing page from each in turn; a directory that runs out or is blocked hands its unused share to the others, so the total is still met whenever any directory has more. DesignRush lists 50 per page, Sortlist 100, Clutch about 60. This is the number that decides the size of your bill.

## Actor input object example

```json
{
  "categories": [
    "digital-marketing"
  ],
  "location": "",
  "sources": [
    "designrush",
    "sortlist",
    "clutch"
  ],
  "includeContactDetails": true,
  "directoryUrls": [],
  "maxResults": 20
}
```

# Actor output Schema

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

One item per agency in the default dataset.

# 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 = {
    "categories": [
        "digital-marketing"
    ],
    "location": "",
    "sources": [
        "designrush",
        "sortlist",
        "clutch"
    ],
    "includeContactDetails": true,
    "directoryUrls": [],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/agency-leads-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 = {
    "categories": ["digital-marketing"],
    "location": "",
    "sources": [
        "designrush",
        "sortlist",
        "clutch",
    ],
    "includeContactDetails": True,
    "directoryUrls": [],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/agency-leads-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 '{
  "categories": [
    "digital-marketing"
  ],
  "location": "",
  "sources": [
    "designrush",
    "sortlist",
    "clutch"
  ],
  "includeContactDetails": true,
  "directoryUrls": [],
  "maxResults": 20
}' |
apify call tagadanar/agency-leads-scraper --silent --output-dataset

```

## MCP server setup

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