# DeviantArt Email Scraper (`maximedupre/deviantart-scraper`) Actor

Scrape public DeviantArt artwork from searches, galleries, popular feeds, or known artwork pages. Export links, titles, images, creator details, dates, and visible contact data. Find visible creator emails with location or domain filters.

- **URL**: https://apify.com/maximedupre/deviantart-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Lead generation
- **Features:** Limited permissions
- **Stats:** 237 total users, 24 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.70 / 1,000 artwork/contacts

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?

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

### 🎨 DeviantArt artwork and creator data

Artists, researchers, creative teams, recruiters, and developers can use DeviantArt Scraper to collect public [DeviantArt](https://www.deviantart.com/) artwork and visible creator contact data. It saves source links, titles, images, creator details, dates, and contact fields in an Apify dataset, so you can review or export the data in one place.

- Search public DeviantArt artwork by keyword or URL with **[DeviantArt Search Scraper](https://apify.com/maximedupre/deviantart-scraper/examples/deviantart-search-scraper)**.
- Collect public artwork from a creator target with **[DeviantArt Gallery Scraper](https://apify.com/maximedupre/deviantart-scraper/examples/deviantart-gallery-scraper)**.
- Read one known artwork page with **[DeviantArt Artwork Scraper](https://apify.com/maximedupre/deviantart-scraper/examples/deviantart-artwork-scraper)**.
- Find visible creator emails with **[DeviantArt Email Scraper](https://apify.com/maximedupre/deviantart-scraper/examples/deviantart-email-scraper)**.
- Collect public DeviantArt data in one run with **[DeviantArt Scraper](https://apify.com/maximedupre/deviantart-scraper/examples/deviantart-scraper)**.

#### 📦 See artwork and creator fields

**Returned data**

Each row can keep the submitted target, a useful rank, artwork identity, source links, titles, descriptions, dates, categories, image and thumbnail URLs, creator fields, and visible contact fields. Email-lead rows can fill `emails`, `emailDomains`, and `profileBio` when the source exposes them. Missing values stay `null` or empty arrays. Diagnostics are not saved as result rows.

The Actor reads public DeviantArt data only. It does not collect private, login-only, mature-gated, paywalled, or unavailable content. It returns public image and thumbnail URLs, not downloaded image files.

#### ▶️ Run one collection mode

**Run setup**

Choose one `sourceType` for each run. Use same-kind targets for artwork search, gallery or profile artwork, and public email leads. Popular or trending artwork can run with no targets when you use the category filter.

**A small first check**

Keep the prefilled `fantasy art` target and set a smaller `maxItems` when you want to inspect a short sample. You do not need a DeviantArt login, cookies, API key, or browser setup from your side.

**Source limits**

Public source availability, filters, repeated source items, and unavailable pages can make a run finish with fewer rows than the limit. The Actor keeps the first eligible occurrence of a source item and ignores later matches for that same item. Empty or invalid targets are handled without saving error rows.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `sourceType` | Choice string | Select artwork search, gallery or profile artwork, popular or trending artwork, or public email leads for this run. |
| `targets` | Array of strings | Add search terms, search URLs, creator or profile targets, exact artwork URLs, or email-lead queries. Use it for artwork search, gallery, and email-lead runs. It can be empty for popular or trending artwork. |
| `maxItems` | Integer | Stop after this many saved rows. Leave it empty to return all available results until the public source is exhausted. |
| `category` | Choice string | Filter artwork search or popular or trending artwork by a supported category. It does not change gallery or email-lead runs, and the output field is filled only when DeviantArt exposes a category. |
| `location` | String | For public email leads, add a place, topic, style, or niche. Leave it empty for other targets. |
| `emailDomains` | Array of strings | For public email leads, keep visible email addresses from these domains. Leave it empty for other targets. |

**Target rules**

`targets` accepts plain search terms, DeviantArt search URLs, profile or gallery targets, handles, and exact artwork URLs for the selected mode. Use `location` and `emailDomains` mainly with `emailLeads`. The `category` filter applies to `artworkSearch` and `popular`.

**Successful default input**

This is the public input from a successful default-input run:

```json
{
  "sourceType": "artworkSearch",
  "targets": [
    "fantasy art"
  ],
  "maxItems": 300,
  "category": ""
}
```

Leave `maxItems` empty to return all available results until the public source is exhausted. A smaller value can reduce the amount of data you need to review in a first check.

#### 🧾 Output

**Output fields**

All collection modes use the same row shape. The fields below are complete for each saved row.

The public output field `results` opens the saved dataset for inspection or download.

| Field | Type | What it does |
| --- | --- | --- |
| `target` | String | Search term, URL, username, handle, or source label that produced the row. |
| `rank` | Integer or null | 1-based position within the selected target or source when meaningful. |
| `deviationId` | String or null | DeviantArt artwork ID when the source exposes one. |
| `deviationUrl` | String or null | Canonical public DeviantArt artwork URL. |
| `title` | String or null | Artwork title or profile display title when available. |
| `description` | String or null | Artwork description or profile snippet when available. |
| `publishedAt` | String or null | Artwork publication time when DeviantArt exposes it. |
| `category` | String or null | Source-exposed DeviantArt category when available. |
| `imageUrl` | String or null | Public image or preview URL when available. |
| `thumbnailUrl` | String or null | Source thumbnail URL when available. |
| `creatorUsername` | String or null | DeviantArt username for the creator. |
| `creatorName` | String or null | Creator or profile display name when available. |
| `creatorAvatarUrl` | String or null | Creator or profile avatar URL when available. |
| `emails` | Array of strings | Public email addresses found in the row text. |
| `emailDomains` | Array of strings | Normalized domains for public email addresses found in the row. |
| `profileBio` | String or null | Public creator or profile bio text when available. |

**Genuine artwork row**

This complete row is from a successful run. Source media URLs can contain source query parameters.

```json
{
  "target": "fantasy art",
  "rank": 1,
  "deviationId": "861612130",
  "deviationUrl": "https://www.deviantart.com/threeanglework/art/fantasy-Maps-Art-coomiissions-for-steven-861612130",
  "title": "fantasy Maps Art coomiissions for steven",
  "description": "hi guys... sorry for long time i am not update my deviantart",
  "publishedAt": "2020-11-19T02:32:20.000Z",
  "category": null,
  "imageUrl": "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/b0069016-7cd6-4fff-b1ae-242d4172d5b4/de8zc6a-b87e753d-3657-4cf2-af4d-d55043b88486.jpg/v1/fill/w_1024,h_605,q_75,strp/fantasy_maps_art_coomiissions_for_steven_by_threeanglework_de8zc6a-fullview.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9NjA1IiwicGF0aCI6Ii9mL2IwMDY5MDE2LTdjZDYtNGZmZi1iMWFlLTI0MmQ0MTcyZDViNC9kZTh6YzZhLWI4N2U3NTNkLTM2NTctNGNmMi1hZjRkLWQ1NTA0M2I4ODQ4Ni5qcGciLCJ3aWR0aCI6Ijw9MTAyNCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.2N0jaAUQUydCVcQnmmd9ZvmxzBk1ytVnayYXqOD3_vs",
  "thumbnailUrl": "https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/b0069016-7cd6-4fff-b1ae-242d4172d5b4/de8zc6a-b87e753d-3657-4cf2-af4d-d55043b88486.jpg/v1/fit/w_300,h_605,q_70,strp/fantasy_maps_art_coomiissions_for_steven_by_threeanglework_de8zc6a-300w.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwiaXNzIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsIm9iaiI6W1t7ImhlaWdodCI6Ijw9NjA1IiwicGF0aCI6Ii9mL2IwMDY5MDE2LTdjZDYtNGZmZi1iMWFlLTI0MmQ0MTcyZDViNC9kZTh6YzZhLWI4N2U3NTNkLTM2NTctNGNmMi1hZjRkLWQ1NTA0M2I4ODQ4Ni5qcGciLCJ3aWR0aCI6Ijw9MTAyNCJ9XV0sImF1ZCI6WyJ1cm46c2VydmljZTppbWFnZS5vcGVyYXRpb25zIl19.2N0jaAUQUydCVcQnmmd9ZvmxzBk1ytVnayYXqOD3_vs",
  "creatorUsername": "threeanglework",
  "creatorName": "threeanglework",
  "creatorAvatarUrl": "https://a.deviantart.net/avatars/t/h/threeanglework.jpg?12",
  "emails": [],
  "emailDomains": [],
  "profileBio": null
}
```

#### 💳 Pricing

**Saved results**

This Actor uses pay-per-event pricing. Each saved public artwork or creator contact triggers one event charge. Check the Actor Pricing tab for the current tier rates.

#### 🔌 Integrations

**Export and automation**

After a run, inspect the Apify dataset, export it as JSON, CSV, Excel, XML, RSS, or HTML, call it through the Apify API, or use Apify schedules and webhooks.

**Video guide**

https://www.youtube.com/watch?v=bNACk1_S_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Do I need a DeviantArt login or API key?

No. The Actor uses public DeviantArt data and does not ask for a login, cookies, or a buyer-provided API key.

##### Can I use a search URL or an artwork URL?

Yes. Add a DeviantArt search URL or exact artwork URL to `targets` in `artworkSearch` mode. Add a profile or gallery target in `gallery` mode.

##### Is this a DeviantArt downloader?

It is not a DeviantArt image downloader that saves files. It returns public image and thumbnail URLs with artwork and creator fields, but it does not download or store image files.

##### Can I use several targets in one run?

Yes. Add same-kind targets for the selected mode. One run uses one `sourceType`, and each row keeps the target that produced it.

##### Why are some fields null or empty?

Public DeviantArt pages do not expose every description, category, date, avatar, or contact field. The Actor keeps unavailable values empty instead of guessing.

##### Can I collect public creator emails?

Yes, when an email is visible in the source text. Use `emailLeads`, add a location or niche, and set `emailDomains` to focus the public contact rows. The Actor does not verify email deliverability.

### 📝 Changelog

**v0.0**

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~deviantart-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Behance Dribbble Scraper](https://apify.com/maximedupre/behance-dribbble-scraper) - Compare DeviantArt finds with public Behance projects and Dribbble shots from designer profiles.
- [Unsplash Image Scraper](https://apify.com/maximedupre/unsplash-image-scraper) - Collect public Unsplash image search results for visual research alongside DeviantArt artwork.
- [Web Images Scraper](https://apify.com/maximedupre/web-images-scraper) - Extract image URLs from public pages when you need media discovery beyond DeviantArt.
- [DeviantArt Search Scraper](https://apify.com/powerai/deviantart-search-scraper) - Search public DeviantArt artwork for titles, artist details, thumbnails, and direct links.
- [DeviantArt Scraper](https://apify.com/solidcode/deviantart-scraper) - Collect DeviantArt deviations from search, tag, and gallery pages with artwork details.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `sourceType` (type: `string`):

Choose what to collect in this run.

## `location` (type: `string`):

For public email leads, focus results with a place, topic, style, or niche. Leave this empty for other targets.

## `emailDomains` (type: `array`):

For public email leads, keep only visible email addresses from these domains. Leave this empty for other targets.

## `targets` (type: `array`):

Add one or more search terms, search URLs, creator or profile targets, exact artwork URLs, or email-lead queries. Use these values for artwork search, gallery, and public email lead runs. Leave this empty for popular or trending artwork.

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

Stop after this many saved rows. Leave it empty to return all available results until the public source is exhausted.

## `category` (type: `string`):

Choose a category for artwork search or popular or trending artwork. It does not change gallery or public email lead runs.

## Actor input object example

```json
{
  "sourceType": "artworkSearch",
  "targets": [
    "fantasy art"
  ],
  "maxItems": 300,
  "category": ""
}
```

# Actor output Schema

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

Download or inspect the saved DeviantArt results.

# 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 = {
    "sourceType": "artworkSearch",
    "targets": [
        "fantasy art"
    ],
    "maxItems": 300,
    "category": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/deviantart-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 = {
    "sourceType": "artworkSearch",
    "targets": ["fantasy art"],
    "maxItems": 300,
    "category": "",
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/deviantart-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 '{
  "sourceType": "artworkSearch",
  "targets": [
    "fantasy art"
  ],
  "maxItems": 300,
  "category": ""
}' |
apify call maximedupre/deviantart-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/deviantart-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/govevuq4JGxsHgk7b/builds/LEf2nmDy7Ql15FrKJ/openapi.json
