API di uptime e tool MCP di CoreDash: monitor e check
Elenca, aggiungi, modifica e metti in pausa i monitor di uptime con la chiave API di CoreDash, e leggi i relativi check via REST o MCP.
Monitor di uptime tramite l'API di CoreDash
Leggi e modifica i monitor di uptime dei progetti CoreDash via REST, con la chiave API che già usi per i dati RUM. Un agente AI li legge tramite MCP.
Avvio rapido
- URL di base
https://app.coredash.app/api/uptime/monitors, JSON in entrata e in uscita. - Header
Authorization: Bearer cdk_your_key, con una chiave di progetto o una master key. - Prima chiamata:
GET /api/uptime/monitorselenca i monitor con il loro stato e l'uptime degli ultimi 7 giorni.
curl https://app.coredash.app/api/uptime/monitors \
-H "Authorization: Bearer cdk_your_key"
Chiavi API per i monitor di uptime
Gli endpoint di uptime accettano le chiavi dell'API di CoreDash e dell'Agency API.
| Chiave | Inizia con | Vede | Un nuovo monitor va in |
|---|---|---|---|
| Chiave di progetto | cdk_ | I monitor del proprio progetto | Sempre nel proprio progetto |
| Master key | cdk_master_ | I monitor di ogni progetto di tua proprietà o a cui hai ricevuto un invito | Nel progetto indicato in project_id, tra quelli di tua proprietà |
Crea una chiave di progetto nella pagina Connect Your AI nella barra laterale del progetto: assegna un nome e fai clic su Generate API key. Le stesse chiavi si trovano nelle impostazioni del progetto sotto API Keys (MCP). Solo i proprietari del progetto possono crearle. Una master key si genera dalla pagina Agency API nella barra laterale, negli account agency. Quando un progetto scade, la sua chiave di progetto riceve 401 a ogni chiamata.
Un guest in un progetto ne legge i monitor. Per aggiungerli, modificarli, spostarli ed eliminarli serve un progetto di tua proprietà.
Il token OAuth di una connessione AI come Claude (mcp_at_) è di sola lettura. Le chiamate POST, PATCH e DELETE con questo token restituiscono 403.
Endpoint di uptime
| Metodo e path | Cosa fa | Restituisce |
|---|---|---|
GET /api/uptime/monitors | Elenca tutti i monitor visibili alla chiave, ordinati per nome. | 200, { "monitors": [...] }, ciascuno con un summary |
POST /api/uptime/monitors | Aggiunge un monitor. Il primo check viene eseguito nel round successivo, a :00 o :30. | 201, { "monitor": {...} } |
GET /api/uptime/monitors/:id | Un singolo monitor con i relativi check, dal più recente. ?limit= imposta il numero di check: default 300, massimo 2100. | 200, { "monitor", "summary", "checks", "rum" } |
PATCH /api/uptime/monitors/:id | Modifica i campi inviati e lascia invariati gli altri. | 200, { "monitor": {...} } |
DELETE /api/uptime/monitors/:id | Elimina il monitor e tutti i suoi check. | 200, { "deleted": true } |
L'IP di origine e i valori degli header sono segreti. Vengono restituiti da POST, PATCH e GET /api/uptime/monitors/:id. L'elenco e i tool MCP omettono origin_ip e mostrano ogni valore degli header come ••••.
L'oggetto monitor
| Campo | Significato |
|---|---|
id | L'ID del monitor, usato per :id nei path. |
name, url | Il nome nell'app e l'URL controllato. |
project_id | Il progetto CoreDash a cui appartiene il monitor. |
paused | true mentre il monitor non viene controllato. |
expect_status | Lo stato HTTP considerato come up. Default 200. |
origin_check | true quando è impostato un IP di origine, così ogni round controlla anche il server stesso. |
origin_ip | L'IP del server. Presente solo nelle risposte che contengono segreti. |
headers | Gli header di richiesta aggiuntivi, [{ "name", "value" }]. |
state | pending, up, failing, down, warn, blocked o paused. Consulta la tabella degli stati più sotto. |
last_check_at, last_up_at | L'ultimo round e l'ultimo round risultato up. |
down_since | Quando è down: l'orario del primo round fallito. Altrimenti null. |
last_down | L'ultimo disservizio terminato, { "from", "to" }, oppure null. |
check_requested_at | Impostato quando aggiungi il monitor. Il round successivo lo azzera. |
last | L'ultimo check per tipo: edge e origin, ciascuno come oggetto check. origin_is_cdn è true se il check di origine ha risposto con header Cloudflare, indicando che l'IP inserito non appartiene al tuo server. |
cert_expires | Quando scade il certificato HTTPS ricevuto dai visitatori. |
created_at | Quando è stato aggiunto il monitor. |
I campi summary e rum
Sia l'elenco sia il singolo monitor contengono un summary: rounds_7d e down_rounds_7d contano i round degli ultimi 7 giorni, uptime_7d è la percentuale di quei round privi di check down, e recent raccoglie gli ultimi 48 round, dal più vecchio, ciascuno con l'esito peggiore del round. Un monitor senza check negli ultimi 7 giorni ha summary: null.
Il singolo monitor include anche rum: il TTFB al p75 registrato dai visitatori reali negli ultimi 7 giorni, ricavato dai dati RUM del progetto, da confrontare con il ttfb_ms del checker. Vale null finché il progetto non ha dati RUM.
GET /api/uptime/monitors/:id
curl "https://app.coredash.app/api/uptime/monitors/6ad68c7a844fad80b752fd16?limit=2" \
-H "Authorization: Bearer cdk_your_key"
{
"monitor": {
"id": "6ad68c7a844fad80b752fd16",
"name": "Checkout",
"url": "https://www.example.com/checkout/",
"project_id": "655f1f77bcf86cd799439011",
"paused": false,
"expect_status": 200,
"origin_check": true,
"origin_ip": "203.0.113.10",
"headers": [{ "name": "X-Staging-Auth", "value": "k7Qp2vX9mR4tL8wZ" }],
"state": "up",
"last_check_at": "2026-10-20T08:00:09.000Z",
"last_up_at": "2026-10-20T08:00:09.000Z",
"down_since": null,
"last_down": { "from": "2026-10-18T19:00:11.000Z", "to": "2026-10-18T20:00:10.000Z" },
"check_requested_at": null,
"last": {
"edge": { "at": "2026-10-20T08:00:09.000Z", "server": "scan1", "mode": "edge", "outcome": "up", "status": 200, "ttfb_ms": 212, "total_ms": 388, "connect_ms": 14, "redirects": 0, "final_url": "https://www.example.com/checkout/", "error": null, "error_text": null, "cloudflare": true, "cache_status": "DYNAMIC" },
"origin": { "at": "2026-10-20T08:00:09.000Z", "server": "scan1", "mode": "origin", "outcome": "up", "status": 200, "ttfb_ms": 640, "total_ms": 702, "connect_ms": 9, "redirects": 0, "final_url": "https://www.example.com/checkout/", "error": null, "error_text": null, "cloudflare": false, "cache_status": null },
"origin_is_cdn": false
},
"cert_expires": "2027-01-02T23:59:59.000Z",
"created_at": "2026-10-06T09:12:41.000Z"
},
"summary": {
"rounds_7d": 336,
"down_rounds_7d": 2,
"uptime_7d": 99.4,
"recent": [
{ "at": "2026-10-20T07:30:10.000Z", "outcome": "up" },
{ "at": "2026-10-20T08:00:09.000Z", "outcome": "up" }
]
},
"checks": [
{ "at": "2026-10-20T08:00:09.000Z", "server": "scan1", "mode": "edge", "outcome": "up", "status": 200, "ttfb_ms": 212, "total_ms": 388, "connect_ms": 14, "redirects": 0, "final_url": "https://www.example.com/checkout/", "error": null, "error_text": null, "cloudflare": true, "cache_status": "DYNAMIC" },
{ "at": "2026-10-20T08:00:09.000Z", "server": "scan1", "mode": "origin", "outcome": "up", "status": 200, "ttfb_ms": 640, "total_ms": 702, "connect_ms": 9, "redirects": 0, "final_url": "https://www.example.com/checkout/", "error": null, "error_text": null, "cloudflare": false, "cache_status": null }
],
"rum": { "ttfb_p75": 1920, "rating": "poor", "period": "last 7 days" }
}
Nella risposta reale recent contiene 48 round; questo esempio mostra gli ultimi due.
L'oggetto check e i suoi esiti
Ogni 30 minuti un round controlla tutti i monitor, a turno da due server: scan1 a :00, scan2 a :30. Un round verifica sempre l'URL così come lo raggiungono i visitatori, tramite DNS e CDN (edge). Con un IP di origine controlla anche direttamente il server (origin). L'API non prevede chiamate per eseguire check tra un round e l'altro. I check vengono conservati per 30 giorni.
Ogni check invia lo user agent CoreDash/1.0 (uptime; +https://www.coredash.app/bot). Se l'URL del monitor si trova sul sito stesso del progetto (il suo host, con o senza www, o un sottodominio), il check invia anche l'header X-CoreDash-Bot con il valore segreto del progetto, ricavato dalla scheda CoreDash bot token nelle impostazioni del progetto. Un monitor su qualsiasi altro sito non riceve alcun token. In caso di redirect, il token segue la regola degli headers configurati: viene inoltrato solo finché il redirect rimane sull'host del monitor. Un tuo header chiamato X-CoreDash-Bot viene scartato. La pagina del bot di CoreDash contiene maggiori dettagli su entrambi.
| Campo | Significato |
|---|---|
at, server | Quando il server ha registrato il round e quale server lo ha eseguito: scan1 o scan2. I check di uno stesso round condividono lo stesso valore di at. |
mode | edge o origin. |
outcome | up, down, blocked o warn. |
status | Lo stato HTTP dell'ultima risposta, dopo eventuali redirect. null in assenza di risposta. |
ttfb_ms, total_ms, connect_ms | Time to First Byte e tempo totale, entrambi comprensivi di redirect, e il tempo di connessione della prima richiesta. |
redirects, final_url | Il numero di redirect seguiti e l'URL dell'ultima risposta. |
error, error_text | Il motivo del fallimento del check, come valore della tabella seguente e in formato testo. |
cloudflare, cache_status | Indica se la risposta è passata da Cloudflare e l'header di cache della CDN (cf-cache-status o x-cache). |
Come viene determinato l'esito di un check
| Esito | Quando |
|---|---|
up | Lo stato corrisponde a expect_status, a meno che non sia 403, 429 o pari o superiore a 500: in questi casi prevale blocked o down. |
down | Uno stato pari o superiore a 500 oppure un error: dns, connect, connect_timeout (nessuna connessione entro 10 secondi), timeout (nessuna risposta completa entro 30 secondi), tls, redirects (più di 5) o network. |
blocked | Un 403, un 429 o una challenge di Cloudflare: un firewall ha bloccato il checker. Non viene mai conteggiato come downtime. Autorizza CoreDash nel firewall. |
warn | Qualsiasi altro stato, come un 404 sul checkout dopo un deploy. Include anche invalid_ip e invalid_url: l'URL o un redirect porta a un indirizzo privato o riservato, oppure un redirect punta a qualcosa che non è un URL. Il checker non esegue richieste verso queste destinazioni. |
L'esito peggiore tra i check di un round determina lo stato del monitor, in ordine dal peggiore al migliore: down, blocked, warn, up.
Stati del monitor
state | Nell'app | Significato |
|---|---|---|
pending | Waiting for first check | Aggiunto; il primo round non è ancora stato eseguito. |
up | Up | L'ultimo round ha restituito lo stato previsto. |
failing | Failing | Un round fallito. Ancora uno e diventa down. |
down | Down | Due round falliti di fila: entrambi i server ne hanno rilevato il fallimento. |
warn | Unexpected status | L'ultimo round ha restituito warn. |
blocked | Blocked | Un firewall ha bloccato il checker. |
paused | Paused | Non viene controllato finché non imposti paused su false. |
Un monitor in un progetto con abbonamento scaduto conserva le impostazioni e l'ultimo stato. Non viene controllato finché il progetto non viene pagato di nuovo.
Aggiungi, modifica ed elimina un monitor
POST /api/uptime/monitors
curl -X POST https://app.coredash.app/api/uptime/monitors \
-H "Authorization: Bearer cdk_master_your_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.example.com/checkout/",
"name": "Checkout",
"project_id": "655f1f77bcf86cd799439011",
"origin_ip": "203.0.113.10",
"headers": [{ "name": "X-Staging-Auth", "value": "k7Qp2vX9mR4tL8wZ" }],
"expect_status": 200
}'
| Campo | Regole |
|---|---|
url | Obbligatorio su POST. Un URL http o https completo, senza username o password. |
name | Fino a 80 caratteri; i nomi più lunghi vengono troncati. Vuoto su POST: viene usato l'host dell'URL. Vuoto su PATCH: mantiene il vecchio nome, oppure il nuovo host se la stessa PATCH invia un nuovo url. |
project_id | Obbligatorio con una master key: un progetto di tua proprietà, con abbonamento a pagamento o trial attivo. Una chiave di progetto lo ignora e usa il proprio progetto. |
origin_ip | Un indirizzo IPv4 o IPv6 pubblico del server. Aggiunge il check di origine: diretto a questo IP, bypassando DNS e CDN. "" o null lo rimuove. |
headers | Fino a 5 header di richiesta aggiuntivi, [{ "name", "value" }]. Nomi: lettere, numeri e trattini, fino a 64 caratteri. Valori: fino a 256 caratteri, quelli più lunghi vengono troncati. In caso di redirect vengono inoltrati solo finché si rimane sull'host del monitor, con o senza www. Un redirect verso qualsiasi altro host, inclusi i sottodomini, non ne riceve nessuno. |
expect_status | Lo stato considerato come up, da 100 a 599. Default 200. Un 403, un 429 o qualsiasi stato pari o superiore a 500 non viene mai conteggiato come up. |
paused | true interrompe i check, false li riattiva. |
La risposta è 201 con il nuovo monitor, inclusi IP di origine e valori degli header:
{
"monitor": {
"id": "6ad68c7a844fad80b752fd16",
"name": "Checkout",
"url": "https://www.example.com/checkout/",
"project_id": "655f1f77bcf86cd799439011",
"paused": false,
"expect_status": 200,
"origin_check": true,
"origin_ip": "203.0.113.10",
"headers": [{ "name": "X-Staging-Auth", "value": "k7Qp2vX9mR4tL8wZ" }],
"state": "pending",
"last_check_at": null,
"last_up_at": null,
"down_since": null,
"last_down": null,
"check_requested_at": "2026-10-20T09:12:41.000Z",
"last": {},
"cert_expires": null,
"created_at": "2026-10-20T09:12:41.000Z"
}
}
PATCH /api/uptime/monitors/:id
Invia solo i campi da modificare. headers sostituisce l'intero elenco, quindi invia tutti gli header che intendi mantenere. Questo comando mette in pausa un monitor:
curl -X PATCH https://app.coredash.app/api/uptime/monitors/6ad68c7a844fad80b752fd16 \
-H "Authorization: Bearer cdk_your_key" \
-H "Content-Type: application/json" \
-d '{ "paused": true }'
Con una master key, project_id sposta il monitor seguendo le stesse regole di POST.
DELETE /api/uptime/monitors/:id
curl -X DELETE https://app.coredash.app/api/uptime/monitors/6ad68c7a844fad80b752fd16 \
-H "Authorization: Bearer cdk_your_key"
L'operazione non si può annullare. Per interrompere i check e mantenere la cronologia, invia { "paused": true } con PATCH.
Errori e limiti dell'API di uptime
Gli errori vengono restituiti come { "error": "..." } con uno di questi codici di stato:
| Stato | Quando |
|---|---|
400 | Il body viola una regola. Il campo error specifica quale, vedi sotto. |
401 | Unauthorized: chiave assente, sconosciuta, revocata o scaduta, oppure associata a un progetto scaduto. |
403 | This token can only read. Use a CoreDash API key to change monitors.: una chiamata POST, PATCH o DELETE con token OAuth (mcp_at_). Una PATCH o DELETE su un monitor di un progetto in cui sei guest riceve 403 con Only the project's owners can change its monitors. |
404 | Monitor not found: l'id non esiste o la chiave non ha visibilità su quel monitor. |
405 | Method not allowed. |
error 400 | Soluzione |
|---|---|
Choose a project for this monitor | Invia project_id con una master key. |
project not found | Il project_id non appartiene ai progetti di tua proprietà. I guest non possono aggiungere né spostare monitor qui. |
This project's subscription has ended | Per aggiungere o spostare un monitor serve un progetto a pagamento o un trial attivo. |
A project can have up to 25 monitors | Eliminane prima uno, oppure usa un altro progetto. |
A monitor must belong to a project | Ometti project_id nella PATCH, oppure indica un progetto di tua proprietà. |
url can't contain a username or password | Per la basic auth, invia un header Authorization all'interno di headers. |
origin_ip is not an IP address, origin_ip must be a public IP address | Usa l'indirizzo pubblico del server stesso. |
url must be a full http or https URL, e.g. https://www.example.com/, url must start with http:// or https://, headers must be a list of {name, value}, at most 5 headers, "…" isn't a valid header name (letters, numbers and dashes only), expect_status must be an HTTP status code | Correggi il campo indicato nel messaggio. Le regole sono riportate nella tabella dei campi sotto POST. |
Limiti: 25 monitor per progetto, 5 header aggiuntivi per monitor, 2100 check per ogni GET di un singolo monitor e 30 giorni di storico dei check.
Tool MCP per l'uptime
Il server MCP di CoreDash su https://app.coredash.app/api/mcp include due tool di uptime oltre ai tool RUM, più list_projects per i progetti accessibili dalla tua chiave. Tutti e tre sono di sola lettura. Per aggiungere, modificare o eliminare un monitor, usa l'app o gli endpoint REST descritti sopra con una chiave API di CoreDash. I tool non richiedono project_id: una chiave di progetto legge il proprio progetto, mentre una master key o una connessione OAuth come Claude legge tutti i progetti di tua proprietà o a cui hai ricevuto un invito.
| Tool | Chiedi all'agente | Restituisce |
|---|---|---|
list_projects | "Quali siti riesci a vedere?" | { "projects": [...] } con project_id, name, url e role (owner o guest). |
list_uptime_monitors | "È tutto up?" | { "monitors": [...] }, con IP di origine e valori degli header mascherati. |
get_uptime_monitor | "Il checkout è andato down questa settimana, e da quando?" | { "monitor", "summary", "checks" }. Accetta monitor_id e limit (default 100, massimo 1000); summary fornisce rounds, down_rounds e uptime_pct relativi a quei check. |
curl -X POST https://app.coredash.app/api/mcp \
-H "Authorization: Bearer cdk_your_key" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_uptime_monitor",
"arguments": { "monitor_id": "6ad68c7a844fad80b752fd16", "limit": 48 }
}
}'
La risposta è il wrapper JSON-RPC dell'API di CoreDash, con il risultato come stringa JSON in result.content[0].text. Un monitor sconosciuto restituisce { "error": "Monitor not found" } in quel campo e result.isError vale true.
Approfondimenti su uptime e API di CoreDash
- Monitoraggio dell'uptime: cosa controlla CoreDash e cosa vedi nell'app.
- API di CoreDash: chiavi di progetto, formato JSON-RPC e tool RUM.
- Agency API: master key e progetti via REST.
- Bot di CoreDash: lo user agent, l'header
X-CoreDash-Bote gli indirizzi. - Autorizza CoreDash nel firewall: per un monitor che segnala Blocked.