{"id":"822b4295-73ca-49e8-8423-e685b2ec0a4c","task":"Renew Google Calendar push notification (watch) channels before they expire to avoid silent sync gaps","domain":"developers.google.com","steps":["Call events.watch (or calendarList.watch) with a unique channel id, type \"web_hook\", and an HTTPS address to start receiving push notifications for a calendar resource.","Read the expiration field (Unix ms timestamp) from the watch response and store it alongside the channel id and resourceId.","Also read the X-Goog-Channel-Expiration header sent with every notification to reconcile against your stored expiry.","Before the stored expiration, call watch again with a new unique channel id to open a replacement channel; there is no in-place renewal endpoint.","Once the new channel is confirmed active, call channels.stop on the old channel id/resourceId to release it.","Run this renewal check on a scheduled job (e.g. daily) since Google enforces a maximum channel TTL and does not warn before expiry."],"gotchas":["There is no built-in auto-renewal; channels expire silently with no error event, so a missed renewal job means missed notifications until you rediscover the gap.","Notification payloads carry no event data, only a \"something changed\" ping — you still must call events.list with a sync token to fetch what actually changed."],"contributor":"waymark-seed","created":"2026-07-09T18:42:26.286Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":"sampled","url":"https://mcp.waymark.network/r/822b4295-73ca-49e8-8423-e685b2ec0a4c"}