# Niche & Product Idea Demand Validator (Score 0-100) (`happysproutstore/niche-demand-validator`) Actor

Validate product and niche ideas in one run: Google, YouTube and Amazon autocomplete, Google Trends 5-year growth and seasonality, and App Store / Google Play review pain, combined into a transparent 0-100 Demand Score with a plain-English verdict.

- **URL**: https://apify.com/happysproutstore/niche-demand-validator.md
- **Developed by:** [Recep Vural](https://apify.com/happysproutstore) (community)
- **Categories:** Marketing, SEO tools, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 1,000 idea validateds

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

## Niche & Product Idea Demand Validator

Paste a list of niche, product or app ideas. For **each idea** the Actor checks three free public signals and returns **one row with a 0-100 Demand Score, every score component and a plain-English verdict**, for example:

> `strong: growing demand, seasonal, peaks in Jun`
> `promising: stable demand, users unhappy with current apps (top complaint: pricing subscription)`
> `very weak: too little search volume for Google Trends, few people search for it`

| Signal | Source | What it tells you |
|---|---|---|
| Search breadth | Google, YouTube and Amazon autocomplete (idea + 8 variations such as *best*, *vs*, *for*, *alternative*) | How many different things people type around the idea, and how many of them are buying searches |
| Momentum | Google Trends, past 5 years | Year-over-year growth, 5-year direction, seasonality and peak months |
| Opportunity gap (apps only) | App Store + Google Play, most recent reviews of the top apps | How many people already use apps for this, how unhappy they are, what they complain about and wish for |

No API keys, no LLM: every number comes from rules you can read below.

### Who it is for

- Indie hackers and SaaS founders choosing what to build next
- Amazon, Etsy and print-on-demand sellers screening product ideas before ordering stock
- Content creators and agencies picking niches for channels, blogs or clients
- Analysts who need a quick, repeatable first filter for a long list of ideas

### Input example

```json
{
  "ideas": ["habit tracker app", "cooling towel", "sourdough starter tracker app"],
  "countries": ["us", "gb"],
  "language": "en",
  "autocompleteDepth": "standard",
  "includeTrends": true,
  "appReviews": "auto"
}
```

Write ideas the way a buyer would search for them. `appReviews: "auto"` analyzes app reviews only when the idea looks like software (it contains *app*, *software*, *tracker*, *plugin*, *extension*...). Use `"always"` or `"never"` to override.

### Output example (shortened)

```json
{
  "idea": "habit tracker app",
  "country": "US",
  "demandScore": 84,
  "verdict": "strong: growing demand, users mostly satisfied with current apps",
  "componentsMeasured": "100/100 points",
  "scoreComponents": {
    "searchBreadth":      {"points": 25.0, "maxPoints": 25, "basis": "85 relevant autocomplete suggestions (full points at 80)"},
    "sourceCoverage":     {"points": 6.7,  "maxPoints": 10, "basis": "2/3 sources return 3+ relevant suggestions"},
    "buyerIntent":        {"points": 5.0,  "maxPoints": 5,  "basis": "29 suggestions with buying words (best, vs, cheap, review...; full at 8)"},
    "trendMomentum":      {"points": 25.0, "maxPoints": 25, "basis": "YoY 80.2% (-50%..+50% scaled), 5-year direction rising"},
    "currentInterest":    {"points": 9.8,  "maxPoints": 10, "basis": "last 12 months at 98% of the best 12-month period in the window"},
    "existingAppDemand":  {"points": 8.0,  "maxPoints": 8,  "basis": "1,127,484 ratings on the top apps (log scale, full at 1,000,000)"},
    "userDissatisfaction":{"points": 2.0,  "maxPoints": 10, "basis": "8% of recent reviews are 1-2 stars (full at 40%)"},
    "unmetWishes":        {"points": 2.8,  "maxPoints": 7,  "basis": "0.08 feature wishes per review (full at 0.2)"}
  },
  "trendDirection": "rising", "yoyGrowthPercent": 80.2, "seasonalityLabel": "seasonal", "peakMonths": ["Jan", "Dec"],
  "appLowStarShare": 0.08, "topComplaint": "missing_feature",
  "autocomplete": {"relevantSuggestions": 85, "relevantBySource": {"google": 61, "youtube": 41, "amazon": 0},
                   "topSuggestions": [{"suggestion": "habit tracker app free", "sources": ["google", "youtube"]}]},
  "trends": {"monthsUntilPeak": 3, "lowMonths": ["Oct"], "monthlySeasonalityIndex": {"Jan": 154.0, "...": 0}},
  "appReviews": {"appsAnalyzed": 6, "reviewsAnalyzed": 300, "willingToPayCount": 3,
                 "topComplaintCategories": [{"category": "missing_feature", "share": 0.073}],
                 "sampleWishes": [{"quote": "I wish the reports were better.", "stars": 4, "app": "Habit Tracker"}],
                 "topApps": [{"store": "appstore", "name": "Habit Tracker", "ratingCount": 148099, "averageRating": 4.79}]},
  "warnings": [],
  "error": null
}
```

The key-value store record `OUTPUT` holds all ideas ranked by Demand Score.

### How the Demand Score works

The score is **points earned / points available x 100**, over the components that were measured:

| Component | Max | Full points when |
|---|---|---|
| searchBreadth | 25 | 80 relevant suggestions (20 in basic mode). A suggestion is relevant when it contains every core word of the idea |
| sourceCoverage | 10 | every selected source returns 3+ relevant suggestions |
| buyerIntent | 5 | 8 suggestions contain buying words (best, buy, cheap, review, vs, price...) |
| trendMomentum | 25 | YoY growth +50% or more (60%) and a rising 5-year slope (40%) |
| currentInterest | 10 | the last 12 months are the best 12-month period of the 5 years (seasonal products are not punished for being off-season) |
| existingAppDemand | 8 | 1,000,000 ratings across the top apps (log scale) |
| userDissatisfaction | 10 | 40% of recent reviews are 1-2 stars |
| unmetWishes | 7 | 0.2 feature-wish sentences per review |

When app reviews are not analyzed (non-app ideas or `appReviews: "never"`), the score is out of 75 points and rescaled to 100; `componentsMeasured` shows this. Google Trends data that is zero in most months is treated as "search volume too low" and earns 0 trend points.

Verdict tiers: **strong** 70+, **promising** 50-69, **weak** 30-49, **very weak** below 30.

### Pricing

Pay per event: one `idea-validated` event per idea and country that completes with all enabled signals. Rows with an `error` (for example Google Trends kept rate limiting) are still saved so you can see the partial data, but they are **not charged**.

### Limits and good to know

- Google Trends values are relative (0-100 per idea), so the score measures direction and shape, not absolute search volume. Autocomplete breadth is the volume proxy.
- Google limits Trends requests per IP. The Actor retries with a new proxy session and backoff; if Trends fails twice in a row it is skipped for the rest of the run and those rows are free. Use the Residential proxy group for large batches.
- Amazon autocomplete rarely returns suggestions for app ideas (Amazon does not sell apps); that is expected and shows up as lower `sourceCoverage`.
- App analysis reads the most recent 50 reviews per app (configurable up to 250) of the top 3 apps per store; complaint categories are keyword rules (English and Turkish phrases).
- Typical speed: 10-30 seconds per idea.
- The score is a first filter, not a forecast. Always look at the components and quotes before deciding.

Not affiliated with Google, Apple or Amazon. By HAPPYSPROUTSTORE LLC.

# Actor input Schema

## `ideas` (type: `array`):

One niche, product or app idea per line, written the way a buyer would search for it, e.g. "habit tracker app", "cooling towel", "dog birthday cake". Each idea gets its own row and score.

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

Two-letter country codes such as us, gb, de, tr. Every idea is checked in every country (one row and one charge per idea and country). Autocomplete, Google Trends, the Amazon marketplace and the app stores all follow this country.

## `language` (type: `string`):

Two-letter language code for Google / YouTube autocomplete and Google Play reviews, e.g. en, de, tr. Write the ideas in this language.

## `autocompleteSources` (type: `array`):

Where search suggestions are collected. Leave all three for the most reliable score.

## `autocompleteDepth` (type: `string`):

How many variations of each idea are sent to autocomplete. Standard gives a more reliable breadth signal.

## `includeTrends` (type: `boolean`):

Adds 5-year trend direction, year-over-year growth, seasonality and peak months. Turn off for the fastest run; the score is then based on the other components.

## `appReviews` (type: `string`):

Reads recent reviews of the top apps for the idea and measures how unhappy users are (1-2 star share, complaint categories, feature wishes).

## `appStores` (type: `array`):

Stores searched when app review analysis runs.

## `appsPerStore` (type: `integer`):

How many of the top search results are analyzed in each store.

## `reviewPagesPerApp` (type: `integer`):

Most recent reviews read per app. 1 page = 50 reviews.

## `proxyConfiguration` (type: `object`):

Used for Google Trends only, which limits requests per IP. The default Apify proxy is fine for small batches; use the Residential group for large ones.

## Actor input object example

```json
{
  "ideas": [
    "habit tracker app",
    "cooling towel"
  ],
  "countries": [
    "us"
  ],
  "language": "en",
  "autocompleteSources": [
    "google",
    "youtube",
    "amazon"
  ],
  "autocompleteDepth": "standard",
  "includeTrends": true,
  "appReviews": "auto",
  "appStores": [
    "appstore",
    "googleplay"
  ],
  "appsPerStore": 3,
  "reviewPagesPerApp": 1,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "ideas": [
        "habit tracker app",
        "cooling towel"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("happysproutstore/niche-demand-validator").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 = {
    "ideas": [
        "habit tracker app",
        "cooling towel",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("happysproutstore/niche-demand-validator").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 '{
  "ideas": [
    "habit tracker app",
    "cooling towel"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call happysproutstore/niche-demand-validator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,happysproutstore/niche-demand-validator"
        }
    }
}
```

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/E1paosvkhk5McjbKo/builds/XHL39x9fFtTDekAgZ/openapi.json
