# Hacker News Topic Momentum Tracker (`saint_person/hn-topic-momentum-tracker`) Actor

Track which Hacker News stories in any topic are gaining real momentum right now, ranked by engagement velocity, not just raw points.

- **URL**: https://apify.com/saint\_person/hn-topic-momentum-tracker.md
- **Developed by:** [saint person](https://apify.com/saint_person) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## 🔥 Hacker News Topic Momentum Tracker

> 🚀 **Find which Hacker News stories in your niche are gaining real momentum right now - and compare momentum across multiple topics at once.** Enter one topic, or several comma-separated topics, and get stories **ranked by engagement velocity - points and comments relative to age**, not lifetime point totals. Built on the official HN Algolia Search API - no scraping, no breakage.

<!-- Optional: add a brand banner image here once you have one: ![banner](https://...) -->

> 🕒 **Last updated:** 2026-07-07 · 📊 **11 fields** per momentum-ranked story · 🔥 **Velocity ranking** · ⚖️ **Multi-topic comparison** · 📊 **Momentum labels** · 🔓 **No auth required**

> 🎁 **Try it free:** the free Apify plan returns up to **10 results per run** — enough to see the output quality. Any paid Apify plan unlocks full-size runs.

The Hacker News Topic Momentum Tracker finds what's actually gaining traction in a niche right now, not just what has the most all-time points. Enter any topic or keyword (or up to 5, comma-separated, to compare side by side) and the Actor queries the official HN Algolia Search API, computes an engagement-velocity score for every matching story from the last N days, and returns them ranked by momentum with a HOT/RISING/STEADY/COOLING label.

A 3-day-old story with 300 points is not automatically more relevant than a 1-hour-old story with 50 points and 40 comments - the second one is accelerating. Because each run tags every row with the topic it came from, comparing 'rust, zig, go' in one run shows you which language community is heating up fastest right now, not just each one's raw popularity. Results are flat JSON rows ready for CSV, Excel, or direct API consumption.

| 🎯 Target Audience | 💡 Primary Use Cases |
| --- | --- |
| Founders, developer marketers, technical content writers, trend researchers, AI research agents | Emerging trend detection, competitive/market monitoring, cross-topic comparison, content timing |

---

### 📋 What Hacker News Topic Momentum Tracker does

One input, one run, a clean dataset:

- 🔥 **Velocity ranking.** Every story scored by (points + 2x comments) / hours since posted - not raw points.
- ⚖️ **Multi-topic comparison.** Compare momentum across up to 5 topics in one run - see which is accelerating fastest, not just each one's raw popularity.
- 🏷️ **Momentum labels.** HOT, RISING, STEADY, or COOLING - a scored read, not a raw number dump.
- 🔗 **Direct discussion links.** Every row includes the HN thread URL, ready to open.

> 💡 **Why it matters:** Hacker News' own "new" and "top" views don't separate genuinely accelerating discussions from stories that are just old and highly upvoted, and they don't let you compare topics side by side at all. Sorting by velocity - across one topic or several at once - surfaces what a niche (or a set of competing niches) is talking about *right now*, which is what matters for timing a launch, a blog post, or a competitive response.

---

### 🎬 Full demo

🚧 Video walkthrough coming soon — the Quick Start below takes under 3 minutes end to end.

---

### ⚙️ Input

| Input | Type | Default | Behavior |
| --- | --- | --- | --- |
| `query` | string | `"AI agents"` | Topic, or comma-separated topics to compare (max 5). |
| `daysBack` | integer | `14` | How many days back to search (1-90). |
| `maxResults` | integer | `20` | Momentum-ranked stories to return per topic. Controls cost. |

**Example: track momentum on a single topic**

```json
{
  "query": "AI agents",
  "daysBack": 14,
  "maxResults": 20
}
````

**Example: compare momentum across 3 topics**

```json
{
  "query": "rust, zig, go",
  "daysBack": 14,
  "maxResults": 10
}
```

> ⚠️ **Good to know:** Momentum is relative to the search window: a story from day 1 of a 14-day search has more time to accumulate points than one from day 13, so velocity (not raw points) is what makes the comparison fair. maxResults applies per topic - comparing 3 topics at maxResults=10 returns up to 30 rows total, priced per row.

***

### 📊 Output

Each momentum-ranked story returns **11 fields**. Download as CSV, Excel, JSON, or XML, or consume via the Apify API.

#### 🧾 Schema

| Field | Type | Example |
| --- | --- | --- |
| 🔑 `query` | string | `"AI agents"` |
| 📰 `title` | string | `"Why we built our AI agent framework from scratch"` |
| 🔗 `url` | string|null | `"https://example.com/blog"` |
| 💬 `hnDiscussionUrl` | string | `"https://news.ycombinator.com/item?id=40172033"` |
| 👤 `author` | string | `"darthdeus"` |
| ⬆️ `points` | integer | `245` |
| 💬 `numComments` | integer | `87` |
| ⏱️ `ageHours` | number | `18.5` |
| 🔥 `velocityScore` | number | `14.2` |
| 🏷️ `momentum` | string | `"RISING"` |
| 🕐 `createdAt` | ISO 8601 | `"2026-06-20T14:32:10.000Z"` |

#### 📦 Sample record

```json
{
  "query": "AI agents",
  "title": "Why we built our AI agent framework from scratch",
  "url": "https://example.com/blog",
  "hnDiscussionUrl": "https://news.ycombinator.com/item?id=40172033",
  "author": "darthdeus",
  "points": 245,
  "numComments": 87,
  "ageHours": 18.5,
  "velocityScore": 14.2,
  "momentum": "RISING",
  "createdAt": "2026-06-20T14:32:10.000Z"
}
```

***

### ✨ Why choose this Actor

| | Capability |
| --- | --- |
| ⚖️ | **Compares topics, not just one lookup.** Up to 5 comma-separated topics in one run, each tagged in the output - see which is accelerating fastest. |
| 🔥 | **Velocity, not vanity metrics.** Ranks by engagement rate so a fast-rising new story doesn't get buried under an old, highly-upvoted one. |
| 🏷️ | **Momentum labels.** HOT/RISING/STEADY/COOLING give an instant read without doing the math yourself. |
| 🔗 | **Ready-to-open links.** Both the external URL and the HN discussion thread are included per row. |
| ⚡ | **Built on the official HN Algolia Search API.** Stable and durable — no breakage from page redesigns. |
| 🔁 | **Automatic retries.** Transient failures retry with backoff; errors are logged clearly, never silent. |
| 💳 | **Pay per result.** No subscription. A typical run costs $0.09 for a single topic (20 stories); $0.19 comparing 3 topics at 15 results each (45 rows). |

> 📊 Hacker News surfaces thousands of new submissions a day across every technical niche. Sorting by velocity instead of scrolling /new or /best turns that firehose into a ranked shortlist in one run.

***

### 📈 How it compares to alternatives

| Approach | Cost | Coverage | Refresh | Setup |
| --- | --- | --- | --- | --- |
| **⭐ Hacker News Topic Momentum Tracker** *(this Actor)* | $5 free credit, then pay-per-use | Any topic or keyword indexed by HN's official search, across all Hacker News story history | **Live per run** | ⚡ 2 min |
| hckrnews.com / HN newsletters | Free | Daily digest, not niche-specific | Daily | 🐢 Not searchable by topic |
| Manual HN search + mental math | Free | Whatever you click through | One-shot | 🐢 No velocity ranking |
| Manual copy-paste | Free | Current session only | One-shot | 🐢 Hours of clicking |

Pick this Actor when you want a momentum-ranked shortlist for one or several topics on demand - per run, not per scroll session.

***

### 🚀 How to use

1. 📝 **Sign up.** Create a free Apify account with $5 credit (takes 2 minutes).
2. 🌐 **Open the Actor.** Go to the Hacker News Topic Momentum Tracker page on the Apify Store.
3. ✏️ **Set your input.** Enter your topic or keyword in `query` — or just press Start, the prefilled example works.
4. 🚀 **Run it.** Watch results stream into the Dataset tab.
5. 📥 **Download.** Grab results as CSV, Excel, JSON, or XML — or pipe them anywhere via the Apify API.

> ⏱️ Total time from signup to downloaded dataset: **3–5 minutes.** No coding required.

***

### 💼 Business use cases

- 🚀 **Founders** - spot when a competitor space or technology is heating up on HN before it's obvious elsewhere.
- 📣 **Developer marketers** - time a launch post or comment to land while a related discussion is accelerating.
- ✍️ **Technical writers** - find genuinely rising topics to write about, not just evergreen high-point posts.
- 🤖 **AI research agents** - agent calls the Actor via MCP, screens multiple topics on a schedule, flags newly-HOT ones automatically.

***

### 🌟 Beyond business use cases

Data like this powers more than commercial workflows:

- 🎓 **Research & academia** — empirical datasets for papers and coursework; longitudinal studies across scheduled snapshots; reproducible, citable data pulls.
- 🎨 **Personal & creative** — side projects, dashboards, visualizations; content research for bloggers, YouTubers, and podcasters.
- 🤝 **Non-profit & civic** — transparency reporting, advocacy backed by public-interest data, community databases.
- 🧪 **Experimentation** — prototype AI/ML pipelines on real data; validate product hypotheses before engineering spend.

***

### 🔌 Automating Hacker News Topic Momentum Tracker

Control this Actor programmatically for scheduled runs and pipelines:

**Node.js** (`apify-client` on NPM):

```javascript
const { ApifyClient } = require('apify-client');
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('saint_person/hn-topic-momentum-tracker').call({
  "query": "AI agents",
  "daysBack": 14,
  "maxResults": 20
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**Python** (`apify-client` on PyPI):

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('saint_person/hn-topic-momentum-tracker').call(run_input={
  "query": "AI agents",
  "daysBack": 14,
  "maxResults": 20
})
items = client.dataset(run['defaultDatasetId']).list_items().items
```

📚 [Full Apify API documentation](https://docs.apify.com/api/v2)

[Apify Schedules](https://docs.apify.com/platform/schedules) triggers this Actor on any cron interval — hourly for fresh monitoring, daily for feeds, weekly for historical datasets.

***

### 🧠 Use via MCP (for AI agents)

Hacker News Topic Momentum Tracker is directly callable by any MCP-compatible AI agent (Claude, ChatGPT, Cursor, and others) through Apify's hosted MCP server — no custom integration code needed.

Add this to your MCP client config (e.g. Claude Desktop's `claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/sse?actors=saint_person/hn-topic-momentum-tracker",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

Once connected, just ask your agent something like: *"Use the Hacker News Topic Momentum Tracker Actor to pull momentum-ranked story data for my target and summarize it."* The agent reads the input schema automatically and calls the Actor directly — no manual dataset download step.

📚 [Apify MCP server docs](https://docs.apify.com/platform/integrations/mcp)

***

### 🤖 Ask an AI assistant about this Actor

Open a ready-to-send prompt in the AI of your choice:

- 💬 [**ChatGPT**](https://chat.openai.com/?q=How%20do%20I%20use%20the%20Hacker%20News%20Topic%20Momentum%20Tracker%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🧠 [**Claude**](https://claude.ai/new?q=How%20do%20I%20use%20the%20Hacker%20News%20Topic%20Momentum%20Tracker%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🔍 [**Perplexity**](https://perplexity.ai/search?q=How%20do%20I%20use%20the%20Hacker%20News%20Topic%20Momentum%20Tracker%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)

***

### ❓ Frequently Asked Questions

#### 🧩 How does it work?

Enter one topic, or up to 5 comma-separated topics, and click Start. For each topic, the Actor queries the official HN Algolia Search API for matching stories within the requested day range, computes a velocity score for each ((points + 2x comments) / hours since posted), sorts by that score, and returns the top results per topic with a momentum label - so comparing topics means comparing their ranked lists side by side in one dataset.

#### 🔑 Do I need an HN account or API key?

No - the Actor works out of the box. The HN Algolia Search API is public and requires no authentication.

#### 🔥 How is the momentum label calculated?

velocityScore = (points + 2 x numComments) / ageHours. >= 20 = HOT, >= 5 = RISING, >= 1 = STEADY, below 1 = COOLING. Comments count double because sustained discussion signals stronger engagement than a passive upvote.

#### 🌐 Does this cover Ask HN / Show HN posts, not just link submissions?

Yes - any HN story matching your keyword is included, including text-only posts like Ask HN threads. For those, the `url` field is simply null since there's no external link.

#### ⏰ Can I schedule regular runs?

Yes. Use Apify Schedules to run this Actor on any cron interval (hourly, daily, weekly).

#### ⚖️ Is this data legal to collect?

This Actor only collects data that is publicly accessible through the official HN Algolia Search API, a public service run by Algolia in partnership with Y Combinator. No login, no bypass of access controls. You are responsible for complying with the source's Terms of Service and any regulations that apply to your use.

#### 💳 Do I need a paid Apify plan?

No. The free Apify plan is enough for testing and small runs. Paid plans unlock larger runs, scheduling, and higher concurrency.

#### 🔁 What happens if a run fails?

Transient errors retry automatically with backoff. If a run still fails, the log explains exactly why, and partial results are preserved — you never lose progress.

#### 🆘 What if I need help?

Open an issue on this Actor's Issues tab — reliability is the whole point, and issues get fixed with priority. You can also request custom features or entirely new Actors there.

***

### 🔌 Integrate with any app

Hacker News Topic Momentum Tracker connects to any cloud service via [Apify integrations](https://apify.com/integrations):

- [**Zapier**](https://docs.apify.com/platform/integrations/zapier) — connect with 5,000+ apps
- [**Make**](https://docs.apify.com/platform/integrations/make) — automate multi-step workflows
- [**n8n**](https://docs.apify.com/platform/integrations) — self-hosted automation
- [**Google Sheets**](https://docs.apify.com/platform/integrations/drive) — export datasets to a shared sheet
- [**Slack**](https://docs.apify.com/platform/integrations/slack) — run notifications in your channels
- [**Gmail**](https://docs.apify.com/platform/integrations/gmail) — email results automatically after each run
- [**Webhooks**](https://docs.apify.com/platform/integrations/webhooks) — trigger downstream pipelines
- [**MCP**](https://docs.apify.com/platform/integrations/mcp) — let AI agents call this Actor directly

***

### 🧩 Works even better together

Pair this Actor with a content or competitive-intelligence pipeline: track momentum here, then feed HOT/RISING topics into your own alerting, newsletter, or content calendar tooling. Run it on a daily Apify Schedule to catch topics the moment they start accelerating.

***

### 🔗 Recommended Actors

- 📺 **[YouTube Content Gap Analyzer](https://apify.com/saint_person/youtube-content-gap-analyzer)** - find untapped video ideas in any niche.
- 🦋 **[Bluesky Niche Analytics](https://apify.com/saint_person/bluesky-niche-analytics)** - find the top engaged accounts in any topic.
- 🌍 **[USGS Seismic Risk Profiler](https://apify.com/saint_person/usgs-seismic-risk-profiler)** - assess earthquake risk for any US location.
- 📈 **[Public Company Financials](https://apify.com/saint_person/public-company-financials)** - 5-year financial trends for any US public company.

> 💡 **Pro tip:** browse the complete [ParseForge collection](https://apify.com/saint_person) for more tools like this.

***

### 🆘 Help & custom requests

- 🐛 **Something not working?** Open an issue on this Actor's **Issues tab** — reliability is the whole point, and issues are fixed with priority.
- 🛠️ **Need a custom feature, a different data source, or an entirely new Actor built for you?** Open an issue describing what you need — custom builds are available.

***

> **⚠️ Disclaimer:** this Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Y Combinator (Hacker News). All trademarks are the property of their respective owners. Only publicly available data is collected.

# Actor input Schema

## `query` (type: `string`):

One topic (e.g. 'AI agents'), or multiple comma-separated topics to compare momentum across in the same run (e.g. 'rust, zig, go'). Max 5 topics per run.

## `daysBack` (type: `integer`):

How many days back to search for stories. Default 14.

## `maxResults` (type: `integer`):

Maximum momentum-ranked stories to return PER topic (if comparing multiple topics, each gets its own top-N). Controls your cost: you pay per result.

## Actor input object example

```json
{
  "query": "AI agents",
  "daysBack": 14,
  "maxResults": 20
}
```

# 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 = {
    "query": "AI agents",
    "daysBack": 14,
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("saint_person/hn-topic-momentum-tracker").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 = {
    "query": "AI agents",
    "daysBack": 14,
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("saint_person/hn-topic-momentum-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "AI agents",
  "daysBack": 14,
  "maxResults": 20
}' |
apify call saint_person/hn-topic-momentum-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=saint_person/hn-topic-momentum-tracker",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Hacker News Topic Momentum Tracker",
        "description": "Track which Hacker News stories in any topic are gaining real momentum right now, ranked by engagement velocity, not just raw points.",
        "version": "1.0",
        "x-build-id": "8ZJNszG9etgQ51dSG"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/saint_person~hn-topic-momentum-tracker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-saint_person-hn-topic-momentum-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/saint_person~hn-topic-momentum-tracker/runs": {
            "post": {
                "operationId": "runs-sync-saint_person-hn-topic-momentum-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/saint_person~hn-topic-momentum-tracker/run-sync": {
            "post": {
                "operationId": "run-sync-saint_person-hn-topic-momentum-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "query"
                ],
                "properties": {
                    "query": {
                        "title": "Topic(s) or keyword(s)",
                        "type": "string",
                        "description": "One topic (e.g. 'AI agents'), or multiple comma-separated topics to compare momentum across in the same run (e.g. 'rust, zig, go'). Max 5 topics per run."
                    },
                    "daysBack": {
                        "title": "Days of history",
                        "minimum": 1,
                        "maximum": 90,
                        "type": "integer",
                        "description": "How many days back to search for stories. Default 14.",
                        "default": 14
                    },
                    "maxResults": {
                        "title": "Max results per topic",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum momentum-ranked stories to return PER topic (if comparing multiple topics, each gets its own top-N). Controls your cost: you pay per result.",
                        "default": 20
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
