Documentazione interattiva · Portale sviluppatori · Specifica OpenAPI · EN · FR · DE · IT · PT · ES

API Email Mailpro™ v2 : Riferimento

URL di base : https://api.mailpro.com/v2

L'API Email v2 di Mailpro™ ti consente di gestire programmaticamente liste di contatti, modelli email, indirizzi mittente e campagne — e di inviare sia email di massa sia transazionali.

Autenticazione

Ogni endpoint accetta tre metodi di autenticazione. Utilizza quello più adatto al tuo stack.

> Il Bearer JWT legacy e IdClient+ApiKey continuano a funzionare senza modifiche e non sono > soggetti agli scope. Solo i token di accesso OAuth 2.0 sono soggetti ai controlli di scope per endpoint > indicati su ogni operazione qui sotto.

Metodo 1 — OAuth 2.0 (consigliato per le integrazioni)

Mailpro gestisce un unico server di autorizzazione OAuth 2.0 per tutte le sue API, su una superficie unica e indipendente dalla versione: https://api.mailpro.com/oauth/. Non esiste un endpoint OAuth per versione — ottieni un token da /oauth/token e lo stesso token funziona su questa API Email v2, su CRM v3 e su SMS. Gli endpoint che può chiamare dipendono dagli scope del token, non dall'URL di base dell'API. Emittente (claim iss): https://api.mailpro.com/oauth/.

EndpointURL
AutorizzazioneGET https://api.mailpro.com/oauth/authorize
Token / rinnovoPOST https://api.mailpro.com/oauth/token
JWKSGET https://api.mailpro.com/oauth/.well-known/jwks
DiscoveryGET https://api.mailpro.com/oauth/.well-known/openid-configuration

Grant: authorization_code + PKCE (S256, obbligatorio), client_credentials, refresh_token (rotazione). Durata del token di accesso: 20 min; token di aggiornamento: 30 giorni (scorrevoli, monouso); codice di autorizzazione: 60 s.

Avvio rapido — ottenere un token e chiamare questa API (sostituisci i valori; non fare mai il commit di un vero secret):

curl -X POST https://api.mailpro.com/oauth/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials" \
  -d "client_id=YOUR_CLIENT_ID" \
  -d "client_secret=YOUR_CLIENT_SECRET" \
  -d "scope=email:send email:read"

Chiama poi questa API con Authorization: Bearer ACCESS_TOKEN. Lo stesso token funziona sulle API CRM v3 e SMS. Un token a cui manca lo scope richiesto da un endpoint riceve 403 insufficient_scope. Percorso completo e catalogo degli scope: vedi la documentazione dell'API CRM v3 › Autenticazione. Scope utili per l'email: email:send, email:read, email:templates:read, email:templates:write, contacts:read, contacts:write, account:read.

Metodo 2 — Bearer JWT (legacy)

Authorization: Bearer <access_token>

Ottieni un token tramite POST /token (form-encoded, OAuth2 password grant):

POST https://api.mailpro.com/v2/token
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=YOUR_USERNAME&password=YOUR_API_KEY

Lo stesso token è valido anche sulla CRM API v3 e sulla SMS API — autenticati una sola volta, chiama qualsiasi API. I token hanno una validità predefinita di 30 giorni; utilizza grant_type=refresh_token per rinnovarli senza doverti autenticare nuovamente. Senza scope — preferisci OAuth 2.0 per le integrazioni installabili.

Metodo 3 — IdClient + ApiKey

Due credenziali:

ParametroTipoDescrizione
IdClientintegerIl tuo ID cliente Mailpro numerico, reperibile in Impostazioni → Accesso API
ApiKeystringLa tua chiave API, reperibile in Impostazioni → Accesso API

Invialle in uno di questi punti — scegli uno:

Se fornisci le credenziali in più punti, prevale l'header.

Controllo degli scope OAuth per endpoint (Email v2)

