Esc
  • Search every page and section of the docs.
Sign up

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 /v1 keeps 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"
}
Statustype ends inWhat happened
400invalid-requestA parameter isn't valid - errors says which, and why
401unauthorizedNo token, or one that's expired or revoked
403plan-requiredYour plan doesn't include the API
403forbiddenThe token's owner can't make this change - their role only lets them view
404not-foundNo such thing in your account
409conflictIt clashes with something there already - with uniqueName, a monitor of that type with that name
422validationMon won't make the change - detail says why, such as a resume that would go over your plan's monitor limit
429rate-limitedToo many requests - see below
5xxserver-errorSomething 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:

typeNeeds
http, defacementurl
keywordurl and keyword.text
redirecturl and expectedUrl
ping, ssl, trace-routehost
porthost and port
dns-recordhost, the name to look up, and recordType (a unless you say)
whoisdomain
dns-zonedomain, one whose zone was imported through an integration
expirationname 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:

PlanRequests a minute
Team60
Enterprise300

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

ParameterInTypeWhat it does
typequerystringOnly this type: email, sms, webhook or slack.
limitqueryintegerHow many per page, 1 to 100. 50 by default.
cursorquerystringThe 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}

ParameterInTypeWhat it does
idpathstringThe 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.

ParameterInTypeWhat it does
domainIdquerystringOnly the records of this domain.
typequerystringOnly records of this type, such as mx.
namequerystringOnly records whose name contains this.
limitqueryintegerHow many per page, 1 to 100. 50 by default.
cursorquerystringThe 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}

ParameterInTypeWhat it does
idpathstringThe 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.

ParameterInTypeWhat it does
namequerystringOnly domains whose name contains this.
limitqueryintegerHow many per page, 1 to 100. 50 by default.
cursorquerystringThe 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}

ParameterInTypeWhat it does
idpathstringThe 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.

ParameterInTypeWhat it does
idpathstringThe 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.

ParameterInTypeWhat it does
limitqueryintegerHow many per page, 1 to 100. 50 by default.
cursorquerystringThe 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}

ParameterInTypeWhat it does
idpathstringThe 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.

ParameterInTypeWhat it does
idpathstringThe 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.

ParameterInTypeWhat it does
idpathstringThe 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

ParameterInTypeWhat it does
typequerystringOnly this type: http, keyword, ssl, whois and so on.
statusquerystringOnly this status: up, down, paused or starting.
tagquerystringOnly monitors with this tag.
searchquerystringOnly monitors whose name contains this.
limitqueryintegerHow many per page, 1 to 100. 50 by default.
cursorquerystringThe 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.

ParameterInTypeWhat it does
idpathstringThe 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}

ParameterInTypeWhat it does
idpathstringThe 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.

ParameterInTypeWhat it does
idpathstringThe 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.

ParameterInTypeWhat it does
idpathstringThe 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.

ParameterInTypeWhat it does
idpathstringThe 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.

ParameterInTypeWhat it does
idpathstringThe monitor's id.
typequerystringOnly this type: started, down, up or paused.
fromquerystringOnly events that began at or after this time, in ISO 8601 (2026-10-25T14:03:00Z).
toquerystringOnly events that began at or before this time, in ISO 8601.
limitqueryintegerHow many per page, 1 to 100. 50 by default.
cursorquerystringThe 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.

ParameterInTypeWhat it does
idpathstringThe 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.

ParameterInTypeWhat it does
idpathstringThe 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.

ParameterInTypeWhat it does
searchquerystringOnly pages whose name or custom domain contains this.
limitqueryintegerHow many per page, 1 to 100. 50 by default.
cursorquerystringThe 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}

ParameterInTypeWhat it does
idpathstringThe 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.

ParameterInTypeWhat it does
idpathstringThe 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.

ParameterInTypeWhat it does
idpathstringThe 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

ParameterInTypeWhat it does
idpathstringThe 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

FieldTypeWhat it is
itemslist of ContactResourceThis page's items.
nextstringThe 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.

FieldTypeWhat it is
idstringThe contact's id, for getting it on its own.
namestringThe contact's name, as shown in Mon.
typestringemail, sms, webhook or slack.
emailstringThe address, for email contacts.
phonestringThe number in international form (+14155550123), for SMS contacts.
urlstringThe URL Mon posts to, for webhook contacts. A Slack contact's webhook URL is never returned: it's a credential.
verifiedbooleanWhether the address or number has been confirmed. Unconfirmed ones get no alerts.
enabledbooleanWhether it's switched on. One that's off gets no alerts.
isDefaultbooleanWhether new monitors alert it unless told otherwise.
deliveryProblemstringWhy email to it has stopped, if it has: bounced, or complained when someone marked an alert as spam. Null otherwise.
alertsContactAlertsWhich alerts it gets.

ContactAlerts

Which of Mon's alerts a contact gets.

