Download OpenAPI specification:
REST API for the self-hosted Uptime Monitor application.
Most admin endpoints require a Bearer token in the Authorization header.
Two token types are accepted:
POST /api/admin/login, valid for 7 days.
Can access all endpoints including token management and 2FA.read (GET only) or write (all methods) scope.
Cannot access /api/admin/api-tokens, /api/admin/2fa, or PUT /api/admin/config.All timestamps in API responses are Unix milliseconds unless otherwise noted. The raw DB stores Unix seconds; the API layer multiplies by 1000. Exceptions (raw DB seconds) are noted per-field.
Public API endpoints are rate-limited per source IP. All limits are in-process and not distributed across instances.
| Endpoint | Limit |
|---|---|
GET /api/pages |
100 req / minute |
GET /api/status |
100 req / minute |
GET /api/status/{id} |
100 req / minute |
GET /api/heartbeat/{id} |
300 req / minute |
POST /api/heartbeat/{id} |
300 req / minute |
Every response from these endpoints includes RateLimit-Limit,
RateLimit-Remaining, and RateLimit-Reset headers. Requests that exceed
the limit receive 429 with a Retry-After header (seconds until reset).
POST /api/admin/login uses a separate failure-based limit: 5 failures per
IP per 15-minute window locks the IP out for 15 minutes.
Returns all public status pages. Authenticated admins also see private pages
and an additional isPublic field on each page.
{- "pages": [
- {
- "id": "string",
- "slug": "string",
- "title": "string",
- "isDefault": true,
- "isPublic": true
}
]
}Returns the full status page payload including all services, their history, active incidents, and active announcements.
Requires bearer auth to view private pages. Public pages are accessible without auth.
| page | string Status page slug. Omit to use the default page. |
{- "page": {
- "id": "string",
- "slug": "string",
- "isDefault": true
}, - "title": "string",
- "description": "string",
- "logoUrl": "string",
- "refreshInterval": 0,
- "services": [
- {
- "id": "string",
- "name": "string",
- "type": "http",
- "tags": [
- "string"
], - "slaTarget": 0,
- "uptime30d": 0,
- "status": "up",
- "latencyMs": 0,
- "uptimeSince": 0,
- "lastCheckedAt": 0,
- "activeIncident": {
- "id": 0,
- "startedAt": 0,
- "cause": "string"
}, - "activeMaintenance": {
- "id": 0,
- "label": "string",
- "endsAt": 0
}, - "upcomingMaintenance": [
- {
- "id": 0,
- "label": "string",
- "startsAt": 0,
- "endsAt": 0
}
], - "history90d": [
- {
- "date": "2019-08-24",
- "total": 0,
- "up": 0,
- "down": 0,
- "degraded": 0,
- "avgLatencyMs": 0
}
], - "history24h": [
- {
- "date": "string",
- "total": 0,
- "up": 0,
- "down": 0,
- "degraded": 0,
- "avgLatencyMs": 0
}
], - "history4h": [
- {
- "date": "string",
- "total": 0,
- "up": 0,
- "down": 0,
- "degraded": 0,
- "avgLatencyMs": 0
}
], - "latencyTrend24h": [
- 0
]
}
], - "activeIncidents": [
- {
- "id": 0,
- "service_id": "string",
- "startedAt": 0
}
], - "announcements": [
- {
- "id": 0,
- "severity": "info",
- "title": "string",
- "bodyMarkdown": "string",
- "pageIds": [
- "string"
], - "startsAt": 0,
- "endsAt": 0
}
]
}Returns status and 90-day history for one service. Requires bearer auth to view services on private pages or unlisted (pageId null) services. Returns 404 (not 401) when the service is inaccessible to avoid leaking existence.
| id required | string |
{- "id": "string",
- "name": "string",
- "type": "http",
- "status": "up",
- "latencyMs": 0,
- "message": "string",
- "lastCheckedAt": 0,
- "history90d": [
- { }
]
}Records a heartbeat for a heartbeat-type service. Use when your process can send POST requests (recommended).
The secret token must be provided via either the X-Heartbeat-Token header
or the token query parameter.
Returns 404 for both "service not found" and "invalid token" to avoid leaking whether a service ID exists.
| id required | string |
| token | string Heartbeat secret token (alternative to X-Heartbeat-Token header) |
| X-Heartbeat-Token | string Heartbeat secret token (alternative to token query param) |
{- "error": "string",
- "issues": [
- { }
], - "reason": "string"
}GET alias for POST /api/heartbeat/{id}. Intended for cron-like tools that
issue a plain curl <url> without specifying a method.
Same token and response behavior as the POST variant.
| id required | string |
| token | string Heartbeat secret token (alternative to X-Heartbeat-Token header) |
| X-Heartbeat-Token | string Heartbeat secret token (alternative to token query param) |
{- "error": "string",
- "issues": [
- { }
], - "reason": "string"
}Verifies the admin password and, if 2FA is enabled, a TOTP code or recovery code. Returns a bearer token valid for 7 days.
Rate-limited to 5 failures per IP per 15-minute window. After 5 failures the IP
is locked out for 15 minutes and all requests return 429 with a Retry-After header.
| password required | string Admin password (minimum 12 characters) |
| totp | string 6-digit TOTP code (required when 2FA is enabled) |
| recovery | string Single-use recovery code (alternative to totp when 2FA is enabled) |
{- "password": "string",
- "totp": "string",
- "recovery": "string"
}{- "token": "string"
}Returns all services with their latest check result and 30-day stats. apiKey and token fields are redacted.
[- {
- "id": "string",
- "name": "string",
- "type": "http",
- "intervalSeconds": 5,
- "pageId": null,
- "paused": false,
- "tags": [ ],
- "slaTarget": 50,
- "displayOrder": 1000,
- "timeoutMs": 10000,
- "confirmationThreshold": 1,
- "retries": 0,
- "retryDelayMs": 1000,
- "alerts": {
- "destinations": [
- { }
]
}, - "method": "GET",
- "expectedStatus": 200,
- "body": "string",
- "headers": {
- "property1": "string",
- "property2": "string"
}, - "followRedirects": true,
- "bodyMatch": {
- "contains": "string",
- "regex": "string",
- "jsonPath": "string",
- "expected": "string"
}, - "sslWarnDays": 1,
- "latestCheck": {
- "status": "up",
- "latencyMs": 0,
- "message": "string",
- "checkedAt": 0
}, - "uptime30d": 0,
- "latencyTrend24h": [
- 0
]
}
]Creates a new monitored service. For heartbeat services, token is
auto-generated if omitted. Returns 409 if the id is already in use.
| id required | string^[a-z0-9\-_]+$ Unique service identifier — lowercase alphanumeric, hyphens, underscores |
| name required | string non-empty |
| type required | string |
| intervalSeconds required | integer >= 5 How often to run the check (seconds) |
| pageId | string or null Default: null Status page this service appears on. null = unlisted (admin-only) |
| paused | boolean Default: false Paused services are excluded from status pages and not actively checked |
| tags | Array of strings <= 16 items [ items [ 1 .. 40 ] characters ] Default: [] |
| slaTarget | number [ 50 .. 100 ] Optional uptime SLA target percentage (50–100) |
| displayOrder | integer >= 0 Default: 1000 Sort order (lower = first). Multiples of 1000 when managed via the reorder endpoint |
| timeoutMs | integer >= 100 Default: 10000 Per-check request timeout in milliseconds |
| confirmationThreshold | integer [ 1 .. 10 ] Default: 1 Consecutive failing checks required before an incident opens and an alert fires. 1 alerts on the first failure; higher values suppress short-lived blips (e.g. at a 30s interval, 3 means a failure must persist ~60s+ before paging). |
| retries | integer [ 0 .. 10 ] Default: 0 Immediate re-probes after a failing check. If any re-probe comes back up the check is treated as up — neither recorded as down nor counted toward confirmationThreshold — so a one-off network hiccup is ignored. |
| retryDelayMs | integer [ 0 .. 60000 ] Default: 1000 Delay between immediate re-probes (see retries), in milliseconds |
object (AlertsConfig) Per-service alert override configuration | |
| url required | string <uri> URL to monitor. SSRF-protected — loopback, RFC1918, and cloud-metadata addresses are blocked. |
| method | string Default: "GET" Enum: "GET" "POST" "HEAD" |
integer or string Default: 200 | |
| body | string Request body sent with POST requests |
object Additional request headers | |
| followRedirects | boolean Default: true |
object or null Assert the response body matches a pattern. At least one of contains, regex, or jsonPath must be set. | |
| sslWarnDays | integer [ 1 .. 365 ] Alert when the SSL certificate expires within this many days |
{- "id": "string",
- "name": "string",
- "type": "http",
- "intervalSeconds": 5,
- "pageId": null,
- "paused": false,
- "tags": [ ],
- "slaTarget": 50,
- "displayOrder": 1000,
- "timeoutMs": 10000,
- "confirmationThreshold": 1,
- "retries": 0,
- "retryDelayMs": 1000,
- "alerts": {
- "destinations": [
- { }
]
}, - "method": "GET",
- "expectedStatus": 200,
- "body": "string",
- "headers": {
- "property1": "string",
- "property2": "string"
}, - "followRedirects": true,
- "bodyMatch": {
- "contains": "string",
- "regex": "string",
- "jsonPath": "string",
- "expected": "string"
}, - "sslWarnDays": 1
}{- "id": "string",
- "name": "string",
- "type": "http",
- "intervalSeconds": 5,
- "pageId": null,
- "paused": false,
- "tags": [ ],
- "slaTarget": 50,
- "displayOrder": 1000,
- "timeoutMs": 10000,
- "confirmationThreshold": 1,
- "retries": 0,
- "retryDelayMs": 1000,
- "alerts": {
- "destinations": [
- { }
]
}, - "method": "GET",
- "expectedStatus": 200,
- "body": "string",
- "headers": {
- "property1": "string",
- "property2": "string"
}, - "followRedirects": true,
- "bodyMatch": {
- "contains": "string",
- "regex": "string",
- "jsonPath": "string",
- "expected": "string"
}, - "sslWarnDays": 1
}Reassigns displayOrder to multiples of 1000 in the given array order.
| ids required | Array of strings Service IDs in the desired display order |
{- "ids": [
- "string"
]
}{- "ok": true
}Downloads a YAML file containing all services and pages. Compatible with the
import endpoint. By default, secrets (apiKey, token) are omitted; pass
includeSecrets=1 to include them.
| includeSecrets | string Value: "1" Pass |
{- "error": "string",
- "issues": [
- { }
], - "reason": "string"
}Parses and validates a YAML document (same format as export). Runs a dry-run
by default; pass mode: "commit" to apply changes.
The YAML must have a top-level services: array. An optional pages: array
may also be present. All services are upserted (create or overwrite).
| yaml required | string YAML string to import |
| mode | string Default: "dry-run" Enum: "dry-run" "commit" dry-run validates and reports what would be imported; commit applies the changes |
{- "yaml": "string",
- "mode": "dry-run"
}{- "imported": 0,
- "importedPages": 0
}{- "id": "string",
- "name": "string",
- "type": "http",
- "intervalSeconds": 5,
- "pageId": null,
- "paused": false,
- "tags": [ ],
- "slaTarget": 50,
- "displayOrder": 1000,
- "timeoutMs": 10000,
- "confirmationThreshold": 1,
- "retries": 0,
- "retryDelayMs": 1000,
- "alerts": {
- "destinations": [
- { }
]
}, - "method": "GET",
- "expectedStatus": 200,
- "body": "string",
- "headers": {
- "property1": "string",
- "property2": "string"
}, - "followRedirects": true,
- "bodyMatch": {
- "contains": "string",
- "regex": "string",
- "jsonPath": "string",
- "expected": "string"
}, - "sslWarnDays": 1
}Merges the provided fields into the existing service config. Fields sent as
null are cleared (optional fields become absent). Empty strings for apiKey
or token are ignored — omit them to preserve the stored value.
| id required | string Service ID |
| id required | string^[a-z0-9\-_]+$ Unique service identifier — lowercase alphanumeric, hyphens, underscores |
| name required | string non-empty |
| type required | string |
| intervalSeconds required | integer >= 5 How often to run the check (seconds) |
| pageId | string or null Default: null Status page this service appears on. null = unlisted (admin-only) |
| paused | boolean Default: false Paused services are excluded from status pages and not actively checked |
| tags | Array of strings <= 16 items [ items [ 1 .. 40 ] characters ] Default: [] |
| slaTarget | number [ 50 .. 100 ] Optional uptime SLA target percentage (50–100) |
| displayOrder | integer >= 0 Default: 1000 Sort order (lower = first). Multiples of 1000 when managed via the reorder endpoint |
| timeoutMs | integer >= 100 Default: 10000 Per-check request timeout in milliseconds |
| confirmationThreshold | integer [ 1 .. 10 ] Default: 1 Consecutive failing checks required before an incident opens and an alert fires. 1 alerts on the first failure; higher values suppress short-lived blips (e.g. at a 30s interval, 3 means a failure must persist ~60s+ before paging). |
| retries | integer [ 0 .. 10 ] Default: 0 Immediate re-probes after a failing check. If any re-probe comes back up the check is treated as up — neither recorded as down nor counted toward confirmationThreshold — so a one-off network hiccup is ignored. |
| retryDelayMs | integer [ 0 .. 60000 ] Default: 1000 Delay between immediate re-probes (see retries), in milliseconds |
object (AlertsConfig) Per-service alert override configuration | |
| url required | string <uri> URL to monitor. SSRF-protected — loopback, RFC1918, and cloud-metadata addresses are blocked. |
| method | string Default: "GET" Enum: "GET" "POST" "HEAD" |
integer or string Default: 200 | |
| body | string Request body sent with POST requests |
object Additional request headers | |
| followRedirects | boolean Default: true |
object or null Assert the response body matches a pattern. At least one of contains, regex, or jsonPath must be set. | |
| sslWarnDays | integer [ 1 .. 365 ] Alert when the SSL certificate expires within this many days |
{- "id": "string",
- "name": "string",
- "type": "http",
- "intervalSeconds": 5,
- "pageId": null,
- "paused": false,
- "tags": [ ],
- "slaTarget": 50,
- "displayOrder": 1000,
- "timeoutMs": 10000,
- "confirmationThreshold": 1,
- "retries": 0,
- "retryDelayMs": 1000,
- "alerts": {
- "destinations": [
- { }
]
}, - "method": "GET",
- "expectedStatus": 200,
- "body": "string",
- "headers": {
- "property1": "string",
- "property2": "string"
}, - "followRedirects": true,
- "bodyMatch": {
- "contains": "string",
- "regex": "string",
- "jsonPath": "string",
- "expected": "string"
}, - "sslWarnDays": 1
}{- "id": "string",
- "name": "string",
- "type": "http",
- "intervalSeconds": 5,
- "pageId": null,
- "paused": false,
- "tags": [ ],
- "slaTarget": 50,
- "displayOrder": 1000,
- "timeoutMs": 10000,
- "confirmationThreshold": 1,
- "retries": 0,
- "retryDelayMs": 1000,
- "alerts": {
- "destinations": [
- { }
]
}, - "method": "GET",
- "expectedStatus": 200,
- "body": "string",
- "headers": {
- "property1": "string",
- "property2": "string"
}, - "followRedirects": true,
- "bodyMatch": {
- "contains": "string",
- "regex": "string",
- "jsonPath": "string",
- "expected": "string"
}, - "sslWarnDays": 1
}Runs the service check immediately, outside of the normal schedule. The result is also persisted as a regular check record.
| id required | string Service ID |
{- "status": "up",
- "latency_ms": 0,
- "message": "string",
- "checked_at": 0
}Returns raw check result records, newest first, with 30-day retention.
| id required | string Service ID |
| limit | integer [ 1 .. 1000 ] Default: 100 Maximum number of records to return (default 100, max 1000) |
| before | integer Return only records with |
[- {
- "id": 0,
- "service_id": "string",
- "status": "up",
- "latency_ms": 0,
- "message": "string",
- "checked_at": 0,
- "in_maintenance": 0
}
]Returns daily average latency data. Today's row is refreshed on read.
| id required | string Service ID |
| days | integer [ 1 .. 365 ] Default: 30 Number of days to return (default 30, max 365) |
[- {
- "date": "2019-08-24",
- "avg_latency_ms": 0
}
][- {
- "id": "string",
- "slug": "string",
- "title": "string",
- "description": "string",
- "isDefault": true,
- "isPublic": true,
- "displayOrder": 0,
- "createdAt": 0,
- "updatedAt": 0,
- "serviceCount": 0
}
]id, slug, and title are required. Slug must be lowercase alphanumeric,
hyphens, or underscores, max 40 characters, and not a reserved word
(admin, api, public, p, theme.css, favicon.svg).
| id required | string^[a-z0-9\-_]+$ |
| slug required | string <= 40 characters ^[a-z0-9\-_]+$ |
| title required | string [ 1 .. 120 ] characters |
| description | string Default: "" |
| logoUrl | string or null <uri> |
| isDefault | boolean Default: false |
| isPublic | boolean Default: true |
| displayOrder | integer >= 0 Default: 1000 |
{- "id": "string",
- "slug": "string",
- "title": "string",
- "description": "",
- "isDefault": false,
- "isPublic": true,
- "displayOrder": 1000
}{- "id": "string",
- "slug": "string",
- "title": "string",
- "description": "string",
- "isDefault": true,
- "isPublic": true,
- "displayOrder": 0,
- "createdAt": 0,
- "updatedAt": 0
}{- "id": "string",
- "slug": "string",
- "title": "string",
- "description": "string",
- "isDefault": true,
- "isPublic": true,
- "displayOrder": 0,
- "createdAt": 0,
- "updatedAt": 0,
- "serviceCount": 0
}Partial update — only provided fields are changed.
Setting isDefault: false on the current default page is rejected; set another
page as default first. Setting logoUrl to an empty string clears it.
| id required | string Status page ID |
| slug | string <= 40 characters ^[a-z0-9\-_]+$ |
| title | string [ 1 .. 120 ] characters |
| description | string |
| logoUrl | string or null <uri> |
| isDefault | boolean |
| isPublic | boolean |
| displayOrder | integer >= 0 |
{- "slug": "string",
- "title": "string",
- "description": "string",
- "isDefault": true,
- "isPublic": true,
- "displayOrder": 0
}{- "id": "string",
- "slug": "string",
- "title": "string",
- "description": "string",
- "isDefault": true,
- "isPublic": true,
- "displayOrder": 0,
- "createdAt": 0,
- "updatedAt": 0
}Cannot delete the default page or a page that has services attached. Reassign or unlist services first, and set another page as default.
| id required | string Status page ID |
{- "error": "string",
- "issues": [
- { }
], - "reason": "string"
}Returns all incidents, or filter by resolution state. Timestamps are raw Unix seconds.
| resolved | string Enum: "true" "false" Filter by resolution state. Omit to return all. |
[- {
- "id": 0,
- "service_id": "string",
- "status": "down",
- "started_at": 0,
- "resolved_at": 0,
- "cause": "string",
- "resolved_by": "string"
}
]Returns all maintenance windows grouped by group_id. Timestamps are raw Unix seconds.
[- {
- "group_id": "string",
- "service_ids": [
- "string"
], - "service_names": [
- "string"
], - "label": "string",
- "starts_at": 0,
- "ends_at": 0
}
]Schedules a maintenance window for one or more services under a shared group ID.
| serviceIds required | Array of strings non-empty IDs of services to include in this maintenance window |
| label required | string non-empty Human-readable label for the maintenance window |
| startsAt required | integer Unix seconds when the maintenance window begins |
| endsAt required | integer Unix seconds when the maintenance window ends (must be after startsAt) |
{- "serviceIds": [
- "string"
], - "label": "string",
- "startsAt": 0,
- "endsAt": 0
}{- "group_id": "string"
}Updates all windows in the group. Omitted fields retain their current values.
| id required | string Maintenance group ID |
| serviceIds | Array of strings non-empty |
| label | string non-empty |
| startsAt | integer Unix seconds |
| endsAt | integer Unix seconds (must be after startsAt) |
{- "serviceIds": [
- "string"
], - "label": "string",
- "startsAt": 0,
- "endsAt": 0
}{- "ok": true
}Returns all announcements (up to 200), newest first. Timestamps are raw Unix seconds.
[- {
- "id": 0,
- "severity": "info",
- "title": "string",
- "body_markdown": "string",
- "starts_at": 0,
- "ends_at": 0,
- "resolved_at": 0,
- "created_at": 0,
- "updated_at": 0,
- "page_ids": [
- "string"
]
}
]Creates a new announcement and associates it with one or more status pages. At least one page ID is required.
| pageIds required | Array of strings non-empty IDs of pages this announcement should appear on |
| severity required | string (AnnouncementSeverity) Enum: "info" "incident" "maintenance" |
| title required | string non-empty |
| bodyMarkdown | string or null Optional body text in Markdown format |
| startsAt required | integer Unix seconds when the announcement becomes visible |
| endsAt | integer or null Unix seconds when the announcement expires (null = no expiry) |
{- "pageIds": [
- "string"
], - "severity": "info",
- "title": "string",
- "bodyMarkdown": "string",
- "startsAt": 0,
- "endsAt": 0
}{- "id": 0
}Partial update. Omitted fields retain their current values. Providing pageIds replaces the page list entirely.
| id required | integer Announcement ID |
| pageIds | Array of strings non-empty |
| severity | string (AnnouncementSeverity) Enum: "info" "incident" "maintenance" |
| title | string non-empty |
| bodyMarkdown | string or null |
| startsAt | integer Unix seconds |
| endsAt | integer or null Unix seconds |
{- "pageIds": [
- "string"
], - "severity": "info",
- "title": "string",
- "bodyMarkdown": "string",
- "startsAt": 0,
- "endsAt": 0
}{- "ok": true
}Returns audit log entries, newest first. Timestamps are raw Unix seconds.
| limit | integer Default: 100 Maximum number of entries to return (default 100) |
| offset | integer Default: 0 Number of entries to skip (for pagination) |
| action | string Filter by action name (exact match, e.g. service.create) |
[- {
- "id": 0,
- "actor": "string",
- "action": "string",
- "target_type": "string",
- "target_id": "string",
- "details": { },
- "created_at": 0
}
]Returns all API tokens. Plaintext token values are never returned after creation. Requires session auth — API tokens cannot access this endpoint.
[- {
- "id": 0,
- "name": "string",
- "scope": "read",
- "created_at": 0
}
]Creates a new API token with read or write scope. The plaintext token is
returned exactly once in the response — store it immediately.
Requires session auth — API tokens cannot create other tokens.
| name required | string non-empty Human-readable label for this token |
| scope required | string Enum: "read" "write" read — GET requests only. write — all HTTP methods. Neither scope allows access to /api/admin/api-tokens, /api/admin/2fa, or PUT /api/admin/config. |
{- "name": "string",
- "scope": "read"
}{- "id": 0,
- "name": "string",
- "scope": "read",
- "created_at": 0,
- "token": "string"
}Generates a new TOTP secret, stores it as pending (not yet enabled), and
returns the secret with a QR code data URL for scanning in an authenticator app.
Call POST /api/admin/2fa/verify-and-enable after scanning to complete enrollment.
Requires session auth.
{- "secret": "string",
- "otpUrl": "string",
- "qrDataUrl": "string"
}Verifies a TOTP code against the pending secret and enables 2FA. Returns 8
single-use recovery codes — shown exactly once. Store them securely.
Requires session auth. Call POST /api/admin/2fa/setup first.
| code required | string 6-digit TOTP code from the authenticator app |
{- "code": "string"
}{- "recoveryCodes": [
- "string",
- "string",
- "string",
- "string",
- "string",
- "string",
- "string",
- "string"
]
}Disables 2FA after verifying the admin password and a current TOTP code. Also invalidates all existing sessions, forcing a fresh login. Requires session auth.
| password required | string Current admin password |
| code required | string Current 6-digit TOTP code |
{- "password": "string",
- "code": "string"
}{- "error": "string",
- "issues": [
- { }
], - "reason": "string"
}Returns the current config. adminPassword and sessionSecret are always
redacted from the response.
{- "server": {
- "port": 0,
- "host": "string"
}, - "database": {
- "path": "string"
}, - "alerts": {
- "discord": {
- "webhookUrl": "string"
}, - "destinations": [
- { }
], - "digest": {
- "enabled": true,
- "windowMs": 0
}
}, - "statusPage": {
- "title": "string",
- "description": "string",
- "refreshInterval": 0,
- "logoUrl": "string",
- "theme": {
- "property1": "string",
- "property2": "string"
}
}
}Replaces the configuration. Fields not provided are reset to defaults.
Empty strings for adminPassword and sessionSecret preserve the existing values.
Changing adminPassword invalidates all existing sessions.
Note: Only server.adminPassword, server.sessionSecret, and
alerts.discord.webhookUrl support ${VAR} environment variable interpolation
in the config file.
| property name* additional property | any |
{ }{- "ok": true
}