Skip to content

What do you need to do?

Docs

Terraform provider

Manage checks, status pages, status page components and notification channels as code. The realuptime provider is a thin, hand-mapped layer over the REST API: every attribute is an API field under its own name, so what you write in HCL is what the API receives.

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
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). regions and the response assertions update in place; name, url and interval_seconds are 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

terraform
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"
}
terraform
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"
}
terraform
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:

bash
git clone https://github.com/RealUptimeHQ/terraform-provider-realuptime
cd terraform-provider-realuptime
go build -o terraform-provider-realuptime .
terraform
# ~/.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

bash
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.