Skip to main content
mySites.guru

Active Joomla security alerts: Helix3 File WriteJCE Profiles HackRSFiles RCEBalbooa Forms RCESP Page Builder Zero Day

Joomla Update Error 999: a Dead Extension Redirecting to LinkedIn

Joomla Update Error 999: a Dead Extension Redirecting to LinkedIn

You open a Joomla site to run updates, or you glance at your update dashboard, and you get this:

Invalid status code "999"; must be an integer between 100 and 599, inclusive.
Your site responded with Invalid status code "999".

Nothing you did is wrong. This is not a Joomla bug, and if you saw it in mySites.guru, it is not a mySites.guru bug either. One of your installed extensions is pointing its update check at a web address that no longer serves an update file. Here is exactly what the 999 means and the two-minute fix.

If you manage more than a handful of Joomla sites, the 999 error has a habit of showing up on almost all of them at once, because the culprit is usually a single extension you installed everywhere. mySites.guru reads every update-site URL your sites report in its twice-daily snapshot, so you can find the dead one and clear it across your whole portfolio of Joomla sites instead of hunting site by site.

What does “Invalid status code 999” mean in Joomla?

999 is not a real HTTP status code. Every valid HTTP response carries a three-digit status between 100 and 599, and 999 sits outside that range, so no well-behaved server should ever return it. LinkedIn is the exception: it replies with 999 to block automated traffic it does not recognise. If your Joomla update check lands on a 999, the request ended up at LinkedIn instead of at an update file.

So how does a Joomla update check end up at LinkedIn? Through an extension whose developer walked away.

Why an abandoned extension breaks your Joomla update check

Every Joomla extension that supports updates registers an “update site”: a URL Joomla calls to ask “is there a newer version?”. The developer owns that URL. When a developer abandons an extension and lets the domain or the update path lapse, that URL can start doing something it was never meant to do.

The one that bites Dutch Joomla sites most often is an abandoned Dutch translation pack, RSJoomla! Dutch Translations by Wilco Alsemgeest. Its update site at con-con.nl now issues a 301 redirect straight to the author’s LinkedIn profile. Joomla follows the redirect, LinkedIn decides the request is not a real browser, and LinkedIn answers 999.

Under the bonnet, Joomla fetches update XML through its own HTTP library (joomla/http), which is built on laminas-diactoros. Diactoros validates the status line of every response and throws the instant it sees a code outside the valid range:

Invalid status code "999"; must be an integer between 100 and 599, inclusive

That check fires before Joomla ever gets to compare the response against 200, which is why the update simply stops with the raw exception rather than a tidy “no update available”. The rule Diactoros is enforcing is not arbitrary. RFC 9110, the HTTP standard, defines a status code as a three-digit integer and reserves the entire valid space to 100 through 599. 999 is not in it.

This is version-agnostic. It has nothing to do with which Joomla you run: sites on Joomla 4, 5, and 6 all hit it the same way because they share the same HTTP library. It also breaks Joomla’s own Pre-Update Check, so a single dead update site can block you from upgrading the CMS at all.

How do I find the update site causing the 999 error?

Go to Extensions, then Manage, then Update Sites in your Joomla administrator. That screen lists every update URL your installed extensions have registered, and you are looking for one that redirects off-site.

Confirm it from the command line with curl:

curl -sI -L "https://con-con.nl/ReleaseSystem/rsjoomla.xml"

A healthy update site returns 200 and some XML. A dead one looks like this:

HTTP/2 301
location: https://www.linkedin.com/in/wilcoalsemgeest/
HTTP/2 999

The 301 to a LinkedIn profile followed by a 999 is the smoking gun. LinkedIn’s response even carries an x-li-fabric header, so there is no doubt about where the request ended up.

If you would rather not touch the command line, mySites.guru shows the exact update-site URL for every stream on each site, so you can eyeball the list and spot the odd domain. It is worth checking where every extension’s update site actually points regardless, because almost nobody does, and an update URL is a route straight into your site’s update process.

How do I fix the 999 update error in Joomla?

Delete the offending update site, do not just disable it. In Extensions, Manage, Update Sites, select the dead entry and use Delete. If the extension itself is genuinely abandoned and you no longer need it, uninstall the extension too, which removes the update site for good.

Warning

Disabling the update site is not enough. Joomla re-enables disabled update sites the next time it checks for updates, so the error comes straight back. Delete it, and uninstall the abandoned extension if you can.

If you use mySites.guru, do one more thing. Open Manage Site, then Config, scroll to the bottom, and turn off “re-enable disabled update sites”. Otherwise mySites.guru switches the dead site back on at the next check and the error returns.

Why disabling the update site isn’t enough

