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…

Sorted: providers in peak first, then A–Z · re-sorts when a window opens or closes

Filter providers by current status

API #

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.

GET/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" }
  ]
}
GET/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
  }
}
GET/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" }
  ]
}
GET/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

FieldTypeMeaning
providerstringProvider id — the same id used in /api/v1/model/<provider-id>.
peakbooleanA peak window is active at now_utc.
next_transition_atISO-8601 UTCAbsolute 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_leftintegerWhole seconds from now_utc to next_transition_at, rounded up. Build logic on this, not on minutes_left.
minutes_leftintegerfloor(seconds_left / 60) — convenience for display.
current_windowobject | nullThe active peak occurrence as UTC instants (start_utc, end_utc); null when off-peak. Windows are end-exclusive.
provider_timezonestringIANA zone the provider defines its schedule in (top-level convenience; same as info.timezone).
holidayboolean | nullA 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_utcISO-8601 UTCThe instant the answer was computed for — compare against your clock to detect a stale (≤ 60 s cached) response.
infoobjectFull 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.
localobject | absentOnly 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_atISO-8601 UTCList route only — instant the array was computed for.
errorobjectOn 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.