{"openapi":"3.1.0","info":{"title":"PeppolStatus API","version":"1.0.0","description":"Public, read-only REST API for the PeppolStatus.com open-data monitoring of the Peppol e-invoicing network: host liveness, incidents, participants, providers, seats, change events, anomalies, SML/SMK zone status and network rollups.\n\nAll responses are JSON. Errors use RFC 9457 `application/problem+json`. List endpoints are cursor-paginated (`{ items, next_cursor }`). The API is rate limited to 60 requests / 60s per client identity; `RateLimit-*` headers are returned on every response. `Authorization: Bearer` is accepted and ignored today.\n\nVersioning: the API is versioned in the URL path (`/v1`). Backwards-incompatible changes only ship under a new version prefix; existing versions keep their contract. Any endpoint scheduled for removal will be announced in this documentation and will send `Deprecation` and `Sunset` headers before it goes away.","contact":{"name":"PeppolStatus","url":"https://peppolstatus.com"},"license":{"name":"Open data"}},"servers":[{"url":"https://api.peppolstatus.com","description":"Production"}],"tags":[{"name":"Meta","description":"Service health and liveness."},{"name":"Hosts","description":"Monitored SMP/AP hosts: current state, uptime and latency."},{"name":"Incidents","description":"Host incident lifecycle (open/closed) and timelines."},{"name":"Participants","description":"Peppol participants: state, history and change events."},{"name":"Providers","description":"OpenPeppol member registry and curated provider detail."},{"name":"Seats","description":"Certificate seats — the machine identity of a provider."},{"name":"Access Points","description":"AP directory: providers in their serving role, with rosters."},{"name":"Events","description":"Global typed change-event feed with embedded anomalies."},{"name":"Anomalies","description":"Deterministic detector anomalies (notice/warning)."},{"name":"SML","description":"SML/SMK zone canary status and cutover state."},{"name":"Network","description":"At-a-glance network-wide rollup."}],"paths":{"/health":{"get":{"tags":["Meta"],"summary":"Liveness check","operationId":"getHealth","description":"Returns a static ok marker. Does not touch the database.","responses":{"200":{"description":"Service is up.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}},"/health/db":{"get":{"tags":["Meta"],"summary":"Database reachability check","operationId":"getDbHealth","description":"Proves the Worker can reach Postgres through Hyperdrive.","responses":{"200":{"description":"Database reachable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthDb"}}}}}}},"/v1/hosts":{"get":{"tags":["Hosts"],"summary":"List monitored hosts","operationId":"listHosts","description":"Every monitored host with its current verdict, latest hourly all-locations latency and 24h uptime, worst-first, plus a network-wide rollup.","responses":{"200":{"description":"The monitored fleet.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostsResponse"}}}}}}},"/v1/hosts/{hostname}":{"get":{"tags":["Hosts"],"summary":"Get a host's current state","operationId":"getHost","description":"Current role, verdict, network attribution (IPs/PTR), TLS certificate and operating provider for a host. `?at=` returns point-in-time state.","parameters":[{"name":"hostname","in":"path","required":true,"schema":{"type":"string"},"description":"The host's fully-qualified hostname."},{"name":"at","in":"query","required":false,"description":"Point-in-time ISO 8601 instant; omitted returns current state.","schema":{"type":"string","format":"date-time"}}],"responses":{"200":{"description":"The host's state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostView"}}}},"400":{"description":"`at` is not a valid ISO 8601 timestamp.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No such host is known.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/hosts/{hostname}/incidents":{"get":{"tags":["Incidents"],"summary":"List a host's incidents","operationId":"listHostIncidents","description":"Incidents for one host, newest-first, cursor-paginated.","parameters":[{"name":"hostname","in":"path","required":true,"schema":{"type":"string"},"description":"The host's fully-qualified hostname."},{"name":"status","in":"query","required":false,"description":"Filter by incident lifecycle state.","schema":{"type":"string","enum":["open","closed"]}},{"name":"since","in":"query","required":false,"description":"Only include items at or after this ISO 8601 instant.","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","required":false,"description":"Page size, clamped to [1, 200]. Defaults to 50.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor returned as `next_cursor` by the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of incidents.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentPage"}}}},"400":{"description":"An invalid `status`, `since`, `limit` or `cursor`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/hosts/{hostname}/uptime":{"get":{"tags":["Hosts"],"summary":"Get a host's uptime aggregates","operationId":"listHostUptime","description":"The aggregate ladder for a host at a chosen resolution, per-location plus the `__all__` rollup, optionally windowed by `[from, to)`, cursor-paginated.","parameters":[{"name":"hostname","in":"path","required":true,"schema":{"type":"string"},"description":"The host's fully-qualified hostname."},{"name":"resolution","in":"query","required":false,"description":"Aggregate tier. Defaults to hourly.","schema":{"type":"string","enum":["hourly","daily","monthly"],"default":"hourly"}},{"name":"from","in":"query","required":false,"description":"Inclusive lower bound (ISO 8601). Must not be after `to`.","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"description":"Exclusive upper bound (ISO 8601).","schema":{"type":"string","format":"date-time"}},{"name":"location","in":"query","required":false,"description":"Restrict to one probe location, or `__all__` for the rollup.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, clamped to [1, 200]. Defaults to 50.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor returned as `next_cursor` by the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of uptime buckets.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UptimePage"}}}},"400":{"description":"An invalid `resolution`, range, `limit` or `cursor`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/incidents":{"get":{"tags":["Incidents"],"summary":"List incidents","operationId":"listIncidents","description":"The global incident feed, newest-first, cursor-paginated.","parameters":[{"name":"host","in":"query","required":false,"description":"Filter to one host's incidents.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Filter by incident lifecycle state.","schema":{"type":"string","enum":["open","closed"]}},{"name":"since","in":"query","required":false,"description":"Only include items at or after this ISO 8601 instant.","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","required":false,"description":"Page size, clamped to [1, 200]. Defaults to 50.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor returned as `next_cursor` by the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of incidents.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentPage"}}}},"400":{"description":"An invalid `status`, `since`, `limit` or `cursor`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/participants/{id}":{"get":{"tags":["Participants"],"summary":"Get a participant's current state","operationId":"getParticipant","description":"Directory presence, SML registration + current SMP, business card, endpoints and serving seats for a Peppol participant. Discovered participants carry no card.","parameters":[{"name":"id","in":"path","required":true,"description":"Canonical `scheme::value` Peppol identifier (e.g. `0208::0762747721`).","schema":{"type":"string"}}],"responses":{"200":{"description":"The participant's state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParticipantView"}}}},"400":{"description":"`id` is not a `scheme::value` Peppol identifier.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No such participant is known.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/participants/{id}/events":{"get":{"tags":["Participants"],"summary":"List a participant's change events","operationId":"listParticipantEvents","description":"The participant's typed change events, newest-first, cursor-paginated.","parameters":[{"name":"id","in":"path","required":true,"description":"Canonical `scheme::value` Peppol identifier.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, clamped to [1, 200]. Defaults to 50.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor returned as `next_cursor` by the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of change events.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParticipantEventPage"}}}},"400":{"description":"An invalid `id`, `limit` or `cursor`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No such participant is known.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/participants/{id}/history":{"get":{"tags":["Participants"],"summary":"List a participant's temporal history","operationId":"listParticipantHistory","description":"The participant's temporal rows across the directory/card/registration/SMP fact families, newest-first, cursor-paginated.","parameters":[{"name":"id","in":"path","required":true,"description":"Canonical `scheme::value` Peppol identifier.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, clamped to [1, 200]. Defaults to 50.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor returned as `next_cursor` by the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of history rows.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParticipantHistoryPage"}}}},"400":{"description":"An invalid `id`, `limit` or `cursor`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"No such participant is known.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/network":{"get":{"tags":["Network"],"summary":"Get the network summary","operationId":"getNetworkSummary","description":"Current host verdict counts, open incidents and anomalies in the last 24h.","responses":{"200":{"description":"The network-wide rollup.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkSummary"}}}}}}},"/v1/providers":{"get":{"tags":["Providers"],"summary":"List providers","operationId":"listProviders","description":"The OpenPeppol member registry with role flags, country, mapped hostnames and per-provider participant counts (market share), busiest first. Not paginated (the envelope's `next_cursor` is always null).","responses":{"200":{"description":"The provider registry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderPage"}}}}}}},"/v1/providers/{slug}":{"get":{"tags":["Providers"],"summary":"Get a curated provider","operationId":"getProvider","description":"A curated provider navigable to its seats and each seat's observed hosts.","parameters":[{"name":"slug","in":"path","required":true,"description":"The curated provider slug.","schema":{"type":"string"}}],"responses":{"200":{"description":"The provider detail.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderDetailView"}}}},"404":{"description":"No such provider is known.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/aps":{"get":{"tags":["Access Points"],"summary":"List access points","operationId":"listAccessPoints","description":"The Access Point directory: every Provider in its serving role, with its member seats and roster size (current participant count), busiest first. A Provider is resolved from each seat with the precedence curated mapping (verified) → exact signing-cert `O=` string (unverified) → bare SeatID. Not paginated (the envelope's `next_cursor` is always null).","responses":{"200":{"description":"The access point directory.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApPage"}}}}}}},"/v1/aps/{key}":{"get":{"tags":["Access Points"],"summary":"Get an access point","operationId":"getAccessPoint","description":"One Provider's detail: display name, verified flag, member seats (each with its embedded provider or unverified cert-CN), roster size, and the country + document-scheme composition of its roster. A request for a STALE key (a seat since curated, so its old unverified key left the directory) resolves to the current Provider; the returned `key` is always the canonical current one.","parameters":[{"name":"key","in":"path","required":true,"description":"The provider key (e.g. `c-tickstar`, `o-teamleader-nv-1f3a2b9c`).","schema":{"type":"string"}}],"responses":{"200":{"description":"The access point detail.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApProviderDetail"}}}},"404":{"description":"No such access point is known.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/aps/{key}/churn":{"get":{"tags":["Access Points"],"summary":"Get an access point's churn","operationId":"getAccessPointChurn","description":"An Access Point's joiner / mover / leaver activity over a period: a daily category series with derived net growth, period totals, and the 'won from / lost to' counterpart breakdown. Joiners are first-ever serving seats (from 2026-08-01 onward, first-full-deep-sweep completion); movers change Provider (both sides resolved to the current identity); leavers deregister while served. Defaults to the trailing 30 days.","parameters":[{"name":"key","in":"path","required":true,"description":"The Provider key (e.g. `c-tickstar`).","schema":{"type":"string"}},{"name":"from","in":"query","required":false,"description":"Inclusive period start, `YYYY-MM-DD` UTC. Defaults to 29 days before `to`.","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":false,"description":"Inclusive period end, `YYYY-MM-DD` UTC. Defaults to today.","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"The access point's churn over the period.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApChurnView"}}}},"404":{"description":"No such access point has churn.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/aps/{key}/churn/participants":{"get":{"tags":["Access Points"],"summary":"List participants behind a churn category","operationId":"listAccessPointChurnParticipants","description":"The drill-down: the participant IDs behind one churn category count for this Provider over the period. Bounded to 500 rows (never paginated; next_cursor null).","parameters":[{"name":"key","in":"path","required":true,"description":"The Provider key.","schema":{"type":"string"}},{"name":"category","in":"query","required":true,"description":"The churn category to expand.","schema":{"type":"string","enum":["joiner","mover_in","mover_out","leaver"]}},{"name":"from","in":"query","required":false,"description":"Inclusive period start, `YYYY-MM-DD` UTC.","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":false,"description":"Inclusive period end, `YYYY-MM-DD` UTC.","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"The participants in that category.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChurnParticipantPage"}}}},"400":{"description":"The `category` query param is missing or invalid.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/seats/{seatId}":{"get":{"tags":["Seats"],"summary":"Get a seat","operationId":"getSeat","description":"A Peppol certificate seat: its embedded provider (verified mapping or unverified cert-CN fallback) and the hosts it was observed operating.","parameters":[{"name":"seatId","in":"path","required":true,"description":"The seat identifier (e.g. `POP000748`).","schema":{"type":"string"}}],"responses":{"200":{"description":"The seat.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeatView"}}}},"404":{"description":"No such seat is known.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/events":{"get":{"tags":["Events"],"summary":"List global change events","operationId":"listEvents","description":"Every typed change event, newest-first, cursor-paginated. Any anomaly an event triggered is embedded on it. `cursor` walks older events; `prev_cursor` walks the newer edge (for live polling). The first page carries a `meta` block with exact type facets + filter count and an auto-bucketed timeline chart.","parameters":[{"name":"type","in":"query","required":false,"description":"Comma-array of change-event types (a single value is valid).","schema":{"type":"string","enum":["participant_registered","participant_deregistered","participant_smp_changed","endpoint_changed","doctype_support_changed","ap_seat_changed","host_cert_rotated","hosting_changed","directory_card_changed"]}},{"name":"host","in":"query","required":false,"description":"Filter to events for one host.","schema":{"type":"string"}},{"name":"seat","in":"query","required":false,"description":"Filter to events referencing one seat.","schema":{"type":"string"}},{"name":"participant","in":"query","required":false,"description":"Filter to one participant (`scheme::value`).","schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Only include items at or after this ISO 8601 instant.","schema":{"type":"string","format":"date-time"}},{"name":"until","in":"query","required":false,"description":"Only include events at or before this ISO 8601 instant.","schema":{"type":"string","format":"date-time"}},{"name":"prev_cursor","in":"query","required":false,"description":"Opaque newer-direction cursor (from a page's `prev_cursor`): returns events newer than it, newest-first. Mutually exclusive with `cursor`.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, clamped to [1, 200]. Defaults to 50.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor returned as `next_cursor` by the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of change events.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventFeedPage"}}}},"400":{"description":"An invalid `type`, `participant`, `since`, `until`, `limit`, `cursor` or `prev_cursor`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/participants":{"get":{"tags":["Participants"],"summary":"List participants","operationId":"listParticipants","description":"The participant set, keyset-paginated. Default sort is first-seen newest-first. Comma-array filters (`country`, `scheme`, `smp`, `ap`, `provenance`), a `registered` boolean, and a smart `q` (a `scheme::value`/bare value hits the ID index; free text runs a trigram name-contains). First-page `meta` carries estimated totals and rollup facets; `meta.filter_count` is a bounded exact count that degrades to null (never an error) if it exceeds the query timeout. Discovered participants carry no name/card fields (privacy).","parameters":[{"name":"sort","in":"query","required":false,"description":"Sort + keyset key.","schema":{"type":"string","enum":["first_seen.desc","first_seen.asc","name.asc","name.desc","country.asc","country.desc"],"default":"first_seen.desc"}},{"name":"country","in":"query","required":false,"description":"Comma-array of ISO country codes (`BE,NL`).","schema":{"type":"string"}},{"name":"scheme","in":"query","required":false,"description":"Comma-array of Peppol identifier schemes.","schema":{"type":"string"}},{"name":"smp","in":"query","required":false,"description":"Comma-array of current SMP hostnames (`smp1.example,smp2.example`).","schema":{"type":"string"}},{"name":"ap","in":"query","required":false,"description":"Comma-array of serving Access Point SeatIDs (`PBE000123,PNO000456`).","schema":{"type":"string"}},{"name":"registered","in":"query","required":false,"description":"Filter by current SML registration state.","schema":{"type":"boolean"}},{"name":"provenance","in":"query","required":false,"description":"Filter by provenance.","schema":{"type":"string","enum":["directory","discovered"]}},{"name":"q","in":"query","required":false,"description":"Smart search: `scheme::value`/bare value → ID lookup; else name-contains.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Page size, clamped to [1, 200]. Defaults to 50.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor returned as `next_cursor` by the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of participants.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParticipantListPage"}}}},"400":{"description":"An invalid `sort`, `registered`, `provenance`, `limit` or `cursor`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/stats/participants":{"get":{"tags":["Participants"],"summary":"Participant facet stats","operationId":"getParticipantStats","description":"Global participant facet counts (per country/scheme/smp/ap, registered share, provenance split) plus an estimated total, from the hourly rollup. Keyless-cacheable — safe for the marketing site to hit directly.","responses":{"200":{"description":"The participant facet rollup.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParticipantStats"}}}}}}},"/v1/anomalies":{"get":{"tags":["Anomalies"],"summary":"List anomalies","operationId":"listAnomalies","description":"The anomaly feed, newest-first, cursor-paginated.","parameters":[{"name":"detector","in":"query","required":false,"description":"Filter by detector.","schema":{"type":"string","enum":["cert_identity_shift","off_cadence_rotation","endpoint_off_footprint","moved_to_unverified_seat","mass_change_burst"]}},{"name":"grade","in":"query","required":false,"description":"Filter by grade.","schema":{"type":"string","enum":["notice","warning"]}},{"name":"host","in":"query","required":false,"description":"Filter to anomalies targeting one host.","schema":{"type":"string"}},{"name":"seat","in":"query","required":false,"description":"Filter to anomalies targeting one seat.","schema":{"type":"string"}},{"name":"acknowledged","in":"query","required":false,"description":"Filter by acknowledgement state.","schema":{"type":"boolean"}},{"name":"since","in":"query","required":false,"description":"Only include items at or after this ISO 8601 instant.","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","required":false,"description":"Page size, clamped to [1, 200]. Defaults to 50.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor returned as `next_cursor` by the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of anomalies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnomalyPage"}}}},"400":{"description":"An invalid `detector`, `grade`, `acknowledged`, `since`, `limit` or `cursor`.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/anomalies/{id}":{"get":{"tags":["Anomalies"],"summary":"Get an anomaly","operationId":"getAnomaly","description":"One anomaly by its stable content-derived key.","parameters":[{"name":"id","in":"path","required":true,"description":"The stable anomaly key.","schema":{"type":"string"}}],"responses":{"200":{"description":"The anomaly.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnomalyView"}}}},"404":{"description":"No such anomaly is known.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/sml":{"get":{"tags":["SML"],"summary":"Get SML/SMK zone status","operationId":"getSmlStatus","description":"One entry per monitored zone: quorum verdict, per-location canary breakdown, DNAME cutover state, management-host TLS snapshot and zone incidents.","responses":{"200":{"description":"The monitored zones.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmlResponse"}}}}}}}},"components":{"schemas":{"Problem":{"type":"object","description":"RFC 9457 problem detail (`application/problem+json`).","required":["type","title","status"],"properties":{"type":{"type":"string","default":"about:blank"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"instance":{"type":"string"}}},"Health":{"type":"object","required":["status","service"],"properties":{"status":{"type":"string","examples":["ok"]},"service":{"type":"string","examples":["api"]}}},"HealthDb":{"type":"object","required":["status","service","db"],"properties":{"status":{"type":"string","examples":["ok"]},"service":{"type":"string","examples":["api"]},"db":{"type":"boolean","description":"True when `select 1` returned from Postgres."}}},"Verdict":{"type":["string","null"],"enum":["up","degraded","down",null],"description":"Per-location host verdict; null when unknown."},"HostRole":{"type":"string","enum":["SMP","AP"]},"HostLatency":{"type":"object","description":"Latest total-latency percentiles, whole ms.","required":["p50","p95"],"properties":{"p50":{"type":"number"},"p95":{"type":"number"}}},"HostNetwork":{"type":"object","required":["ips","ptr"],"properties":{"ips":{"type":"array","items":{"type":"string"}},"ptr":{"type":["string","null"]}}},"HostCert":{"type":["object","null"],"required":["fingerprint","subject","issuer","not_before","not_after"],"properties":{"fingerprint":{"type":"string"},"subject":{"type":"string"},"issuer":{"type":"string"},"not_before":{"type":"string","format":"date-time"},"not_after":{"type":"string","format":"date-time"}}},"HostProviderInfo":{"type":["object","null"],"required":["key","trade_name","legal_name","country"],"properties":{"key":{"type":"string"},"trade_name":{"type":"string"},"legal_name":{"type":["string","null"]},"country":{"type":["string","null"]}}},"HostView":{"type":"object","description":"A host's current (or point-in-time) state.","required":["hostname","role","verdict","network","cert"],"properties":{"hostname":{"type":"string"},"role":{"type":["string","null"],"enum":["SMP","AP",null]},"verdict":{"$ref":"#/components/schemas/Verdict"},"network":{"oneOf":[{"$ref":"#/components/schemas/HostNetwork"},{"type":"null"}]},"cert":{"$ref":"#/components/schemas/HostCert"},"provider":{"$ref":"#/components/schemas/HostProviderInfo"}}},"HostSummary":{"type":"object","required":["hostname","role","verdict","latency","uptime_24h","last_bucket"],"properties":{"hostname":{"type":"string"},"role":{"type":["string","null"]},"verdict":{"$ref":"#/components/schemas/Verdict"},"latency":{"oneOf":[{"$ref":"#/components/schemas/HostLatency"},{"type":"null"}]},"uptime_24h":{"type":["number","null"],"description":"Mean uptime_pct over the last 24h, percent."},"last_bucket":{"type":["string","null"],"format":"date-time"},"cert":{"$ref":"#/components/schemas/HostCert"},"provider":{"$ref":"#/components/schemas/HostProviderInfo"}}},"HostsRollup":{"type":"object","required":["hosts","avg_uptime_24h","avg_latency_p50"],"properties":{"hosts":{"type":"integer"},"avg_uptime_24h":{"type":["number","null"]},"avg_latency_p50":{"type":["number","null"]}}},"HostsResponse":{"type":"object","required":["items","rollup","generated_at"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/HostSummary"}},"rollup":{"$ref":"#/components/schemas/HostsRollup"},"generated_at":{"type":"string","format":"date-time"}}},"NetworkSummary":{"type":"object","required":["hosts","open_incidents","anomalies_24h","generated_at"],"properties":{"hosts":{"type":"object","required":["up","degraded","down"],"properties":{"up":{"type":"integer"},"degraded":{"type":"integer"},"down":{"type":"integer"}}},"open_incidents":{"type":"integer"},"anomalies_24h":{"type":"integer"},"generated_at":{"type":"string","format":"date-time"}}},"IncidentTimelineStep":{"type":"object","required":["at","severity"],"properties":{"at":{"type":"string","format":"date-time"},"severity":{"type":"string","enum":["up","degraded","down"]}}},"IncidentView":{"type":"object","required":["id","hostname","role","status","severity","started_at","ended_at","timeline"],"properties":{"id":{"type":"integer"},"hostname":{"type":"string"},"role":{"$ref":"#/components/schemas/HostRole"},"status":{"type":"string","enum":["open","closed"]},"severity":{"type":"string","enum":["up","degraded","down"]},"started_at":{"type":"string","format":"date-time"},"ended_at":{"type":["string","null"],"format":"date-time"},"timeline":{"type":"array","items":{"$ref":"#/components/schemas/IncidentTimelineStep"}}}},"IncidentPage":{"type":"object","description":"A page of incidents.","required":["items","next_cursor"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/IncidentView"}},"next_cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null on the last page."}}},"UptimePercentiles":{"type":"object","description":"Latency percentiles for one phase, whole milliseconds.","required":["p50","p95","p99"],"properties":{"p50":{"type":"number"},"p95":{"type":"number"},"p99":{"type":"number"}}},"UptimePhasePercentiles":{"type":"object","required":["dns","tcp","tls","http","total"],"properties":{"dns":{"$ref":"#/components/schemas/UptimePercentiles"},"tcp":{"$ref":"#/components/schemas/UptimePercentiles"},"tls":{"$ref":"#/components/schemas/UptimePercentiles"},"http":{"$ref":"#/components/schemas/UptimePercentiles"},"total":{"$ref":"#/components/schemas/UptimePercentiles"}}},"UptimeBucket":{"type":"object","required":["resolution","hostname","role","location","bucket_start","checks_total","up","degraded","down","uptime_pct","phases"],"properties":{"resolution":{"type":"string","enum":["hourly","daily","monthly"]},"hostname":{"type":"string"},"role":{"$ref":"#/components/schemas/HostRole"},"location":{"type":"string"},"bucket_start":{"type":"string","format":"date-time"},"checks_total":{"type":"integer"},"up":{"type":"integer"},"degraded":{"type":"integer"},"down":{"type":"integer"},"uptime_pct":{"type":"number"},"phases":{"$ref":"#/components/schemas/UptimePhasePercentiles"}}},"UptimePage":{"type":"object","description":"A page of uptime aggregate buckets.","required":["items","next_cursor"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/UptimeBucket"}},"next_cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null on the last page."}}},"ParticipantCard":{"type":["object","null"],"required":["name","countryCode","registrationDate"],"properties":{"name":{"type":["string","null"]},"countryCode":{"type":["string","null"]},"registrationDate":{"type":["string","null"],"format":"date","description":"ISO 8601 date (YYYY-MM-DD)."}}},"ParticipantRegistration":{"type":"object","required":["registered","since","smp"],"properties":{"registered":{"type":"boolean"},"since":{"type":["string","null"],"format":"date-time"},"smp":{"type":["string","null"]}}},"SeatProvider":{"type":"object","description":"Embedded provider for a seat, verified mapping or unverified CN fallback.","required":["slug","name","country","verified"],"properties":{"slug":{"type":["string","null"]},"name":{"type":["string","null"]},"country":{"type":["string","null"]},"verified":{"type":"boolean"}}},"SeatRef":{"type":"object","required":["seat_id","provider"],"properties":{"seat_id":{"type":"string"},"provider":{"$ref":"#/components/schemas/SeatProvider"}}},"SeatHost":{"type":"object","required":["hostname","role","since"],"properties":{"hostname":{"type":"string"},"role":{"$ref":"#/components/schemas/HostRole"},"since":{"type":["string","null"],"format":"date-time"}}},"ParticipantEndpointView":{"type":"object","required":["doctype","transport_profile","url","seat"],"properties":{"doctype":{"type":"string"},"transport_profile":{"type":"string"},"url":{"type":"string"},"seat":{"oneOf":[{"$ref":"#/components/schemas/SeatRef"},{"type":"null"}]}}},"ParticipantView":{"type":"object","required":["id","scheme","value","provenance","directory","registration","card"],"properties":{"id":{"type":"string","description":"Canonical `scheme::value`."},"scheme":{"type":"string"},"value":{"type":"string"},"provenance":{"type":"string","enum":["directory","discovered"]},"directory":{"type":"object","required":["present","since"],"properties":{"present":{"type":"boolean"},"since":{"type":["string","null"],"format":"date-time"}}},"registration":{"$ref":"#/components/schemas/ParticipantRegistration"},"card":{"$ref":"#/components/schemas/ParticipantCard"},"endpoints":{"type":"array","items":{"$ref":"#/components/schemas/ParticipantEndpointView"}},"seats":{"type":"array","items":{"$ref":"#/components/schemas/SeatRef"}}}},"ParticipantEvent":{"type":"object","required":["id","type","observed_at","payload"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["participant_registered","participant_deregistered","participant_smp_changed","endpoint_changed","doctype_support_changed","ap_seat_changed","host_cert_rotated","hosting_changed","directory_card_changed"]},"observed_at":{"type":"string","format":"date-time"},"payload":{"type":"object","additionalProperties":true}}},"ParticipantEventPage":{"type":"object","description":"A page of participant change events.","required":["items","next_cursor"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ParticipantEvent"}},"next_cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null on the last page."}}},"ParticipantHistoryRow":{"type":"object","required":["fact","valid_from","valid_to","detail"],"properties":{"fact":{"type":"string","enum":["directory_presence","card","registration","smp"]},"valid_from":{"type":"string","format":"date-time"},"valid_to":{"type":["string","null"],"format":"date-time"},"detail":{"type":"object","additionalProperties":true}}},"ParticipantHistoryPage":{"type":"object","description":"A page of participant history rows.","required":["items","next_cursor"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ParticipantHistoryRow"}},"next_cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null on the last page."}}},"AnomalyRef":{"type":"object","required":["id","detector","grade"],"properties":{"id":{"type":"string"},"detector":{"type":"string","enum":["cert_identity_shift","off_cadence_rotation","endpoint_off_footprint","moved_to_unverified_seat","mass_change_burst"]},"grade":{"type":"string","enum":["notice","warning"]}}},"GlobalEvent":{"type":"object","required":["id","type","hostname","observed_at","payload","anomalies"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["participant_registered","participant_deregistered","participant_smp_changed","endpoint_changed","doctype_support_changed","ap_seat_changed","host_cert_rotated","hosting_changed","directory_card_changed"]},"hostname":{"type":["string","null"]},"observed_at":{"type":"string","format":"date-time"},"payload":{"type":"object","additionalProperties":true},"anomalies":{"type":"array","items":{"$ref":"#/components/schemas/AnomalyRef"}}}},"EventChartBucket":{"type":"object","required":["bucket_start","count"],"properties":{"bucket_start":{"type":"string","format":"date-time"},"count":{"type":"integer"}}},"EventFeedMeta":{"type":"object","description":"First-page events metadata: exact type facets + filter count (the events table is small enough for exact aggregation), an estimated total, and an auto-bucketed timeline chart over the (filtered) window.","required":["total_count","total_count_estimated","filter_count","facets","chart_bucket","chart_data"],"properties":{"total_count":{"type":"integer","description":"Estimated total (pg_class.reltuples)."},"total_count_estimated":{"type":"boolean"},"filter_count":{"type":["integer","null"],"description":"Exact count matching active filters, or null when none is active."},"facets":{"type":"object","description":"Exact per-type counts under the non-type filters.","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/FacetBucket"}}},"chart_bucket":{"type":"string","enum":["hour","day","week"]},"chart_data":{"type":"array","items":{"$ref":"#/components/schemas/EventChartBucket"}}}},"EventFeedPage":{"type":"object","description":"A cursor page of change events with a prev cursor and first-page meta.","required":["items","next_cursor","prev_cursor"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/GlobalEvent"}},"next_cursor":{"type":["string","null"]},"prev_cursor":{"type":["string","null"],"description":"Newer-direction cursor (newest row on the page); the live-mode watermark."},"meta":{"$ref":"#/components/schemas/EventFeedMeta"}}},"FacetBucket":{"type":"object","required":["value","count"],"properties":{"value":{"type":"string"},"count":{"type":"integer"},"label":{"type":"string","description":"Human-facing label when `value` is an opaque key (the `ap` facet's value is a SeatID; the label is the curated provider name). Filter on `value`."}}},"ParticipantListItem":{"type":"object","required":["id","scheme","value","name","country","registered","smp","ap_seat_id","ap_provider","provenance","first_seen_at"],"properties":{"id":{"type":"string","description":"Canonical `scheme::value`."},"scheme":{"type":"string"},"value":{"type":"string"},"name":{"type":["string","null"],"description":"Current card name; null for discovered participants."},"country":{"type":["string","null"],"description":"Current card country; null for discovered participants."},"registered":{"type":"boolean","description":"Currently registered in the SML."},"smp":{"type":["string","null"],"description":"Current SMP hostname, or null."},"ap_seat_id":{"type":["string","null"],"description":"Serving Access Point SeatID, or null before the deep SMP fetch."},"ap_provider":{"type":["string","null"],"description":"Curated provider name behind that Seat, or null when unmapped."},"provenance":{"type":"string","enum":["directory","discovered"]},"first_seen_at":{"type":"string","format":"date-time"}}},"ListMeta":{"type":"object","description":"First-page list metadata: estimated totals and rollup facets.","required":["total_count","total_count_estimated","filter_count","facets"],"properties":{"total_count":{"type":"integer","description":"Estimated total (pg_class.reltuples)."},"total_count_estimated":{"type":"boolean"},"filter_count":{"type":["integer","null"],"description":"Bounded exact count when a filter/search is active, else null. Capped at 50000; when the match set exceeds the cap this is that cap and filter_count_capped is true."},"filter_count_capped":{"type":"boolean","description":"True when filter_count is the cap (a floor), not an exact total."},"facets":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/FacetBucket"}}}}},"ParticipantListPage":{"type":"object","description":"A keyset page of participants with a prev cursor and first-page meta.","required":["items","next_cursor","prev_cursor"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ParticipantListItem"}},"next_cursor":{"type":["string","null"]},"prev_cursor":{"type":["string","null"]},"meta":{"$ref":"#/components/schemas/ListMeta"}}},"ParticipantStats":{"type":"object","required":["total_count","refreshed_at","facets"],"properties":{"total_count":{"type":"integer"},"refreshed_at":{"type":"string","format":"date-time"},"facets":{"type":"object","required":["country","scheme","registered","provenance","smp","ap"],"properties":{"country":{"type":"array","items":{"$ref":"#/components/schemas/FacetBucket"}},"scheme":{"type":"array","items":{"$ref":"#/components/schemas/FacetBucket"}},"registered":{"type":"array","items":{"$ref":"#/components/schemas/FacetBucket"}},"provenance":{"type":"array","items":{"$ref":"#/components/schemas/FacetBucket"}},"smp":{"type":"array","items":{"$ref":"#/components/schemas/FacetBucket"}},"ap":{"type":"array","items":{"$ref":"#/components/schemas/FacetBucket"}}}}}},"AnomalyView":{"type":"object","required":["id","detector","grade","target","event_refs","evidence","observed_at","acknowledged","reason"],"properties":{"id":{"type":"string"},"detector":{"type":"string","enum":["cert_identity_shift","off_cadence_rotation","endpoint_off_footprint","moved_to_unverified_seat","mass_change_burst"]},"grade":{"type":"string","enum":["notice","warning"]},"target":{"type":"object","additionalProperties":true},"event_refs":{"type":"array","items":{"type":"string"}},"evidence":{"type":"object","additionalProperties":true},"observed_at":{"type":"string","format":"date-time"},"acknowledged":{"type":"boolean"},"reason":{"type":["string","null"]}}},"AnomalyPage":{"type":"object","description":"A page of anomalies.","required":["items","next_cursor"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AnomalyView"}},"next_cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null on the last page."}}},"ProviderView":{"type":"object","required":["key","trade_name","legal_name","country","url","flags","hostnames","participant_count","slug"],"properties":{"key":{"type":"string"},"trade_name":{"type":"string"},"legal_name":{"type":["string","null"]},"country":{"type":["string","null"]},"url":{"type":["string","null"]},"flags":{"type":"object","required":["peppol_authority","ap","smp","end_user","observer"],"properties":{"peppol_authority":{"type":"boolean"},"ap":{"type":"boolean"},"smp":{"type":"boolean"},"end_user":{"type":"boolean"},"observer":{"type":"boolean"}}},"hostnames":{"type":"array","items":{"type":"string"}},"participant_count":{"type":"integer"},"slug":{"type":["string","null"]}}},"ProviderPage":{"type":"object","description":"The provider registry (never paginated; next_cursor null).","required":["items","next_cursor"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProviderView"}},"next_cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null on the last page."}}},"ApView":{"type":"object","required":["key","name","verified","seats","participant_count"],"properties":{"key":{"type":"string","description":"Stable, URL-safe provider key: `c-<slug>` (curated), `o-<slug>-<hash>` (from the exact O=), or `s-<seatid>` (bare seat)."},"name":{"type":"string"},"verified":{"type":"boolean"},"seats":{"type":"array","items":{"type":"string"}},"participant_count":{"type":"integer"},"net_growth":{"type":"integer","description":"Net growth (joiners + movers-in − movers-out − leavers) over the trailing 30-day period. Additive; absent before the churn rollup has run."}}},"ApPage":{"type":"object","description":"The access point directory (never paginated; next_cursor null).","required":["items","next_cursor"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ApView"}},"next_cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null on the last page."}}},"ChurnSeriesPoint":{"type":"object","required":["day","joiners","movers_in","movers_out","leavers","net_growth"],"properties":{"day":{"type":"string","format":"date","description":"UTC calendar day (YYYY-MM-DD)."},"joiners":{"type":"integer"},"movers_in":{"type":"integer"},"movers_out":{"type":"integer"},"leavers":{"type":"integer"},"net_growth":{"type":"integer","description":"joiners + movers_in − movers_out − leavers for the day."}}},"ChurnTotals":{"type":"object","required":["joiners","movers_in","movers_out","leavers","net_growth"],"properties":{"joiners":{"type":"integer"},"movers_in":{"type":"integer"},"movers_out":{"type":"integer"},"leavers":{"type":"integer"},"net_growth":{"type":"integer"}}},"ChurnCounterpartTotal":{"type":"object","required":["key","name","won","lost"],"properties":{"key":{"type":"string","description":"The counterpart Provider's key."},"name":{"type":"string"},"won":{"type":"integer","description":"Participants this AP won FROM the counterpart."},"lost":{"type":"integer","description":"Participants this AP lost TO the counterpart."}}},"ApChurnView":{"type":"object","required":["key","name","from","to","totals","series","counterparts"],"properties":{"key":{"type":"string"},"name":{"type":"string"},"from":{"type":"string","format":"date","description":"Inclusive period start (UTC)."},"to":{"type":"string","format":"date","description":"Inclusive period end (UTC)."},"totals":{"$ref":"#/components/schemas/ChurnTotals"},"series":{"type":"array","items":{"$ref":"#/components/schemas/ChurnSeriesPoint"}},"counterparts":{"type":"array","items":{"$ref":"#/components/schemas/ChurnCounterpartTotal"}}}},"ChurnParticipant":{"type":"object","required":["id","scheme","value","day","counterpart_key","counterpart_name"],"properties":{"id":{"type":"string","description":"Canonical `scheme::value` Peppol ID."},"scheme":{"type":"string"},"value":{"type":"string"},"day":{"type":"string","format":"date"},"counterpart_key":{"type":["string","null"]},"counterpart_name":{"type":["string","null"]}}},"ChurnParticipantPage":{"type":"object","description":"The participants behind one churn category count (never paginated; next_cursor null).","required":["items","next_cursor"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ChurnParticipant"}},"next_cursor":{"type":["string","null"],"description":"Opaque cursor for the next page, or null on the last page."}}},"ApMixBucket":{"type":"object","required":["value","count"],"properties":{"value":{"type":"string"},"count":{"type":"integer"}}},"ApProviderDetail":{"type":"object","required":["key","name","verified","participant_count","seats","country_mix","scheme_mix"],"properties":{"key":{"type":"string","description":"The canonical provider key (see ApView.key). Always the current one."},"name":{"type":"string"},"verified":{"type":"boolean"},"participant_count":{"type":"integer"},"seats":{"type":"array","items":{"$ref":"#/components/schemas/SeatRef"}},"country_mix":{"type":"array","items":{"$ref":"#/components/schemas/ApMixBucket"}},"scheme_mix":{"type":"array","items":{"$ref":"#/components/schemas/ApMixBucket"}}}},"ProviderSeatView":{"type":"object","required":["seat_id","hosts"],"properties":{"seat_id":{"type":"string"},"hosts":{"type":"array","items":{"$ref":"#/components/schemas/SeatHost"}}}},"ProviderDetailView":{"type":"object","required":["slug","name","country","natural_key","notes","verified","seats"],"properties":{"slug":{"type":"string"},"name":{"type":"string"},"country":{"type":["string","null"]},"natural_key":{"type":["string","null"]},"notes":{"type":["string","null"]},"verified":{"type":"boolean","const":true},"seats":{"type":"array","items":{"$ref":"#/components/schemas/ProviderSeatView"}}}},"SeatView":{"type":"object","required":["seat_id","provider","hosts"],"properties":{"seat_id":{"type":"string"},"provider":{"$ref":"#/components/schemas/SeatProvider"},"hosts":{"type":"array","items":{"$ref":"#/components/schemas/SeatHost"}}}},"ZoneCanary":{"type":"object","required":["location","verdict","existing_ok","existing_total","nonexistent_ok","nonexistent_total","critical_nxdomain","soa_serial","ns","observed_at"],"properties":{"location":{"type":"string"},"verdict":{"type":"string","enum":["up","degraded","down"]},"existing_ok":{"type":"integer"},"existing_total":{"type":"integer"},"nonexistent_ok":{"type":"integer"},"nonexistent_total":{"type":"integer"},"critical_nxdomain":{"type":"boolean"},"soa_serial":{"type":["integer","null"]},"ns":{"type":"array","items":{"type":"string"}},"observed_at":{"type":"string","format":"date-time"}}},"ZoneIncidentView":{"type":"object","required":["id","zone","status","severity","started_at","ended_at","timeline"],"properties":{"id":{"type":"integer"},"zone":{"type":"string"},"status":{"type":"string","enum":["open","closed"]},"severity":{"type":"string","enum":["up","degraded","down"]},"started_at":{"type":"string","format":"date-time"},"ended_at":{"type":["string","null"],"format":"date-time"},"timeline":{"type":"array","items":{"$ref":"#/components/schemas/IncidentTimelineStep"}}}},"ZoneStatusView":{"type":"object","required":["zone","kind","env","operator","verdict","critical_nxdomain","cutover","canary","management","incidents"],"properties":{"zone":{"type":"string"},"kind":{"type":"string","enum":["SML","SMK"]},"env":{"type":"string"},"operator":{"type":"string"},"verdict":{"$ref":"#/components/schemas/Verdict"},"critical_nxdomain":{"type":"boolean"},"cutover":{"type":"object","required":["dname_present","dname_target"],"properties":{"dname_present":{"type":["boolean","null"]},"dname_target":{"type":["string","null"]}}},"canary":{"type":"array","items":{"$ref":"#/components/schemas/ZoneCanary"}},"management":{"type":"object","required":["host","tls_ok","tls_not_after","tls_issuer"],"properties":{"host":{"type":["string","null"]},"tls_ok":{"type":["boolean","null"]},"tls_not_after":{"type":["string","null"],"format":"date-time"},"tls_issuer":{"type":["string","null"]}}},"incidents":{"type":"array","items":{"$ref":"#/components/schemas/ZoneIncidentView"}}}},"SmlResponse":{"type":"object","required":["zones"],"properties":{"zones":{"type":"array","items":{"$ref":"#/components/schemas/ZoneStatusView"}}}}}}}