When using obs apply, the CLI expects your obs.json file to follow this structure. If obs.json is missing but observeone.json exists, the CLI will use observeone.json. All arrays are optional.
{"monitors": [{"name": "Production Website","description": "Main landing page monitor","url": "https://example.com","interval": "*/5 * * * *","timeout_ms": 30000,"alert_on_failure": true}],"api_checks": [{"name": "Health API","description": "Public health check endpoint","url": "https://api.example.com/health","method": "GET","timeout_ms": 30000,"alert_on_failure": true}],"heartbeats": [{"name": "Database Backup Job","description": "Runs daily at 2 AM","period": 86400,"grace_period": 3600}],"alert_channels": [{"name": "Slack Alerts","type": "slack","config": { "webhook_url": "https://hooks.slack.com/..." }}],"status_pages": [{"slug": "status","name": "System Status","is_public": true,"show_incident_history": true,"show_uptime_percentage": true}],"suites": [{"suite_name": "Smoke Tests","target_url": "https://example.com","cron_expression": "0 */6 * * *","schedule_active": true}],"incidents": [{"title": "API Degradation","status": "OPEN","priority": "HIGH"}]}
{"monitors": [{"name": "Production Website","description": "Main landing page monitor","url": "https://example.com","interval": "*/5 * * * *","timeout_ms": 30000,"alert_on_failure": true}],"api_checks": [{"name": "Health API","description": "Public health check endpoint","url": "https://api.example.com/health","method": "GET","timeout_ms": 30000,"alert_on_failure": true}],"heartbeats": [{"name": "Database Backup Job","description": "Runs daily at 2 AM","period": 86400,"grace_period": 3600}],"alert_channels": [{"name": "Slack Alerts","type": "slack","config": { "webhook_url": "https://hooks.slack.com/..." }}],"status_pages": [{"slug": "status","name": "System Status","is_public": true,"show_incident_history": true,"show_uptime_percentage": true}],"suites": [{"suite_name": "Smoke Tests","target_url": "https://example.com","cron_expression": "0 */6 * * *","schedule_active": true}],"incidents": [{"title": "API Degradation","status": "OPEN","priority": "HIGH"}]}
Resource Field Reference#
Monitors, API Checks, Heartbeats#
| Field | Type | Description |
|---|---|---|
name | string | Required. Unique identifier for the resource. |
description | string | Optional metadata for the resource. |
url | string | The target URL for Monitors and API Checks. |
interval | string | Cron expression for Monitors (e.g., */5 * * * *). |
period | integer | Expected frequency in seconds for Heartbeats. |
grace_period | integer | Additional time in seconds before a Heartbeat is marked DOWN. |
method | string | HTTP method for API Checks (GET, POST, etc.). |
timeout_ms | integer | Request timeout in milliseconds. |
alert_on_failure | boolean | Whether to trigger alerts when the resource fails. |
Alert Channels#
| Field | Type | Description |
|---|---|---|
name | string | Required. Unique name. Identity key for upsert. |
type | string | Required. Channel type: email, slack, discord, teams, telegram, sms, webhook. |
config | object | Channel-specific config (e.g. webhook_url, email). |
Status Pages#
| Field | Type | Description |
|---|---|---|
slug | string | Required. URL slug (lowercase, hyphenated). Identity key for upsert. |
name | string | Required. Display name. |
is_public | boolean | Whether the status page is publicly accessible. |
show_incident_history | boolean | Show incident history on the page. |
show_uptime_percentage | boolean | Show uptime percentage on the page. |
description | string | Optional description. |
theme_primary_color | string | Hex color for primary theme. |
theme_background_color | string | Hex color for background. |
Note: Attached monitors are included in export but are not managed by
obs apply. Useobs status-page add-monitor / remove-monitorto manage monitor attachments.
Suites#
| Field | Type | Description |
|---|---|---|
suite_name | string | Required. Suite name. Identity key for upsert. |
target_url | string | Required. The URL the suite tests against. |
cron_expression | string | Schedule cron expression. |
schedule_active | boolean | Whether the schedule is active. |
max_tests | integer | Maximum number of tests to generate. |
is_public | boolean | Whether the suite results are publicly visible. |
allow_form_submit | boolean | Whether the suite may submit forms. |
Note:
obs applyupdates metadata for existing suites only. New suites require AI generation viaobs suite generateand cannot be created via apply.
Incidents#
| Field | Type | Description |
|---|---|---|
title | string | Incident title. |
description | string | Incident description. |
status | string | OPEN, RESOLVED, or CLOSED. |
priority | string | CRITICAL, HIGH, MEDIUM, or LOW. |
Note: Incidents are included in
obs exportas a backup/audit artifact only.obs applywarns and skips anyincidentsblock, because incidents are runtime state and cannot be re-created from config.
Matching Behavior#
The CLI uses a resource-specific identity key to match local definitions against remote resources during synchronization. Changing an identity key locally will result in a new resource being created.
| Resource | Identity key |
|---|---|
| monitors, api_checks, heartbeats | name |
| alert_channels | name |
| status_pages | slug |
| suites | suite_name |