{
  "openapi": "3.0.1",
  "info": {
    "title": "Cross-Network Trend Radar - Rising Topics",
    "description": "Find what is rising right now across Google Trends, Bluesky, Mastodon, Wikipedia and Hacker News, and flag the few topics rising on more than one at once. Every row carries its own volume scale and the provenance of its series, so a spike ratio appears only where a real daily series was measured.",
    "version": "0.1",
    "x-build-id": "1xUx45M0chEZQc6dr"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/yzy001~cross-network-trend-radar/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-yzy001-cross-network-trend-radar",
        "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/yzy001~cross-network-trend-radar/runs": {
      "post": {
        "operationId": "runs-sync-yzy001-cross-network-trend-radar",
        "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/yzy001~cross-network-trend-radar/run-sync": {
      "post": {
        "operationId": "run-sync-yzy001-cross-network-trend-radar",
        "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": {
          "geos": {
            "title": "Google Trends countries",
            "type": "array",
            "description": "Two-letter country codes for Google Trends, for example US, GB, TW, JP, DE. Each country returns its ten currently rising searches with an approximate traffic bucket and the time it started rising. All 20 countries tested returned data. Leave empty to skip Google Trends.",
            "default": [
              "US",
              "GB",
              "TW",
              "JP",
              "DE"
            ],
            "items": {
              "type": "string"
            }
          },
          "allGeos": {
            "title": "Sweep all 95 verified countries",
            "type": "boolean",
            "description": "Ignore the country list above and sweep every country Google Trends was measured to serve: 95 of 103 codes tested, ten rising searches each, about 950 rows. Costs one request per country. China, Iceland, Luxembourg, Malta, Mongolia, Brunei, Laos and Macau return nothing and are excluded.",
            "default": false
          },
          "includeBluesky": {
            "title": "Bluesky",
            "type": "boolean",
            "description": "Poll Bluesky's official trends endpoint. It returns up to 25 topics, each with a post count, a category, the time it started, and a lifecycle status the platform computes itself (trending, saturating, cooling, stale).",
            "default": true
          },
          "includeMastodon": {
            "title": "Mastodon / fediverse",
            "type": "boolean",
            "description": "Poll trending hashtags across the largest fediverse servers. Each tag arrives with seven days of daily use counts, so a spike ratio and an emergent flag can be computed from a real series.",
            "default": true
          },
          "includeWikipedia": {
            "title": "Wikipedia pageviews",
            "type": "boolean",
            "description": "Find articles whose pageviews jumped. The daily top list is only used to pick candidates; every candidate's actual daily series is then fetched per article, because absence from the top list does not mean zero views.",
            "default": true
          },
          "includeHackerNews": {
            "title": "Hacker News",
            "type": "boolean",
            "description": "Poll the official Hacker News API for front-page stories, with points per hour as the rising measure. Useful for technology topics, noise for everything else.",
            "default": false
          },
          "includeDouyin": {
            "title": "Douyin hot search",
            "type": "boolean",
            "description": "Poll Douyin's public hot-search board. This source returns a snapshot with no history, so its rows never carry a spike ratio. Its host publishes no robots.txt, unlike the other sources which all permit this explicitly, so it is off by default and left to you.",
            "default": false
          },
          "mastodonServers": {
            "title": "Fediverse servers to poll",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "How many of the largest fediverse servers to poll, from the official directory. More servers means better cross-server confirmation and more requests.",
            "default": 12
          },
          "minServerUsers": {
            "title": "Min fediverse server size",
            "minimum": 0,
            "type": "integer",
            "description": "Skip fediverse servers with fewer registered users than this.",
            "default": 1000
          },
          "tagsPerServer": {
            "title": "Tags per fediverse server",
            "minimum": 1,
            "maximum": 40,
            "type": "integer",
            "description": "How many trending hashtags to take from each server.",
            "default": 20
          },
          "wikipediaLanguages": {
            "title": "Wikipedia languages",
            "type": "array",
            "description": "Wikipedia language editions to scan, for example en, ja, de, zh. Each language costs one top-list request plus one request per candidate article.",
            "default": [
              "en"
            ],
            "items": {
              "type": "string"
            }
          },
          "wikipediaCandidates": {
            "title": "Wikipedia candidates per language",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many of the day's most-viewed articles to check for a jump. Each one costs a request for its real daily series.",
            "default": 40
          },
          "hackerNewsStories": {
            "title": "Hacker News stories",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many front-page stories to fetch. Each one costs a request.",
            "default": 40
          },
          "newWithinHours": {
            "title": "Count as new within (hours)",
            "minimum": 1,
            "maximum": 336,
            "type": "integer",
            "description": "A topic whose source-reported start time is younger than this counts as rising, even without a spike ratio. Google Trends and Bluesky both report a start time.",
            "default": 24
          },
          "risingSpikeRatio": {
            "title": "Rising spike ratio",
            "minimum": 1,
            "type": "number",
            "description": "For sources with a real daily series, today must be at least this many times the mean of the prior days to count as rising.",
            "default": 2
          },
          "onlyRising": {
            "title": "Only rising and emergent",
            "type": "boolean",
            "description": "Drop everything that is steady, peaking, declining or stale.",
            "default": false
          },
          "minGoogleTraffic": {
            "title": "Min Google traffic bucket",
            "minimum": 0,
            "type": "integer",
            "description": "Google reports an approximate lower bound such as 2000+. Observed range across countries runs from 100 to a few thousand, so 1000 is already selective. Zero disables this cutoff.",
            "default": 0
          },
          "minBlueskyPosts": {
            "title": "Min Bluesky posts",
            "minimum": 0,
            "type": "integer",
            "description": "Observed post counts run from the low hundreds to about 100,000, with a median near 1,000.",
            "default": 0
          },
          "minMastodonUses": {
            "title": "Min fediverse tag uses today",
            "minimum": 0,
            "type": "integer",
            "description": "Aggregated across the polled servers. Observed median is about 23 and the ceiling about 7,000, so a cutoff of 10,000 returns nothing. 200 to 500 is the selective range.",
            "default": 0
          },
          "minWikipediaViews": {
            "title": "Min Wikipedia views yesterday",
            "minimum": 0,
            "type": "integer",
            "description": "Articles on the daily top list routinely clear 100,000 views, so cutoffs here are in the tens of thousands.",
            "default": 0
          },
          "minHackerNewsPoints": {
            "title": "Min Hacker News points",
            "minimum": 0,
            "type": "integer",
            "description": "Front-page stories typically sit between 50 and 1,000 points.",
            "default": 0
          },
          "minDouyinHotValue": {
            "title": "Min Douyin hot value",
            "minimum": 0,
            "type": "integer",
            "description": "Douyin's own hot value, observed in the millions.",
            "default": 0
          },
          "minPlatforms": {
            "title": "Platforms required to confirm",
            "minimum": 2,
            "maximum": 6,
            "type": "integer",
            "description": "How many distinct platforms a topic must appear on to be reported as cross-platform confirmed. Countries within Google Trends do not count towards this; they are reported separately as geographic spread.",
            "default": 2
          },
          "minGeos": {
            "title": "Countries required for geographic spread",
            "minimum": 2,
            "maximum": 20,
            "type": "integer",
            "description": "How many Google Trends countries a search must rise in to be reported as spreading geographically.",
            "default": 2
          },
          "minSourceShare": {
            "title": "Min share of sources that must answer",
            "minimum": 0,
            "maximum": 1,
            "type": "number",
            "description": "If fewer than this share of the enabled sources return data, the run fails instead of quietly reporting single-source results as cross-platform findings.",
            "default": 0.5
          },
          "maxItems": {
            "title": "Max trend rows",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Cap on individual trend rows. Cross-platform and geographic-spread records are always emitted in full.",
            "default": 500
          },
          "minGeoShare": {
            "title": "Min share of countries that must answer",
            "minimum": 0,
            "maximum": 1,
            "type": "number",
            "description": "If fewer than this share of the requested countries return data, the run fails. All 95 verified countries answered when measured, so a large shortfall means the endpoint changed or is throttling, not that there is no news.",
            "default": 0.7
          },
          "trackAcrossRuns": {
            "title": "Build a history across runs",
            "type": "boolean",
            "description": "Remember what each topic's volume was on your previous runs, in a key-value store on your own account, so snapshot-only sources gain a real measured series. Adds runsSeen, firstSeenAt, volumeChange and runSpikeRatio. The first run has no history, so those fields are null rather than zero, and the series is paced by your schedule, not by days.",
            "default": true
          },
          "watchTerms": {
            "title": "Watch these terms",
            "type": "array",
            "description": "Instead of only discovering what is rising, check whether these specific terms are rising anywhere — a brand, a product, a competitor, a topic. One record per term is returned either way: a term that is rising nowhere still gets a row saying so, because that is the answer and not a failure. Costs no extra requests.",
            "default": [],
            "items": {
              "type": "string"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}