# X Brand Pulse: Themes, Spikes, Share of Voice (`seasons-ai/tweets-to-brand-pulse`) Actor

Turns X (Twitter) posts about your brand into a weekly pulse: themes, sentiment trend, spikes, share of voice vs competitors, top questions, 5 actions.

- **URL**: https://apify.com/seasons-ai/tweets-to-brand-pulse.md
- **Developed by:** [Seasons AI](https://apify.com/seasons-ai) (community)
- **Categories:** AI, Social media, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 analysed posts

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

## X (Twitter) Brand Pulse: Themes, Spikes, Share of Voice

Ran the **Tweet Scraper** for your brand, product or topic? Pick its dataset here and get a weekly brand pulse your PR, marketing and product teams can act on: what people talk about, how sentiment moves day by day, which posts caused each spike, how loud you are next to your competitors, what people keep asking, and 5 actions for this week.

### What you get

- **Every post labelled**: on topic or not, sentiment, intent (complaint, praise, question, feature request, news, joke), themes, and which of your listed brands it mentions.
- **Themes found automatically**, then grouped into a short list (up to 15, plus Other), such as Outages & Performance, Pricing & Plans or AI Features. Each theme shows volume, share, net sentiment, complaints, questions and feature requests, this week against last week.
- **Daily series**: posts, engagement, sentiment, intents, themes and brand mentions for each day (or each hour for short searches).
- **Spikes with the 3 posts that drove them**: days with far more posts than usual, and themes that jump on an otherwise normal day. The 3 posts with the most engagement are listed with links.
- **Share of voice vs your competitors**: posts, engagement share and net sentiment per brand, this week against last week, with each brand's top themes.
- **Top questions**: questions people ask, grouped and counted, ready for an FAQ or a support macro.
- **Weekly digest with 5 actions**: a headline, a short summary and 5 concrete actions, each with the evidence behind it and an owner (product, support, marketing, PR, community).
- **Coincidental matches filtered out**: "notion" meaning "idea" or a sale on "notions" is marked off topic and kept out of themes and share of voice.

The Actor works at content level only: it never outputs usernames, display names, bios or follower counts. Details are under [Privacy](#privacy).

### How to use it

1. Run [Tweet Scraper](https://apify.com/apidojo/tweet-scraper) with a search for your brand, product or topic, for example `notion OR "notion ai" OR @NotionHQ`. A week or more of posts gives the best series and spikes.
2. Open this Actor and pick that run's dataset in **Posts dataset**.
3. Enter your brand with its aliases and handles, and your competitors. Add one sentence about the topic so off-topic matches get dropped.
4. Start the run. Open `digest.md` in the key-value store, or the **Posts with labels** table in the dataset.

You can pass posts in two other ways:

- `postsUrl`: a public link to a JSON, JSON Lines or CSV file.
- `items`: a JSON array pasted into the form.

Columns are matched by common names: `text`/`fullText`, `createdAt`/`created at`/`date`, `likeCount`/`likes`, `retweetCount`/`reposts`, `replyCount`, `quoteCount`, `viewCount`/`views`, `lang`, `url`, `id`. Counts like `1.2K` work. Posts from other networks work too if they have text and a date.

Run it every week with the same brands and the theme names from last week (`themeTaxonomy`) to get numbers you can compare week to week.

### Input

| Field | Default | Description |
|---|---|---|
| `datasetId` | – | Dataset of a Tweet Scraper run, chosen with the picker. The Actor only reads it. |
| `postsUrl` | – | Instead of a dataset: a public JSON or CSV file, up to 50 MB. |
| `items` | sample | Instead of a dataset or file: posts as a JSON array. |
| `brandNames` | – | Your brand first, then aliases and official handles, e.g. `Notion`, `Notion AI`, `@NotionHQ`. |
| `competitors` | – | One competitor per line, with aliases and handles separated by `\|`, e.g. `Obsidian \| @obsdmd`. Up to 10. |
| `topicContext` | – | One sentence about what the posts should be about. Required when no brand is given. |
| `maxPosts` | 1000 | Most posts labelled (and charged) per run, from 1 to 5,000. All posts still count in the volume series. |
| `digestDays` | 7 | The digest compares the last N days, ending at the newest post, with the N days before. |
| `bucket` | `auto` | `day`, `hour`, or `auto`: daily, or hourly when the posts cover less than 3 days. UTC. |
| `includeRetweets` | false | Plain reposts repeat the original text, so they are skipped by default. Quote posts and replies are always kept. |
| `themeTaxonomy` | – | Theme names from an earlier run (`taxonomy` in summary.json). New posts are grouped into these names first. |
| `allowNewThemes` | true | With `themeTaxonomy`: whether new themes can be added. |

```json
{
  "datasetId": "<your Tweet Scraper run's dataset>",
  "brandNames": ["Notion", "Notion AI", "@NotionHQ"],
  "competitors": ["Obsidian | @obsdmd", "Evernote"],
  "topicContext": "Note-taking and productivity apps",
  "maxPosts": 1000
}
```

### Output

**Dataset: one row per post** (trimmed):

```json
{
  "postId": "1900000000000100064",
  "url": "https://x.com/i/status/1900000000000100064",
  "createdAt": "2026-10-22T14:07:00.000Z",
  "text": "Notion is down?? Can't open any page. Deadline in 2 hours.",
  "lang": "en",
  "likes": 396, "reposts": 20, "replies": 32, "quotes": 0, "views": 20090,
  "engagement": 468,
  "relevant": true,
  "sentiment": "negative",
  "intent": "complaint",
  "themes": ["Outages & Performance"],
  "topics": ["service outage"],
  "brandsMentioned": ["Notion"],
  "otherProducts": [],
  "question": null,
  "charged": true
}
```

**Key-value store**:

- `digest.md`: the weekly digest. It has the headline and summary, a this-week-vs-last-week table, 5 actions, share of voice, themes, spikes with their 3 posts, top questions, complaints and feature requests by theme, and the volume table.
- `summary.json`: the same data in full, including the series and the theme list to reuse next week (`taxonomy`).
- `series.csv`: one row per day (or hour), with posts, engagement, views, sentiment counts, net sentiment, intents, one column per theme and one per brand.
- `OUTPUT`: a short run summary with links.

Excerpt of `digest.md` from a test run on a synthetic data set:

```markdown
**Notion faces significant outage impact, driving negative sentiment and user concerns.**

| | This week | Last week | Change |
|---|---|---|---|
| Posts | 53 | 31 | +71% |
| Net sentiment | -33 | -7 | -26 |
| complaints | 17 | 7 | +143% |

### 5 actions for this week
1. **Publish an FAQ addressing the recent outage, sync issues, and data integrity concerns.** _(support, Outages & Performance)_ — A major outage spike drove 20 posts on 'Outages & Performance' ...

### Share of voice
| Brand | Posts | Share | Engagement share | Net sentiment | This week share | Last week share | Top themes |
| Notion (you) | 51 | 57.3% | 75.5% | -41 | 64.4% | 43.3% | Outages & Performance, ... |
| Obsidian | 26 | 29.2% | 17% | -4 | 25.4% | 36.7% | Sync & Offline Access, ... |

### Spikes
- **2026-10-22**: 21 posts, 4.2× the usual 5. Net sentiment -86. Main themes: Outages & Performance. Posts that drove it:
  - "Notion is down?? Can't open any page. Deadline in 2 hours." — 396 likes, 20 reposts, 32 replies, 20090 views, negative (open)
```

**How the numbers work**

- **Engagement** = likes + 2 × reposts + replies + quotes. Views are reported but not added in, because they are often missing.
- **Net sentiment** = (positive − negative) / on-topic posts, from −100 to +100.
- **Volume** counts every post read. Sentiment, themes, questions and share of voice count only posts that were analysed and are on topic.
- **Spike**: a day (or hour) with at least 5 posts, at least twice the median of the other days, and above the median + 3 × MAD (median absolute deviation). A theme spike needs at least 5 posts on that theme, with the same rules applied to that theme's own counts. Spike detection needs 4 or more days (or hours) of data.
- **Share of voice**: on-topic posts that mention each brand by name, alias or handle, or that the AI recognises as being about it. A handle that starts with a brand name, such as `@NotionHQ` for Notion, counts too.
- **This week**: the last `digestDays` days, ending at the newest post in the data. Last week is the same number of days before that.

### Privacy

This tool works at content level and does not profile authors.

- It never outputs usernames, display names, author bios, follower counts or profile links. It reads the author fields only to remove those names from the text.
- Links to X posts are rebuilt as `https://x.com/i/status/<id>`. These links open the post but carry no username.
- In post text and excerpts, @handles become `@user`, author names and other personal names become `[name]`, and links and email addresses become `[link]` and `[email]`. The brand names, aliases and handles you list stay as they are.
- AI-written text (themes, questions, digest, actions) goes through the same name filter. Names that slip through become "someone".
- Name detection is automatic, works best in English and can miss a name, so read excerpts before you share them.

### Pricing

Pay per event. Failed posts and failed digests are free.

| Event | Price |
|---|---|
| Post analysed (relevance, sentiment, intent, themes, brands) | $0.001 |
| Digest (themes, series, spikes, share of voice, questions, 5 actions) | $0.03 per run |

Examples:

- 200 posts: 200 × $0.001 + $0.03 = **$0.23**
- 1,000 posts (the default cap): 1,000 × $0.001 + $0.03 = **$1.03**

Off-topic posts are analysed and charged as well, because the Actor has to read them to tell they are off topic. A narrow search keeps that share low. Before it starts, the Actor works out the most the run can cost. If that is above the run's maximum cost, it stops without charging and tells you the amount to set.

Available on paid Apify plans.

### Limits

- Up to 5,000 posts labelled per run (`maxPosts`, default 1,000). The volume series covers every post read, up to the first 20,000 items of a dataset.
- When there are more posts than the cap, posts are picked day by day, most engaged first. Every day gets labels, and the posts that drive spikes are always analysed.
- Each post is analysed up to its first 800 characters. `topicContext` is capped at 300 characters. You can list up to 10 competitors.
- Up to 400 distinct topic labels go into theme grouping. Rarer labels join the closest theme or "Other". Up to 150 questions are grouped into at most 10 top questions. Up to 8 spikes are listed.
- Labels, themes, questions and actions are AI-generated. Sarcasm and slang can be misread, so treat the numbers as a guide, not a measurement. Small data sets give rough themes, and spikes need several days of data.
- Buckets are in UTC.
- A file link must be downloadable without a login. Private Apify dataset links don't work as `postsUrl`: pick the dataset in **Posts dataset** instead.

### Good to know

- **Free plan.** On the free Apify plan the Actor returns a short preview with an example result and prices instead of running.
- The Actor does not scrape X itself. It analyses posts you already have.
- It never posts, replies or contacts anyone.
- Reposts are skipped by default, so one viral post is not counted many times. Its repost count still adds to its engagement.

# Actor input Schema

## `datasetId` (type: `string`):

Pick the dataset of your Tweet Scraper run (apidojo/tweet-scraper), e.g. a search for your brand, product or topic. Other post datasets work too if each item has the post text (`text` or `fullText`); a date (`createdAt`) and like/repost/reply/view counts make the series and spikes work. When set, `postsUrl` and `items` are ignored. The Actor only reads this dataset.

## `postsUrl` (type: `string`):

Instead of a dataset: a public link to a JSON array, JSON Lines or CSV file with one post per row (columns such as text, created at, like count, repost count, reply count, view count, lang, url). Up to 50 MB.

## `items` (type: `array`):

Instead of a dataset or file: paste posts as a JSON array, e.g. \[{"text": "...", "createdAt": "2026-10-28T08:05:00Z", "likeCount": 4, "url": "https://x.com/i/status/123"}]. Used only when no dataset or file URL is given.

## `brandNames` (type: `array`):

Your brand or product name first, then aliases and official handles, e.g. Notion, Notion AI, @NotionHQ. Used for relevance, share of voice, and to keep these names and handles in the output (other @handles are removed).

## `competitors` (type: `array`):

One competitor per line. Put aliases and handles on the same line separated by |, e.g. Obsidian | @obsdmd. Up to 10.

## `topicContext` (type: `string`):

One sentence that tells the analysis what the posts should be about, e.g. "Note-taking and productivity apps". Helps drop coincidental matches ("notion" meaning idea). Required when no brand is given. Up to 300 characters.

## `maxPosts` (type: `integer`):

Cap on posts labelled (and charged) in this run, 1 to 5,000. Every post still counts in the volume series for free. Posts are picked day by day, most engaged first.

## `digestDays` (type: `integer`):

The digest compares the last N days (ending at the newest post) with the N days before.

## `bucket` (type: `string`):

Bucket size for the series and spike detection (UTC). Auto = daily, or hourly when the posts cover less than 3 days.

## `includeRetweets` (type: `boolean`):

Off = plain reposts are skipped (they repeat the original text). Quote posts and replies are always kept.

## `themeTaxonomy` (type: `array`):

Theme names from an earlier run (the `taxonomy` field in summary.json), e.g. Pricing, Sync & Offline, AI Features. Posts are grouped into these names first, so weekly runs compare one to one.

## `allowNewThemes` (type: `boolean`):

With theme names given above: allow new themes for topics that fit none of them. Off = leftovers go to Other.

## `_previewAsFree` (type: `boolean`):

Owner-only test switch: return the free-plan preview instead of running. Ignored for every other account.

## Actor input object example

```json
{
  "items": [
    {
      "id": "1900000000000000001",
      "url": "https://x.com/i/status/1900000000000000001",
      "text": "Notion keeps logging me out on iOS since the last update. Third time today. @sample_user1 same for you?",
      "createdAt": "2026-10-27T09:12:00Z",
      "likeCount": 14,
      "retweetCount": 2,
      "replyCount": 5,
      "viewCount": 2100,
      "lang": "en"
    },
    {
      "id": "1900000000000000002",
      "url": "https://x.com/i/status/1900000000000000002",
      "text": "Is there a way to export a whole Notion workspace to Markdown with the folder structure intact?",
      "createdAt": "2026-10-27T14:40:00Z",
      "likeCount": 3,
      "retweetCount": 0,
      "replyCount": 2,
      "viewCount": 640,
      "lang": "en"
    },
    {
      "id": "1900000000000000003",
      "url": "https://x.com/i/status/1900000000000000003",
      "text": "Moved my notes from Evernote to Obsidian this weekend. Local files and the graph view are worth it.",
      "createdAt": "2026-10-28T08:05:00Z",
      "likeCount": 41,
      "retweetCount": 6,
      "replyCount": 9,
      "viewCount": 5400,
      "lang": "en"
    },
    {
      "id": "1900000000000000004",
      "url": "https://x.com/i/status/1900000000000000004",
      "text": "Notion AI meeting notes just saved me an hour. Please add offline mode next!",
      "createdAt": "2026-10-28T16:30:00Z",
      "likeCount": 22,
      "retweetCount": 3,
      "replyCount": 1,
      "viewCount": 3000,
      "lang": "en"
    },
    {
      "id": "1900000000000000005",
      "url": "https://x.com/i/status/1900000000000000005",
      "text": "I reject the notion that mornings are for productivity.",
      "createdAt": "2026-10-28T18:00:00Z",
      "likeCount": 5,
      "retweetCount": 0,
      "replyCount": 0,
      "viewCount": 300,
      "lang": "en"
    }
  ],
  "brandNames": [
    "Notion",
    "Notion AI",
    "@NotionHQ"
  ],
  "competitors": [
    "Obsidian | @obsdmd",
    "Evernote"
  ],
  "topicContext": "Note-taking and productivity apps",
  "maxPosts": 1000,
  "digestDays": 7,
  "bucket": "auto",
  "includeRetweets": false,
  "allowNewThemes": true
}
```

# Actor output Schema

## `digest` (type: `string`):

No description

## `posts` (type: `string`):

No description

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

No description

## `series` (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 = {
    "items": [
        {
            "id": "1900000000000000001",
            "url": "https://x.com/i/status/1900000000000000001",
            "text": "Notion keeps logging me out on iOS since the last update. Third time today. @sample_user1 same for you?",
            "createdAt": "2026-10-27T09:12:00Z",
            "likeCount": 14,
            "retweetCount": 2,
            "replyCount": 5,
            "viewCount": 2100,
            "lang": "en"
        },
        {
            "id": "1900000000000000002",
            "url": "https://x.com/i/status/1900000000000000002",
            "text": "Is there a way to export a whole Notion workspace to Markdown with the folder structure intact?",
            "createdAt": "2026-10-27T14:40:00Z",
            "likeCount": 3,
            "retweetCount": 0,
            "replyCount": 2,
            "viewCount": 640,
            "lang": "en"
        },
        {
            "id": "1900000000000000003",
            "url": "https://x.com/i/status/1900000000000000003",
            "text": "Moved my notes from Evernote to Obsidian this weekend. Local files and the graph view are worth it.",
            "createdAt": "2026-10-28T08:05:00Z",
            "likeCount": 41,
            "retweetCount": 6,
            "replyCount": 9,
            "viewCount": 5400,
            "lang": "en"
        },
        {
            "id": "1900000000000000004",
            "url": "https://x.com/i/status/1900000000000000004",
            "text": "Notion AI meeting notes just saved me an hour. Please add offline mode next!",
            "createdAt": "2026-10-28T16:30:00Z",
            "likeCount": 22,
            "retweetCount": 3,
            "replyCount": 1,
            "viewCount": 3000,
            "lang": "en"
        },
        {
            "id": "1900000000000000005",
            "url": "https://x.com/i/status/1900000000000000005",
            "text": "I reject the notion that mornings are for productivity.",
            "createdAt": "2026-10-28T18:00:00Z",
            "likeCount": 5,
            "retweetCount": 0,
            "replyCount": 0,
            "viewCount": 300,
            "lang": "en"
        }
    ],
    "brandNames": [
        "Notion",
        "Notion AI",
        "@NotionHQ"
    ],
    "competitors": [
        "Obsidian | @obsdmd",
        "Evernote"
    ],
    "topicContext": "Note-taking and productivity apps"
};

// Run the Actor and wait for it to finish
const run = await client.actor("seasons-ai/tweets-to-brand-pulse").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 = {
    "items": [
        {
            "id": "1900000000000000001",
            "url": "https://x.com/i/status/1900000000000000001",
            "text": "Notion keeps logging me out on iOS since the last update. Third time today. @sample_user1 same for you?",
            "createdAt": "2026-10-27T09:12:00Z",
            "likeCount": 14,
            "retweetCount": 2,
            "replyCount": 5,
            "viewCount": 2100,
            "lang": "en",
        },
        {
            "id": "1900000000000000002",
            "url": "https://x.com/i/status/1900000000000000002",
            "text": "Is there a way to export a whole Notion workspace to Markdown with the folder structure intact?",
            "createdAt": "2026-10-27T14:40:00Z",
            "likeCount": 3,
            "retweetCount": 0,
            "replyCount": 2,
            "viewCount": 640,
            "lang": "en",
        },
        {
            "id": "1900000000000000003",
            "url": "https://x.com/i/status/1900000000000000003",
            "text": "Moved my notes from Evernote to Obsidian this weekend. Local files and the graph view are worth it.",
            "createdAt": "2026-10-28T08:05:00Z",
            "likeCount": 41,
            "retweetCount": 6,
            "replyCount": 9,
            "viewCount": 5400,
            "lang": "en",
        },
        {
            "id": "1900000000000000004",
            "url": "https://x.com/i/status/1900000000000000004",
            "text": "Notion AI meeting notes just saved me an hour. Please add offline mode next!",
            "createdAt": "2026-10-28T16:30:00Z",
            "likeCount": 22,
            "retweetCount": 3,
            "replyCount": 1,
            "viewCount": 3000,
            "lang": "en",
        },
        {
            "id": "1900000000000000005",
            "url": "https://x.com/i/status/1900000000000000005",
            "text": "I reject the notion that mornings are for productivity.",
            "createdAt": "2026-10-28T18:00:00Z",
            "likeCount": 5,
            "retweetCount": 0,
            "replyCount": 0,
            "viewCount": 300,
            "lang": "en",
        },
    ],
    "brandNames": [
        "Notion",
        "Notion AI",
        "@NotionHQ",
    ],
    "competitors": [
        "Obsidian | @obsdmd",
        "Evernote",
    ],
    "topicContext": "Note-taking and productivity apps",
}

# Run the Actor and wait for it to finish
run = client.actor("seasons-ai/tweets-to-brand-pulse").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 '{
  "items": [
    {
      "id": "1900000000000000001",
      "url": "https://x.com/i/status/1900000000000000001",
      "text": "Notion keeps logging me out on iOS since the last update. Third time today. @sample_user1 same for you?",
      "createdAt": "2026-10-27T09:12:00Z",
      "likeCount": 14,
      "retweetCount": 2,
      "replyCount": 5,
      "viewCount": 2100,
      "lang": "en"
    },
    {
      "id": "1900000000000000002",
      "url": "https://x.com/i/status/1900000000000000002",
      "text": "Is there a way to export a whole Notion workspace to Markdown with the folder structure intact?",
      "createdAt": "2026-10-27T14:40:00Z",
      "likeCount": 3,
      "retweetCount": 0,
      "replyCount": 2,
      "viewCount": 640,
      "lang": "en"
    },
    {
      "id": "1900000000000000003",
      "url": "https://x.com/i/status/1900000000000000003",
      "text": "Moved my notes from Evernote to Obsidian this weekend. Local files and the graph view are worth it.",
      "createdAt": "2026-10-28T08:05:00Z",
      "likeCount": 41,
      "retweetCount": 6,
      "replyCount": 9,
      "viewCount": 5400,
      "lang": "en"
    },
    {
      "id": "1900000000000000004",
      "url": "https://x.com/i/status/1900000000000000004",
      "text": "Notion AI meeting notes just saved me an hour. Please add offline mode next!",
      "createdAt": "2026-10-28T16:30:00Z",
      "likeCount": 22,
      "retweetCount": 3,
      "replyCount": 1,
      "viewCount": 3000,
      "lang": "en"
    },
    {
      "id": "1900000000000000005",
      "url": "https://x.com/i/status/1900000000000000005",
      "text": "I reject the notion that mornings are for productivity.",
      "createdAt": "2026-10-28T18:00:00Z",
      "likeCount": 5,
      "retweetCount": 0,
      "replyCount": 0,
      "viewCount": 300,
      "lang": "en"
    }
  ],
  "brandNames": [
    "Notion",
    "Notion AI",
    "@NotionHQ"
  ],
  "competitors": [
    "Obsidian | @obsdmd",
    "Evernote"
  ],
  "topicContext": "Note-taking and productivity apps"
}' |
apify call seasons-ai/tweets-to-brand-pulse --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seasons-ai/tweets-to-brand-pulse"
        }
    }
}
```

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/J8RIoz9Gxaqss3Zvx/builds/ClA7gbpOPXOcSdM0e/openapi.json
