Определение IP-адреса запросом из программы

Чтобы получить IP-адрес из своей программы, отправьте обычный GET-запрос на https://api.ipgeo.ru/ – в ответ придёт одна строка JSON вида {"ok":true,"ip":"203.0.113.10","country":"RU"}. Ключ, регистрация и особые заголовки не нужны, платить не за что, а запрос одинаково работает из командной строки, со страницы в браузере и с сервера.

Обновлено 11.08.2026

Ваш адрес сейчас 216.73.217.12 проверить подробно

Адрес точки и первый запрос

Обращаться нужно по одному адресу: https://api.ipgeo.ru/. Такой адрес, к которому приходит не человек, а программа, принято называть точкой доступа. Метод обычный, GET. Тело запроса не нужно, особые заголовки тоже не нужны. Работает только защищённое соединение: обращение по http автоматически переводится на https.

Самый короткий способ убедиться, что всё работает, – одна строка в командной строке:

curl -s https://api.ipgeo.ru/

В ответ придёт одна строка:

{"ok":true,"ip":"203.0.113.10","country":"RU"}

Главное, что стоит понять сразу: ответ всегда про того, кто отправил запрос. Запустили у себя на компьютере – увидите свой домашний адрес. Запустили на сервере – увидите адрес сервера. Запрос ушёл из браузера посетителя Вашего сайта – увидите адрес посетителя.

Что приходит в ответе

Полей всего три, вложенности нет, и они всегда на своих местах.

Если разобрать адрес не удалось вовсе, ответ будет таким:

{"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>

Запасная ветка здесь не для красоты: у части посетителей стоят расширения-блокировщики, которые режут обращения к любым определителям адреса. Страница не должна из-за этого выглядеть сломанной.

Ни ключей, ни регистрации, ни счётчиков

Заводить ничего не нужно: ни учётной записи, ни ключа, ни подписи запроса. Личного кабинета, из которого доступ можно однажды отключить, здесь просто нет.

Просьба одна, человеческая: держите полученный ответ у себя хотя бы несколько минут, а не спрашивайте по разу в секунду. Внешний адрес меняется редко. Если с одного адреса пойдёт поток в тысячи запросов в минуту, мы вправе его придержать, но обычному сайту или домашней программе это не грозит.

Чего эта точка не делает

Честно о границах, чтобы Вы не тратили время впустую.

Где это пригодится

Короткий ответ без ключа удобен там, где не хочется подключать тяжёлый справочник или платную службу.

Если ответ не приходит

  1. Проверьте адрес целиком: именно https, косая черта на конце, никаких дополнительных путей;
  2. повторите из командной строки. Если оттуда ответ есть, а со страницы в браузере нет – скорее всего мешает расширение-блокировщик: составители списков правил давно и без разбора режут любые определители адреса;
  3. помните, что запрос с сервера возвращает адрес самого сервера, а не человека, который зашёл на Ваш сайт. Чтобы показать посетителю его адрес, запрос должен уходить из его браузера;
  4. если в системе или в самой программе прописан посредник, запрос уйдёт через него и Вы увидите его адрес. Это не ошибка, а ровно то, что произошло на самом деле;
  5. если пришёл ответ с 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 и часового пояса показывает сама страница: там это считается для того браузера, который её открыл.

Ещё по теме