LLM peak-time clock
Is it peak time right now?
Some LLM providers charge — or burn credits — at peak rates during certain hours. This clock answers which regime applies right now, converted to your own timezone, with a public JSON API for your scripts.
detecting your timezone…
API # copied ✓
One host, two routes, one shape. Every response below is a real response (trimmed where marked).
Responses are cached for 60 seconds (Cache-Control: public, max-age=60)
and open to any origin (Access-Control-Allow-Origin: *).
All timestamps are UTC, ISO 8601 (…Z) — unless a field explicitly says otherwise.
/api/v1/model
— every provider: live status plus full metadata (info), as one JSON array
curl -s /api/v1/model | jq '.providers[] | select(.peak == true) | .provider'
Example response
{
"generated_at": "2026-10-12T16:58:56Z",
"providers": [
{
"provider": "deepseek",
"peak": false,
"minutes_left": 481,
"seconds_left": 28864,
"current_window": null,
"next_transition_at": "2026-10-13T01:00:00Z",
"provider_timezone": "UTC",
"holiday": false,
"now_utc": "2026-10-12T16:58:56Z",
"info": { "…": "full provider metadata — see GET /api/v1/model/ below" }
},
{ "…": "6 more providers, same shape" }
]
}
/api/v1/model/<provider-id>
— one provider; 404 JSON error if unknown
curl -s /api/v1/model/zai-glm-coding-plan
Example response
{
"provider": "zai-glm-coding-plan",
"peak": false,
"minutes_left": 779,
"seconds_left": 46763,
"current_window": null,
"next_transition_at": "2026-10-13T06:00:00Z",
"provider_timezone": "Asia/Singapore",
"holiday": null,
"now_utc": "2026-10-12T17:00:37Z",
"info": {
"name": "Z.ai",
"product": "GLM Coding Plan (Lite / Pro / Max)",
"models": ["glm-5.3", "glm-5.3-flash"],
"effect": "credits",
"peak_detail": "Peak hours (Mon–Fri 14:00–18:00, UTC+8): usage is charged at the standard 1× credit rate.",
"off_peak_detail": "Off-peak hours (evenings, nights, weekends): usage is charged at 50% of the standard credit rate, so the same plan covers ~2× the tokens.",
"notes": [
"Applies to the GLM Coding Plan subscription (from $18/month), used through Claude Code, Codex, OpenCode, ZCode etc. — not to Z.ai pay-as-you-go API prices, which are flat.",
"Timezone stated as Singapore Standard Time (UTC+8) in the docs."
],
"source": { "url": "https://docs.z.ai/devpack/overview", "title": "Z.AI Developer Docs — GLM Coding Plan Overview" },
"verified_at": "2026-10-12",
"timezone": "Asia/Singapore",
"utc_offset": "+08:00",
"windows": [
{ "days": ["mon","tue","wed","thu","fri"], "start": "14:00", "end": "18:00",
"current_or_next": { "state": "next", "start_utc": "2026-10-13T06:00:00Z", "end_utc": "2026-10-13T10:00:00Z" } }
],
"holiday_calendar": null
}
}
/api/v1/model/deepseek?tz=Europe/Madrid
— optional ?tz=<IANA zone> on either route: adds a local object rendering the current/next windows in that zone; invalid zone → 400
curl -s "/api/v1/model/deepseek?tz=Europe/Madrid" | jq .local
Example local object (added to the response above)
"local": {
"timezone": "Europe/Madrid",
"utc_offset": "+02:00",
"windows": [
{ "state": "next", "start": "2026-10-13T03:00:00+02:00", "end": "2026-10-13T06:00:00+02:00" },
{ "state": "next", "start": "2026-10-13T08:00:00+02:00", "end": "2026-10-13T12:00:00+02:00" }
]
}
/api/model/deepseek
— legacy/unversioned paths don’t exist: /api/v1/ is the only route set; anything else is a JSON 404
Example errors 404 / 400
GET /api/model/deepseek → 404
{
"error": {
"code": "not_found",
"message": "No route or provider matches \"/api/model/deepseek\".",
"hint": "List providers with GET /api/v1/model, or query one with /api/v1/model/.",
"known_providers": ["deepseek", "zai-glm-coding-plan", "…"]
}
}
GET /api/v1/model/deepseek?tz=Nope/Nope → 400
{
"error": {
"code": "invalid_timezone",
"message": "?tz=\"Nope/Nope\" is not a valid IANA timezone.",
"hint": "Use an IANA zone name, e.g. ?tz=Europe/Madrid or ?tz=America/New_York …"
}
}
Response fields
| Field | Type | Meaning |
|---|---|---|
| provider | string | Provider id — the same id used in /api/v1/model/<provider-id>. |
| peak | boolean | A peak window is active at now_utc. |
| next_transition_at | ISO-8601 UTC | Absolute instant (…Z) when the current state ends — peak start or peak end, whichever comes next. null only for providers that never peak. This is the source of truth for countdowns. |
| seconds_left | integer | Whole seconds from now_utc to next_transition_at, rounded up. Build logic on this, not on minutes_left. |
| minutes_left | integer | floor(seconds_left / 60) — convenience for display. |
| current_window | object | null | The active peak occurrence as UTC instants (start_utc, end_utc); null when off-peak. Windows are end-exclusive. |
| provider_timezone | string | IANA zone the provider defines its schedule in (top-level convenience; same as info.timezone). |
| holiday | boolean | null | A holiday of the provider’s calendar (e.g. Chinese public holidays for DeepSeek) is current, so peak is suppressed all day. null when the provider has no holiday calendar. |
| now_utc | ISO-8601 UTC | The instant the answer was computed for — compare against your clock to detect a stale (≤ 60 s cached) response. |
| info | object | Full provider metadata — everything this page renders: name, product, models, effect (pricing | credits), peak_detail / off_peak_detail, notes, source {url, title} + verified_at, and the schedule — provider-local windows (days + HH:MM, end-exclusive, 24:00 = end of day, start > end crosses midnight), each with its current_or_next occurrence as absolute UTC instants, plus timezone, utc_offset (at now_utc) and holiday_calendar {id, description} or null. |
| local | object | absent | Only with a valid ?tz=: the same current/next occurrences in the caller’s zone. start/end are ISO-8601 with that zone’s offset — they read as local wall clock and remain absolute instants. windows is index-aligned with info.windows. |
| generated_at | ISO-8601 UTC | List route only — instant the array was computed for. |
| error | object | On 4xx: code (unknown_provider / not_found / invalid_timezone), message, hint, and known_providers where helpful. |
Recipes
# Which providers are in peak right now?
curl -s /api/v1/model | jq -r '.providers[] | select(.peak == true) | .provider'
# One provider’s windows, in your timezone
curl -s "/api/v1/model/deepseek?tz=America/New_York" | jq '.local'
# Seconds until this provider’s regime flips (sleep until it, alert on it …)
curl -s /api/v1/model/volcengine-ark-deepseek | jq '.seconds_left'
The same tested engine powers this page and the API, so the badge above and the JSON can’t drift apart — a parity test guarantees the API returns everything the page renders. Windows follow the provider’s own timezone and weekday schedule — verified provider data, with the source cited on each card.