Определение IP-адреса запросом из программы
Чтобы получить IP-адрес из своей программы, отправьте обычный GET-запрос на https://api.ipgeo.ru/ – в ответ придёт одна строка JSON вида {"ok":true,"ip":"203.0.113.10","country":"RU"}. Ключ, регистрация и особые заголовки не нужны, платить не за что, а запрос одинаково работает из командной строки, со страницы в браузере и с сервера.
Обновлено 11.08.2026
Адрес точки и первый запрос
Обращаться нужно по одному адресу: https://api.ipgeo.ru/. Такой адрес, к которому приходит не человек, а программа, принято называть точкой доступа. Метод обычный, GET. Тело запроса не нужно, особые заголовки тоже не нужны. Работает только защищённое соединение: обращение по http автоматически переводится на https.
Самый короткий способ убедиться, что всё работает, – одна строка в командной строке:
curl -s https://api.ipgeo.ru/
В ответ придёт одна строка:
{"ok":true,"ip":"203.0.113.10","country":"RU"}Главное, что стоит понять сразу: ответ всегда про того, кто отправил запрос. Запустили у себя на компьютере – увидите свой домашний адрес. Запустили на сервере – увидите адрес сервера. Запрос ушёл из браузера посетителя Вашего сайта – увидите адрес посетителя.
Что приходит в ответе
Полей всего три, вложенности нет, и они всегда на своих местах.
- ok – признак того, что всё получилось. Значение true означает, что адрес определён;
- ip – адрес, с которого пришёл запрос. Это может быть и IPv4 (203.0.113.10), и IPv6 (2001:db8::1) – смотря по какому протоколу соединение дошло до нас;
- country – код страны из двух латинских букв по международному списку: RU, KZ, DE, US. Если страну определить не удалось, поле придёт пустым. Это не ошибка, а честное "не знаю".
Если разобрать адрес не удалось вовсе, ответ будет таким:
{"ok":false,"err":"no_ip"}Правильный разбор – сначала проверить ok и только потом брать ip. Ответ отдаётся как application/json в кодировке utf-8, а заголовок запрещает сохранять его в кэше, поэтому сведения всегда свежие, а не вчерашние. Имена полей мы не меняем: если со временем появится что-то ещё, оно добавится рядом, а привычные поля останутся на месте и Ваш разбор не сломается.
Примеры на curl, JavaScript, PHP и Python
Командная строка:
curl -s https://api.ipgeo.ru/ curl -4 -s https://api.ipgeo.ru/ # заставить пойти по IPv4 curl -6 -s https://api.ipgeo.ru/ # заставить пойти по IPv6
JavaScript прямо со страницы в браузере. Обращения с чужих сайтов разрешены, поэтому посредник на своём сервере не нужен:
fetch('https://api.ipgeo.ru/')
.then(function (r) { return r.json(); })
.then(function (d) {
if (d.ok) console.log(d.ip, d.country);
});PHP:
<?php
$raw = @file_get_contents('https://api.ipgeo.ru/');
$d = $raw ? json_decode($raw, true) : null;
if (!empty($d['ok'])) {
echo $d['ip'] . ' ' . $d['country'];
}Python, без сторонних библиотек:
import json, urllib.request
with urllib.request.urlopen('https://api.ipgeo.ru/', timeout=5) as r:
d = json.load(r)
if d['ok']:
print(d['ip'], d['country'])Во всех примерах разумно поставить небольшой предел ожидания – пяти секунд достаточно – и не считать неудачу поводом остановить всю программу. Сеть иногда подводит, и это нормально: покажите запасной текст и попробуйте позже.
Как показать посетителю его адрес на своей странице
Частая задача: человек пишет в поддержку, и нужны его адрес и страна, чтобы не выспрашивать это в переписке. Запрос должен уходить из браузера самого посетителя, иначе Вы получите адрес своего сервера.
<p>Ваш адрес: <span id="myip">определяем...</span></p>
<script>
fetch('https://api.ipgeo.ru/')
.then(function (r) { return r.json(); })
.then(function (d) {
document.getElementById('myip').textContent = d.ok
? d.ip + ' (' + (d.country || 'страна не определена') + ')'
: 'определить не удалось';
})
.catch(function () {
document.getElementById('myip').textContent = 'определить не удалось';
});
</script>Запасная ветка здесь не для красоты: у части посетителей стоят расширения-блокировщики, которые режут обращения к любым определителям адреса. Страница не должна из-за этого выглядеть сломанной.
Ни ключей, ни регистрации, ни счётчиков
Заводить ничего не нужно: ни учётной записи, ни ключа, ни подписи запроса. Личного кабинета, из которого доступ можно однажды отключить, здесь просто нет.
- обращения не привязываются к Вам и не складываются в историю – адрес обратившегося нигде не сохраняется, записи обращений мы не ведём;
- рекламы и сторонних счётчиков нет – ответ состоит ровно из тех трёх полей, ничего лишнего в него не подмешивается;
- страна считается у нас на сервере по местным базам сетей, наружу запрос не уходит, поэтому сбой чужого сервиса на ответ не влияет;
- обращение со страницы любого сайта разрешено заголовком, предварительный запрос OPTIONS обрабатывается;
- жёсткого предела числа обращений нет.
Просьба одна, человеческая: держите полученный ответ у себя хотя бы несколько минут, а не спрашивайте по разу в секунду. Внешний адрес меняется редко. Если с одного адреса пойдёт поток в тысячи запросов в минуту, мы вправе его придержать, но обычному сайту или домашней программе это не грозит.
Чего эта точка не делает
Честно о границах, чтобы Вы не тратили время впустую.
- Ответ всегда про того, кто спрашивает. Приписка вида ?ip=203.0.113.10 не поддерживается и просто не учитывается – узнать сведения о постороннем адресе через нас нельзя;
- города, координат и названия оператора связи в ответе нет – только адрес и код страны. Оператора и сеть показывает сама страница ipgeo.ru, когда Вы открываете её глазами;
- мы не помечаем адрес как ВПН, посредник или сеть с общим выходом – такой оценки в ответе нет, и выдавать догадку за точный признак было бы нечестно;
- страна берётся из местной базы сетей, а базы не бывают безупречными: у мобильных операторов и у недавно выданных сетей страна иногда определяется неверно;
- работает только корневой адрес. Любой другой путь отдаёт 404 – это сделано нарочно, чтобы не плодить лишние точки входа;
- истории обращений нет, поэтому спросить "с какого адреса я заходил вчера" не у кого: мы этого не храним.
Где это пригодится
Короткий ответ без ключа удобен там, где не хочется подключать тяжёлый справочник или платную службу.
- Показать человеку на своём сайте его адрес и страну – например, в разделе помощи или в форме обращения в поддержку, чтобы он не искал эти сведения сам;
- подставить язык, валюту или ближайший пункт выдачи по стране, не подключая платные справочники;
- узнать, каким адресом выходит в сеть Ваш сервер или домашний компьютер – одна строка в командной строке, без установки чего-либо;
- проверить, по какому протоколу уходит соединение: если curl -6 отвечает адресом вида 2001:db8::1, значит IPv6 у Вас действительно поднят и работает;
- в наблюдающей программе: раз в час запрашивать адрес и присылать себе уведомление, когда он сменился, – так видно смену адреса у оператора связи;
- убедиться, что соединение идёт через ВПН, а не мимо него: после включения тот же запрос должен вернуть другой адрес и другую страну. Если ответ прежний, значит соединение пошло напрямую.
Если ответ не приходит
- Проверьте адрес целиком: именно https, косая черта на конце, никаких дополнительных путей;
- повторите из командной строки. Если оттуда ответ есть, а со страницы в браузере нет – скорее всего мешает расширение-блокировщик: составители списков правил давно и без разбора режут любые определители адреса;
- помните, что запрос с сервера возвращает адрес самого сервера, а не человека, который зашёл на Ваш сайт. Чтобы показать посетителю его адрес, запрос должен уходить из его браузера;
- если в системе или в самой программе прописан посредник, запрос уйдёт через него и Вы увидите его адрес. Это не ошибка, а ровно то, что произошло на самом деле;
- если пришёл ответ с ok равным false, значит до нас не дошёл разбираемый адрес. Такое бывает при нестандартных посредниках на пути – попробуйте другое соединение.
Если этот же запрос возвращает Ваш настоящий адрес и страну, а нужен другой регион, его меняет наше расширение AnonVPN для Chrome: после включения api.ipgeo.ru вернёт адрес и страну выбранного сервера – заодно это простой способ убедиться, что соединение действительно пошло через него.
Расширение AnonVPN в магазине ChromeЧастые вопросы
Нужен ли ключ или регистрация для api.ipgeo.ru?
Нет. Достаточно обычного GET-запроса на https://api.ipgeo.ru/ – ни ключа, ни учётной записи, ни особых заголовков не требуется.
Сколько запросов можно делать?
Жёсткого предела нет. Просьба только не опрашивать чаще раза в несколько минут: внешний адрес меняется редко, и полученный ответ достаточно сохранить у себя.
Можно ли узнать страну по чужому адресу?
Нет. Ответ всегда относится к тому, кто отправил запрос, приписка с посторонним адресом не поддерживается и не учитывается.
Можно ли вызывать эту точку прямо из браузера?
Да. Обращения со страниц других сайтов разрешены заголовком, предварительный запрос OPTIONS обрабатывается, поэтому свой посредник на сервере не нужен.
Почему поле country пришло пустым?
Значит, адрес не нашёлся в базе сетей: так бывает у служебных диапазонов и у недавно выданных сетей. Само поле ip при этом верное.
Чем ответ api.ipgeo.ru отличается от того, что показывает страница ipgeo.ru?
В ответе только адрес и код страны. Оператора связи, сеть и проверки утечек WebRTC, IPv6 и часового пояса показывает сама страница: там это считается для того браузера, который её открыл.