# Pinterest Trends Scraper (`steadyscrape/pinterest-trends-scraper`) Actor

Pinterest Trends' growing, top monthly, top yearly and seasonal lists for 29 markets, by interest, age and gender, plus keyword research: weekly history up to 24 months, Pinterest's own forecast, audience by age and gender, related searches and autocomplete. No login, no browser.

- **URL**: https://apify.com/steadyscrape/pinterest-trends-scraper.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** Social media, SEO tools, E-commerce
- **Stats:** 4 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 trends

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

## Pinterest Trends Scraper

What people search on Pinterest, straight from **Pinterest Trends**: the **growing**, **top monthly**, **top yearly** and **seasonal** lists for 29 countries and regions, narrowed by **interest** (Food and drinks, Wedding, Home decor…), **age group**, **gender** and words, as of this week or **any day of the last 12 months**. Plus **keyword research**: for each keyword, its weekly search interest up to 24 months back, **Pinterest's own forecast** for the coming weeks with its low and high bounds, **who searches it** (age and gender), the **related searches** Pinterest shows and the **autocomplete** suggestions, each with a year of history.

No login, no Pinterest business account, no browser, no proxy. Every list and keyword you ask for comes back as a row, and when Pinterest has nothing the row says why instead of an empty dataset.

Pinterest is where people plan what they are about to buy and make, months ahead. That is why its search trends show a season, a style or a product rising **before** it peaks elsewhere.

### Use cases

- **E-commerce, Etsy and print-on-demand**: find the products and styles rising in your market and your customers' age group, and stock or design for them before they peak.
- **Content calendars**: plan pins, posts and articles around seasonal searches, with Pinterest's own forecast of when each one peaks.
- **SEO and keyword research**: expand a seed keyword into the long-tail searches Pinterest suggests, with their volume and trend.
- **Agencies and brands**: compare markets (US vs UK and Ireland vs Germany, Austria and Switzerland) and audiences (women 25-34 vs men 55+) in one run, on a schedule.
- **Trend reports**: what was trending last Christmas, last Black Friday or last spring, without having saved it at the time.

### What you get

**Trend rows** (`type: "trend"`), one per term of each list:

- `term`, `rank`, `searchVolume` (0–100, relative to the list's biggest term), `weeklyChangePercent`, `monthlyChangePercent`, `yearlyChangePercent` (Pinterest caps a term that came from nothing at `10001`), `seasonality` (0–1: how much it comes back every year), `interests` (Pinterest's categories for the term).
- `history`: the weekly search interest over the range you choose (`{date, value}`), `forecast` (`{date, value, low, high}`) when you ask for one, and `demographics`: share of searchers per age group and gender.
- The list it came from: `country`, `countryName`, `trendType`, `interest`, the filters, and `weekEnding` (the day the list counts up to, as Pinterest reports it), plus `trendsUrl`, the term's page on Pinterest Trends.

**Keyword rows** (`type: "keyword"`), one per keyword and market:

- `searchVolume` (the latest week), the three changes, `history`, `forecast`, `demographics`.
- `relatedTerms`: the related searches Pinterest lists, each with 53 weeks of history and its link.
- `suggestions`: up to ten searches that start with the keyword, each with 52 weeks of history and its link.
- `comparedWith`: the other keywords sharing one scale with it, when you compare them.

**Every row has `status` and `reason`.** A keyword Pinterest does not know comes back `no_data`; one that Pinterest would not give a section for (related searches or suggestions, after retries and a fresh IP) comes back `partial`, with everything else and the reason. A list with no terms (filters too narrow, or a day older than Pinterest keeps) comes back as a `trend_list` row with `no_data`, `invalid` or `blocked`. None of those is charged.

### Input

