Availability
Source available; Terraform Registry publish pending. The provider's source is public at github.com/RealUptimeHQ/terraform-provider-realuptime and builds with a stock Go toolchain. It is not yet on the Terraform Registry, so terraform init cannot download it today; use the local build path below. This page will drop that caveat the day the Registry listing is live, and not before.
Requirements
Terraform 1.5 or newer, and a RealUptime API key with read_write permission on a Growth or Scale plan, exported as REALUPTIME_API_KEY. A read-only key can plan but every create, update and destroy is refused with RU-1004. Generate the key from the dashboard's API & MCP access section; it is shown once. REALUPTIME_API_URL (or the provider's base_url) points the provider at a different API root; you only need it for a local development server.
Provider block
terraform {
required_providers {
realuptime = {
source = "RealUptimeHQ/realuptime"
version = "~> 0.1"
}
}
}
# Reads REALUPTIME_API_KEY. Pass api_key only from a secret store, never a literal.
provider "realuptime" {}Resources
Four resources and one data source, each mapped to one API route family. Attribute-by-attribute reference lives in the provider repository's docs/ folder (generated from the schemas, so it cannot drift from the code).
realuptime_check: an http monitor (POST /checks).regionsand the response assertions update in place;name,urlandinterval_secondsare set at creation (the API has no edit route for them), so changing one replaces the check and its history. Other monitor types are created from the dashboard and can be imported.realuptime_status_page: an additional status page with its brand chrome (title, description, logo, accent, theme, font, locale, links). Free includes one page; the account's last page cannot be destroyed.realuptime_status_page_component: publishes a check on a page. Destroying it unpublishes the check; the check keeps running. Agent-bound monitors are refused: they are private by design.realuptime_notification_channel: Discord, Microsoft Teams, Opsgenie or a generic JSON endpoint in the channel registry. The credential is write-only: the API never returns it, and responses carry a redacted summary instead.data.realuptime_status_page: look a page up by id or slug, typically the page created at signup.
Examples
resource "realuptime_check" "api" {
name = "Public API"
url = "https://api.example.com/health"
interval_seconds = 60
regions = ["iad", "fra"]
assertion_status_min = 200
assertion_status_max = 299
assertion_body_op = "contains"
assertion_body_value = "ok"
}data "realuptime_status_page" "main" {
slug = "acme" # the page created at signup
}
resource "realuptime_status_page_component" "api" {
status_page_id = data.realuptime_status_page.main.id
check_id = realuptime_check.api.id
display_name = "API"
description = "REST API and webhooks"
}
resource "realuptime_status_page" "internal" {
name = "Acme internal"
slug = "acme-internal"
theme_preset = "slate"
accent_color = "#1f6feb"
}resource "realuptime_notification_channel" "discord" {
type = "discord"
name = "Ops Discord"
config = {
webhookUrl = var.discord_webhook_url # write-only: never read back
}
}Building and using it locally
Until the Registry listing exists, build the binary and point Terraform at it with a dev override:
git clone https://github.com/RealUptimeHQ/terraform-provider-realuptime
cd terraform-provider-realuptime
go build -o terraform-provider-realuptime .# ~/.terraformrc
provider_installation {
dev_overrides {
"RealUptimeHQ/realuptime" = "/absolute/path/to/terraform-provider-realuptime"
}
direct {}
}With a dev override in place, skip terraform init and run terraform plan directly.
Importing what you already have
terraform import realuptime_check.api <check id>
terraform import realuptime_status_page.main <status page id>
terraform import realuptime_status_page_component.api <status page id>/<component id>
terraform import realuptime_notification_channel.discord <channel id>A notification channel's credential cannot be read back, so the first plan after importing one shows config being set from your configuration: one in-place update, which also clears the channel's verified flag until the next successful test send.
Rate limits and errors
The provider uses the same per-key write budget as any other API client (see Rate limits). A large first apply can hit it; the provider honors Retry-After once and then surfaces the error, so lower -parallelism rather than retrying blindly. Every refusal carries its stable RU- code and a link to the matching error page.
Honesty notes
Nothing here fabricates state. A check created by Terraform reports unknown until its first probe lands, a new channel is unverified until a test send succeeds, and an attribute the API does not expose (custom domains, passwords, component ordering, alert-rule attachments) is read-only or absent in the provider rather than pretended.