# Marketing & Digital Agency Database — Sortlist (`jungle_synthesizer/sortlist-agency-directory-scraper`) Actor

Search 90+ service categories on Sortlist for marketing, creative, and tech agencies. Returns registration number, budget range, service-line breakdown, and paid-placement flags that separate sponsored listings from organic rank.

- **URL**: https://apify.com/jungle\_synthesizer/sortlist-agency-directory-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 80.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 record 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?

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

## Marketing & Digital Agency Database — Sortlist Directory Scraper

Scrape the [Sortlist](https://www.sortlist.com) agency directory for marketing, creative, and
tech agencies across 90+ service categories. Returns company registration numbers, min/max
project budgets, per-service work history, client reviews, awards, and the paid-placement
flags that separate sponsored listings from organic rank.

***

### Sortlist Agency Database Scraper Features

- Pulls the full agency record, not the card — registration number, ISO country, and both
  budget bounds as integers, none of which show up on the rendered listing.
- Covers 90+ Sortlist service categories: SEO, web development, branding, WordPress, Shopify,
  cybersecurity, AI, and more. Pick one category or crawl the whole taxonomy in a single run.
- Deduplicates every agency across categories on its stable Sortlist ID, so an agency tagged
  under five services shows up in your dataset exactly once.
- Returns a per-service work-count breakdown for each agency — how many projects they've
  shipped in each discipline, not just a list of tags.
- Flags `paid_member`, `sponsored`, and `plan` on every record, so you can strip promoted
  placements and read the organic ranking on its own.
- Captures reviews, awards, team size, and every office address (English plus the original
  locale) for firmographic screening.

***

### Who Uses Sortlist Agency Data?

- **M\&A and PE associates** — join `registration_number` against a national company registry
  to build a roll-up target list in a fragmented services market.
- **Agencies tracking competitors** — pull `listing_position` and `listing_section` per
  category to monitor where you and your rivals actually rank, sponsored placements aside.
- **Procurement and marketing teams** — filter by `budget_min`/`budget_max` to shortlist
  agencies that fit a project's real range before the first call.
- **Sales teams selling into agencies** — build a prospect list segmented by team size,
  service mix, and country, or feed it straight into a CRM.
- **Market researchers** — measure category density and service concentration (how many
  agencies specialize in, say, growth marketing vs. web development) across a live directory.

***

### How Sortlist Agency Directory Scraper Works

1. Pick one or more service categories (or leave the field empty to cover all 90+).
2. The scraper walks each category's full agency listing, page by page, until it runs out of
   pages or hits your `maxItems` cap.
3. Every agency is deduplicated by its Sortlist ID as it's collected, so overlapping
   categories never produce repeat rows.
4. Results land in your dataset as structured JSON — ready to export or pipe into whatever
   comes next.

***

### Input

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

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `expertises` | array | *(all categories)* | Sortlist service category slugs to crawl (`seo`, `branding`, `web-development`, `wordpress-development`, ...). Leave empty to crawl all 90+ categories. |
| `maxItems` | integer | 10 | Maximum number of unique agencies to return, deduplicated across every requested category. |

To crawl a single category, pass just that slug:

```json
{
  "expertises": ["branding"],
  "maxItems": 500
}
```

#### Resuming a large crawl

Every run emits a `resumeCursor` in its Output. If a large crawl stops before it finishes — because it hit `maxItems`, your spend cap (`maxTotalChargeUsd`), or was aborted — start a new run with **the same input** plus that `resumeCursor` to continue from where it left off. The crawl resumes from the queued work the previous run didn't reach.

- You are **not re-charged** for records the earlier run already delivered.
- Resume within your account's run-retention window — on the free tier, roughly your 10 most recent runs. Once the source run is pruned, its `resumeCursor` is no longer valid.
- `resumeCursor` is opaque — supply it unmodified.

***

### Sortlist Agency Database Output Fields

```json
{
  "agency_id": "d3eba836-6623-406e-9361-0662342ac2ba",
  "name": "VIERLESS GmbH",
  "slug": "vierless-gmbh",
  "tagline": "Achieve more.",
  "website": "https://vierless.de/",
  "profile_url": "https://www.sortlist.com/agency/vierless-gmbh",
  "team_size": 10,
  "budget_min": 100,
  "budget_max": 1000000,
  "registration_number": "HRB 94530",
  "registration_country": "DE",
  "founded_languages": ["de", "en"],
  "hq_address": "Düsseldorf, Germany",
  "services": [
    { "expertise_id": 66, "expertise_name": "Website Creation", "works_count": 62 },
    { "expertise_id": 79, "expertise_name": "SEO", "works_count": 62 }
  ],
  "sectors": ["Marketing & Advertising", "Software & Computer Services", "Real Estate"],
  "works_count": 62,
  "reviews_count": 31,
  "reviews_rating_total": 30.9375,
  "score": 0,
  "is_top_awarded": true,
  "verified": true,
  "claimed": true,
  "trusted_partner": true,
  "paid_member": true,
  "sponsored": true,
  "plan": "value_based",
  "listing_expertise": "wordpress-development",
  "listing_location": "global",
  "listing_section": "organic",
  "listing_position": 0,
  "source": "sortlist.com",
  "scraped_at": "2026-08-21T13:00:00.000Z"
}
```

| Field | Type | Description |
|-------|------|--------------|
| `agency_id` | string | Stable Sortlist agency UUID — the dedupe key. |
| `name` | string | Agency name. |
| `slug` | string | Agency's Sortlist profile slug. |
| `tagline` | string | Short agency tagline. |
| `description` / `description_text` | string | Long-form agency description, raw HTML and stripped text. |
| `website` | string | Agency's own website URL. |
| `logo_url` | string | Agency logo image URL. |
| `profile_url` | string | Canonical Sortlist agency profile URL. |
| `team_size` | integer | Reported team size. |
| `budget_min` / `budget_max` | integer | Minimum and maximum project budget the agency accepts. |
| `registration_number` | string | Company registration / VAT number. |
| `registration_country` | string | ISO 3166-1 country of the registration number. |
| `founded_languages` | array | Working languages of the agency. |
| `hq_address` / `hq_address_localized` | string / object | Headquarters address in English, plus every locale variant. |
| `offices` | array | Every office the agency lists, English address plus localized sibling. |
| `services` | array | Per-service breakdown: `{ expertise_id, expertise_name, works_count }`. |
| `sectors` / `sectors_localized` | array | Industry sectors the agency claims. |
| `works_count` | integer | Published portfolio case studies. |
| `reviews_count` / `reviews_rating_total` | integer / number | Review count and summed star score (divide for the average). |
| `recent_recommended_reviews_count` | integer | Recent reviews marked recommended. |
| `score` | number | Sortlist's internal ranking score. |
| `awards` | array | Awards won: `{ name, category, won_at }`. |
| `is_top_awarded` / `verified` / `claimed` / `trusted_partner` | boolean | Trust and status flags. |
| `paid_member` / `sponsored` / `plan` | boolean / boolean / string | Commercial-relationship flags and subscription tier. |
| `listing_expertise` | string | Category slug this row was first discovered on. |
| `listing_location` | string | Always `global` — categories are crawled unfiltered by location. |
| `listing_section` | string | `organic` or `manual` (paid placement). |
| `listing_position` | integer | Rank position on the page this row was first discovered on. |
| `source` / `scraped_at` | string | Source site and scrape timestamp. |

***

### FAQ

#### How do I scrape Sortlist agency data?

Sortlist Agency Directory Scraper needs no account and no API key. Give it one or more
service categories — or leave the field empty — and it returns every agency in those
categories, deduplicated, with full firmographic detail.

#### What data can I get from Sortlist?

Registration number and country, min/max project budget, per-service work counts, reviews,
awards, team size, office addresses, and paid-placement flags — the fields Sortlist's own
rendered cards leave out.

#### Can I filter by service category?

Yes. Pass one or more category slugs (`seo`, `branding`, `web-development`, and 90+ others)
in `expertises`. Leave it empty to crawl the full taxonomy in one run.

#### How much does Sortlist Agency Directory Scraper cost to run?

Pricing follows Apify's pay-per-event model — you're charged per agency record saved. Check
the Pricing tab on this actor's page for the current per-record rate.

#### Does the data include which listings are paid placements?

Yes. `paid_member`, `sponsored`, and `listing_section` are on every record, so you can
separate Sortlist's sponsored placements from its organic ranking.

***

### Need More Features?

Need custom fields, filters, or a different target site? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use Sortlist Agency Directory Scraper?

- **Fields the cards don't show** — registration number, ISO country, and integer budget
  bounds turn a listing into a legal-entity-resolvable, budget-filterable dataset.
- **Deduplicated by design** — an agency tagged under ten categories still costs you one row,
  not ten, because dedup happens before anything is saved.
- **Paid placements marked, not hidden** — `paid_member`/`sponsored`/`plan` are on every
  record, so organic ranking is something you can actually read off the data.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `resumeCursor` (type: `string`):

Leave empty for a fresh crawl. To CONTINUE a previous run where it stopped — without paying again for records you already received — paste the `resumeCursor` value from that run's Output (the run's OUTPUT key). Resume promptly: the previous run's data expires with your account's retention window (free tier: your ~10 most recent runs).

## `expertises` (type: `array`):

Sortlist service categories to crawl (e.g. seo, web-development, branding). Each category's directory page already returns Sortlist's full global agency listing for that service, deduplicated on the agency's stable external\_id across categories. Leave empty to crawl all 90+ categories (the full corpus).

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

Maximum number of unique agencies to scrape (deduplicated across all requested categories).

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "expertises": [],
  "maxItems": 50
}
```

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "expertises": [],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/sortlist-agency-directory-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "expertises": [],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/sortlist-agency-directory-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "expertises": [],
  "maxItems": 50
}' |
apify call jungle_synthesizer/sortlist-agency-directory-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/sortlist-agency-directory-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/6HfX652fGLq5dph0X/builds/SNlbXVcOjVhAeWbZD/openapi.json
