# Adobe Stock Scraper, Rank Tracker & Portfolio Monitor (`suerte_enero/suerte-adobe-stock-monitor`) Actor

Track Adobe Stock keyword ranks, contributor portfolios, downloads, views, AI assets, metadata changes, and persistent watchlists. Export clean JSON/CSV for research, alerts, n8n, Make, and scheduled monitoring.

- **URL**: https://apify.com/suerte_enero/suerte-adobe-stock-monitor.md
- **Developed by:** [Eduard Kalyta](https://apify.com/suerte_enero) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 asset processeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Rank Tracker & Portfolio Monitor

**See what moves on Adobe Stock — not just what exists today.**

Track keyword positions, contributor portfolios, Adobe-reported downloads and views, AI-generated assets, and metadata changes across scheduled runs. This Actor combines an Adobe Stock scraper, persistent watchlists, rank tracking, portfolio monitoring, and keyword research in one automation-ready workflow.

Use it to answer questions a one-time export cannot answer:

- Which assets entered or left the first 100 results for a keyword?
- Did my image move from rank 46 to rank 18?
- Which competitor uploaded new work this week?
- Which watched assets gained reported downloads?
- Which keywords appear most often among the strongest results?
- Did a title, keyword list, AI flag, or other tracked field change?

No Adobe login, browser, residential proxy, or paid AI model is required.

### Why use this Actor instead of a regular Adobe Stock scraper?

Most Adobe Stock scrapers create a fresh spreadsheet on every run. You still have to store the old export, join rows by asset ID, calculate rank movements, detect portfolio additions, and prevent duplicate alerts.

This Actor keeps the comparison state for you.

| Capability | One-time Adobe Stock export | This Actor |
|---|---:|---:|
| Search assets by keyword | Yes | Yes |
| Export creator portfolios | Sometimes | Yes |
| Look up exact asset IDs | Sometimes | Yes |
| Downloads, views, keywords and AI flag | Varies | Yes |
| Compare with the previous completed run | No | **Yes** |
| Detect rank movement | No | **Yes** |
| Detect assets entering or leaving a search window | No | **Yes** |
| Keep watching assets after they leave the search results | No | **Yes** |
| Detect new work in a contributor portfolio | Manual | **Yes** |
| Produce stable event IDs for n8n and Make | No | **Yes** |
| Build a keyword opportunity report | Manual | **Yes** |

You can still use it as a fast one-time Adobe Stock scraper. Monitoring becomes active only when you enable comparison and reuse the same monitor name.

### Three workflows you can run immediately

#### 1. Track Adobe Stock keyword rankings

Watch the first 100 results for one or more search phrases. Schedule the same task daily or weekly to receive rank changes, new entrants, and assets that left the tracked window.

```json
{
  "queries": ["minimal workspace", "remote team meeting"],
  "order": "relevance",
  "maxItemsPerSearch": 100,
  "monitor": true,
  "monitorKey": "workspace-keywords"
}
```

On the first run, the Actor creates a baseline. Later runs emit only the differences as `event` records while also returning the current observations.

Typical events:

- `ENTERED_WINDOW` — an asset appeared in the tracked results;
- `LEFT_WINDOW` — an asset moved outside the sampled results;
- `CHANGED` — rank, keywords, title, AI flag, downloads, or views changed.

#### 2. Monitor your own or a competitor's portfolio

Use Adobe Stock contributor IDs to observe portfolio additions and metadata changes.

```json
{
  "creatorIds": ["200792199"],
  "order": "creation",
  "maxItemsPerSearch": 500,
  "monitor": true,
  "monitorKey": "competitor-portfolios"
}
```

This is useful for contributor research, creative trend monitoring, AI-content analysis, and competitor portfolio tracking.

#### 3. Keep a persistent asset watchlist

Search results change. An asset that leaves the first 100 results can no longer be observed by repeating only the search. Persistent watch mode keeps checking discovered asset IDs directly.

```json
{
  "queries": ["healthy breakfast"],
  "order": "nb_downloads",
  "maxItemsPerSearch": 100,
  "monitor": true,
  "monitorKey": "breakfast-watchlist",
  "watchDiscovered": true,
  "maxWatchAssets": 100,
  "maxRequests": 150,
  "maxTotalItems": 500
}
```

Watch mode can emit:

- `WATCH_CHANGED` — a watched asset changed;
- `NOT_RETURNED_BY_ID` — Adobe did not return the watched ID during this observation;
- `RETURNED_BY_ID` — a previously missing ID appeared again.

### What data do you receive?

Asset and watch observations can include:

- Adobe Stock asset ID and source URL;
- title and creator ID/name;
- current rank inside the requested search window;
- Adobe-reported download and view counters;
- keywords;
- generative-AI flag;
- media/content type;
- width and height;
- contributor country;
- creation date;
- Premium level;
- preview URL;
- video duration, frame rate, and preview where available;
- observation timestamp.

The Actor supports photos, illustrations, vectors, videos, templates, 3D assets, and audio. Searches can be filtered by generative-AI status, orientation, Premium status, locale, and content type.

### Change events built for automation

Every comparison event includes a stable `eventId`, asset ID, event type, observation timestamps, and changed fields. Counter changes include previous value, current value, and positive delta.

```json
{
  "recordType": "event",
  "eventId": "stable-id-for-deduplication",
  "type": "CHANGED",
  "assetId": "94143804",
  "changes": {
    "rank": { "before": 46, "after": 18 },
    "observedDownloads": {
      "before": 2979,
      "after": 2985,
      "delta": 6,
      "counterReset": false
    }
  },
  "previousObservedAt": "2026-10-25T08:00:00.000Z",
  "observedAt": "2026-10-26T08:00:00.000Z"
}
```

Connect an Apify `ACTOR.RUN.SUCCEEDED` webhook to n8n, Make, Zapier, Slack, a database, or your own API. Read the run Dataset, keep `recordType = event`, and deduplicate on `eventId`.

Useful automation recipes:

- send a Telegram alert when an asset enters the top 20;
- append portfolio additions to Google Sheets;
- notify Slack when a watched asset gains reported downloads;
- store daily ranks in PostgreSQL or BigQuery;
- trigger competitor research when a creator publishes new AI-generated work.

### Adobe Stock keyword research report

Every run also creates a `KEYWORD_REPORT` record in the default Key-Value Store. It deduplicates assets and summarizes the top keywords found in the sampled results:

- asset frequency;
- distinct creator count;
- average Adobe-reported downloads;
- average Adobe-reported views;
- the number of non-missing samples behind each average.

Use this report to compare the vocabulary attached to visible or frequently downloaded assets, inspect contributor concentration, and generate better-informed metadata ideas. It measures the sampled Adobe Stock supply; it is not buyer search-volume data.

### Complete input example

```json
{
  "queries": ["coffee", "minimal workspace"],
  "creatorIds": [],
  "assetIds": [],
  "source": "api",
  "locale": "en_US",
  "order": "nb_downloads",
  "contentType": "all",
  "aiFilter": "all",
  "orientation": "all",
  "premium": "all",
  "maxItemsPerSearch": 100,
  "maxTotalItems": 500,
  "maxRequests": 150,
  "monitor": true,
  "monitorKey": "stock-research",
  "watchDiscovered": true,
  "maxWatchAssets": 100
}
```

Keyword searches, creator IDs, and exact asset IDs can be combined in one run. Each search configuration keeps an independent baseline, so changing filters or sort order does not corrupt earlier comparisons.

### Output records

The default Dataset uses three `recordType` values:

| Record type | Purpose |
|---|---|
| `asset` | Current observation from a keyword, creator, or exact-ID request |
| `watch` | Current direct observation of an ID in the persistent watchlist |
| `event` | Difference from the previous completed observation |

The run Key-Value Store contains:

| Record | Purpose |
|---|---|
| `SUMMARY` | Coverage, request count, watchlist status, budgets, and errors |
| `KEYWORD_REPORT` | Combined keyword research report for the run |
| `KEYWORDS-<jobKey>` | Keyword report for an individual search or portfolio |

Each run has its own Dataset. Export successive datasets to your database or spreadsheet when you need a permanent time series. Named Actor state stores keep the baselines required for comparison.

### Pricing designed for repeated monitoring

The current Store price starts at **$0.50 per 1,000 distinct assets processed**. The Actor charges an asset only once per run even when it appears in several searches or in the watchlist.

These outputs do not add another per-result charge:

- duplicate appearances of the same asset in one run;
- rank and metadata change events;
- watchlist change events;
- keyword reports.

Set a maximum charge for the run in Apify. The Actor respects the remaining event budget, saves results before charging, and does not replace a complete monitoring baseline with a truncated one.

Apify platform compute and storage usage still apply according to your Apify plan. See the Pricing tab for the currently active price and discounts.

### Reliable scheduled runs

- Completed pages are checkpointed so a migrated or restarted run can continue.
- Failed or truncated searches do not overwrite their last complete baseline.
- Concurrent cloud runs using the same monitor name are rejected to protect state.
- Stable record and event IDs make downstream deduplication straightforward.
- Explicit result, request, watchlist, and spending limits prevent accidental unbounded runs.
- No browser or residential proxy is used by the default API adapter.

In the cloud acceptance check on 26 October 2026, the Actor completed six search observations and three direct watch checks in about eight seconds on 256 MB, with peak memory around 59 MB. A repeated run reused its baseline and emitted no duplicate baseline events. This is a verification result, not a speed guarantee.

### Important interpretation notes

- `LEFT_WINDOW` means that an asset left the sampled results. It does not prove deletion.
- `NOT_RETURNED_BY_ID` means Adobe did not return the ID during that observation. It does not prove permanent removal.
- Downloads and views are counters reported by the source. They do not prove paid sales, royalties, or revenue.
- A downward counter correction is marked with `counterReset: true` and is never presented as a negative sale.
- Keyword frequency describes the sampled assets, not buyer search demand.
- Searches are capped at 10,000 assets. This Actor focuses on repeatable monitoring rather than partitioning one query to harvest an entire catalogue.

### FAQ

#### Is this an Adobe Stock scraper?

Yes. It searches Adobe Stock by keyword, contributor, or asset ID and exports structured metadata. Its main advantage is persistent comparison across runs: rank tracking, portfolio changes, watchlists, and automation-ready events.

#### Can I track my Adobe Stock portfolio?

Yes. Add your contributor ID to `creatorIds`, enable monitoring, choose a stable monitor name, and schedule the same Actor task. Later runs identify assets entering or leaving the tracked portfolio window and metadata or counter changes.

#### Can I monitor competitors?

Yes. Public contributor portfolios and keyword results can be monitored using the same workflow. The Actor only processes public metadata.

#### Can it track Adobe Stock keyword ranking?

Yes. Each returned asset receives its position inside the requested result window. Repeating the same monitored input produces rank-change events.

#### Does it download licensed Adobe Stock files?

No. It exports public metadata and preview links. It does not download original licensed assets, and preview URLs do not grant a content licence.

#### Do I need an Adobe account or API key?

No account is required for the default setup. An `ADOBE_STOCK_API_KEY` environment override is available for compatible deployments. Source availability and permitted use remain governed by Adobe.

#### How often should I schedule it?

Daily is a practical default for keyword and portfolio monitoring. Use weekly schedules for slower-moving niches. Avoid overlapping runs with the same monitor name.

#### Why did my second run show no events?

That means the tracked fields did not change between the two completed observations. Current asset rows are still returned; event rows appear only for detected differences.

### Support

If a search, creator portfolio, or asset ID returns unexpected data, open an Issue with the run ID and a redacted input example. Do not post Apify tokens or webhook credentials.

Adobe Stock is a trademark of Adobe Inc. This independent Actor is not affiliated with or endorsed by Adobe.

# Actor input Schema

## `queries` (type: `array`):

Adobe Stock keywords or phrases to scrape and rank-track. Each query keeps an independent result window and monitoring baseline.

## `creatorIds` (type: `array`):

Adobe Stock contributor IDs to export or monitor for new assets, rank, metadata, download, and view changes.

## `assetIds` (type: `array`):

Exact Adobe Stock asset IDs to inspect or monitor directly, including assets outside the current keyword result window.

## `source` (type: `string`):

Adobe API by default. Optional ADOBE_STOCK_API_KEY environment override. Web mode is a legacy adapter.

## `locale` (type: `string`):

Adobe locale for result language, such as en or en_US. Keep unchanged between monitoring runs.

## `order` (type: `string`):

Adobe search sort order. Changing this creates a separate comparison baseline.

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

Restrict the type of assets returned by searches. Direct ID lookups are unfiltered.

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

Maximum assets collected per keyword or creator search.

## `maxTotalItems` (type: `integer`):

Maximum asset and watch records per run; events are additional.

## `maxRequests` (type: `integer`):

Maximum Adobe HTTP requests, including retries and individual watch lookups.

## `pageSize` (type: `integer`):

Adobe page size, from 1 to 100 assets.

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

Minimum delay between successive Adobe requests in milliseconds.

## `monitor` (type: `boolean`):

Store a baseline and emit rank, portfolio, keyword, metadata, download, and view changes on later scheduled runs.

## `monitorKey` (type: `string`):

Reuse the same name on every scheduled run to compare against the correct baseline. Use separate names for separate research projects.

## `aiFilter` (type: `string`):

Include all assets, generative AI only, or exclude generative AI.

## `orientation` (type: `string`):

Restrict keyword and creator searches by asset orientation.

## `premium` (type: `string`):

Include all assets, only premium assets, or non-premium assets.

## `watchDiscovered` (type: `boolean`):

Continue checking discovered asset IDs after they leave the tracked search window. Requires change tracking and uses one additional lookup per watched asset.

## `maxWatchAssets` (type: `integer`):

Existing IDs are retained when full. The oldest checked assets are checked first. Increase request and result budgets to cover the list.

## Actor input object example

```json
{
  "queries": [
    "coffee"
  ],
  "source": "api",
  "locale": "en",
  "order": "relevance",
  "contentType": "all",
  "maxItemsPerSearch": 100,
  "maxTotalItems": 1000,
  "maxRequests": 100,
  "pageSize": 100,
  "requestDelayMs": 1000,
  "monitor": false,
  "monitorKey": "default",
  "aiFilter": "all",
  "orientation": "all",
  "premium": "all",
  "watchDiscovered": false,
  "maxWatchAssets": 100
}
```

# Actor output Schema

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

Current Adobe Stock assets, contributor portfolio observations, persistent watchlist checks, and changes. Filter by recordType.

## `keywords` (type: `string`):

Top keywords across distinct sampled assets, with frequency, creator concentration, average reported downloads/views, and sample counts.

# 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 = {
    "queries": [
        "coffee"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("suerte_enero/suerte-adobe-stock-monitor").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 = { "queries": ["coffee"] }

# Run the Actor and wait for it to finish
run = client.actor("suerte_enero/suerte-adobe-stock-monitor").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 '{
  "queries": [
    "coffee"
  ]
}' |
apify call suerte_enero/suerte-adobe-stock-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,suerte_enero/suerte-adobe-stock-monitor"
        }
    }
}
```

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/kAxDJUd9GBE06nahA/builds/QxDD5aZukN825wKHh/openapi.json
