Bing Search Scraper & Rank Tracker - SERP Results
Pricing
from $0.44 / 1,000 search result returneds
Bing Search Scraper & Rank Tracker - SERP Results
Get Bing search results (top 10 organic results with title, URL, description and position) for many keywords and countries, and track where your domain ranks. Every page is checked to really answer your keyword. Monitoring mode returns a row only when a rank moves.
Pricing
from $0.44 / 1,000 search result returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Get Bing search results for a list of keywords in as many countries as you like: the top organic results of Bing's results page with position, title, URL, displayed URL, domain, description and date. List your site and your competitors and you get where each domain ranks for each keyword and country, including a row that says not-in-shown-results when a domain is not on the page.
Every page is checked before it is used. Bing answers some automated visitors with the results of another search while keeping your keyword in the page title, so a scraper that does not check can hand you positions for the wrong search. This Actor only uses a page when Bing highlights your keyword's words in the results, and otherwise reads the search again through another connection. What could not be confirmed comes back as a free row that says so, never as a guessed position.
Turn on monitoring mode, schedule the Actor, and a run returns a row only when a tracked domain's position changed, with the previous position and the positions gained. A change is only reported when three reads through different connections agree.
What you can use it for
- Bing rank tracking: follow your site's position for the keywords you target, per country, and see which keywords move after a content or technical change.
- Competitor monitoring: list rival domains next to yours and see who ranks above you on Bing for each keyword.
- SERP research: run a list of keywords with an empty domain list and see which pages hold Bing's first page, with titles, descriptions and dates.
- Local and international SEO: run the same keywords in
us,gb,de,fr,jpand more in one run; each country is searched through a connection in that country. - Dashboards and spreadsheets: flat rows, one per result or one per domain per search.
How it works
- For each keyword and country the Actor opens Bing's public results page,
https://www.bing.com/search?q=<keyword>&setlang=<language>&cc=<COUNTRY>, through a residential connection in that country, using a new connection for every read. - It checks that the page really answers the keyword: Bing shows the words that matched your search in bold, and the page is used only if enough of your keyword's words are bold in the organic results (all of them for keywords of one or two words, at least 60% for longer keywords, because Bing does not always bold common words such as "recommended"). A word counts only as itself or its English plural. A page where only the first word of a longer keyword is bold across the results, and each other word is bold in at most two results, is not used: that is how Bing's answers for just the first word looked. If not, the search is read again through another connection, up to 8 times.
keywordWordsHighlightedon every row says how many of the keyword's words were bold, andreadsUntilVerifiedhow many reads it took. - It reads the organic results (
li.b_algo) in the order the page lists them. Answer boxes, video carousels and other blocks that are not organic results are not counted as positions. - Your tracked domains are looked up on that page. A domain matches its subdomains too (
apify.commatchesconsole.apify.com) andwww.is ignored. A domain that is not on the page getsrank: nullandrankStatus: "not-in-shown-results", together withresultsShown, the number of results the page showed.
Why the check matters (measured on 2026-09-16, UTC). Read from datacenter connections, all 12 pages for four everyday keywords were the results of a different search (for "best running shoes", the results for just "best"). Read through one residential connection, 18 of 18 pages for six keywords were the results of unrelated searches. On a connection that Bing had started answering this way, a normal desktop browser got the same wrong pages, so a browser does not avoid it. Through a new US residential connection for each read, 8 of 8 keywords were confirmed, 7 of them on the first read, and two runs of the same four keywords gave the same positions.
Positions can differ between reads. Bing does not show every visitor exactly the same order. Reading the same keyword through new US connections, the order was not always the same: for "project management software" 4 of 8 confirmed reads differed from the most common order (2 only at positions 9 and 10, and 2 were a different order altogether, with forbes.com at position 6 instead of 1); for "best running shoes" 2 of 7 differed (one with positions 4 and 5 swapped); for "best crm software" none of 4 differed. Positions near the bottom of the page moved most often. Monitoring mode therefore reports a change only when three reads agree, and a single run with monitoring off shows one read of the page.
Confirmation rate by country. Some countries' connections get the results of other searches more often. In one run of 10 everyday English keywords per country (2026-09-16, UTC), the page was confirmed for 10 of 10 keywords in the US, 8 in the UK and Canada, 7 in Germany and India, and 3 in Australia. Changing how the market is specified (mkt, setlang, cc, language headers) did not help in Australia. Searches that could not be confirmed are free.
Keywords that often cannot be confirmed. In our tests no read could be confirmed for a misspelled keyword ("car insurence quote" in the US), a site: search, a Japanese keyword written without spaces, or a keyword in a language other than the one searched in that country (a German keyword in the US). For the first three, Bing answered only part of the keyword (for example just "car") with the same page on every connection; the site: search was answered with pages from other sites, so a site: search is used only when every result is on that site. These come back as a free unverified-page row. When the same wrong page comes back three times in a row, the Actor stops reading that search early. In the UK, Bing did answer "car insurence quote" with car insurance results (2 of 3 words bold), and those were returned.
How deep it looks
The first results page only: about 10 organic results per search. Bing's page 2 (first=11) returned exactly the same 10 results as page 1 on every connection we tried, including a browser clicking "Next", so positions beyond the first page are not offered rather than repeated. If your domain is not on the first page, you get not-in-shown-results, not a guessed position.
Things that show up in the rows
- Results can be local to the connection's area. In the US, "car insurance quote" returned insurers' pages for the area of the connection (for example Lockhart, Texas).
proxyCountrysays which country the connection was in. dateis written the way the page writes it, in the page's language ("Aug 3, 2026","2 days ago","19. März 2026").approxTotalResultsis Bing's own "About 21,600 results" figure as a number;totalResultsTextis the text as shown.- Bing's click-tracking links are turned back into the real URLs, and Bing's
msockidtracking parameter is removed. - Email addresses, and some phone numbers written as one run of digits, are masked in titles and descriptions.
Input
| Field | Default | What it does |
|---|---|---|
keywords | example keyword | Search terms, one per line. A repeated keyword is searched once and gets a free duplicate row. Up to 200 keywords per run. |
domains | empty | Domains to track: a domain (example.com) or any URL on it. Empty = one row for every organic result. If the list has entries but none of them is a domain or URL, the run is rejected with a free invalid-input row and nothing is searched (so a mistyped list never turns into every result on the page). Up to 50 domains. |
countries | ["us"] | Two-letter ISO country codes (uk is read as gb). Every keyword is searched in every country, through a connection in that country. Up to 30 countries; at most 1,000 searches (keywords x countries) per run. |
language | en | The language Bing is asked to show the page in (en, de, fr, ja, pt-br, ...). pageLanguage says which language the page was shown in. |
maxResults | 1000 | With monitoring off, stop after this many rows and say what was left out. In monitoring mode it does not cut changes. |
monitoringMode | false | Remember each tracked domain's position per keyword and country and return a row only when it changes. Needs at least one domain. |
resetMonitoringState | false | Forget every remembered position and start a fresh baseline. Turn it off again after one run. |
{"keywords": ["best running shoes", "running shoes for flat feet", "trail running shoes"],"domains": ["runnersworld.com", "https://www.wired.com/", "example.com"],"countries": ["us", "gb", "de"],"language": "en","monitoringMode": true}
If you leave keywords out with monitoring off, the example keyword "best running shoes" is searched (the run log says so). In monitoring mode keywords and domains are required, so a schedule never pays to watch the example. An empty list is rejected with a free invalid-input row.
Output
Without tracked domains, one row per organic result (this one was read from Bing in the US on 2026-09-16, UTC):
{"source": "bing-search","status": "ok","scrapedAt": "2026-09-17T09:00:00.000Z","keyword": "best running shoes","country": "us","language": "en","pageLanguage": "en","searchUrl": "https://www.bing.com/search?q=best%20running%20shoes&setlang=en&cc=US","resultsShown": 10,"approxTotalResults": 21600,"totalResultsText": "About 21,600 results","keywordWordsHighlighted": "3/3","readsUntilVerified": 1,"proxyCountry": "US","position": 2,"title": "10 Best Running Shoes of 2026 | Tested & Ranked - GearLab","url": "https://www.outdoorgearlab.com/topics/shoes-and-boots/best-running-shoes","displayedUrl": "https://www.outdoorgearlab.com › ... › best-running-shoes","domain": "outdoorgearlab.com","description": "We run more than 50 miles in every pair of shoes we test, putting top models head to head to find the best from Nike, …","date": "May 14, 2026"}
With tracked domains, one row per domain per search. This one was built from the same page; the timestamps and monitoring fields show what a later monitoring run returns after the domain moved from position 7 to 5:
{"source": "bing-search","status": "ok","scrapedAt": "2026-09-17T09:00:00.000Z","keyword": "best running shoes","country": "us","language": "en","pageLanguage": "en","searchUrl": "https://www.bing.com/search?q=best%20running%20shoes&setlang=en&cc=US","resultsShown": 10,"approxTotalResults": 21600,"totalResultsText": "About 21,600 results","keywordWordsHighlighted": "3/3","readsUntilVerified": 1,"proxyCountry": "US","trackedDomain": "wired.com","trackedDomainInput": "https://www.wired.com/","rank": 5,"rankStatus": "ranked","positionsOfDomain": [5],"urlsOfDomain": ["https://www.wired.com/gallery/best-running-shoes/"],"title": "The Best Running Shoes - WIRED","url": "https://www.wired.com/gallery/best-running-shoes/","displayedUrl": "https://www.wired.com › gallery › best-running-shoes","description": "We logged thousands of test miles to bring you the best running shoes for speed workouts, long runs, trail races, and …","rank1Url": "https://www.runnersworld.com/gear/a19663621/best-running-shoes/","rank1Domain": "runnersworld.com","change": "rank-changed","isFirstCheck": false,"previousRank": 7,"positionsGained": 2,"previousCheckedAt": "2026-09-16T09:00:00.000Z","previousRankReadAt": "2026-09-15T09:00:00.000Z","confirmedByRereading": true}
A tracked domain that is not on the page comes back like this (same search):
{"trackedDomain": "example.com","rank": null,"rankStatus": "not-in-shown-results","positionsOfDomain": [],"url": null,"resultsShown": 10,"rank1Domain": "runnersworld.com"}
What the columns mean:
keyword,countryandsearchUrlsay which search the row is from;statusis"ok"on every charged row.position(result rows) andrank(domain rows) are positions among the organic results on the page, starting at 1.resultsShownis how many organic results the page showed.rankStatusis"ranked"or"not-in-shown-results".positionsOfDomainlists every position the domain holds on the page (a domain can appear more than once);rankis the first of them, andurlsOfDomainare the URLs in the same order.title,url,displayedUrlanddescriptionon a domain row are those of the result atrank.domainis the result's host withoutwww..trackedDomainis your domain as matched;trackedDomainInputis what you typed.rank1Url/rank1Domainis the result at position 1 of that search.keywordWordsHighlightedis how many of the keyword's words Bing showed in bold in the results ("3/3");readsUntilVerifiedis how many reads the search took until the page was accepted (including up to two extra reads that look for a page with every word in bold);proxyCountryis the country of the connection.languageis the language you asked for;pageLanguageis the language of the page.- Every row also has
sourceandscrapedAt.
Monitoring fields
On domain rows, change is null with monitoring off, and in monitoring mode one of:
change | Meaning |
|---|---|
"first-check" | The domain had no remembered position for this keyword and country. Every pair is returned once to set the baseline. |
"rank-changed" | The position is different from the one in the row last returned for the pair. |
"entered-results" | The domain was not on the results page last time and is now. |
"left-results" | The domain was on the results page last time and is not now (rank: null). |
isFirstCheck is true on a first check. previousRank is the position in the row last returned for the pair, positionsGained is previousRank - rank (positive = moved up), previousCheckedAt is when the pair was last checked and previousRankReadAt when that position was read. confirmedByRereading is true when the search was read two more times a few seconds later, each through another connection, and all reads showed the same position. If either of those reads shows a different position, or cannot be confirmed, nothing is returned for the pair and the remembered position stays as it was (a pair with no remembered position yet stays unremembered and is a first check again next time). Because of these extra reads, a run that finds changes or first checks reads those searches three times.
Free rows
These rows are never charged and always say why:
status | When |
|---|---|
no-change | Monitoring mode: none of the tracked domains changed position. Only the check fee applies. |
unverified-page | No read of the search showed enough of the keyword's words in bold, so no page could be confirmed as the results for the keyword. Nothing is guessed. |
no-results | Bing said there are no results for the keyword. |
blocked | Bing answered with a bot check or nothing, even after reading again. Nothing is guessed. |
unreadable | The results page could not be read (for example the page layout changed). Nothing is guessed. |
invalid-input | A keyword, domain or country could not be used, or the input as a whole was rejected. |
duplicate | A keyword, domain or country repeated an earlier one. |
not-checked | Rows or searches left out because of maxResults or the per-run limits. |
budget-reached | Rows or searches left out because the run's maximum total charge was reached. |
Pricing
- Result rows (no tracked domains): $0.60 per 1,000 results, so a full first page of 10 results costs $0.006. Charged only for rows with
status: "ok". - Domain rank rows: $3.00 per 1,000 rows, one per tracked domain per search. A tracked domain that is not on the page is a charged row too:
not-in-shown-resultsis the answer to "where does my domain rank". - Monitoring mode: $1.00 per 1,000 domain checks, charged for every tracked domain on every search that was confirmed, changed or not. Example: 20 keywords for one domain, checked once a day, is 600 checks a month, which is $0.60, plus $3.00 per 1,000 for the changes returned.
- Searches that could not be confirmed, free rows and extra reads are never charged. The result and rank row prices can be lower on higher Apify plans; the monitoring check fee is the same on every plan.
- The run's maximum total charge is respected: the Actor stops reading before a row or a check would go over it and says what was left out.
Scheduling and monitoring tips
- Save your input as a task, turn on
monitoringModeand schedule it (daily is enough for most keywords). - Positions are remembered per domain, keyword, country and language, for this Actor across all your runs. Do not put the same pairs in two schedules that can run at the same time (Apify's key-value store has no atomic update, so overlapping runs can overwrite each other's records).
- Use
resetMonitoringStateonce to start a fresh baseline, then turn it off again.
Limits
- Positions are those of Bing's public web results page (www.bing.com), first page only. Bing's apps, Copilot answers and signed-in personalization are not seen.
- Ads, answer boxes, "People also ask", videos and images are not returned; ads did not appear on the pages we read.
- Search volume, keyword difficulty and click estimates are not provided.
- Up to 200 keywords, 50 domains, 30 countries and 1,000 searches per run.