Joomla treats update sites as disposable and rebuilds them from each extension’s manifest. Disable one and the next “Find Updates” run can switch it straight back on. This is documented behaviour: the Rebuild button repopulates the update-sites table from your installed extensions’ manifest files, and Joomla has re-enabled disabled update sites on update checks for years (issue #13436).

A disable is temporary. A delete holds until the next rebuild. Uninstalling the dead extension is the only change that holds permanently, because there is no manifest left to rebuild from.

Can mySites.guru just ignore the 999 code?

No, and it would not help if it did. This question comes up every time: “can you patch your validator to accept 999 so the error goes away?” We will not, for two reasons.

First, 999 is genuinely not a valid HTTP status. Teaching our tooling to trust malformed responses is exactly the kind of shortcut that hides real problems later.

Second, and more practically, it would not fix anything. Even if mySites.guru swallowed the 999, Joomla’s own update client on your site still rejects it, so you would keep hitting the same wall in Joomla’s Update Manager and Pre-Update Check. The error is not in the validator. It is an abandoned update site, and that is where it has to be fixed. Do that once and it is fixed everywhere: in Joomla, in mySites.guru, and in any other tool that reads your update sites.

If you want to push the extension author to fix it, the argument is simple. Their update site redirects to LinkedIn, LinkedIn returns a code that is not in the HTTP specification, so any client that respects the spec breaks. That is on the update site, not on Joomla.

Managing update sites across a portfolio of Joomla sites

Here is the pattern we see across large Joomla portfolios: one popular extension installed on every site, one dead update URL, and suddenly the update dashboard is red almost everywhere at once. A Dutch agency we work with hit exactly this, the same abandoned extension flagging the 999 across nearly their entire client list when they sorted their updates by site.

At that scale, fixing it by hand on each site is the wrong tool. mySites.guru reads the update-site URLs from every connected site, so you can find the offender once and clear it everywhere, and the “re-enable disabled update sites” toggle keeps it gone. If you would rather we just sorted it, send us the details and we will look for free.

The 999 error vs the “offered update has expired” error

These two look similar and are completely different. The 999 error is a dead third-party update site on your own site. The “offered update has expired” error is a problem at Joomla’s end, where the signed update metadata that Joomla.org serves has gone stale. One you fix on your site, the other you wait out or work around. If your update is failing, check which message you actually got before you change anything.

One naming clash is worth clearing up too. This 999 has nothing to do with the Joomla 3.10.999 project, which is Phil’s community security-patch repository for end-of-life Joomla 3. Same three digits, unrelated problem.

Further Reading

If you are not already using mySites.guru to watch your Joomla and WordPress sites, create an account and let it surface broken update sites, failed updates, and security issues across everything you manage.

Frequently Asked Questions

What does HTTP status code 999 mean?
999 is not a valid HTTP status code. The HTTP standard defines valid codes as three-digit integers between 100 and 599. LinkedIn returns 999 to block automated traffic it does not recognise, so seeing 999 means your request was redirected to LinkedIn instead of a real update file.
Is the Joomla 999 update error a bug in Joomla or mySites.guru?
No. It is caused by one of your installed extensions whose update site now redirects to LinkedIn. Joomla's update client correctly rejects the non-standard 999 response, and mySites.guru is only relaying your own site's failed update check.
How do I fix the 'Invalid status code 999' error when updating Joomla?
Go to Extensions, Manage, Update Sites, find the update site that redirects off-site, and delete it. Do not just disable it. If the extension is abandoned, uninstall it too. In mySites.guru, also turn off 're-enable disabled update sites' so it does not come back.
Why does the disabled update site keep coming back?
Joomla rebuilds update sites from each extension's manifest file, so a disabled update site is re-enabled on the next update check. Deleting the update site holds until the next rebuild, and uninstalling the extension removes it permanently.
Does the 999 error affect all versions of Joomla?
Yes. Joomla 4, 5, and 6 all share the same HTTP library, so any of them hit the error the same way. It also breaks Joomla's own Pre-Update Check, which can block you from upgrading the CMS itself.
Can mySites.guru just ignore the 999 code so the error goes away?
No, and it would not help. Even if mySites.guru accepted the 999, Joomla's own update client on your site still rejects it, so you would keep hitting the wall in Joomla's Update Manager. The fix belongs at the abandoned update site, where it fixes the problem everywhere at once.

What our users say

Tomasz
TomaszAL-TAIR
★★★★★

I've been managing multiple Joomla! websites for years, and I honestly can't believe I wasn't using mySites.guru sooner. It has completely changed the way I maintain and monitor my sites. The service is incredibly useful, making it easy to keep track of updates, security, backups, and the overall health of all my Joomla! installations from one place. It's a huge time-saver and makes managing multiple websites so much more convenient. On top of that, the pricing is extremely attractive for everything you get. The value is outstanding, especially if you manage more than one Joomla! website. I highly recommend mySites.guru to anyone working with Joomla!. It's one of those tools that, once you start using it, you wonder how you ever managed without it.

Read more reviews
Dave Cremins
Dave CreminsOwner, Cremins Marketing
★★★★★

I have been using Phil's service since 2016 and previously to that I had used his form component. Phil provides a first class proactive service which gives me an insight into all of my sites within 1 interface. Updates and any other fixes can be applied which saves a significant amount of time when managing multiple sites.

Read more reviews

Read all 230 reviews →

Ready to Take Control?

Start with a free site audit. No credit card required.

Get Your Free Site Audit