NEWAI content checker: see which pages read like AI text

APIUptime

Uptime monitoring API. Homepage status and incident history for your own dashboard.

We check each site's homepage every 30 minutes from two servers. Pull the current status, 30-day incidents, 7-day response times and SSL expiry into your own tool, report or AI assistant. The REST API and the MCP server are in every plan at no extra cost.

Status and SSL

Current state, 7-day and 30-day uptime, median response time and SSL expiry date.

30-day incidents

Outages and blocks from the past 30 days with duration, HTTP status, error and firewall flag.

7-day check log

Every 30-minute check from the past week, with its outcome and response time in ms.

In every plan

One personal API key for REST and MCP, with 60 calls a minute across all your sites.

Uptime endpoints in REST and the MCP server

Send a POST with a JSON body or a GET with query parameters to /rest/v1/. Your personal API key goes in the header as a Bearer token. Pass the site_id from list_sites or copy it from the site's address in the app. In Claude Code or Cursor, the three MCP tools read the same data.

EndpointMCP toolWhat it returns
uptime.statusget_uptime_statusWhether the monitor is on, checked homepage URL, current state, since when it is up or down, last check time, SSL expiry date, 7-day and 30-day uptime percentage, 7-day median TTFB and 30-day incident count.
uptime.incidentsget_uptime_incidentsEach run of checks over the last 30 days that was not up, newest first, with start and end time, duration in minutes, round count, worst outcome, HTTP status or error, and whether a firewall blocked it.
uptime.checksget_uptime_checksEvery 30-minute check from the last 7 days, newest first, with its UTC timestamp, outcome and time to first byte in milliseconds.

What a call to uptime.status returns

The call takes only site_id.

curl -X POST https://app.marketingtracer.com/rest/v1/uptime.status \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"site_id":"YOUR_SITE_ID"}'
{
  "data": {
    "enabled": true,
    "url": "https://example-site.nl/",
    "state": "up",
    "up_since": "2026-10-27T23:30:03Z",
    "down_since": null,
    "last_check_at": "2026-10-31T23:00:08Z",
    "certificate_expires_at": "2027-01-01T13:27:24Z",
    "uptime_7d_pct": 100,
    "uptime_30d_pct": 100,
    "response_ms_median_7d": 209,
    "incidents_30d": 1
  },
  "meta": {
    "site_id": "YOUR_SITE_ID"
  }
}

Notice that uptime_30d_pct is 100 here even though incidents_30d is 1. Earlier that week a firewall challenge refused the checker with a 403 (blocked). Any run that was not up lands in uptime.incidents, so you catch firewall blocks too. The uptime percentage only drops when checks come back down.

Rule out downtime first when a client asks about a Thursday dip

Orders dip on Thursday afternoon and the client immediately asks whether the shop went offline. Check get_uptime_incidents in Claude Code or Cursor, or put uptime.incidents next to Search Console in your own report.

When incidents_30d is 0, hosting is off the list in ten seconds. If something did fail, you have started_at, the duration in minutes, and the http_status or connection error. A site only goes down after two failed checks in a row, so one missed check stays a single round.

Traffic dipped on Thursday afternoon. Was the shop down or blocked?
get_uptime_incidents
started_atminutesroundshttp_statusfirewall

Spot expiring SSL certificates and firewall blocks before a client calls

Loop uptime.status over your sites each morning to fill your own agency status board. Each card shows state, response_ms_median_7d and certificate_expires_at.

A stalled certificate renewal shows up days before browsers throw a warning. When a new CDN rule refuses our checker with a 403, state switches straight to blocked.

Plot a week of response times to find a slow nightly import

A webshop can return 200 all week and show 100 for uptime_7d_pct. Nightly product imports still slow every request for an hour.

Draw a small chart from uptime.checks in your client portal. Every 30-minute check of the past 7 days gives you response_ms, the time to first byte in milliseconds. Your client's developer gets the exact half-hour windows where the server struggled.

Endpoints, arguments and field descriptions

