Следите за использованием ключа, пока не упёрлись в лимит
Наблюдение за заголовками квоты по ходу работы показывает приближение к лимиту задолго до того, как запрос будет отклонён.
Большая часть IP-геолокации в интернете работает через JavaScript-тег, который обращается к третьей стороне из браузера посетителя. Это ещё один скрипт для загрузки, ещё один запрос, которого браузер должен дождаться, и ещё одна вещь, которая может молча перестать работать, если посетитель её блокирует.
Эндпоинт /v1/ip принимает IP-адрес и сразу возвращает данные о местоположении. Если вызывать его с собственного бэкенда, используя IP-адрес, который ваш веб-сервер уже видит во входящем подключении, в браузере посетителя вообще не выполняется никакой скрипт.
GET /v1/ip?ip=203.0.113.42{
"status": "ok",
"ip": "203.0.113.42",
"version": 4,
"found": true,
"country": "France",
"country_code": "FR",
"region": "Ile-de-France",
"city": "Paris",
"postcode": "75001",
"lat": 48.8566,
"lon": 2.3522,
"timezone": "Europe/Paris",
"asn": 12345,
"org": "Example Networks"
}Если вызвать этот эндпоинт без параметра ip, он определяет собственный адрес вызывающей стороны, что удобно, когда ваш бэкенд выполняет запрос от имени посетителя, подключённого к нему в данный момент. Явно передавать параметр ip нужно тогда, когда адрес уже записан в журнал и вы определяете его позже.
Страна, регион и город покрывают большинство сценариев персонализации. Благодаря полю timezone вам часто не нужен второй запрос только для того, чтобы узнать местное время посетителя. Поля asn и org определяют сеть, к которой принадлежит адрес, что полезно для задач, выходящих за рамки простой персонализации, например для выявления хостинг-провайдеров или корпоративных сетей.
Не каждый адрес сопоставляется с местоположением. Поле found равно false для диапазона, который зарезервирован, не распределён или просто отсутствует в наборе данных, и в этом случае поля местоположения будут отсутствовать или окажутся пустыми. Проверяйте found, прежде чем читать country или city, а не считайте, что успешный HTTP-ответ всегда означает пригодное местоположение, поскольку запрос по частному или зарезервированному адресу всё равно вернёт 200 с found, равным false.
Вызов этого эндпоинта при каждом просмотре страницы, а не один раз за сессию, самый распространённый способ, которым сайт расходует свой лимит без реальной пользы. IP-адрес посетителя, а значит, и его приблизительное местоположение, обычно не меняется от одной страницы к другой в рамках одного визита. Определите его один раз в начале сессии, сохраните результат в сессии и на всех последующих страницах читайте эту сохранённую копию, а не вызывайте эндпоинт снова.
Каждое определение IP это один запрос. Поскольку местоположение посетителя редко меняется в пределах одной сессии, определите его один раз и сохраните результат на время сессии, а не вызывайте эндпоинт при каждом просмотре страницы. Так типичный сайт с запасом укладывается в 2 500 бесплатных запросов в день, которые входят в каждый ключ или доступны с одного адреса вообще без ключа.
Тот же эндпоинт и та же структура ответа работают для адресов IPv6 без каких-либо изменений в запросе, а поле version в ответе показывает, какое семейство вы получили. Если заметная доля ваших посетителей приходит по IPv6, смотрите документацию по определению IPv6.
Выполнение этого на стороне сервера полностью исключает сторонний скрипт с вашей страницы, что важно и для скорости, и для надёжности. Полный список полей смотрите в документации по определению IPv4.