| field | what it does |
|---|---|
| `countries` | Markets: US, Canada, UK and Ireland, Australia and New Zealand, Germany, DACH, France, Italy, Spain, Southern Europe, Nordics, Benelux, Central Europe, Mexico, Latin America, Brazil, Argentina, Colombia, Indonesia, India, Malaysia, Philippines, Thailand, Saudi Arabia, Egypt, Türkiye, South Korea. |
| `trendTypes` | `growing`, `top_monthly`, `top_yearly`, `seasonal`. Empty: keywords only. |
| `maxTrendsPerList` | Terms per list, up to 100 (Pinterest's maximum). |
| `interests` | One list per interest; empty: all interests together. |
| `ageGroups`, `genders` | Trends among these people only. |
| `includeKeywords`, `excludeKeywords` | Keep or drop trends containing these words. |
| `trendsEndDate` | The lists as they were on a past day (`YYYY-MM-DD`), up to about a year back. |
| `keywords` | Keywords to research; case does not matter. |
| `compareKeywords` | One 0–100 scale for all keywords of a market, as when comparing on Pinterest Trends. |
| `includeRelatedTerms`, `includeSuggestions` | Related searches and autocomplete for each keyword. |
| `includeHistory`, `historyRange` | Weekly history of trends and keywords: 1, 3, 6, 12 or 24 months. |
| `forecast` | Pinterest's forecast: none, 4, 8 or 13 weeks. |
| `includeDemographics` | Age and gender shares of each trend and keyword. |

```json
{
    "countries": ["US", "GB+IE"],
    "trendTypes": ["growing", "seasonal"],
    "maxTrendsPerList": 50,
    "interests": ["food_and_drinks", "home_decor"],
    "ageGroups": ["25-34"],
    "keywords": ["fall nails", "pumpkin recipes"],
    "forecast": "13_weeks"
}
```

### Output example

```json
{
    "type": "trend",
    "status": "ok",
    "reason": null,
    "country": "US",
    "countryName": "United States",
    "trendType": "top_monthly",
    "interest": null,
    "ageGroups": [],
    "genders": [],
    "includeKeywords": [],
    "excludeKeywords": [],
    "weekEnding": "2026-10-05",
    "rank": 1,
    "term": "fall nails",
    "searchVolume": 100,
    "weeklyChangePercent": -5,
    "monthlyChangePercent": 200,
    "yearlyChangePercent": 30,
    "seasonality": 0.9824424,
    "interests": [],
    "history": [{ "date": "2025-10-06", "value": 71 }, "…", { "date": "2026-10-05", "value": 94 }],
    "forecast": null,
    "demographics": {
        "ages": { "18-24": 0.38, "25-34": 0.37, "35-44": 0.16, "45-49": 0.04, "50-54": 0.04, "55-64": 0.04, "65+": 0.04 },
        "genders": { "male": 0.04, "female": 0.91, "unspecified": 0.08 }
    },
    "trendsUrl": "https://trends.pinterest.com/detail/?terms=fall+nails&country=US"
}
```

### Pricing

Pay per row with data:

- **US$0.001 per trend** (`trend` event): a term of a list, with its history, forecast and audience when you ask for them.
- **US$0.003 per keyword** (`keyword` event): a keyword Pinterest has data for, with everything you asked for it.

Lists without terms, keywords without data and `partial` keywords are free. A run of 100 trends with history and audience costs US$0.10.

### Limits and notes

- Values are Pinterest's relative 0–100 scores, not absolute search counts: Pinterest Trends does not publish those. A history is scaled to the term's own peak in the range shown (forecast weeks included), or to the group's peak when keywords are compared.
- Pinterest updates its data weekly, about a week behind: `weekEnding` says which week a row counts up to.
- Past-day lists go back about 12 months. History goes up to 24 months; year-over-year change needs the 24-month range.
- Pinterest forecasts only the terms with enough history; for the rest `forecast` is an empty list.
- Pinterest varies the last two of the five related searches between calls.
- Pinterest limits how many related searches and suggestions one IP can ask for (about 60 and 120 per 10 minutes). When it says so, the run goes on through Apify's datacenter proxy with a fresh IP per call; without proxy access on your account, those keywords come back `partial`, free.
- Pinterest groups some countries into one market (UK and Ireland; Germany, Austria and Switzerland; the Nordics…) and does not split them.
- This Actor reads public, aggregated data that Pinterest Trends shows any visitor. No personal data is involved. It is not affiliated with Pinterest.

# Actor input Schema

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

The markets Pinterest Trends covers. Regional ones (<code>GB+IE</code>, <code>DE+AT+CH</code>, <code>MX+AR+CO+CL</code>…) are one market to Pinterest: it does not split them by country.

## `trendTypes` (type: `array`):

Pinterest Trends' four top lists: <b>growing</b> (rising fastest), <b>top monthly</b> and <b>top yearly</b> (most searched), <b>seasonal</b> (coming back now, as every year). Leave empty to research keywords only.

## `maxTrendsPerList` (type: `integer`):

How many terms of each list (per market, list type and interest). Pinterest gives at most 100.

## `interests` (type: `array`):

Pinterest's interest categories. Each one gives its own list (Food and drinks, Wedding…); empty: one list across all interests.

## `ageGroups` (type: `array`):

Only trends among people of these ages. Empty: everyone.

## `genders` (type: `array`):

Only trends among these genders. Empty: everyone.

## `includeKeywords` (type: `array`):

Keep only trends that contain one of these words (<code>pumpkin</code> → pumpkin bread, pumpkin carving ideas…).

## `excludeKeywords` (type: `array`):

Drop trends that contain any of these words.

## `trendsEndDate` (type: `string`):

See the lists as they were on an earlier day, up to about 12 months back (<code>2025-12-22</code> gives last Christmas). Empty: the latest week Pinterest has.

## `keywords` (type: `array`):

For each keyword and market: its weekly search interest, week/month/year change, who searches it (age and gender), the related searches Pinterest shows and the searches that start with it. Case does not matter.

## `compareKeywords` (type: `boolean`):

Put the keywords of each market on one 0–100 scale (the biggest one's peak = 100), as when comparing terms on Pinterest Trends. Off: each keyword against its own peak.

## `includeRelatedTerms` (type: `boolean`):

The searches Pinterest lists as related to each keyword (five, which Pinterest varies a little between calls), each with a year of weekly history.

## `includeSuggestions` (type: `boolean`):

Up to ten searches that start with the keyword, as Pinterest Trends' search box suggests them, each with a year of weekly history.

## `includeHistory` (type: `boolean`):

The weekly search interest of every trend and keyword over the range below (0–100).

## `historyRange` (type: `string`):

How far back the weekly history goes. Year-over-year change needs 24 months.

## `forecast` (type: `string`):

Pinterest's own forecast of the coming weeks, with its low and high bounds, for the terms it forecasts.

## `includeDemographics` (type: `boolean`):

Share of searchers per age group and gender for each trend and keyword, over the last 12 months.

## Actor input object example

```json
{
  "countries": [
    "US"
  ],
  "trendTypes": [
    "growing"
  ],
  "maxTrendsPerList": 10,
  "interests": [],
  "ageGroups": [],
  "genders": [],
  "includeKeywords": [],
  "excludeKeywords": [],
  "keywords": [
    "fall nails"
  ],
  "compareKeywords": false,
  "includeRelatedTerms": true,
  "includeSuggestions": true,
  "includeHistory": true,
  "historyRange": "12_months",
  "forecast": "none",
  "includeDemographics": true
}
```

# Actor output Schema

## `rows` (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 = {
    "countries": [
        "US"
    ],
    "trendTypes": [
        "growing"
    ],
    "maxTrendsPerList": 10,
    "keywords": [
        "fall nails"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/pinterest-trends-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 = {
    "countries": ["US"],
    "trendTypes": ["growing"],
    "maxTrendsPerList": 10,
    "keywords": ["fall nails"],
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/pinterest-trends-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 '{
  "countries": [
    "US"
  ],
  "trendTypes": [
    "growing"
  ],
  "maxTrendsPerList": 10,
  "keywords": [
    "fall nails"
  ]
}' |
apify call steadyscrape/pinterest-trends-scraper --silent --output-dataset

```

## MCP server setup

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