Every endpoint is a POST with a JSON body; reading endpoints also take a GET with the same arguments in the query string. Send your API key as Authorization: Bearer YOUR_API_KEY. Every answer is {"data": …, "meta": {…}}: meta.site_id always, meta.next_cursor and meta.total for a list, meta.period where the endpoint covers a period. An error is {"error": {"code", "message"}} with the HTTP status: 400 invalid_argument, unknown_argument or missing_argument; 401 not_authenticated; 403 no_access or tool_off; 404 not_found; 429 rate_limited. The machine-readable version is openapi.json.

uptime.status

POST /rest/v1/uptime.status · MCP tool get_uptime_status

Returns the uptime monitor of one site: whether it is on, the checked address (the homepage), the current state, since when it is up or down, the last check, when the SSL certificate expires, the share of checks that were not down over 7 and 30 days, the median response time over 7 days and the number of incidents in 30 days. Values are null while the monitor has no checks yet.

Arguments

ArgumentTypeWhat it does
site_id (required)stringThe site: its id from list_sites, or the id in the app’s address.

Example request

curl -X POST https://app.marketingtracer.com/rest/v1/uptime.status \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"site_id":"YOUR_SITE_ID"}'

Example response · A real answer of 1 November 2026, anonymised: up since a firewall rule was fixed on 28 October.

{
  "data": {
    "enabled": true,
    "url": "https://example-site.nl/",
    "state": "up",
    "up_since": "2026-10-27T23:30:03Z",
    "down_since": null,
    "last_check_at": "2026-10-31T23:00:08Z",
    "certificate_expires_at": "2027-01-01T13:27:24Z",
    "uptime_7d_pct": 100,
    "uptime_30d_pct": 100,
    "response_ms_median_7d": 209,
    "incidents_30d": 1
  },
  "meta": {"site_id": "YOUR_SITE_ID"}
}

Response fields · in data:

FieldTypeWhat it is
enabledbooleanWhether the monitor is on. When false, the numbers are from before it was switched off, or null.
urlstringThe address that is checked: the homepage of the site. Redirects are followed.
statestringpending (no checks yet), up, failing (one failed round; down only after two in a row), down, blocked (our check is refused by a firewall) or warn.
up_sincestring or nullSince when the site is up without a break, ISO 8601 UTC; null when it is not up or not known.
down_sincestring or nullSince when the site is down, ISO 8601 UTC; null when it is not down.
last_check_atstring or nullThe last check, ISO 8601 UTC; null before the first.
certificate_expires_atstring or nullWhen the SSL certificate of the address expires, ISO 8601 UTC; null when not known.
uptime_7d_pctnumber or nullShare of the checks in the last 7 days that were not down, 0-100 with two decimals; null without checks.
uptime_30d_pctnumber or nullThe same over the last 30 days.
response_ms_median_7dinteger or nullMedian time to first byte of the checks in the last 7 days that answered, in milliseconds; null without one.
incidents_30dintegerIncidents in the last 30 days (see uptime.incidents).

uptime.incidents

POST /rest/v1/uptime.incidents · MCP tool get_uptime_incidents

Returns the incidents of the last 30 days, newest first: each run of checks in a row that were not up, with when it started and ended, how long it took, the worst outcome and the HTTP status or error of that check. One failed round already counts here; the site is only marked down (and alerts are sent) after two in a row. An ongoing incident has no end.

Arguments

ArgumentTypeWhat it does
site_id (required)stringThe site: its id from list_sites, or the id in the app’s address.

Example request

curl -X POST https://app.marketingtracer.com/rest/v1/uptime.incidents \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"site_id":"YOUR_SITE_ID"}'

Example response · The firewall challenge of 26-27 October (403, blocked), before the Skip rule moved to the top of the Cloudflare rules.

{
  "data": [
    {
      "started_at": "2026-10-26T21:22:37Z",
      "ended_at": "2026-10-27T23:30:03Z",
      "ongoing": false,
      "minutes": 1567,
      "outcome": "blocked",
      "rounds": 54,
      "http_status": 403,
      "error": null,
      "firewall": true
    }
  ],
  "meta": {"site_id": "YOUR_SITE_ID", "next_cursor": null, "total": 1}
}

Response fields · data is a list; each item has:

