One market, two search languages
Google dominates search in Ukraine: StatCounter puts it at about 91% of search referrals in August 2026. Yandex and Mail.ru were blocked in Ukraine in May 2017 by a presidential decree on sanctions.
People in Ukraine search in Ukrainian and in Russian, and websites answer in both. Since 16 July 2022 Article 27 of the law on the state language requires the sites of businesses that sell in Ukraine to load their Ukrainian version by default; other language versions are allowed, and many shops and services keep one in Russian.
For rank tracking this means that one product keyword is really two keywords, and the interface language of the person searching is a third variable. The measurements below show how much each of them changes the top 10.
What we measured
On 16 October 2026, between 08:41 and 08:44 UTC, we sent nine requests to the Serper.live API with country set to UA and asked for the top 10 organic results, on desktop unless noted. The Ukrainian market searches from a browser profile in Kyiv with the uk-UA locale; without the language parameter Google receives hl=uk.
| Search | Interface | Shared with its pair | Russian titles |
|---|---|---|---|
купити ноутбук (Ukrainian) |
hl=uk |
— | 0 of 10 |
купить ноутбук (Russian) |
hl=uk |
6 of 10 domains | 0 of 10 |
купить ноутбук (Russian) |
hl=ru |
5 of 10 domains | 6 of 10 |
як оформити ФОП (Ukrainian) |
hl=uk |
— | 0 of 10 |
как оформить ФОП (Russian) |
hl=uk |
7 of 8 domains | 0 of 10 |
как оформить ФОП (Russian) |
hl=ru |
6 of 8 domains | 2 of 10 |
ремонт телефонів київ (Ukrainian) |
hl=uk |
— | 0 of 10 |
ремонт телефонов киев (Russian) |
hl=uk |
5 of 10 domains | 8 of 10 |
купити ноутбук on mobile |
hl=uk |
6 of 10 domains | 0 of 10 |
Each Russian search under hl=uk is compared with the Ukrainian search above it, each hl=ru search with the same query under hl=uk, and the mobile search with the desktop one. The ФОП results hold eight distinct domains because YouTube takes three places. A title counts as Russian when it is written in Russian; titles that read the same in both languages, such as "Ноутбуки", count as neither.
Ukrainian and Russian keywords rank differently
Shopping searches overlap the most. For "купити ноутбук" and "купить ноутбук" six of ten domains are the same, and five of them hold exactly the same position. Still, four shops in each top 10 do not appear in the other one at all.
Informational searches keep the same sites in a different order. For how to register as a sole proprietor (ФОП), seven of eight domains repeat, but diia.gov.ua drops from #1 for the Ukrainian query to #5 for the Russian one, while privatbank.ua climbs from #7 to #1.
Local services split the most. For phone repair in Kyiv only five domains repeat, restore.com.ua moves from #7 to #1, and eight of the ten results for the Russian query carry Russian titles. In this sample shops answered the Russian query with Ukrainian pages, while service businesses answered it with Russian ones.
The interface language moves results again
The hl parameter is the language of the Google interface, not of the query. Switching it from uk to ru for the same Russian laptop query kept only five domains, turned six titles Russian and put aligator.com.ua, absent under hl=uk, at #1. rozetka.com.ua appeared twice, at #2 with a Ukrainian title and at #5 with a Russian one.
For the ФОП query the switch brought two Russian-language guides, from dilovod.ua and fop.freelancehunt.com, into the top 10 and returned diia.gov.ua to #1.
Which interface language your audience uses depends on their browser and Google settings, and no API can see it. If you are not sure, track both: it costs one more check per keyword.
Mobile is a separate ranking
On mobile, "купити ноутбук" shared six domains with desktop. rozetka.com.ua took #1 and #2, kvshop.com.ua fell from #3 to #7, and three shops appeared only on mobile. If most of your visitors come from phones, a desktop position is the wrong number to report.
Setting up rank tracking for Ukraine
- List every intent in both languages and store the variants as separate keywords: "купити ноутбук" and "купить ноутбук" are two rows, not one.
- Send
countryUAand setlanguageexplicitly,ukorru, instead of relying on the default. Store it with every position, so that later checks compare like with like. - Check
desktopandmobileseparately when the split of your traffic matters. - Match results on
domain. A bilingual site can appear twice in one top 10, so keep every position, or at least the best one and the count. - Repeat the checks on a schedule and report the trend rather than a single result: Google varies results between checks.
curl -s -X POST https://api.serper.live/v1/search \
-H "Authorization: Bearer sl_live_YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query":"купить ноутбук","country":"UA","language":"ru"}' \
| jq '[.organic[] | select(.domain == "example.com.ua") | .position]'
const checks = [
{ query: 'купити ноутбук', language: 'uk' },
{ query: 'купить ноутбук', language: 'uk' },
{ query: 'купить ноутбук', language: 'ru' },
];
for (const check of checks) {
const response = await fetch('https://api.serper.live/v1/search', {
method: 'POST',
headers: {
Authorization: 'Bearer sl_live_YOUR_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({ ...check, country: 'UA', device: 'desktop' }),
signal: AbortSignal.timeout(100000),
});
const { organic } = await response.json();
const positions = organic.filter(row => row.domain === 'example.com.ua').map(row => row.position);
console.log(check.query, check.language, positions);
}
import requests
CHECKS = [
("купити ноутбук", "uk"),
("купить ноутбук", "uk"),
("купить ноутбук", "ru"),
]
for query, language in CHECKS:
response = requests.post(
"https://api.serper.live/v1/search",
headers={"Authorization": "Bearer sl_live_YOUR_TOKEN"},
json={"query": query, "country": "UA", "language": language, "device": "desktop"},
timeout=100,
)
organic = response.json()["organic"]
positions = [row["position"] for row in organic if row["domain"] == "example.com.ua"]
print(query, language, positions)
In Ukraine a check of the top 10 costs $0.01; the JavaScript and Python examples run three checks. The pricing page lists every market. The rank tracking guide covers scheduling and storage.
What this data does not show
- One snapshot per search. Google varies results between checks and over time, so repeat a check before drawing conclusions from a single position.
- Country, not city. The Ukrainian profile searches from Kyiv, and the API selects the country, language and device, not the city. A local query for Lviv or Odesa may rank differently there.
- Organic results only. Ads, the map pack and other Google features are not part of
organic[], so a position is counted among organic results. - Titles are chosen by Google. The language of a title shows which version of a page Google decided to display, not everything the site offers.