# Sortlist B2B Agency Scraper (`captivating_clarinet/sortlist`) Actor

A robust actor to scrape agency listings, metadata, services, and locations from Sortlist.

- **URL**: https://apify.com/captivating_clarinet/sortlist.md
- **Developed by:** [Aly Khalid](https://apify.com/captivating_clarinet) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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 Agency Scraper

Extract comprehensive B2B agency profiles, metadata, verified team sizes, project statistics, client ratings, services, and official website URLs from [sortlist.com](https://www.sortlist.com).

This robust, production-ready actor is built using Python and Crawlee (Parsel) to seamlessly navigate inconsistent international directory URL structures across multiple categories.

### Features

- **Rich Output Data:** Extracts agency name, logo, overview, description, team size, founded year, member status, awards count, remote capabilities, languages spoken, owner management status, sortlist partnership, clean destination website URLs, ratings, review counts, services, and headquarters/branch locations.
- **Concurrent & Thread-Safe:** Built with safe async locking and stateful counter management to respect result limits and ensure high performance.

*Hint: If you want to scrape every agency available for a target category and country, just set the max results to a high number like `100000` and leave limits unconstrained.*

### Input Parameters

The Actor accepts the following input fields:

| Field | Type | Description |
| ----- | ----- | ----- |
| **Focus** | `string` | Select the agency service category (e.g., `Creative Design`, `Advertising Production`, `Search Engine Marketing`, `Influencer Marketing`). |
| **Max Results** | `integer` | Maximum number of agency records to scrape. Set to `100000` to scrape the full directory. Default: `5`. |

## Here is an example of what the actor input could be:

<img src="https://preview.redd.it/vyycgvtrkhzh1.png?width=1043&format=png&auto=webp&s=8f126dd82476f2434f3c9892d3db9b9ccaa102b7" alt="Actor Input Example">

### Dataset Output Fields

Each dataset row contains the detailed profile of a B2B agency:

| Output Field | Description |
| ----- | ----- |
| `URL` | Official profile URL on Sortlist |
| `Name` | Name of the B2B agency |
| `Logo` | Direct image URL for the agency logo |
| `Overview` | Short tagline or summary of the agency |
| `Description` | Full "About" description text |
| `Team Size` | Number of employees on the team |
| `Number of Projects` | Total completed projects count |
| `Member Since` | Year the agency joined Sortlist |
| `Number of Awards` | Total number of industry awards |
| `Founded In` | Year the company was founded |
| `Works Remotely` | Boolean indicating remote work capabilities |
| `Languages` | Languages supported by the agency |
| `Is Owner Managed` | Boolean indicating if managed by the owner |
| `Is Sortlist Partner` | Boolean indicating verified Sortlist partner status |
| `Website` | The agency's direct external website URL (redirects resolved) |
| `Rating` | Average user star rating score |
| `Number Of Reviews` | Total count of client reviews |
| `Services` | Comma-separated list of offered services |
| `Awards` | Comma-separated list of earned awards |
| `Headquarters Location` | Main office location |
| `Other Locations` | Additional branch office locations |

## Here is an example of the structured data overview captured by the actor:

<img src="https://preview.redd.it/02skz5o1lhzh1.png?width=1080&crop=smart&auto=webp&s=16c1e4cd6674418dedd2b8161a242382d66c561a" alt="Actor Output Example">

### Use Cases

- **Market Research & Sourcing:** Discover top-performing digital, creative, and technical agencies across specific global regions and categories.
- **Lead Generation & Partnerships:** Compile verified B2B agency contact details, official website links, and partner statuses.
- **Competitive Benchmarking:** Analyze team sizes, project volumes, client review counts, and service offerings across competing agencies.

### Cost & Efficiency

Designed for reliability and performance, the actor optimizes request routing and parsers to maximize throughput while minimizing execution time on the Apify platform.

# Actor input Schema

## `focus` (type: `array`):

The focus you are targeting (Only use if you haven't selected a pair of country and category).

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

Maximum number of member records to fetch.

## Actor input object example

```json
{
  "max_results": 5
}
```

# Actor output Schema

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

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("captivating_clarinet/sortlist").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("captivating_clarinet/sortlist").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 '{}' |
apify call captivating_clarinet/sortlist --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,captivating_clarinet/sortlist"
        }
    }
}
```

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/5RW5evYlTpjGZxYLB/builds/vvI6qZkoxgRAlOwIa/openapi.json
