{
  "data": {
    "id": "kCYje9hZvfrbnutdX",
    "actId": "mlmVX4amk2biciJaB",
    "userId": "9Um4NEFR7z42j35AD",
    "startedAt": "2026-09-18T02:10:52.824Z",
    "finishedAt": "2026-09-18T02:11:02.308Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 9403,
      "runTimeSecs": 9.403,
      "computeUnits": 0.010447777777777778,
      "imageSizeBytes": 601038336
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Google Search Scraper input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"queries\": {\n      \"title\": \"Search queries\",\n      \"type\": \"array\",\n      \"description\": \"Enter 1 to 100 web searches. You can use quoted phrases and search operators such as site:, intitle:, or filetype:. Each engine and exact executed query receives its own saved-result cap.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [\n        \"machine learning tutorials\"\n      ],\n      \"prefill\": [\n        \"machine learning tutorials\"\n      ],\n      \"minItems\": 1,\n      \"maxItems\": 100\n    },\n    \"engines\": {\n      \"title\": \"Search engines\",\n      \"type\": \"array\",\n      \"description\": \"Choose one or more web search engines. Each engine runs independently and keeps its own result ranks.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"google\",\n          \"bing\",\n          \"brave\",\n          \"duckduckgo\"\n        ],\n        \"enumTitles\": [\n          \"Google\",\n          \"Bing\",\n          \"Brave\",\n          \"DuckDuckGo\"\n        ]\n      },\n      \"default\": [\n        \"google\"\n      ],\n      \"minItems\": 1,\n      \"uniqueItems\": true\n    },\n    \"maxResultsPerExecutedQuery\": {\n      \"title\": \"Maximum results per engine query\",\n      \"type\": \"integer\",\n      \"description\": \"Save up to this many results for each query on each engine. Choose 1 to 100. For example, two engines with a limit of 10 can save up to 20 rows for one query. Sources may return fewer.\",\n      \"editor\": \"number\",\n      \"default\": 10,\n      \"minimum\": 1,\n      \"maximum\": 100\n    },\n    \"country\": {\n      \"title\": \"Country\",\n      \"type\": \"string\",\n      \"description\": \"Choose a country for localized results. The same country is requested from every selected engine. Availability and ranking can vary by engine.\",\n      \"editor\": \"select\",\n      \"default\": \"US\",\n      \"enum\": [\n        \"AF\",\n        \"AX\",\n        \"AL\",\n        \"DZ\",\n        \"AS\",\n        \"AD\",\n        \"AO\",\n        \"AI\",\n        \"AQ\",\n        \"AG\",\n        \"AR\",\n        \"AM\",\n        \"AW\",\n        \"AU\",\n        \"AT\",\n        \"AZ\",\n        \"BS\",\n        \"BH\",\n        \"BD\",\n        \"BB\",\n        \"BY\",\n        \"BE\",\n        \"BZ\",\n        \"BJ\",\n        \"BM\",\n        \"BT\",\n        \"BO\",\n        \"BA\",\n        \"BW\",\n        \"BV\",\n        \"BR\",\n        \"IO\",\n        \"VG\",\n        \"BN\",\n        \"BG\",\n        \"BF\",\n        \"BI\",\n        \"KH\",\n        \"CM\",\n        \"CA\",\n        \"CV\",\n        \"BQ\",\n        \"KY\",\n        \"CF\",\n        \"TD\",\n        \"CL\",\n        \"CN\",\n        \"CX\",\n        \"CC\",\n        \"CO\",\n        \"KM\",\n        \"CG\",\n        \"CD\",\n        \"CK\",\n        \"CR\",\n        \"CI\",\n        \"HR\",\n        \"CU\",\n        \"CW\",\n        \"CY\",\n        \"CZ\",\n        \"DK\",\n        \"DJ\",\n        \"DM\",\n        \"DO\",\n        \"EC\",\n        \"EG\",\n        \"SV\",\n        \"GQ\",\n        \"ER\",\n        \"EE\",\n        \"SZ\",\n        \"ET\",\n        \"FK\",\n        \"FO\",\n        \"FJ\",\n        \"FI\",\n        \"FR\",\n        \"GF\",\n        \"PF\",\n        \"TF\",\n        \"GA\",\n        \"GM\",\n        \"GE\",\n        \"DE\",\n        \"GH\",\n        \"GI\",\n        \"GR\",\n        \"GL\",\n        \"GD\",\n        \"GP\",\n        \"GU\",\n        \"GT\",\n        \"GG\",\n        \"GN\",\n        \"GW\",\n        \"GY\",\n        \"HT\",\n        \"HM\",\n        \"HN\",\n        \"HK\",\n        \"HU\",\n        \"IS\",\n        \"IN\",\n        \"ID\",\n        \"IR\",\n        \"IQ\",\n        \"IE\",\n        \"IM\",\n        \"IL\",\n        \"IT\",\n        \"JM\",\n        \"JP\",\n        \"JE\",\n        \"JO\",\n        \"KZ\",\n        \"KE\",\n        \"KI\",\n        \"KW\",\n        \"KG\",\n        \"LA\",\n        \"LV\",\n        \"LB\",\n        \"LS\",\n        \"LR\",\n        \"LY\",\n        \"LI\",\n        \"LT\",\n        \"LU\",\n        \"MO\",\n        \"MG\",\n        \"MW\",\n        \"MY\",\n        \"MV\",\n        \"ML\",\n        \"MT\",\n        \"MH\",\n        \"MQ\",\n        \"MR\",\n        \"MU\",\n        \"YT\",\n        \"MX\",\n        \"FM\",\n        \"MD\",\n        \"MC\",\n        \"MN\",\n        \"ME\",\n        \"MS\",\n        \"MA\",\n        \"MZ\",\n        \"MM\",\n        \"NA\",\n        \"NR\",\n        \"NP\",\n        \"NL\",\n        \"NC\",\n        \"NZ\",\n        \"NI\",\n        \"NE\",\n        \"NG\",\n        \"NU\",\n        \"NF\",\n        \"KP\",\n        \"MK\",\n        \"MP\",\n        \"NO\",\n        \"OM\",\n        \"PK\",\n        \"PW\",\n        \"PS\",\n        \"PA\",\n        \"PG\",\n        \"PY\",\n        \"PE\",\n        \"PH\",\n        \"PN\",\n        \"PL\",\n        \"PT\",\n        \"PR\",\n        \"QA\",\n        \"RE\",\n        \"RO\",\n        \"RU\",\n        \"RW\",\n        \"WS\",\n        \"SM\",\n        \"ST\",\n        \"SA\",\n        \"SN\",\n        \"RS\",\n        \"SC\",\n        \"SL\",\n        \"SG\",\n        \"SX\",\n        \"SK\",\n        \"SI\",\n        \"SB\",\n        \"SO\",\n        \"ZA\",\n        \"GS\",\n        \"KR\",\n        \"SS\",\n        \"ES\",\n        \"LK\",\n        \"BL\",\n        \"SH\",\n        \"KN\",\n        \"LC\",\n        \"MF\",\n        \"PM\",\n        \"VC\",\n        \"SD\",\n        \"SR\",\n        \"SJ\",\n        \"SE\",\n        \"CH\",\n        \"SY\",\n        \"TW\",\n        \"TJ\",\n        \"TZ\",\n        \"TH\",\n        \"TL\",\n        \"TG\",\n        \"TK\",\n        \"TO\",\n        \"TT\",\n        \"TN\",\n        \"TR\",\n        \"TM\",\n        \"TC\",\n        \"TV\",\n        \"UM\",\n        \"VI\",\n        \"UG\",\n        \"UA\",\n        \"AE\",\n        \"GB\",\n        \"US\",\n        \"UY\",\n        \"UZ\",\n        \"VU\",\n        \"VA\",\n        \"VE\",\n        \"VN\",\n        \"WF\",\n        \"EH\",\n        \"YE\",\n        \"ZM\",\n        \"ZW\"\n      ],\n      \"enumTitles\": [\n        \"Afghanistan (AF)\",\n        \"Åland Islands (AX)\",\n        \"Albania (AL)\",\n        \"Algeria (DZ)\",\n        \"American Samoa (AS)\",\n        \"Andorra (AD)\",\n        \"Angola (AO)\",\n        \"Anguilla (AI)\",\n        \"Antarctica (AQ)\",\n        \"Antigua & Barbuda (AG)\",\n        \"Argentina (AR)\",\n        \"Armenia (AM)\",\n        \"Aruba (AW)\",\n        \"Australia (AU)\",\n        \"Austria (AT)\",\n        \"Azerbaijan (AZ)\",\n        \"Bahamas (BS)\",\n        \"Bahrain (BH)\",\n        \"Bangladesh (BD)\",\n        \"Barbados (BB)\",\n        \"Belarus (BY)\",\n        \"Belgium (BE)\",\n        \"Belize (BZ)\",\n        \"Benin (BJ)\",\n        \"Bermuda (BM)\",\n        \"Bhutan (BT)\",\n        \"Bolivia (BO)\",\n        \"Bosnia & Herzegovina (BA)\",\n        \"Botswana (BW)\",\n        \"Bouvet Island (BV)\",\n        \"Brazil (BR)\",\n        \"British Indian Ocean Territory (IO)\",\n        \"British Virgin Islands (VG)\",\n        \"Brunei (BN)\",\n        \"Bulgaria (BG)\",\n        \"Burkina Faso (BF)\",\n        \"Burundi (BI)\",\n        \"Cambodia (KH)\",\n        \"Cameroon (CM)\",\n        \"Canada (CA)\",\n        \"Cape Verde (CV)\",\n        \"Caribbean Netherlands (BQ)\",\n        \"Cayman Islands (KY)\",\n        \"Central African Republic (CF)\",\n        \"Chad (TD)\",\n        \"Chile (CL)\",\n        \"China (CN)\",\n        \"Christmas Island (CX)\",\n        \"Cocos (Keeling) Islands (CC)\",\n        \"Colombia (CO)\",\n        \"Comoros (KM)\",\n        \"Congo - Brazzaville (CG)\",\n        \"Congo - Kinshasa (CD)\",\n        \"Cook Islands (CK)\",\n        \"Costa Rica (CR)\",\n        \"Côte d’Ivoire (CI)\",\n        \"Croatia (HR)\",\n        \"Cuba (CU)\",\n        \"Curaçao (CW)\",\n        \"Cyprus (CY)\",\n        \"Czechia (CZ)\",\n        \"Denmark (DK)\",\n        \"Djibouti (DJ)\",\n        \"Dominica (DM)\",\n        \"Dominican Republic (DO)\",\n        \"Ecuador (EC)\",\n        \"Egypt (EG)\",\n        \"El Salvador (SV)\",\n        \"Equatorial Guinea (GQ)\",\n        \"Eritrea (ER)\",\n        \"Estonia (EE)\",\n        \"Eswatini (SZ)\",\n        \"Ethiopia (ET)\",\n        \"Falkland Islands (FK)\",\n        \"Faroe Islands (FO)\",\n        \"Fiji (FJ)\",\n        \"Finland (FI)\",\n        \"France (FR)\",\n        \"French Guiana (GF)\",\n        \"French Polynesia (PF)\",\n        \"French Southern Territories (TF)\",\n        \"Gabon (GA)\",\n        \"Gambia (GM)\",\n        \"Georgia (GE)\",\n        \"Germany (DE)\",\n        \"Ghana (GH)\",\n        \"Gibraltar (GI)\",\n        \"Greece (GR)\",\n        \"Greenland (GL)\",\n        \"Grenada (GD)\",\n        \"Guadeloupe (GP)\",\n        \"Guam (GU)\",\n        \"Guatemala (GT)\",\n        \"Guernsey (GG)\",\n        \"Guinea (GN)\",\n        \"Guinea-Bissau (GW)\",\n        \"Guyana (GY)\",\n        \"Haiti (HT)\",\n        \"Heard & McDonald Islands (HM)\",\n        \"Honduras (HN)\",\n        \"Hong Kong SAR China (HK)\",\n        \"Hungary (HU)\",\n        \"Iceland (IS)\",\n        \"India (IN)\",\n        \"Indonesia (ID)\",\n        \"Iran (IR)\",\n        \"Iraq (IQ)\",\n        \"Ireland (IE)\",\n        \"Isle of Man (IM)\",\n        \"Israel (IL)\",\n        \"Italy (IT)\",\n        \"Jamaica (JM)\",\n        \"Japan (JP)\",\n        \"Jersey (JE)\",\n        \"Jordan (JO)\",\n        \"Kazakhstan (KZ)\",\n        \"Kenya (KE)\",\n        \"Kiribati (KI)\",\n        \"Kuwait (KW)\",\n        \"Kyrgyzstan (KG)\",\n        \"Laos (LA)\",\n        \"Latvia (LV)\",\n        \"Lebanon (LB)\",\n        \"Lesotho (LS)\",\n        \"Liberia (LR)\",\n        \"Libya (LY)\",\n        \"Liechtenstein (LI)\",\n        \"Lithuania (LT)\",\n        \"Luxembourg (LU)\",\n        \"Macao SAR China (MO)\",\n        \"Madagascar (MG)\",\n        \"Malawi (MW)\",\n        \"Malaysia (MY)\",\n        \"Maldives (MV)\",\n        \"Mali (ML)\",\n        \"Malta (MT)\",\n        \"Marshall Islands (MH)\",\n        \"Martinique (MQ)\",\n        \"Mauritania (MR)\",\n        \"Mauritius (MU)\",\n        \"Mayotte (YT)\",\n        \"Mexico (MX)\",\n        \"Micronesia (FM)\",\n        \"Moldova (MD)\",\n        \"Monaco (MC)\",\n        \"Mongolia (MN)\",\n        \"Montenegro (ME)\",\n        \"Montserrat (MS)\",\n        \"Morocco (MA)\",\n        \"Mozambique (MZ)\",\n        \"Myanmar (Burma) (MM)\",\n        \"Namibia (NA)\",\n        \"Nauru (NR)\",\n        \"Nepal (NP)\",\n        \"Netherlands (NL)\",\n        \"New Caledonia (NC)\",\n        \"New Zealand (NZ)\",\n        \"Nicaragua (NI)\",\n        \"Niger (NE)\",\n        \"Nigeria (NG)\",\n        \"Niue (NU)\",\n        \"Norfolk Island (NF)\",\n        \"North Korea (KP)\",\n        \"North Macedonia (MK)\",\n        \"Northern Mariana Islands (MP)\",\n        \"Norway (NO)\",\n        \"Oman (OM)\",\n        \"Pakistan (PK)\",\n        \"Palau (PW)\",\n        \"Palestinian Territories (PS)\",\n        \"Panama (PA)\",\n        \"Papua New Guinea (PG)\",\n        \"Paraguay (PY)\",\n        \"Peru (PE)\",\n        \"Philippines (PH)\",\n        \"Pitcairn Islands (PN)\",\n        \"Poland (PL)\",\n        \"Portugal (PT)\",\n        \"Puerto Rico (PR)\",\n        \"Qatar (QA)\",\n        \"Réunion (RE)\",\n        \"Romania (RO)\",\n        \"Russia (RU)\",\n        \"Rwanda (RW)\",\n        \"Samoa (WS)\",\n        \"San Marino (SM)\",\n        \"São Tomé & Príncipe (ST)\",\n        \"Saudi Arabia (SA)\",\n        \"Senegal (SN)\",\n        \"Serbia (RS)\",\n        \"Seychelles (SC)\",\n        \"Sierra Leone (SL)\",\n        \"Singapore (SG)\",\n        \"Sint Maarten (SX)\",\n        \"Slovakia (SK)\",\n        \"Slovenia (SI)\",\n        \"Solomon Islands (SB)\",\n        \"Somalia (SO)\",\n        \"South Africa (ZA)\",\n        \"South Georgia & South Sandwich Islands (GS)\",\n        \"South Korea (KR)\",\n        \"South Sudan (SS)\",\n        \"Spain (ES)\",\n        \"Sri Lanka (LK)\",\n        \"St. Barthélemy (BL)\",\n        \"St. Helena (SH)\",\n        \"St. Kitts & Nevis (KN)\",\n        \"St. Lucia (LC)\",\n        \"St. Martin (MF)\",\n        \"St. Pierre & Miquelon (PM)\",\n        \"St. Vincent & Grenadines (VC)\",\n        \"Sudan (SD)\",\n        \"Suriname (SR)\",\n        \"Svalbard & Jan Mayen (SJ)\",\n        \"Sweden (SE)\",\n        \"Switzerland (CH)\",\n        \"Syria (SY)\",\n        \"Taiwan (TW)\",\n        \"Tajikistan (TJ)\",\n        \"Tanzania (TZ)\",\n        \"Thailand (TH)\",\n        \"Timor-Leste (TL)\",\n        \"Togo (TG)\",\n        \"Tokelau (TK)\",\n        \"Tonga (TO)\",\n        \"Trinidad & Tobago (TT)\",\n        \"Tunisia (TN)\",\n        \"Türkiye (TR)\",\n        \"Turkmenistan (TM)\",\n        \"Turks & Caicos Islands (TC)\",\n        \"Tuvalu (TV)\",\n        \"U.S. Outlying Islands (UM)\",\n        \"U.S. Virgin Islands (VI)\",\n        \"Uganda (UG)\",\n        \"Ukraine (UA)\",\n        \"United Arab Emirates (AE)\",\n        \"United Kingdom (GB)\",\n        \"United States (US)\",\n        \"Uruguay (UY)\",\n        \"Uzbekistan (UZ)\",\n        \"Vanuatu (VU)\",\n        \"Vatican City (VA)\",\n        \"Venezuela (VE)\",\n        \"Vietnam (VN)\",\n        \"Wallis & Futuna (WF)\",\n        \"Western Sahara (EH)\",\n        \"Yemen (YE)\",\n        \"Zambia (ZM)\",\n        \"Zimbabwe (ZW)\"\n      ]\n    },\n    \"language\": {\n      \"title\": \"Language\",\n      \"type\": \"string\",\n      \"description\": \"Language code used by search engines where supported, such as en, fr, de, or ja.\",\n      \"editor\": \"textfield\",\n      \"default\": \"en\",\n      \"minLength\": 2,\n      \"maxLength\": 12\n    },\n    \"safeSearch\": {\n      \"title\": \"Safe search\",\n      \"type\": \"boolean\",\n      \"description\": \"Ask supported engines to filter explicit results. Search engines may apply their own local rules.\",\n      \"editor\": \"checkbox\",\n      \"default\": true\n    },\n    \"includeSponsoredResults\": {\n      \"title\": \"Include sponsored results\",\n      \"type\": \"boolean\",\n      \"description\": \"Off by default. When off, sponsored results are omitted. When on, they are saved with isSponsored and advertiserDomain fields.\",\n      \"editor\": \"checkbox\",\n      \"default\": false\n    }\n  },\n  \"required\": [\n    \"queries\"\n  ]\n}",
    "readme": "# Google Search Scraper — Bing, Brave & DuckDuckGo\n\n## 🏠 What does Google Search Scraper do?\n\nGoogle Search Scraper collects public results from Google, Bing, Brave, and\nDuckDuckGo. Google works on its own. You can add other engines when you want\nmore coverage or want to compare ranks.\n\nThe main output is a search result observation. Each row tells you:\n\n- ⚙️ which exact query the Actor ran;\n- 🧭 which search engine returned the result;\n- 🏅 where the supported result block appeared;\n- 🔗 which public URL was found;\n- 📝 its title and any snippet the engine showed.\n\nOne engine result is one row. Results are not merged across engines. If Google\nreturns 10 results and DuckDuckGo returns 10 results, the dataset can contain\n20 rows. If both engines find the same URL, both rows stay in the dataset.\n\nUse the Actor for SEO checks, brand tracking, competitor research, site search,\npublic mention discovery, lead research, scheduled alerts, AI tools, and RAG.\n\n## 🔎 What can it search?\n\nEach query runs exactly as entered. You can use normal text, quoted phrases,\n`site:`, `intitle:`, `filetype:`, exclusions, and other operators supported by\nthe selected search engine.\n\n## 🧭 Supported search engines\n\n| Engine        | Web search |\n| ------------- | ---------- |\n| 🔵 Google     | Yes        |\n| 🟦 Bing       | Yes        |\n| 🦁 Brave      | Yes        |\n| 🦆 DuckDuckGo | Yes        |\n\nEach engine runs as its own search. If one engine fails, useful rows from other\nengines can still be saved. The run summary shows what happened.\n\n## 📦 What data can I extract?\n\nThe dataset grain is:\n\n`one run + one engine + one executed query + one page + one result position`\n\n| Data group          | Fields                                             |\n| ------------------- | -------------------------------------------------- |\n| 🏠 Run              | `runId`                                            |\n| 🔎 Search request   | `country`, `language`, `safeSearch`                |\n| ⚙️ Search execution | `engine`, `executedQuery`                          |\n| 🏅 Position         | `page`, `rankOnPage`, `rank`                       |\n| 🔗 Result           | `title`, `canonicalUrl`, `resultDomain`, `snippet` |\n| 📣 Sponsored result | `isSponsored`, `advertiserDomain`                  |\n| 🕐 Observation      | `observedAt`, `schemaVersion`                      |\n\nMissing public values stay `null`. They are not guessed.\n\n### What does `executedQuery` mean?\n\n`executedQuery` is the exact query one engine received. Search operators remain\npart of this value, so every row keeps its own query and engine origin.\n\n## 🚀 Quick start\n\n1. Open the Actor in Apify Console.\n2. Enter one or more queries.\n3. Pick Google or add more engines.\n4. Start with 10 results.\n5. Click **Start**.\n6. Open **Output** to view or export the rows.\n\n### 🌐 Small Google search\n\n```json\n{\n  \"queries\": [\"machine learning tutorials\"],\n  \"engines\": [\"google\"],\n  \"maxResultsPerExecutedQuery\": 10,\n  \"country\": \"US\",\n  \"language\": \"en\",\n  \"safeSearch\": true,\n  \"includeSponsoredResults\": false\n}\n```\n\n### 🧭 Compare Google and DuckDuckGo\n\n```json\n{\n  \"queries\": [\"best web scraping tools\"],\n  \"engines\": [\"google\", \"duckduckgo\"],\n  \"maxResultsPerExecutedQuery\": 10\n}\n```\n\nThis input can save up to 20 rows: 10 from Google and 10 from DuckDuckGo.\n\n### 🎯 Search selected sites with `site:`\n\n```json\n{\n  \"queries\": [\"site:apify.com web scraping\", \"site:github.com web scraping\"],\n  \"engines\": [\"google\", \"duckduckgo\"],\n  \"maxResultsPerExecutedQuery\": 25\n}\n```\n\nEach operator query runs separately. Search engines decide which results match\ntheir supported operators.\n\n## ⚙️ Input settings\n\n| Setting                      | What it controls                                                                            |\n| ---------------------------- | ------------------------------------------------------------------------------------------- |\n| `queries`                    | 1 to 100 original queries.                                                                  |\n| `engines`                    | Search engines to run. Google is selected by default.                                       |\n| `maxResultsPerExecutedQuery` | 1 to 100 saved rows for each engine and exact executed query. Default: `10`.                |\n| `country`                    | Localizes results. Choose one of 249 ISO countries and territories. Default: United States. |\n| `language`                   | Search language such as `en`, `fr`, `de`, or `ja`. Default: `en`.                           |\n| `safeSearch`                 | Asks supported engines to filter explicit results. Default: `true`.                         |\n| `includeSponsoredResults`    | Keeps detected paid results when on. Default: `false`.                                      |\n\n### How many rows can a run save?\n\nThe cap applies to every executed query on every engine.\n\nFor one web query, two engines, and a cap of 10:\n\n`1 query × 2 engines × 10 results = up to 20 rows`\n\nThe run summary shows `searchesCompiled`, `executionsPlanned`, and saved row\ncounts by query and engine.\n\n### How does country change the results?\n\nCountry can change ranks, local sites, ads, and which results appear. The same\nchosen country is requested from every engine and saved in every row. Country\ntargeting is a preference, not a promise; source availability can vary.\n\n## 📣 Sponsored results\n\nSponsored results are removed by default. Turn on\n`includeSponsoredResults` only when ads are useful to your research.\n\nEach kept paid result has:\n\n- `isSponsored: true`\n- `advertiserDomain`: the detected advertiser domain, when shown\n\nBecause rows are not merged, an organic Google result and a paid DuckDuckGo\nresult remain two clear observations.\n\n## ⬆️ Output example\n\n```json\n{\n  \"runId\": \"abc123\",\n  \"country\": \"US\",\n  \"language\": \"en\",\n  \"safeSearch\": true,\n  \"engine\": \"google\",\n  \"executedQuery\": \"best web scraping tools\",\n  \"page\": 1,\n  \"rankOnPage\": 3,\n  \"rank\": 3,\n  \"title\": \"A guide to web scraping tools\",\n  \"canonicalUrl\": \"https://example.com/web-scraping-tools\",\n  \"resultDomain\": \"example.com\",\n  \"snippet\": \"Search-engine snippet\",\n  \"isSponsored\": false,\n  \"advertiserDomain\": null,\n  \"observedAt\": \"2026-07-17T12:00:00.000Z\",\n  \"schemaVersion\": \"7.0\"\n}\n```\n\nYou can export the dataset as JSON, JSONL, CSV, Excel, XML, RSS, or HTML. You\ncan also use the Apify API, SDKs, webhooks, schedules, Make, Zapier, or n8n.\n\n### 🔁 Repeated runs and schedules\n\nEach Actor run receives its own dataset. Running the same query again creates\nnew observations with a new `runId` and `observedAt`. Rows are not silently\nupdated across runs. Use `engine`, `executedQuery`, `canonicalUrl`, and\n`observedAt` when comparing rank observations over time.\n\n## 📌 Run summary\n\n`OUTPUT` and `RUN_SUMMARY` report:\n\n- 🔎 queries, compiled searches, and planned engine executions;\n- 📄 pages attempted and parsed;\n- 📦 rows saved by original query and by engine;\n- 🚫 invalid URLs removed;\n- 📣 sponsored candidates seen, removed, and saved;\n- 🧭 status counts for every engine;\n- 🏁 the final stop reason.\n\n## 💵 Pricing event and cost controls\n\nThe Actor uses pay-per-result pricing. One `search-result` event means one row\nsaved for one engine and one executed query. The current price is shown in\nApify Console before a run.\n\nUse `maxResultsPerExecutedQuery`, the number of queries, and the number of\nselected engines to control the maximum row count. Start with one engine and\n10 results. Add more only when the small run proves useful.\n\n## 🧪 Test evidence\n\nVersion 1.0 focuses on simple web queries through Google, Bing, Brave, and\nDuckDuckGo. Release checks cover input rules, row grain, URL safety,\nsponsored-result filtering, pagination, countries, engine failures, billing,\nand the public output contract.\n\nSearch results, blocks, runtime, and cost change by query, country, language,\nengine state, and Apify rates. Test records are evidence, not promises.\n\n## 🔒 Public-data boundary\n\nThe Actor reads public, logged-out search results.\n\nIt does not:\n\n- 🔐 log in to search accounts;\n- 🍪 use customer cookies or copied sessions;\n- 🧩 solve CAPTCHAs or other access challenges;\n- ✅ promise complete coverage of the web.\n\n## ⚠️ Limits\n\n- Search indexes change often.\n- Results and ranks vary by engine, time, place, and language.\n- An engine can block, rate-limit, repeat, or stop on deeper pages.\n- The Actor can return fewer rows than the cap after checks and filtering.\n- A URL can appear more than once by design when engines or executed queries differ.\n- Snippets can be missing or stale.\n\nUse `runId`, `engine`, `executedQuery`, `page`, and `rankOnPage` to identify and\naudit each row.\n\n## ❓ FAQ\n\n### Why does the same URL appear more than once?\n\nThis is expected. Each row is one engine result. The same URL from Google and\nDuckDuckGo gives you two rank observations. No cross-engine result is hidden.\n\n### Why did I get fewer rows than the cap?\n\nThe cap is a maximum, not a promise. A source may have fewer results, block a\nrequest, or return rows removed by URL or sponsored-result checks. Read\nthe run summary for exact counts.\n\n### Does it need a search-engine API key?\n\nNo. It reads public, logged-out search results.\n\n## 🏠 Related Actors\n\nContinue the same public search workflow across web and social sources.\n\n### Compare search across sources\n\n- [Instagram Search Scraper](https://apify.com/chronometrica/instagram-search-scraper)\n  — find public Reels and metrics by keyword.\n- [TikTok Search Scraper](https://apify.com/chronometrica/tiktok-search-scraper)\n  — find public videos, creators, and metrics by keyword.\n- [YouTube Search Scraper](https://apify.com/chronometrica/youtube-search-scraper)\n  — find public videos, Shorts, channels, and metrics by keyword.\n- [Reddit Search Scraper](https://apify.com/chronometrica/reddit-search-scraper)\n  — find public Reddit posts, communities, authors, scores, and dates.\n- [X Search & Discovery Scraper](https://apify.com/chronometrica/x-search-scraper)\n  — find public posts and profiles by keyword.\n\n## 🛟 Support\n\nFor help, send the run ID, input, expected result, observed row or missing URL,\nand the engine that had the problem.\n\nUse public data in line with the law, search-engine rules, and Apify rules. Do\nnot use it to harass people or build sensitive personal profiles.\n",
    "changelog": "# Changelog\n\n## 1.0.1 - 2026-09-17\n\n- Keep public Google results when Google returns relative or regional result links.\n\n## 1.0.0\n\n- Initial public release of Google Search Scraper.\n- Collect public search results from Google, Bing, Brave, and DuckDuckGo.\n- Export each engine result with its query, rank, URL, title, snippet, country,\n  sponsored-result state, and observation time when those values are public.\n- Use clear per-engine result limits, public run summaries, and structured\n  source states for scheduled search tracking and data pipelines.\n",
    "actorDefinition": {
      "$schema": "https://apify.com/schemas/v1/actor.ide.json",
      "actorSpecification": 1,
      "name": "google-search-scraper",
      "title": "Google Search Scraper — Bing, Brave & DuckDuckGo",
      "description": "Scrape Google, Bing, Brave, and DuckDuckGo search results. Export each engine result with its exact query, parsed rank, URL, title, and available snippet.",
      "seoTitle": "Google Search Scraper | Bing, Brave & DuckDuckGo",
      "seoDescription": "Scrape Google, Bing, Brave, and DuckDuckGo with a clean SERP API. Export each result with its engine, exact query, parsed rank, URL, title, and available snippet.",
      "categories": [
        "SEARCH_ENGINES"
      ],
      "version": "1.0",
      "buildTag": "latest",
      "defaultMemoryMbytes": 512,
      "maxMemoryMbytes": 512,
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 10800,
        "memoryMbytes": 512
      },
      "exampleRunInput": {
        "contentType": "application/json; charset=utf-8",
        "body": "{\n  \"queries\": [\n    \"machine learning tutorials\"\n  ],\n  \"engines\": [\n    \"google\"\n  ],\n  \"maxResultsPerExecutedQuery\": 10,\n  \"country\": \"US\",\n  \"language\": \"en\",\n  \"safeSearch\": true,\n  \"includeSponsoredResults\": false\n}"
      },
      "input": {
        "title": "Google Search Scraper input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "queries": {
            "title": "Search queries",
            "type": "array",
            "description": "Enter 1 to 100 web searches. You can use quoted phrases and search operators such as site:, intitle:, or filetype:. Each engine and exact executed query receives its own saved-result cap.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [
              "machine learning tutorials"
            ],
            "prefill": [
              "machine learning tutorials"
            ],
            "minItems": 1,
            "maxItems": 100
          },
          "engines": {
            "title": "Search engines",
            "type": "array",
            "description": "Choose one or more web search engines. Each engine runs independently and keeps its own result ranks.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "google",
                "bing",
                "brave",
                "duckduckgo"
              ],
              "enumTitles": [
                "Google",
                "Bing",
                "Brave",
                "DuckDuckGo"
              ]
            },
            "default": [
              "google"
            ],
            "minItems": 1,
            "uniqueItems": true
          },
          "maxResultsPerExecutedQuery": {
            "title": "Maximum results per engine query",
            "type": "integer",
            "description": "Save up to this many results for each query on each engine. Choose 1 to 100. For example, two engines with a limit of 10 can save up to 20 rows for one query. Sources may return fewer.",
            "editor": "number",
            "default": 10,
            "minimum": 1,
            "maximum": 100
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Choose a country for localized results. The same country is requested from every selected engine. Availability and ranking can vary by engine.",
            "editor": "select",
            "default": "US",
            "enum": [
              "AF",
              "AX",
              "AL",
              "DZ",
              "AS",
              "AD",
              "AO",
              "AI",
              "AQ",
              "AG",
              "AR",
              "AM",
              "AW",
              "AU",
              "AT",
              "AZ",
              "BS",
              "BH",
              "BD",
              "BB",
              "BY",
              "BE",
              "BZ",
              "BJ",
              "BM",
              "BT",
              "BO",
              "BA",
              "BW",
              "BV",
              "BR",
              "IO",
              "VG",
              "BN",
              "BG",
              "BF",
              "BI",
              "KH",
              "CM",
              "CA",
              "CV",
              "BQ",
              "KY",
              "CF",
              "TD",
              "CL",
              "CN",
              "CX",
              "CC",
              "CO",
              "KM",
              "CG",
              "CD",
              "CK",
              "CR",
              "CI",
              "HR",
              "CU",
              "CW",
              "CY",
              "CZ",
              "DK",
              "DJ",
              "DM",
              "DO",
              "EC",
              "EG",
              "SV",
              "GQ",
              "ER",
              "EE",
              "SZ",
              "ET",
              "FK",
              "FO",
              "FJ",
              "FI",
              "FR",
              "GF",
              "PF",
              "TF",
              "GA",
              "GM",
              "GE",
              "DE",
              "GH",
              "GI",
              "GR",
              "GL",
              "GD",
              "GP",
              "GU",
              "GT",
              "GG",
              "GN",
              "GW",
              "GY",
              "HT",
              "HM",
              "HN",
              "HK",
              "HU",
              "IS",
              "IN",
              "ID",
              "IR",
              "IQ",
              "IE",
              "IM",
              "IL",
              "IT",
              "JM",
              "JP",
              "JE",
              "JO",
              "KZ",
              "KE",
              "KI",
              "KW",
              "KG",
              "LA",
              "LV",
              "LB",
              "LS",
              "LR",
              "LY",
              "LI",
              "LT",
              "LU",
              "MO",
              "MG",
              "MW",
              "MY",
              "MV",
              "ML",
              "MT",
              "MH",
              "MQ",
              "MR",
              "MU",
              "YT",
              "MX",
              "FM",
              "MD",
              "MC",
              "MN",
              "ME",
              "MS",
              "MA",
              "MZ",
              "MM",
              "NA",
              "NR",
              "NP",
              "NL",
              "NC",
              "NZ",
              "NI",
              "NE",
              "NG",
              "NU",
              "NF",
              "KP",
              "MK",
              "MP",
              "NO",
              "OM",
              "PK",
              "PW",
              "PS",
              "PA",
              "PG",
              "PY",
              "PE",
              "PH",
              "PN",
              "PL",
              "PT",
              "PR",
              "QA",
              "RE",
              "RO",
              "RU",
              "RW",
              "WS",
              "SM",
              "ST",
              "SA",
              "SN",
              "RS",
              "SC",
              "SL",
              "SG",
              "SX",
              "SK",
              "SI",
              "SB",
              "SO",
              "ZA",
              "GS",
              "KR",
              "SS",
              "ES",
              "LK",
              "BL",
              "SH",
              "KN",
              "LC",
              "MF",
              "PM",
              "VC",
              "SD",
              "SR",
              "SJ",
              "SE",
              "CH",
              "SY",
              "TW",
              "TJ",
              "TZ",
              "TH",
              "TL",
              "TG",
              "TK",
              "TO",
              "TT",
              "TN",
              "TR",
              "TM",
              "TC",
              "TV",
              "UM",
              "VI",
              "UG",
              "UA",
              "AE",
              "GB",
              "US",
              "UY",
              "UZ",
              "VU",
              "VA",
              "VE",
              "VN",
              "WF",
              "EH",
              "YE",
              "ZM",
              "ZW"
            ],
            "enumTitles": [
              "Afghanistan (AF)",
              "Åland Islands (AX)",
              "Albania (AL)",
              "Algeria (DZ)",
              "American Samoa (AS)",
              "Andorra (AD)",
              "Angola (AO)",
              "Anguilla (AI)",
              "Antarctica (AQ)",
              "Antigua & Barbuda (AG)",
              "Argentina (AR)",
              "Armenia (AM)",
              "Aruba (AW)",
              "Australia (AU)",
              "Austria (AT)",
              "Azerbaijan (AZ)",
              "Bahamas (BS)",
              "Bahrain (BH)",
              "Bangladesh (BD)",
              "Barbados (BB)",
              "Belarus (BY)",
              "Belgium (BE)",
              "Belize (BZ)",
              "Benin (BJ)",
              "Bermuda (BM)",
              "Bhutan (BT)",
              "Bolivia (BO)",
              "Bosnia & Herzegovina (BA)",
              "Botswana (BW)",
              "Bouvet Island (BV)",
              "Brazil (BR)",
              "British Indian Ocean Territory (IO)",
              "British Virgin Islands (VG)",
              "Brunei (BN)",
              "Bulgaria (BG)",
              "Burkina Faso (BF)",
              "Burundi (BI)",
              "Cambodia (KH)",
              "Cameroon (CM)",
              "Canada (CA)",
              "Cape Verde (CV)",
              "Caribbean Netherlands (BQ)",
              "Cayman Islands (KY)",
              "Central African Republic (CF)",
              "Chad (TD)",
              "Chile (CL)",
              "China (CN)",
              "Christmas Island (CX)",
              "Cocos (Keeling) Islands (CC)",
              "Colombia (CO)",
              "Comoros (KM)",
              "Congo - Brazzaville (CG)",
              "Congo - Kinshasa (CD)",
              "Cook Islands (CK)",
              "Costa Rica (CR)",
              "Côte d’Ivoire (CI)",
              "Croatia (HR)",
              "Cuba (CU)",
              "Curaçao (CW)",
              "Cyprus (CY)",
              "Czechia (CZ)",
              "Denmark (DK)",
              "Djibouti (DJ)",
              "Dominica (DM)",
              "Dominican Republic (DO)",
              "Ecuador (EC)",
              "Egypt (EG)",
              "El Salvador (SV)",
              "Equatorial Guinea (GQ)",
              "Eritrea (ER)",
              "Estonia (EE)",
              "Eswatini (SZ)",
              "Ethiopia (ET)",
              "Falkland Islands (FK)",
              "Faroe Islands (FO)",
              "Fiji (FJ)",
              "Finland (FI)",
              "France (FR)",
              "French Guiana (GF)",
              "French Polynesia (PF)",
              "French Southern Territories (TF)",
              "Gabon (GA)",
              "Gambia (GM)",
              "Georgia (GE)",
              "Germany (DE)",
              "Ghana (GH)",
              "Gibraltar (GI)",
              "Greece (GR)",
              "Greenland (GL)",
              "Grenada (GD)",
              "Guadeloupe (GP)",
              "Guam (GU)",
              "Guatemala (GT)",
              "Guernsey (GG)",
              "Guinea (GN)",
              "Guinea-Bissau (GW)",
              "Guyana (GY)",
              "Haiti (HT)",
              "Heard & McDonald Islands (HM)",
              "Honduras (HN)",
              "Hong Kong SAR China (HK)",
              "Hungary (HU)",
              "Iceland (IS)",
              "India (IN)",
              "Indonesia (ID)",
              "Iran (IR)",
              "Iraq (IQ)",
              "Ireland (IE)",
              "Isle of Man (IM)",
              "Israel (IL)",
              "Italy (IT)",
              "Jamaica (JM)",
              "Japan (JP)",
              "Jersey (JE)",
              "Jordan (JO)",
              "Kazakhstan (KZ)",
              "Kenya (KE)",
              "Kiribati (KI)",
              "Kuwait (KW)",
              "Kyrgyzstan (KG)",
              "Laos (LA)",
              "Latvia (LV)",
              "Lebanon (LB)",
              "Lesotho (LS)",
              "Liberia (LR)",
              "Libya (LY)",
              "Liechtenstein (LI)",
              "Lithuania (LT)",
              "Luxembourg (LU)",
              "Macao SAR China (MO)",
              "Madagascar (MG)",
              "Malawi (MW)",
              "Malaysia (MY)",
              "Maldives (MV)",
              "Mali (ML)",
              "Malta (MT)",
              "Marshall Islands (MH)",
              "Martinique (MQ)",
              "Mauritania (MR)",
              "Mauritius (MU)",
              "Mayotte (YT)",
              "Mexico (MX)",
              "Micronesia (FM)",
              "Moldova (MD)",
              "Monaco (MC)",
              "Mongolia (MN)",
              "Montenegro (ME)",
              "Montserrat (MS)",
              "Morocco (MA)",
              "Mozambique (MZ)",
              "Myanmar (Burma) (MM)",
              "Namibia (NA)",
              "Nauru (NR)",
              "Nepal (NP)",
              "Netherlands (NL)",
              "New Caledonia (NC)",
              "New Zealand (NZ)",
              "Nicaragua (NI)",
              "Niger (NE)",
              "Nigeria (NG)",
              "Niue (NU)",
              "Norfolk Island (NF)",
              "North Korea (KP)",
              "North Macedonia (MK)",
              "Northern Mariana Islands (MP)",
              "Norway (NO)",
              "Oman (OM)",
              "Pakistan (PK)",
              "Palau (PW)",
              "Palestinian Territories (PS)",
              "Panama (PA)",
              "Papua New Guinea (PG)",
              "Paraguay (PY)",
              "Peru (PE)",
              "Philippines (PH)",
              "Pitcairn Islands (PN)",
              "Poland (PL)",
              "Portugal (PT)",
              "Puerto Rico (PR)",
              "Qatar (QA)",
              "Réunion (RE)",
              "Romania (RO)",
              "Russia (RU)",
              "Rwanda (RW)",
              "Samoa (WS)",
              "San Marino (SM)",
              "São Tomé & Príncipe (ST)",
              "Saudi Arabia (SA)",
              "Senegal (SN)",
              "Serbia (RS)",
              "Seychelles (SC)",
              "Sierra Leone (SL)",
              "Singapore (SG)",
              "Sint Maarten (SX)",
              "Slovakia (SK)",
              "Slovenia (SI)",
              "Solomon Islands (SB)",
              "Somalia (SO)",
              "South Africa (ZA)",
              "South Georgia & South Sandwich Islands (GS)",
              "South Korea (KR)",
              "South Sudan (SS)",
              "Spain (ES)",
              "Sri Lanka (LK)",
              "St. Barthélemy (BL)",
              "St. Helena (SH)",
              "St. Kitts & Nevis (KN)",
              "St. Lucia (LC)",
              "St. Martin (MF)",
              "St. Pierre & Miquelon (PM)",
              "St. Vincent & Grenadines (VC)",
              "Sudan (SD)",
              "Suriname (SR)",
              "Svalbard & Jan Mayen (SJ)",
              "Sweden (SE)",
              "Switzerland (CH)",
              "Syria (SY)",
              "Taiwan (TW)",
              "Tajikistan (TJ)",
              "Tanzania (TZ)",
              "Thailand (TH)",
              "Timor-Leste (TL)",
              "Togo (TG)",
              "Tokelau (TK)",
              "Tonga (TO)",
              "Trinidad & Tobago (TT)",
              "Tunisia (TN)",
              "Türkiye (TR)",
              "Turkmenistan (TM)",
              "Turks & Caicos Islands (TC)",
              "Tuvalu (TV)",
              "U.S. Outlying Islands (UM)",
              "U.S. Virgin Islands (VI)",
              "Uganda (UG)",
              "Ukraine (UA)",
              "United Arab Emirates (AE)",
              "United Kingdom (GB)",
              "United States (US)",
              "Uruguay (UY)",
              "Uzbekistan (UZ)",
              "Vanuatu (VU)",
              "Vatican City (VA)",
              "Venezuela (VE)",
              "Vietnam (VN)",
              "Wallis & Futuna (WF)",
              "Western Sahara (EH)",
              "Yemen (YE)",
              "Zambia (ZM)",
              "Zimbabwe (ZW)"
            ]
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language code used by search engines where supported, such as en, fr, de, or ja.",
            "editor": "textfield",
            "default": "en",
            "minLength": 2,
            "maxLength": 12
          },
          "safeSearch": {
            "title": "Safe search",
            "type": "boolean",
            "description": "Ask supported engines to filter explicit results. Search engines may apply their own local rules.",
            "editor": "checkbox",
            "default": true
          },
          "includeSponsoredResults": {
            "title": "Include sponsored results",
            "type": "boolean",
            "description": "Off by default. When off, sponsored results are omitted. When on, they are saved with isSponsored and advertiserDomain fields.",
            "editor": "checkbox",
            "default": false
          }
        },
        "required": [
          "queries"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "properties": {
          "dataset": {
            "type": "string",
            "title": "Search result observations",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "summary": {
            "type": "string",
            "title": "Run summary",
            "template": "{{links.apiRunKeyValueStoreUrl}}/records/OUTPUT"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {
            "$schema": "http://json-schema.org/draft-07/schema#",
            "type": "object",
            "properties": {
              "runId": {
                "type": "string",
                "title": "Run ID",
                "description": "Run ID"
              },
              "country": {
                "type": "string",
                "title": "Country",
                "description": "Country"
              },
              "language": {
                "type": "string",
                "title": "Language",
                "description": "Language"
              },
              "safeSearch": {
                "type": "boolean",
                "title": "Safe Search",
                "description": "Safe Search"
              },
              "engine": {
                "type": "string",
                "title": "Engine",
                "description": "Engine"
              },
              "executedQuery": {
                "type": "string",
                "title": "Executed Query",
                "description": "Executed Query"
              },
              "page": {
                "type": "integer",
                "title": "Page",
                "description": "Page"
              },
              "rankOnPage": {
                "type": "integer",
                "title": "Rank On Page",
                "description": "Position among supported result blocks parsed on this page."
              },
              "rank": {
                "type": "integer",
                "title": "Rank",
                "description": "Running position among supported result blocks parsed across fetched pages."
              },
              "title": {
                "type": "string",
                "title": "Title",
                "description": "Title"
              },
              "canonicalUrl": {
                "type": "string",
                "title": "Result",
                "description": "Result",
                "format": "uri"
              },
              "resultDomain": {
                "type": "string",
                "title": "Result Domain",
                "description": "Result Domain"
              },
              "snippet": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Snippet",
                "description": "Snippet"
              },
              "isSponsored": {
                "type": "boolean",
                "title": "Sponsored",
                "description": "Sponsored"
              },
              "advertiserDomain": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Advertiser Domain",
                "description": "Advertiser Domain"
              },
              "observedAt": {
                "type": "string",
                "title": "Observed",
                "description": "Observed",
                "format": "date-time"
              },
              "schemaVersion": {
                "type": "string",
                "title": "Schema Version",
                "description": "Schema Version"
              }
            },
            "required": [
              "runId",
              "country",
              "language",
              "safeSearch",
              "engine",
              "executedQuery",
              "page",
              "rankOnPage",
              "rank",
              "title",
              "canonicalUrl",
              "resultDomain",
              "snippet",
              "isSponsored",
              "advertiserDomain",
              "observedAt",
              "schemaVersion"
            ]
          },
          "views": {
            "overview": {
              "title": "Search result observations",
              "transformation": {
                "fields": [
                  "engine",
                  "executedQuery",
                  "page",
                  "rankOnPage",
                  "rank",
                  "title",
                  "canonicalUrl",
                  "resultDomain",
                  "snippet",
                  "isSponsored",
                  "observedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "rank": {
                    "label": "Rank",
                    "format": "number"
                  },
                  "canonicalUrl": {
                    "label": "Result",
                    "format": "link"
                  },
                  "observedAt": {
                    "label": "Observed",
                    "format": "date"
                  }
                }
              }
            }
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "changelog": "# Changelog\n\n## 1.0.1 - 2026-09-17\n\n- Keep public Google results when Google returns relative or regional result links.\n\n## 1.0.0\n\n- Initial public release of Google Search Scraper.\n- Collect public search results from Google, Bing, Brave, and DuckDuckGo.\n- Export each engine result with its query, rank, URL, title, snippet, country,\n  sponsored-result state, and observation time when those values are public.\n- Use clear per-engine result limits, public run summaries, and structured\n  source states for scheduled search tracking and data pipelines.\n",
      "readme": "# Google Search Scraper — Bing, Brave & DuckDuckGo\n\n## 🏠 What does Google Search Scraper do?\n\nGoogle Search Scraper collects public results from Google, Bing, Brave, and\nDuckDuckGo. Google works on its own. You can add other engines when you want\nmore coverage or want to compare ranks.\n\nThe main output is a search result observation. Each row tells you:\n\n- ⚙️ which exact query the Actor ran;\n- 🧭 which search engine returned the result;\n- 🏅 where the supported result block appeared;\n- 🔗 which public URL was found;\n- 📝 its title and any snippet the engine showed.\n\nOne engine result is one row. Results are not merged across engines. If Google\nreturns 10 results and DuckDuckGo returns 10 results, the dataset can contain\n20 rows. If both engines find the same URL, both rows stay in the dataset.\n\nUse the Actor for SEO checks, brand tracking, competitor research, site search,\npublic mention discovery, lead research, scheduled alerts, AI tools, and RAG.\n\n## 🔎 What can it search?\n\nEach query runs exactly as entered. You can use normal text, quoted phrases,\n`site:`, `intitle:`, `filetype:`, exclusions, and other operators supported by\nthe selected search engine.\n\n## 🧭 Supported search engines\n\n| Engine        | Web search |\n| ------------- | ---------- |\n| 🔵 Google     | Yes        |\n| 🟦 Bing       | Yes        |\n| 🦁 Brave      | Yes        |\n| 🦆 DuckDuckGo | Yes        |\n\nEach engine runs as its own search. If one engine fails, useful rows from other\nengines can still be saved. The run summary shows what happened.\n\n## 📦 What data can I extract?\n\nThe dataset grain is:\n\n`one run + one engine + one executed query + one page + one result position`\n\n| Data group          | Fields                                             |\n| ------------------- | -------------------------------------------------- |\n| 🏠 Run              | `runId`                                            |\n| 🔎 Search request   | `country`, `language`, `safeSearch`                |\n| ⚙️ Search execution | `engine`, `executedQuery`                          |\n| 🏅 Position         | `page`, `rankOnPage`, `rank`                       |\n| 🔗 Result           | `title`, `canonicalUrl`, `resultDomain`, `snippet` |\n| 📣 Sponsored result | `isSponsored`, `advertiserDomain`                  |\n| 🕐 Observation      | `observedAt`, `schemaVersion`                      |\n\nMissing public values stay `null`. They are not guessed.\n\n### What does `executedQuery` mean?\n\n`executedQuery` is the exact query one engine received. Search operators remain\npart of this value, so every row keeps its own query and engine origin.\n\n## 🚀 Quick start\n\n1. Open the Actor in Apify Console.\n2. Enter one or more queries.\n3. Pick Google or add more engines.\n4. Start with 10 results.\n5. Click **Start**.\n6. Open **Output** to view or export the rows.\n\n### 🌐 Small Google search\n\n```json\n{\n  \"queries\": [\"machine learning tutorials\"],\n  \"engines\": [\"google\"],\n  \"maxResultsPerExecutedQuery\": 10,\n  \"country\": \"US\",\n  \"language\": \"en\",\n  \"safeSearch\": true,\n  \"includeSponsoredResults\": false\n}\n```\n\n### 🧭 Compare Google and DuckDuckGo\n\n```json\n{\n  \"queries\": [\"best web scraping tools\"],\n  \"engines\": [\"google\", \"duckduckgo\"],\n  \"maxResultsPerExecutedQuery\": 10\n}\n```\n\nThis input can save up to 20 rows: 10 from Google and 10 from DuckDuckGo.\n\n### 🎯 Search selected sites with `site:`\n\n```json\n{\n  \"queries\": [\"site:apify.com web scraping\", \"site:github.com web scraping\"],\n  \"engines\": [\"google\", \"duckduckgo\"],\n  \"maxResultsPerExecutedQuery\": 25\n}\n```\n\nEach operator query runs separately. Search engines decide which results match\ntheir supported operators.\n\n## ⚙️ Input settings\n\n| Setting                      | What it controls                                                                            |\n| ---------------------------- | ------------------------------------------------------------------------------------------- |\n| `queries`                    | 1 to 100 original queries.                                                                  |\n| `engines`                    | Search engines to run. Google is selected by default.                                       |\n| `maxResultsPerExecutedQuery` | 1 to 100 saved rows for each engine and exact executed query. Default: `10`.                |\n| `country`                    | Localizes results. Choose one of 249 ISO countries and territories. Default: United States. |\n| `language`                   | Search language such as `en`, `fr`, `de`, or `ja`. Default: `en`.                           |\n| `safeSearch`                 | Asks supported engines to filter explicit results. Default: `true`.                         |\n| `includeSponsoredResults`    | Keeps detected paid results when on. Default: `false`.                                      |\n\n### How many rows can a run save?\n\nThe cap applies to every executed query on every engine.\n\nFor one web query, two engines, and a cap of 10:\n\n`1 query × 2 engines × 10 results = up to 20 rows`\n\nThe run summary shows `searchesCompiled`, `executionsPlanned`, and saved row\ncounts by query and engine.\n\n### How does country change the results?\n\nCountry can change ranks, local sites, ads, and which results appear. The same\nchosen country is requested from every engine and saved in every row. Country\ntargeting is a preference, not a promise; source availability can vary.\n\n## 📣 Sponsored results\n\nSponsored results are removed by default. Turn on\n`includeSponsoredResults` only when ads are useful to your research.\n\nEach kept paid result has:\n\n- `isSponsored: true`\n- `advertiserDomain`: the detected advertiser domain, when shown\n\nBecause rows are not merged, an organic Google result and a paid DuckDuckGo\nresult remain two clear observations.\n\n## ⬆️ Output example\n\n```json\n{\n  \"runId\": \"abc123\",\n  \"country\": \"US\",\n  \"language\": \"en\",\n  \"safeSearch\": true,\n  \"engine\": \"google\",\n  \"executedQuery\": \"best web scraping tools\",\n  \"page\": 1,\n  \"rankOnPage\": 3,\n  \"rank\": 3,\n  \"title\": \"A guide to web scraping tools\",\n  \"canonicalUrl\": \"https://example.com/web-scraping-tools\",\n  \"resultDomain\": \"example.com\",\n  \"snippet\": \"Search-engine snippet\",\n  \"isSponsored\": false,\n  \"advertiserDomain\": null,\n  \"observedAt\": \"2026-07-17T12:00:00.000Z\",\n  \"schemaVersion\": \"7.0\"\n}\n```\n\nYou can export the dataset as JSON, JSONL, CSV, Excel, XML, RSS, or HTML. You\ncan also use the Apify API, SDKs, webhooks, schedules, Make, Zapier, or n8n.\n\n### 🔁 Repeated runs and schedules\n\nEach Actor run receives its own dataset. Running the same query again creates\nnew observations with a new `runId` and `observedAt`. Rows are not silently\nupdated across runs. Use `engine`, `executedQuery`, `canonicalUrl`, and\n`observedAt` when comparing rank observations over time.\n\n## 📌 Run summary\n\n`OUTPUT` and `RUN_SUMMARY` report:\n\n- 🔎 queries, compiled searches, and planned engine executions;\n- 📄 pages attempted and parsed;\n- 📦 rows saved by original query and by engine;\n- 🚫 invalid URLs removed;\n- 📣 sponsored candidates seen, removed, and saved;\n- 🧭 status counts for every engine;\n- 🏁 the final stop reason.\n\n## 💵 Pricing event and cost controls\n\nThe Actor uses pay-per-result pricing. One `search-result` event means one row\nsaved for one engine and one executed query. The current price is shown in\nApify Console before a run.\n\nUse `maxResultsPerExecutedQuery`, the number of queries, and the number of\nselected engines to control the maximum row count. Start with one engine and\n10 results. Add more only when the small run proves useful.\n\n## 🧪 Test evidence\n\nVersion 1.0 focuses on simple web queries through Google, Bing, Brave, and\nDuckDuckGo. Release checks cover input rules, row grain, URL safety,\nsponsored-result filtering, pagination, countries, engine failures, billing,\nand the public output contract.\n\nSearch results, blocks, runtime, and cost change by query, country, language,\nengine state, and Apify rates. Test records are evidence, not promises.\n\n## 🔒 Public-data boundary\n\nThe Actor reads public, logged-out search results.\n\nIt does not:\n\n- 🔐 log in to search accounts;\n- 🍪 use customer cookies or copied sessions;\n- 🧩 solve CAPTCHAs or other access challenges;\n- ✅ promise complete coverage of the web.\n\n## ⚠️ Limits\n\n- Search indexes change often.\n- Results and ranks vary by engine, time, place, and language.\n- An engine can block, rate-limit, repeat, or stop on deeper pages.\n- The Actor can return fewer rows than the cap after checks and filtering.\n- A URL can appear more than once by design when engines or executed queries differ.\n- Snippets can be missing or stale.\n\nUse `runId`, `engine`, `executedQuery`, `page`, and `rankOnPage` to identify and\naudit each row.\n\n## ❓ FAQ\n\n### Why does the same URL appear more than once?\n\nThis is expected. Each row is one engine result. The same URL from Google and\nDuckDuckGo gives you two rank observations. No cross-engine result is hidden.\n\n### Why did I get fewer rows than the cap?\n\nThe cap is a maximum, not a promise. A source may have fewer results, block a\nrequest, or return rows removed by URL or sponsored-result checks. Read\nthe run summary for exact counts.\n\n### Does it need a search-engine API key?\n\nNo. It reads public, logged-out search results.\n\n## 🏠 Related Actors\n\nContinue the same public search workflow across web and social sources.\n\n### Compare search across sources\n\n- [Instagram Search Scraper](https://apify.com/chronometrica/instagram-search-scraper)\n  — find public Reels and metrics by keyword.\n- [TikTok Search Scraper](https://apify.com/chronometrica/tiktok-search-scraper)\n  — find public videos, creators, and metrics by keyword.\n- [YouTube Search Scraper](https://apify.com/chronometrica/youtube-search-scraper)\n  — find public videos, Shorts, channels, and metrics by keyword.\n- [Reddit Search Scraper](https://apify.com/chronometrica/reddit-search-scraper)\n  — find public Reddit posts, communities, authors, scores, and dates.\n- [X Search & Discovery Scraper](https://apify.com/chronometrica/x-search-scraper)\n  — find public posts and profiles by keyword.\n\n## 🛟 Support\n\nFor help, send the run ID, input, expected result, observed row or missing URL,\nand the engine that had the problem.\n\nUse public data in line with the law, search-engine rules, and Apify rules. Do\nnot use it to harass people or build sensitive personal profiles.\n"
    },
    "buildNumber": "1.0.15",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "release-candidate",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.010447777777777778
    }
  }
}