{
  "openapi": "3.0.1",
  "info": {
    "title": "Trending Keywords for Your Niche: AI Google Trends Alerts",
    "description": "First 25 trends free. Find trending keywords and topics in your niche, pay per qualified trend: Black Friday 2026 & holiday peaks, rising & breakout keywords with AI angles. Works with MCP & AI agents. Free demo on any plan; live search runs on your Apify account, any plan that runs Store Actors.",
    "version": "0.1",
    "x-build-id": "WTJfE5mHRmFb6o9tC"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rich_minds~trending-keywords-ai/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rich_minds-trending-keywords-ai",
        "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/rich_minds~trending-keywords-ai/runs": {
      "post": {
        "operationId": "runs-sync-rich_minds-trending-keywords-ai",
        "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/rich_minds~trending-keywords-ai/run-sync": {
      "post": {
        "operationId": "run-sync-rich_minds-trending-keywords-ai",
        "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",
        "properties": {
          "nicheKeywords": {
            "title": "Your niche keywords",
            "type": "array",
            "description": "Words your audience cares about. Trending searches are kept only when one appears in the search or its related searches; the rest are dropped free. Typed next to the free demo, they start the live read — trending feeds on any Apify plan, seed keywords on a plan that runs Store Actors, capped by <b>Max source spend</b>.",
            "items": {
              "type": "string"
            }
          },
          "goalDescription": {
            "title": "Your niche in one sentence",
            "type": "string",
            "description": "Who you write or sell for. The AI judges every trend against this sentence and writes the angle in your voice. Example: <i>Home fitness equipment store for women 30–50</i>."
          },
          "preset": {
            "title": "Start from a ready niche search (one click)",
            "enum": [
              "custom",
              "ecommerce-seasonal",
              "fitness-content",
              "agency-roster",
              "agency-tech-news",
              "beauty-skincare",
              "pets",
              "food-recipes",
              "travel",
              "home-decor",
              "parenting",
              "gaming",
              "personal-finance",
              "b2b-saas",
              "crypto"
            ],
            "type": "string",
            "description": "Pick a niche and press Start: it fills the fields you left empty and reads Google Trends live (spend-capped by <b>Max source spend</b>). Your own values always win. <b>Custom</b> = fill the fields yourself.",
            "default": "custom"
          },
          "countries": {
            "title": "Countries to watch",
            "uniqueItems": true,
            "type": "array",
            "description": "One Google Trends trending feed per country, read free on any Apify plan by the built-in reader. US, GB and CA by default — one market over 24 hours often has no trend for a niche. Add up to 10 for an agency or a multi-market brand.",
            "items": {
              "type": "string",
              "enum": [
                "AL",
                "DZ",
                "AO",
                "AR",
                "AM",
                "AU",
                "AT",
                "AZ",
                "BH",
                "BD",
                "BY",
                "BE",
                "BJ",
                "BO",
                "BA",
                "BR",
                "BG",
                "BF",
                "KH",
                "CM",
                "CA",
                "CL",
                "CO",
                "CR",
                "HR",
                "CU",
                "CY",
                "CZ",
                "CD",
                "DK",
                "DO",
                "EC",
                "EG",
                "SV",
                "EE",
                "ET",
                "FI",
                "FR",
                "GE",
                "DE",
                "GH",
                "GR",
                "GT",
                "HT",
                "HN",
                "HK",
                "HU",
                "IN",
                "ID",
                "IR",
                "IQ",
                "IE",
                "IL",
                "IT",
                "CI",
                "JM",
                "JP",
                "JO",
                "KZ",
                "KE",
                "KW",
                "KG",
                "LV",
                "LB",
                "LY",
                "LT",
                "MY",
                "ML",
                "MX",
                "MD",
                "MA",
                "MZ",
                "MM",
                "NP",
                "NL",
                "NZ",
                "NI",
                "NG",
                "MK",
                "NO",
                "OM",
                "PK",
                "PS",
                "PA",
                "PY",
                "PE",
                "PH",
                "PL",
                "PT",
                "PR",
                "QA",
                "RO",
                "RU",
                "SA",
                "SN",
                "RS",
                "SG",
                "SK",
                "SI",
                "ZA",
                "KR",
                "ES",
                "LK",
                "SE",
                "CH",
                "SY",
                "TW",
                "TZ",
                "TH",
                "TT",
                "TN",
                "TR",
                "TM",
                "UG",
                "UA",
                "AE",
                "GB",
                "US",
                "UY",
                "UZ",
                "VE",
                "VN",
                "YE",
                "ZM",
                "ZW"
              ],
              "enumTitles": [
                "Albania",
                "Algeria",
                "Angola",
                "Argentina",
                "Armenia",
                "Australia",
                "Austria",
                "Azerbaijan",
                "Bahrain",
                "Bangladesh",
                "Belarus",
                "Belgium",
                "Benin",
                "Bolivia",
                "Bosnia and Herzegovina",
                "Brazil",
                "Bulgaria",
                "Burkina Faso",
                "Cambodia",
                "Cameroon",
                "Canada",
                "Chile",
                "Colombia",
                "Costa Rica",
                "Croatia",
                "Cuba",
                "Cyprus",
                "Czechia",
                "DR Congo",
                "Denmark",
                "Dominican Republic",
                "Ecuador",
                "Egypt",
                "El Salvador",
                "Estonia",
                "Ethiopia",
                "Finland",
                "France",
                "Georgia",
                "Germany",
                "Ghana",
                "Greece",
                "Guatemala",
                "Haiti",
                "Honduras",
                "Hong Kong",
                "Hungary",
                "India",
                "Indonesia",
                "Iran",
                "Iraq",
                "Ireland",
                "Israel",
                "Italy",
                "Ivory Coast",
                "Jamaica",
                "Japan",
                "Jordan",
                "Kazakhstan",
                "Kenya",
                "Kuwait",
                "Kyrgyzstan",
                "Latvia",
                "Lebanon",
                "Libya",
                "Lithuania",
                "Malaysia",
                "Mali",
                "Mexico",
                "Moldova",
                "Morocco",
                "Mozambique",
                "Myanmar",
                "Nepal",
                "Netherlands",
                "New Zealand",
                "Nicaragua",
                "Nigeria",
                "North Macedonia",
                "Norway",
                "Oman",
                "Pakistan",
                "Palestine",
                "Panama",
                "Paraguay",
                "Peru",
                "Philippines",
                "Poland",
                "Portugal",
                "Puerto Rico",
                "Qatar",
                "Romania",
                "Russia",
                "Saudi Arabia",
                "Senegal",
                "Serbia",
                "Singapore",
                "Slovakia",
                "Slovenia",
                "South Africa",
                "South Korea",
                "Spain",
                "Sri Lanka",
                "Sweden",
                "Switzerland",
                "Syria",
                "Taiwan",
                "Tanzania",
                "Thailand",
                "Trinidad and Tobago",
                "Tunisia",
                "Turkey",
                "Turkmenistan",
                "Uganda",
                "Ukraine",
                "United Arab Emirates",
                "United Kingdom",
                "United States",
                "Uruguay",
                "Uzbekistan",
                "Venezuela",
                "Vietnam",
                "Yemen",
                "Zambia",
                "Zimbabwe"
              ]
            },
            "default": [
              "US",
              "GB",
              "CA"
            ]
          },
          "minScore": {
            "title": "Minimum relevance (0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "The field that decides what you pay: trends less relevant to your niche than this are dropped and <b>not charged</b>. 50 = a niche keyword in the search itself; raise it to pay only for the closest matches.",
            "default": 50
          },
          "maxQualified": {
            "title": "Max qualified trends per run",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Hard cap on results — and on what <b>this Actor</b> charges: at most this many × $0.009 with AI on (+ ≈ $0.004–0.006 AI tokens each) or × $0.003 with AI off, e.g. 50 × $0.009 = $0.45. The most urgent, most relevant trends come first.",
            "default": 50
          },
          "maxDiscoveryChargeUsd": {
            "title": "Max source spend (USD)",
            "minimum": 0.01,
            "maximum": 1000,
            "type": "number",
            "description": "Hard cap on what the Store Actors of the live read (seed keywords ≈ $0.022 each, rising queries $0.006 each, optional TikTok feeds) may charge your Apify account — $0.50 in the form and for an API call that leaves it out. The trending feeds cost nothing. Runs that would pass it are skipped and the status says so.",
            "default": 0.5
          },
          "enableAi": {
            "title": "AI verdict and content angle",
            "type": "boolean",
            "description": "The AI confirms relevance, says why it matters, flags sensitive topics and writes a headline. <b>On = $0.009 per qualified trend + ≈ $0.004–0.006 AI tokens (≈ $0.015 all in); off = $0.003</b>. Your first 5 trends get live AI verdicts on any plan; all 25 free trends with Apify model access or a paid own key.",
            "default": true
          },
          "notifyEmail": {
            "title": "E-mail me the new trends (optional)",
            "type": "string",
            "description": "After every run with at least one new trend, the digest (what to act on first per country, with links) is e-mailed here through Apify's send-mail Actor. Schedule it daily or weekly and only new trends reach your inbox. Never sent for the free demo."
          },
          "seedKeywords": {
            "title": "Seed keywords to check for momentum (optional)",
            "type": "array",
            "description": "Your own product or topic keywords: each gets a momentum verdict from its Google Trends curve (breakout, rising, seasonal peak soon, stable, declining) plus up to 3 rising queries. <b>$0.01 per seed</b>, read by the built-in reader on any plan; a seed Google refuses is read by the Store scraper on your plan (any plan that runs Store Actors).",
            "items": {
              "type": "string"
            }
          },
          "previewOnly": {
            "title": "Free preview: would my niche get enough trends?",
            "type": "boolean",
            "description": "On = one free 7-day read of your countries' trending feeds: the status says how many trends your niche would have received last week and what that week costs (rules only and with the AI, your first 25 free), with 3 examples in the dataset and a saved task to schedule. Nothing charged, nothing remembered, no AI.",
            "default": false
          },
          "calendarMode": {
            "title": "Seasonal keyword calendar (one-off)",
            "type": "boolean",
            "description": "On = read up to 50 of your <b>seed keywords</b> on 5-year Google Trends curves and get a calendar: the month each one peaks, how strong its season is and the date to start publishing (6 weeks before the peak) — a <code>CALENDAR</code> page and <code>CALENDAR_CSV</code>. <b>$0.02 per keyword</b> (calendar-seed), nothing else charged; then schedule the same seeds weekly. The free demo ignores it.",
            "default": false
          },
          "trendingTimeframe": {
            "title": "Trending window",
            "enum": [
              "4",
              "24",
              "48",
              "168"
            ],
            "type": "string",
            "description": "How far back the country feeds look. <b>The first run of a search reads the past 7 days</b> (when this is left at 24 h), so you see a week of trends at once; your schedule then reads the past 24 h — only new trends. 4 h / 24 h trends are marked <b>publish now</b>, 48 h / 7 days <b>this week</b>.",
            "default": "24"
          },
          "googleCategories": {
            "title": "Google categories (optional)",
            "uniqueItems": true,
            "type": "array",
            "description": "Only trending searches of these Google categories (e.g. Health, Shopping). A trend from a category you chose gets +10 relevance. Empty = all categories.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5",
                "6",
                "7",
                "8",
                "9",
                "10",
                "11",
                "13",
                "14",
                "15",
                "16",
                "17",
                "18",
                "19",
                "20"
              ],
              "enumTitles": [
                "Autos and Vehicles",
                "Beauty and Fashion",
                "Business and Finance",
                "Entertainment",
                "Food and Drink",
                "Games",
                "Health",
                "Hobbies and Leisure",
                "Jobs and Education",
                "Law and Government",
                "Other",
                "Pets and Animals",
                "Politics",
                "Science",
                "Shopping",
                "Sports",
                "Technology",
                "Travel and Transportation",
                "Climate"
              ]
            },
            "default": []
          },
          "maxTrendsPerCountry": {
            "title": "Trending searches read per country",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many of a country's trending searches are read (1–1000). Free with the built-in reader; more searches = more chances for your niche.",
            "default": 300
          },
          "maxSeedKeywords": {
            "title": "Max seed keywords per run",
            "minimum": 0,
            "maximum": 50,
            "type": "integer",
            "description": "Cap on the seed keywords read per run ($0.01 each), also for the niche keywords a narrow niche reads as seeds (free). Seed keywords past it are not read; the calendar mode reads up to 50.",
            "default": 5
          },
          "seedTimeframe": {
            "title": "Seed curve period",
            "enum": [
              "now 1-h",
              "now 4-h",
              "now 1-d",
              "now 7-d",
              "today 1-m",
              "today 3-m",
              "today 12-m",
              "today 5-y",
              "all"
            ],
            "type": "string",
            "description": "The curve the momentum verdict reads. <b>Past 5 years</b> is what finds seasonal peaks (two earlier years peaking in the same weeks).",
            "default": "today 12-m"
          },
          "seedGeo": {
            "title": "Seed curve country",
            "enum": [
              "auto",
              "",
              "AF",
              "AL",
              "DZ",
              "AD",
              "AO",
              "AI",
              "AG",
              "AR",
              "AM",
              "AW",
              "AU",
              "AT",
              "AZ",
              "BS",
              "BH",
              "BD",
              "BB",
              "BY",
              "BE",
              "BZ",
              "BJ",
              "BM",
              "BT",
              "BO",
              "BA",
              "BW",
              "BR",
              "BN",
              "BG",
              "BF",
              "BI",
              "KH",
              "CM",
              "CA",
              "CV",
              "CL",
              "CN",
              "CO",
              "KM",
              "CG",
              "CR",
              "HR",
              "CU",
              "CW",
              "CY",
              "CD",
              "DK",
              "DJ",
              "DM",
              "EC",
              "EG",
              "ER",
              "EE",
              "ET",
              "FJ",
              "FI",
              "FR",
              "GA",
              "GM",
              "GE",
              "DE",
              "GH",
              "GI",
              "GR",
              "GL",
              "HK",
              "HU",
              "IS",
              "IN",
              "ID",
              "IR",
              "IQ",
              "IE",
              "IL",
              "IT",
              "CI",
              "JM",
              "JP",
              "JO",
              "KZ",
              "KE",
              "KW",
              "LA",
              "LV",
              "LB",
              "LY",
              "LT",
              "LU",
              "MO",
              "MY",
              "MV",
              "MT",
              "MX",
              "MC",
              "MN",
              "ME",
              "MA",
              "MZ",
              "MM",
              "NA",
              "NP",
              "NL",
              "NZ",
              "NI",
              "NG",
              "KP",
              "NO",
              "OM",
              "PK",
              "PA",
              "PY",
              "PE",
              "PH",
              "PL",
              "PT",
              "QA",
              "RO",
              "RU",
              "RW",
              "SA",
              "SN",
              "RS",
              "SG",
              "SK",
              "SI",
              "SO",
              "ZA",
              "KR",
              "ES",
              "LK",
              "SE",
              "CH",
              "TW",
              "TJ",
              "TZ",
              "TH",
              "TN",
              "TR",
              "UG",
              "UA",
              "AE",
              "GB",
              "US",
              "UY",
              "UZ",
              "VE",
              "VN",
              "YE",
              "ZM",
              "ZW"
            ],
            "type": "string",
            "description": "The country of the seed curves. <b>Auto</b> = your one country when you watch one, else worldwide.",
            "default": "auto"
          },
          "momentumFilter": {
            "title": "Seed verdicts to deliver",
            "uniqueItems": true,
            "type": "array",
            "description": "Seed keywords are delivered (and charged) only with one of these verdicts; the rest are free. Stable and declining are off by default.",
            "items": {
              "type": "string",
              "enum": [
                "breakout",
                "rising",
                "seasonal_peak_soon",
                "stable",
                "declining"
              ],
              "enumTitles": [
                "Breakout",
                "Rising (≥ +20 %)",
                "Seasonal peak within 8 weeks",
                "Stable",
                "Declining (≤ −20 %)"
              ]
            },
            "default": [
              "breakout",
              "rising",
              "seasonal_peak_soon"
            ]
          },
          "includeRisingQueries": {
            "title": "Add rising related queries of my seeds (breakout keywords)",
            "type": "boolean",
            "description": "On by default whenever you have seed keywords: up to 3 rising queries per seed (+4,250 %, Breakout), read with the seed's curve by the built-in reader; for a seed read by the Store scraper, one run of <code>steadyfetch/breakout-keywords-scraper</code> ($0.006 per query on the free plan, inside <b>Max source spend</b>). A failure never fails this run.",
            "default": true
          },
          "includeTimeline": {
            "title": "Include the full seed curve",
            "type": "boolean",
            "description": "Adds each seed keyword's full curve (<code>timeline</code>) to its row. Off = one summary line per keyword (verdict, % change, peak).",
            "default": false
          },
          "nicheSeedFallback": {
            "title": "Narrow niche: read my niche keywords as seeds",
            "type": "boolean",
            "description": "On (default): when today's trending feed matches fewer than 3 trends, the rest of <b>Max source spend</b> reads your niche keywords as seed keywords (momentum + rising queries), so a live run never comes back empty-handed; the status names the yield (\"2 of 355 US searches matched\").",
            "default": true
          },
          "includeTiktok": {
            "title": "Also watch TikTok hashtags (second platform)",
            "type": "boolean",
            "description": "Adds each country's trending TikTok hashtags of the last 7 days (TikTok Creative Center, via <code>data_xplorer/tiktok-trends</code> — 0 failed runs of 13,731 in 30 days) with the same niche filter, one trend each, <code>platform: tiktok</code>. ≈ $0.07 per country on your Apify plan at 30 hashtags, inside <b>Max source spend</b>.",
            "default": false
          },
          "tiktokMaxHashtags": {
            "title": "TikTok hashtags per country",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "How many of a country's trending TikTok hashtags are read ($0.0015 each + $0.025 per country).",
            "default": 30
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "A trend whose search contains one of these is dropped free (e.g. a competitor, <code>nfl</code>); in its related searches it costs −30 relevance.",
            "items": {
              "type": "string"
            }
          },
          "minTrendVolume": {
            "title": "Minimum searches",
            "minimum": 0,
            "type": "integer",
            "description": "Trending searches below this search volume (Google's 500K+ label as a number) are dropped free. 0 = keep all.",
            "default": 0
          },
          "includeSensitive": {
            "title": "Keep sensitive trends",
            "type": "boolean",
            "description": "Tragedies, politics, health claims, adult and legal topics are dropped free by default (brand safety). On = kept and flagged in <code>sensitivity</code>.",
            "default": false
          },
          "targetFlags": {
            "title": "Target flags (any of)",
            "type": "array",
            "description": "Only deliver trends with at least one of these flags, e.g. <code>breakout</code>, <code>commercial_intent</code>, <code>niche_in_term</code> (<code>nicheInTerm</code> works too) — the README's flag table lists all 8; an unknown name stops the run at once with the valid ones.",
            "items": {
              "type": "string"
            }
          },
          "suppressionList": {
            "title": "Never deliver these trends",
            "type": "array",
            "description": "Exact search terms, Google Trends URLs or dedupe keys to skip. Skipped before any processing, never charged.",
            "items": {
              "type": "string"
            }
          },
          "includeRejected": {
            "title": "Also list the trends that did not qualify",
            "type": "boolean",
            "description": "Adds the filtered trends after the qualified ones with their <code>status</code> (below_threshold, excluded, duplicate, no_data, sensitive) — never charged, useful to tune the filters.",
            "default": false
          },
          "dossierTopN": {
            "title": "Trend dossiers for the top trends (opt-in)",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "0 = off. N = a one-page brief for each of the top N publish-now trends (why now, why it matters, the angle, related searches, a 3-point outline) as a <code>DOSSIER-n</code> record to forward to an editor — <b>$0.03 per dossier</b>.",
            "default": 0
          },
          "contentFormats": {
            "title": "Content formats you publish",
            "uniqueItems": true,
            "type": "array",
            "description": "The AI picks one per trend for the angle; without AI the first one is used.",
            "items": {
              "type": "string",
              "enum": [
                "blog",
                "social",
                "newsletter",
                "video",
                "product",
                "ad"
              ],
              "enumTitles": [
                "Blog post",
                "Social post",
                "Newsletter item",
                "Video",
                "Product page / collection",
                "Ad"
              ]
            },
            "default": [
              "blog",
              "social"
            ]
          },
          "outputLanguage": {
            "title": "Language of the AI text",
            "type": "string",
            "description": "Language code for <code>whyItMatters</code> and the angle, e.g. <code>en</code>, <code>de</code>, <code>es</code>. Search terms stay as Google shows them.",
            "default": "en"
          },
          "llmProvider": {
            "title": "AI model access",
            "enum": [
              "apify",
              "byok"
            ],
            "type": "string",
            "description": "<b>Apify (no keys)</b> — the AI runs through Apify's built-in OpenRouter proxy; tokens are billed to your Apify account at OpenRouter's rates. <b>My own key</b> — your OpenAI / Anthropic / Gemini / Groq key; on a free-tier key expect 1–3 AI checks per run — the rest keep their rule score, and the AI stops after 60 s of rate-limit waiting; a paid Groq / Gemini key (billing on) assesses every trend. Measured own-key pace ≈ 1.1–187.7 s per trend: 1.1 s with a free groq:openai/gpt-oss-120b key, 187.7 s with a free google:gemini-3.6-flash key (both measured 2026-09-28) — size a 50-trend run's timeout from the slowest: ≈ 9565 s.",
            "default": "apify"
          },
          "llmModel": {
            "title": "AI model",
            "type": "string",
            "description": "Leave empty for the default (<code>anthropic/claude-haiku-4.5</code>). Apify mode takes an OpenRouter slug such as <code>openai/gpt-4.1-mini</code>; own-key mode takes <code>provider:model</code>, e.g. <code>anthropic:claude-haiku-4-5-20251001</code>."
          },
          "llmApiKey": {
            "title": "Your API key (own-key mode only)",
            "type": "string",
            "description": "Required when <b>AI model access</b> is <i>My own API key</i>. Stored encrypted by Apify, never logged."
          },
          "aiCandidateMultiplier": {
            "title": "AI candidate pool (× max qualified)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "The AI assesses the best rule-scored trends first — every one with a rule relevance of at least Minimum relevance − 20 — up to this multiple of <b>Max qualified</b>. Higher = more thorough, slower, more tokens.",
            "default": 2
          },
          "clients": {
            "title": "Agency clients: one search and report per client (optional)",
            "type": "array",
            "description": "One task for all your clients — edit the 2 example clients (name, <code>nicheKeywords</code>, <code>countries</code>, <code>notifyEmail</code>; also <code>goalDescription</code>, <code>seedKeywords</code>, <code>excludeKeywords</code>, <code>logoUrl</code>, <code>slackWebhookUrl</code>, <code>webhookUrl</code>, <code>showBacklink</code>) and pick <b>Agency roster</b> in the preset list, or set the source to the live read. Each client gets its own live search, memory, digest and a white-label <code>REPORT-&lt;client&gt;</code> page. <b>$0.10 per client report</b> (only with ≥ 1 new trend) on top of the per-trend price; up to 25 clients. The untouched example is never searched unless you pick the Agency roster preset; example.com addresses are never mailed. Runs on your Apify plan like any live read; the free demo does not search it."
          },
          "slackWebhookUrl": {
            "title": "Post the new trends to Slack (optional)",
            "type": "string",
            "description": "A Slack incoming-webhook URL (<code>https://hooks.slack.com/services/…</code>). After every run with at least one new trend, the digest (what to act on first per country, with links) is posted to that channel as a readable message. Never sent for the free demo."
          },
          "discordWebhookUrl": {
            "title": "Post the new trends to Discord (optional)",
            "type": "string",
            "description": "A Discord channel webhook URL (<code>https://discord.com/api/webhooks/…</code> — Server settings → Integrations → Webhooks). After every run with at least one new trend, the same digest as Slack (how many are new, the top 10 with links) is posted to that channel. Never sent for the free demo."
          },
          "teamsWebhookUrl": {
            "title": "Post the new trends to Microsoft Teams (optional)",
            "type": "string",
            "description": "A Teams Workflows webhook URL (in the channel: ⋯ → Workflows → <i>Post to a channel when a webhook request is received</i>). After every run with at least one new trend, the same digest as Slack (how many are new, the top 10 with links) is posted to that channel as a card. Never sent for the free demo."
          },
          "googleChatWebhookUrl": {
            "title": "Post the new trends to Google Chat (optional)",
            "type": "string",
            "description": "A Google Chat space webhook URL (<code>https://chat.googleapis.com/v1/spaces/…</code> — space → Apps & integrations → Webhooks). After every run with at least one new trend, the same digest as Slack is posted to that space. Never sent for the free demo."
          },
          "trendAlerts": {
            "title": "Instant alerts for publish-now trends (opt-in)",
            "type": "boolean",
            "description": "On = every publish-now trend at or above <b>Alert bar</b> is posted at once, one message each, to your Slack / Teams / Google Chat / Discord webhook and <code>webhookUrl</code> — before the digest. <b>$0.01 per alert</b> (trend-alert) that reached a channel, at most 10 per run. Pair it with a schedule every few hours for Black Friday week.",
            "default": false
          },
          "alertMinScore": {
            "title": "Alert bar (relevance 0–100)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Only publish-now trends at or above this relevance are sent as instant alerts.",
            "default": 80
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "Qualified trends are POSTed here as JSON (Zapier, Make, n8n, your CRM). For Google Sheets / Slack you can also use Apify's built-in Integrations tab. Stored encrypted — Zapier / Make hook URLs carry their secret in the path."
          },
          "webhookHeaders": {
            "title": "Webhook headers (optional)",
            "type": "object",
            "description": "Extra HTTP headers for the webhook, e.g. <code>{\"Authorization\": \"Bearer …\"}</code>. Stored encrypted by Apify, never logged."
          },
          "webhookBatchSize": {
            "title": "Webhook batch size",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "1 = one POST per trend the moment it is ready. Higher = one POST per N trends.",
            "default": 1
          },
          "dedupeAcrossRuns": {
            "title": "Never output the same trend twice",
            "type": "boolean",
            "description": "Remembers every trend you were charged for (term + country + type, plus the verdict of a seed) in a named key-value store on your account and skips it in future runs.",
            "default": true
          },
          "dedupeStoreName": {
            "title": "Dedupe store name",
            "type": "string",
            "description": "Key-value store used for cross-run memory. Left at the default, the memory is kept per search (countries, niche and seed keywords): rewording <code>goalDescription</code> keeps it, so a scheduled run never re-delivers a trend you already have — a seed keyword comes back only when its verdict changes. Running it for several clients on one account, type one name per client.",
            "default": "trending-keywords-seen"
          },
          "dedupeTtlDays": {
            "title": "Deliver a trend again after (days)",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "How long a delivered trend stays remembered. 60 (default) lets a trend that comes back — Halloween costumes each October, a product's yearly launch — reach you again after 60 days, charged again as a new trend. 0 = never deliver or charge it again. A seed keyword also returns whenever its verdict changes.",
            "default": 60
          },
          "historyDatasetName": {
            "title": "Keep a running log (dataset name)",
            "type": "string",
            "description": "Optional. Type a name (e.g. <code>trending-keywords-log</code>) and every run appends its new trends with the date to that named dataset on your account — one list across months to connect to Google Sheets or Looker Studio once. Empty = off. Costs nothing extra.",
            "default": ""
          },
          "reportBacklink": {
            "title": "Link the report page to this Actor",
            "type": "boolean",
            "description": "On (default): the REPORT page ends with 'Made with Trending Keywords for Your Niche — try it free', linked to the Store page. Agency client reports stay white-label unless the client has <code>\"showBacklink\": true</code>.",
            "default": true
          },
          "sourceMode": {
            "title": "Where do the trends come from?",
            "enum": [
              "actor",
              "dataset",
              "list"
            ],
            "type": "string",
            "description": "<b>actor</b> — read Google Trends live: the country feeds through the built-in reader (any plan, no source bill), seed keywords and rising queries through Store Actors on your account (billed by them, capped). <b>dataset</b> — an existing dataset of a Google Trends Actor. <b>list</b> — trends you paste in. The mode you choose always runs as chosen; only the untouched sample next to niche keywords you typed switches to the live read (spend-capped). <code>{}</code> over the API runs the free demo — nothing charged.",
            "default": "actor"
          },
          "autoSwitchToLive": {
            "title": "Typed search next to the sample starts the live read",
            "type": "boolean",
            "description": "On (default): niche or seed keywords typed next to the untouched sample trends start the live read (spend-capped; <code>OUTPUT.switchedToLive</code> names them). Off: the mode you send is the mode that runs — the sample stays the free demo and the status names the keywords it did not search. API pipelines that must never start a live read on their own: send <code>false</code>.",
            "default": true
          },
          "trendingSource": {
            "title": "Google Trends reader",
            "enum": [
              "builtin",
              "actor"
            ],
            "type": "string",
            "description": "<b>builtin</b> (default) — reads Google Trends directly over HTTP: the Trending Now lists (free) and every seed keyword's curve and rising queries ($0.01 per seed), on any plan; a country or seed Google refuses is read by the Store scrapers instead (inside <b>Max source spend</b>). <b>actor</b> — always the Store scrapers (<code>data_xplorer/google-trends-fast-scraper</code>, ≈ $0.022 per country or seed on your plan, plus the rising queries).",
            "default": "builtin"
          },
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "Only for <b>dataset</b> mode: a dataset of data_xplorer/google-trends-fast-scraper, apify/google-trends-scraper or any Google Trends Actor (fields: README → List-mode rows). Pick it so the Actor is granted read access."
          },
          "itemsList": {
            "title": "Trends to process",
            "type": "array",
            "description": "Only for <b>list</b> mode. JSON array of trends: a flat row with <code>term</code> (plus optional <code>related_terms</code>, <code>trend_volume</code>, <code>geo</code>, <code>timeframe_hours</code>), a source item with <code>trending_searches[]</code>, a seed row with <code>keyword</code> + <code>timeline_data</code>, or a rising-queries row. The prefilled sample is the free demo."
          },
          "discoveryActorId": {
            "title": "Source Actor (advanced)",
            "type": "string",
            "description": "Store Actor for seed keywords (and the trending feed with <b>Trending feed reader</b> = actor, or when Google refuses the built-in read) — the Google Trends Scraper by data_xplorer (0.7 % failed runs, 2026-09-28). Another Actor with the same input and output fields works too.",
            "default": "data_xplorer/google-trends-fast-scraper"
          },
          "discoveryInput": {
            "title": "Extra source input (advanced)",
            "type": "object",
            "description": "Only for <b>actor</b> mode: fields merged into every source run's input as-is (e.g. a <code>proxyConfiguration</code> with the RESIDENTIAL group). The live read runs that Store Actor on your Apify plan — if your plan cannot run Store Actors, paste your own trends in <b>list</b> mode (any plan); <b>dataset</b> only for a dataset you already have."
          },
          "discoveryTimeoutSecs": {
            "title": "Timeout per source run (seconds)",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "Each country / seed run of the source is stopped after this long and what it scraped is used. The rising-queries run has its own 240 s.",
            "default": 300
          },
          "maxToProcess": {
            "title": "Max candidates to process",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Upper bound on how many trends are scored in one run (controls run time). Default = 3 × max qualified."
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}