# Dribbble Shots Scraper (`codingfrontend/dribbble-shots-scraper`) Actor

A fast, high-performance scraper built for lead generation, competitor analysis, and business intelligence. Extracts detailed business profiles, including name, contact details, emails, phone numbers, location, ratings, and reviews from Dribbble Shots. Supports custom search URLs, proxy rotation,...

- **URL**: https://apify.com/codingfrontend/dribbble-shots-scraper.md
- **Developed by:** [Coding Frontned](https://apify.com/codingfrontend) (community)
- **Categories:** Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 122 total users, 16 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 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.

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

## Dribbble Shots Scraper

Extract normalized shot cards from Dribbble's public keyword-search pages with bounded HTTP requests. The Actor does not log in, solve challenges, or use private APIs.

### Input

| Field | Default | Behavior |
|---|---:|---|
| `query` | required | 1–120 character public search query |
| `sort` | `popular` | `popular`, `recent`, `views`, or `latest` |
| `maxItems` | `48` | 1–500 shots; up to 48 source cards per page |
| `proxyConfiguration` | direct | Optional Apify proxy used for every page |
| `requestTimeoutSecs` | `45` | 10–90 second request timeout |
| `maxRequestRetries` | `2` | 0–3 transient-request retries |
| `requestDelayMs` | `1500` | 0–5,000 ms between pages |
| `saveDebugHtml` | `false` | Opt in to a bounded HTML sample only for unrecognized parser drift |

```json
{
  "query": "ui design",
  "sort": "popular",
  "maxItems": 24,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### Dataset

The dataset contains shot rows only. Every row requires a stable shot ID, source-backed title, canonical Dribbble URL, rank, query, animation/Pro flags, and timestamp. Optional designer, count text, tags, colors, and thumbnail fields are emitted only when the card exposes them.

```json
{
  "rank": 1,
  "shotId": "123456789",
  "shotTitle": "Example Mobile Interface",
  "shotUrl": "https://dribbble.com/shots/123456789-example-shot",
  "designerName": "Example Designer",
  "designerUrl": "https://dribbble.com/exampledesigner",
  "viewCountText": "1.2k",
  "likeCountText": "320",
  "thumbnail": "https://cdn.dribbble.com/example.png",
  "isPro": false,
  "isAnimated": false,
  "searchQuery": "ui design",
  "scrapedAt": "2026-08-31T00:00:00.000Z"
}
```

### Truthful completion

`OUTPUT` reports whether rows were found, whether an explicit empty state was verified, page and duplicate counts, and sanitized failures. CAPTCHA, AWS WAF, HTTP access failures, redirects, parser drift, and later-page failures stop the run without publishing partial rows. Diagnostic records are never mixed into the shot dataset.

During the August 31, 2026 QA validation, both direct and Residential requests returned Dribbble's AWS WAF interstitial. The Actor now recognizes that HTML and fails explicitly as `waf`; it does not attempt to bypass the challenge. Public extraction will resume automatically when Dribbble serves normal shot-card HTML to the configured route.

# Actor input Schema

## `query` (type: `string`):

Search keyword for public Dribbble shots (for example, mobile app, branding, or typography).

## `sort` (type: `string`):

Sort order for the public search results.

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

Maximum number of public shot records to collect.

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

Optional Apify proxy settings for the public request. The Actor does not bypass access controls or challenges.

## `requestTimeoutSecs` (type: `integer`):

Timeout for each bounded public search-page request.

## `maxRequestRetries` (type: `integer`):

Retries for transient HTTP failures before the run fails closed.

## `requestDelayMs` (type: `integer`):

Pacing delay between consecutive public result pages.

## `saveDebugHtml` (type: `boolean`):

Opt in to storing a bounded HTML sample only for parser drift without a recognized access boundary.

## Actor input object example

```json
{
  "query": "ui design",
  "sort": "popular",
  "maxItems": 48,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "requestTimeoutSecs": 45,
  "maxRequestRetries": 2,
  "requestDelayMs": 1500,
  "saveDebugHtml": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `output` (type: `string`):

No description

## `debugHtml` (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 = {
    "query": "ui design",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("codingfrontend/dribbble-shots-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 = {
    "query": "ui design",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("codingfrontend/dribbble-shots-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 '{
  "query": "ui design",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call codingfrontend/dribbble-shots-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,codingfrontend/dribbble-shots-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/6jmKIVXc2FMjQ9xXC/builds/l5RYchvsK4cIWnXKf/openapi.json
