Cos’è un’API per l’IP pubblico

Un’API per l’IP pubblico è un indirizzo web che risponde a una richiesta GET con l’IP da cui la richiesta è arrivata, in testo semplice o in JSON. Serve perché un computer dietro un router conosce solo il proprio IP privato: per sapere con quale indirizzo esce su Internet deve chiederlo a un server esterno.

Le risposte strutturate sono in JSON (RFC 8259). Tutte le chiamate usano GET, un metodo “sicuro” secondo la RFC 9110: legge dati senza modificare nulla sul server.

Come usare l’API IP da terminale

  1. Scrivi curl mio-indirizzo-ip.it/ip per ottenere il tuo IP pubblico in una riga di testo.
  2. Usa curl mio-indirizzo-ip.it/json per avere anche ASN, provider, rete CIDR e posizione approssimativa in JSON.
  3. Per analizzare un altro indirizzo aggiungilo in fondo: curl mio-indirizzo-ip.it/json/8.8.8.8.
  4. Negli script che usano l’IPv4 aggiungi -4 a curl. Il comando resterà corretto anche quando il servizio sarà raggiungibile in IPv6.

Gli endpoint disponibili

EndpointRispostaLimite
/ipIl tuo IP pubblico, testo semplice120/min
/cidrLa rete annunciata che contiene il tuo IP, per esempio 203.0.113.0/24120/min
/asnNumero e nome del sistema autonomo, per esempio AS64496 ESEMPIO-AS120/min
/jsonTutti i dati del tuo IP in JSON120/min
/json/<ip>Tutti i dati di un IPv4 o IPv6 pubblico qualsiasi30/min

Gli endpoint non hanno la barra finale. Il limite vale per singolo indirizzo IPv4 o per rete /64 IPv6. Gli header X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset dicono quante richieste restano. Oltre la soglia ricevi il codice 429 Too Many Requests (RFC 6585) con l’header Retry-After, che indica i secondi da attendere. Esistono anche soglie complessive per rete e per l’intero servizio, che proteggono le fonti dati.

I campi della risposta JSON

La risposta di /json è un oggetto con questi campi. L’esempio usa indirizzi e numeri riservati alla documentazione.

{
  "ip": "203.0.113.25",
  "version": 4,
  "hostname": "host-25.example.net",
  "asn": 64496,
  "as_name": "ESEMPIO-AS",
  "isp": "Esempio Telecomunicazioni",
  "cidr": "203.0.113.0/24",
  "country": "Italia",
  "country_code": "IT",
  "region": "Lazio",
  "city": "Roma",
  "timezone": "Europe/Rome",
  "is_private": false
}
CampoSignificato
ip, versionL’indirizzo e la versione del protocollo, 4 o 6
hostnameIl nome inverso (PTR) dell’indirizzo, null se manca
asn, as_nameIl sistema autonomo che annuncia la rete, da RIPEstat
ispIl provider secondo il database di geolocalizzazione
cidrIl prefisso annunciato in BGP che contiene l’IP
country, country_code, region, city, timezonePosizione stimata: affidabile per il paese, molto meno per la città
is_privatetrue per indirizzi privati o riservati, che non hanno dati pubblici

La risposta reale contiene anche source, con le fonti usate, e docs, il link a questa pagina. Un campo che una fonte non ha restituito vale null: il tuo codice deve prevederlo. Da curl il JSON arriva già indentato, dalle altre applicazioni in forma compatta.

Casi d’uso: DNS dinamico, monitoraggio, whitelist e log

L’API serve a qualsiasi script che deve conoscere un IP pubblico senza intervento manuale. I casi più comuni:

  • DNS dinamico: uno script legge l’IP con /ip e, se è cambiato, aggiorna il record A del dominio tramite l’API del tuo provider DNS. È l’alternativa fai da te a un servizio DDNS per una linea con IP dinamico.
  • Monitoraggio del cambio IP: un job pianificato confronta l’indirizzo con quello salvato e ti avvisa quando cambia, oppure registra ogni quanto il provider lo riassegna.
  • Whitelist: prima di autorizzare un server su un firewall o su un pannello di hosting, ricavi l’IP di uscita esatto della macchina, che può essere diverso da quello del tuo PC.
  • Analisi dei log: con /json/<ip> arricchisci gli indirizzi sospetti con ASN e provider, per capire se un attacco arriva da un datacenter o da una rete domestica.

