API reference
Base URL: https://upheron.com/api/v1. Send your token as X-API-Key (see Authentication). Requests and responses are JSON; lists come back as {"data": [...]}. The machine-readable version of this page is /openapi.json.
Operations marked Paid can answer 402 Payment Required with an MPP challenge; see Payments. Everything else is free within the rate limits.
Account
GET /account
Plan slots, credit and prices
Responses: 200, 401, 429.
curl -X GET https://upheron.com/api/v1/account \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
PUT /account/billing
Set invoice details (name, address, country, VAT number)
| Body field | Type | Notes |
|---|---|---|
billing_name |
string,null | |
billing_address |
string,null | |
billing_country |
string,null | ISO 3166-1 alpha-2, decides the VAT treatment. |
billing_vat_id |
string,null | EU VAT number with country prefix; enables the reverse charge for EU businesses outside Bulgaria. |
Responses: 200, 401, 403, 422, 429.
curl -X PUT https://upheron.com/api/v1/account/billing \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"billing_country": "DE", "billing_vat_id": "DE123456789"}'
GET /account/credit
Credit movements, newest first
Responses: 200, 401, 429.
curl -X GET https://upheron.com/api/v1/account/credit \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
GET /alert-channels
Notification contacts
Responses: 200, 401, 429.
curl -X GET https://upheron.com/api/v1/alert-channels \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
POST /alert-channels
Add a notification contact (email contacts must confirm a link first)
| Body field | Type | Notes |
|---|---|---|
name (required) |
string | |
kind (required) |
string | |
destination (required) |
string | Email address or URL. |
Responses: 201, 401, 403, 422, 429.
curl -X POST https://upheron.com/api/v1/alert-channels \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Ops", "kind": "email", "destination": "[email protected]"}'
DELETE /alert-channels/{id}
Remove a notification contact
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
Responses: 204, 401, 403, 404, 429.
curl -X DELETE https://upheron.com/api/v1/alert-channels/$ID \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
POST /alert-channels/{id}/test
Send a test alert
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
Responses: 200, 401, 403, 404, 422, 429.
curl -X POST https://upheron.com/api/v1/alert-channels/$ID/test \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
Monitors
GET /locations
Monitoring locations you can choose
Responses: 200, 401, 429.
curl -X GET https://upheron.com/api/v1/locations \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
GET /monitors
Every monitor and its current status
Responses: 200, 401, 429.
curl -X GET https://upheron.com/api/v1/monitors \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
POST /monitors
Create a monitor (paid when no plan slot is free, or without an account) · Paid · token optional
Free while the plan has a free monitor slot. Otherwise costs the per-location price for 30 days (billing_period: monthly) or ten times that for life (lifetime), taken from credit; if credit is short the response is 402 with an MPP challenge for the difference. Ask POST /monitors/quote first to see the price.
Without an API token the request is always paid (agent-plan limits: 60-second minimum interval, no group monitors). After payment the 201 response also contains api_key and workspace: a new pay-as-you-go workspace that owns the monitor. The key is shown once.
| Parameter | In | Notes |
|---|---|---|
Idempotency-Key |
header | Repeating a request with the same key within 24 hours returns the monitor the first request created, without charging again. |
| Body field | Type | Notes |
|---|---|---|
name (required) |
string | Shown in alerts and on status pages. |
kind |
http, api, ssl, domain, dns, blacklist, email_auth, malware, tcp, ssh, smtp, imap, pop, ftps, ping, ntp, udp, minecraft, transaction, micro_transaction, extended_transaction, group, cloud_status, page_speed, webhook, heartbeat, repository |
What to check. heartbeat and webhook wait for your calls instead of probing. repository reads a GitHub or GitLab repository's dependency manifests daily and alerts on vulnerabilities in them, on every plan; put the repository URL in url (optionally …/tree/branch/folder) and, for a private repository (Pro plan or a paid monitor), an access token in check_options.token. Default "http". |
url |
string | URL, or host[:port] for network checks. |
method |
GET, HEAD, POST, PUT, PATCH, DELETE |
Default "GET". |
interval_seconds |
integer | Seconds between checks. Paid monitors may use 10 or more on any plan; monitors in plan slots follow the plan (300 on Free, 10 on Pro). Default 300. |
timeout_ms |
integer | Default 10000. |
locations |
array | Location codes from GET /locations. Defaults to the first location. |
expected_status_min |
integer | Default 200. |
expected_status_max |
integer | Default 399. |
keyword |
string | Text the response body must contain. |
request_headers |
object | Sent with the check; stored encrypted and never returned. |
request_body |
string | |
check_options |
object | Kind-specific options, such as json_path/expected_value for api, steps for transactions, warn_days for ssl. Ports go in url as host:port. See /docs/api#check-options. |
failure_threshold |
integer | Failed checks in a row before an incident opens. The default alerts on the first failed check. Default 1. |
recovery_threshold |
integer | Default 2. |
confirmation_threshold |
integer | Locations that must agree a check failed. Default 1. |
heartbeat_grace_seconds |
integer | For heartbeat and webhook monitors. |
expiry_alerts |
boolean | http and api monitors: check the domain registration and (for HTTPS) the TLS certificate daily. Domain alerts come 30, 14, 7, 3 and 1 days before expiry; certificate alerts only once automatic renewal should have happened (a sixth of the certificate's lifetime, at most 14 days). Uses no extra monitor. Default true. |
vulnerability_alerts |
boolean | Paid plans, http and api monitors: scan the website weekly for the software it runs and alert on newly published vulnerabilities in it (OSV.dev with the GitHub Advisory Database, NVD, new CVE records, CISA KEV, endoflife.date). Default false. |
vulnerability_severity |
low, medium, high, critical |
The lowest severity that alerts. Actively exploited vulnerabilities and releases reaching end of support always alert. Default "low". |
charts |
both, uptime, response |
Charts on public status pages: uptime bars (the last 90 days, or the whole history), the last 24 hours of response time, or both. Default "both". |
alert_channel_ids |
array | Notification contacts to alert. Defaults to all of the workspace's contacts. |
billing_period |
monthly, lifetime |
Only for paid monitors (no free plan slot). monthly costs the per-location price every 30 days, renewed from credit; lifetime costs ten times that once and never renews. Default "monthly". |
Responses: 200, 201, 401, 402, 403, 422, 429.
curl -X POST https://upheron.com/api/v1/monitors \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Example", "url": "https://example.com"}'
POST /monitors/quote
Price a monitor without creating it
| Parameter | In | Notes |
|---|---|---|
Idempotency-Key |
header | Repeating a request with the same key within 24 hours returns the monitor the first request created, without charging again. |
| Body field | Type | Notes |
|---|---|---|
name (required) |
string | Shown in alerts and on status pages. |
kind |
http, api, ssl, domain, dns, blacklist, email_auth, malware, tcp, ssh, smtp, imap, pop, ftps, ping, ntp, udp, minecraft, transaction, micro_transaction, extended_transaction, group, cloud_status, page_speed, webhook, heartbeat, repository |
What to check. heartbeat and webhook wait for your calls instead of probing. repository reads a GitHub or GitLab repository's dependency manifests daily and alerts on vulnerabilities in them, on every plan; put the repository URL in url (optionally …/tree/branch/folder) and, for a private repository (Pro plan or a paid monitor), an access token in check_options.token. Default "http". |
url |
string | URL, or host[:port] for network checks. |
method |
GET, HEAD, POST, PUT, PATCH, DELETE |
Default "GET". |
interval_seconds |
integer | Seconds between checks. Paid monitors may use 10 or more on any plan; monitors in plan slots follow the plan (300 on Free, 10 on Pro). Default 300. |
timeout_ms |
integer | Default 10000. |
locations |
array | Location codes from GET /locations. Defaults to the first location. |
expected_status_min |
integer | Default 200. |
expected_status_max |
integer | Default 399. |
keyword |
string | Text the response body must contain. |
request_headers |
object | Sent with the check; stored encrypted and never returned. |
request_body |
string | |
check_options |
object | Kind-specific options, such as json_path/expected_value for api, steps for transactions, warn_days for ssl. Ports go in url as host:port. See /docs/api#check-options. |
failure_threshold |
integer | Failed checks in a row before an incident opens. The default alerts on the first failed check. Default 1. |
recovery_threshold |
integer | Default 2. |
confirmation_threshold |
integer | Locations that must agree a check failed. Default 1. |
heartbeat_grace_seconds |
integer | For heartbeat and webhook monitors. |
expiry_alerts |
boolean | http and api monitors: check the domain registration and (for HTTPS) the TLS certificate daily. Domain alerts come 30, 14, 7, 3 and 1 days before expiry; certificate alerts only once automatic renewal should have happened (a sixth of the certificate's lifetime, at most 14 days). Uses no extra monitor. Default true. |
vulnerability_alerts |
boolean | Paid plans, http and api monitors: scan the website weekly for the software it runs and alert on newly published vulnerabilities in it (OSV.dev with the GitHub Advisory Database, NVD, new CVE records, CISA KEV, endoflife.date). Default false. |
vulnerability_severity |
low, medium, high, critical |
The lowest severity that alerts. Actively exploited vulnerabilities and releases reaching end of support always alert. Default "low". |
charts |
both, uptime, response |
Charts on public status pages: uptime bars (the last 90 days, or the whole history), the last 24 hours of response time, or both. Default "both". |
alert_channel_ids |
array | Notification contacts to alert. Defaults to all of the workspace's contacts. |
billing_period |
monthly, lifetime |
Only for paid monitors (no free plan slot). monthly costs the per-location price every 30 days, renewed from credit; lifetime costs ten times that once and never renews. Default "monthly". |
Responses: 200, 401, 403, 422, 429.
curl -X POST https://upheron.com/api/v1/monitors/quote \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Example", "url": "https://example.com"}'
GET /monitors/{id}
A monitor with uptime, recent results, 90 daily bars, its whole history and incidents
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
Responses: 200, 401, 404, 429.
curl -X GET https://upheron.com/api/v1/monitors/$ID \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
PATCH /monitors/{id}
Change a monitor (adding locations to a paid monitor is paid) · Paid
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
| Body field | Type | Notes |
|---|---|---|
name (required) |
string | Shown in alerts and on status pages. |
kind |
http, api, ssl, domain, dns, blacklist, email_auth, malware, tcp, ssh, smtp, imap, pop, ftps, ping, ntp, udp, minecraft, transaction, micro_transaction, extended_transaction, group, cloud_status, page_speed, webhook, heartbeat, repository |
What to check. heartbeat and webhook wait for your calls instead of probing. repository reads a GitHub or GitLab repository's dependency manifests daily and alerts on vulnerabilities in them, on every plan; put the repository URL in url (optionally …/tree/branch/folder) and, for a private repository (Pro plan or a paid monitor), an access token in check_options.token. Default "http". |
url |
string | URL, or host[:port] for network checks. |
method |
GET, HEAD, POST, PUT, PATCH, DELETE |
Default "GET". |
interval_seconds |
integer | Seconds between checks. Paid monitors may use 10 or more on any plan; monitors in plan slots follow the plan (300 on Free, 10 on Pro). Default 300. |
timeout_ms |
integer | Default 10000. |
locations |
array | Location codes from GET /locations. Defaults to the first location. |
expected_status_min |
integer | Default 200. |
expected_status_max |
integer | Default 399. |
keyword |
string | Text the response body must contain. |
request_headers |
object | Sent with the check; stored encrypted and never returned. |
request_body |
string | |
check_options |
object | Kind-specific options, such as json_path/expected_value for api, steps for transactions, warn_days for ssl. Ports go in url as host:port. See /docs/api#check-options. |
failure_threshold |
integer | Failed checks in a row before an incident opens. The default alerts on the first failed check. Default 1. |
recovery_threshold |
integer | Default 2. |
confirmation_threshold |
integer | Locations that must agree a check failed. Default 1. |
heartbeat_grace_seconds |
integer | For heartbeat and webhook monitors. |
expiry_alerts |
boolean | http and api monitors: check the domain registration and (for HTTPS) the TLS certificate daily. Domain alerts come 30, 14, 7, 3 and 1 days before expiry; certificate alerts only once automatic renewal should have happened (a sixth of the certificate's lifetime, at most 14 days). Uses no extra monitor. Default true. |
vulnerability_alerts |
boolean | Paid plans, http and api monitors: scan the website weekly for the software it runs and alert on newly published vulnerabilities in it (OSV.dev with the GitHub Advisory Database, NVD, new CVE records, CISA KEV, endoflife.date). Default false. |
vulnerability_severity |
low, medium, high, critical |
The lowest severity that alerts. Actively exploited vulnerabilities and releases reaching end of support always alert. Default "low". |
charts |
both, uptime, response |
Charts on public status pages: uptime bars (the last 90 days, or the whole history), the last 24 hours of response time, or both. Default "both". |
alert_channel_ids |
array | Notification contacts to alert. Defaults to all of the workspace's contacts. |
billing_period |
monthly, lifetime |
Only for paid monitors (no free plan slot). monthly costs the per-location price every 30 days, renewed from credit; lifetime costs ten times that once and never renews. Default "monthly". |
Responses: 200, 401, 402, 403, 404, 422, 429.
curl -X PATCH https://upheron.com/api/v1/monitors/$ID \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Example", "url": "https://example.com"}'
DELETE /monitors/{id}
Delete a monitor (frees its plan slot; paid monitors are not refunded)
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
Responses: 204, 401, 403, 404, 429.
curl -X DELETE https://upheron.com/api/v1/monitors/$ID \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
POST /monitors/{id}/quote
Price a monitor change without applying it
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
| Body field | Type | Notes |
|---|---|---|
name (required) |
string | Shown in alerts and on status pages. |
kind |
http, api, ssl, domain, dns, blacklist, email_auth, malware, tcp, ssh, smtp, imap, pop, ftps, ping, ntp, udp, minecraft, transaction, micro_transaction, extended_transaction, group, cloud_status, page_speed, webhook, heartbeat, repository |
What to check. heartbeat and webhook wait for your calls instead of probing. repository reads a GitHub or GitLab repository's dependency manifests daily and alerts on vulnerabilities in them, on every plan; put the repository URL in url (optionally …/tree/branch/folder) and, for a private repository (Pro plan or a paid monitor), an access token in check_options.token. Default "http". |
url |
string | URL, or host[:port] for network checks. |
method |
GET, HEAD, POST, PUT, PATCH, DELETE |
Default "GET". |
interval_seconds |
integer | Seconds between checks. Paid monitors may use 10 or more on any plan; monitors in plan slots follow the plan (300 on Free, 10 on Pro). Default 300. |
timeout_ms |
integer | Default 10000. |
locations |
array | Location codes from GET /locations. Defaults to the first location. |
expected_status_min |
integer | Default 200. |
expected_status_max |
integer | Default 399. |
keyword |
string | Text the response body must contain. |
request_headers |
object | Sent with the check; stored encrypted and never returned. |
request_body |
string | |
check_options |
object | Kind-specific options, such as json_path/expected_value for api, steps for transactions, warn_days for ssl. Ports go in url as host:port. See /docs/api#check-options. |
failure_threshold |
integer | Failed checks in a row before an incident opens. The default alerts on the first failed check. Default 1. |
recovery_threshold |
integer | Default 2. |
confirmation_threshold |
integer | Locations that must agree a check failed. Default 1. |
heartbeat_grace_seconds |
integer | For heartbeat and webhook monitors. |
expiry_alerts |
boolean | http and api monitors: check the domain registration and (for HTTPS) the TLS certificate daily. Domain alerts come 30, 14, 7, 3 and 1 days before expiry; certificate alerts only once automatic renewal should have happened (a sixth of the certificate's lifetime, at most 14 days). Uses no extra monitor. Default true. |
vulnerability_alerts |
boolean | Paid plans, http and api monitors: scan the website weekly for the software it runs and alert on newly published vulnerabilities in it (OSV.dev with the GitHub Advisory Database, NVD, new CVE records, CISA KEV, endoflife.date). Default false. |
vulnerability_severity |
low, medium, high, critical |
The lowest severity that alerts. Actively exploited vulnerabilities and releases reaching end of support always alert. Default "low". |
charts |
both, uptime, response |
Charts on public status pages: uptime bars (the last 90 days, or the whole history), the last 24 hours of response time, or both. Default "both". |
alert_channel_ids |
array | Notification contacts to alert. Defaults to all of the workspace's contacts. |
billing_period |
monthly, lifetime |
Only for paid monitors (no free plan slot). monthly costs the per-location price every 30 days, renewed from credit; lifetime costs ten times that once and never renews. Default "monthly". |
Responses: 200, 401, 403, 404, 422, 429.
curl -X POST https://upheron.com/api/v1/monitors/$ID/quote \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Example", "url": "https://example.com"}'
POST /monitors/{id}/renew
Renew a monthly paid monitor for 30 more days · Paid
Renewals happen automatically every hour from credit. Call this to renew early (the 30 days are added to the remaining time) or to resume a monitor that was paused for non-payment. Pays from credit, or answers 402 with an MPP challenge.
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
Responses: 200, 401, 402, 403, 404, 422, 429.
curl -X POST https://upheron.com/api/v1/monitors/$ID/renew \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Example", "url": "https://example.com"}'
POST /monitors/{id}/renew/quote
Price a renewal
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
Responses: 200, 401, 403, 404, 422, 429.
curl -X POST https://upheron.com/api/v1/monitors/$ID/renew/quote \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
POST /monitors/{id}/pause
Stop checking
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
Responses: 200, 401, 403, 404, 429.
curl -X POST https://upheron.com/api/v1/monitors/$ID/pause \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
POST /monitors/{id}/resume
Start checking again
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
Responses: 200, 401, 403, 404, 429.
curl -X POST https://upheron.com/api/v1/monitors/$ID/resume \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
Vulnerabilities
GET /monitors/{id}/vulnerabilities
Findings in the website's software (exploited and most severe first) and the software they were matched on
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
Responses: 200, 401, 404, 429.
curl -X GET https://upheron.com/api/v1/monitors/$ID/vulnerabilities \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
POST /monitors/{id}/vulnerabilities/scan
Scan the website for its software and check it now instead of waiting for the weekly scan
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
Responses: 202, 401, 402, 403, 404, 422, 429.
curl -X POST https://upheron.com/api/v1/monitors/$ID/vulnerabilities/scan \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
POST /monitors/{id}/vulnerabilities/{finding_id}/fixed
Record that a finding's software was upgraded: to version, or by default to the first version that fixes it; the monitor is checked again
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
finding_id (required) |
path | string |
| Body field | Type | Notes |
|---|---|---|
version |
string | The version installed; defaults to the finding's fix_version. |
Responses: 200, 401, 402, 403, 404, 422, 429.
curl -X POST https://upheron.com/api/v1/monitors/$ID/vulnerabilities/{finding_id}/fixed \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Example", "url": "https://example.com"}'
POST /monitors/{id}/software
Add software the website runs, by name (Debian, nginx), package (npm:lodash, wp-plugin:slug) or NVD product (cpe:vendor:product)
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
| Body field | Type | Notes |
|---|---|---|
name (required) |
string | |
version |
string,null |
Responses: 201, 401, 402, 403, 404, 422, 429.
curl -X POST https://upheron.com/api/v1/monitors/$ID/software \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Debian", "version": "12"}'
POST /monitors/{id}/software/import
Import a manifest, lockfile, Dockerfile, Compose file or a plain list (one "name version" per line); importing a filename again replaces what it added
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
| Body field | Type | Notes |
|---|---|---|
content (required) |
string | The file's text, or the list. |
filename |
string | Tells the format; leave out for a plain list. |
name |
string | Labels the import; importing under the same label again replaces it. Defaults to the filename, or "software list" for a list. |
Responses: 200, 401, 402, 403, 404, 422, 429.
curl -X POST https://upheron.com/api/v1/monitors/$ID/software/import \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content": "Debian 12\nnginx 1.24.0\nPHP 8.2.12\nwp-plugin:woocommerce 9.3.3"}'
DELETE /monitors/{id}/software/import
Remove everything a file imported
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
file (required) |
query | string |
Responses: 200, 401, 402, 403, 404, 422, 429.
curl -X DELETE https://upheron.com/api/v1/monitors/$ID/software/import \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
PATCH /monitors/{id}/software/{software_id}
Set an entry's version (it then counts as added by hand), or ignore or restore it
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
software_id (required) |
path | string |
| Body field | Type | Notes |
|---|---|---|
version |
string,null | |
ignored |
boolean |
Responses: 200, 401, 402, 403, 404, 422, 429.
curl -X PATCH https://upheron.com/api/v1/monitors/$ID/software/$SOFTWARE_ID \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"version": "1.24.0"}'
DELETE /monitors/{id}/software/{software_id}
Remove an entry; software the scan found is ignored instead, so it is not added back
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
software_id (required) |
path | string |
Responses: 200, 401, 402, 403, 404, 422, 429.
curl -X DELETE https://upheron.com/api/v1/monitors/$ID/software/$SOFTWARE_ID \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
GET /software-catalog
Software known by name; any package (npm:, composer:, pypi:, gem:, go:, maven:, nuget:, cargo:), wp-plugin:/wp-theme: slug or cpe:vendor:product works too
Responses: 200, 401, 429.
curl -X GET https://upheron.com/api/v1/software-catalog \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
Results
GET /monitors/{id}/results
Recent check results, newest first
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
limit |
query | integer |
Responses: 200, 401, 404, 429.
curl -X GET https://upheron.com/api/v1/monitors/$ID/results \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
GET /monitors/{id}/uptime
Daily uptime for any range, kept for as long as the monitor
One entry per UTC day, oldest first. Without from and to, every day from the first check (since) to today. At most 3660 days per request.
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
from |
query | string |
to |
query | string |
Responses: 200, 401, 404, 422, 429.
curl -X GET https://upheron.com/api/v1/monitors/$ID/uptime \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
GET /incidents
Incidents, newest first
Responses: 200, 401, 429.
curl -X GET https://upheron.com/api/v1/incidents \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
GET /incidents/{id}
One incident with its events
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
Responses: 200, 401, 404, 429.
curl -X GET https://upheron.com/api/v1/incidents/$ID \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
POST /incidents/{id}/acknowledge
Acknowledge an incident
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
Responses: 200, 401, 403, 404, 429.
curl -X POST https://upheron.com/api/v1/incidents/$ID/acknowledge \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
Payments
POST /credits
Buy prepaid credit with MPP · Paid
Always answered with 402 and an MPP challenge for amount_cents until paid. Cards (Stripe shared payment tokens) need at least $0.50.
| Body field | Type | Notes |
|---|---|---|
amount_cents (required) |
integer |
Responses: 200, 401, 402, 403, 422, 429, 503.
curl -X POST https://upheron.com/api/v1/credits \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"amount_cents": 500}'
GET /payments
Payments, newest first
Responses: 200, 401, 429.
curl -X GET https://upheron.com/api/v1/payments \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
GET /payments/{id}
One payment
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
Responses: 200, 401, 404, 429.
curl -X GET https://upheron.com/api/v1/payments/$ID \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
GET /payments/{id}/receipt
Receipt with seller and VAT details (JSON, or Markdown with Accept: text/markdown)
| Parameter | In | Notes |
|---|---|---|
id (required) |
path | string |
Responses: 200, 401, 404, 429.
curl -X GET https://upheron.com/api/v1/payments/$ID/receipt \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY"
Check options
check_options carries the settings specific to a monitor kind. The most common:
| Kind | Options |
|---|---|
http, api |
json_path (dot-separated) and expected_value (JSON), max_latency_ms (100–60000), headers_only (http only: stop after the response headers; ignored with keyword or json_path) |
transaction, micro_transaction, extended_transaction |
steps: up to 5, 3 or 10 HTTP requests, each with url, method, headers, body, keyword, expected_status_min, expected_status_max, json_path, expected_value, max_latency_ms |
ssl, domain |
warn_days (1–365): fail this many days before expiry |
dns |
record_type (A, AAAA, CNAME, MX, TXT, NS, SOA, SRV) and an optional expected_answer |
blacklist |
dnsbl_zone: the provider's query zone; lookup: domain (default, a domain list), mail_servers (the IPv4 addresses of the domain's MX servers) or host (the target's own IPv4 addresses), for IP lists |
email_auth |
dkim_selectors (up to 10, for example ["google"]) and dmarc_policy (none, quarantine or reject: the weakest policy that passes). url is the sending domain |
smtp, imap, pop, ftps |
security: tls (from the start) or starttls |
udp |
payload_base64 (1–512 bytes) and an optional expected_text |
minecraft |
edition: java (default; TCP, the SRV record or port 25565) or bedrock (UDP, port 19132) |
group |
member_ids (monitors in the same workspace) and group_policy (all or any) |
page_speed |
api_key (Google PageSpeed Insights), strategy (mobile or desktop), minimum_score (0–100) |
malware |
api_key (Google Web Risk) |
Network checks (tcp, ssh, mail, ftps, ntp, udp, minecraft, ssl) take host or host:port in url; tcp and udp need the port.
http and api monitors alert 30, 14, 7, 3 and 1 days before their domain registration expires and, for HTTPS, before their TLS certificate expires without having been renewed: certificate alerts start at a sixth of the certificate's lifetime, at most 14 days ahead, after automatic renewal (Let's Encrypt, Cloudflare) should have happened. Send "expiry_alerts": false to turn both off. The monitor reports domain_name, domain_expires_at, cert_issuer and cert_expires_at after the daily checks.
On paid plans, http and api monitors can also alert on vulnerabilities in the software their website runs: send "vulnerability_alerts": true, and optionally "vulnerability_severity" (low, the default, medium, high or critical) for the lowest severity that alerts. Actively exploited vulnerabilities and releases reaching end of support always alert. Free plans get 422 with plan_required.
The software is found by a weekly scan of the website (POST /monitors/{id}/vulnerabilities/scan runs one now) and can be told directly: POST /monitors/{id}/software/import takes a file's text and optional filename (package.json, package-lock.json, yarn.lock, pnpm-lock.yaml, composer.json/.lock, requirements.txt, Pipfile.lock, poetry.lock, Gemfile.lock, go.mod, Cargo.lock, pom.xml, .csproj, Dockerfile, docker-compose.yml, .nvmrc, .tool-versions) or a plain list with one name version per line, such as Debian 12, nginx 1.24.0 or npm:lodash 4.17.21 (format and supported files). POST /monitors/{id}/software adds one entry. GET /monitors/{id}/vulnerabilities returns the software and the findings: exploited and most severe first, each with severity, fixed_in, fix_version (the first version that fixes it), exploited_on (CISA's exploited list) and version_known (false when the advisory only may apply). After upgrading, POST /monitors/{id}/vulnerabilities/{finding_id}/fixed records the new version (by default fix_version, or {"version": "…"}) and checks again. These endpoints answer 402 with plan_required on plans without vulnerability alerts.
A heartbeat monitor's heartbeat_url takes a GET or POST after each successful run. Add /fail to the URL to report a failed run: the incident opens at once instead of after the failure threshold.
Invalid options are reported as 422 with the offending fields.
Notification contacts
A workspace alerts its notification contacts when a monitor goes down and recovers. Add them with POST /api/v1/alert-channels:
curl https://upheron.com/api/v1/alert-channels \
-H "X-API-Key: $UPTIME_MONITOR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Ops", "kind": "email", "destination": "[email protected]"}'
An email contact receives a confirmation link and is alerted only after it is opened. New monitors alert every contact unless you pass alert_channel_ids. Pay-as-you-go workspaces can use email and webhook contacts.
Errors
Errors have a JSON body with a machine-readable error and a human-readable message; validation errors add fields.
{ "error": "validation_failed", "message": "Some fields are invalid.", "fields": { "url": ["can't be blank"] } }
| Status | Meaning |
|---|---|
| 400, 422 | The request is invalid; read error, message and fields |
| 401 | Missing, invalid, revoked or expired token |
| 402 | Payment required; see Payments |
| 403 | The token lacks the write scope |
| 404 | No such resource in this workspace |
| 429 | Rate limited; wait Retry-After seconds |
| 5xx | Temporary problem; retry with backoff (and an Idempotency-Key when creating) |