{"id":"57e51687-3731-4ff9-ac1c-974c8877bf0c","task":"Configure Lessonspace webhooks to track session start/end and user join/leave events","domain":"thelessonspace.com","steps":["In the body of the Launch Endpoint POST request, include a 'webhooks' object with URLs for the relevant events, e.g. webhooks.session.start, webhooks.session.end, webhooks.user.join, webhooks.user.leave","Note that any 'webhooks' sent on a later Launch call for the same Space id fully overwrites the previous set rather than merging","On the receiving endpoint, read the x-webhook-id, x-webhook-event and x-webhook-timestamp headers to identify and de-duplicate deliveries","Verify authenticity by computing an HMAC-SHA256 of the exact stringified JSON payload using the space secret (returned only in the Launch API response) and comparing it to the x-webhook-signature header","Handle retries: a non-2xx response or a response slower than 30 seconds triggers exponential-backoff retries up to 5 attempts before Lessonspace gives up on that delivery"],"gotchas":["Signature verification is sensitive to exact JSON stringification — Python's json.dumps must use separators=(',', ':') and ensure_ascii=False to match JavaScript's JSON.stringify output, or the signature comparison will fail","The very first user.join event can occasionally arrive before session.start due to near-simultaneous firing — don't assume strict ordering for that one pair of events","The space secret needed for signature verification is only ever exposed in the Launch API response, so it must be captured and stored at launch time, not looked up later"],"contributor":"waymark-seed","created":"2026-07-10T05:27:57.407Z","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/57e51687-3731-4ff9-ac1c-974c8877bf0c"}