# Sortlist Agency Leads Scraper (`xavier_rx/sortlist-agency-leads-scraper`) Actor

Export enriched Sortlist agency leads by service and location. Get ratings, reviews, services, pricing, team size, languages, awards, and public business details in JSON, CSV, or Excel.

- **URL**: https://apify.com/xavier\_rx/sortlist-agency-leads-scraper.md
- **Developed by:** [Xavier](https://apify.com/xavier_rx) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 agency 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/platform/actors/running/actors-in-store#pay-per-event

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

## Sortlist Agency Leads Scraper

Export enriched public agency data from Sortlist listing pages and profiles. Use the results for agency research, partner discovery, market mapping, sales prospecting, and competitor analysis.

### What it extracts

- Agency name, profile URL, tagline and description
- Rating, review count, recommendation badges and awards
- Location, public address and additional service locations
- Services, service-level price ranges, industries and languages
- Team size, founding date, Sortlist membership and collaboration count
- Public website, emails, phones and social profiles from the agency's own website
- Common CMS, analytics, e-commerce and frontend technology signals
- Lead score based on contactability and profile completeness
- Minimum rating and review-count filters for qualified lead lists

The Actor reads listing cards first and can optionally open each agency profile. Profile mode uses Sortlist's public Schema.org JSON-LD, with the listing card retained as a fallback if a profile request fails.

### How to use

1. Add one or more Sortlist listing or agency profile URLs.
2. Choose the maximum number of results and listing pages.
3. Keep **Open agency profiles** enabled for enriched profile data.
4. Keep **Enrich agency website contacts** enabled for sales-ready public contacts.
5. Optionally require a minimum rating or review count.
6. Run the Actor and export the dataset as JSON, CSV, Excel, XML, or JSONL.

### Example input

```json
{
  "startUrls": [
    {
      "url": "https://www.sortlist.com/web-development/united-states-us"
    }
  ],
  "maxResults": 100,
  "maxPagesPerStartUrl": 5,
  "includeProfiles": true,
  "enrichWebsiteContacts": true,
  "maxContactPages": 3,
  "minRating": 4.5,
  "minReviews": 5,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

You can also pass a direct profile URL such as `https://www.sortlist.com/agency/digitalised`.

### Output

Each dataset item represents one agency and can include:

```json
{
  "agencyName": "Example Agency",
  "profileUrl": "https://www.sortlist.com/agency/example",
  "rating": 4.9,
  "reviewCount": 24,
  "location": "New York, US",
  "startingPrice": 3000,
  "currency": "USD",
  "teamSize": 18,
  "websiteUrl": "https://example.com/",
  "publicEmails": ["hello@example.com"],
  "publicPhones": ["+1 212 555 0100"],
  "linkedinUrl": "https://www.linkedin.com/company/example",
  "technologies": ["WordPress", "Google Tag Manager"],
  "leadScore": 95,
  "services": ["Web Development", "Digital Strategy"],
  "languages": ["English", "Spanish"]
}
```

### Responsible use

Only collect public business information, respect applicable laws and Sortlist's terms, and avoid using the output for spam or unlawful profiling. Website structure and access rules can change; monitor failed runs and update selectors when necessary.

# Actor input Schema

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

Listing or agency profile URLs to scrape.

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

Maximum number of unique agency records saved to the dataset.

## `maxPagesPerStartUrl` (type: `integer`):

Maximum number of Sortlist result pages visited for each listing URL.

## `includeProfiles` (type: `boolean`):

Open every agency profile to collect richer structured data. Disable for faster, cheaper listing-only runs.

## `enrichWebsiteContacts` (type: `boolean`):

Visit each agency website to collect public emails, phones, social profiles and technology signals.

## `maxContactPages` (type: `integer`):

Maximum homepage, contact, about, team and legal pages inspected per agency.

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

Only save agencies with at least this rating. Use 0 to include unrated agencies.

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

Only save agencies with at least this many public reviews.

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

Maximum number of simultaneous HTTP requests.

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

Optional Apify Proxy or custom proxy configuration. Direct requests are cheaper and work for most runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.sortlist.com/web-development/united-states-us"
    }
  ],
  "maxResults": 100,
  "maxPagesPerStartUrl": 5,
  "includeProfiles": true,
  "enrichWebsiteContacts": true,
  "maxContactPages": 3,
  "minRating": 0,
  "minReviews": 0,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Agency profiles with services, ratings, contacts, technology signals and lead scores.

# 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": [
        {
            "url": "https://www.sortlist.com/web-development/united-states-us"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("xavier_rx/sortlist-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 = { "startUrls": [{ "url": "https://www.sortlist.com/web-development/united-states-us" }] }

# Run the Actor and wait for it to finish
run = client.actor("xavier_rx/sortlist-agency-leads-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 '{
  "startUrls": [
    {
      "url": "https://www.sortlist.com/web-development/united-states-us"
    }
  ]
}' |
apify call xavier_rx/sortlist-agency-leads-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/nVhn5pLbwipLuXly1/builds/b4GzxcPLTp6A8k8pK/openapi.json
