Stable control page

Reliability, badly behaved.

A deliberately unreliable benchmark site for uptime monitors, synthetic checks, alert pipelines, and anyone who has ever received a 3:07 AM notification that simply said "HTTP bad".

Using params

Params are optional query string settings that let you make an unreliable endpoint behave in a specific way.

01

Start with the endpoint

Use the subdomain as-is for the default behavior, or add a question mark to begin custom settings.

https://flaky.unreliablewebsite.com/
02

Add settings

Use name=value pairs. Join multiple settings with &. Your monitor will request the full URL.

?fail=100&status=503
03

Make tests repeatable

Where supported, add a seed so a random-looking test gives the same result each time.

?codes=200,500,503&seed=demo
Flaky failure

Always fail with a 503, which is useful for checking alert timing.

https://flaky.unreliablewebsite.com/?fail=100&status=503
1 / 6

Test cases

Each endpoint is small, configurable, and intentionally annoying in one specific way.

LAB-01 HTTP

Random Status

Picks from a configured set of status codes. Sometimes a teapot, sometimes a disaster.

Subdomain
random-status.unreliablewebsite.com
Assert
Alert on non-2xx or compare chosen status distribution.

Params: codes=200,500,503, seed=abc, body=1

LAB-02 FLAKE

Flaky

Fails by percentage, for teams who miss their incident channel being too quiet.

Subdomain
flaky.unreliablewebsite.com
Assert
Detect repeated intermittent 503s without declaring total doom.

Params: fail=25, status=503, seed=abc

LAB-03 LATENCY

Slow

Responds eventually, after taking a meaningful pause to consider its choices.

Subdomain
slow.unreliablewebsite.com
Assert
Alert when response time crosses your monitor timeout.

Params: delay=5, min=1, max=10, status=200

LAB-04 CLOCK

Scheduled

Fails inside predictable windows so incident timing can be compared fairly.

Subdomain
scheduled.unreliablewebsite.com
Assert
Detect the down window and recovery time accurately.

Params: down_for=5, period=60, status=503

LAB-05 LOOP

Redirect Loop

Redirects in circles until the monitor admits it is lost.

Subdomain
redirect-loop.unreliablewebsite.com
Assert
Detect redirect loops and excessive redirect chains.

Params: limit=10, status=302

LAB-06 BODY

Wrong Content

Returns 200 OK with the wrong words, which is technically fine and practically not.

Subdomain
wrong-content.unreliablewebsite.com
Assert
Use keyword checks, not just status checks.

Params: expected=..., mode=wrong|right

LAB-07 JSON

Bad JSON

Advertises JSON and then forgets where the brackets go.

Subdomain
bad-json.unreliablewebsite.com
Assert
Validate API payload shape, not just content type.

Params: mode=bad|good, status=200

LAB-08 METHOD

Method Mismatch

GET and HEAD disagree, as many monitoring setups quietly discover.

Subdomain
method-mismatch.unreliablewebsite.com
Assert
Confirm which HTTP method your monitor actually uses.

Params: head=500, get=200

LAB-09 LIMIT

Rate Limit

Starts friendly, then returns 429 when the visitor gets clingy.

Subdomain
rate-limit.unreliablewebsite.com
Assert
Check handling of monitor frequency and 429 responses.

Params: limit=5, window=60, status=429

LAB-10 HEADER

Headers

Sends odd cache and length hints for header-sensitive monitors.

Subdomain
headers.unreliablewebsite.com
Assert
Notice stale cache headers and malformed response metadata.

Params: cache=stale, length=wrong|omit|normal, status=200