# Social Trends · 5 Platforms (`steadyfetch/social-trends-scraper`) Actor

Never charged when a platform goes quiet. Trending right now on X, TikTok, Pinterest, YouTube Charts and Google — five platforms in one run. One row shape with rank, metric and link, and every row says whether it was charged.

- **URL**: https://apify.com/steadyfetch/social-trends-scraper.md
- **Developed by:** [Steadyfetch Team](https://apify.com/steadyfetch) (community)
- **Categories:** SEO tools, Social media, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 social trends

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Social Trends · 5 Platforms

**Never charged when a platform goes quiet.** What is trending right now on X, TikTok,
Pinterest, YouTube Charts and Google — five platforms in one run, normalised to one row
shape with rank, metric and link.

*Unofficial. This actor is not affiliated with, endorsed by, or sponsored by X, TikTok, Pinterest, YouTube or Google. All product names and trademarks belong to their owners and are used here only to describe which public surfaces this tool reads.*

Issues answered in about 3 hours.

Every row carries `charged` and `missReason`, so you can reconcile the invoice from the
dataset itself without opening the console. **Only rows with `charged: true` were billed.**

***

### Output

One row shape for all five platforms, so they stack into a single table:

| `charged` | `platform` | `chart` | `rank` | `title` | `kind` | `metricName` | `metricValue` | `url` |
|---|---|---|---|---|---|---|---|---|
| true | `x` | `trends` | 1 | `#MANIFEST` | `hashtag` | `tweetVolume` | `null` | `http://twitter.com/search?q=%23MANIFEST` |
| true | `tiktok` | `top_hashtags_7d` | 1 | `#dollyparton` | `hashtag` | `viewCount` | `852900000` | `https://www.tiktok.com/tag/dollyparton` |
| true | `pinterest` | `top_trends` | 2 | `sterling point` | `search` | `searchCount` | `100` | `https://www.pinterest.com/search/pins/?q=sterling%20point` |
| true | `youtube` | `TRENDING_CHART` | 1 | `KATSEYE (캣츠아이) 'Hootie Frutti' Official MV` | `video` | `null` | `null` | `https://www.youtube.com/watch?v=is8UDe2PhKQ` |
| true | `google` | `daily_search_trends` | 1 | `palmeiras vs santos` | `search` | `approxTraffic` | `2000` | `https://trends.google.com/trends/explore?q=palmeiras%20vs%20santos&geo=US` |

*(Real rows from US runs. `metricValue` is `null` where the platform does not publish a
number for that chart — see "What each platform actually gives you".)*

**[Browse the full sample dataset →](https://api.apify.com/v2/datasets/GqhnHGsEN8c5yt0FO/items?clean=true\&format=json)**
— one real US run across X, Pinterest, YouTube Charts and Google (46 trends), ending with
the run's own summary row. Nothing is trimmed for the demo.

Every row also carries `country`, `place`, `metricText` (the value exactly as published),
`capturedAt` (upstream's own timestamp for the data), `fetchedAt`, `status`, `retryable`,
`statusReason`, `schemaVersion`, and a `details` object holding that platform's native
fields. The last row of every run is a **summary row** with `delivered`, `stoppedBy`,
`resumeCursor` and `chargedEvents`.

***

### Agent / API paste-block

```
Actor:      steadyfetch/social-trends-scraper
Required:   platforms          (array: x | pinterest | youtube | google | tiktok — leave
                                empty for uncharged sample rows)
Optional:   country            (string, default "US" — two-letter code; WORLDWIDE on X only)
            limitPerPlatform   (integer, default 50, max 250)
            maxItems           (integer, default 500 — hard cap for the whole run)
            maxRunSeconds      (integer, default 300 — clean stop, never a timeout kill)
Charges:    social-trend       once per delivered trend row
Note:       omit a field to take its default; do NOT send null (the platform refuses a
            null before the run starts)
Build spec: https://apify.com/steadyfetch/social-trends-scraper/api
Token:      https://console.apify.com/settings/integrations
```

```bash
curl -X POST "https://api.apify.com/v2/acts/steadyfetch~social-trends-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"platforms":["x","pinterest","youtube","google","tiktok"],"country":"US","limitPerPlatform":25}'
```

***

### What each platform actually gives you

| Platform | What the rows are | Rank order | Metric |
|---|---|---|---|
| **X (Twitter)** | the 50 trends X lists for that place, hashtags and plain searches | X's own order | `tweetVolume` — **X publishes no post count on this endpoint, so it is normally `null`.** A `0` would claim nobody posted; `null` says "not published" |
| **TikTok** | **the top trending hashtags TikTok shows publicly** — the top 3 for each of its 7-, 30- and 90-day windows (`top_hashtags_7d/30d/90d`), about 9 rows per run | TikTok's own rank, restarting per window | `viewCount` (TikTok's own shorthand kept verbatim in `metricText`); post count and category in `details` |
| **Pinterest** | top search terms, with Pinterest's week-, month- and year-on-year change series in `details` | Pinterest's own ranking | `searchCount` |
| **YouTube Charts** | **trending MUSIC videos and artists** — `TRENDING_CHART` (30 videos), then `TOP_VIEWS_CHART` (100 videos, 100 artists) | chart position, restarting per chart | `viewCount` on the top-views charts; the trending chart publishes none |
| **Google** | the daily search trends feed, with the news stories Google attaches to each one | Google's own order | `approxTraffic` — a published floor ("500+"), kept verbatim in `metricText` |

**TikTok here means exactly what TikTok shows without a login.** TikTok's trend pages
display the top ~3 hashtags per time window publicly and keep the rest of the list behind
a login. This actor reads all three windows — 7, 30 and 90 days — and delivers those top
rows honestly labelled, instead of pretending the full list is available. If you need
deeper TikTok hashtag lists, this is not the actor for it.

**YouTube here means YouTube Charts, and Charts is music.** YouTube retired its general
Trending feed as a product — the old endpoint answers with an empty "try searching" page on
every client. This actor does not pretend otherwise: it returns the charts that still
publish, and labels every row with which chart it came from. If you need general video, this
is not the actor for it.

**Pinterest data lags about six days.** The actor asks Pinterest which date it actually has
before requesting a window, so you get the freshest data that exists rather than an empty
"today".

**Links:** X's link is X's own, passed through unchanged. YouTube links are built from the
video or channel id in the response. Pinterest and Google publish no per-trend link, so those
are search links built from the term.

***

### Countries

`country` takes a two-letter code, and every platform is asked for the same one so the rows
line up.

`WORLDWIDE` works on **X only** — X is the one platform that publishes a real worldwide
trend list. TikTok, Pinterest, YouTube Charts and Google publish per country and have no
worldwide feed, so on those four `WORLDWIDE` comes back as an **uncharged row** naming the
fix. This actor never substitutes another country's data instead.

X serves trends by WOEID and carries a fixed list —
`WORLDWIDE`, AE, AR, AT, AU, BE, BH, BR, BY, CA, CH, CL, CO, DE, DK, DZ, EC, EG, ES, FR, GB,
GH, GR, ID, IE, IL, IN, IT, JO, JP, KE, KR, KW, LB, MX, MY, NG, NL, NO, NZ, OM, PE, PH, PK,
PL, PT, QA, RU, SA, SE, SG, TH, TR, UA, US, VE, VN, ZA. Every one of those was probed live
against the endpoint. A country outside the list comes back as an **uncharged row** naming
the fix, not as an empty result.

TikTok's trend pages carry their own fixed list — AE, AR, AU, BR, CA, CO, DE, EG, ES, FR,
GB, ID, IL, IT, JP, KR, MX, MY, PH, SA, SG, TH, TR, TW, US, VN, ZA — taken from the page's
own country selector. Same rule: a country outside it is an **uncharged row** naming the
fix, before anything is fetched.

***

### What you are never charged for

| situation | `status` | run status |
|---|---|---|
| A platform rate-limited, blocked or dropped us | `platform_unavailable` | SUCCEEDED — re-runnable, and the row says so |
| A platform answered normally and published nothing | `empty_upstream` | SUCCEEDED |
| A platform does not carry the country you asked for (X's WOEID list; TikTok's country list; `WORLDWIDE` outside X) | `unsupported_country` | SUCCEEDED — the row names the fix |
| A platform name or country we could not read | `input_error` | SUCCEEDED — the row names the fix |
| Your own `maxItems` / `maxRunSeconds` / cost cap | `stopped_at_limit` | SUCCEEDED — summary row + `resumeCursor` |

A refusal is reported as a refusal, never dressed up as "this platform has no trends". Two
of these platforms can answer HTTP 200 with an error inside the body or with nothing in it at
all — charging is gated on rows that actually parsed, never on the status line.

**This actor may fail when the platform changes things — failed items are never charged.**

***

### Limits are hard limits

`limitPerPlatform`, `maxItems` and `maxRunSeconds` stop the run exactly where you set them.
The run still finishes **successfully**, the summary row names which limit bound, and
`resumeCursor` lists the platforms that were not reached.

***

### FAQ

**Does `{}` cost anything?**
No. With no platforms selected it returns five uncharged sample rows — one per platform — so
you can see the exact output shape before spending anything. That run contacts nothing.

**Why is `metricValue` empty on some rows?**
Because that platform does not publish a number for that chart. Inventing one would be worse
than leaving it out; `metricName` is `null` too, so the empty is unambiguous.

**Why does TikTok return about 9 rows when the others return dozens?**
Because that is everything TikTok shows without a login: the top ~3 hashtags for each of
its 7-, 30- and 90-day windows. The rest of the list sits behind a TikTok login. This actor
delivers exactly what the public page shows — around 9 honestly-labelled rows — rather than
selling a "full list" it cannot fetch.

**Can I run one platform on a schedule?**
Yes — pass a single value in `platforms`. Each platform is fetched independently, and one
platform being down never blocks the others.

**How do I join the five platforms?**
They already share a schema. Group by `platform` + `chart`, sort by `rank`, and use `title`
as the term. `capturedAt` tells you how fresh each platform's data actually is.

***

### Steadyfetch trends & keyword suite

One actor per surface, one job each, the same contract everywhere: **all-inclusive pay per event,
no start fee, charged only on delivery** — so a workflow built for one of them ports to the next.

| What you want | Actor |
|---|---|
| Interest over time, related queries, regions, compare | [Google Trends · No Charge on Miss](https://apify.com/steadyfetch/google-trends-scraper) |
| What is trending right now, by country | [Google Trends Now · No Start Fee](https://apify.com/steadyfetch/google-trends-now-scraper) |
| Rising and Breakout queries, with the real growth number | [Breakout Keywords from Trends](https://apify.com/steadyfetch/breakout-keywords-scraper) |
| Autocomplete suggestions across 5 engines | [Autocomplete Keywords · 5 Engines](https://apify.com/steadyfetch/google-keyword-suggest-scraper) |
| Monthly search volume and CPC for a keyword list | [Keyword Volume & CPC · No Minimum](https://apify.com/steadyfetch/keyword-search-volume-scraper) |
| What is trending on social platforms | **this actor** |

**The rest of the steadyfetch shelf** — same contract everywhere: all-inclusive pay per event,
no start fee, charged only on delivery.

| Family | Actors |
|---|---|
| Ad creative intelligence | [Facebook](https://apify.com/steadyfetch/facebook-ads-transcript-scraper) · [Google Ads video](https://apify.com/steadyfetch/google-ads-video-transcript-scraper) · [TikTok](https://apify.com/steadyfetch/tiktok-ads-transcript-scraper) · [LinkedIn](https://apify.com/steadyfetch/linkedin-ads-transcript-scraper) · [Google Ads text & OCR](https://apify.com/steadyfetch/google-ads-creative-text-scraper) |
| **Trends & keywords** | [Google Trends](https://apify.com/steadyfetch/google-trends-scraper) · [Trends Now](https://apify.com/steadyfetch/google-trends-now-scraper) · [Breakout keywords](https://apify.com/steadyfetch/breakout-keywords-scraper) · [Autocomplete keywords](https://apify.com/steadyfetch/google-keyword-suggest-scraper) · [Keyword volume & CPC](https://apify.com/steadyfetch/keyword-search-volume-scraper) · [Social trends](https://apify.com/steadyfetch/social-trends-scraper) |
| YouTube transcripts | [YouTube videos](https://apify.com/steadyfetch/youtube-transcript-scraper) · [YouTube channels](https://apify.com/steadyfetch/youtube-channel-transcripts) |
| Instagram | [Reel transcripts](https://apify.com/steadyfetch/instagram-reel-transcript-scraper) · [Profile posts](https://apify.com/steadyfetch/instagram-profile-posts) |
| Jobs | [Indeed](https://apify.com/steadyfetch/indeed-jobs-scraper) · [Career sites by domain](https://apify.com/steadyfetch/company-jobs-by-domain) · [Glassdoor](https://apify.com/steadyfetch/glassdoor-jobs-scraper) · [Multi-board](https://apify.com/steadyfetch/multi-job-board-scraper) · Google Jobs |
| Amazon | [Products](https://apify.com/steadyfetch/amazon-product-scraper) · [Search](https://apify.com/steadyfetch/amazon-search-scraper) · Bestsellers · Sellers |
| Any media file | [Speech to Text · any link or file](https://apify.com/steadyfetch/media-transcriber) |

Unlinked names are publishing shortly on the same account — search **steadyfetch** on Apify Store.

***

### Free templates

[github.com/steadyfetch/n8n-templates](https://github.com/steadyfetch/n8n-templates) —
import-validated n8n workflows.

# Actor input Schema

## `platforms` (type: `array`):

Which trend sources to read. X returns the 50 trends it lists for the country. Pinterest returns its top search terms with the change series. YouTube means YouTube CHARTS — trending MUSIC videos and artists, not general video. Google returns the daily search trends. TikTok returns the top trending hashtags TikTok shows publicly — the top 3 for each of its 7-, 30- and 90-day windows (about 9 rows; TikTok keeps the rest behind a login).

## `country` (type: `string`):

Two-letter country code (US, GB, DE, SA, BR …). Every platform is asked for the same country, so the rows line up. WORLDWIDE works on X only — the one platform that keeps a worldwide list; the other four publish per country and answer WORLDWIDE with an uncharged row naming the fix. X and TikTok each cover a fixed list of countries — see the README; a country they do not carry comes back the same uncharged way.

## `limitPerPlatform` (type: `integer`):

Hard cap on the rows taken from any one platform. X lists 50, Pinterest up to 250, YouTube Charts 230, Google 10 or so, TikTok about 9 (the top 3 per time window — the rest sit behind a TikTok login).

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

Hard cap on delivered trends across every platform in this run.

## `maxRunSeconds` (type: `integer`):

The run stops cleanly before this many seconds and reports what is left, instead of being killed by a timeout.

## Actor input object example

```json
{
  "platforms": [
    "x",
    "pinterest",
    "youtube",
    "google",
    "tiktok"
  ],
  "country": "US",
  "limitPerPlatform": 50,
  "maxItems": 500,
  "maxRunSeconds": 300
}
```

# Actor output Schema

## `trends` (type: `string`):

One row per trend, in one shape across all five platforms: platform, country, chart, rank, title, kind, metric, link and the platform's own extra fields under `details`. Every row carries `charged` and `missReason`, so the invoice reconciles from the dataset itself. Only rows with charged = true were billed.

## `detail` (type: `string`):

The same rows with each platform's native fields expanded — Pinterest's week/month/year change series, YouTube Charts positions and channel data, the news stories Google attaches to a search trend, X's own query string.

## `summary` (type: `string`):

Trends delivered, which platforms answered, which were temporarily unavailable, what stopped the run, and the charged-event totals.

## `errors` (type: `string`):

Present only when a platform rate-limited, blocked or dropped the request after retries: which platform and why. These are re-runnable, not permanent. Errors go here, never into the dataset.

# 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 = {
    "platforms": [
        "x",
        "pinterest",
        "youtube",
        "google",
        "tiktok"
    ],
    "country": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyfetch/social-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 = {
    "platforms": [
        "x",
        "pinterest",
        "youtube",
        "google",
        "tiktok",
    ],
    "country": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("steadyfetch/social-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 '{
  "platforms": [
    "x",
    "pinterest",
    "youtube",
    "google",
    "tiktok"
  ],
  "country": "US"
}' |
apify call steadyfetch/social-trends-scraper --silent --output-dataset

```

## MCP server setup

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