Import from UptimeRobot
Moving an existing UptimeRobot setup to KamuStatus: the importer reads your monitors, alert contacts and response-time history from the UptimeRobot API and creates matching monitors and channels in a kamustatus project.
Run the import
Dashboard: Monitor → project → Import.
- Source: UptimeRobot.
- Their API key: an UptimeRobot API key. The importer only reads, so the read-only key from UptimeRobot's API settings is enough. The key is passed to UptimeRobot for each step and not stored.
- Preview lists the monitors and the alert contacts that can be imported. All are selected; click to deselect.
- Backfill history: days of history to bring over, 0 to 365 (0 = none).
- Import.
The result line says how many monitors, channels and history points were imported. Nothing is deleted or paused on the UptimeRobot side; run both in parallel until you trust the new checks.
What gets imported
Monitors. Each selected monitor becomes a kamustatus monitor in the project:
| UptimeRobot | kamustatus |
|---|---|
| HTTP(s) | http, same URL and method |
| Keyword | http with the keyword as body-contains |
| Ping | ping |
| Port | tcp with the port |
| Heartbeat | heartbeat with a new ping URL |
| Anything else | http on the monitor's URL |
The interval is copied (30 s minimum), the expected status is set to 200 and
the timeout to 10 s.
Channels. Alert contacts of type email, Slack and webhook become notification channels. Other contact types are not offered.
History. Response times and down periods are stored as hourly uptime
rollups, so uptime charts and percentages cover the time before the move.
Imported hours are stored under a separate region, imported. History is matched to
kamustatus monitors by name, across every monitor in the project. Running
it again does not overwrite hours that are already there.
After the import
Check these by hand; the importer does not do them.
- Heartbeats need the new URL. UptimeRobot's heartbeat URL stops being
used. Open each imported heartbeat monitor (or
kamu status monitors show <id>) and point the job at the newhttps://api.kamustatus.com/ping/<token>. Imported heartbeats have no grace period; set one withkamu status monitors set <id> --grace <seconds>. - Add alert rules. Imported channels are not attached to any monitor.
Add rules on each monitor (Alert rules on the monitor page, or
kamu status alerts add). See alerts. - Recreate email channels. Imported email channels store the address in a
field the sender does not read, so they fail on the first alert. Create
email channels in the dashboard instead (or
PATCHthe channel'sconfigto{"addresses": ["ops@example.com"]}). - Webhook receivers get a new payload. Imported webhook channels post the kamustatus payload, not UptimeRobot's.
- Keyword monitors: UptimeRobot's "keyword not exists" becomes "must
contain". Prefix the keyword with
!to invert it. - Ping monitors are a TCP connect to port 80 here, not ICMP. Hosts that
answer ICMP only will show down; use
tcpon a port they do serve. - Importing monitors twice creates duplicates. Delete the extras from the project's monitor list (bulk select).
Other sources in the code
The Source list comes from the API and also offers Pingdom, StatusCake, Better Stack, Oh Dear and Uptime Kuma. These importers exist in the code but have not been checked against those services recently. Treat them as best effort.
| Source | Monitors | Channels | History | Credential |
|---|---|---|---|---|
| UptimeRobot | yes | email, Slack, webhook | yes | API key |
| Pingdom | yes | no | yes | API token |
| StatusCake | yes | contact groups, as email (first address) | yes | API key |
| Better Stack | yes | no | yes | API token |
| Oh Dear | yes | no | yes | API token |
| Uptime Kuma | yes | no | no | Backup JSON pasted into the key field |
API
The dashboard calls these through the front door. Each takes the provider's
key in the body; provider defaults to uptimerobot.
BASE=https://app.kamuhub.com/api/status
AUTH="Authorization: Bearer $KAMU_ACCESS_KEY"
curl "$BASE/import/providers" -H "$AUTH"
curl -X POST "$BASE/import/<project-id>/preview" -H "$AUTH" \
-H "Content-Type: application/json" -d '{"apiKey": "<uptimerobot-key>"}'
curl -X POST "$BASE/import/<project-id>/monitors" -H "$AUTH" \
-H "Content-Type: application/json" -d '{"apiKey": "<uptimerobot-key>", "monitorIds": ["123", "456"]}'
curl -X POST "$BASE/import/<project-id>/channels" -H "$AUTH" \
-H "Content-Type: application/json" -d '{"apiKey": "<uptimerobot-key>", "contactIds": ["789"]}'
curl -X POST "$BASE/import/<project-id>/history" -H "$AUTH" \
-H "Content-Type: application/json" -d '{"apiKey": "<uptimerobot-key>", "days": 90}'
Leaving out monitorIds or contactIds imports everything. The monitors call
returns heartbeatMappings (old URL, new ping URL per heartbeat), which the
dashboard does not show. days defaults to 90 and is capped at 365.