FieldTypeWhat it is
monitorDownbooleanWhen a monitor goes down.
monitorUpbooleanWhen a monitor comes back up.
weeklyReportbooleanThe weekly summary of its team's monitors.
certificateExpiringbooleanWhen a certificate is about to expire.
domainExpiringbooleanWhen a domain is about to expire.
domainRenewedbooleanWhen a domain is renewed.
domainStatusChangedbooleanWhen a domain's registry status changes.
registrarChangedbooleanWhen a domain moves to another registrar.

DnsRecordList

FieldTypeWhat it is
itemslist of DnsRecordResourceThis page's items.
nextstringThe 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.

FieldTypeWhat it is
idstringThe record's id.
domainIdstringThe id of the domain it belongs to.
domainstringThe domain it belongs to, such as example.com.
typestringa, aaaa, cname, mx, txt, ns, soa and so on, lowercase.
namestringIts name within the domain: @ for the domain itself, www for www.example.com.
valueslist of stringIts values, as the provider gives them - an MX record's with its priority, such as "10 mail.example.com".
aliasTargetstringFor a Route 53 alias, which has no values of its own: the name it points at. Null otherwise.
ttlSecondsintegerHow long it may be cached for, in seconds. Null when the provider doesn't say.
monitorIdstringThe dns-record monitor watching it, or null when none is.

DomainList

FieldTypeWhat it is
itemslist of DomainResourceThis page's items.
nextstringThe 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.

FieldTypeWhat it is
idstringThe domain's id.
namestringThe domain, lowercase, such as example.com.
manuallyAddedbooleanWhether someone added it or one of its monitors - false when only an integration brought it in.
monitorsDomainMonitorsIts monitors of each kind that belongs to a domain.
dnsRecordCountintegerHow many DNS records Mon expects it to have.
createdAttimestampWhen it was added.

DomainMonitors

A domain's monitors: each one's id, or null when it has none of that kind.

FieldTypeWhat it is
whoisstringThe WHOIS monitor, watching its registration and expiry.
sslstringThe SSL monitor, watching its certificate.
httpstringThe HTTP monitor, watching its website.
pingstringThe ping monitor.
dnsZonestringThe DNS zone monitor, watching all its records.

MaintenanceWindowList

FieldTypeWhat it is
itemslist of MaintenanceWindowResourceThis page's items.
nextstringThe 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.

FieldTypeWhat it is
idstringThe window's id, which a monitor's maintenanceWindowIds lists.
namestringIts name, unique in the team.
schedulestringonce, daily, weekly or monthly.
startsAttimestampFor once: when it starts.
startTimestringFor daily, weekly and monthly: the UTC time of day it starts, as HH:mm.
daysOfWeeklist of stringFor weekly: the days it runs, monday to sunday.
daysOfMonthlist of integerFor monthly: the days of the month it runs, 1 to 31.
lastDayOfMonthbooleanFor monthly: whether it runs on the last day of each month too.
durationMinutesintegerHow long it lasts each time, in minutes.
enabledbooleanWhether 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.

FieldTypeWhat it is
idstringThe monitor's id, for getting it on its own.
namestringThe monitor's name, as shown in Mon.
typestringhttp, keyword, redirect, defacement, synthetic, ping, port, ssl, trace-route, dns-record, dns-zone, whois, expiration.
statusstringstarting, up, down, paused, pausing or resuming.
tagslist of stringThe monitor's tags.
targetMonitorTargetWhat the monitor watches. Only the parts its type uses are set.
intervalSecondsintegerHow often it's checked, in seconds.
timeoutMsintegerHow long a check waits for an answer, in milliseconds.
lastMessagestringWhy it's in its state, in words - the reason it's down, for instance.
lastCheckedAttimestampWhen it was last checked.
nextCheckAttimestampWhen it's next due to be checked.
upSincetimestampWhen it last came up, if it's up.
downSincetimestampWhen it went down, if it's down.
uptimeMonitorUptimeUptime as a percentage, over the last day, week, 30 days and 90 days.
averageResponseTimeMsintegerThe average response time of its checks, in milliseconds. Null before its first check.
requestMonitorRequestSettingsHow its request is made, for http and keyword monitors. Secrets are never returned: only whether a password and a body are set.
upStatusCodeslist of integerFor http monitors: the status codes that count as up. Null when they're the usual 2xx and 3xx codes.
keywordKeywordOptionsFor keyword monitors: the text it looks for.
redirectsRedirectOptionsFor http monitors: which redirects it follows beyond HTTP's own.
ipVersionstringFor http, port and trace-route monitors: auto, ipv4 or ipv6.
expectClosedbooleanFor port monitors: whether it counts as up while the port refuses connections.
recordTypestringFor dns-record monitors: the record it looks up.
expectedRecordslist of stringFor dns-record monitors: the records that should answer.
expectedUrlstringFor redirect monitors: where the URL should end up.
compareCompareOptionsFor redirect monitors: how much of where it lands has to match.
maxHopsintegerFor trace-route monitors: the most hops it follows.
expiresOnstringFor expiration monitors: the day it runs out.
alertDaysintegerFor whois and expiration monitors: how many days before it expires it alerts; negative, that many days after.
locationslist of stringThe locations it's checked from, by name. Empty when Mon chooses.
certificateMonitorCertificateThe certificate: whether it's checked and when to warn, for http monitors; and its details, for SSL monitors and http monitors that check it.
registrationMonitorRegistrationThe registration's details, for WHOIS monitors.

