openstatus_private_location(resource) plus theopenstatus_private_locationandopenstatus_private_locationsdata sources. A private location is a self-hosted checker agent that runs the monitors you assign it. The agenttokenis generated by OpenStatus and exposed as a sensitive attribute — pass it to the agent to authenticate. Terraform ownsmonitor_idsandmetadata, so removing either from your configuration clears it on the next apply rather than leaving the server's copy in place. Liveness (status,last_seen_at) is available on the data sources rather than the resource, so a checking-in agent doesn't make everyterraform planreport out-of-band drift. The list data source does not expose tokens; the API omits them.private_location_idsonopenstatus_http_monitor,openstatus_tcp_monitor,openstatus_dns_monitorand both monitor data sources. Read-only; the association is managed fromopenstatus_private_location.monitor_ids.
- The provider now talks to the OpenStatus API through the generated Connect SDK (
buf.build/gen/go/openstatus/api) instead of hand-written request/response structs. The wire format is unchanged — still JSON over the same endpoints — but request and response shapes are now generated from the API's schema, so a field the provider cannot express is a compile error rather than a silent omission. If you are debugging traffic, nothing about the requests should look different. - API error messages in diagnostics are reworded. An error previously rendered as
openstatus API error (not_found): resource not foundnow renders asnot_found: resource not found. Error classification is unchanged. - Building the provider from source now requires Go 1.25.8 (was 1.22). This does not affect users installing released binaries from the registry.
group_orderset on a newopenstatus_status_page_componentis now actually applied. The API's create endpoints have no such field, so the value was being silently discarded while state kept the value from your configuration — meaning the diff never resurfaced and the component stayed unordered within its group. The provider now creates the component and then appliesgroup_orderthrough the update endpoint, which is the one that accepts it, within the same apply.
custom_themeonopenstatus_status_page(resource and data source). Per-mode CSS variable overrides merged overtheme, withlightanddarkmaps keyed by variable name (e.g."--primary" = "hsl(24 94% 50%)"). Variable names and values are validated at plan time against the same rules the API enforces, so invalid themes fail atterraform planinstead of mid-apply. Removing the block clears the theme on the next apply. Requires the custom-theme plan feature on the workspace.
openstatus_http_monitorapply no longer fails with"block count changed from 0 to 1"(#19). The OpenStatus API echoes a placeholder empty header (headers: [{}]) when no headers are configured; the provider now drops empty entries before writing state, restoring plan↔apply consistency. Real headers (any non-empty key or value) are unaffected, and drift detection still works when a header is added or removed out-of-band via the dashboard.openstatus_notificationntfy block no longer fails with"Received null value, however the target type cannot handle null values"whenserver_urlortokenis omitted. Both are documented asOptionalin the schema; the extract path was decoding them into plainstring, which the framework rejects for null inputs. They now decode throughtypes.Stringand are only sent to the API when non-empty.openstatus_notificationntfy update no longer fails with"inconsistent values for sensitive attribute"on.ntfy[0].token. The OpenStatus API does not echo back ntfy.token in its response (security default for sensitive fields); the read-back mapper now preserves the planned/state token when the API omits it, so the post-apply state matches what Terraform planned. If the API ever does return a token, that value still takes priority.
regionsis now validated at plan time onopenstatus_http_monitor,openstatus_tcp_monitor, andopenstatus_dns_monitor. Configs that reference an unknown region (typo, copy-paste from another provider, a region the OpenStatus API doesn't yet expose) now fail atterraform planinstead of mid-apply. The accepted set is unchanged — see the resource docs for the full list. If you need a region that isn't listed, open an issue; the fix is a one-line addition toregionToAPIin the provider.regionsattribute now has a consistent description ("Regions to monitor from.") on the TCP and DNS monitor resources, matching the HTTP monitor and improving the generated docs.
- Generated provider docs are now deterministic for enum-shaped attributes (
periodicity,regions,method, comparator fields). Previously the helper that derived the allowed-values list iterated a Go map directly, which produced nondeterministic ordering between regenerations.
openstatus_notification.nameis nowRequired. Configs that previously omittednamealready failed at apply time against the API (server enforcesmin_len=1); this change surfaces the failure at plan time.- Unknown
access_typevalues returned by the API are no longer silently coerced to"public". A status page in an unrecognized state will surface a diagnostic warning and leaveaccess_typeempty until a recognized value is set. The new"ip"value is also valid foraccess_type. description,body,timeout, andretryare now sent on every monitor update, including zero/empty values. The first apply after upgrade may clear adescriptionthat was set out-of-band (e.g., via the dashboard) but not declared in HCL. To avoid this, adddescription = "..."to HCL before upgrading.
- New
ms_teamsnotification provider for Microsoft Teams webhooks. - Status page: new
theme,default_locale,locales,allow_index, andallowed_ip_rangesattributes;themeis now writable (was read-only). - Status page: new
access_type = "ip"mode (pairs withallowed_ip_ranges). - Monitors: new
open_telemetryblock onopenstatus_http_monitor,openstatus_tcp_monitor, andopenstatus_dns_monitorto configure OpenTelemetry exporters. - Client-side slug regex validation on
openstatus_status_page.slug(matches the server's^[a-z0-9]+(?:-[a-z0-9]+)*$). - Diagnostic warnings when the API returns unrecognized enum values (notification provider, Opsgenie region, status page theme/locale/access type) instead of silently corrupting state.
openstatus_notificationupdates tomonitor_idsare now applied. The provider now sends the API'supdate_monitor_idsflag and an explicitmonitor_idslist (including empty[]to clear). Previously the field was silently ignored server-side.- Monitor
timeout = 0andretry = 0are now honored. Previouslyomitemptycollapsed explicit zeros into "not set" and the server applied its defaults (45000ms / 3 retries).