Nova Uptime
Guideapiemail-healthdeveloper

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.

SN
Sumit Nova Uptime
28 febbraio 2026 · 9 min read
Share:

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:

  1. Manuale: Controlla ogni dominio nella dashboard di Nova Uptime. Non scalabile.
  2. Query WHOIS: Scrivere parsing custom DKIM/SPF/DMARC. Complesso, inaffidabile.
  3. 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#

  1. Accedi a go.novauptime.com
  2. Settings → API Keys
  3. Clicca "Generate New Key"
  4. Copia la chiave di 20 caratteri (es. abc123def456ghi789jk)
  5. 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#

  1. Cacha aggressivamente: La salute email non cambia frequentemente. Cacha per 1-24 ore.
  2. Batcha le richieste: Controlla 10 domini concorrentemente, non 1 alla volta.
  3. Gestisci gli errori con grazia: Problemi di rete capitano. Riprova con exponential backoff.
  4. Monitora l'API: Traccia il tuo utilizzo API. Se ti avvicini al rate limit, cacha più a lungo.
  5. Proteggi la tua API key: Mai committare in git. Usa variabili d'ambiente.
  6. 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 Free

Articoli correlati