# 99designs Designer Portfolio & Stats Finder (`xyrelith-data/99designs-designer-portfolio-and-stats-finder`) Actor

Browse 99designs designer profiles by keyword and category, or fetch specific designers by URL or ID, with experience level, portfolio stats, and contest record.

- **URL**: https://apify.com/xyrelith-data/99designs-designer-portfolio-and-stats-finder.md
- **Developed by:** [Xyrelith Data](https://apify.com/xyrelith-data) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## 99designs Designer Portfolio & Stats Finder

Find designers on 99designs and pull their public track record into a clean dataset. Search the designer directory by keyword, design category, experience level, language, industry or certification — or open exact profiles by URL, slug or numeric ID.

Every designer record carries their identity, tier, portfolio and contest statistics, client reviews, availability, languages, certifications, responsiveness score and a slice of their portfolio. No 99designs account, API key or proxy setup is needed.

### What you can do

- **Search the directory** by keyword and up to five filter families: 80 design categories, 3 experience levels, 11 languages, 43 industries and 12 certifications. Filters combine.
- **Open exact profiles** from profile URLs, slugs (`/profiles/ludibes`), numeric IDs (`2157566`) or subpage URLs — duplicates are removed and unreadable profiles are skipped.
- **Compare designers** on contests won, runner-up placements, 1-to-1 projects, repeat clients, total designs, total likes and review rating.
- **See who is available** for work, who is online in search results, and how responsive each designer is.
- **Collect portfolios** — up to 100 designs per designer with image, likes, date, industry and link.
- **Choose depth** — turn off full-profile details for a fast, lightweight search dataset, and set the portfolio size from 0 to 100.

### Output per designer

| Field | Meaning |
|---|---|
| `profileId` | Numeric 99designs profile ID |
| `username` | Profile slug, when the profile has one |
| `name` | Display name |
| `level` | `Top Level`, `Mid Level` or `Entry Level` |
| `country` | Country the designer lists (omitted when not filled in) |
| `bio` | Public about text |
| `memberSince` | Join date as shown on the profile |
| `totalDesigns` | Portfolio size |
| `totalLikes` | Likes across the portfolio |
| `reviewRating` | Average client rating (omitted when there are no reviews) |
| `reviewCount` | Number of client reviews |
| `contestsWon`, `runnerUp` | Contest record |
| `projectsCompleted`, `repeatClients` | 1-to-1 project history |
| `expertiseCategories` | Design category slugs |
| `languages` | Languages the designer lists |
| `certifications` | 99designs certifications held |
| `responsivenessScore` | 0–100 response score, when published |
| `avatarUrl`, `coverImageUrl` | Profile and cover images |
| `isAvailable` | Available for work |
| `isOnline` | Online in search results (search mode only) |
| `portfolioDesigns` | Designs with `designId`, `title`, `imageUrl`, `likes`, `createdAt`, `category`, `industry`, `url` |
| `url` | Direct profile link |
| `recordType`, `scrapedAt` | Record marker and ISO 8601 UTC timestamp |

Empty fields are omitted rather than written as `null`.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `browse` | `browse` searches the directory; `profiles` opens exact designers |
| `searchQuery` | string | – | Keyword for skills and portfolio work (mode=`browse`) |
| `categories` | array | `[]` | One or more of 80 design categories |
| `designerLevels` | array | `[]` | `TOP`, `MID`, `ENTRY` |
| `languages` | array | `[]` | `zh`, `nl`, `en`, `fr`, `de`, `id`, `it`, `ja`, `ko`, `pt`, `es` |
| `industries` | array | `[]` | One or more of 43 industries |
| `certifications` | array | `[]` | One or more of 12 certifications |
| `profileUrls` | array | `[]` | Profile URLs, slugs, numeric IDs or subpage URLs (mode=`profiles`) |
| `maxItems` | integer | `20` | 1–1000 designers to return |
| `includeProfileDetails` | boolean | `true` | Open each search result for bio, stats and portfolio. Off = fast search-only records |
| `maxDesignsPerProfile` | integer | `12` | 0–100 portfolio designs per designer; above 12 adds requests |

### Examples

#### Search logo designers

```json
{
  "mode": "browse",
  "searchQuery": "logo",
  "categories": ["logo-design", "logo"],
  "maxItems": 50
}
```

#### Top-level Japanese-speaking t-shirt designers

```json
{
  "mode": "browse",
  "categories": ["t-shirt-design"],
  "designerLevels": ["TOP"],
  "languages": ["ja"],
  "maxItems": 100
}
```

#### Fast search-only records

```json
{
  "mode": "browse",
  "searchQuery": "packaging",
  "includeProfileDetails": false,
  "maxDesignsPerProfile": 3,
  "maxItems": 500
}
```

#### Exact designers by URL, slug and ID

```json
{
  "mode": "profiles",
  "profileUrls": [
    "https://99designs.com/profiles/2157566",
    "ludibes",
    "1022535",
    "https://99designs.com/profiles/gotza/designs/2400998"
  ],
  "maxDesignsPerProfile": 24
}
```

### Use cases

- **Designer sourcing** — shortlist designers by category, level and language, then compare contest records and repeat-client counts.
- **Vendor vetting** — open a known profile and check its rating, availability and portfolio before inviting it to a project.
- **Market research** — measure how many designers work in a category, industry or certification, and compare portfolio depth.
- **Portfolio tracking** — re-scrape a saved list of designers to follow new designs, likes and review growth over time.

### FAQ

**Do I need a 99designs account, login or API key?**
No. The actor reads public designer pages and directory results only. There is nothing to configure and no proxy setup.

**How many designers can one search return?**
This actor returns up to 1,000 designers per run. 99designs itself caps a single search at 10,000 results. If you need more, split the work by category, level, language, industry or certification and combine the datasets. Broad keyword searches can also repeat some results; the actor removes duplicates.

**Why is `country` missing for many designers?**
Country is optional on 99designs. Only designers who filled it in have it, so it is omitted for the rest instead of guessed.

**Why do some designers have no rating or review count?**
New or low-review designers may not show a public rating yet. Those fields are omitted; all other available fields are still returned.

**Why is `isOnline` missing in profiles mode?**
Online status is only exposed in directory search results. Search mode fills it; opening an exact profile does not.

**How many portfolio designs do I get?**
12 by default, configurable from 0 to 100. A designer with fewer designs returns what exists.

**What does `responsivenessScore` mean?**
It is 99designs' public 0–100 responsiveness indicator for the designer. It is omitted when the site does not publish one.

**Are contests included?**
This actor focuses on designers and their profile data. Contest listings are a separate entity and are not part of this dataset.

**Can I use an old saved task?**
Yes. Existing `mode`, `searchQuery`, `profileUrls` and `maxItems` inputs keep working, and old single-category inputs are still accepted and mapped to the new category filter.

**Is this affiliated with 99designs?**
No. This is an independent third-party tool and is not operated by or affiliated with 99designs.

# Actor input Schema

## `mode` (type: `string`):

Search the directory, or read specific designer profiles.

## `searchQuery` (type: `string`):

Keyword to match designer skills and portfolios (mode=browse). Leave empty to browse all designers.

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

Only include designers who work in these design categories (mode=browse). Leave empty for every category.

## `designerLevels` (type: `array`):

Only include designers at these experience levels (mode=browse). Leave empty for all levels.

## `languages` (type: `array`):

Only include designers who speak these languages (mode=browse). Leave empty for all languages.

## `industries` (type: `array`):

Only include designers with portfolio work in these industries (mode=browse). Leave empty for every industry.

## `certifications` (type: `array`):

Only include designers who hold these 99designs certifications (mode=browse). Leave empty for all certifications.

## `profileUrls` (type: `array`):

Designer profile URLs, slugs or numeric IDs (mode=profiles). Subpage URLs are accepted and reduced to the profile.

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

Maximum number of designers to return (1–1000 per run). 99designs caps a single search at 10,000 results; split broad searches by category, level, language, industry or certification.

## `includeProfileDetails` (type: `boolean`):

When on, each search result is opened to add bio, country, stats, languages, certifications, availability and portfolio. Turn off for faster, lighter search-only records.

## `maxDesignsPerProfile` (type: `integer`):

How many portfolio designs to include per designer (0–100). 0 leaves the portfolio out; more than 12 adds extra requests.

## Actor input object example

```json
{
  "mode": "browse",
  "searchQuery": "logo",
  "categories": [],
  "designerLevels": [],
  "languages": [],
  "industries": [],
  "certifications": [],
  "profileUrls": [],
  "maxItems": 1,
  "includeProfileDetails": true,
  "maxDesignsPerProfile": 12
}
```

# Actor output Schema

## `designers` (type: `string`):

Dataset containing all scraped 99designs designer profiles.

# 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 = {
    "mode": "browse",
    "searchQuery": "logo",
    "categories": [],
    "designerLevels": [],
    "languages": [],
    "industries": [],
    "certifications": [],
    "profileUrls": [],
    "maxItems": 1,
    "includeProfileDetails": true,
    "maxDesignsPerProfile": 12
};

// Run the Actor and wait for it to finish
const run = await client.actor("xyrelith-data/99designs-designer-portfolio-and-stats-finder").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 = {
    "mode": "browse",
    "searchQuery": "logo",
    "categories": [],
    "designerLevels": [],
    "languages": [],
    "industries": [],
    "certifications": [],
    "profileUrls": [],
    "maxItems": 1,
    "includeProfileDetails": True,
    "maxDesignsPerProfile": 12,
}

# Run the Actor and wait for it to finish
run = client.actor("xyrelith-data/99designs-designer-portfolio-and-stats-finder").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 '{
  "mode": "browse",
  "searchQuery": "logo",
  "categories": [],
  "designerLevels": [],
  "languages": [],
  "industries": [],
  "certifications": [],
  "profileUrls": [],
  "maxItems": 1,
  "includeProfileDetails": true,
  "maxDesignsPerProfile": 12
}' |
apify call xyrelith-data/99designs-designer-portfolio-and-stats-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,xyrelith-data/99designs-designer-portfolio-and-stats-finder"
        }
    }
}
```

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/xMbLYZK0HsLPDk2xn/builds/NxtRxcaaBWBJ2HayS/openapi.json