Un esempio minimo per Linux e macOS, da lanciare con cron:

NUOVO=$(curl -4 -s -m 10 mio-indirizzo-ip.it/ip) || exit 1
VECCHIO=$(cat ~/.ip_pubblico 2>/dev/null)
[ "$NUOVO" != "$VECCHIO" ] && echo "$NUOVO" > ~/.ip_pubblico && echo "IP cambiato: $NUOVO"

Buone pratiche per interrogare l’API

L’API resta gratuita finché il carico è ragionevole:

  1. Non interrogarla più di una volta ogni 5 minuti per controllare il tuo IP. Un IP dinamico cambia di rado, e un controllo al minuto non ti avvisa molto prima.
  2. Se il record da aggiornare è un A, usa sempre curl -4: su una linea dual stack curl potrebbe collegarsi in IPv6.
  3. Salva in cache i dati di /json/<ip>: ASN e rete di un indirizzo cambiano raramente da un giorno all’altro.
  4. Imposta un timeout, per esempio -m 10, e gestisci gli errori: con un 429 aspetta i secondi indicati da Retry-After prima di riprovare.
  5. Controlla che la risposta sia un indirizzo valido prima di usarla in un record DNS o in una regola di firewall.

Da una pagina web puoi chiamare l’API con fetch(): le risposte includono l’header CORS Access-Control-Allow-Origin: *, quindi il browser le accetta da qualsiasi sito. In Windows PowerShell usa curl.exe oppure Invoke-RestMethod https://www.mio-indirizzo-ip.it/json, che converte già il JSON in un oggetto. Altri comandi sono nella guida IP da cmd, PowerShell e terminale.

Differenze con gli altri servizi che mostrano l’IP

Esistono molti servizi, quasi tutti in inglese, che restituiscono l’IP pubblico a uno script. Per il solo indirizzo si equivalgono: ogni server vede lo stesso IP da cui parte la richiesta. Cambiano i dati aggiuntivi e le condizioni d’uso, da verificare sul loro sito prima di usarli in produzione.

Il campo cidr è il prefisso annunciato in BGP letto da RIPEstat, cioè la rete che vedono i router, non un intervallo stimato. Documentazione e messaggi di errore sono in italiano. Non serve un account, e le richieste non vengono collegate a un profilo. Per esplorare la rete di un indirizzo dal browser c’è lo strumento CIDR di un IP.

Domande frequenti

L’API IP è davvero gratuita?

Sì, senza chiave né registrazione. Gli unici vincoli sono i limiti di frequenza: 120 richieste al minuto per il tuo IP e 30 al minuto per /json/<ip>. Per uno script che controlla l’IP ogni pochi minuti sono molto più del necessario.

Come ottengo solo l’indirizzo IPv4 anche se ho IPv6?

Usa curl -4 mio-indirizzo-ip.it/ip: curl si collega solo in IPv4 e il server vede il tuo indirizzo IPv4. Oggi il dominio non ha ancora un indirizzo IPv6, quindi l’API risponde comunque in IPv4 e una richiesta con -6 non va a buon fine. Con -4 negli script continuerai a ricevere l’IPv4 anche quando il servizio sarà raggiungibile in IPv6.

Cosa succede se supero il limite di richieste?

Il server risponde con il codice HTTP 429 Too Many Requests e un messaggio JSON. L’header Retry-After indica quanti secondi aspettare: il limite si azzera ogni minuto.

Quanto è precisa la posizione restituita dall’API?

È una stima di un database di geolocalizzazione di terzi: affidabile per il paese, spesso per la regione, molto meno per la città. ASN e cidr sono invece dati di routing pubblici letti da RIPEstat. Le cause degli errori di posizione sono nella guida posizione dell’IP sbagliata.

Posso usare l’API da JavaScript nel browser?

Sì: le risposte hanno l’header Access-Control-Allow-Origin: *, quindi fetch('https://www.mio-indirizzo-ip.it/json') funziona da qualsiasi pagina. Ricorda che ogni visitatore interroga l’API con il proprio IP e consuma il proprio limite.

Cosa restituisce l’API per un indirizzo privato?

Per un indirizzo privato o riservato, come 192.168.1.10, /json/<ip> risponde con un errore 400 e "is_private": true, perché quegli indirizzi esistono in milioni di reti locali e non hanno provider né posizione su Internet.

Fonti e riferimenti

Pagina aggiornata il