{
  "openapi": "3.0.1",
  "info": {
    "title": "Google News Scraper: Company News Alerts by Keyword",
    "description": "Google News scraper to monitor a keyword or track press coverage of competitors. Give it a list of keywords (or site:domain.com) and get one row per article: headline, source, publish date, link, snippet. Only-new-articles mode for daily alerts to Slack or Google Sheets, or runs from n8n or Make.",
    "version": "1.0",
    "x-build-id": "cs2oD6orf37vBkHXL"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/accountable_eel~google-news-lookup/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-accountable_eel-google-news-lookup",
        "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/accountable_eel~google-news-lookup/runs": {
      "post": {
        "operationId": "runs-sync-accountable_eel-google-news-lookup",
        "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/accountable_eel~google-news-lookup/run-sync": {
      "post": {
        "operationId": "run-sync-accountable_eel-google-news-lookup",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "queries"
        ],
        "properties": {
          "queries": {
            "title": "Search queries to run",
            "type": "array",
            "description": "One search per line: a keyword phrase, or \"site:domain.com\" to search one publisher. Accepted formats: apify, site:techcrunch.com, \"artificial intelligence\". You're only charged for the ones we actually find — a miss costs nothing.",
            "items": {
              "type": "string"
            }
          },
          "language": {
            "title": "Language (hl)",
            "type": "string",
            "description": "Google's hl parameter, e.g. en-US, de, fr.",
            "default": "en-US"
          },
          "country": {
            "title": "Country (gl)",
            "type": "string",
            "description": "Google's gl parameter, e.g. US, DE, GB. Also sets the ceid edition code.",
            "default": "US"
          },
          "maxItems": {
            "title": "Max articles per search",
            "type": "integer",
            "description": "Google News returns up to 100 articles per search; this caps how many you pay for per search line.",
            "default": 20
          },
          "sinceHours": {
            "title": "Only articles from the last N hours",
            "type": "integer",
            "description": "Optional. Drops any article Google News dates earlier than this many hours before the run starts, before you are billed. Use 24 on a daily schedule to get only today's news, even without the monitoring checkbox. Articles with no publish date are kept. Leave empty for no time limit."
          },
          "includeSources": {
            "title": "Only these outlets",
            "type": "array",
            "description": "Optional. One outlet per line: a name as Google News shows it (Reuters, The Verge) or a domain (reuters.com, which also matches its subdomains). Names match exactly, ignoring upper and lower case. Articles from any other outlet are dropped before you are billed. Leave empty to keep every outlet.",
            "items": {
              "type": "string"
            }
          },
          "excludeSources": {
            "title": "Skip these outlets",
            "type": "array",
            "description": "Optional. Same format as 'Only these outlets'. Articles from these outlets are dropped before you are billed. Applied before 'Only these outlets'.",
            "items": {
              "type": "string"
            }
          },
          "dedupeAcrossQueries": {
            "title": "One row per article across searches",
            "type": "boolean",
            "description": "When two or more of your searches find the same article, return and bill it once, under the first search that found it, with every matching search listed in 'Searches that matched'. Has no effect with a single search. Turn off to get every search's full result list.",
            "default": true
          },
          "deltaMode": {
            "title": "Only return articles that are new since the last run",
            "type": "boolean",
            "description": "Turns this actor into a news alert. An article counts as new when its Google News article ID has not been returned for that search by a previous run of the same watchlist. Already-seen articles are dropped before you are billed, so a run with nothing new costs only the run fee. 'Max articles per search' then caps the new articles, and any overflow is delivered on the next run instead of being lost. The first run has nothing to compare against, so it returns up to your cap and remembers the whole feed. Add a \"Send alerts to\" link below to have each new article posted straight to Discord, Slack or Telegram.",
            "default": false
          },
          "deltaName": {
            "title": "Watchlist name (optional)",
            "type": "string",
            "description": "Leave empty and we derive one from your language and country, with a separate memory per search line, so adding a search never re-bills the others. Type your own name to keep two schedules of the same search apart, or to keep one memory across an edition change. Naming a watchlist with the checkbox above off returns every article but still stamps each one with 'Is this article new?' and 'First seen', so you can filter them yourself in Sheets, n8n or Make.",
            "default": ""
          },
          "quietRunOutput": {
            "title": "What a quiet monitoring run writes to the dataset",
            "enum": [
              "summary",
              "none"
            ],
            "type": "string",
            "description": "A quiet run is a search with no new articles since the last run. \"One summary row\" (the default) keeps the row with articleCount 0. \"Nothing\" writes zero items, so a bot or integration reading the dataset never has to skip rows. A search that failed still returns its error row.",
            "default": "summary"
          },
          "notifyUrl": {
            "title": "Send alerts to (Discord or Slack webhook, Telegram bot link, or any URL)",
            "type": "string",
            "description": "Optional, needs monitoring on. After the articles are billed, each new article is posted here as one message: headline, source, date, link and snippet, with a NEW badge. Discord or Slack: paste the channel's webhook URL. Telegram: https://api.telegram.org/bot<token>/sendMessage?chat_id=<chat id>. Any other URL receives JSON. Messages are free, and a message that fails never fails the run (the row's notifyErrors says why). Stored encrypted, never logged or written to the results."
          },
          "notifyFormat": {
            "title": "Message format",
            "enum": [
              "auto",
              "discord",
              "slack",
              "telegram",
              "json"
            ],
            "type": "string",
            "description": "Leave on \"Detect from the link\": discord.com links get Discord messages, hooks.slack.com Slack, api.telegram.org Telegram, anything else JSON. Pick one only to override that.",
            "default": "auto"
          },
          "maxNotificationsPerRun": {
            "title": "Most alert messages per run",
            "type": "integer",
            "description": "Up to 100. Above this, one \"+N more\" message says how many more articles are in the run's dataset, so a busy first run never floods the channel. 0 sends only that one summary message.",
            "default": 20
          },
          "testRun": {
            "title": "Try it first — only process the first 5",
            "type": "boolean",
            "description": "Turn this on to test your input on a small sample before running the full list. Turn it off to process everything.",
            "default": false
          },
          "onlyFound": {
            "title": "Hide rows with no result",
            "type": "boolean",
            "description": "Only keep rows where something was actually found. Misses are always free, whether or not you show them here.",
            "default": false
          },
          "includeKeywords": {
            "title": "Only keep rows containing",
            "type": "array",
            "description": "Optional. Only keep results that mention at least one of these words (e.g. a job title, a city, a product name). Leave empty to keep everything.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Skip rows containing",
            "type": "array",
            "description": "Optional. Drop any result that mentions one of these words. Leave empty to skip nothing.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Stop after this many results",
            "minimum": 1,
            "type": "integer",
            "description": "Optional. Stop the run once this many results have been found — useful for a quick, cheap sample. Leave blank for no limit."
          },
          "columns": {
            "title": "Which columns do you want?",
            "type": "array",
            "description": "Choose which pieces of information to include in each result row. All are included by default.",
            "items": {
              "type": "string",
              "enum": [
                "articleCount",
                "articles",
                "articleId",
                "title",
                "sourceName",
                "publishedAt",
                "url",
                "snippet",
                "isNew",
                "firstSeenAt",
                "matchedQueries",
                "storyId",
                "storySize",
                "isLeadArticle",
                "storyCount",
                "topStories",
                "newArticleCount",
                "avgNewPerRun",
                "spike"
              ],
              "enumTitles": [
                "Articles found",
                "All articles (full list)",
                "Article ID",
                "Article title",
                "Source",
                "Published",
                "Article link",
                "Snippet",
                "Is this article new?",
                "First seen on a run",
                "Searches that matched",
                "Story ID",
                "Outlets covering this story",
                "First article of its story",
                "Stories found",
                "Top stories (most outlets)",
                "New articles this run",
                "Usual new articles per run",
                "Spike?"
              ]
            },
            "default": [
              "articleCount",
              "articles",
              "articleId",
              "title",
              "sourceName",
              "publishedAt",
              "url",
              "snippet",
              "isNew",
              "firstSeenAt",
              "matchedQueries",
              "storyId",
              "storySize",
              "isLeadArticle",
              "storyCount",
              "topStories",
              "newArticleCount",
              "avgNewPerRun",
              "spike"
            ]
          },
          "expandRows": {
            "title": "One row per article (recommended) — turn off for one row per search instead",
            "type": "boolean",
            "description": "When on, each article found gets its own row instead of being grouped under its search. You're still only charged once per search, no matter how many rows it produces.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Parallel requests. Keep conservative — this target has no browser fallback, so getting blocked costs more than slow-and-steady.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy config. Residential recommended for anti-bot-sensitive targets.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}