# Adobe Stock Scraper & Keyword Research (`babymum7/adobe-stock-scraper`) Actor

Adobe Stock search and contributor data with downloads, views and keywords. Keyword reports for stock contributors, and only new assets on a schedule.

- **URL**: https://apify.com/babymum7/adobe-stock-scraper.md
- **Developed by:** [Trong Nguyen](https://apify.com/babymum7) (community)
- **Categories:** For creators, SEO tools, Marketing
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.25 / 1,000 assets

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

## Adobe Stock Scraper & Keyword Research

Find out what sells on Adobe Stock. Search any keyword or contributor portfolio and get every result with its downloads, views, keywords, upload date and AI label, or one keyword report per search that tells you how crowded the niche is and how much its top sells. Put it on a schedule and each run returns only what is new.

Adobe Stock shows how often an asset was downloaded, but only one asset page at a time. Comparing niches, reading a competitor's portfolio or spotting what started selling this month means hundreds of clicks. This Actor turns a search into a table you can sort, filter and chart.

### Who uses it

- **Stock contributors** pick their next shoot or AI series from keywords where demand is high and competition is thin, copy the keyword sets of best sellers, and see whether new work still reaches the top.
- **AI image creators** compare how AI-generated and human-made work sell in each niche before they spend credits on a series.
- **Designers and agencies** collect the best-selling visuals for a theme as a mood board or a brief.
- **Market researchers** track which visual themes rise before a season and how fast a niche fills up.

### Why a monitor instead of re-scraping

Following the 500 best sellers of 20 keywords every week, at the same price per asset:

| | Re-scrape every week | This Actor with Only new assets |
| --- | --- | --- |
| Rows you pay for each week | 10,000 | Only the assets that entered the top since last week |
| Cost over a month | about $16 | $4 for the first run, then cents (if 10 assets a week enter each top 500: $0.08 a week) |
| What changed | You compare the lists yourself | Every row is new, marked `isNew: true` |

### What you get

- Every asset of a keyword search or a contributor portfolio, up to 10,000 per search, in the order you choose: most downloaded, relevance, newest, featured or undiscovered
- Downloads and views of each asset, as Adobe Stock counts them
- All keywords in the contributor's order, title, category, content type and the generative AI label
- Contributor name, ID and country, upload date, size, video length, premium and editorial flags
- Thumbnail and watermarked preview links, and the link to the asset page
- A keyword report per search: total results, downloads of the top 100 (sum, median, best seller), share of AI-generated and of recent uploads in the top 100, the 15 most used keywords and the 3 best sellers
- Results in JSON, CSV, Excel or HTML, through the API, or sent on to Google Sheets, Make, Zapier or n8n

### How to find best-selling Adobe Stock keywords

1. In **Keywords or contributors**, type one search per line: `christmas background`, `coffee shop interior`, or a contributor link such as `https://stock.adobe.com/contributor/200792199/masson`.
2. In **What to get**, pick **Keyword report** to compare niches, or **Assets** for every result.
3. Optional: limit **Content type** (photos, vectors, videos...) or **AI-generated content**.
4. Click **Start**. Sort the keyword reports by median downloads against total results to find niches where few assets sell a lot.
5. To follow a niche or a competitor, switch to **Assets**, turn on **Only new assets** and add a schedule. Each run returns only what is new in that search.

### Examples

#### 1. Compare niches before your next series

```json
{
  "searches": ["christmas background", "halloween", "business meeting", "coffee"],
  "mode": "keywordReport"
}
```

One row per keyword. A high median download count with a high recent share means buyers still pick up new work there. Cost: 4 reports, $0.02.

#### 2. Read a competitor's portfolio by best sellers

```json
{
  "searches": ["https://stock.adobe.com/contributor/200792199/masson"],
  "sort": "downloads",
  "maxItemsPerSearch": 500,
  "onlyNewItems": false
}
```

The contributor's 500 most downloaded assets with keywords and upload dates. Cost: $0.20.

#### 3. A weekly alert for new AI best sellers in your niche

```json
{
  "searches": ["watercolor flowers", "boho wedding"],
  "contentType": "illustration",
  "aiContent": "only",
  "sort": "downloads",
  "maxItemsPerSearch": 300,
  "onlyNewItems": true
}
```

The first run saves the top 300 of each search. Scheduled weekly, each run returns only the AI illustrations that climbed into the top 300 since the week before. Cost: $0.24 for the first run, then a few cents.

### Input

| Field | What it does |
| --- | --- |
| `searches` | Keywords or contributors, one per line. A contributor is a `stock.adobe.com/contributor/<id>/...` link or the numeric ID. |
| `mode` | `assets` (default): one row per asset. `keywordReport`: one summary row per search, from its top 100 by downloads. |
| `sort` | `downloads` (default), `relevance`, `newest`, `featured` or `undiscovered`. |
| `contentType` | `all` (default), `photo`, `illustration`, `vector`, `video`, `template` or `3d`. |
| `aiContent` | `all` (default), `only` or `exclude` assets labeled as generative AI. |
| `maxItemsPerSearch` | Results per search, 1 to 10,000 (default 100). |
| `onlyNewItems` | On (default through the API): later runs return only assets the same search did not return before. In the Console form it starts off; turn it on before you schedule. |

### Output

An asset row:

```json
{
  "isNew": false,
  "source": "coffee",
  "position": 1,
  "assetId": 77798324,
  "title": "Cup and gift box on wooden background",
  "url": "https://stock.adobe.com/77798324",
  "contentType": "photo",
  "isAi": false,
  "isPremium": false,
  "isEditorial": false,
  "downloads": 17571,
  "views": 16168,
  "keywords": ["holiday", "gift", "valentine", "christmas", "hot drink", "drink", "cappuccino"],
  "category": "Valentine's Day",
  "creatorId": 200792199,
  "creatorName": "Masson",
  "country": "Ukraine",
  "width": 5616,
  "height": 3744,
  "durationSecs": null,
  "createdAt": "2015-02-08T11:52:23",
  "thumbnailUrl": "https://as2.ftcdn.net/v2/jpg/00/77/79/83/500_F_77798324_Tk1ioMJeacRvOWQEErmPZiQOta231GxL.jpg",
  "previewUrl": "https://stock.adobe.com/Rest/Libraries/Watermarked/Download/77798324/2"
}
```

A keyword report row has `keyword`, `searchType`, `totalResults`, `assetsChecked`, `topDownloadsSum`, `topDownloadsMedian`, `topDownloadsMax`, `aiShareTop100`, `recentShareTop100`, `topKeywords` and `topAssets`. Every run also saves a `SUMMARY` record with the total results of each search and any search that failed.

### How "new" is decided

Each search remembers the assets it returned, separately for every filter and sort you use. A later run with **Only new assets** on returns the assets that search did not return before, marked `isNew: true`. With **Newest** that means assets that just went live on Adobe Stock. Adobe lists them in the order it publishes them, so an asset uploaded a few weeks ago shows up once it passes review, and its `createdAt` is the upload date. A broad keyword gets thousands of these a day ("christmas" got about 3,700 in four hours in November), so for a broad term raise **Max items per search** or search something narrower. With **Most downloaded** it means assets that climbed into the top results since the last run, which is the signal of something starting to sell. Adobe Stock returns the same order for the same search, so a new row is a real change, not a reshuffle.

The first run of a search is the baseline: it returns the results with `isNew: false`. A run with **Only new assets** off returns everything and leaves the memory of your scheduled runs as it is.

### Pricing

Pay per result, no subscription:

| Event | Free plan | Bronze | Silver | Gold and up |
| --- | --- | --- | --- | --- |
| Asset row | $0.40 per 1,000 | $0.35 per 1,000 | $0.30 per 1,000 | $0.25 per 1,000 |
| Keyword report | $0.005 per keyword | $0.005 | $0.005 | $0.005 |

A run that finds nothing new costs nothing. Set a maximum cost per run in the run options and the Actor stops at it.

### FAQ

**How accurate are the download counts?**
They are the counts Adobe Stock itself reports for each asset. They are not sales in dollars, but they rank assets by how often buyers licensed them.

**Can I see what a specific contributor sells best?**
Yes. Paste their portfolio link or ID and sort by downloads. The contributor ID of any asset is in the `creatorId` field.

**How many results can one search return?**
Up to 10,000, the most Adobe Stock serves for one search. Narrow it with content type, AI filter or a more specific keyword to reach deeper.

**Does it download the images?**
No. It returns the thumbnail and watermarked preview links and the asset page link. Licensing an asset stays on Adobe Stock.

**Can I run it on a schedule or from my tools?**
Yes. Save your input as a task, add a schedule in Apify Console, and connect the dataset to Google Sheets, Make, Zapier or n8n, or call it from the Apify API.

**What happens when Adobe Stock has an outage?**
Each request is retried on fresh IPs. A search that still fails is listed in the run's status and `SUMMARY`, not charged, and the next search goes on. A run where every search failed ends as failed, so your schedule shows it.

# Actor input Schema

## `searches` (type: `array`):

One per line: a keyword or phrase (coffee shop, christmas background), or a contributor's portfolio link (stock.adobe.com/contributor/...) or ID. Each line is its own search.

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

Assets returns every result with its downloads, views, keywords and dates. Keyword report reads the top 100 by downloads for each search and returns one row: how many results compete, how much the top sells, and how much of the top is recent or AI-made.

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

The order Adobe Stock returns results in. Most downloaded shows what sells; Newest shows what was just uploaded. Keyword reports always use Most downloaded.

## `contentType` (type: `string`):

Limit results to one kind of asset.

## `aiContent` (type: `string`):

Adobe Stock labels assets made with generative AI. Pick Only to study the AI market, or Exclude to see what human-made work sells.

## `maxItemsPerSearch` (type: `integer`):

How many results to read for each keyword or contributor, up to 10,000 (Adobe Stock's limit for one search). Ignored for keyword reports, which read the top 100.

## `onlyNewItems` (type: `boolean`):

On: the first run returns the results and remembers them, and every run after that returns only assets the same search did not return before. With Newest that means fresh uploads; with Most downloaded, assets that climbed into the top. Turn it on for a daily or weekly schedule. Off: every run returns all results, and the memory a scheduled run relies on is left as it is.

## Actor input object example

```json
{
  "searches": [
    "coffee",
    "https://stock.adobe.com/contributor/200792199/masson"
  ],
  "mode": "assets",
  "sort": "downloads",
  "contentType": "all",
  "aiContent": "all",
  "maxItemsPerSearch": 20,
  "onlyNewItems": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "searches": [
        "coffee",
        "https://stock.adobe.com/contributor/200792199/masson"
    ],
    "maxItemsPerSearch": 20,
    "onlyNewItems": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("babymum7/adobe-stock-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 = {
    "searches": [
        "coffee",
        "https://stock.adobe.com/contributor/200792199/masson",
    ],
    "maxItemsPerSearch": 20,
    "onlyNewItems": False,
}

# Run the Actor and wait for it to finish
run = client.actor("babymum7/adobe-stock-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 '{
  "searches": [
    "coffee",
    "https://stock.adobe.com/contributor/200792199/masson"
  ],
  "maxItemsPerSearch": 20,
  "onlyNewItems": false
}' |
apify call babymum7/adobe-stock-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,babymum7/adobe-stock-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/7Qs8n4bbSGxuNuS1I/builds/bbBuPly7GEfIMG1wZ/openapi.json
