worldtimeapi.org β the free time-and-timezone API behind years of tutorials, dashboard widgets, and IoT clocks (its URL even appeared in the official Python tutorial's "Brief Tour of the Standard Library") β has been sunset. The maintainers announced the shutdown citing hosting costs, and as of late Aug 2026 the domain doesn't answer at all β no farewell page, no 503, the TCP connection is simply reset:
$ curl https://worldtimeapi.org/api/timezone/Europe/London
curl: (35) OpenSSL SSL_connect: Connection reset by peer
π‘ Is worldtimeapi.org still dead? We check it (and 36 other classic public mock/placeholder APIs β including timeapi.io, the live keyless alternative below) with a plain GET every 30 minutes β see the live status page.
So every fetch("http://worldtimeapi.org/api/β¦") in every tutorial, weather app, and world-clock project now dies with a network error. If that's what brought you here, there are really two different jobs to replace, and they want different tools:
new Date().toLocaleString("en-GB", {timeZone: "Asia/Tokyo"}) β every browser and Node ship the full IANA database. If you truly need it over HTTP, timeapi.io is a maintained keyless option (verified working Aug 2026).We host a ready-made timezone dataset β all 418 IANA zones with area, location, country (name + ISO code), standard UTC offset (string and numeric hours), DST offset, and both abbreviations. Pipe it into the importer:
curl -s https://mockbird.mockbird.workers.dev/data/timezones.db.json \
| curl -s -X POST 'https://mockbird.mockbird.workers.dev/api/projects/import?name=timezones' \
--data-binary @-
The response has your project id and an adminKey (save it). Your API is live immediately, no signup, no key, CORS on:
https://mockbird.mockbird.workers.dev/m/YOUR_ID/timezones
Each record looks like:
{ "id": 337,
"zone": "Europe/London",
"area": "Europe", "location": "London",
"countryCode": "GB", "country": "Britain (UK)",
"utcOffset": "+00:00", "utcOffsetHours": 0,
"abbr": "GMT",
"dst": true,
"dstOffset": "+01:00", "dstAbbr": "BST" }
| WorldTimeAPI | Your Mockbird API |
|---|---|
/api/timezones (list all zone names) | /timezones?select=zone (or full records; total in X-Total-Count) |
/api/timezone/Europe/London | /timezones?zone=Europe/London (offset/DST metadata β see the honest note below about the live clock fields) |
abbreviation, utc_offset, dst, dst_offset | abbr, utcOffset, dst, dstOffset β same facts, flatter names |
/api/timezone/Europe (zones in an area) | /timezones?area=Europe |
/api/ip (zone for caller's IP) | deliberately none β we don't geolocate or log client IPs |
| (no equivalent) | country lookups (?countryCode=US), free-text ?q=, range filters, sort, GraphQL |
Try them (replace YOUR_ID, or run the import above first):
# all 20 US zones
curl 'https://mockbird.mockbird.workers.dev/m/YOUR_ID/timezones?countryCode=US&select=zone,utcOffset'
# one zone's metadata
curl 'https://mockbird.mockbird.workers.dev/m/YOUR_ID/timezones?zone=America/New_York'
# free-text search
curl 'https://mockbird.mockbird.workers.dev/m/YOUR_ID/timezones?q=london'
# who's on +05:30? (Asia/Colombo and Asia/Kolkata)
curl 'https://mockbird.mockbird.workers.dev/m/YOUR_ID/timezones?utcOffsetHours=5.5&select=zone,abbr'
# the far east of the clock: +12:45 and beyond, furthest first
curl 'https://mockbird.mockbird.workers.dev/m/YOUR_ID/timezones?utcOffsetHours_gte=12.75&sortBy=utcOffsetHours&order=desc&select=zone,utcOffset'
# European zones that don't observe DST
curl 'https://mockbird.mockbird.workers.dev/m/YOUR_ID/timezones?area=Europe&dst=false&select=zone,abbr'
The dataset is static on purpose β but if your old code expects an HTTP endpoint that returns now, add a custom route with the {{now}} template (runs at request time):
curl -s -X POST 'https://mockbird.mockbird.workers.dev/api/projects/YOUR_ID/routes' \
-H 'x-admin-key: YOUR_ADMIN_KEY' -H 'Content-Type: application/json' \
-d '{"method":"GET","path":"/utc",
"body":"{\"utc_datetime\":\"{{now}}\",\"unixtime_ms\":{{{ts}}},\"timezone\":\"Etc/UTC\"}",
"contentType":"application/json"}'
curl https://mockbird.mockbird.workers.dev/m/YOUR_ID/utc
# β {"utc_datetime":"2026-08-29T02:57:45.766Z","unixtime_ms":1787972265766,"timezone":"Etc/UTC"}
That covers "give me a trustworthy UTC timestamp" (the most common WorldTimeAPI job in scripts and IoT firmware). Converting UTC to a zone's wall clock is then one line with the offsets you're already serving β or, in any JS/Python runtime, zero lines, because the IANA database is built in.
?mock_delay=2000 / ?mock_status=503 to rehearse the outage that brought you here. PATCH a record to pin whatever your fixture needs.{ timezones(where:{countryCode:"GB"}) { zone abbr utcOffset } } at /m/YOUR_ID/graphql, with GraphiQL in the browser.GET /m/YOUR_ID/db.json returns the whole dataset in json-server format β no lock-in.| WorldTimeAPI | timeapi.io | Your Mockbird project | |
|---|---|---|---|
| Status | Sunset β domain unreachable (Aug 2026) | Up, keyless (verified Aug 2026) | Your project, your URL |
| Current wall-clock time per zone | β (was its whole point) | β | β static metadata + {{now}} UTC route (see Β§3) |
| Zone list / offsets / DST metadata | β | partial | β 418 zones, filter/sort/search/GraphQL |
DST transition dates (dst_from/dst_until) | β | β | β offsets + flags only β compute transitions client-side with the built-in IANA db |
| Time by client IP | β | β | β by design (no IP logging) |
| Writes / custom fields | β | β | Full CRUD |
| Can disappear out from under you | It just did | Free services can | Your copy; ejectable via db.json |
Intl/zoneinfo, which is faster and can't be sunset. Host your own copy when what you actually need is the stable metadata (zone picker, offset table, countryβzone lookup), when the request comes from every visitor's browser, or when your tests shouldn't depend on anyone's uptime.The dataset is derived from the IANA Time Zone Database (public domain) β the same source WorldTimeAPI, your OS, and every programming language use. One record per zone listed in tzdata's zone.tab (418 zones, each mapped to its country; aliases like US/Eastern excluded), with standard-time and DST offsets and abbreviations computed from the current tzdata rules at snapshot time. Caveat: governments occasionally change their DST rules β if one does, your copy won't update itself. It's your copy: PATCH the record, or re-import a fresh snapshot.
The one-liner in section 1 is the whole setup β or open the dashboard and paste the dataset into the import panel. The same project can host the matching countries dataset or currencies + exchange-rates dataset, mock any third-party API your app calls, or serve any CSV as an API.