Monitoraggio Email Health tramite API Pubblica di Nova Uptime: Guida per Sviluppatori
Integra il monitoraggio email health nella tua piattaforma con la REST API di Nova Uptime. Guida completa con esempi, rate limit e pattern di produzione.
Perché Usare l'API di Nova Uptime per il Monitoraggio Email Health?#
Se gestisci domini cliente (piattaforma SaaS, hosting provider, agenzia), devi controllare programmaticamente la salute email su tutti loro.
Tre Approcci:
- Manuale: Controlla ogni dominio nella dashboard di Nova Uptime. Non scalabile.
- Query WHOIS: Scrivere parsing custom DKIM/SPF/DMARC. Complesso, inaffidabile.
- API Pubblica di Nova Uptime: REST API che gestisce tutta la complessità. Scalabile, affidabile, mantenuta.
Questa guida copre l'approccio API.
Panoramica API#
Base URL: https://api.novauptime.com/api/v1
Autenticazione: Header X-API-Key
Rate Limit: 50 richieste/ora per il piano gratuito, 1.000/ora per il piano a pagamento
Formato di Risposta:
{
"success": true,
"data": { ... },
"message": "Messaggio opzionale"
}
Step 1: Genera la Tua API Key#
- Accedi a go.novauptime.com
- Settings → API Keys
- Clicca "Generate New Key"
- Copia la chiave di 20 caratteri (es.
abc123def456ghi789jk) - Conservala in modo sicuro (non committare in git!)
Variabile d'Ambiente:
export NOVAUPTIME_API_KEY="abc123def456ghi789jk"
Step 2: Controlla l'Email Health di un Dominio#
Endpoint: GET /domains/{domain}/email-health
Esempio di Richiesta:
curl -H "X-API-Key: abc123def456ghi789jk" \
https://api.novauptime.com/api/v1/domains/usegum.com/email-health
Risposta:
{
"success": true,
"data": {
"domain": "usegum.com",
"score": 92,
"grade": "A",
"timestamp": "2026-02-20T10:30:00Z",
"records": {
"mx": {
"status": "configured",
"value": "mail.usegum.com"
},
"spf": {
"status": "configured",
"value": "v=spf1 include:sendgrid.net -all",
"lookups": 4
},
"dkim": {
"status": "configured",
"selectors": ["s1", "s2"],
"configured_count": 2
},
"dmarc": {
"status": "configured",
"policy": "reject"
},
"blacklist": {
"status": "clean",
"checked_against": 4,
"listed_on": 0
}
},
"recommendations": [
{
"type": "warning",
"message": "Il record SPF ha 4 lookup (limite 10). Considera di consolidare gli include.",
"action": "Usa un servizio di SPF flattening o consolida i provider email"
}
]
}
}
Casi d'Uso Reali#
Caso d'Uso 1: Dashboard d'Agenzia#
Sei un'agenzia che gestisce 100+ siti web cliente. Vuoi mostrare a ogni cliente la propria salute email nella tua dashboard.
Implementazione:
// Route Express.js per recuperare l'email health
app.get("/client/:clientId/email-health", async (req, res) => {
const clientId = req.params.clientId;
// Ottieni il dominio del cliente dal database
const client = await Client.findById(clientId);
const domain = client.primaryDomain;
// Recupera l'email health da Nova Uptime
const response = await fetch(
`https://api.novauptime.com/api/v1/domains/${domain}/email-health`,
{
headers: { "X-API-Key": process.env.NOVAUPTIME_API_KEY }
}
);
const emailHealth = await response.json();
// Restituisci al frontend
res.json(emailHealth.data);
});
Caso d'Uso 2: Scoring Automatizzato dell'Email Health#
Vota tutti i domini cliente e avvisa in caso di degradazione.
Implementazione:
// Cron job: Controlla tutti i domini ogni giorno
async function dailyEmailHealthAudit() {
const domains = await Domain.find();
for (const domain of domains) {
// Recupera lo score corrente
const current = await fetchEmailHealth(domain.name);
// Confronta con il giorno precedente
const previous = await EmailHealthHistory.findLatest(domain.name);
if (current.data.score < previous.score - 5) {
// Score calato di >5 punti, avvisa
await sendSlackAlert({
domain: domain.name,
oldScore: previous.score,
newScore: current.data.score,
change: current.data.score - previous.score
});
}
// Salva lo storico
await EmailHealthHistory.create({
domain: domain.name,
score: current.data.score,
timestamp: new Date()
});
}
}
Caso d'Uso 3: Audit Bulk di Domini#
Hai acquisito un competitor. 50 nuovi domini cliente. Vuoi lo stato di salute email per tutti.
Implementazione:
// Recupera la salute email per 50 domini
async function auditAcquiredDomains(acquiredDomains) {
const results = [];
// Recupera con limite di concorrenza (5 alla volta)
for (const domain of acquiredDomains) {
const health = await fetchEmailHealth(domain);
results.push({
domain,
score: health.data.score,
grade: health.data.grade,
issues: health.data.recommendations
});
}
// Esporta in CSV
const csv = convertToCSV(results);
fs.writeFileSync("email-health-audit.csv", csv);
// Riepilogo: 40 domini sani, 10 da sistemare
console.log(`Sani: ${results.filter(r => r.score > 80).length}`);
console.log(`Da sistemare: ${results.filter(r => r.score < 80).length}`);
}
Pattern API per la Produzione#
Pattern 1: Caching con Scadenza#
Non chiamare l'API a ogni richiesta. Cacha i risultati localmente.
const redis = require("redis");
const client = redis.createClient();
async function getEmailHealthCached(domain, maxAge = 3600) {
// Prova prima la cache
const cached = await client.get(`email-health:${domain}`);
if (cached) {
return JSON.parse(cached);
}
// Cache miss, recupera dall'API
const health = await fetchEmailHealth(domain);
// Salva in cache per 1 ora
await client.setex(
`email-health:${domain}`,
maxAge,
JSON.stringify(health.data)
);
return health.data;
}
Pattern 2: Gestione del Rate Limit#
L'API di Nova Uptime ha rate limit. Gestiscili con grazia.
async function fetchWithRetry(domain, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
const response = await fetch(
`https://api.novauptime.com/api/v1/domains/${domain}/email-health`,
{
headers: { "X-API-Key": process.env.NOVAUPTIME_API_KEY },
timeout: 10000
}
);
if (response.status === 429) {
// Rate limited, attendi prima del retry
const retryAfter = response.headers.get("Retry-After") || (2 ** i);
console.log(`Rate limited. Retry in ${retryAfter}s`);
await new Promise(r => setTimeout(r, retryAfter * 1000));
continue;
}
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return await response.json();
} catch (error) {
if (i === maxRetries - 1) throw error;
console.log(`Tentativo ${i + 1} fallito, riprovo...`);
await new Promise(r => setTimeout(r, (2 ** i) * 1000));
}
}
}
Pattern 3: Batch Processing#
Quando controlli 100+ domini, batcha le richieste in modo efficiente.
async function batchEmailHealthCheck(domains) {
const batchSize = 10; // 10 richieste concorrenti
const results = [];
for (let i = 0; i < domains.length; i += batchSize) {
const batch = domains.slice(i, i + batchSize);
// Processa il batch in modo concorrente
const batchResults = await Promise.all(
batch.map(domain => fetchEmailHealth(domain))
);
results.push(...batchResults);
// Logga il progresso
console.log(`Processati ${Math.min(i + batchSize, domains.length)}/${domains.length}`);
}
return results;
}
Pattern 4: Salvataggio Locale dei Risultati#
Salva i risultati di salute email nel tuo database per il tracking storico.
// Modello del database
const EmailHealthSchema = {
domain: String,
score: Number,
grade: String,
records: {
mx: Object,
spf: Object,
dkim: Object,
dmarc: Object,
blacklist: Object
},
timestamp: Date,
createdAt: Date
};
async function storeEmailHealth(domain) {
const health = await fetchEmailHealth(domain);
// Salva nel DB
const record = new EmailHealthLog({
domain,
score: health.data.score,
grade: health.data.grade,
records: health.data.records,
timestamp: new Date(health.data.timestamp),
createdAt: new Date()
});
await record.save();
return record;
}
Pattern 5: Avviso sui Cambiamenti#
Traccia i cambiamenti e avvisa il team quando qualcosa si rompe.
async function monitorEmailHealth(domain) {
const current = await getEmailHealthCached(domain);
const previous = await EmailHealthLog.findLatest(domain);
if (!previous) {
// Primo controllo, salvalo soltanto
await storeEmailHealth(domain);
return;
}
// Rileva i cambiamenti
const scoreChange = current.score - previous.score;
if (scoreChange < -10) {
// Degradazione importante
await alertSlack({
channel: "#email-alerts",
message: `
${domain}: Salute email degradata
Precedente: ${previous.score} (${previous.grade})
Attuale: ${current.score} (${current.grade})
Variazione: ${scoreChange < 0 ? "" : "+"}${scoreChange}
Problemi: ${current.recommendations.map(r => r.message).join("\n")}
`
});
}
}
Gestione Errori#
Scenari di Errore Comuni:
async function robustEmailHealthCheck(domain) {
try {
const health = await fetchWithRetry(domain);
return health.data;
} catch (error) {
if (error.code === "ENOTFOUND") {
// Il dominio non esiste
console.error(`Dominio ${domain} non trovato`);
return null;
} else if (error.statusCode === 401) {
// API key non valida
console.error("API key Nova Uptime non valida");
return null;
} else if (error.statusCode === 429) {
// Rate limited (anche dopo i retry)
console.error("Limite di rate superato");
return null;
} else {
// Errore sconosciuto
console.error(`Errore controllando ${domain}: ${error.message}`);
return null;
}
}
}
Integrazione Frontend#
Esempio di Componente React#
import { useState, useEffect } from 'react';
function EmailHealthCard({ domain }) {
const [health, setHealth] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
async function fetchHealth() {
try {
const response = await fetch(`/api/email-health/${domain}`);
const data = await response.json();
setHealth(data);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
}
fetchHealth();
}, [domain]);
if (loading) return <div>Caricamento...</div>;
if (error) return <div>Errore: {error}</div>;
return (
<div className="email-health-card">
<h3>{domain}</h3>
<div className={`score score-${health.grade}`}>
{health.score}/100 ({health.grade})
</div>
<div className="records">
{Object.entries(health.records).map(([key, value]) => (
<div key={key} className={`record ${value.status}`}>
<strong>{key.toUpperCase()}</strong>: {value.status}
</div>
))}
</div>
{health.recommendations.length > 0 && (
<div className="recommendations">
<h4>Raccomandazioni:</h4>
<ul>
{health.recommendations.map((rec, i) => (
<li key={i} className={rec.type}>
{rec.message}
</li>
))}
</ul>
</div>
)}
</div>
);
}
Riferimento Documentazione API#
Base URL: https://api.novauptime.com/api/v1
Endpoint:
GET /domains/{domain}/email-health
→ Controlla la salute email di un dominio
→ Rate limit: 50/ora (gratuito), 1000/ora (a pagamento)
→ Risposta: Score di salute email, voto, record, raccomandazioni
GET /domains/{domain}/incidents
→ Ottieni gli ultimi 20 incidenti di downtime
→ Param opzionali: limit, offset
GET /domains/{domain}/history
→ Ottieni la cronologia dei controlli (ore configurabili, max 720h)
→ Param opzionali: hours (default 168), limit (default 500)
GET /domains
→ Elenca i domini dell'utente (paginato, max 50/pagina)
→ Param opzionali: page, limit
Best Practice#
- Cacha aggressivamente: La salute email non cambia frequentemente. Cacha per 1-24 ore.
- Batcha le richieste: Controlla 10 domini concorrentemente, non 1 alla volta.
- Gestisci gli errori con grazia: Problemi di rete capitano. Riprova con exponential backoff.
- Monitora l'API: Traccia il tuo utilizzo API. Se ti avvicini al rate limit, cacha più a lungo.
- Proteggi la tua API key: Mai committare in git. Usa variabili d'ambiente.
- Testa i rate limit: Simula alto volume prima del deploy in produzione.
Riassunto: Checklist di Integrazione API#
- ✅ Genera e proteggi l'API key
- ✅ Implementa il controllo di base dell'email health
- ✅ Aggiungi un layer di caching (Redis o in-memory)
- ✅ Implementa la gestione del rate limit
- ✅ Aggiungi la gestione degli errori per i fallimenti comuni
- ✅ Testa con il tuo dominio reale
- ✅ Costruisci il componente frontend per mostrare i risultati
- ✅ Imposta avvisi per i cambiamenti di score
- ✅ Documenta la gestione dell'API key nel wiki del team
- ✅ Monitora l'utilizzo e la quota dell'API
Inizia Oggi#
L'API pubblica di Nova Uptime è disponibile sul piano gratuito. Genera la tua prima API key in Settings e inizia a integrare i controlli di salute email nella tua piattaforma.
Per il riferimento dettagliato dell'API, visita la documentazione API di Nova Uptime.
Monitor Your Website Before It Goes Down
Get uptime monitoring, SSL tracking, domain expiry alerts, and email health checks. Free plan — no credit card required.
Start Monitoring FreeArticoli correlati
Come integrare il monitoraggio uptime nella tua app con un'API
Guida per sviluppatori per integrare il monitoraggio uptime con la REST API di Nova Uptime: autenticazione, endpoint, esempi di codice e best practice.
Migliori tool gratuiti di email health check nel 2026: un confronto
Confrontati 8 email health checker gratuiti: Nova Uptime, MXToolbox, DMARCian, EasyDMARC, Postmark, Mailtrap, Sender Score, ZeroBounce.
Domain health check: un audit completo e gratuito (DNS + SSL + Email + Uptime)
Esegui un audit completo e gratuito del dominio in 5 minuti: DNS, SSL, autenticazione email (SPF/DKIM/DMARC), blacklist e uptime. Checklist passo-passo inclusa.