How often does my home's IP address change?

I know that when I connect to the internet via my residential ISP, my public-facing IP address is dynamic and not static. But how often does it actually change? It's never hindered my day-to-day, so I don't know. Some people complain it happens too frequently. I don't necessarily need a static home IP for anything, and they're not even available if I did. Tailscale already exists for homelab shenanigans, but... I just wanna know!
Table of Contents
Why am I doing this
The short answer is I have no good reason. That said, for my NextDNS setup, my Raspberry Pi runs a cron job that just calls this unique URL every minute so that my public-facing IP address is properly linked to my home's router. This is what lets me have that ad-free goodness for any device connected to my home network.

Does the cron job really need to run every minute? Well, I'm dead in the water if my IP address updates until I call NextDNS again. However, it'd be more efficient to call that URL only when I've actually detected an IP address change... which I'd need to do from a minutely cron job. Yeah yeah, that's not a good reason, but at least I'd reduce my traffic to NextDNS? ¯\_(ツ)_/¯
There actually ARE good reasons to react to IP address changes. For example, you can update your DNS settings with a DNS provider (less applicable to residential networks because of Carrier-grade NAT). Or maybe you want to know if your IP changes while using an Apple TV as a Tailscale exit node. Or maybe because you want an excuse to write a post about it since you're a weirdo 🙋♂️
To find my public facing IP address, I usually just go to a site like whatismyipaddress.com

The IP address is correct, but I'm not in Sterling Heights. And my ISP isn't Google. And I'm not on a VPN. Despite being mostly wrong, the IP address is trivial to get right, and there's plenty of copycat websites to cross-reference:
- whatismyipaddress.com
- whatismyip.com
- showmyip.com
- whatsmyip.org
- whatsmyip.com
- myip.com
- ip.me
- and on and on...
My hypothesis is that my IP address actually won't change very often. I get emails when I log into certain websites from new IP addresses, and I don't get them that often. As further evidence, while noodling with another service I saw in the logs that my IP address didn't even change for the whole month of February.

Why do I keep obscuring my IP address?
Good question, honestly. When I first started writing this, I didn't even bother obscuring it in my screenshots. The IP address alone can't pinpoint my exact house, so what's the big deal? After thinking about it, bad actors can DDOS me and/or my neighbors, attempt to probe the network, or try and target me with weirdly-personalized ads. The gist of everything is still the same, so obscured it is.
Tracking IP changes
I'm not going to manually check my IP every day and write it down. I noticed that IPInfo has their own "what is my IP" tool. Their API has 50k requests/mo for free, so I'm curious if I can just curl
that URL:
{
"ip": "***.***131.185",
"hostname": "***-***-131-185.clsp.qwest.net",
"city": "Colorado Springs",
"region": "Colorado",
"country": "US",
"loc": "38.8339,-104.8214",
"org": "AS209 CenturyLink Communications, LLC",
"postal": "80901",
"timezone": "America/Denver",
"readme": "https://ipinfo.io/missingauth"
}
Looks like it works! Wait, what's that last line about missing auth? Lemme try it again after registering for a proper account:
{
"ip": "***.***.131.185",
"hostname": "***-***-131-185.clsp.qwest.net",
"city": "Colorado Springs",
"region": "Colorado",
"country": "US",
"loc": "38.8339,-104.8214",
"org": "AS209 CenturyLink Communications, LLC",
"postal": "80901",
"timezone": "America/Denver"
}
It's... it's just the same thing without that last line. OK well with an auth token maybe I won't have to worry about rate limiting? Since I just want to check my IP address periodically, I'll set up a cron job with alerting. I'll run it on that same Raspberry Pi that's just sitting in a closet pinging NextDNS.
I was looking for an excuse to use an LLM to build a service and figured this could be a good opportunity. I started by building out a spec with Claude, fed it into DeepSeek R1 for a development plan and then... realized it's complete overkill for this. That's more appropriate for bigger projects like an email newsletter manager. I'm not running a service with uptime SLAs here, so I just used Claude to flesh out a plain ol' once-a-minute bash script. There's only 43.8k minutes in a month, so I'm well below the IPinfo limits.
After doing some testing, tweaking, and verification, I just needed to let things run for a while....