Per i token emessi da OAuth, ogni gruppo di endpoint richiede uno scope (l'autenticazione legacy ne è esente). Ogni operazione indica il proprio scope sotto Authorization. Riepilogo:

EndpointScope richiesto
/send/* (campagne, transazionale, pianificazione, test — tranne /send/{IdSend}/status)email:send
/stats/* (tranne /stats/del), /history/list, /send/{IdSend}/statusemail:read
/message/*, /senderEmail/* (lettura)email:templates:read
/message/*, /senderEmail/* (add/edit/del), /stats/delemail:templates:write
/list/list, /email/listcontacts:read
/list/{add,edit,del}, /email/{add,addSingle,edit,del}, /import/uploadcontacts:write
/account/*account:read

Un rifiuto per scope restituisce 403 con { "error": "insufficient_scope", "required_scope": "…" }.

Formato della risposta

Tutti gli endpoint supportano json (predefinito) e xml. Specifica il formato nell'URL:

Paginazione

Stessa regola sulle tre API Mailpro (Email v2, CRM v3, SMS): 5.000 elementi per pagina, per impostazione predefinita e al massimo.

Parametri sconosciuti: vengono ignorati, mai rifiutati. Quando una richiesta contiene un parametro che l'API non riconosce, la risposta include X-Ignored-Parameters (i nomi) e X-Documentation (un link a questa pagina), così un errore di battitura non passa inosservato.

Risposte di errore

HTTPSignificato
400Richiesta non valida — parametro obbligatorio mancante o non valido
401Non autorizzato — IdClient o ApiKey non validi
403Vietato — limite dell'account raggiunto (ad es. numero massimo di liste)
404Non trovato — la risorsa richiesta non esiste
500Errore interno del server

Errori derivanti da regole di business:

Tracciamento della consegna (email transazionali)

Ogni email inviata singolarmente (POST /send/sendmail, la CRM API v3, il relay SMTP o un'automazione) riceve un identificativo. Può essere seguita finché il server del destinatario non la accetta o la rifiuta. Le campagne non sono coperte qui: usate le statistiche.

statusSignificatoFinale?
queuedAccettata, in attesa di invio.no
scheduledPianificata per più tardi (DatePlanned).no
sentConsegnata dai nostri server, ancora nessuna risposta dal server del destinatario.no
deliveredAccettata dal server del destinatario (DiagCode = la sua risposta SMTP).sì
bouncedRifiutata. BounceType: hard = indirizzo non valido o rifiuto definitivo; soft = rifiuto dopo nuovi tentativi (casella piena, server irraggiungibile…).sì
not_foundIdentificativo sconosciuto o che non appartiene al vostro account.sì

Interrogare senza andare in loop

Gli stati sono conservati per 365 giorni.

Webhook

Mailpro™ è in grado di notificare il tuo server in tempo reale quando si verificano determinati eventi sul tuo account (un'email viene recapitata, una campagna termina, un contatto fa bounce, ecc.). Stile Stripe — il tuo URL riceve una POST firmata in HMAC-SHA256 non appena l'evento si attiva.

Ogni evento inviato al vostro webhook conta come 1 richiesta nella vostra quota di richieste API.

Come funziona

> ⏱ Ritardo di attivazione — dopo aver creato, aggiornato o eliminato un webhook, la > modifica impiega fino a 10 minuti per propagarsi su tutti i server dell'API > Mailpro. Durante questo intervallo gli eventi potrebbero non corrispondere ancora alla tua nuova sottoscrizione > (oppure potrebbero ancora corrispondere a una appena rimossa). È il tempo necessario per > aggiornare la cache in memoria delle sottoscrizioni su ogni istanza dell'API.

Envelope del payload

Tutti gli eventi condividono un envelope comune:

{
  "id":         "evt_8f3a9b2c4d1e5f6789abcdef01234567",
  "type":       "email.delivered",
  "created":    1748194800,
  "apiVersion": "v2",
  "account":    { "id": 12345, "name": "ACME Corp" },
  "data":       { "messageId": "...", "email": "[email protected]", "...": "..." }
}
CampoFormatoDescrizione
idevt_ + 32 hexID univoco dell'evento — utilizzalo come chiave di idempotenza sul tuo lato.
type<domain>.<verb>Tipo di evento canonico.
createdSecondi Unix UTCIncluso nella firma HMAC.
apiVersion"v2"Quale API Mailpro ha pubblicato l'evento.
account.idintIl tuo ID cliente Mailpro (= IdClient).
account.namestringIl nome del tuo account (utile per il debug lato client).
dataobjectPayload dell'evento — la forma dipende dal type (vedi catalogo qui sotto).

Catalogo degli eventi

EventoTriggerForma di data
pingTest tramite POST /webhooks/{id}/test{ message }
email.processedInvio accettato dalla pipeline{ messageId, email, campaignId, processedAt }
email.deliveredUn'email singola è stata accettata dal server del destinatario — API v2/v3, SMTP o Automation (non le campagne). Emesso dal flusso di consegna PowerMTA.{ messageId, email, idSending, sendingType, diagCode, deliveredAt }
email.openedPixel di tracciamento attivato{ messageId, email, campaignId, openedAt, ip, userAgent }
email.clickedClick su un link tracciato{ messageId, email, campaignId, clickedAt, url, ip, userAgent }
email.bouncedHard o soft bounce{ messageId, email, campaignId, bouncedAt, bounceType, reason }
email.spam_reportReclamo FBL{ messageId, email, campaignId, reportedAt }
email.unsubscribedClick sul link di opt-out{ messageId, email, campaignId, unsubscribedAt }
email.droppedRifiutato prima dell'invio{ messageId, email, campaignId, droppedAt, reason }
campaign.startedInizio della distribuzione{ campaignId, name, totalRecipients, startedAt }
campaign.finishedTutti i destinatari elaborati{ campaignId, name, totalSent, totalFailed, finishedAt }
credits.lowSaldo dei crediti email al di sotto della soglia di allerta{ remaining, threshold }

Sottoscrivi tutti gli eventi di questa API passando ["*"] nell'array events.

Firma HMAC

Ogni POST include un header X-Mailpro-Signature:

X-Mailpro-Signature: t=1748194800,v1=7f9ac2b6e4d1c8a3...
X-Mailpro-Event-Id:  evt_8f3a9b2c4d1e5f6789abcdef01234567
X-Mailpro-Event-Type: email.delivered
X-Mailpro-Attempt:   1

Per verificare:

Node.js
const crypto = require('crypto');

function verifyMailproSignature(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(',').map(p => p.split('=')));
  if (Math.abs(Date.now() / 1000 - parseInt(parts.t)) > 300) return false;
  const expected = crypto
    .createHmac('sha256', secret)
    .update(parts.t + '.' + rawBody)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(parts.v1, 'hex'),
    Buffer.from(expected, 'hex'));
}
PHP
function verifyMailproSignature(string $rawBody, string $header, string $secret): bool {
    parse_str(str_replace(',', '&', $header), $p);
    if (abs(time() - (int)$p['t']) > 300) return false;
    $expected = hash_hmac('sha256', $p['t'] . '.' . $rawBody, $secret);
    return hash_equals($expected, $p['v1']);
}
Python
import hmac, hashlib, time

def verify_mailpro_signature(raw_body: bytes, header: str, secret: str) -> bool:
    parts = dict(p.split('=') for p in header.split(','))
    t = int(parts['t'])
    if abs(time.time() - t) > 300:
        return False
    expected = hmac.new(
        secret.encode(),
        f"{t}.".encode() + raw_body,
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, parts['v1'])
C#
using System.Security.Cryptography;
using System.Text;

static bool VerifyMailproSignature(string rawBody, string header, string secret) {
    var parts = header.Split(',')
        .Select(p => p.Split('='))
        .ToDictionary(a => a[0], a => a[1]);
    var t = long.Parse(parts["t"]);
    if (Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - t) > 300) return false;
    using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
    var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes($"{t}.{rawBody}"));
    var expected = Convert.ToHexString(hash).ToLowerInvariant();
    return CryptographicOperations.FixedTimeEquals(
        Encoding.UTF8.GetBytes(expected),
        Encoding.UTF8.GetBytes(parts["v1"]));
}

Retry e disattivazione automatica

TentativoRitardo prima del successivo
1 → 210 secondi
2 → 31 minuto
3 → 45 minuti
4 → 530 minuti
5 → 62 ore
6 → 76 ore
7abbandonato (recapito contrassegnato come failed)

Dopo 10 fallimenti consecutivi sullo stesso webhook, viene disattivato automaticamente (isActive: false) e ricevi un'email di notifica. Riattivalo con PUT /webhooks/{id} una volta corretto il tuo endpoint.

Successo = HTTP 2xx

Consideriamo il tuo webhook come riuscito solo se restituisci uno stato compreso tra 200–299. Qualsiasi 3xx/4xx/5xx oppure un timeout (> 10 s) viene considerato un fallimento e attiva i retry. Se il tuo endpoint è definitivamente fuori uso, restituisci esplicitamente 410 Gone — i retry verranno comunque effettuati, ma la causa del fallimento sarà più chiara nel tuo log di recapito.

Limiti

LimiteValore
Webhook per account20
Eventi sottoscritti per webhook50
Dimensione massima del payload256 KB
Timeout HTTP per tentativo10 secondi
Conservazione dello storico dei recapiti30 giorni

Sommario

Authentication

Ottieni un token JWT Bearer per autenticare tutte le altre chiamate API. L'endpoint /token v2 è un redirect 307 verso l'emittente canonico /v3/token — il tuo client HTTP segue il redirect in modo trasparente (il metodo POST e il body vengono preservati).

POST /token

Ottieni un token di accesso (redirect 307 a /v3/token)

Ottiene un token JWT Bearer utilizzando le credenziali del client Mailpro. Passa l'access_token restituito come Authorization: Bearer <token> in tutte le richieste successive. Lo stesso token è valido anche sulla CRM API v3 e sulla SMS API.

> ⚙ Dettaglio implementativo — POST /v2/token è un redirect 307 > Temporary Redirect verso POST /v3/token (configurato a livello di > rewrite IIS web.config). L'HTTP 307 preserva sia il metodo (POST) > sia il body della richiesta, perciò qualsiasi client HTTP conforme agli > standard segue il redirect in modo trasparente — continui a fare POST su > /v2/token e ricevi un JWT valido. Non c'è alcuna logica di emissione del token > duplicata; l'API Email v2 non emette mai token direttamente.

Tipi di grant supportati
Tipo di grantCaso d'uso
passwordIntegrazione standard — username + chiave API
refresh_tokenRinnova un token di accesso in scadenza senza autenticarsi di nuovo
client_credentialsServer-to-server con solo ID client
Durata del token

Usa grant_type=refresh_token per rinnovare il token di accesso senza autenticarsi di nuovo. Memorizza i token lato server (Vault, variabili d'ambiente); non incorporarli mai nel JS del browser né nei binari delle app mobili. Consulta la doc /token della CRM API v3 per la nota di sicurezza completa.

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
grant_typestring: password, refresh_token, client_credentialssì
usernamestringIl tuo username Mailpro (email). Obbligatorio per il grant password.
passwordstringLa tua chiave API Mailpro (formato GUID). Obbligatoria per il grant password.
refresh_tokenstringRefresh token precedente. Obbligatorio per il grant refresh_token.
client_idstringIl tuo ID client Mailpro (intero). Obbligatorio per il grant client_credentials.

Risposte

CodiceDescrizione
200Token emesso con successo. Restituito da POST /v3/token dopo il follow 307 trasparente — il tuo client HTTP vede una normale 200 con lo stesso shape del body che riceverebbe direttamente dall'endpoint token v3.
307Temporary Redirect verso POST /v3/token, emesso dalla regola di rewrite IIS in web.config. I client HTTP conformi agli standard seguono questo redirect automaticamente preservando il metodo POST originale e il body del form. Visibile solo ai client che disabilitano esplicitamente il follow dei redirect (ad es. curl --max-redirs 0).
400Credenziali non valide o tipo di grant non supportato

Esempio 200

{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "bearer",
  "expires_in": 31535999,
  "userName": "12345",
  "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "application": null
}

Esempio 400

{
  "error": "invalid_grant",
  "error_description": "The username or password is incorrect."
}

Account

Verifica il saldo dei crediti email, la quota API mensile e lo stato dell'abbonamento.

GET /account/credits.{format}

Ottieni il saldo dei crediti email

Restituisce il saldo dei crediti email rimanenti per il tuo account Mailpro. Ogni email inviata consuma un credito. I crediti non scadono con l'abbonamento, ma sono utilizzabili solo finché l'abbonamento è attivo.

Scope OAuth : account:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Risposte

CodiceDescrizione
200Saldo dei crediti restituito con successo
401Credenziali non valide

Esempio 200

{
  "Credits": 48500
}

GET /account/subscriptionEndDate.{format}

Ottieni la data di scadenza dell'abbonamento

Restituisce la data di scadenza dell'abbonamento Mailpro corrente. Dopo la data di scadenza, gli invii sono bloccati finché l'abbonamento non viene rinnovato.

Scope OAuth : account:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Risposte

CodiceDescrizione
200Data di scadenza dell'abbonamento restituita con successo
401Credenziali non valide

Esempio 200

{
  "SubscriptionEndDate": "2027-01-15T00:00:00"
}

GET /account/limits.{format}

Ottieni la quota API mensile

Restituisce la quota mensile di richieste API per il client autenticato.

Calcolo della quota: il limite è calibrato in base ai crediti dell'abbonamento email (tipicamente subscription_credits × 5). Per un piano da 10.000 email/mese, ciò produce un budget mensile di 50.000 richieste. Si ripristina alla data di anniversario dell'abbonamento (non il 1° del mese di calendario).

Cosa consuma i crediti:

Cosa è GRATUITO (non consuma crediti):

La quota è condivisa tra tutte e 3 le API Mailpro (v2, v3, sms) — un client = un budget mensile sull'intera piattaforma.

Scope OAuth : account:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Risposte

CodiceDescrizione
200Snapshot della quota
401Credenziali non valide
404Nessun record di quota trovato (account appena creato; la riga verrà creata alla prima richiesta autenticata).

Esempio 200

{
  "MonthlyLimit": 50000,
  "Remaining": 32847,
  "Used": 17153,
  "IsFree": false,
  "RemainedSendsForFree": 0
}

Lists

Gestisci le liste (liste di contatti). Una lista raggruppa i contatti per campagne di massa. Massimo 1.000 liste per account (stesso limite sulle tre API Mailpro e nell'app). Type 0 = lista standard. Type 1 = lista nera (utilizzata per la gestione delle disiscrizioni).

GET /list/list.{format}

Elenca tutte le liste

Restituisce tutte le liste dell'account, ordinate per data di creazione (le più recenti per prime) a meno che non sia impostato sortByName=true. Usa type=0 per le liste standard o type=1 per le liste nere.

> Alias legacy: /addressbook/list.{format} — stesso endpoint, mantenuto per retrocompatibilità. > Le nuove integrazioni dovrebbero usare /list/*.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
titleFilterquerystringFiltra per titolo (corrispondenza parziale, case-insensitive)
typequeryinteger: 0, 10 = solo liste standard, 1 = solo liste nere. Ometti per restituirle tutte.
numberOfRecordsqueryintegerElementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione).
pageNumberqueryintegerNumero di pagina (1-based). Il valore predefinito è 1.
sortByNamequerybooleanImposta a true per ordinare i risultati alfabeticamente per titolo

Risposte

CodiceDescrizione
200Liste restituite con successo. > La risposta contiene anche un campo duplicato legacy AddressBookList (contenuto identico) > e ciascun elemento ha un duplicato legacy AddressBookID (identico a ListID). Le nuove > integrazioni dovrebbero ignorarli.
401Credenziali non valide

Esempio 200

{
  "Lists": [
    {
      "ListID": 101,
      "Title": "Newsletter — France",
      "Type": 0,
      "NumberEmails": 4521,
      "CreationDate": "2025-01-15T10:30:00"
    },
    {
      "ListID": 102,
      "Title": "Unsubscribers",
      "Type": 1,
      "NumberEmails": 312,
      "CreationDate": "2025-01-15T10:31:00"
    }
  ]
}

POST /list/add.{format}

Crea una lista

Crea una nuova lista (lista di contatti). La lista parte vuota — aggiungi contatti con /email/add o /email/addSingle. Massimo 1.000 liste per account (stesso limite sulle tre API Mailpro e nell'app). Restituisce HTTP 422 se il limite è raggiunto.

> Alias legacy: /addressbook/add.{format} — stesso endpoint, mantenuto per retrocompatibilità.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
TitlestringsìNome visualizzato per la nuova lista
Typeinteger: 0, 10 = lista standard (default), 1 = lista nera

Risposte

CodiceDescrizione
200Lista creata con successo. > Viene restituito anche un campo duplicato legacy AddressBookList (contenuto identico).
400Titolo mancante
401Credenziali non valide
422Limite di liste (1.000) raggiunto

Esempio 200

{
  "Lists": [
    {
      "ListID": 103,
      "Title": "Spring Campaign 2026",
      "Type": 0,
      "NumberEmails": 0,
      "CreationDate": "2026-04-14T12:00:00"
    }
  ]
}

POST /list/edit.{format}

Rinomina una lista

Aggiorna il titolo di una lista esistente. I contatti al suo interno non vengono modificati.

> Alias legacy: /addressbook/edit.{format} — stesso endpoint, mantenuto per retrocompatibilità. > Anche il nome del parametro AddressBookID è accettato come alias legacy di ListID.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
ListIDintegersìID della lista da rinominare (da /list/list). È accettato anche l'alias legacy AddressBookID.
TitlestringsìNuovo titolo della lista

Risposte

CodiceDescrizione
200Lista rinominata con successo
400ListID o Titolo mancanti
401Credenziali non valide
404Lista non trovata

POST /list/del.{format}

Elimina una lista

Elimina definitivamente una lista e tutti i contatti in essa contenuti. Questa azione non può essere annullata.

> Alias legacy: /addressbook/del.{format} — stesso endpoint, mantenuto per retrocompatibilità. > Anche il nome del parametro AddressBookID è accettato come alias legacy di ListID.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
ListIDintegersìID della lista da eliminare. È accettato anche l'alias legacy AddressBookID.

Risposte

CodiceDescrizione
200Lista eliminata con successo
400ListID mancante
401Credenziali non valide
404Lista non trovata

Esempio 200

{
  "Result": "OK"
}

Contacts

Gestisci singoli contatti email. I contatti appartengono a una o più liste. Usa l'importazione di massa (/email/add) per grandi lotti, oppure l'aggiunta di un singolo contatto (/email/addSingle) per iscrizioni individuali con valori dei campi personalizzati.

GET /email/list.{format}

Elenca i contatti

Restituisce un elenco paginato dei contatti email dell'account. Filtra per lista o per pattern email. I risultati sono ordinati alfabeticamente quando sortByName=true, altrimenti per ordine di inserimento.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
emailFilterquerystringFiltra per indirizzo email (corrispondenza parziale, case-insensitive)
listIdqueryintegerRestituisce solo i contatti in questa lista. È accettato anche l'alias legacy addressBookId.
numberOfRecordsqueryintegerElementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione).
pageNumberqueryintegerNumero di pagina (1-based). Il valore predefinito è 1.
sortByNamequerybooleanImposta a true per ordinare i risultati alfabeticamente per indirizzo email

Risposte

CodiceDescrizione
200Elenco contatti restituito con successo
401Credenziali non valide

Esempio 200

{
  "Emails": [
    {
      "IdEmail": 10001,
      "Email": "[email protected]",
      "Field1": "Alice",
      "Field2": "Dupont"
    }
  ]
}

POST /email/add.{format}

Importa contatti (massivo)

Importa uno o più indirizzi email in una lista in un'unica richiesta. Fornisci gli indirizzi in EmailList separati da punti e virgola.

Esempio: [email protected];[email protected];[email protected]

Questo endpoint importa solo gli indirizzi email. Per impostare anche i valori dei campi personalizzati, usa invece /email/addSingle per ciascun contatto.

Gli indirizzi precedentemente disiscritti vengono saltati silenziosamente a meno che non sia impostato Force=1.

Selezione della lista: fornisci ListId (o il suo alias legacy AddressBookId). Almeno uno è obbligatorio.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
ListIdintegerID della lista di destinazione. È accettato anche l'alias legacy AddressBookId.
EmailListstringsìIndirizzi email da importare separati da punti e virgola
Forceinteger: 0, 1Imposta a 1 per reimportare indirizzi precedentemente disiscritti. Default: 0 (gli indirizzi disiscritti vengono saltati).

Risposte

CodiceDescrizione
200Contatti importati con successo
400EmailList mancante
401Credenziali non valide

Esempio 200

{
  "Result": "3 contacts imported"
}

POST /email/addSingle.{format}

Aggiungi un singolo contatto

Aggiunge un contatto a una lista con valori dei campi personalizzati facoltativi.

Field1 fino a Field25 corrispondono alle definizioni delle colonne personalizzate della tua lista. La mappatura dipende dall'ordine in cui sono state definite le colonne — controlla le impostazioni della tua lista nell'interfaccia Mailpro per vedere quale numero di campo corrisponde a quale colonna (ad es. Field1 = Nome, Field2 = Cognome, Field3 = Città…).

Selezione della lista: fornisci ListId (o il suo alias legacy AddressBookId).

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
ListIdintegerID della lista di destinazione. È accettato anche l'alias legacy AddressBookId.
EmailstringsìIndirizzo email del nuovo contatto
Forceinteger: 0, 1Imposta a 1 per riaggiungere un indirizzo precedentemente disiscritto
Field1stringValore per il campo personalizzato 1 (la mappatura delle colonne dipende dalla tua lista)
Field2stringValore per il campo personalizzato 2
Field3stringValore per il campo personalizzato 3
Field4stringValore per il campo personalizzato 4
Field5stringValore per il campo personalizzato 5

Risposte

CodiceDescrizione
200Contatto aggiunto con successo
400Email mancante
401Credenziali non valide

Esempio 200

{
  "EmailId": 10002,
  "Email": "[email protected]",
  "Field1": "Alice",
  "Field2": "Dupont",
  "ListID": 101
}

POST /email/edit.{format}

Aggiorna un contatto

Aggiorna l'indirizzo email e/o i valori dei campi personalizzati di un contatto esistente. Identifica il contatto tramite EmailId (da /email/list). Sia EmailId sia Email sono obbligatori.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
EmailIdintegersìID del contatto da aggiornare (da /email/list)
EmailstringsìNuovo indirizzo email per il contatto
Field1stringNuovo valore per il campo personalizzato 1
Field2stringNuovo valore per il campo personalizzato 2
Field3stringNuovo valore per il campo personalizzato 3

Risposte

CodiceDescrizione
200Contatto aggiornato con successo
400EmailId o Email mancanti
401Credenziali non valide
404Contatto non trovato

POST /email/del.{format}

Elimina un contatto

Elimina definitivamente un contatto tramite il suo identificatore univoco.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
EmailIdintegersìID del contatto da eliminare (da /email/list)

Risposte

CodiceDescrizione
200Contatto eliminato con successo
400EmailId mancante
401Credenziali non valide
404Contatto non trovato

Messages

Gestisci i modelli email HTML. Un modello di messaggio memorizza l'oggetto dell'email, il corpo HTML e la configurazione del link di disiscrizione. I modelli vengono riutilizzati tra più campagne.

GET /message/list.{format}

Elenca i modelli di messaggio

Restituisce i modelli email HTML salvati per l'account. Per impostazione predefinita, il corpo HTML non è incluso nella risposta per mantenere ridotti i payload. Imposta bodyHTML=true per includerlo (limita automaticamente i risultati a 10 per pagina).

Scope OAuth : email:templates:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
subjectFilterquerystringFiltra per oggetto (corrispondenza parziale, case-insensitive)
numberOfRecordsqueryintegerElementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione).
pageNumberqueryintegerNumero di pagina (1-based). Il valore predefinito è 1.
bodyHTMLquerybooleanImposta a true per includere il corpo HTML completo in ogni risultato. Quando è true, i risultati vengono automaticamente limitati a 10 per pagina indipendentemente da numberOfRecords.

Risposte

CodiceDescrizione
200Modelli di messaggio restituiti con successo
401Credenziali non valide

Esempio 200

{
  "MessageList": [
    {
      "IDMessage": 501,
      "Subject": "Spring Newsletter — April 2026",
      "Language": "EN",
      "LinkAlign": "center",
      "LinkUp": 0,
      "UpdateDate": "2026-03-10T14:22:00"
    }
  ]
}

POST /message/add.{format}

Crea un modello di messaggio

Crea un nuovo modello email HTML. Il modello memorizza l'oggetto, il corpo HTML e le impostazioni del link di disiscrizione. Una volta creato, usa l'IDMessage restituito quando avvii una campagna.

Scope OAuth : email:templates:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
SubjectstringsìOggetto dell'email (massimo 255 caratteri)
BodyHTMLstringsìContenuto HTML completo del corpo dell'email
LanguagestringsìCodice lingua per la localizzazione del link di disiscrizione (ad es. EN, FR, DE)
LinkAlignstring: left, center, rightsìAllineamento orizzontale del link di disiscrizione
LinkUpinteger: 0, 1sìPosizione del link di disiscrizione — 0 = in fondo all'email, 1 = in alto

Risposte

CodiceDescrizione
200Modello di messaggio creato con successo
400Campo obbligatorio mancante
401Credenziali non valide

Esempio 200

{
  "IDMessage": 502,
  "Subject": "Spring Newsletter — April 2026",
  "Language": "EN",
  "LinkAlign": "center",
  "LinkUp": 0
}

POST /message/edit.{format}

Aggiorna un modello di messaggio

Aggiorna il contenuto e i metadati di un modello di messaggio esistente.

Scope OAuth : email:templates:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
MessageIdintegersìID del modello di messaggio da aggiornare (da /message/list)
SubjectstringsìNuovo oggetto dell'email
BodyHTMLstringsìNuovo contenuto HTML del corpo dell'email
LanguagestringsìCodice lingua per la localizzazione del link di disiscrizione
LinkAlignstring: left, center, rightsì
LinkUpinteger: 0, 1sì

Risposte

CodiceDescrizione
200Modello di messaggio aggiornato con successo
400Campo obbligatorio mancante
401Credenziali non valide
404Modello di messaggio non trovato

POST /message/del.{format}

Elimina un modello di messaggio

Elimina definitivamente un modello di messaggio tramite il suo identificatore univoco. I modelli utilizzati da campagne pianificate in attesa non possono essere eliminati.

Scope OAuth : email:templates:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
MessageIdintegersìID del modello di messaggio da eliminare (da /message/list)

Risposte

CodiceDescrizione
200Modello di messaggio eliminato con successo
400MessageId mancante
401Credenziali non valide
404Modello di messaggio non trovato

Campaigns

Invia campagne email di massa a una lista e gestisci gli invii pianificati. Una campagna utilizza un modello di messaggio e un indirizzo mittente.

GET /send/list.{format}

Elenca le campagne pianificate

Restituisce l'elenco delle campagne email pianificate e recentemente elaborate. I risultati sono ordinati per data di invio pianificata (la più recente per prima).

Scope OAuth : email:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
subjectMessageFilterquerystringFiltra per oggetto della campagna (corrispondenza parziale, case-insensitive)
numberOfRecordsqueryintegerElementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione).
pageNumberqueryintegerNumero di pagina (1-based). Il valore predefinito è 1.

Risposte

CodiceDescrizione
200Elenco delle campagne restituito con successo
401Credenziali non valide

Esempio 200

{
  "sends": [
    {
      "IDSend": 3001,
      "ListID": 101,
      "SenderEmail": "[email protected]",
      "SenderName": "Your Company Newsletter",
      "DatePlanned": "2026-04-20T09:00:00",
      "SubjectMessage": "Spring Newsletter — April 2026",
      "NumberCredit": 4521
    }
  ]
}

POST /send/campaign.{format}

Avvia una campagna

Pianifica o invia immediatamente una campagna email a una lista utilizzando un modello di messaggio salvato e un indirizzo mittente.

Obbligatorio:

Pianificazione: imposta DatePlanned su una data/ora ISO 8601 futura per pianificare l'invio. Ometti DatePlanned per inviare immediatamente.

Tracciamento delle statistiche: imposta Campaign=1 e fornisci un TitleCampaign per abilitare il tracciamento di aperture/clic/bounce nella sezione Statistiche.

Scope OAuth : email:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
ListIdintegerID della lista dei destinatari (da /list/list). È accettato anche l'alias legacy IDAddressBook.
IDMessageintegersìID del modello di messaggio da inviare (da /message/list)
IDEmailExpintegersìID dell'indirizzo email mittente da utilizzare (da /senderEmail/list)
IDUnsubscribeListintegerLista utilizzata per raccogliere i contatti disiscritti (lista nera). È accettato anche l'alias legacy IDUnsubscribeAddressBook.
DatePlannedstring (date-time)Data/ora di invio pianificata (ISO 8601). Ometti per inviare immediatamente.
Campaigninteger: 0, 1Imposta a 1 per tracciare questo invio come campagna denominata nelle statistiche
TitleCampaignstringTitolo della campagna mostrato nelle statistiche (obbligatorio quando Campaign=1)

Risposte

CodiceDescrizione
200Campagna pianificata o inviata con successo. > La risposta restituisce anche gli alias legacy AddressBookID e UnsubscribeAddressBookID > (identici a ListID / UnsubscribeListID). Le nuove integrazioni dovrebbero ignorarli.
400IDMessage o IDEmailExp mancanti
401Credenziali non valide
403Crediti email insufficienti
404Lista, messaggio o mittente non trovati

Esempio 200

{
  "send": {
    "IDSend": 3002,
    "ListID": 101,
    "UnsubscribeListID": 102,
    "IDCampaign": 8001,
    "SenderName": "Your Company Newsletter",
    "SenderEmail": "[email protected]",
    "DatePlanned": "2026-04-20T09:00:00",
    "SubjectMessage": "Spring Newsletter — April 2026",
    "NumberCredit": 4521
  }
}

POST /send/del.{format}

Annulla o elimina una campagna

Annulla l'invio di una campagna pianificata in attesa o elimina una campagna completata. Solo gli invii pianificati per il futuro possono essere annullati — gli invii in corso non possono essere fermati.

Scope OAuth : email:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
IdSendintegersìID dell'invio della campagna da annullare o eliminare (da /send/list)

Risposte

CodiceDescrizione
200Campagna annullata o eliminata con successo
400IdSend mancante
401Credenziali non valide
404Campagna non trovata

Esempio 200

{
  "Result": "Campaign Deleted"
}

GET /send/scheduled.{format}

Elenca le mie campagne email pianificate

Restituisce le campagne email e gli invii singoli pianificati per una data futura che non sono ancora stati recapitati. Utile prima di chiamare /cancel o /reschedule. I record sono ordinati per DatePlanned crescente.

Scope OAuth : email:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
numberOfRecordsqueryintegerElementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione).
pageNumberqueryintegerNumero di pagina (1-based). Il valore predefinito è 1.

Risposte

CodiceDescrizione
200Elenco delle campagne / invii pianificati. > Ogni record include anche gli alias legacy AddressBookID e > UnsubscribeAddressBookID (identici a ListID / UnsubscribeListID).
401Credenziali non valide

Esempio 200

{
  "sends": [
    {
      "IDSend": 5001,
      "ListID": 101,
      "UnsubscribeListID": 102,
      "IDCampaign": 8001,
      "SenderName": "Your Company Newsletter",
      "SenderEmail": "[email protected]",
      "DatePlanned": "2026-05-01T09:00:00",
      "SubjectMessage": "Spring Sale 2026",
      "NumberCredit": 4521
    }
  ]
}

POST /send/{IdSend}/cancel.{format}

Annulla una campagna / invio pianificato

Annulla un invio email pianificato (campagna o singolo) che non è ancora stato recapitato. Se l'invio è già stato effettuato (o non esiste / appartiene a un altro client), restituisce 409 Conflict.

Scope OAuth : email:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
IdSendpathintegersì

Risposte

CodiceDescrizione
200Invio annullato
401Credenziali non valide
409Già recapitato o non trovato

Esempio 200

{
  "Result": "OK",
  "Cancelled": 5001
}

PATCH /send/{IdSend}/reschedule.{format}

Ripianifica una campagna / invio pianificato

Aggiorna la DatePlanned di un invio email pianificato. La nuova data deve essere futura e entro 90 giorni.

Scope OAuth : email:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
IdSendpathintegersì

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
PlanDatestring (date-time)sì

Risposte

CodiceDescrizione
200Invio ripianificato
400PlanDate mancante o non valida
401Credenziali non valide
409Già recapitato, non trovato o nuova data fuori intervallo (deve essere futura ed entro 90 giorni)

Esempio 200

{
  "Result": "OK",
  "IdSend": 5001,
  "NewPlanDate": "2026-12-31T14:30:00"
}

POST /send/sendingTest.{format}

Invia un'email di test

Invia un'anteprima di un modello di messaggio a un destinatario specificato per la revisione prima di avviare la campagna reale. Il mittente, il modello e il destinatario di test sono tutti identificati dai loro ID.

Scope OAuth : email:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
MessageIdintegersìID del modello di messaggio di cui visualizzare l'anteprima (da /message/list)
IDEmailExpFromintegersìID dell'indirizzo mittente da utilizzare (da /senderEmail/list)
IDEmailExpTointegersìID dell'indirizzo mittente destinatario — l'email di test viene inviata a questo indirizzo

Risposte

CodiceDescrizione
200Email di test inviata con successo
400Campo obbligatorio mancante
401Credenziali non valide

Esempio 200

{
  "SendingTest": {
    "IdSendingTest": 7001,
    "ToEmail": "[email protected]",
    "FromEmail": "[email protected]",
    "SenderName": "Your Company Newsletter"
  }
}

Transactional

Invia email transazionali singole a destinatari individuali. A differenza delle campagne, le email transazionali non richiedono una lista — passi direttamente l'email del destinatario e il corpo HTML.

GET /send/mail/scheduled.{format}

Elenca le email singole pianificate

Restituisce le email singole inviate con /send/sendmail e una data futura, non ancora partite. Le campagne sono elencate da /send/scheduled.

Scope OAuth : email:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Risposte

CodiceDescrizione
200Email pianificate restituite
401Credenziali non valide

Esempio 200

{
  "scheduledMails": [
    {
      "IdSingleSend": 880123,
      "Email": "[email protected]",
      "Subject": "Your invoice",
      "DatePlanned": "2026-12-01T09:00:00"
    }
  ]
}

POST /send/mail/{IdSingleSend}/cancel.{format}

Annulla un'email singola pianificata

Annulla l'email finché non è partita.

Scope OAuth : email:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
IdSingleSendpathinteger (int64)sìIdSingleSend restituito da /send/sendmail

Risposte

CodiceDescrizione
200Email annullata
401Credenziali non valide
409Invio non trovato o già partito

Esempio 200

{
  "Result": "OK",
  "Cancelled": 880123
}

POST /send/mail/{IdSingleSend}/reschedule.{format}

Ripianifica un'email singola pianificata

Cambia la data di invio. La nuova data deve essere futura ed entro 90 giorni. È accettato anche PATCH.

Scope OAuth : email:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
IdSingleSendpathinteger (int64)sìIdSingleSend restituito da /send/sendmail

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
PlanDatestring (date-time)sìNuova data di invio (ISO 8601)

Risposte

CodiceDescrizione
200Email ripianificata
400Data mancante o non valida
401Credenziali non valide
409Invio non trovato, già partito o data fuori dai limiti

Esempio 200

{
  "Result": "OK",
  "IdSingleSend": 880123,
  "NewPlanDate": "2026-12-15T09:00:00"
}

POST /send/sendmail.{format}

Invia un'email transazionale

Invia un'email transazionale singola a uno o più destinatari. A differenza delle campagne, questo endpoint non richiede una lista — l'indirizzo del destinatario e il corpo HTML vengono passati direttamente.

Obbligatorio:

Formato EmailData: [email protected],Alice,Dupont,Parigi Il primo valore è l'indirizzo email; i valori 2–26 corrispondono a Field1–Field25 per le variabili di personalizzazione nel tuo modello HTML.

Più destinatari: separa più voci EmailData con punti e virgola: [email protected],Alice;[email protected],Bob

Pianificazione: imposta DatePlanned su una data/ora ISO 8601 futura, oppure ometti per inviare immediatamente.

Scope OAuth : email:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (multipart/form-data)

NomeTipoObbligatorioDescrizione
IDEmailExpintegersìID dell'indirizzo email mittente da utilizzare (da /senderEmail/list)
EmailDatastringsìDestinatario nel formato email,campo1,campo2,...,campo25 (separati da virgola). Il primo valore è l'indirizzo email; i restanti sono campi di personalizzazione mappati su Field1–Field25 nel tuo modello HTML. La parte locale dell'email (prima della @) accetta lettere, cifre e . _ - + — incluso il sub-addressing RFC 5322 (user+tag@domain, es. Gmail, Fastmail, Proton). Gli altri caratteri speciali consentiti dalla RFC 5322 (es. ! # $ % & ' * / = ? ^ { | } ~) e le parti locali tra virgolette non sono accettati.
BodyHTMLstringsìContenuto HTML completo del corpo dell'email
SubjectstringsìOggetto dell'email (massimo 255 caratteri)
attachmentsarray of string (binary)Allegati facoltativi — invia la richiesta come multipart/form-data e aggiungi una parte file per ogni allegato (qualsiasi nome di campo). Fino a 5 file, 10 MB per file, 15 MB in totale. Tipi accettati: PDF, Word, Excel, PowerPoint, immagini (JPG, PNG, GIF, WebP), ZIP, CSV, TXT — i file eseguibili e gli script vengono rifiutati. Fatturazione: l'invio mantiene il suo credito abituale, più 1 credito ogni 512 KB di allegati oltre i primi 512 KB (gli allegati ≤ 512 KB non aggiungono nulla). Tutti gli altri campi di questo endpoint (ReplyTo, ActivateStatistics, CustomHeaders, …) funzionano esattamente come nella variante form-urlencoded.
KeepInMyFilesbooleanfalse (predefinito): gli allegati servono solo per questo invio — sono archiviati fuori dal tuo account, non contano nella tua quota di archiviazione e vengono eliminati automaticamente dopo 35 giorni. true: gli allegati vengono anche conservati nei file del tuo account (cartella Secure/Files/Sending/api) e contano nella tua quota di archiviazione.

Risposte

CodiceDescrizione
200Email transazionale inviata o pianificata con successo
400Campo obbligatorio mancante o formato email non valido
401Credenziali non valide
403Crediti email insufficienti
404Mittente non trovato o indirizzo email disiscritto

Esempio 200

{
  "SingleSend": {
    "IdSingleSend": 8001,
    "IdEmailExp": 201,
    "DatePlanned": "2026-04-15T14:30:00",
    "Subject": "Your order #12345 is confirmed",
    "Email": "[email protected]",
    "Field1": "Alice",
    "Field2": "Dupont",
    "UnsubscriptionLink": false,
    "ActivateStatistics": true
  }
}

GET /send/{IdSend}/status.{format}

Ottieni lo stato di consegna di un'email transazionale

Restituisce lo stato di consegna attuale di un'email transazionale inviata con /send/sendmail. Passa l'IdSingleSend restituito da quella chiamata.

Valori possibili: delivered (accettata dal server del destinatario, vedi DiagCode), bounced (rifiutata — BounceType: hard indirizzo non valido o rifiuto definitivo, soft rifiuto dopo nuovi tentativi), sent (consegnata al server di posta, ancora nessuna risposta), scheduled (non ancora inviata, DatePlanned nel futuro) e queued (in attesa di invio). delivered e bounced sono finali: smettete di interrogare. Ogni email ha uno stato finale al più tardi 48 ore dopo l'invio; interrogate al massimo ogni 15 minuti (ogni chiamata conta nella vostra quota API) oppure usate i webhook email.delivered / email.bounced. Solo il cliente che ha inviato l'email può leggerne lo stato — qualsiasi altro id restituisce 404.

Scope OAuth : email:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
IdSendpathintegersìL'IdSingleSend restituito da /send/sendmail.

Risposte

CodiceDescrizione
200Stato di consegna attuale
401Credenziali non valide
404Nessun invio transazionale trovato con questo id per questo cliente

Esempio 200

{
  "status": {
    "IdSingleSend": 8001,
    "Email": "[email protected]",
    "Status": "delivered",
    "DatePlanned": "2026-04-15T14:30:00",
    "StatusDate": "2026-04-15T14:30:07",
    "DiagCode": "2.0.0 (success)",
    "BounceType": null
  }
}

Sender Addresses

Elenca e gestisci gli indirizzi email mittenti validati. Solo gli indirizzi verificati possono essere utilizzati come indirizzo From nelle campagne.

GET /senderEmail/list.{format}

Elenca gli indirizzi mittenti validati

Restituisce l'elenco degli indirizzi email mittenti configurati per l'account. Solo gli indirizzi con IsValid: true possono essere utilizzati per inviare campagne. I nuovi indirizzi si aggiungono con /senderEmail/add e diventano validi dopo aver cliccato il link nell'email di convalida.

Scope OAuth : email:templates:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
emailFilterquerystringFiltra per indirizzo email (corrispondenza parziale, case-insensitive)
numberOfRecordsqueryintegerElementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione).
pageNumberqueryintegerNumero di pagina (1-based). Il valore predefinito è 1.
sortByNamequerybooleanImposta a true per ordinare i risultati per nome del mittente alfabeticamente

Risposte

CodiceDescrizione
200Indirizzi mittenti restituiti con successo
401Credenziali non valide

Esempio 200

{
  "ExpEmailList": [
    {
      "IDEmailExp": 201,
      "Email": "[email protected]",
      "SenderName": "Your Company Newsletter",
      "IsValid": true,
      "CreationDate": "2025-06-01T09:00:00"
    },
    {
      "IDEmailExp": 202,
      "Email": "[email protected]",
      "SenderName": "Your Company Support",
      "IsValid": true,
      "CreationDate": "2025-06-01T09:05:00"
    }
  ]
}

POST /senderEmail/add.{format}

Aggiungi un indirizzo mittente

Aggiunge l'indirizzo con gli stessi controlli dell'applicazione e gli invia un'email di convalida. È utilizzabile dopo aver cliccato il link in quell'email. Un account può avere fino a 25 mittenti, convalidati o in attesa.

Scope OAuth : email:templates:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
EmailstringsìIndirizzo del mittente
SenderNamestringsìNome mostrato ai destinatari

Risposte

CodiceDescrizione
200Indirizzo aggiunto. DomainHasMx è false quando il dominio non ha un record MX.
400Email o SenderName mancante
401Credenziali non valide
422Indirizzo rifiutato: non valido, già tra i mittenti dell'account, dominio di posta pubblico, nome vietato o limite di 25 raggiunto. Il messaggio indica il motivo.
503Temporaneamente non disponibile, riprova

Esempio 200

{
  "Result": "OK",
  "ConfirmationSent": true,
  "DomainHasMx": true
}

POST /senderEmail/{IdSenderEmail}/resendValidation.{format}

Invia di nuovo l'email di convalida

Per un indirizzo ancora in attesa di convalida.

Scope OAuth : email:templates:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
IdSenderEmailpathintegersìID del mittente, da /senderEmail/list

Risposte

CodiceDescrizione
200Email inviata di nuovo
401Credenziali non valide
404Mittente non trovato
409Questo mittente è già convalidato
503Temporaneamente non disponibile, riprova

Esempio 200

{
  "Result": "OK",
  "ConfirmationSent": true
}

GET /senderEmail/{IdSenderEmail}/authentication.{format}

Controlla il dominio di un mittente (SPF, DKIM, DMARC, MX)

Controlla il dominio in tempo reale nel DNS e restituisce i record da pubblicare. Sola lettura. Il DKIM si attiva nell'applicazione: DkimSettingsUrl apre la schermata giusta.

Scope OAuth : email:templates:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
IdSenderEmailpathintegersìID del mittente, da /senderEmail/list

Risposte

CodiceDescrizione
200Stato del dominio. Spf.RecommendedRecord è costruito a partire dal tuo record attuale: pubblicalo solo se Spf.ChangeNeeded è true.
401Credenziali non valide
404Mittente non trovato
503Temporaneamente non disponibile, riprova

Esempio 200

{
  "Domain": "example.com",
  "Spf": {
    "Valid": true,
    "Record": "v=spf1 include:spf.mailpro.com -all",
    "RecommendedRecord": "v=spf1 include:spf.mailpro.com -all",
    "ChangeNeeded": false
  },
  "Dkim": {
    "Valid": true,
    "Records": [
      {
        "Host": "key._domainkey.example.com",
        "Value": "v=DKIM1;k=rsa;p=MIIBIjANBgkq...",
        "Validated": true
      }
    ]
  },
  "Dmarc": {
    "Valid": true,
    "Record": "v=DMARC1; p=quarantine"
  },
  "Mx": {
    "Valid": true,
    "Record": "mail.example.com"
  },
  "DkimSettingsUrl": "https://app.mailpro.com/dkim/list?d=example.com"
}

POST /senderEmail/del.{format}

Rimuovi un indirizzo mittente

Rimuove un indirizzo email mittente validato dall'account. Gli indirizzi mittenti utilizzati da campagne pianificate non possono essere eliminati.

Scope OAuth : email:templates:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
idEmailExpintegersìID dell'indirizzo mittente da rimuovere (da /senderEmail/list)

Risposte

CodiceDescrizione
200Indirizzo mittente rimosso con successo
400idEmailExp mancante
401Credenziali non valide

Esempio 200

{
  "Result": "EmailSender Deleted"
}

Statistics

Accedi alle metriche di performance per campagna: aperture, clic, bounce e altro. Sono disponibili analisi dettagliate per ora, giorno, paese, OS e client di posta.

GET /stats/list.{format}

Elenca le statistiche delle campagne

Restituisce le metriche di performance complessive per tutte le campagne: numero di invii, tasso di apertura, tasso di clic, numero di bounce. Filtra per intervallo di date o titolo della campagna. I risultati sono ordinati per data di invio (la più recente per prima).

Scope OAuth : email:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
titleCampaignFilterquerystringFiltra per titolo della campagna (corrispondenza parziale, case-insensitive)
numberOfRecordsqueryintegerElementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione).
pageNumberqueryintegerNumero di pagina (1-based). Il valore predefinito è 1.
dateStartquerystring (date-time)Inizio del filtro per intervallo di date (ISO 8601)
dateEndquerystring (date-time)Fine del filtro per intervallo di date (ISO 8601)

Risposte

CodiceDescrizione
200Statistiche delle campagne restituite con successo
401Credenziali non valide

Esempio 200

{
  "Campaigns": [
    {
      "IdCampaign": 8001,
      "DateCampaign": "2026-04-20T09:00:01",
      "TitleCampaign": "Spring Newsletter April 2026",
      "NumberEmailSend": 4521,
      "NumberEmailOpen": 1823,
      "NumberEmailClick": 342,
      "BadMail": 12,
      "NumberUnsubscribers": 8,
      "NumberComplaints": 1,
      "SpamTrap": 0,
      "DeliverabilityScore": 98
    }
  ]
}

GET /stats/byHour.{format}

Statistiche per ora

Restituisce la suddivisione oraria delle aperture e dei clic per una campagna specifica. Utile per comprendere l'orario di invio ottimale.

Scope OAuth : email:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
idCampaignqueryintegersìID della campagna (da /stats/list)

Risposte

CodiceDescrizione
200Statistiche orarie restituite con successo
401Credenziali non valide

Esempio 200

{
  "ByHour": [
    {
      "Hour": 9,
      "Opens": 823,
      "Clicks": 142
    },
    {
      "Hour": 10,
      "Opens": 512,
      "Clicks": 98
    }
  ]
}

GET /stats/byDay.{format}

Statistiche per giorno

Restituisce la suddivisione giornaliera delle aperture e dei clic per una campagna specifica.

Scope OAuth : email:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
idCampaignqueryintegersìID della campagna (da /stats/list)

Risposte

CodiceDescrizione
200Statistiche giornaliere restituite con successo
401Credenziali non valide

POST /stats/del.{format}

Elimina le statistiche della campagna

Elimina definitivamente tutti i record di statistiche per una determinata campagna.

Scope OAuth : email:templates:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
IdCampaignintegersìID della campagna le cui statistiche eliminare (da /stats/list)

Risposte

CodiceDescrizione
200Statistiche della campagna eliminate con successo
400IdCampaign mancante
401Credenziali non valide
404Campagna non trovata

Esempio 200

{
  "Result": "Statistic Deleted"
}

GET /stats/country.{format}

Suddivisione per geolocalizzazione

Restituisce la suddivisione per geolocalizzazione delle aperture della campagna — quante aperture sono provenute da ciascun paese.

Scope OAuth : email:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
idCampaignqueryintegersì

Risposte

CodiceDescrizione
200Suddivisione per paese restituita
401Credenziali non valide

GET /stats/open.{format}

Registro degli eventi di apertura

Restituisce il registro per destinatario degli eventi di apertura per una campagna (una riga per ciascuna apertura). Usa emailFilter per cercare un destinatario specifico (parziale, case-insensitive).

Scope OAuth : email:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
idCampaignqueryintegersì
emailFilterquerystring
numberOfRecordsqueryintegerElementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione).
pageNumberqueryintegerNumero di pagina (1-based). Il valore predefinito è 1.

Risposte

CodiceDescrizione
200Eventi di apertura restituiti
401Credenziali non valide

GET /stats/click.{format}

Registro degli eventi di clic

Restituisce il registro per destinatario degli eventi di clic per una campagna — incluso quale link è stato cliccato e quando.

Scope OAuth : email:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
idCampaignqueryintegersì
emailFilterquerystring
numberOfRecordsqueryintegerElementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione).
pageNumberqueryintegerNumero di pagina (1-based). Il valore predefinito è 1.

Risposte

CodiceDescrizione
200Eventi di clic restituiti
401Credenziali non valide

GET /stats/system.{format}

Suddivisione per sistema operativo

Restituisce la suddivisione delle aperture per sistema operativo (Windows, macOS, iOS, Android, Linux, ecc.) per una determinata campagna.

Scope OAuth : email:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
idCampaignqueryintegersì

Risposte

CodiceDescrizione
200Suddivisione per OS restituita
401Credenziali non valide

GET /stats/emailSoftware.{format}

Suddivisione per client di posta

Restituisce la suddivisione delle aperture per client di posta (Gmail, Outlook, Apple Mail, Thunderbird, ecc.) per una determinata campagna.

Scope OAuth : email:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
idCampaignqueryintegersì

Risposte

CodiceDescrizione
200Suddivisione per client di posta restituita
401Credenziali non valide

GET /stats/bounce.{format}

Registro dei rimbalzi

Restituisce l'elenco dei destinatari rimbalzati (rimbalzi hard, rimbalzi soft, segnalazioni di spam) di una campagna, con il motivo dell'errore per ogni indirizzo.

Scope OAuth : email:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
idCampaignqueryintegersì
emailFilterquerystring
numberOfRecordsqueryintegerElementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione).
pageNumberqueryintegerNumero di pagina (1-based). Il valore predefinito è 1.

Risposte

CodiceDescrizione
200Eventi di rimbalzo restituiti
401Credenziali non valide

Esempio 200

{
  "ListBadMail": [
    {
      "Email": "[email protected]",
      "Date": "2026-04-20T09:05:12",
      "Error": "550 5.1.1 recipient rejected",
      "AddressbookId": 1813318
    }
  ]
}

History

Sfoglia il registro completo di tutti gli invii email passati.

GET /history/list.{format}

Elenca la cronologia degli invii

Restituisce un registro paginato di tutti gli invii email passati. Filtra per ID campagna o per oggetto. Imposta bodyHTML=true per includere il corpo HTML (limita automaticamente a 10 per pagina).

Scope OAuth : email:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
subjectMessageFilterquerystringFiltra per oggetto della campagna (corrispondenza parziale, case-insensitive)
idCampaignqueryintegerRestituisce la cronologia solo per una campagna specifica
numberOfRecordsqueryintegerElementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione).
pageNumberqueryintegerNumero di pagina (1-based). Il valore predefinito è 1.
bodyHTMLquerybooleanImposta a true per includere il corpo HTML completo. Limita automaticamente i risultati a 10 per pagina.

Risposte

CodiceDescrizione
200Cronologia restituita con successo
401Credenziali non valide

Esempio 200

{
  "HistoricList": [
    {
      "IDHistoric": 9001,
      "SubjectMessage": "Spring Newsletter — April 2026",
      "DateSend": "2026-04-20T09:00:01",
      "NumberSend": 4521,
      "NumberOpen": 1823,
      "NumberClick": 342
    }
  ]
}

Import

Carica un file CSV o XLSX per importare contatti email in una lista in modo massivo. Il file viene messo in coda per l'elaborazione asincrona — monitora il completamento tramite l'ImportJobId restituito o tramite la callback WebhookUrl opzionale.

POST /import/upload.{format}

Carica un file di contatti (CSV / XLSX) per l'importazione massiva

Carica un file CSV o XLSX per importare contatti email in una lista. Il file viene memorizzato e messo in coda per l'elaborazione asincrona — l'endpoint restituisce immediatamente un ImportJobId.

Tipo di richiesta: multipart/form-data

Campi del form obbligatori:

Facoltativo:

Formato del file:

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (multipart/form-data)

NomeTipoObbligatorioDescrizione
ListIdintegersìID della lista di destinazione. È accettato anche l'alias legacy AddressBookId.
filestring (binary)sìFile CSV o XLSX (UTF-8, massimo 50 MB)
WebhookUrlstring (uri)URL di callback invocato al termine dell'elaborazione

Risposte

CodiceDescrizione
200File accettato e messo in coda
400Nessun file caricato o ListId mancante
401Credenziali non valide
500Errore del server o dello storage

Esempio 200

{
  "Result": "OK",
  "ImportJobId": 13,
  "InternalName": "230575-20260420140221-contacts.csv"
}

Webhooks

Sottoscrivi il tuo server alle notifiche di eventi in tempo reale. Mailpro effettua il POST di un payload JSON firmato con HMAC al tuo URL non appena si verifica l'evento sottoscritto. Consulta la sezione "Webhooks" nell'introduzione per il catalogo completo degli eventi, l'envelope del payload, gli snippet di verifica della firma e la policy di ritentativo.

GET /webhooks

Elenca i webhook

Restituisce ogni webhook configurato sull'account autenticato.

Risposte

CodiceDescrizione
200Array di webhook
401Credenziali non valide

Esempio 200

{
  "items": [
    {
      "id": 14,
      "url": "https://example.com/hooks/mailpro",
      "description": "Integrazione Slack",
      "is_active": true,
      "created_at": "2026-07-01T21:09:52.43",
      "updated_at": "2026-07-21T18:56:08.02",
      "last_delivery_at": "2026-07-21T18:56:07.653",
      "last_delivery_status": 200,
      "consecutive_failures": 0,
      "events": [
        "email.delivered",
        "email.bounced"
      ]
    }
  ],
  "total": 1
}

POST /webhooks

Crea un webhook

Crea una nuova sottoscrizione webhook. La risposta contiene un secret che viene mostrato una sola volta — memorizzalo immediatamente, lato server. Usalo per verificare la firma HMAC di ogni payload in arrivo.

Limiti: massimo 20 webhook per account, massimo 50 eventi per webhook.

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
urlstring (uri)sìEndpoint HTTPS (HTTP rifiutato in produzione)
eventsarray of stringsìElenco dei tipi di evento da sottoscrivere (vedi il catalogo sopra). Usa ["*"] per sottoscriverti a tutti gli eventi di questa API.
descriptionstring

Esempio

{
  "url": "https://example.com/hooks/mailpro",
  "events": [
    "email.delivered",
    "email.bounced"
  ],
  "description": "Integrazione Slack"
}

Risposte

CodiceDescrizione
201Webhook creato — il secret viene restituito solo qui
400URL non valido, elenco eventi non valido o limite superato
401Credenziali non valide

Esempio 201

{
  "id": 42,
  "url": "https://example.com/hooks/mailpro",
  "events": [
    "email.delivered",
    "email.bounced"
  ],
  "description": "Integrazione Slack",
  "isActive": true,
  "consecutiveFailures": 0,
  "autoDisabledAt": null,
  "autoDisabledReason": null,
  "createdAt": "2026-05-25T10:00:00Z",
  "updatedAt": "2026-05-25T10:00:00Z",
  "secret": "whsec_AbcD1234EfgH5678IjkL9012MnoP3456QrsT"
}

GET /webhooks/{id}

Ottieni un webhook

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
200Il webhook
404Webhook non trovato

PUT /webhooks/{id}

Aggiorna un webhook

Aggiornamento parziale — solo i campi inviati vengono modificati.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
urlstring (uri)
eventsarray of string
descriptionstring
isActivebooleanImposta true per riattivare un webhook disattivato automaticamente una volta corretto l'endpoint.

Risposte

CodiceDescrizione
200Webhook aggiornato
400Payload non valido
404Webhook non trovato

DELETE /webhooks/{id}

Elimina un webhook

Elimina definitivamente il webhook e la sua intera cronologia di recapito.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
204Eliminato
404Webhook non trovato

POST /webhooks/{id}/test

Invia un evento di test

Mette in coda un evento ping immediato (o qualsiasi altro tipo di evento tramite il campo body eventType) verso il tuo endpoint. Utile per verificare la raggiungibilità e la verifica della firma prima di affidarsi agli eventi reali.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
eventTypestring

Esempio

{
  "eventType": "ping"
}

Risposte

CodiceDescrizione
202Evento messo in coda per il recapito
404Webhook non trovato

Esempio 202

{
  "deliveryId": 1234,
  "eventId": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
  "eventType": "ping"
}

POST /webhooks/{id}/rotate-secret

Ruota il segreto HMAC

Genera un nuovo segreto HMAC e invalida immediatamente quello vecchio. Il nuovo segreto viene restituito una sola volta nella risposta — memorizzalo. Da questo momento in poi ogni recapito verrà firmato con il nuovo segreto.

Usalo se sospetti che il tuo segreto sia stato compromesso.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
200Nuovo segreto (visibile una sola volta)
404Webhook non trovato

Esempio 200

{
  "secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}

GET /webhooks/{id}/deliveries

Elenca i tentativi di recapito

Restituisce la cronologia dei tentativi di recapito per questo webhook (retention di 30 giorni). Utile per il debug — quali eventi sono stati inviati, i codici di stato ricevuti, i conteggi dei tentativi, i messaggi di errore.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì
limitqueryinteger
cursorqueryinteger (int64)Cursore di paginazione (= ultimo ID di recapito visto). Restituisce i recapiti con id < cursor.

Risposte

CodiceDescrizione
200Array di tentativi di recapito (i più recenti per primi)
404Webhook non trovato

POST /webhooks/{id}/deliveries/{deliveryId}/replay

Riproduci un recapito

Mette in coda un nuovo tentativo di recapito con lo stesso payload dell'originale. Utile per ritentare un recapito fallito dopo aver corretto il tuo endpoint. Viene creata una NUOVA riga Webhook_Delivery (l'originale viene preservata per l'audit). Il replay segue la policy di ritentativo standard (stessa schedulazione di backoff, stessa regola di disattivazione automatica dopo 10 fallimenti).

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì
deliveryIdpathinteger (int64)sì

Risposte

CodiceDescrizione
202Replay messo in coda
404Webhook o recapito non trovati

Suppression

Bounce e disiscritti dell'account: elencare, aggiungere, rimuovere.

GET /suppression/bounces.{format}

Elenca i bounce dell'account

Prima i più recenti. Il totale è nell'intestazione X-Total-Count.

Scope OAuth : email:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
typequerystring: hard, softhard o soft
sourcequerystringOrigine del bounce: list, contact, api o smtp
emailquerystringIndirizzo esatto
dateFromquerystring (date-time)A partire da questa data
dateToquerystring (date-time)Fino a questa data
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Bounce restituiti
400type deve essere hard o soft
401Credenziali non valide

Esempio 200

{
  "bounces": [
    {
      "Id": 5521,
      "Source": "contact",
      "BounceType": "hard",
      "Email": "[email protected]",
      "Date": "2026-10-12T08:30:00",
      "DiagCode": "550 5.1.1 User unknown",
      "IdList": 101
    }
  ]
}

POST /suppression/bounces/{Id}/del.{format}

Rimuovi un bounce

Source e Type sono obbligatori, come restituiti da /suppression/bounces: un Id da solo non è univoco.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
Idpathinteger (int64)sìId del bounce

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
Sourcestringsìlist, contact, api o smtp
Typestring: hard, softsìhard o soft

Risposte

CodiceDescrizione
200Bounce rimosso
400Source o Type mancante
401Credenziali non valide
404Bounce non trovato

Esempio 200

{
  "Result": "OK",
  "Id": 5521,
  "Restored": false
}

POST /suppression/bounces/{Id}/restore.{format}

Rimetti nelle sue liste un contatto in hard bounce

Solo per un hard bounce con origine contact.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
Idpathinteger (int64)sìId del bounce

Risposte

CodiceDescrizione
200Contatto rimesso in lista
401Credenziali non valide
404Hard bounce di un contatto non trovato o indirizzo non più attivo

Esempio 200

{
  "Result": "OK",
  "Id": 5521,
  "Restored": true
}

GET /suppression/unsubscribers.{format}

Elenca i disiscritti dell'account

Prima i più recenti. Il totale è nell'intestazione X-Total-Count.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
sourcequerystringOrigine della disiscrizione: contact, list, smtp, api o api3
emailquerystringIndirizzo esatto
dateFromquerystring (date-time)A partire da questa data
dateToquerystring (date-time)Fino a questa data
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Disiscritti restituiti
401Credenziali non valide

Esempio 200

{
  "unsubscribers": [
    {
      "Id": 9012,
      "Source": "api",
      "Email": "[email protected]",
      "Date": "2026-10-20T16:05:00",
      "ListName": null,
      "Comment": "Asked by phone"
    }
  ]
}

POST /suppression/unsubscribers/add.{format}

Aggiungi un disiscritto

Senza ListId, l'indirizzo viene disiscritto per tutto l'account. Con ListId, solo da quella lista di disiscrizione.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
EmailstringsìIndirizzo da disiscrivere
CommentstringCommento libero
ListIdinteger (int64)Lista di disiscrizione dell'account (facoltativo)

Risposte

CodiceDescrizione
200Fatto. AlreadyUnsubscribed è true quando l'indirizzo era già disiscritto.
400È richiesto un indirizzo valido
401Credenziali non valide
404ListId non è una lista di disiscrizione di questo account

Esempio 200

{
  "Result": "OK",
  "AlreadyUnsubscribed": false
}

POST /suppression/unsubscribers/{Id}/del.{format}

Rimuovi un disiscritto

Source è obbligatorio, come restituito da /suppression/unsubscribers: un Id da solo non è univoco.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
Idpathinteger (int64)sìId del disiscritto

Corpo della richiesta (application/x-www-form-urlencoded)

NomeTipoObbligatorioDescrizione
Sourcestringsìcontact, list, smtp, api o api3

Risposte

CodiceDescrizione
200Disiscritto rimosso
400Source è obbligatorio
401Credenziali non valide
404Disiscritto non trovato

Esempio 200

{
  "Result": "OK",
  "Removed": 9012
}