# Pinterest Trends Scraper & Monitor - Rising Keywords (`neverempty/pinterest-trends-monitor`) Actor

Pinterest Trends keywords for US, UK, DE, FR, BR and more: rank, weekly, monthly and yearly change, seasonality. Growing, top monthly, top yearly or seasonal lists. Watch mode returns only new terms. No login.

- **URL**: https://apify.com/neverempty/pinterest-trends-monitor.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** Social media, Marketing, SEO tools
- **Stats:** 2 total users, 2 monthly users, 96.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 trend terms

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

## Pinterest Trends Scraper & Monitor - Rising Keywords

Get the keyword lists from **Pinterest Trends** for the US, UK, Germany, France, Brazil, Mexico, India and more: the terms rising fastest on Pinterest, the top monthly and yearly terms, and seasonal terms, with the weekly, monthly and yearly change for each. One clean row per term. Built for Pinterest marketers, e-commerce and Etsy sellers, content and SEO teams, trend researchers and AI agents that want to plan content before a trend peaks.

- **Up to 100 terms per country, many countries in one run.** Give `US`, `GB`, `DE`, `FR`, `BR`... or a group Pinterest uses, such as `GB+IE` or `DE+AT+CH`. Each country is one request.
- **Four lists.** `growing` (rising fastest, the list Pinterest Trends opens with), `monthly`, `yearly` and `seasonal`.
- **Change as a number and as text.** `weeklyChangePct: 200` and `weeklyChange: "+200%"`, the same for monthly and yearly, so you can sort and filter. Pinterest shows very large jumps as "+10,000% or more"; those rows have `10000`.
- **Watch mode for alerts.** With `onlyNew`, scheduled runs return only terms this watch has not returned before for that country and list. Send new rows to Slack, email or a webhook with an Apify integration.
- **Nothing is guessed.** A value Pinterest does not give is `null`, never `0` or `""`. A country code Pinterest does not accept, an empty list or a run that hit its charge limit comes back as a free row that says why.
- **No login, no browser, no cookies.** Reads the same public data the Pinterest Trends page (trends.pinterest.com) loads. It never logs in, never passes a login or check page, and never reads www.pinterest.com.

Unofficial. Not affiliated with Pinterest.

### What you get

| Field | Example | Meaning |
|---|---|---|
| `country` | `US` | The country (or group) you asked for |
| `countryName` | `United States` | Its English name (`United Kingdom + Ireland` for `GB+IE`) |
| `trendType` | `growing` | Which list |
| `rank` | `1` | Position in the list, 1 = top |
| `term` | `fall nails` | The search term |
| `searchIndex` | `100` | Pinterest's relative search index for the term in this list. It is not a count of searches: it changes with the number of terms you ask for, so compare it only between terms of the same list in the same run |
| `weeklyChangePct` / `weeklyChange` | `200` / `+200%` | Change against the week before |
| `monthlyChangePct` / `monthlyChange` | `300` / `+300%` | Change against the month before |
| `yearlyChangePct` / `yearlyChange` | `20` / `+20%` | Change against the year before |
| `seasonalityScore` | `0.987` | Pinterest's seasonality score, 0 to 1 (higher = more seasonal) |
| `dataEndDate` | `2026-09-29` | The last day the data covers, as Pinterest reports it |
| `trendsPageUrl` | `https://trends.pinterest.com/?country=US` | The Pinterest Trends page for that country |
| `changeType` | `new` | Watch mode only: `first-check` or `new` |
| `status` / `note` | `ok` | `ok` for a term; anything else is a free row and `note` says why |
| `checkedAt` | ISO time | When this run read the list |

### Input

```json
{
  "countries": ["US", "GB+IE", "DE"],
  "trendType": "growing",
  "maxTermsPerCountry": 50
}
```

- `countries` - one code per line. Accepted on 2026-10-03: `US`, `CA`, `GB`, `GB+IE`, `DE`, `DE+AT+CH`, `FR`, `IT`, `ES`, `IT+ES+PT+GR+MT`, `BR`, `MX`, `AR`, `CO`, `MX+AR+CO+CL`, `IN`, `ID`, `KR`, `TR`, `MY`, `PH`, `TH`, `SA`, `EG`, `AU+NZ`, `SE+DK+FI+NO`, `NL+BE+LU`, `PL+RO+HU+SK+CZ`, `CR+DO+EC+GT+PE`. Not accepted alone: `AU`, `NZ`, `IE`, `AT`, `CH`, `NL`, `SE`, `PT`, `PL`, `CL`, and `JP` (Pinterest lists Japan but answers with an error). Empty = `US`.
- `trendType` - `growing`, `monthly`, `yearly` or `seasonal`. Empty = `growing`.
- `maxTermsPerCountry` - 1 to 100. Empty = 100.

### Watch mode

