API
Read your monitors, their events and your contacts, add, change, pause, resume or delete monitors, schedule maintenance windows and manage status pages and domains, and read DNS records, from your own code - authentication, a first request, errors, paging and rate limits, and every endpoint.
Overview
Mon's REST API lets your own code read what Mon knows about your monitors: their state, what they watch, their uptime and their certificates and domains, and their events - each time one went down, came back up or was paused, how long for and why. It also reads your contacts: where alerts go and which ones each gets. A Slack contact's webhook URL is never returned, since anyone holding it can post to the channel. It's available on Team and Enterprise plans.
- Address:
https://api.mon.bot/v1 - Reference: every endpoint below, and also in ReDoc, drawn from the API's OpenAPI document - point a client generator at it to get a typed client.
- Format: JSON, with field names in camelCase and times in UTC (
2026-10-25T14:03:00Z). Units are in the names -intervalSeconds,timeoutMs. - Versioning: everything is under
/v1. A change that would break your code comes as/v2, and/v1keeps working.
It can also add, change, pause, resume and delete monitors of every type but synthetic, which are added in Mon, and manage maintenance windows, status pages and domains, if the token's owner may change them in the team.
Authentication
Create an access token in your account, under Settings › Access tokens, and send it with every request:
Authorization: Bearer YOUR_TOKEN
A token works for the team it was created in, with its owner's role there: one whose role can only view monitors can read through the API but not pause or delete. Treat it like a password: anyone with it can do whatever its owner could. Revoke one under Access tokens and it stops working within a minute.
A first request
curl https://api.mon.bot/v1/monitors?status=down \
-H "Authorization: Bearer YOUR_TOKEN"
{
"items": [
{
"id": "ba71e42f-0612-4cac-b4c7-2dceabba5d83",
"name": "acme.com",
"type": "http",
"status": "down",
"lastMessage": "Status Code: 503",
"intervalSeconds": 60,
"uptime": { "day": 99.31, "week": 99.9, "month": 99.97, "quarter": 99.98 }
}
],
"next": null
}
(Fields trimmed - every monitor carries the full set listed under Objects.)
Errors
The status code always says what happened: 200 for success, 4xx for a problem with the request, 5xx for a problem on Mon's side. Every error has the same shape - application/problem+json:
{
"type": "https://mon.bot/docs/api/errors#not-found",
"title": "No such monitor",
"status": 404,
"detail": "There's no monitor with that id in your account.",
"requestId": "0HNPI6U66JCC8:00000001"
}
| Status | type ends in | What happened |
|---|---|---|
| 400 | invalid-request | A parameter isn't valid - errors says which, and why |
| 401 | unauthorized | No token, or one that's expired or revoked |
| 403 | plan-required | Your plan doesn't include the API |
| 403 | forbidden | The token's owner can't make this change - their role only lets them view |
| 404 | not-found | No such thing in your account |
| 409 | conflict | It clashes with something there already - with uniqueName, a monitor of that type with that name |
| 422 | validation | Mon won't make the change - detail says why, such as a resume that would go over your plan's monitor limit |
| 429 | rate-limited | Too many requests - see below |
| 5xx | server-error | Something went wrong on Mon's side - try again |
Every response also carries an X-Request-Id header. Quote it if you write to support.
Paging
Lists come a page at a time - 50 items unless you set limit (1 to 100). When there's more, next holds the URL of the next page, with your filters kept; request it as it is. On the last page, next is null.
Adding and changing monitors
POST /v1/monitors adds a monitor. type and what it watches are all it needs:
type | Needs |
|---|---|
http, defacement | url |
keyword | url and keyword.text |
redirect | url and expectedUrl |
ping, ssl, trace-route | host |
port | host and port |
dns-record | host, the name to look up, and recordType (a unless you say) |
whois | domain |
dns-zone | domain, one whose zone was imported through an integration |
expiration | name and expiresOn, a date such as 2027-03-01 |
For example:
{
"type": "keyword",
"url": "https://example.com/checkout",
"keyword": { "text": "Add to cart" }
}
{ "type": "ssl", "host": "example.com", "certificate": { "alertDays": [30, 7, 1] } }
{ "type": "whois", "domain": "example.com", "alertDays": 30 }
It answers 201 with the monitor, and its address in the Location header. Everything left out takes the default the portal's own form starts with: checked every 5 minutes, waiting 10 seconds, named after what it watches. Redirect and defacement monitors start hourly, as often as they can run. SSL, WHOIS, DNS zone and expiration monitors are checked once a day with 30 seconds to answer, as in the portal, so they take no interval or timeout of their own; WHOIS and expiration monitors reach no server, so they take no locations or maintenance windows either, and redirect and defacement monitors load the page once in a browser, so they take no locations. A DNS record monitor added without expectedRecords takes whatever answers then as what should answer from then on. A field a type doesn't take is refused, naming it, and so is one the API doesn't take at all - a misspelt field is an error, not ignored. locations lists where it's checked from by name - virginia, new-york, dallas, california, sao-paulo, frankfurt, singapore - and an empty list lets Mon choose, which is recommended and what a monitor gets without it.
Names may repeat. To be sure of one, send "uniqueName": true: the add is refused with 409 when the team already has a monitor of that type with that name, and nothing is created - which also makes it safe to send an add again after a timeout. Monitors of other types may share the name either way.
PATCH /v1/monitors/{id} changes one. Send only what changes - a field left out stays as it is. A monitor's type can't change.
Header values, form values, the request body and the password can be set but are never read back, since they can carry secrets: a monitor read says only hasBody and hasPassword. To leave them as they are, leave them out.
Alerts
alerts says who a monitor alerts, and its mode always says which of three you mean:
"alerts": { "mode": "defaults" }
The contacts that are verified, switched on and have a default for this type of monitor, each with that default's timing - as a monitor added in the portal starts. This is what a monitor gets when you add it without alerts.
"alerts": { "mode": "none" }
No alerts at all.
"alerts": {
"mode": "contacts",
"contacts": [
{ "contactId": "6f1c…", "afterFailures": 2, "repeatTimes": 3, "repeatEveryChecks": 1 },
{ "contactId": "9a0e…" }
]
}
Exactly these contacts. A timing left out takes the contact's default for the monitor's type: afterFailures alerts on that many failed checks in a row (1 to 10), repeatTimes repeats the alert while it stays down (0 to 10), repeatEveryChecks spaces the repeats (1 to 10).
When changing a monitor, alerts left out leaves them as they are, defaults resets them to the defaults as they are now, none removes them, and contacts replaces the whole list. GET /v1/monitors/{id}/alerts lists them.
Maintenance windows
A maintenance window is a scheduled time when the monitors it applies to aren't checked, so planned work alerts no one. POST /v1/maintenance-windows adds one:
{ "name": "Weekly deploy", "schedule": "weekly", "startTime": "01:00", "daysOfWeek": ["sunday"], "durationMinutes": 30 }
schedule is once, daily, weekly or monthly. A once window starts at startsAt, a moment such as 2026-11-02T20:30:00Z; the others start at startTime each day they run - weekly on its daysOfWeek, monthly on its daysOfMonth and, with lastDayOfMonth, the month's last day.
Times are UTC. A repeating window runs at the same UTC time each time, so where clocks change for daylight saving it moves an hour against your local time twice a year.
A window can't be changed once added, except to switch it on or off with PATCH and { "enabled": false }. To change one, add a new window and delete the old. Deleting a window takes it off every monitor it applied to.
To put a window on a monitor, list its id in the monitor's maintenanceWindowIds when you add or change the monitor - the whole list, since it replaces the old one. It applies within a few seconds.
Status pages
A status page shows the state of some of your monitors to anyone with its link. POST /v1/status-pages adds one:
{ "name": "Example status", "monitorIds": ["<monitor id>", "<monitor id>"], "customDomain": "status.example.com" }
The page shows monitorIds in the order given; GET /v1/status-pages/{id}/monitors reads them back. Every page has a url on Mon's own address, which works whether or not it has a custom domain.
A custom domain needs a CNAME record pointing it at statuspage.mon.bot. Mon then sets it up and gets its certificate, usually within a few minutes: customDomainStatus goes from applying to applied, or to failed with the reason in customDomainError. A domain can be on only one status page in Mon.
PATCH changes only what it sends. monitorIds replaces the page's monitors, and "customDomain": null removes the domain. Changing only the monitors leaves the domain as it is set up. A new name is set up on the domain too, since the page's name is its title there, and sending the same domain again retries one that failed.
Domains
A domain groups a site's monitors and DNS records. Most are added for you: a WHOIS, SSL, HTTP or ping monitor adds its domain, and an integration adds the domains it reads. Each domain lists the id of its monitor of each of those kinds in monitors, or null where it has none.
POST /v1/domains with { "name": "example.com" } adds one by hand; the name is kept lowercase, and a domain your team already has is 409. A domain can't be changed. Deleting one deletes its DNS records with it, for good, but leaves its monitors running - and adding or changing one of them later adds the domain again, without the records.
DNS records
GET /v1/dns-records lists the records an integration has read from your DNS provider, filtered by domainId, type (such as mx) and name. Each has its values as the provider gives them - an MX record's with its priority, as in 10 mail.example.com - and ttlSeconds. A Route 53 alias has no values of its own; aliasTarget names what it points at.
DNS records are read-only through the API: changing one changes your live DNS, so that's done in Mon. To watch a record, add a dns-record monitor for its host and type - monitorId then shows it.
Rate limits
Each team can make a set number of requests a minute, across all its tokens:
| Plan | Requests a minute |
|---|---|
| Team | 60 |
| Enterprise | 300 |
Every response says where you stand:
RateLimit-Limit- your plan's requests a minute.RateLimit-Remaining- how many are left this minute.RateLimit-Reset- seconds until the minute starts over.
Over the limit, the API answers 429 with a Retry-After header saying how many seconds to wait.
Reference
The same endpoints and objects are in ReDoc, if you'd rather browse them there.
List contacts
get/v1/contacts
| Parameter | In | Type | What it does |
|---|---|---|---|
type | query | string | Only this type: email, sms, webhook or slack. |
limit | query | integer | How many per page, 1 to 100. 50 by default. |
cursor | query | string | The cursor from the previous page's next link. |
Returns ContactList - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 429 Rate limited.
Get a contact
get/v1/contacts/{id}
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The contact's id. |
Returns ContactResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
List DNS records
get/v1/dns-records
By name.
| Parameter | In | Type | What it does |
|---|---|---|---|
domainId | query | string | Only the records of this domain. |
type | query | string | Only records of this type, such as mx. |
name | query | string | Only records whose name contains this. |
limit | query | integer | How many per page, 1 to 100. 50 by default. |
cursor | query | string | The cursor from the previous page's next link. |
Returns DnsRecordList - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 429 Rate limited.
Get a DNS record
get/v1/dns-records/{id}
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The record's id. |
Returns DnsRecordResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
List domains
get/v1/domains
By name.
| Parameter | In | Type | What it does |
|---|---|---|---|
name | query | string | Only domains whose name contains this. |
limit | query | integer | How many per page, 1 to 100. 50 by default. |
cursor | query | string | The cursor from the previous page's next link. |
Returns DomainList - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 429 Rate limited.
Add a domain
post/v1/domains
Answers 201 with the domain; 409 when the team has it already; 422 when the name isn't a domain. Adding a WHOIS, SSL, HTTP or ping monitor adds its domain too, so this is only needed for a domain without them.
Returns DomainResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 409 Conflict, 422 Invalid fields, 429 Rate limited.
Get a domain
get/v1/domains/{id}
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The domain's id. |
Returns DomainResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
Delete a domain
delete/v1/domains/{id}
It goes at once, with its DNS records, which can't be got back. Its monitors stay and keep running; adding or changing one of them later adds the domain again, without the records.
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The domain's id. |
Returns nothing - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
List maintenance windows
get/v1/maintenance-windows
By name.
| Parameter | In | Type | What it does |
|---|---|---|---|
limit | query | integer | How many per page, 1 to 100. 50 by default. |
cursor | query | string | The cursor from the previous page's next link. |
Returns MaintenanceWindowList - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 429 Rate limited.
Add a maintenance window
post/v1/maintenance-windows
name, schedule and durationMinutes are required, with startsAt for once and startTime for the rest - in UTC. Answers 201 with the window; 409 when the team has a window with that name; 422 when a field is invalid or the plan's limit on windows is reached. Put it on monitors with their maintenanceWindowIds.
Returns MaintenanceWindowResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 409 Conflict, 422 Invalid fields, 429 Rate limited.
Get a maintenance window
get/v1/maintenance-windows/{id}
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The window's id. |
Returns MaintenanceWindowResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
Switch a maintenance window on or off
patch/v1/maintenance-windows/{id}
Only enabled can change: a window's schedule and name can't, as in the portal. To change them, add a new window, put it on the monitors, and delete the old one.
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The window's id. |
Returns MaintenanceWindowResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 422 Invalid fields, 429 Rate limited.
Delete a maintenance window
delete/v1/maintenance-windows/{id}
It goes at once, and comes off every monitor it applied to.
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The window's id. |
Returns nothing - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
Add a monitor
post/v1/monitors
http and keyword monitors, so far. type and url are required, and a keyword monitor's keyword.text. alerts left out means the team's defaults; { "mode": "none" } adds it with no alerts. Answers 201 with the monitor and its address in Location; 409 when uniqueName is true and the team has a monitor of that type with that name; 422 when a field is invalid, or Mon won't add it - over the plan's monitor limit, an interval below the plan's shortest, an option the plan leaves out - with the reason.
Returns MonitorResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 409 Conflict, 422 Invalid fields, 429 Rate limited.
List monitors
get/v1/monitors
| Parameter | In | Type | What it does |
|---|---|---|---|
type | query | string | Only this type: http, keyword, ssl, whois and so on. |
status | query | string | Only this status: up, down, paused or starting. |
tag | query | string | Only monitors with this tag. |
search | query | string | Only monitors whose name contains this. |
limit | query | integer | How many per page, 1 to 100. 50 by default. |
cursor | query | string | The cursor from the previous page's next link. |
Returns MonitorList - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 429 Rate limited.
Change a monitor
patch/v1/monitors/{id}
Send only what changes: a field left out stays as it is, alerts and maintenance windows included. The type can't change, and a rename with uniqueName true onto a name in use is 409. alerts: { "mode": "defaults" } resets them to the team's defaults as they are now, { "mode": "none" } removes them, and { "mode": "contacts", ... } replaces the whole list. Answers with the monitor as it now stands.
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The monitor's id. |
Returns MonitorResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 409 Conflict, 422 Invalid fields, 429 Rate limited.
Get a monitor
get/v1/monitors/{id}
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The monitor's id. |
Returns MonitorResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
Delete a monitor
delete/v1/monitors/{id}
It goes at once, with its events and history, and can't be brought back.
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The monitor's id. |
Returns nothing - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
List a monitor's alerts
get/v1/monitors/{id}/alerts
Who it alerts, and when. Set them with alerts when adding or changing the monitor.
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The monitor's id. |
Returns AlertList - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
List a monitor's maintenance windows
get/v1/monitors/{id}/maintenance-windows
The ones that apply to it. Set them with maintenanceWindowIds when adding or changing the monitor.
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The monitor's id. |
Returns MonitorMaintenanceWindows - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
List a monitor's events
get/v1/monitors/{id}/events
Newest first. An event that happens while you page through can repeat the last item of one page at the top of the next; for a complete record over time, ask for each stretch with from and to.
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The monitor's id. |
type | query | string | Only this type: started, down, up or paused. |
from | query | string | Only events that began at or after this time, in ISO 8601 (2026-10-25T14:03:00Z). |
to | query | string | Only events that began at or before this time, in ISO 8601. |
limit | query | integer | How many per page, 1 to 100. 50 by default. |
cursor | query | string | The cursor from the previous page's next link. |
Returns EventList - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
Pause a monitor
post/v1/monitors/{id}/pause
It stops being checked, and alerts no one, until it's resumed. The monitor comes back as it now stands: pausing, then paused a moment later. Pausing one that's already paused does nothing, so a retry is safe.
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The monitor's id. |
Returns MonitorResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
Resume a monitor
post/v1/monitors/{id}/resume
Its checks start again; the first one sets it up or down without alerting anyone. The monitor comes back as it now stands: resuming, then up or down. Resuming one that isn't paused does nothing, so a retry is safe. Refused with 422 when the plan won't allow it back - over its monitor limit, or a type the plan no longer includes.
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The monitor's id. |
Returns MonitorResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 422 Invalid fields, 429 Rate limited.
List status pages
get/v1/status-pages
By name.
| Parameter | In | Type | What it does |
|---|---|---|---|
search | query | string | Only pages whose name or custom domain contains this. |
limit | query | integer | How many per page, 1 to 100. 50 by default. |
cursor | query | string | The cursor from the previous page's next link. |
Returns StatusPageList - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 429 Rate limited.
Add a status page
post/v1/status-pages
name and monitorIds are required. Answers 201 with the page; 409 when the team has a page with that name, or another page uses the custom domain; 422 when a field is invalid, a monitor isn't the team's, or the plan's limit on status pages is reached.
Returns StatusPageResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 409 Conflict, 422 Invalid fields, 429 Rate limited.
Get a status page
get/v1/status-pages/{id}
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The page's id. |
Returns StatusPageResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
Change a status page
patch/v1/status-pages/{id}
Sets only the fields sent: customDomain null removes the domain, and monitorIds replaces the page's monitors. The custom domain is set up again when it or the name changes, or to retry one that failed - not for a change of monitors. Answers 200 with the page.
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The page's id. |
Returns StatusPageResource - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 409 Conflict, 422 Invalid fields, 429 Rate limited.
Delete a status page
delete/v1/status-pages/{id}
It goes at once, on Mon's address and on its custom domain.
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The page's id. |
Returns nothing - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
Get the monitors a status page shows
get/v1/status-pages/{id}/monitors
| Parameter | In | Type | What it does |
|---|---|---|---|
id | path | string | The page's id. |
Returns StatusPageMonitors - or a problem: 400 Invalid request, 401 No token, or an invalid one, 403 Your plan doesn't include the API, 404 Not found, 429 Rate limited.
Objects
ContactList
| Field | Type | What it is |
|---|---|---|
items | list of ContactResource | This page's items. |
next | string | The URL of the next page, or null on the last one. |
ContactResource
Somewhere Mon sends alerts: an email address, a phone for SMS, a webhook or a Slack channel.
| Field | Type | What it is |
|---|---|---|
id | string | The contact's id, for getting it on its own. |
name | string | The contact's name, as shown in Mon. |
type | string | email, sms, webhook or slack. |
email | string | The address, for email contacts. |
phone | string | The number in international form (+14155550123), for SMS contacts. |
url | string | The URL Mon posts to, for webhook contacts. A Slack contact's webhook URL is never returned: it's a credential. |
verified | boolean | Whether the address or number has been confirmed. Unconfirmed ones get no alerts. |
enabled | boolean | Whether it's switched on. One that's off gets no alerts. |
isDefault | boolean | Whether new monitors alert it unless told otherwise. |
deliveryProblem | string | Why email to it has stopped, if it has: bounced, or complained when someone marked an alert as spam. Null otherwise. |
alerts | ContactAlerts | Which alerts it gets. |
ContactAlerts
Which of Mon's alerts a contact gets.
| Field | Type | What it is |
|---|---|---|
monitorDown | boolean | When a monitor goes down. |
monitorUp | boolean | When a monitor comes back up. |
weeklyReport | boolean | The weekly summary of its team's monitors. |
certificateExpiring | boolean | When a certificate is about to expire. |
domainExpiring | boolean | When a domain is about to expire. |
domainRenewed | boolean | When a domain is renewed. |
domainStatusChanged | boolean | When a domain's registry status changes. |
registrarChanged | boolean | When a domain moves to another registrar. |
DnsRecordList
| Field | Type | What it is |
|---|---|---|
items | list of DnsRecordResource | This page's items. |
next | string | The URL of the next page, or null on the last one. |
DnsRecordResource
A record in one of your domains' DNS, as an integration read it from your DNS provider. Records are read-only through the API.
| Field | Type | What it is |
|---|---|---|
id | string | The record's id. |
domainId | string | The id of the domain it belongs to. |
domain | string | The domain it belongs to, such as example.com. |
type | string | a, aaaa, cname, mx, txt, ns, soa and so on, lowercase. |
name | string | Its name within the domain: @ for the domain itself, www for www.example.com. |
values | list of string | Its values, as the provider gives them - an MX record's with its priority, such as "10 mail.example.com". |
aliasTarget | string | For a Route 53 alias, which has no values of its own: the name it points at. Null otherwise. |
ttlSeconds | integer | How long it may be cached for, in seconds. Null when the provider doesn't say. |
monitorId | string | The dns-record monitor watching it, or null when none is. |
DomainList
| Field | Type | What it is |
|---|---|---|
items | list of DomainResource | This page's items. |
next | string | The URL of the next page, or null on the last one. |
DomainResource
A site's domain, with the monitors and DNS records that belong to it. A domain is also added on its own when a WHOIS, SSL, HTTP or ping monitor names it, or when an integration brings it in.
| Field | Type | What it is |
|---|---|---|
id | string | The domain's id. |
name | string | The domain, lowercase, such as example.com. |
manuallyAdded | boolean | Whether someone added it or one of its monitors - false when only an integration brought it in. |
monitors | DomainMonitors | Its monitors of each kind that belongs to a domain. |
dnsRecordCount | integer | How many DNS records Mon expects it to have. |
createdAt | timestamp | When it was added. |
DomainMonitors
A domain's monitors: each one's id, or null when it has none of that kind.
| Field | Type | What it is |
|---|---|---|
whois | string | The WHOIS monitor, watching its registration and expiry. |
ssl | string | The SSL monitor, watching its certificate. |
http | string | The HTTP monitor, watching its website. |
ping | string | The ping monitor. |
dnsZone | string | The DNS zone monitor, watching all its records. |
MaintenanceWindowList
| Field | Type | What it is |
|---|---|---|
items | list of MaintenanceWindowResource | This page's items. |
next | string | The URL of the next page, or null on the last one. |
MaintenanceWindowResource
A scheduled time when the monitors it applies to aren't checked, so planned work alerts no one. Times are UTC: a repeating window runs at the same UTC time each day it repeats, so where clocks change for daylight saving it moves an hour against local time twice a year.
| Field | Type | What it is |
|---|---|---|
id | string | The window's id, which a monitor's maintenanceWindowIds lists. |
name | string | Its name, unique in the team. |
schedule | string | once, daily, weekly or monthly. |
startsAt | timestamp | For once: when it starts. |
startTime | string | For daily, weekly and monthly: the UTC time of day it starts, as HH:mm. |
daysOfWeek | list of string | For weekly: the days it runs, monday to sunday. |
daysOfMonth | list of integer | For monthly: the days of the month it runs, 1 to 31. |
lastDayOfMonth | boolean | For monthly: whether it runs on the last day of each month too. |
durationMinutes | integer | How long it lasts each time, in minutes. |
enabled | boolean | Whether it's switched on. One that's off pauses nothing. |
MonitorResource
A monitor: what it watches, how often, and how it's doing. Units are in the field names; times are UTC.
| Field | Type | What it is |
|---|---|---|
id | string | The monitor's id, for getting it on its own. |
name | string | The monitor's name, as shown in Mon. |
type | string | http, keyword, redirect, defacement, synthetic, ping, port, ssl, trace-route, dns-record, dns-zone, whois, expiration. |
status | string | starting, up, down, paused, pausing or resuming. |
tags | list of string | The monitor's tags. |
target | MonitorTarget | What the monitor watches. Only the parts its type uses are set. |
intervalSeconds | integer | How often it's checked, in seconds. |
timeoutMs | integer | How long a check waits for an answer, in milliseconds. |
lastMessage | string | Why it's in its state, in words - the reason it's down, for instance. |
lastCheckedAt | timestamp | When it was last checked. |
nextCheckAt | timestamp | When it's next due to be checked. |
upSince | timestamp | When it last came up, if it's up. |
downSince | timestamp | When it went down, if it's down. |
uptime | MonitorUptime | Uptime as a percentage, over the last day, week, 30 days and 90 days. |
averageResponseTimeMs | integer | The average response time of its checks, in milliseconds. Null before its first check. |
request | MonitorRequestSettings | How its request is made, for http and keyword monitors. Secrets are never returned: only whether a password and a body are set. |
upStatusCodes | list of integer | For http monitors: the status codes that count as up. Null when they're the usual 2xx and 3xx codes. |
keyword | KeywordOptions | For keyword monitors: the text it looks for. |
redirects | RedirectOptions | For http monitors: which redirects it follows beyond HTTP's own. |
ipVersion | string | For http, port and trace-route monitors: auto, ipv4 or ipv6. |
expectClosed | boolean | For port monitors: whether it counts as up while the port refuses connections. |
recordType | string | For dns-record monitors: the record it looks up. |
expectedRecords | list of string | For dns-record monitors: the records that should answer. |
expectedUrl | string | For redirect monitors: where the URL should end up. |
compare | CompareOptions | For redirect monitors: how much of where it lands has to match. |
maxHops | integer | For trace-route monitors: the most hops it follows. |
expiresOn | string | For expiration monitors: the day it runs out. |
alertDays | integer | For whois and expiration monitors: how many days before it expires it alerts; negative, that many days after. |
locations | list of string | The locations it's checked from, by name. Empty when Mon chooses. |
certificate | MonitorCertificate | The certificate: whether it's checked and when to warn, for http monitors; and its details, for SSL monitors and http monitors that check it. |
registration | MonitorRegistration | The registration's details, for WHOIS monitors. |
MonitorTarget
What a monitor watches. Only the parts its type uses are set.
| Field | Type | What it is |
|---|---|---|
url | string | The URL, for website monitors - http, keyword, redirect, defacement, synthetic. |
host | string | The host, for server monitors - ping, port, ssl, trace-route. |
port | integer | The port, for port and ssl monitors. |
domain | string | The domain, for whois and DNS monitors. |
MonitorUptime
The share of checks that found the monitor up, as a percentage.
| Field | Type | What it is |
|---|---|---|
day | number | Over the last 24 hours. |
week | number | Over the last 7 days. |
month | number | Over the last 30 days. |
quarter | number | Over the last 90 days. |
MonitorRequestSettings
How a website monitor's request is made. Header, form and body values are never returned, as they can carry secrets.
| Field | Type | What it is |
|---|---|---|
method | string | get, head, post, put, patch, delete or options. |
contentType | string | The body's Content-Type. |
hasBody | boolean | Whether a raw body is set. |
username | string | The username for HTTP basic authentication. |
hasPassword | boolean | Whether a password is set. |
userAgent | string | The User-Agent it sends, when not Mon's own. |
KeywordOptions
What a keyword monitor looks for.
| Field | Type | What it is |
|---|---|---|
text | string | The text to look for in the page. |
mustExist | boolean | true (the default) to alert when the text disappears; false to alert when it appears. |
caseSensitive | boolean | Whether case matters. false by default. |
searchRawHtml | boolean | Search the page's HTML as sent, rather than the text it shows. false by default. |
RedirectOptions
Redirects an http monitor follows beyond HTTP's own.
| Field | Type | What it is |
|---|---|---|
followJavaScript | boolean | Follow a page that redirects with JavaScript. false by default. |
followMetaTags | boolean | Follow a page that redirects with a meta refresh tag. false by default. |
CompareOptions
How much of where a redirect lands has to match where it's expected to.
| Field | Type | What it is |
|---|---|---|
path | boolean | The path too. false by default. |
queryAndFragment | boolean | The query string and fragment too. false by default. |
subDomain | boolean | The sub-domain too, so www.example.com isn't taken for example.com. false by default. |
MonitorCertificate
An http monitor's certificate check, and the certificate the server presented at the last check.
| Field | Type | What it is |
|---|---|---|
check | boolean | For http monitors: whether the certificate is checked too. |
alertDays | list of integer | For http and ssl monitors: how many days before it expires to warn. |
validUntil | timestamp | When it expires. |
daysLeft | integer | Days until it expires. |
issuedTo | string | The name it's issued to. |
issuedBy | string | The certificate authority that issued it. |
problem | string | What's wrong with it, if anything: expired, issued for another name, an untrusted chain. |
MonitorRegistration
The domain's registration, as its registry last reported it.
| Field | Type | What it is |
|---|---|---|
expiresOn | timestamp | When the registration expires. |
daysLeft | integer | Days until it expires. |
registrar | string | The registrar it's registered through. |
nameServers | list of string | Its name servers. |
MonitorList
| Field | Type | What it is |
|---|---|---|
items | list of MonitorResource | This page's items. |
next | string | The URL of the next page, or null on the last one. |
AlertList
Everyone a monitor alerts.
| Field | Type | What it is |
|---|---|---|
items | list of AlertResource | The contacts it alerts, and when. |
AlertResource
A contact a monitor alerts, and when.
| Field | Type | What it is |
|---|---|---|
contactId | string | The contact's id. |
afterFailures | integer | It's alerted on this many failed checks in a row. |
repeatTimes | integer | While the monitor stays down, the alert repeats this many times. |
repeatEveryChecks | integer | Repeats come every this many checks. Null when it doesn't repeat. |
MonitorMaintenanceWindows
The maintenance windows that apply to a monitor.
| Field | Type | What it is |
|---|---|---|
maintenanceWindowIds | list of string | Their ids. |
EventList
| Field | Type | What it is |
|---|---|---|
items | list of EventResource | This page's items. |
next | string | The URL of the next page, or null on the last one. |
EventResource
Something that happened to a monitor: it started being monitored, went down, came back up or was paused. Each event lasts until the monitor's next one, so a down event's length is how long the outage was. Times are UTC.
| Field | Type | What it is |
|---|---|---|
id | string | The event's id. |
type | string | started, down, up or paused. |
startedAt | timestamp | When it began. |
endedAt | timestamp | When the monitor's next event began, ending this one. Null while it's still the monitor's latest. |
durationSeconds | integer | How long it lasted, in seconds - so far, while it hasn't ended. |
reason | string | Why it happened, in words: the reason a monitor went down, for instance. |
notes | string | Notes your team added to it in Mon. |
StatusPageList
| Field | Type | What it is |
|---|---|---|
items | list of StatusPageResource | This page's items. |
next | string | The URL of the next page, or null on the last one. |
StatusPageResource
A public page showing the status of some of the team's monitors.
| Field | Type | What it is |
|---|---|---|
id | string | The page's id. |
name | string | Its name, unique in the team. Shown on the page. |
url | string | The page on Mon's own address. It works with or without a custom domain. |
customDomain | string | The domain the page is also served on, such as status.example.com. Null when it has none. |
customDomainStatus | string | Where the custom domain's setup is: not-set, applying (Mon is setting it up and getting its certificate), removing, applied (it's serving the page) or failed (see customDomainError). |
customDomainError | string | Why setting up the custom domain failed, when it did. |
monitorCount | integer | How many monitors it shows. |
createdAt | timestamp | When it was added. |
updatedAt | timestamp | When it was last changed. |
StatusPageMonitors
The monitors a status page shows.
| Field | Type | What it is |
|---|---|---|
monitorIds | list of string | Their ids, in the order the page shows them. |
Last updated Oct 30, 2026