Notifications
Alerting is an easy rabbit hole to fall into. I just want to get an email when my IP changes, so I began looking into standing up my own email server, checking requirements to ensure emails don't wind up in spam... it got hairy enough that I debated even implementing it. But without alerting, how is this cron job much different than just checking manually?
I'm thankful Claude prompted me (ha!) to check out ntfy.sh. It's a pub/sub service I can simply PUT/POST messages to and get notifications via app or email. Free accounts get up to 5 emails a day, which is probably more than enough for my use case.

Can I force an IP change with modem reboots?
Unrelated to this experiment, I had to reboot my modem on March 21st because of network connectivity problems, and my IP did indeed change. I'm not sure if the issues were caused by an IP update (and NextDNS subsequently didn't update), a fiber-seeking backhoe, or some other network error. The reboot fixed the issue, and my IP change was logged.

So can I make my IP change by restarting it when everything is running smoothly? I mentioned I'm not beholden to uptime SLAs, but that's not entirely true; the rest of my household expects a certain level of uptime.
On May 27th, I finally had a chance to play with restarting my router/modem. First, I turned them off for ten seconds, then turned them back on. My IP was unchanged. Then, I turned them off for a minute and a half, then turned them back on. My IP was changed. My script notified me, and NextDNS was updated.

So yes, you can change your IP by restarting your router/modem with a long-enough reboot time. That makes sense, since your ISP assigns these dynamically and wouldn't want to reassign it at the first sign of connectivity issues.
What does CenturyLink Quantum say?
Did I even think to ask my ISP how things work? No. But then I figured I should at least look it up. I didn't see anything in their FAQs, so I looked for an email address. I couldn't find an email address, so I tried to ask the chatbot. The link was broken, so, with an audible sigh, I picked up the phone to call Support. Was I looking forward to confusing a support rep with innocuous questions? Not especially. But what if there's some internal knowledge base article with an Official Answer? It'd be interesting to see if it lines up with my experience.
After only a couple minutes, I was connected to a pleasant member of the Quantum Customer Success Team named Dillon. I led by asking if static IPs were available, but he confirmed they are not. He said the official word is they're coming "later this year," but that's been the official word for over a year. He introduced me to the phrase "moving horizon" which I'm going to use more often.
When I asked about how often I can expect my dynamic IP to change, he found a doc saying "IPs change frequently; often every couple days or weeks, but may be more often depending on an ISP's policies." Dillon recalled IPs changing as often as every day.
In a stroke of luck, he said he's able to look up my account's history of modem authentications. He even saw my IP update from May 27th. After tooling around his portal, he was able to pull up all my available records! ...from only the last 48hrs. Womp womp. Anyway, Dillon was super helpful, patient, and I gave him all the top ratings in the subsequent survey.
So how many times did the IP address change?
Yeah wow, this is a lot of words for something so trivial. Don't worry, I've got a chart.

Wow, how anticlimactic. It only changed the two times that I already mentioned above. But hey, it was fun to drop the CSVs into ChatGPT and watch o3 analyze the data to make this chart.
So this means I can probably host my own stuff somewhat reliably, right? No. Not only because this isn't officially supported, but because of CGNAT. I briefly mentioned it above, but I share this IP with a bunch of my neighbors, and there's no easy way to keep up with which port my ISP assigned to me. Tailscale figured out all the hard parts to make this kind of thing work already, so any use case I could think of wouldn't make sense anyway.
And now I know that my IP only changes sometimes! That conclusion lines up with my hypothesis, and I get to experience the effusive joy of being right. Thanks for reading.