Documentation
Complete guide to setting up website monitoring with PingZen. API documentation, code examples, and best practices.
Why timezones matter
PingZen monitors run around the clock — and so do their incidents. Without a clear timezone label, a timestamp like 14:30 is ambiguous: your local 14:30, the server’s 14:30, or UTC? The wrong answer can shift the reading of a status page by hours.
Every PingZen timestamp is stored in UTC and rendered in the timezone you choose, with an unambiguous label.
The three timezones in PingZen
Personal timezone
Your account preference. Applies to the dashboard, monitor history, incidents, alerts, heartbeats, and MCP tool output. Auto-detected from your browser on first login.
Status page timezone
A per-page setting. Auto (each visitor sees their own zone) or a pinned IANA zone (everyone sees the same time with an explicit label).
Report timezone
A per-report setting. It controls when the report runs (midnight in that zone) and the period boundaries. Set it in the report editor.
Your personal timezone
The Timezone selector in the sidebar (under Language) sets your preferred IANA timezone — for example Europe/Moscow, Asia/Yekaterinburg, America/Los_Angeles.
This affects every datetime you see inside PingZen:
- Incident “Started at” / “Resolved at”
- Maintenance window “Starts” / “Ends”
- Alert history “Last triggered at”
- Monitor last-check timestamps
- Heartbeat last-ping timestamps
- Date grouping in the Incidents list (today / yesterday / last 7 days is computed relative to your local calendar, not UTC midnight)
- MCP tool output (see Timezone-aware MCP below)
Auto-detect on first login
On your first sign-in PingZen reads your browser’s resolved timezone via Intl.DateTimeFormat().resolvedOptions().timeZone and writes it to your account. If that matches your real location you do not need to change anything.
Override later
Travel, VPN, or the rare case the browser guesses wrong — open the sidebar and pick from the curated list of ~40 zones, or use the one-click Use my browser timezone (X) link that appears whenever your saved zone differs from what the browser reports right now.
Status page timezone
Each public status page has its own Display timezone setting in the page editor (after Theme, before Monitors).
Auto (default)
Each visitor sees timestamps in their own browser timezone. Best for global audiences — a user in Tokyo and one in Berlin both see "their" time.
Pinned IANA zone
Every visitor sees the same time, in the zone you chose, with an explicit suffix in the page footer. Best for a regional audience or an internal page.
In pinned mode the page footer always shows the active zone:
Times shown in Europe/Moscow (MSK)This indicator is intentionally visible on every public status page — visitors should never have to guess whether 14:30 means their local 14:30 or the server’s.
Timezone-aware MCP
Tool responses from the PingZen MCP server (used by Claude in Cursor, Claude Code, Cline, and other LLM-driven editors) render datetimes in the authenticated user’s timezone. For a user with timezone = Europe/Moscow, list_incidents shows:
! **Database connection timeout** (ID: 12)
Status: ongoing
Severity: critical
Monitor: 47
Started: 2026-05-12 14:32:05 MSK (+03:00)Compare that to the same row for a UTC-locked user:
Started: 2026-05-12 11:32:05 UTC (+00:00)Both the abbreviation (MSK, UTC) and the numeric offset (+03:00, +00:00) are included on every timestamp — the LLM gets unambiguous context whether the same agent is parsing the row in Moscow or Yekaterinburg.
Version required: MCP server 0.16.0 or later. Earlier versions returned UTC ISO strings only. Check the MCP Setup page for the current version.
Tools that became timezone-aware in 0.16.0
REST API
Manage timezone preferences via REST.
Set your account's preferred IANA timezone
Read back the current value (in timezone field)
Update a status page's timezone (string for pinned, null for Auto)
Examples
Set your personal timezone:
curl -X PATCH https://pingzen.dev/api/v1/auth/me/timezone \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"timezone": "Europe/Moscow"}'Pin a status page to Moscow time:
curl -X PUT https://pingzen.dev/api/v1/status-pages/42 \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"timezone": "Europe/Moscow"}'Switch the page back to Auto (visitor’s browser):
curl -X PUT https://pingzen.dev/api/v1/status-pages/42 \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"timezone": null}'Validation
The server validates each timezone against the official IANA database (zoneinfo.available_timezones() on the backend). Unknown names are rejected with HTTP 422 Unprocessable Entity and an explicit error body:
{
"detail": [
{
"type": "value_error",
"loc": ["body", "timezone"],
"msg": "Value error, Unknown IANA timezone: 'Mars/Olympus'. Use names like 'Europe/Moscow' or 'UTC'."
}
]
}Backend also logs WARNING rejected invalid IANA timezone='Mars/Olympus' on every rejection so operators can spot bad clients in the audit log.
What stays in UTC (and why)
Some surfaces deliberately ignore your timezone preference. Each has a specific reason.
Database storage
Every created_at, started_at, resolved_at is stored as UTC. This is the source of truth — your timezone setting is a presentation concern, not a data concern.
Webhook payloads
Outgoing webhooks carry UTC ISO strings (e.g. 2026-05-12T11:32:05Z). Downstream automations (Home Assistant, n8n, Node-RED) parse them with their own timezone logic — they must not depend on your personal preference.
Email/Telegram/Slack alert bodies (today)
Most channels don't include explicit timestamps in the message — the timestamp on the message itself is what readers anchor to. MS Teams cards still embed a Timestamp field in UTC; bringing that into the user's timezone is on the roadmap.
Cron schedules
Scheduled reports already have their own timezone field that controls when they run. The personal timezone preference only affects display.
Daylight Saving Time
PingZen uses Python’s zoneinfo module on the backend and Intl.DateTimeFormat on the frontend. Both honor the official IANA database, so DST transitions are handled automatically:
| Zone | Winter offset | Summer offset |
|---|---|---|
Europe/Moscow | +3:00 (MSK) | +3:00 (MSK) — DST abolished 2011 |
Asia/Yekaterinburg | +5:00 (YEKT) | +5:00 (YEKT) — DST abolished 2011 |
Europe/Berlin | +1:00 (CET) | +2:00 (CEST) |
America/New_York | -5:00 (EST) | -4:00 (EDT) |
You do not need to change your timezone setting twice a year. The abbreviation shown next to the time updates automatically on the DST boundary.
FAQ
My status page is read by both Moscow and Berlin teams. What should I pick?
Leave it on Auto. Each visitor's browser will pick the local zone and the footer indicator will say which one — no one is on someone else's clock.
My team is all in one office. Should I pin the status page to that zone?
Yes — pin it to the office timezone. Everyone sees the same wall-clock time, which makes "the incident started at 14:30" a sentence everyone reads the same way.
I changed my timezone but the dashboard still shows UTC.
Reload the page. The selector writes the new value to the server with a 300ms debounce and the store updates optimistically — a hard reload guarantees every component re-reads it.
My LLM is still showing UTC in MCP responses.
Check that your MCP server is on version 0.16.0 or later. Self-hosted MCP integrations may pin an older version — pull the latest ilyakong/pingzen-mcp image. Cloud-hosted (pingzen.dev/mcp) is always on the latest version.
Why doesn't PingZen offer "GMT+3" instead of "Europe/Moscow"?
Numeric offsets do not survive Daylight Saving Time. An IANA zone like America/New_York automatically swaps between EST (UTC-5) and EDT (UTC-4) on the right date; "GMT-5" would be wrong half the year.
Common Questions
What protocols can I monitor?
PingZen supports 23 protocols: HTTP/HTTPS, WebSocket (WS/WSS), TCP, UDP, ICMP Ping, gRPC, DNS, WHOIS, TLS/SSL certificates, Email (SMTP/IMAP/POP3), FTP/FTPS, DNSBL, PageSpeed, SOCKS5, MTProxy, API Check, and Transaction. You can monitor websites, APIs, servers, databases, and any network service.
How fast can I get alerts?
Telegram alerts are delivered within 1-2 seconds of detection. Slack and Discord notifications arrive almost instantly. You can configure multiple alert channels for redundancy.
Can I organize monitors by project?
Yes! PingZen supports workspaces, which let you organize monitors by project, environment, or team. Each workspace can have its own alert configurations and team members.
Is there an API for automation?
Absolutely. PingZen provides a full REST API with OpenAPI documentation. You can create, update, and delete monitors programmatically.
How do status pages work?
Status pages are public, branded pages showing your services' uptime. You can display real-time status and allow customers to subscribe for updates.
What happens if I reach my monitor limit?
We'll notify you when approaching your limit. You can pause some monitors or contact us for increased capacity. We never stop monitoring without warning, ensuring your critical services stay protected.
Ready to stop missing downtime?
Join thousands of teams who trust PingZen. Setup takes 30 seconds.