Set `onlyNew: true` and schedule the Actor, for example daily. Each row has `dataEndDate`, the last day Pinterest's data covers (on 2026-10-03 it was 2026-09-29). How often Pinterest moves that date forward was not measured; a run where it has not moved returns nothing new and pays only the run start fee.

- The first run returns the whole list per country as `first-check` rows.
- Later runs return only terms not returned before for that country and list type, as `new` rows. A country with nothing new comes back as a free `no-new-trends` row.
- A term that has not been in the list for 28 days is forgotten, so it is returned again if it comes back.
- Give each schedule its own `watchName`. Do not run two schedules with the same `watchName` at the same time: what a watch remembers is saved without a lock, so two runs finishing at the same moment can return the same term twice.
- A run whose charge limit stops it part way does not remember the terms it did not return; the next run returns them.

### Pricing

Pay per event:

- **Run start** - charged once per run, only when the list of at least one country was read with at least one term in it. This includes watch-mode runs that find nothing new. Not charged when every country is `unknown-country`, `bad-input`, `no-trends`, `blocked`, `unreadable` or `timed-out`, or when the run's maximum total charge has no room for the start fee plus one result row (then nothing is requested at all).
- **Trend term** - one per `ok` row. Free rows are never charged.

The exact prices are shown on the Pricing tab.

### Measured in production

Runs on Apify on 2026-10-03 (build 0.1.1, 256 MB). Your results will differ as the lists change.

| Input | Result | Run time |
|---|---|---|
| `US`, `GB+IE`, `DE`, `FR`, `BR`, `MX`, `IN`, `AU`, `JP`, 100 terms each | 700 rows (100 per country), 2 free `unknown-country` rows (`AU`, `JP`), 9 requests | 6.6 s |
| `US`, `GB`, watch mode, 20 terms, first run | 40 `first-check` rows | 4.4 s |
| Same, run again a few seconds later | 0 rows, 2 free `no-new-trends` rows | 4.2 s |
| `US`, `seasonal`, 10 terms | 10 rows | 2.6 s |

All requests went out directly from Apify; no retry was needed. The data covered up to 2026-09-29 (Pinterest's own date).

### Support

Need another field or a country that does not work? Open an issue on the Issues tab with the input you used.

# Actor input Schema

## `countries` (type: `array`):

Country codes as Pinterest Trends uses them: US, CA, GB, DE, FR, IT, ES, BR, MX, AR, CO, IN, ID, KR, TR, MY, PH, TH, SA, EG, or a group such as GB+IE, DE+AT+CH, AU+NZ, MX+AR+CO+CL, SE+DK+FI+NO, NL+BE+LU. One per line. Each country is one list and each term is one result row. A code Pinterest does not accept (for example AU alone, or JP) comes back as a free row that says so. Up to 40 per run. Empty = US (not allowed in watch mode).

## `trendType` (type: `string`):

Which Pinterest Trends list to read. Empty = growing (the terms rising fastest, the same list Pinterest Trends opens with).

## `maxTermsPerCountry` (type: `integer`):

How many terms to take from the top of each list, 1 to 100 (Pinterest Trends gives at most 100). Empty = 100. In watch mode this is the part of the list being watched.

## `onlyNew` (type: `boolean`):

On = for scheduled runs and alerts. The first run returns the whole list for each country (changeType first-check). Later runs return only terms this watch has not returned before for that country and list type (changeType new). A country with nothing new comes back as a free no-new-trends row. A term not seen in the list for 28 days is forgotten, so it is returned again if it comes back. Each row has dataEndDate, the last day Pinterest's data covers. Off (or empty) = always return the whole list.

## `watchName` (type: `string`):

Optional, used with watch mode. Runs with the same watch name share what has already been returned. Give a different name to each schedule. Do not run two schedules with the same watch name at the same time. Letters, digits, dot, dash and underscore.

## `resetMonitoringState` (type: `boolean`):

Forget what this watch remembered at the start of this run, so every list is a first check again. Turn it off again for scheduled runs.

## Actor input object example

```json
{
  "countries": [
    "US"
  ]
}
```

# Actor output Schema

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

One row per Pinterest Trends term: country, list type, rank, term, relative search index, weekly, monthly and yearly change, seasonality score and the date the data runs to. In watch mode only terms not returned before. A country code Pinterest does not accept, an empty list, or a run that hit its maximum charge comes back as a free row that says why.

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

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/pinterest-trends-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 = { "countries": ["US"] }

# Run the Actor and wait for it to finish
run = client.actor("neverempty/pinterest-trends-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 '{
  "countries": [
    "US"
  ]
}' |
apify call neverempty/pinterest-trends-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/pinterest-trends-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/CXt3d2QkGa4IlPoZh/builds/gry9ctj2Rktd7SVhb/openapi.json
