uptimeify_website
A website monitor: HTTP(S) check (combined, http_status, ssl_check) or heartbeat (heartbeat, the monitored system pings Uptimeify). Import with the numeric id or the public id. Updates use the partial mode of PATCH /api/websites/{id} whenever every changed field is one that mode accepts (name, url, status, interval, timeout, checks, keyword, expected response, connect target, SSL/domain days, page sizes, grace period). Changes to the customer, countries, HTTP method, redirects, cookies, auth or the write-only secrets need the full mode, which resets omitted fields to defaults, so the provider then sends every attribute and re-applies any value the full mode coerced (ssl_error_days = 0, min_page_size = 0) with a partial PATCH. Secrets (custom headers, request body, authorization header, basic auth password) are write-only: the API never returns them. Bump the matching *_wo_version to send changed values.
A website monitor: HTTP(S) check (combined, http_status, ssl_check) or heartbeat (heartbeat, the monitored system pings Uptimeify). Import with the numeric id or the public id.
Updates use the partial mode of PATCH /api/websites/{id} whenever every changed field is one that mode accepts (name, url, status, interval, timeout, checks, keyword, expected response, connect target, SSL/domain days, page sizes, grace period). Changes to the customer, countries, HTTP method, redirects, cookies, auth or the write-only secrets need the full mode, which resets omitted fields to defaults, so the provider then sends every attribute and re-applies any value the full mode coerced (ssl_error_days = 0, min_page_size = 0) with a partial PATCH.
Secrets (custom headers, request body, authorization header, basic auth password) are write-only: the API never returns them. Bump the matching *_wo_version to send changed values.
Example Usage
data "uptimeify_customer" "shop" {
name = "Example Shop GmbH"
}
variable "api_key" {
type = string
sensitive = true
}
# HTTP check with request headers, body, content checks and a connect target.
resource "uptimeify_website" "api" {
customer_id = tonumber(data.uptimeify_customer.shop.id)
name = "Shop API health"
url = "https://shop.example.com/api/health"
http_method = "POST"
check_interval = 5
timeout_seconds = 10
expected_status_codes = "200"
check_keyword_enabled = true
search_term = "\"status\":\"ok\""
allowed_check_country_codes = ["DE", "NL"]
# Check the origin directly; SNI and Host header stay shop.example.com.
connect_host = "origin.example.com"
connect_port = 8443
# Write-only: never stored in state, never returned by the API.
# Bump the version to send changed values.
custom_headers_wo = [
{ name = "X-Api-Key", value = var.api_key },
{ name = "Accept", value = "application/json" },
]
custom_headers_wo_version = 1
request_body_wo = jsonencode({ probe = true })
request_body_wo_version = 1
}
# Heartbeat: the monitored job calls the ping URL with heartbeat_token.
resource "uptimeify_website" "nightly_backup" {
customer_id = tonumber(data.uptimeify_customer.shop.id)
name = "Nightly backup"
monitoring_type = "heartbeat"
check_interval = 1440
heartbeat_grace_period_minutes = 60
# Change to any new value to mint a new token. The old token stops working
# immediately, so roll out the new ping URL in the same change.
heartbeat_token_rotation = "2026-10"
}Schema
Required
customer_id(Number) Numeric id of the customer that owns the monitor. Changing it moves the monitor.name(String)
Optional
NOTE: Write-only arguments are supported in Terraform 1.11 and later.
allow_duplicate(Boolean, Write-only) Create the monitor even if the customer already has one of this type for the same target. Without it the create fails with 409monitorAlreadyExistsand the error names the import command for the existing monitor. Sent with create only.allowed_check_country_codes(Set of String) Upper-case ISO country codes of the check locations. Unset at create: the package default (null = all). Removing it later keeps the last value.auth_mode(String)none,authorization_header(needsauthorization_header_wo) orbasic(needsbasic_auth_usernameandbasic_auth_password_wo). Defaults tonone.auth_wo_version(Number) Change to resend the auth secrets.authorization_header_wo(String, Sensitive, Write-only) Write-only value of the Authorization header forauth_mode = "authorization_header". Sent with create and wheneverauth_mode,basic_auth_usernameorauth_wo_versionchanges.basic_auth_password_wo(String, Sensitive, Write-only) Write-only basic auth password, sent likeauthorization_header_wo.basic_auth_username(String) Username forauth_mode = "basic".check_domain_expiry_enabled(Boolean) Domain expiry check. Unset: the package default. The package may switch it off; a full update switches it off on heartbeat monitors.check_expected_response_enabled(Boolean) Compare the response body withexpected_response_value. Defaults tofalse.check_https_redirect_enabled(Boolean) HTTP to HTTPS redirect check. Unset: the package default. The package may switch it off; a full update switches it off on heartbeat monitors.check_interval(Number) Minutes between checks; at least the package minimum, at most 1440 (43200 for heartbeat). Defaults to30.check_keyword_enabled(Boolean) Keyword check againstsearch_term; off without a search term. Unset: the package default. The package may switch it off; a full update switches it off on heartbeat monitors.check_response_time_enabled(Boolean) Response time check (the threshold is not configurable per monitor). Unset: the package default. The package may switch it off; a full update switches it off on heartbeat monitors.check_size_enabled(Boolean) Page size check againstmin_page_size/max_page_size; off without a limit. Unset: the package default. The package may switch it off; a full update switches it off on heartbeat monitors.check_ssl_enabled(Boolean) Certificate validity and expiry check. Unset: the package default. The package may switch it off; a full update switches it off on heartbeat monitors.check_status_enabled(Boolean) Status code check againstexpected_status_codes. Unset: the package default. The package may switch it off; a full update switches it off on heartbeat monitors.connect_host(String) Connect target (connectHost): IP or host name to connect to instead of the URL's host; SNI and Host header stay the URL's. Lower case, without port (useconnect_port), must be public.connect_port(Number) Port of the connect target; unset = the URL's port.connect_tls_insecure(Boolean) Skip certificate verification at the connect target; needsconnect_host. Defaults tofalse.cookie_handling(String)noneorjar(keep cookies across redirects). Defaults tonone.custom_headers_wo(Attributes List, Write-only) Write-only request headers. Names and values are stored encrypted and never returned (seehas_custom_headers). Sent with create and whenevercustom_headers_wo_versionchanges; an empty or removed list then clears them. (see below for nested schema)custom_headers_wo_version(Number) Change to resendcustom_headers_wo.domain_expiry_error_days(Number) Error this many days before domain expiry. Defaults to7.domain_expiry_notice_days(Number) Warn this many days before domain expiry. Defaults to30.expected_response_json_path(String)expected_response_match_type(String)contains,equalsorjson_path_equals(needsexpected_response_json_path). Defaults tocontains.expected_response_value(String)expected_status_codes(String) Comma-separated accepted status codes. Defaults to200,301,302.follow_redirects(Boolean) Defaults totrue.heartbeat_grace_period_minutes(Number) Heartbeat monitors: minutes a ping may be late. Server default 5; null for other types.heartbeat_token_rotation(String) Heartbeat monitors: any value; changing it to a new non-null value mints a new heartbeat token (heartbeat_tokenchanges,urlstays). The old token stops working immediately, so update the pinging job in the same rollout. Setting it at create does not rotate.http_method(String)GET,QUERY,POST,PUT,PATCH,DELETE,HEADorOPTIONS. Defaults toGET.max_page_size(Number) Bytes; dropped by the server whilecheck_size_enabledis off.min_page_size(Number) Bytes; dropped by the server whilecheck_size_enabledis off.monitoring_type(String)combined,http_status,ssl_checkorheartbeat. Changing it replaces the monitor. Defaults tocombined.request_body_wo(String, Sensitive, Write-only) Write-only request body (stored encrypted, never returned, seehas_request_body). Sent with create and wheneverrequest_body_wo_versionchanges.request_body_wo_version(Number) Change to resendrequest_body_wo.search_term(String) Keyword the page must contain (needscheck_keyword_enabled; the server drops it while that check is off).ssl_error_days(Number) Error this many days before certificate expiry; at mostssl_notice_days. Defaults to0.ssl_notice_days(Number) Warn this many days before certificate expiry. Defaults to7.status(String)active,inactiveormaintenance. Defaults toactive.timeout_seconds(Number) Request timeout, 1 to 60. Defaults to30.url(String) URL with protocol; required except for heartbeat monitors. Heartbeat monitors getheartbeat://<monitor id>from the server (the ping token isheartbeat_token), leave it unset there. Must resolve to a public address at create and update.
Read-Only
created_at(String)has_custom_headers(Boolean) Whether custom headers are stored.has_request_body(Boolean) Whether a request body is stored.heartbeat_token(String, Sensitive) Heartbeat monitors: token of the ping URL (server-generated). Sensitive: anyone with it can report the job as healthy.id(String) Numeric website id.public_id(String) Public UUID of the website.updated_at(String)
Nested Schema for custom_headers_wo
Required:
name(String, Write-only)value(String, Sensitive, Write-only)
Import
Import is supported using the following syntax:
The terraform import command can be used, for example:
# Numeric id or public id. Write-only secrets are not imported; set them and their *_wo_version afterwards.
terraform import uptimeify_website.api 42uptimeify_user_notification_settings
Personal Incident Management notification settings of one user of the organization, set by an organization admin (PUT /api/im/users/{userId}/notification-settings). The last write wins: the user can change them afterwards, which shows up as drift. Destroying only removes them from the state, the user keeps the chain. Import with the user id.
uptimeify_whitelabel_domain
A custom app domain (white label) of the organization. Terraform creates it as pending and outputs the DNS TXT record that proves control. Verifying and activating are one-off actions, not managed here: POST /api/organization/whitelabel/domains/verify with { "domainId": <id> } once the record is live, then POST /api/organization/whitelabel/domains/activate (optionally makePrimary). Organization admins only. Import with the numeric id.