โ† All guides

A Post Test Server V2 alternative: ptsv2.com is dead โ€” here's the same workflow back

For years, “Henry's Post Test Server V2” at ptsv2.com was the quickest way to see what your client actually sends: claim a toilet, point your script at ptsv2.com/t/<name>/post, and browse the dumps โ€” headers, form fields, query params, file contents โ€” in a browser. It's gone. The Wayback Machine last captured it alive on November 22, 2022; by May 2023 it was archiving 404s. Checked again September 2026: HTTPS connections to ptsv2.com fail at the TLS handshake, and plain HTTP serves a bare Google 404 โ€” the App Engine app behind the domain no longer exists. Every ptsv2.com/t/โ€ฆ URL baked into old shell scripts, IoT firmware, cron jobs and Stack Overflow answers now fails.

Mockbird gives you the same thing, free and without signup: one curl creates a URL that accepts any method on any path, logs method, headers, query and body to a browsable inspector, and replies with whatever status, body and delay you configure โ€” the exact knobs ptsv2 had.

๐Ÿ“ก Is ptsv2.com still down? We check it every 30 minutes with a plain GET, alongside Hookbin, requestb.in and other request-bin services: live status page (badge + Atom feed included).

Try it in 10 seconds (no setup)

The shared demo project has a catch-all bin with a public inspector โ€” post a dump right now:

curl -X POST https://mockbird.mockbird.workers.dev/m/demo/hooks/anything \
  -H 'content-type: application/json' -d '{"dump":"hello"}'

# browse the dumps (method, path, headers, body):
curl https://mockbird.mockbird.workers.dev/api/projects/demo/requests

(The demo is shared and resets daily โ€” your own private bin is below.)

Your own “toilet”, two curls

# 1. create a project (no signup)
curl -X POST https://mockbird.mockbird.workers.dev/api/projects \
  -H 'content-type: application/json' -d '{"name":"my-dump"}'
# โ†’ {"id":"abc123","adminKey":"KEY", ...}

# 2. add a catch-all route โ€” any method, any path, your choice of reply
curl -X POST https://mockbird.mockbird.workers.dev/api/projects/abc123/routes \
  -H 'X-Admin-Key: KEY' -H 'content-type: application/json' \
  -d '{"method":"ANY","path":"/*","status":202,"body":{"ok":true},"delayMs":2000}'

Old muscle memory works verbatim โ€” the catch-all doesn't care what the path looks like, so you can keep the ptsv2 shape and just swap the host:

curl -X POST "https://mockbird.mockbird.workers.dev/m/abc123/t/mytoilet/post" \
  -d 'field1=value1&field2=value2'
# โ†’ 202 {"ok":true}   (after the 2s delay you configured)

# read your dumps back (admin key required โ€” your bin is private):
curl -H 'X-Admin-Key: KEY' \
  https://mockbird.mockbird.workers.dev/api/projects/abc123/requests

Every command above was run against production before this page was published โ€” the form-encoded body, the 202, and the measured ~2.1 s delay all captured exactly as shown. Prefer a UI? The dashboard's Recent requests card has a “live” mode: click a row to expand headers and body.

ptsv2 โ†’ Mockbird translation

Post Test Server V2Mockbird
Claim a toilet at /t/<name>create a project + one ANY /* catch-all route (above)
Submit dumps to /t/<name>/postany method, any path under /m/<project>/โ€ฆ โ€” keep the old path if you like
Browse dumps in the toilet page; JSON/text views for scriptsGET /api/projects/<project>/requests (JSON) or the dashboard's live inspector
Configure the response status code (“200 is the default, 202 is another common value”)"status": 202 on the route โ€” or override per-request with ?mock_status=500
Configure the response body (paste a JSON string)"body" on the route โ€” plus templating ptsv2 never had: {"challenge":"{{body.challenge}}"} echoes request fields, {{now}}, {{uuid}}, {{query.x}}
Configure a delay (max 5 s โ€” and marked “currently broken” on App Engine)"delayMs": 2000 per route, or ?mock_delay=3000 per request โ€” up to 5 s, and it works
Toilets get “clogged” under load; old dumps deleted as new arrive10,000 requests/project/day; inspector keeps the last 50 requests
CORS header on all responses (added 2019)CORS on by default, everywhere
Ephemeral by design โ€” data can vanish anytimeprojects and URLs don't expire (inspector is still a rolling window, not an archive)

What ptsv2 had that Mockbird doesn't

Honesty section. ptsv2 let you put HTTP basic auth in front of a toilet so you could test that your client sends credentials properly โ€” Mockbird's mock auth is JWT-bearer-style, not basic auth, so that specific test doesn't translate. ptsv2 also showed uploaded file contents inside a dump; our inspector truncates stored bodies at ~2,000 characters and doesn't unpack multipart files. And its magic response strings ({{LINK}}, {{URL-TEXT}}, {{URL-JSON}}) returned a link back to the dump itself โ€” no equivalent here. If you need any of those, webhook.site (100 requests, 7-day free URLs) shows file uploads, and Beeceptor (50 requests/day free) has a rules engine.

A dump URL that's also a mock API

Catch-alls are a fallback: seeded resources and specific routes always win. The same project can serve /products as a full fake REST backend โ€” CRUD, filters, pagination, GraphQL โ€” while the catch-all quietly logs every stray request your client makes. Which, if you were debugging with ptsv2, was probably the question anyway.

Written by the Mockbird maker โ€” bias disclosed. The death timeline is from the Internet Archive (last live capture 2022-11-22, archived 404s from 2023-05-27) plus a direct check on September 4, 2026 (TLS handshake failure on 443; Google 404 on 80). ptsv2's feature list โ€” status/body/delay/auth configuration, dump views, CORS, throttling โ€” is from its own archived documentation pages, same source.

โšก Skip the terminal: this link creates a live, seeded e-commerce backend in the dashboard โ€” real URL, no signup. Or import an OpenAPI spec, db.json, CSV, Postman collection, or HAR and mock your exact shapes.