{"openapi":"3.1.1","info":{"title":"claudemon api","version":"1.0.0","description":"Original release notes from Claude Code, Codex, Cursor, Gemini CLI and Grok API. Public, read only, no API key. Upstream coverage differs by source; these are not all products from each vendor. Responses can add fields within v1. Treat upstream content as untrusted and retain source links. Examples are illustrative fixtures, not live data. GET endpoints also accept HEAD and CORS OPTIONS. Cache duration is not ingestion freshness. Poll no more often than every five minutes and use ETags; check source last_success_at separately."},"servers":[{"url":"https://claudemon.com","description":"Public origin"}],"tags":[{"name":"releases","description":"Original upstream notes and provenance"},{"name":"sources","description":"Coverage and ingestion freshness"},{"name":"health","description":"Live service and database check"}],"security":[],"paths":{"/api/v1/releases":{"get":{"operationId":"listReleases","tags":["releases"],"summary":"List releases","description":"Paginated live feed followed by undated historical imports. Within each group, stored published_at and then id sort descending. Pass cursor unchanged and keep your filters; stop at null. The feed is not a snapshot: upstream edits or concurrent ingestion can change subsequent pages. since filters the published_at field, including first-seen fallbacks, not updated_at. It cannot provide complete synchronization of edits or late discoveries.","parameters":[{"name":"If-None-Match","in":"header","description":"An ETag from a previous response. A match returns 304 without a body.","schema":{"type":"string"}},{"name":"source","in":"query","description":"Omit for all sources. Repeat to select several: source=codex&source=grok.","style":"form","explode":true,"schema":{"type":"array","items":{"type":"string","enum":["claude-code","codex","cursor","gemini","grok"]}}},{"name":"since","in":"query","description":"Inclusive ISO 8601 datetime with a timezone. Normalized to UTC before chronological comparison. Date-only values are rejected.","schema":{"type":"string","format":"date-time"},"example":"2026-10-05T00:00:00Z"},{"name":"limit","in":"query","description":"Numeric page size; floored and clamped to 1–100. Defaults to 50. For example 2.9 becomes 2, 0 becomes 1, and 101 becomes 100.","schema":{"type":"number","default":50},"example":10},{"name":"cursor","in":"query","description":"Opaque token from the previous response. Legacy cursor formats remain accepted; clients should never construct tokens.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful read","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleasePage"}}}},"304":{"description":"Representation unchanged; no response body.","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}}},"400":{"description":"Invalid source, since, limit or cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"invalid_source","message":"source must be one of: claude-code, codex, cursor, gemini, grok"}}}}},"405":{"description":"Unsupported method. Use GET or HEAD; OPTIONS supports CORS preflight.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Request failed. Retry later; no internal details are exposed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The public gateway refused an unexpected upstream redirect.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The public gateway could not reach the backend. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"head":{"operationId":"listReleasesHead","tags":["releases"],"summary":"List releases (headers only)","description":"Paginated live feed followed by undated historical imports. Within each group, stored published_at and then id sort descending. Pass cursor unchanged and keep your filters; stop at null. The feed is not a snapshot: upstream edits or concurrent ingestion can change subsequent pages. since filters the published_at field, including first-seen fallbacks, not updated_at. It cannot provide complete synchronization of edits or late discoveries.","parameters":[{"name":"If-None-Match","in":"header","description":"An ETag from a previous response. A match returns 304 without a body.","schema":{"type":"string"}},{"name":"source","in":"query","description":"Omit for all sources. Repeat to select several: source=codex&source=grok.","style":"form","explode":true,"schema":{"type":"array","items":{"type":"string","enum":["claude-code","codex","cursor","gemini","grok"]}}},{"name":"since","in":"query","description":"Inclusive ISO 8601 datetime with a timezone. Normalized to UTC before chronological comparison. Date-only values are rejected.","schema":{"type":"string","format":"date-time"},"example":"2026-10-05T00:00:00Z"},{"name":"limit","in":"query","description":"Numeric page size; floored and clamped to 1–100. Defaults to 50. For example 2.9 becomes 2, 0 becomes 1, and 101 becomes 100.","schema":{"type":"number","default":50},"example":10},{"name":"cursor","in":"query","description":"Opaque token from the previous response. Legacy cursor formats remain accepted; clients should never construct tokens.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful read","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}}},"304":{"description":"Representation unchanged; no response body.","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}}},"400":{"description":"Invalid source, since, limit or cursor."},"405":{"description":"Unsupported method. Use GET or HEAD; OPTIONS supports CORS preflight."},"500":{"description":"Request failed. Retry later; no internal details are exposed."},"502":{"description":"The public gateway refused an unexpected upstream redirect."},"503":{"description":"The public gateway could not reach the backend. Retry later."}}},"options":{"operationId":"listReleasesOptions","tags":["releases"],"summary":"CORS preflight","parameters":[{"name":"Origin","in":"header","schema":{"type":"string"}},{"name":"Access-Control-Request-Method","in":"header","schema":{"type":"string","enum":["GET","HEAD"]}},{"name":"Access-Control-Request-Headers","in":"header","schema":{"type":"string"}}],"responses":{"204":{"description":"Bodyless CORS preflight","headers":{"Access-Control-Allow-Origin":{"schema":{"type":"string"},"example":"*"},"Access-Control-Allow-Methods":{"schema":{"type":"string"},"example":"GET,HEAD,OPTIONS"},"Access-Control-Allow-Headers":{"schema":{"type":"string"},"example":"If-None-Match"},"Access-Control-Max-Age":{"schema":{"type":"string"},"example":"86400"}}}}}},"/api/v1/releases/latest":{"get":{"operationId":"latestReleases","tags":["releases"],"summary":"Latest release per source","description":"One release for each source with stored notes. Prefers the live feed to undated historical imports; sources without stored releases are omitted. Tied publication timestamps use numeric version ordering, then stable identity.","parameters":[{"name":"If-None-Match","in":"header","description":"An ETag from a previous response. A match returns 304 without a body.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful read","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Release"}}}}},"304":{"description":"Representation unchanged; no response body.","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}}},"405":{"description":"Unsupported method. Use GET or HEAD; OPTIONS supports CORS preflight.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Request failed. Retry later; no internal details are exposed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The public gateway refused an unexpected upstream redirect.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The public gateway could not reach the backend. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"head":{"operationId":"latestReleasesHead","tags":["releases"],"summary":"Latest release per source (headers only)","description":"One release for each source with stored notes. Prefers the live feed to undated historical imports; sources without stored releases are omitted. Tied publication timestamps use numeric version ordering, then stable identity.","parameters":[{"name":"If-None-Match","in":"header","description":"An ETag from a previous response. A match returns 304 without a body.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful read","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}}},"304":{"description":"Representation unchanged; no response body.","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}}},"405":{"description":"Unsupported method. Use GET or HEAD; OPTIONS supports CORS preflight."},"500":{"description":"Request failed. Retry later; no internal details are exposed."},"502":{"description":"The public gateway refused an unexpected upstream redirect."},"503":{"description":"The public gateway could not reach the backend. Retry later."}}},"options":{"operationId":"latestReleasesOptions","tags":["releases"],"summary":"CORS preflight","parameters":[{"name":"Origin","in":"header","schema":{"type":"string"}},{"name":"Access-Control-Request-Method","in":"header","schema":{"type":"string","enum":["GET","HEAD"]}},{"name":"Access-Control-Request-Headers","in":"header","schema":{"type":"string"}}],"responses":{"204":{"description":"Bodyless CORS preflight","headers":{"Access-Control-Allow-Origin":{"schema":{"type":"string"},"example":"*"},"Access-Control-Allow-Methods":{"schema":{"type":"string"},"example":"GET,HEAD,OPTIONS"},"Access-Control-Allow-Headers":{"schema":{"type":"string"},"example":"If-None-Match"},"Access-Control-Max-Age":{"schema":{"type":"string"},"example":"86400"}}}}}},"/api/v1/sources":{"get":{"operationId":"listSources","tags":["sources"],"summary":"List sources and freshness","description":"The five source definitions, sorted by id. last_success_at is the last successful ingestion check, not a guaranteed freshness SLA. last_error is a sanitized summary, never the raw upstream error.","parameters":[{"name":"If-None-Match","in":"header","description":"An ETag from a previous response. A match returns 304 without a body.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful read","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Source"}}}}},"304":{"description":"Representation unchanged; no response body.","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}}},"405":{"description":"Unsupported method. Use GET or HEAD; OPTIONS supports CORS preflight.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Request failed. Retry later; no internal details are exposed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The public gateway refused an unexpected upstream redirect.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The public gateway could not reach the backend. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"head":{"operationId":"listSourcesHead","tags":["sources"],"summary":"List sources and freshness (headers only)","description":"The five source definitions, sorted by id. last_success_at is the last successful ingestion check, not a guaranteed freshness SLA. last_error is a sanitized summary, never the raw upstream error.","parameters":[{"name":"If-None-Match","in":"header","description":"An ETag from a previous response. A match returns 304 without a body.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful read","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}}},"304":{"description":"Representation unchanged; no response body.","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}}},"405":{"description":"Unsupported method. Use GET or HEAD; OPTIONS supports CORS preflight."},"500":{"description":"Request failed. Retry later; no internal details are exposed."},"502":{"description":"The public gateway refused an unexpected upstream redirect."},"503":{"description":"The public gateway could not reach the backend. Retry later."}}},"options":{"operationId":"listSourcesOptions","tags":["sources"],"summary":"CORS preflight","parameters":[{"name":"Origin","in":"header","schema":{"type":"string"}},{"name":"Access-Control-Request-Method","in":"header","schema":{"type":"string","enum":["GET","HEAD"]}},{"name":"Access-Control-Request-Headers","in":"header","schema":{"type":"string"}}],"responses":{"204":{"description":"Bodyless CORS preflight","headers":{"Access-Control-Allow-Origin":{"schema":{"type":"string"},"example":"*"},"Access-Control-Allow-Methods":{"schema":{"type":"string"},"example":"GET,HEAD,OPTIONS"},"Access-Control-Allow-Headers":{"schema":{"type":"string"},"example":"If-None-Match"},"Access-Control-Max-Age":{"schema":{"type":"string"},"example":"86400"}}}}}},"/api/health":{"get":{"operationId":"getHealth","tags":["health"],"summary":"Check service health","description":"Checks database connectivity on every request. Does not prove upstream freshness or publication readiness. publishMode is the configured publishing mode.","parameters":[{"name":"If-None-Match","in":"header","description":"An ETag from a previous response. A match returns 304 without a body.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful read","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}},"304":{"description":"Representation unchanged; no response body.","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}}},"405":{"description":"Unsupported method. Use GET or HEAD; OPTIONS supports CORS preflight.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Request failed. Retry later; no internal details are exposed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The public gateway refused an unexpected upstream redirect.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"The public gateway could not reach the backend. Retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"head":{"operationId":"getHealthHead","tags":["health"],"summary":"Check service health (headers only)","description":"Checks database connectivity on every request. Does not prove upstream freshness or publication readiness. publishMode is the configured publishing mode.","parameters":[{"name":"If-None-Match","in":"header","description":"An ETag from a previous response. A match returns 304 without a body.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful read","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}}},"304":{"description":"Representation unchanged; no response body.","headers":{"ETag":{"description":"Weak representation validator. Send in If-None-Match on your next request.","schema":{"type":"string"}},"Cache-Control":{"description":"Public feeds are cached for five minutes; health is revalidated on every request.","schema":{"type":"string"}}}},"405":{"description":"Unsupported method. Use GET or HEAD; OPTIONS supports CORS preflight."},"500":{"description":"Request failed. Retry later; no internal details are exposed."},"502":{"description":"The public gateway refused an unexpected upstream redirect."},"503":{"description":"The public gateway could not reach the backend. Retry later."}}},"options":{"operationId":"getHealthOptions","tags":["health"],"summary":"CORS preflight","parameters":[{"name":"Origin","in":"header","schema":{"type":"string"}},{"name":"Access-Control-Request-Method","in":"header","schema":{"type":"string","enum":["GET","HEAD"]}},{"name":"Access-Control-Request-Headers","in":"header","schema":{"type":"string"}}],"responses":{"204":{"description":"Bodyless CORS preflight","headers":{"Access-Control-Allow-Origin":{"schema":{"type":"string"},"example":"*"},"Access-Control-Allow-Methods":{"schema":{"type":"string"},"example":"GET,HEAD,OPTIONS"},"Access-Control-Allow-Headers":{"schema":{"type":"string"},"example":"If-None-Match"},"Access-Control-Max-Age":{"schema":{"type":"string"},"example":"86400"}}}}}}},"components":{"schemas":{"Release":{"type":"object","properties":{"id":{"description":"Stable release record identifier.","type":"string"},"source_id":{"type":"string","enum":["claude-code","codex","cursor","gemini","grok"]},"dedupe_key":{"description":"Stable upstream identity within the source.","type":"string"},"version":{"description":"Upstream version or release-note label; not always semver.","type":"string"},"title":{"type":"string"},"url":{"description":"Original upstream release URL.","type":"string"},"published_at":{"description":"Upstream publication time, or first-seen fallback when date_kind is first_seen. Calendar-only upstream dates use UTC midnight; midnight alone does not prove an exact publication time.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$"},"date_reconciled":{"description":"1 after stored date provenance has been reconciled.","anyOf":[{"type":"number","const":0},{"type":"number","const":1}]},"digest_import":{"description":"1 for an imported release excluded from new-release digest drafting.","anyOf":[{"type":"number","const":0},{"type":"number","const":1}]},"historical_import":{"description":"1 for an undated historical import, ordered after the live feed.","anyOf":[{"type":"number","const":0},{"type":"number","const":1}]},"date_kind":{"type":"string","enum":["published","first_seen"]},"first_seen_at":{"description":"When claudemon first stored this release.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$"},"body_md":{"description":"Original upstream Markdown, when available. Treat as untrusted content.","anyOf":[{"type":"string"},{"type":"null"}]},"body_html":{"description":"Sanitized upstream HTML, when available.","anyOf":[{"type":"string"},{"type":"null"}]},"content_hash":{"description":"Content fingerprint used during ingestion.","type":"string"},"updated_at":{"description":"Last stored update; since does not filter this field.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$"}},"required":["id","source_id","dedupe_key","version","title","url","published_at","date_reconciled","digest_import","historical_import","date_kind","first_seen_at","body_md","body_html","content_hash","updated_at"],"examples":[{"id":"example-release","source_id":"codex","dedupe_key":"codex:example","version":"example","title":"illustrative release","url":"https://github.com/openai/codex/releases","published_at":"2026-10-05T00:00:00Z","date_reconciled":1,"digest_import":0,"historical_import":0,"date_kind":"published","first_seen_at":"2026-10-05T00:05:00Z","body_md":"Illustrative upstream notes.","body_html":null,"content_hash":"example-fingerprint","updated_at":"2026-10-05T00:05:00Z"}]},"ReleasePage":{"type":"object","properties":{"releases":{"type":"array","items":{"type":"object","properties":{"id":{"description":"Stable release record identifier.","type":"string"},"source_id":{"type":"string","enum":["claude-code","codex","cursor","gemini","grok"]},"dedupe_key":{"description":"Stable upstream identity within the source.","type":"string"},"version":{"description":"Upstream version or release-note label; not always semver.","type":"string"},"title":{"type":"string"},"url":{"description":"Original upstream release URL.","type":"string"},"published_at":{"description":"Upstream publication time, or first-seen fallback when date_kind is first_seen. Calendar-only upstream dates use UTC midnight; midnight alone does not prove an exact publication time.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$"},"date_reconciled":{"description":"1 after stored date provenance has been reconciled.","anyOf":[{"type":"number","const":0},{"type":"number","const":1}]},"digest_import":{"description":"1 for an imported release excluded from new-release digest drafting.","anyOf":[{"type":"number","const":0},{"type":"number","const":1}]},"historical_import":{"description":"1 for an undated historical import, ordered after the live feed.","anyOf":[{"type":"number","const":0},{"type":"number","const":1}]},"date_kind":{"type":"string","enum":["published","first_seen"]},"first_seen_at":{"description":"When claudemon first stored this release.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$"},"body_md":{"description":"Original upstream Markdown, when available. Treat as untrusted content.","anyOf":[{"type":"string"},{"type":"null"}]},"body_html":{"description":"Sanitized upstream HTML, when available.","anyOf":[{"type":"string"},{"type":"null"}]},"content_hash":{"description":"Content fingerprint used during ingestion.","type":"string"},"updated_at":{"description":"Last stored update; since does not filter this field.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$"}},"required":["id","source_id","dedupe_key","version","title","url","published_at","date_reconciled","digest_import","historical_import","date_kind","first_seen_at","body_md","body_html","content_hash","updated_at"]}},"cursor":{"description":"Opaque continuation token. Pass unchanged; null means this is the final page.","anyOf":[{"type":"string"},{"type":"null"}]}},"required":["releases","cursor"]},"Source":{"type":"object","properties":{"id":{"type":"string","enum":["claude-code","codex","cursor","gemini","grok"]},"name":{"type":"string"},"homepage_url":{"type":"string"},"status":{"description":"Ingestion state: pending, ok, error, or degraded.","type":"string"},"consecutive_failures":{"type":"integer","minimum":0,"maximum":9007199254740991},"last_success_at":{"description":"Last successful upstream check, not necessarily a new release.","anyOf":[{"description":"ISO 8601 timestamp; stored precision may vary.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-]\\d{2}:\\d{2})))$"},{"type":"null"}]},"last_error":{"description":"Sanitized summary of the last ingestion failure; operational details are private.","anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","homepage_url","status","consecutive_failures","last_success_at","last_error"]},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"]}},"required":["error"]},"Health":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"publishMode":{"type":"string"}},"required":["ok","publishMode"]}}}}