FieldTypeWhat it is
started_atstringThe first check that was not up, ISO 8601 UTC.
ended_atstring or nullThe first check that was up again, ISO 8601 UTC; null while it is ongoing.
ongoingbooleanWhether the incident is still going on.
minutesinteger or nullFrom started_at to ended_at in minutes; null while it is ongoing.
outcomestringThe worst outcome during the incident: up (answered 200), warn (answered with another status, or the address is invalid), blocked (403, 429 or a firewall challenge: our check is refused) or down (no answer, a timeout or a 5xx).
roundsintegerHow many checks in a row were not up.
http_statusinteger or nullThe HTTP status of the check with the worst outcome; null when there was no answer.
errorstring or nullWhy that check got no answer: dns, connect, connect_timeout, timeout, tls, redirects (more than 5), invalid_url, invalid_ip or network; null when it answered.
firewallbooleanWhether a firewall or CDN challenge refused a check during the incident.

uptime.checks

POST /rest/v1/uptime.checks · MCP tool get_uptime_checks

Returns every check of the last 7 days, newest first, with its outcome and response time (time to first byte). The response time is null when the check got no answer.

Arguments

ArgumentTypeWhat it does
site_id (required)stringThe site: its id from list_sites, or the id in the app’s address.

Example request

curl -X POST https://app.marketingtracer.com/rest/v1/uptime.checks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"site_id":"YOUR_SITE_ID"}'

Example response · Shortened to two checks; the real answer had 246.

{
  "data": [
    {"at": "2026-10-31T22:30:06Z", "outcome": "up", "response_ms": 220},
    {"at": "2026-10-31T22:00:07Z", "outcome": "up", "response_ms": 273}
  ],
  "meta": {"site_id": "YOUR_SITE_ID", "next_cursor": null, "total": 246}
}

Response fields · data is a list; each item has:

FieldTypeWhat it is
atstringWhen the check ran, ISO 8601 UTC.
outcomestringup (answered 200), warn (answered with another status, or the address is invalid), blocked (403, 429 or a firewall challenge: our check is refused) or down (no answer, a timeout or a 5xx).
response_msinteger or nullTime to first byte in milliseconds; null without an answer.
White label / agency

White-label uptime monitoring API. On your own domain, under your name.

When your white-label dashboard runs on your own domain, the REST API and the MCP server answer at that address too. One personal API key works across every client site you can access. You decide whether your clients also get the API and the MCP.

API hubSEO API overview APIWebsite alerts API MCPSEO MCP server

Free 14-day trial

MarketingTracer smart A.I. tool shows you what you need to rank. Then we'll help you get it done.

  • No credit card required
  • No installation needed
  • No strings attached
Start your 14-day trial

FAQ

Something else? Ask us.

Is the uptime monitoring API included in every plan?

Yes. The uptime monitor sits in every plan, and the REST API and MCP server come with it at no extra cost. Your API key gets 60 calls per minute across REST and MCP together. See the pricing page for plan details.

How often do checks run, and when is a site marked down?

We check the homepage every 30 minutes and alternate between two servers. One failed check sets state to failing and records one round in uptime.incidents. A site only moves to down after two failed checks in a row.

Can I turn the uptime monitor on or off through the API?

No. Every public endpoint and MCP tool is read-only. Someone with edit rights switches the monitor on once per site under Uptime in the app. In uptime.status, the enabled field tells you whether it is on.

Which URLs can I monitor per site?

One address per site, always the homepage shown in url. Redirects from http to https or www are followed up to five hops.

What does a blocked state mean, and how do I fix it?

A firewall or CDN refused our checker, usually with a 403, a 429 or a bot challenge. Every uptime check sends a secret value unique to that site in the X-SEO-Crawler header. Open Site settings in the app to copy that secret and ready-made Cloudflare Skip and AWS WAF Allow rules.

How far back do checks and incidents go?

Individual 30-minute checks in uptime.checks go back 7 days. The incident log in uptime.incidents goes back 30 days. You also get the 7-day and 30-day uptime percentages in uptime.status.

How do I connect Claude Code or Cursor to the uptime tools?

Point your editor at /rest/mcp/server on app.marketingtracer.com or on your own white-label domain. Pass your personal API key from the MCP page in the app as a Bearer token. Ready-to-paste setup commands for Claude Code and Cursor are on the SEO MCP page.