MonitorTarget

What a monitor watches. Only the parts its type uses are set.

FieldTypeWhat it is
urlstringThe URL, for website monitors - http, keyword, redirect, defacement, synthetic.
hoststringThe host, for server monitors - ping, port, ssl, trace-route.
portintegerThe port, for port and ssl monitors.
domainstringThe domain, for whois and DNS monitors.

MonitorUptime

The share of checks that found the monitor up, as a percentage.

FieldTypeWhat it is
daynumberOver the last 24 hours.
weeknumberOver the last 7 days.
monthnumberOver the last 30 days.
quarternumberOver 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.

FieldTypeWhat it is
methodstringget, head, post, put, patch, delete or options.
contentTypestringThe body's Content-Type.
hasBodybooleanWhether a raw body is set.
usernamestringThe username for HTTP basic authentication.
hasPasswordbooleanWhether a password is set.
userAgentstringThe User-Agent it sends, when not Mon's own.

KeywordOptions

What a keyword monitor looks for.

FieldTypeWhat it is
textstringThe text to look for in the page.
mustExistbooleantrue (the default) to alert when the text disappears; false to alert when it appears.
caseSensitivebooleanWhether case matters. false by default.
searchRawHtmlbooleanSearch 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.

FieldTypeWhat it is
followJavaScriptbooleanFollow a page that redirects with JavaScript. false by default.
followMetaTagsbooleanFollow 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.

FieldTypeWhat it is
pathbooleanThe path too. false by default.
queryAndFragmentbooleanThe query string and fragment too. false by default.
subDomainbooleanThe 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.

FieldTypeWhat it is
checkbooleanFor http monitors: whether the certificate is checked too.
alertDayslist of integerFor http and ssl monitors: how many days before it expires to warn.
validUntiltimestampWhen it expires.
daysLeftintegerDays until it expires.
issuedTostringThe name it's issued to.
issuedBystringThe certificate authority that issued it.
problemstringWhat'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.

FieldTypeWhat it is
expiresOntimestampWhen the registration expires.
daysLeftintegerDays until it expires.
registrarstringThe registrar it's registered through.
nameServerslist of stringIts name servers.

MonitorList

FieldTypeWhat it is
itemslist of MonitorResourceThis page's items.
nextstringThe URL of the next page, or null on the last one.

AlertList

Everyone a monitor alerts.

FieldTypeWhat it is
itemslist of AlertResourceThe contacts it alerts, and when.

AlertResource

A contact a monitor alerts, and when.

FieldTypeWhat it is
contactIdstringThe contact's id.
afterFailuresintegerIt's alerted on this many failed checks in a row.
repeatTimesintegerWhile the monitor stays down, the alert repeats this many times.
repeatEveryChecksintegerRepeats come every this many checks. Null when it doesn't repeat.

MonitorMaintenanceWindows

The maintenance windows that apply to a monitor.

FieldTypeWhat it is
maintenanceWindowIdslist of stringTheir ids.

EventList

FieldTypeWhat it is
itemslist of EventResourceThis page's items.
nextstringThe 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.

FieldTypeWhat it is
idstringThe event's id.
typestringstarted, down, up or paused.
startedAttimestampWhen it began.
endedAttimestampWhen the monitor's next event began, ending this one. Null while it's still the monitor's latest.
durationSecondsintegerHow long it lasted, in seconds - so far, while it hasn't ended.
reasonstringWhy it happened, in words: the reason a monitor went down, for instance.
notesstringNotes your team added to it in Mon.

StatusPageList

FieldTypeWhat it is
itemslist of StatusPageResourceThis page's items.
nextstringThe 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.

FieldTypeWhat it is
idstringThe page's id.
namestringIts name, unique in the team. Shown on the page.
urlstringThe page on Mon's own address. It works with or without a custom domain.
customDomainstringThe domain the page is also served on, such as status.example.com. Null when it has none.
customDomainStatusstringWhere 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).
customDomainErrorstringWhy setting up the custom domain failed, when it did.
monitorCountintegerHow many monitors it shows.
createdAttimestampWhen it was added.
updatedAttimestampWhen it was last changed.

StatusPageMonitors

The monitors a status page shows.

FieldTypeWhat it is
monitorIdslist of stringTheir ids, in the order the page shows them.

Last updated Oct 30, 2026