{
  "openapi": "3.0.1",
  "info": {
    "title": "Google News Media Monitoring Scraper - Brand Mention Monitor",
    "description": "Google News scraper that splits a keyword into day windows: 2070 articles where one plain feed returns 99, measured. Links resolve to the publisher's real address, not a google redirect: 100 of 100 on the default cloud run. 80 editions. Google News API for media monitoring and brand mentions.",
    "version": "0.1",
    "x-build-id": "UAxCMDeTmemAZRdoR"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/snow_leo_data~google-news-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-snow_leo_data-google-news-scraper",
        "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/snow_leo_data~google-news-scraper/runs": {
      "post": {
        "operationId": "runs-sync-snow_leo_data-google-news-scraper",
        "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/snow_leo_data~google-news-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-snow_leo_data-google-news-scraper",
        "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": {
          "queries": {
            "title": "Search terms — one per line",
            "type": "array",
            "description": "What to search Google News for. Google operators work: `tesla OR rivian`, `bitcoin -ethereum`, `\"exact phrase\"`, `site:reuters.com`. Each term is searched separately, and identical articles found by several terms are delivered once.",
            "items": {
              "type": "string"
            }
          },
          "topics": {
            "title": "Topic feeds — Google's own sections",
            "type": "array",
            "description": "Curated Google News sections for the chosen edition. A topic feed returns what Google puts on that section's front page — measured 53 to 70 articles — and cannot be split by day, so it is a snapshot, not a sweep.",
            "items": {
              "type": "string",
              "enum": [
                "WORLD",
                "NATION",
                "BUSINESS",
                "TECHNOLOGY",
                "ENTERTAINMENT",
                "SPORTS",
                "SCIENCE",
                "HEALTH"
              ],
              "enumTitles": [
                "World",
                "Nation",
                "Business",
                "Technology",
                "Entertainment",
                "Sports",
                "Science",
                "Health"
              ]
            },
            "default": []
          },
          "topicUrls": {
            "title": "Custom topic or section pages — paste the address",
            "type": "array",
            "description": "Any topic or section page from news.google.com, e.g. `https://news.google.com/topics/CAAqIQgKIhtDQkFTRGdvSUwyMHZNR3QwTlRFU0FtVnVLQUFQAQ`. Paste the whole address or just the id. Use it for niches with no predefined topic. Some ids Google shows on its own front page answer 404 to the feed; the run report names those instead of returning silence.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "geoLocations": {
            "title": "City feeds — local news, one city per line",
            "type": "array",
            "description": "Local news sections, e.g. `Chicago`, `Manchester`, `Munich`. Spell the city the way Google News does: for a name it does not know it silently returns the national feed instead of an error. Those rows are marked `geo_fallback: true` and the run log names the swap.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includeTopStories": {
            "title": "Add the edition's top stories",
            "type": "boolean",
            "description": "Also collect the front page of the chosen edition — the same list Google News shows on news.google.com.",
            "default": false
          },
          "edition": {
            "title": "Edition — country and language",
            "enum": [
              "US:en",
              "GB:en",
              "CA:en",
              "AU:en",
              "IN:en",
              "IE:en",
              "NZ:en",
              "ZA:en",
              "SG:en",
              "PH:en",
              "NG:en",
              "PK:en",
              "KE:en",
              "GH:en",
              "TZ:en",
              "UG:en",
              "DE:de",
              "AT:de",
              "CH:de",
              "FR:fr",
              "BE:fr",
              "CA:fr",
              "ES:es",
              "MX:es-419",
              "AR:es-419",
              "CL:es-419",
              "CO:es-419",
              "PE:es-419",
              "US:es-419",
              "VE:es-419",
              "IT:it",
              "NL:nl",
              "BE:nl",
              "PT:pt-150",
              "BR:pt-419",
              "RU:ru",
              "UA:ru",
              "UA:uk",
              "PL:pl",
              "CZ:cs",
              "SK:sk",
              "HU:hu",
              "RO:ro",
              "BG:bg",
              "GR:el",
              "TR:tr",
              "IL:he",
              "SE:sv",
              "NO:no",
              "DK:da",
              "FI:fi",
              "LT:lt",
              "LV:lv",
              "EE:et",
              "SI:sl",
              "HR:hr",
              "RS:sr",
              "JP:ja",
              "KR:ko",
              "CN:zh-Hans",
              "TW:zh-Hant",
              "HK:zh-Hant",
              "TH:th",
              "VN:vi",
              "ID:id",
              "MY:ms",
              "IN:hi",
              "IN:bn",
              "IN:ta",
              "IN:te",
              "IN:mr",
              "IN:ml",
              "IN:gu",
              "IN:kn",
              "BD:bn",
              "EG:ar",
              "SA:ar",
              "AE:ar",
              "LB:ar",
              "IR:fa"
            ],
            "type": "string",
            "description": "Which Google News edition to read. All 80 listed here were checked live and returned articles. The edition decides both the language of the results and which publishers Google considers local.",
            "default": "US:en"
          },
          "daysBack": {
            "title": "How many days back to sweep",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "How far the day-window sweep goes for each search term. One extra day is one extra request and up to 100 more articles. Google News keeps searchable archives far beyond a month, but older days return fewer articles.",
            "default": 7
          },
          "breakFeedCap": {
            "title": "Go past the ~100-article feed cap",
            "type": "boolean",
            "description": "Split each search term into one request per day so the run is not stopped by the feed cap. Turn it off to get exactly what a single Google News feed returns — faster, about 100 articles per term, and the report says the cap was hit.",
            "default": true
          },
          "resolveArticleUrls": {
            "title": "Resolve links to the real publisher URL",
            "type": "boolean",
            "description": "Google News links point at `news.google.com/rss/articles/CBMi…`, not at the publisher. With this on, every article also gets the publisher's own URL in `url`. It costs one extra page read per article; measured 30 out of 30 resolved on live output. With it off, `url` is empty and `url_resolved` is false — the field is never filled with a Google redirect pretending to be an article link.",
            "default": true
          },
          "fetchArticleMeta": {
            "title": "Also fetch the article description and image from the publisher",
            "type": "boolean",
            "description": "Google News feeds carry no article summary and no image — the feed's description field just repeats the headline. With this on, the Actor opens each resolved publisher page and takes `og:description` and `og:image` from it. No proxy is used, so some publishers refuse: measured on 40 live articles, 27 answered and 26 gave both fields. The run report says how many succeeded; the rest keep those fields empty rather than inventing them.",
            "default": false
          },
          "maxItems": {
            "title": "Maximum articles to deliver",
            "minimum": 0,
            "type": "integer",
            "description": "Hard stop on how many rows land in the dataset, which is also how many you pay for. This limits the OUTPUT, not the crawl: when your filters are on, the run collects more than this and stops when it has delivered enough. 0 means no limit.",
            "default": 0
          },
          "onlyNew": {
            "title": "Only articles not delivered before (monitor mode)",
            "type": "boolean",
            "description": "Remembers what earlier runs already delivered and skips it, so a scheduled run pays only for what is genuinely new. Memory lives in a named key-value store and survives between runs. A run with nothing new writes zero rows and says so in the log and in `empty_reason`.",
            "default": false
          },
          "emitUnchanged": {
            "title": "In monitor mode, also return unchanged articles",
            "type": "boolean",
            "description": "Delivers articles marked `UNCHANGED` too. Useful for a full snapshot on every run; it means paying again for rows you already have.",
            "default": false
          },
          "titleContains": {
            "title": "Keep only articles mentioning any of these words",
            "type": "array",
            "description": "Case-insensitive match against the headline and the snippet. An article passes if it contains at least one of these.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Drop articles mentioning any of these words",
            "type": "array",
            "description": "Case-insensitive match against the headline and the snippet. An article is dropped if it contains any of these.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "publishers": {
            "title": "Keep only these publishers — domains, one per line",
            "type": "array",
            "description": "Domains such as `reuters.com` or `bbc.com`. Subdomains count, so `bbc.com` keeps `news.bbc.com`. The domain comes from the feed itself, so this works with URL resolution switched off too. Articles whose publisher Google did not state are kept, not dropped — missing data is not a mismatch.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludePublishers": {
            "title": "Drop these publishers — domains, one per line",
            "type": "array",
            "description": "Domains to remove from the results, e.g. an aggregator you do not want. Subdomains count.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "publishedWithinHours": {
            "title": "Only articles published in the last N hours",
            "minimum": 0,
            "type": "integer",
            "description": "Filters on the publication time from the feed. 0 turns it off. Articles with no publication date are kept.",
            "default": 0
          },
          "withUrlOnly": {
            "title": "Only articles whose publisher URL was resolved",
            "type": "boolean",
            "description": "Drops rows where the Google redirect could not be turned into a publisher URL. This needs resolution, so switching it on switches resolution on as well, and the log says so.",
            "default": false
          },
          "minRelatedArticles": {
            "title": "Only stories covered by at least N other outlets",
            "minimum": 0,
            "type": "integer",
            "description": "Google groups coverage of one story and lists the other outlets inside the feed entry. Set 1 or more to keep only stories that several outlets picked up — a cheap relevance signal. 0 turns it off.",
            "default": 0
          },
          "includeRelatedArticles": {
            "title": "Include the related-coverage list",
            "type": "boolean",
            "description": "Keeps the `related` array — the other outlets covering the same story, with their headlines. Turn off for a smaller, flatter dataset.",
            "default": true
          },
          "compactOutput": {
            "title": "Compact output — 12 fields instead of 25",
            "type": "boolean",
            "description": "Keeps only headline, URL, publisher, domain, date, snippet and the origin fields. Made for AI agents and spreadsheets that choke on wide rows.",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "Drop empty fields from each row",
            "type": "boolean",
            "description": "Removes keys whose value is empty, so rows carry only what Google actually published.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}