What Good is a Number You Can't Call?
This one’s relatively short. I feel like I’ve been posting about Plant Smart a bit too much lately. But I’ve made a small change to how the site displays emergency information and it matters enough to warrant its own post. So, here we go.
Some background.
For three years every plant page on Plant Smart ended with the same two phone numbers and both of them were for the US. That never really sat right with me. I even flagged it as roadmap work when I rebuilt the site, then left it sitting there. The site’s whole reason for existing is for the moment your cat eats something and you need an answer now. For most of the people who land there from a search engine, I was answering with a number they can’t dial. So, I recently sat down to address that gap, assuming I’d spend a few minutes filling in a table of hotlines and be done with it.
Every single country had a speed bump.
- Sweden’s poison centre stopped answering questions about animals in July 2018 because the human call volume got too high.
- The Dutch line only takes calls from vets, so if you’re a pet owner in Rotterdam, the correct advice is “ring your vet and let them ring the line”, which is not a phone number at all.
- Belgium answers animal calls only during the day and says outright on its own site that it isn’t funded for animal work.
- The Australian helpline I’d have sworn was free actually starts at
$75. This is a bit embarrassing because I live here and should know this. - The UK’s fee changes depending on the time of day you call.
- The ASPCA doesn’t publish its consultation fee anywhere on its own page, so the figure everyone quotes online comes from third parties.
The list goes on.
I’d have got at least half of these wrong from memory, which is a genuinely unsettling thing to realise about emergency information.
Once again, I had to collate a bunch of disparate data and create a shape to support it before munging it all together. Every entry in the hotlines list now cites the operator’s page it came from and the date I read it which is the same rule I put on the plant records in the last post. A Python script holds the whole list and nags me when an entry goes over a year old and it runs as part of the automated deployment. So, the build gives me a big’ole bonk on the nose whenever the list goes stale.
The boring technical stuff.
The engineering ended up being the easy half and mostly a matter of deciding what fails safely. Hugo writes every country into the HTML as a partial. A small script then lifts the relevant one out and folds the rest away. It guesses in order: a country you’ve pinned, then the location filter if it names exactly one country, then your browser locale.
It never asks permission for anything, because a permission prompt at 2am is the last thing you need while you’re panicking about your pet. And, personally, I hate browser prompts asking for location tracking. Hard pass. If the script doesn’t run, or if the service worker hands you a stale page, you get all countries instead of the wrong one.
Too many numbers costs you a few seconds. The wrong number costs you the call.
There’s also a new emergency page for the first five minutes before you get through: what to do, what not to do and what they’ll ask you. The guidance follows the ASPCA and the Pet Poison Helpline which is also cited and linked. After all, the one thing I’m definitely not qualified to write is clinical advice.
Another free gift: the hotlines API.
There’s really no obvious centralised place online that collates all this information into a single data set. I’ve at least done the work of bootstrapping the handful of most common countries that have helplines and the list will definitely grow over time. So, I’ve exposed a new “hotlines” API endpoint with its own documented shape.
{
"countries": {
// ... more countries ...
"US": {
"checked": "2026-09-10",
"name": "United States",
"services": [
{
"audience": "owner",
"display": "(888) 426-4435",
"fee": "A consultation fee applies",
"hours": "24 hours, every day",
"org": "ASPCA Animal Poison Control Center",
"source": "https://www.aspca.org/pet-care/animal-poison-control",
"tel": "+18884264435"
},
{
"audience": "owner",
"display": "(855) 764-7661",
"fee": "$89 for each incident",
"hours": "24 hours, every day",
"org": "Pet Poison Helpline",
"source": "https://www.petpoisonhelpline.com/about/",
"tel": "+18557647661"
}
]
}
},
"notice": "Emergency telephone numbers for animal poisoning. Each country cites the operator page the entry came from and the date a person read it. Services close and numbers change, so check an entry before you rely on it. Coverage is not global. A country in this file with an empty services list has been checked and has no service an owner can call. A country that is absent has not been checked.",
"updated": "2026-09-10"
}I felt wrapping it in an envelope was the correct approach here. It leads with the notice and the date I last changed anything. A .countries object follows, keyed by ISO 3166-1 alpha-2 code. At the very least, it gives me room to change a country’s metadata later without breaking the top-level shape.
The audience field on each service is what carries the Dutch problem into the data. It reads either owner or vet. A vet entry means the number exists but you can’t ring it yourself, so the entry tells you to phone your vet and let them make the call.
Anyway, along with some stylistic changes and code cleanup, that’s pretty much all there is to it for this update. I’ll be giving Plant Smart a rest for a bit while all the changes settle in. This gives me some time to work on other fun things!
Enjoy, nerds!
1 revision since publication
- 659e9b3 +1 −1 og image update for latest article
- cb8a98a +90 −0 published
Comments