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

Mailpro™ CRM API v3 : Riferimento

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

L'API CRM Mailpro™ v3 consente di gestire programmaticamente contatti, liste, tag, campi personalizzati, template email e campagne — e di inviare sia email marketing in massa sia email transazionali individuali, nonché SMS.

Autenticazione

Tutti gli endpoint (eccetto POST /token e gli endpoint OAuth) accettano tre metodi di autenticazione. Utilizzate quello più adatto al vostro stack.

> Il Bearer JWT legacy e IdClient+ApiKey non sono soggetti a controllo degli > ambiti — conservano accesso completo a ogni endpoint che potevano già > raggiungere. Soltanto gli access token OAuth 2.0 sono soggetti ai controlli > di ambito per endpoint mostrati per ciascuna operazione qui di seguito (un > token privo dell'ambito riceve 403 insufficient_scope).

Metodo 1 — OAuth 2.0 (consigliato per le integrazioni)

Mailpro gestisce un unico authorization server OAuth 2.0 per tutte le sue API, esposto su un'unica superficie neutra rispetto alla versione: https://api.mailpro.com/oauth/. Un solo server, un solo token — il medesimo access token funziona su CRM v3, Email v2 e SMS. Gli endpoint che un token può chiamare sono determinati dagli scope del token, non dall'URL base dell'API chiamata. Non esiste un endpoint OAuth per ciascuna versione (nessun /v3/oauth, /v2/oauth o /sms/oauth).

EndpointURL
AuthorizeGET https://api.mailpro.com/oauth/authorize
Token / RefreshPOST https://api.mailpro.com/oauth/token
JWKS (verifica firme)GET https://api.mailpro.com/oauth/.well-known/jwks
DiscoveryGET https://api.mailpro.com/oauth/.well-known/openid-configuration

Issuer (la claim iss su ogni token): https://api.mailpro.com/oauth/.

Grant supportati

Durata dei token

TokenTTL
Access token (RS256 JWT)20 minuti
Refresh token (scorrevole, monouso)30 giorni
Authorization code60 secondi

Authorization Code + PKCE — passo dopo passo

   GET https://api.mailpro.com/oauth/authorize
     ?response_type=code
     &client_id=YOUR_CLIENT_ID
     &redirect_uri=https://yourapp.example.com/callback
     &scope=contacts:read contacts:write
     &state=RANDOM_CSRF_TOKEN
     &code_challenge=CODE_CHALLENGE
     &code_challenge_method=S256
   POST https://api.mailpro.com/oauth/token
   Content-Type: application/x-www-form-urlencoded

   grant_type=authorization_code&code=AUTH_CODE
   &redirect_uri=https://yourapp.example.com/callback
   &client_id=YOUR_CLIENT_ID&code_verifier=CODE_VERIFIER
   { "access_token": "eyJ…", "token_type": "Bearer",
     "expires_in": 1200, "refresh_token": "…" }

client_credentials

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

grant_type=client_credentials&client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET&scope=contacts:read email:send

Il medesimo access token OAuth è accettato anche dalle API Email v2 (api.mailpro.com/v2) e SMS (api.mailpro.com/sms) — autenticatevi una sola volta, chiamate qualsiasi API. Catalogo completo degli scope: vedere Scope OAuth 2.0 qui di seguito.

Provate OAuth 2.0 in pochi minuti — quickstart

Il modo più rapido per provare OAuth è il grant client_credentials (server-to-server, senza browser, senza utente). Vi serve una coppia client_id / client_secret (rivolgetevi al vostro referente Mailpro, oppure createne una in Impostazioni → Accesso API). Sostituite i segnaposto qui sotto — non commitate mai un secret reale.

1. Ottenete un access token

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=contacts:read"
{ "access_token": "eyJhbGciOiJSUzI1Ni…", "token_type": "Bearer",
  "expires_in": 1200 }

2. Chiamate un endpoint di risorsa con il token

curl https://api.mailpro.com/v3/List \
  -H "Authorization: Bearer eyJhbGciOiJSUzI1Ni…"

Il medesimo token funziona anche su Email v2 (…/v2/…) e SMS (…/sms/…) — purché disponga dello scope richiesto da ciascun endpoint. Un token privo dello scope necessario viene rifiutato con 403 insufficient_scope.

"Connect Mailpro" interattivo (authorization_code + PKCE) — quando agite per conto di un *utente* (Zapier/Make/n8n, app partner): reindirizzate l'utente a GET https://api.mailpro.com/oauth/authorize con response_type=code, client_id, redirect_uri, scope, state, code_challenge e code_challenge_method=S256; l'utente fornisce il consenso; scambiate il code restituito su POST https://api.mailpro.com/oauth/token con il code_verifier corrispondente. Procedura dettagliata completa qui sopra; scope nella sezione Scope OAuth 2.0 qui di seguito.

> I token sono JWT RS256 — gli access token vivono 20 minuti, i > refresh token 30 giorni (scorrevoli, monouso: ogni refresh ruota il > token). Verificate le firme rispetto al JWKS disponibile su > https://api.mailpro.com/oauth/.well-known/jwks e validate lo scope di > ogni richiesta confrontandolo con la matrice degli scope qui di seguito.

Metodo 2 — Bearer JWT (legacy)

Authorization: Bearer <access_token>

Ottenete un token tramite POST /token (vedi qui di seguito). Valido per 30 giorni per impostazione predefinita; utilizzate grant_type=refresh_token per rinnovarlo senza riautenticarvi. Più semplice da configurare, ma legato a un'unica credenziale account e impossibile da delimitare ad uno scope o affidare a terze parti — preferite OAuth 2.0 per qualsiasi integrazione installabile.

Metodo 3 — IdClient + ApiKey (più semplice)

Inviate il vostro client ID e la chiave API come header HTTP (consigliato) oppure come parametri di query:

IdClient: 12345
ApiKey:   a1b2c3d4-e5f6-7890-abcd-ef1234567890

Le stesse credenziali delle API v2 / SMS — copia-incolla da Impostazioni → Accesso API. Nessuna fase di scambio token. La forma con header è raccomandata perché gli URL vengono registrati nei log di IIS / Cloudflare / proxy.

Endpoint token (grant password)

POST /token
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=YOUR_USERNAME&password=YOUR_API_KEY

Endpoint token (grant client_credentials)

POST /token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id=YOUR_CLIENT_ID

> Il token emesso da POST /v3/token è valido anche sull'API Email v2 > (api.mailpro.com/v2) e sull'API SMS (api.mailpro.com/sms). > Autenticatevi una sola volta, chiamate qualsiasi API.

Scope OAuth 2.0

Quando la vostra applicazione richiede un access token OAuth dichiara un insieme di scope — autorizzazioni che definiscono esattamente cosa il token può fare. L'utente vede una descrizione in linguaggio naturale di ciascuno scope richiesto sulla schermata di consenso. Gli scope sono separati da spazi nel parametro scope (scope=contacts:read email:send). Richiedete solo ciò di cui avete bisogno.

Gli scope seguono il formato <resource>:<action> e sono gerarchicamente indipendenti — contacts:write non implica contacts:read; richiedete entrambi se necessario.

ScopePermette di
contacts:readVisualizzare i vostri contatti, liste, tag, segmenti e campi personalizzati.
contacts:writeCreare, modificare ed eliminare i vostri contatti, liste, tag e campi personalizzati.
email:sendInviare email transazionali e di campagna per vostro conto.
email:readVisualizzare statistiche di consegna, aperture, click e cronologia bounce.
email:templates:readVisualizzare i vostri template email (oggetto, HTML, corpo plain-text).
email:templates:writeCreare, modificare ed eliminare i vostri template email.
sms:sendInviare SMS transazionali e di campagna per vostro conto.
sms:readVisualizzare il saldo crediti SMS e la cronologia messaggi.
sms:contacts:readVisualizzare la vostra rubrica SMS.
sms:contacts:writeCreare, modificare ed eliminare voci nella vostra rubrica SMS.
webhooks:manageSottoscrivere, modificare e rimuovere endpoint webhook per il vostro account.
account:readVisualizzare i crediti, i limiti e lo stato dell'abbonamento del vostro account.

Applicazione degli scope per endpoint

I controlli sugli scope sono attivi e applicati per ciascun endpoint per i token emessi via OAuth (l'autenticazione legacy è esente). Ogni operazione in questo riferimento elenca lo scope richiesto sotto Authorization. Sintesi per la superficie CRM v3:

EndpointScope richiesto
GET /Contact/{id}, GET /List, GET /List/{id}, GET /List/{id}/Contact, GET /List/{listId}/Unsubscribers, GET /Tag, GET /Tag/{id}, GET /Tag/{id}/Contact, GET /Segment, verifica appartenenza al segmentocontacts:read
POST /Contact, POST /Contact/Multiple, PUT/DELETE /Contact/{id}, aggiungere/rimuovere un tag o una lista su un contatto, POST/PUT/DELETE /List, POST/PUT/DELETE /Tagcontacts:write

> Gli endpoint di questa specifica non elencati qui sopra (ad esempio > GET /Field, le campagne, l'invio transazionale, l'invio SMS, i template > di messaggio, le informazioni sull'account) sono attualmente raggiungibili > con qualunque token valido — non sono ancora soggetti al controllo degli > scope sulla superficie CRM v3. Le API Email v2 e SMS limitano inoltre i > propri endpoint di invio / template / contatti / account (consultate le > rispettive specifiche).

Il rifiuto per scope insufficiente restituisce 403 con { "error": "insufficient_scope", "required_scope": "…" } (RFC 6750 §3.1).

Formato dei dati

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.

Codici di errore di business

Le violazioni delle regole di business restituiscono HTTP 406 con un corpo JSON:

{ "Message": "Contact cannot be created. Email cannot be empty." }

Motivi 406 più comuni:

Codici di stato restituiti

CodiceSignificato
400Richiesta malformata (JSON non valido, messaggio oltre il limite di parti SMS)
401Credenziali mancanti, non valide o scadute
402Crediti insufficienti per effettuare l'invio
403Consentito dalle tue credenziali, ma rifiutato — account bloccato per l'invio di SMS
404L'oggetto referenziato non esiste (contatto, lista, tag, campo, campagna)
406Violazione di una regola di business del contatto (vedi l'elenco sopra)
422Input rifiutato dalla validazione, o limite dell'account raggiunto

> Modifica: alcuni di questi casi restituivano in precedenza 404. I crediti > insufficienti restituiscono ora 402, gli errori di validazione e i limiti > dell'account restituiscono 422, e un account bloccato per gli SMS > restituisce 403. 404 è ora usato solo per «questo oggetto non esiste», in > modo coerente con l'API SMS. Se la tua integrazione si basa su 404 per questi > casi, aggiornala con i codici sopra.

Formato del numero di telefono

I numeri di telefono vengono normalizzati automaticamente. Potete inviarli in molti formati — spazi, trattini, punti, slash, parentesi, underscore e spazi non separabili vengono rimossi prima della validazione. Qualsiasi altro carattere (lettere, apostrofi, =, ;, ecc.) rende il numero non valido.

ValidoNon valido
+41794849980 — E.164 internazionale0612345678 — formato nazionale (0 iniziale)
0041 79 484 99 80 — prefisso 00 + spazi41'794'849'80 — apostrofi (non rimossi)
+33 6-12-34-56-78 — + con trattinitel=0041794849980 — caratteri extra
41794849980 — sole cifre1234567 — troppo corto (< 8 cifre)

Regole:

Specifiche v3 per Contact: il campo phone_number di un Contact è attualmente limitato a 12 cifre dopo la normalizzazione (contro 15 per gli endpoint SMS autonomi). I numeri provenienti da paesi come Germania (13), Brasile (13) o Italia per i mobili (12–13) possono essere rifiutati su /v3/Contact con Length exceeded for Phone Number (12). Questo vincolo legacy potrebbe essere allentato in una futura release.

Limiti

RisorsaLimite
Tag per account1.000
Liste per account1.000
Campi personalizzati per account50
Richieste API mensili per account50.000 (5× crediti email del piano)

Tracciamento della consegna (email transazionali)

Ogni email inviata singolarmente (POST /Send/Mail, la Email API v2, 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 (date_planned).no
sentConsegnata dai nostri server, ancora nessuna risposta dal server del destinatario.no
deliveredAccettata dal server del destinatario (diag_code = la sua risposta SMTP).sì
bouncedRifiutata. bounce_type: 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™ può notificare il vostro server in tempo reale quando determinati eventi si verificano sul vostro account (la creazione di un contatto, la consegna di un'email, il completamento di una campagna, ecc.). Stile Stripe — il vostro URL riceve una POST firmata in HMAC-SHA256 non appena l'evento si verifica.

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

Come funziona

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

Envelope del payload

Tutti gli eventi condividono un envelope comune:

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

Catalogo degli eventi

EventoTriggerForma di data
pingTest tramite POST /Webhook/{id}/test{ message }
contact.createdPOST /Contact{ id, email, firstName, lastName, createdAt }
contact.updatedPUT /Contact/{id}{ id, email, firstName, lastName, updatedAt, changes }
contact.deletedDELETE /Contact/{id}{ id, email, deletedAt }
list.contact_addedContatto aggiunto a una lista{ listId, listName, contactId, contactEmail, addedAt }
list.contact_removedContatto rimosso da una lista{ listId, listName, contactId, contactEmail, removedAt }
tag.appliedTag applicato a un contatto{ tag, contactId, contactEmail, appliedAt }
tag.removedTag rimosso{ tag, contactId, contactEmail, removedAt }
segment.matchedUn contatto entra in un segmento{ segmentId, segmentName, contactId, contactEmail, matchedAt }
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.openedTracking pixel attivato{ messageId, email, campaignId, openedAt, ip, userAgent }
email.clickedClick su link tracciato{ messageId, email, campaignId, clickedAt, url, ip, userAgent }
email.bouncedBounce hard o soft{ 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.droppedRifiutata prima dell'invio{ messageId, email, campaignId, droppedAt, reason }
campaign.startedLa spedizione ha inizio{ campaignId, name, totalRecipients, startedAt }
campaign.finishedTutti i destinatari elaborati{ campaignId, name, totalSent, totalFailed, finishedAt }
import.startedJob di import avviato{ importId, fileName, totalRows, startedAt }
import.progressAl 25/50/75%{ importId, fileName, processedRows, totalRows, progressPct }
import.completedImport riuscito{ importId, fileName, totalRows, addedCount, updatedCount, errorCount, completedAt }
import.failedErrore fatale durante l'import{ importId, fileName, errorMessage, failedAt }

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

Firma HMAC

Ogni POST trasporta un header X-Mailpro-Signature:

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

Per verificarla:

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

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

Dopo 10 fallimenti consecutivi sullo stesso webhook, questo viene disabilitato automaticamente (isActive: false) e ricevete un'email di notifica. Riattivatelo con PUT /Webhook/{id} una volta corretto il vostro endpoint.

Successo = HTTP 2xx

Consideriamo il vostro webhook andato a buon fine solo se restituite uno stato compreso tra 200 e 299. Qualsiasi 3xx/4xx/5xx o un timeout (> 10 s) viene conteggiato come fallimento e attiva i retry. Se il vostro endpoint è definitivamente fuori servizio, restituite esplicitamente 410 Gone — i retry avvengono comunque ma la causa del fallimento risulta più chiara nel vostro log di consegna.

Limiti

LimiteValore
Webhook per account20
Eventi sottoscritti per webhook50
Dimensione massima del payload256 KB
Timeout HTTP per tentativo10 secondi
Conservazione della cronologia di consegna30 giorni

Sommario

Authentication

Ottieni un token JWT Bearer per autenticare tutte le altre chiamate API. L'endpoint del token accetta più tipi di concessione: password, refresh_token, client_credentials e integrazioni di terze parti (zapier, automateio, microsoft-flow).

POST /token

Ottieni token di accesso

Ottiene un token JWT Bearer utilizzando le credenziali client. Passa l'access_token restituito come Authorization: Bearer <token> in tutte le richieste successive.

Tipi di concessione supportati
Tipo di concessioneCaso 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
zapier / automateio / microsoft-flowIntegrazioni con piattaforme di terze parti
Durata del token

Utilizza grant_type=refresh_token per ottenere un nuovo token di accesso senza autenticarsi di nuovo — il tuo SDK dovrebbe farlo automaticamente quando il token di accesso si avvicina alla scadenza (strategia tipica: rinnova quando rimangono meno di 24 h).

Conservazione sicura dei token

Anche con una durata di 30 giorni, chiunque ottenga un access_token può impersonare il tuo account fino alla scadenza. Conserva i token in un archivio segreto lato server (Vault, AWS Secrets Manager, Azure Key Vault, variabili d'ambiente su un host rinforzato). Mai incorporare un token in:

Se un token viene divulgato, revocalo tramite le impostazioni del tuo account Mailpro e richiedine uno nuovo.

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

NomeTipoObbligatorioDescrizione
grant_typestring: password, refresh_token, client_credentials, zapier, automateio, microsoft-flowsìTipo di concessione di autenticazione
usernamestringIl tuo username Mailpro (email). Obbligatorio per la concessione password.
passwordstringLa tua chiave API Mailpro (formato GUID). Obbligatoria per la concessione password.
refresh_tokenstringRefresh token precedente. Obbligatorio per la concessione refresh_token.
client_idstringIl tuo ID client Mailpro (intero). Obbligatorio per la concessione client_credentials.

Risposte

CodiceDescrizione
200Token emesso con successo
400Credenziali non valide o tipo di concessione 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

Recupera il profilo dell'account, il saldo dei crediti e i dettagli dell'abbonamento.

GET /Account/Me

Ottieni dettagli dell'account

Restituisce i dettagli del profilo e le impostazioni dell'account Mailpro autenticato.

Risposte

CodiceDescrizione
200Dettagli dell'account restituiti con successo
401Token non valido o scaduto

GET /Account/Credits

Ottieni saldo crediti

Restituisce il saldo dei crediti email e SMS rimanenti per l'account.

Risposte

CodiceDescrizione
200Saldo crediti restituito con successo
401Token non valido o scaduto

Esempio 200

{
  "email_credits": 48500,
  "sms_credits": 1200
}

GET /Account/SubscriptionEndDate

Ottieni data di scadenza dell'abbonamento

Restituisce la data di scadenza dell'attuale abbonamento Mailpro.

Risposte

CodiceDescrizione
200Data di scadenza dell'abbonamento restituita con successo
401Token non valido o scaduto

GET /Account/Limits

Ottieni quota API mensile

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

Calcolo della quota: il limite è calibrato a partire dai 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. La mappatura esatta è impostata dal job di fatturazione alla registrazione dell'abbonamento e azzerata alla data di anniversario dell'abbonamento (non il 1° del mese di calendario).

Cosa consuma crediti:

Cosa è GRATUITO (non consuma crediti):

Risposte

CodiceDescrizione
200Istantanea della quota
401Token non valido o scaduto
404Nessun record di quota trovato per questo account (account appena creato che non ha mai effettuato una chiamata API; la riga verrà creata alla prima richiesta autenticata).

Contact

CRUD completo per i contatti CRM. I contatti memorizzano un indirizzo email, un numero di telefono opzionale, valori di campi personalizzati e appartengono a una o più Liste. Possono anche essere etichettati con Tag. Gli ID dei contatti sono UUID.

POST /Contact

Crea un contatto

Crea un nuovo contatto CRM con campi personalizzati opzionali, assegnazioni a liste e tag.

Obbligatori:

I numeri di telefono accettano +41…, 0041… o 41… con o senza separatori (massimo 12 cifre su Contact — vedi Formato del numero di telefono nella descrizione dell'API).

I campi personalizzati sono identificati dal loro id (da GET /Field). I valori vengono validati rispetto al tipo del campo.

Scope OAuth : contacts:write

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
emailstringsìIndirizzo email del contatto (obbligatorio, deve essere univoco)
phone_numberstringNumero di telefono — accetta +41…, 0041… o 41… con o senza separatori. Deve iniziare con un prefisso internazionale valido. Massimo 12 cifre su Contact (vedi Formato del numero di telefono nella descrizione dell'API per le regole complete).
listsarray of ListRefsìListe a cui assegnare questo contatto. È richiesta almeno una lista.
tagsarray of TagRefTag da assegnare a questo contatto (opzionale)
custom_fieldsarray of FieldValueValori dei campi personalizzati per questo contatto (opzionale)

Esempio

{
  "email": "[email protected]",
  "phone_number": "+41791234567",
  "lists": [
    {
      "id": 101
    }
  ],
  "tags": [
    {
      "id": 5
    }
  ],
  "custom_fields": [
    {
      "id": 1,
      "value": "Alice"
    },
    {
      "id": 2,
      "value": "Dupont"
    }
  ]
}

Risposte

CodiceDescrizione
200Contatto creato con successo
400Formato email non valido
401Token non valido o scaduto
406Violazione di una regola business (vedi descrizione per l'elenco completo)

Esempio 406

{
  "Message": "Contact cannot be created. A contact already exist with the same Email"
}

POST /Contact/Multiple

Importa contatti (in blocco)

Crea fino a 1.000 contatti in una singola richiesta per un'importazione in blocco efficiente. La risposta include un elenco dei contatti creati con successo e un elenco di errori per i contatti che non è stato possibile creare (es. email duplicata, dati non validi).

Nota: le liste e i tag utilizzati nelle importazioni in blocco non devono essere collegati ad alcun flusso di lavoro di automazione attivo. In tal caso, l'intera importazione viene rifiutata con HTTP 406.

Scope OAuth : contacts:write

Corpo della richiesta (application/json)

Esempio

[
  {
    "email": "[email protected]",
    "lists": [
      {
        "id": 101
      }
    ],
    "custom_fields": [
      {
        "id": 1,
        "value": "Alice"
      }
    ]
  },
  {
    "email": "[email protected]",
    "lists": [
      {
        "id": 101
      }
    ],
    "custom_fields": [
      {
        "id": 1,
        "value": "Bob"
      }
    ]
  }
]

Risposte

CodiceDescrizione
200Importazione in blocco completata (controlla l'array errors per i fallimenti parziali)
400Input non valido
401Token non valido o scaduto
406Violazione di una regola business (es. conflitto di automazione, limite di lista raggiunto)

Esempio 200

{
  "Added": [
    {
      "Email": "[email protected]",
      "Id": "550e8400-e29b-41d4-a716-446655440000"
    },
    {
      "Email": "[email protected]",
      "Id": "660e8400-e29b-41d4-a716-446655440001"
    }
  ],
  "Errors": []
}

GET /Contact/{id}

Ottieni un contatto

Restituisce i dettagli di un contatto specifico. Utilizza includeTags=true per restituire anche i tag assegnati al contatto. Utilizza includeLists=true per restituire anche le liste a cui appartiene il contatto.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathstring (uuid)sìUUID del contatto (da POST /Contact o GET /List/{id}/Contact)
includeTagsquerybooleanImposta a true per includere le assegnazioni di tag del contatto nella risposta
includeListsquerybooleanImposta a true per includere le appartenenze alle liste del contatto nella risposta

Risposte

CodiceDescrizione
200Contatto restituito con successo
401Token non valido o scaduto
404Contatto non trovato

Esempio 200

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "email": "[email protected]",
  "phone_number": "41791234567",
  "custom_fields": [
    {
      "id": 1,
      "value": "Alice"
    },
    {
      "id": 2,
      "value": "Dupont"
    }
  ],
  "tags": [
    {
      "id": 5
    }
  ],
  "lists": [
    {
      "id": 101
    }
  ]
}

PUT /Contact/{id}

Aggiorna un contatto

Aggiorna l'email, il numero di telefono, i campi personalizzati, le assegnazioni a liste e i tag di un contatto. Il corpo della richiesta sostituisce i dati correnti del contatto — includi tutte le liste e i tag a cui vuoi che il contatto rimanga assegnato.

Obbligatori nel corpo: email e almeno una voce lists.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathstring (uuid)sìUUID del contatto

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
emailstringsìIndirizzo email del contatto (obbligatorio, deve essere univoco)
phone_numberstringNumero di telefono — accetta +41…, 0041… o 41… con o senza separatori. Deve iniziare con un prefisso internazionale valido. Massimo 12 cifre su Contact (vedi Formato del numero di telefono nella descrizione dell'API per le regole complete).
listsarray of ListRefsìListe a cui assegnare questo contatto. È richiesta almeno una lista.
tagsarray of TagRefTag da assegnare a questo contatto (opzionale)
custom_fieldsarray of FieldValueValori dei campi personalizzati per questo contatto (opzionale)

Risposte

CodiceDescrizione
200Contatto aggiornato con successo
401Token non valido o scaduto
404Contatto non trovato
422Errore di validazione (formato email, numero di telefono, incompatibilità del tipo di valore del campo)

Esempio 200

{
  "Result": "Successful operation"
}

DELETE /Contact/{id}

Elimina un contatto

Elimina definitivamente un contatto dal CRM.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathstring (uuid)sìUUID del contatto

Risposte

CodiceDescrizione
200Contatto eliminato con successo
401Token non valido o scaduto
404Contatto non trovato

GET /Contact/{id}/Activity

Attività di un contatto su 90 giorni

Email ricevute, aperte e cliccate, client di posta preferito e ultime campagne del contatto.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathstring (uuid)sìGUID del contatto

Risposte

CodiceDescrizione
200Attività restituita
401Token non valido o scaduto
404Il contatto richiesto non esiste

Esempio 200

{
  "period_days": 90,
  "email_received": 12,
  "email_opened": 7,
  "email_clicked": 2,
  "favorite_email_client": "Gmail",
  "last_campaigns": [
    {
      "id": 5001,
      "name": "Spring Sale 2026",
      "date": "2026-10-01T09:00:00"
    }
  ]
}

PUT /Contact/{id}/Tag/{tagid}

Aggiungi tag al contatto

Assegna un tag a un contatto. Se il tag è già assegnato, l'operazione è inefficace.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathstring (uuid)sìUUID del contatto
tagidpathinteger (int64)sìID del tag (da GET /Tag)

Risposte

CodiceDescrizione
200Tag assegnato con successo
401Token non valido o scaduto
404Contatto o tag non trovato

DELETE /Contact/{id}/Tag/{tagid}

Rimuovi tag dal contatto

Rimuove l'assegnazione di un tag da un contatto.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathstring (uuid)sìUUID del contatto
tagidpathinteger (int64)sìID del tag

Risposte

CodiceDescrizione
200Tag rimosso con successo
401Token non valido o scaduto
404Contatto o tag non trovato

PUT /Contact/{id}/List/{listid}

Aggiungi contatto alla lista

Aggiunge un contatto a una lista specifica. Restituisce HTTP 404 se il contatto era precedentemente disiscritto da questa lista.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathstring (uuid)sìUUID del contatto
listidpathinteger (int64)sìID della lista (da GET /List)

Risposte

CodiceDescrizione
200Contatto aggiunto alla lista con successo
401Token non valido o scaduto
404Contatto, lista non trovata oppure contatto disiscritto da questa lista

DELETE /Contact/{id}/List/{listid}

Rimuovi contatto dalla lista

Rimuove un contatto da una lista specifica. Il contatto stesso non viene eliminato.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathstring (uuid)sìUUID del contatto
listidpathinteger (int64)sìID della lista

Risposte

CodiceDescrizione
200Contatto rimosso dalla lista con successo
401Token non valido o scaduto
404Contatto o lista non trovata

List

Gestisci le liste di contatti. Le liste raggruppano i contatti per campagne e segmentazione. Massimo 1.000 liste per account (stesso limite sulle tre API Mailpro e nell'app). Massimo 1.000.000 di contatti per lista.

GET /List

Elenca le liste di contatti

Restituisce tutte le liste di contatti per l'account. Filtra per nome o data di creazione. Ordina alfabeticamente con sortByName=true. Includi il conteggio totale dei contatti per lista con includeTotalContacts=true.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
namequerystringFiltra per nome della lista (corrispondenza parziale)
dateCreationFromquerystring (date-time)Filtra per data di creazione (da, ISO 8601)
dateCreationToquerystring (date-time)Filtra per data di creazione (a, ISO 8601)
numberOfRecordsqueryintegerElementi per pagina — 5.000 predefiniti e al massimo
pageNumberqueryintegerNumero di pagina con base 1
sortByNamequerybooleanImposta a true per ordinare alfabeticamente per nome
includeTotalContactsquerybooleanImposta a true per includere il conteggio total_contacts in ogni risultato

Risposte

CodiceDescrizione
200Liste restituite con successo
401Token non valido o scaduto

Esempio 200

[
  {
    "id": 101,
    "name": "Newsletter subscribers",
    "total_contacts": 4521,
    "date_creation": "2025-01-15T10:30:00"
  }
]

POST /List

Crea una lista di contatti

Crea una nuova lista di contatti. Massimo 1.000 liste per account.

Scope OAuth : contacts:write

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
namestringsìNome visualizzato per la lista

Esempio

{
  "name": "Spring Campaign 2026"
}

Risposte

CodiceDescrizione
200Lista creata con successo
401Token non valido o scaduto
406Limite di liste (1.000) raggiunto

Esempio 200

{
  "id": 102,
  "name": "Spring Campaign 2026",
  "date_creation": "2026-04-14T12:00:00"
}

GET /List/{id}

Ottieni una lista di contatti

Restituisce i dettagli di una lista di contatti specifica.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìID della lista

Risposte

CodiceDescrizione
200Lista restituita con successo
401Token non valido o scaduto
404Lista non trovata

PUT /List/{id}

Aggiorna una lista di contatti

Rinomina una lista di contatti esistente.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìID della lista

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
namestringsìNome visualizzato per la lista

Esempio

{
  "name": "Newsletter subscribers — Europe"
}

Risposte

CodiceDescrizione
200Lista aggiornata con successo
401Token non valido o scaduto
404Lista non trovata

DELETE /List/{id}

Elimina una lista di contatti

Elimina definitivamente una lista di contatti. I contatti stessi non vengono eliminati — viene rimossa solo la loro appartenenza a questa lista. Le liste utilizzate da flussi di lavoro di automazione attivi non possono essere eliminate.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìID della lista

Risposte

CodiceDescrizione
200Lista eliminata con successo
401Token non valido o scaduto
404Lista non trovata
406La lista è utilizzata da un flusso di lavoro di automazione attivo

GET /List/{id}/Contact

Elenca i contatti in una lista

Restituisce i contatti appartenenti a una lista specifica. Filtra per email o data di aggiunta. Includi i tag e le appartenenze alle liste con i flag corrispondenti.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìID della lista
emailquerystringFiltra per email (corrispondenza parziale)
numberOfRecordsqueryintegerElementi per pagina — 5.000 predefiniti e al massimo
pageNumberqueryinteger
sortByEmailquerybooleanOrdina alfabeticamente per email
includeTagsquerybooleanIncludi le assegnazioni di tag nei risultati
includeListsquerybooleanIncludi le appartenenze alle liste nei risultati

Risposte

CodiceDescrizione
200Contatti restituiti con successo
401Token non valido o scaduto
404Lista non trovata o nessun contatto corrisponde ai criteri

GET /List/{listId}/Unsubscribers

Elenca i disiscritti

Restituisce i contatti che si sono disiscritti da una lista specifica.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
listIdpathinteger (int64)sìID della lista

Risposte

CodiceDescrizione
200Disiscritti restituiti con successo
401Token non valido o scaduto
404Lista non trovata

Tag

Gestisci i tag per l'etichettatura e la segmentazione dei contatti. I tag sono etichette piatte (es. "VIP", "Churned", "B2B"). Massimo 1.000 tag per account.

GET /Tag

Elenca i tag

Restituisce tutti i tag per l'account.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
namequerystringFiltra per nome (corrispondenza parziale)
numberOfRecordsqueryinteger
pageNumberqueryinteger
sortByNamequeryboolean

Risposte

CodiceDescrizione
200Tag restituiti con successo
401Token non valido o scaduto

Esempio 200

[
  {
    "id": 5,
    "name": "VIP customers"
  },
  {
    "id": 6,
    "name": "Newsletter openers"
  }
]

POST /Tag

Crea un tag

Crea un nuovo tag. Massimo 1.000 tag per account.

Scope OAuth : contacts:write

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
namestringsìNome visualizzato per il tag

Esempio

{
  "name": "VIP customers"
}

Risposte

CodiceDescrizione
200Tag creato con successo
401Token non valido o scaduto
406Limite di tag (1.000) raggiunto

GET /Tag/{id}

Ottieni un tag

Restituisce un tag specifico tramite il suo ID.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìID del tag

Risposte

CodiceDescrizione
200Tag restituito con successo
401Token non valido o scaduto
404Tag non trovato

PUT /Tag/{id}

Aggiorna un tag

Rinomina un tag esistente.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
namestringsìNome visualizzato per il tag

Esempio

{
  "name": "VIP customers — updated"
}

Risposte

CodiceDescrizione
200Tag aggiornato con successo
401Token non valido o scaduto
404Tag non trovato

DELETE /Tag/{id}

Elimina un tag

Elimina definitivamente un tag. Il tag viene rimosso da tutti i contatti. I tag utilizzati da flussi di lavoro di automazione attivi non possono essere eliminati.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
200Tag eliminato con successo
401Token non valido o scaduto
404Tag non trovato
406Il tag è utilizzato da un flusso di lavoro di automazione attivo

GET /Tag/{id}/Contact

Elenca i contatti con un tag

Restituisce i contatti a cui è stato assegnato un tag specifico.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìID del tag
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Contatti restituiti con successo
401Token non valido o scaduto
404Tag non trovato

Field

Gestisci i campi personalizzati dei contatti. I campi ti permettono di memorizzare dati aggiuntivi su ogni contatto (es. nome, città, livello di fedeltà). Massimo 50 campi per account. Tipi di campo: text, number, date.

GET /Field

Elenca i campi personalizzati

Restituisce tutti i campi personalizzati dei contatti definiti per l'account. Utilizza i valori id restituiti durante la creazione o l'aggiornamento dei contatti.

Parametri

NomeDoveTipoObbligatorioDescrizione
namequerystringFiltra per nome del campo
idFieldTypequeryintegerFiltra per ID del tipo di campo
numberOfRecordsqueryinteger
pageNumberqueryinteger
sortByNamequeryboolean

Risposte

CodiceDescrizione
200Campi personalizzati restituiti con successo
401Token non valido o scaduto

Esempio 200

[
  {
    "id": 1,
    "name": "first_name",
    "personalisation_key": "first_name",
    "field_type": "text"
  },
  {
    "id": 2,
    "name": "last_name",
    "personalisation_key": "last_name",
    "field_type": "text"
  }
]

POST /Field

Crea un campo personalizzato

Crea un nuovo campo personalizzato per i contatti. Massimo 50 campi per account. Utilizza l'id restituito quando assegni valori ai contatti.

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
namestringsìNome visualizzato del campo
id_field_typeintegersìID del tipo di campo (tipi disponibili tramite GET /Field/Types): - 1 = testo - 2 = numero intero - 3 = data e ora - 4 = sì / no - 12 = numero decimale
personalize_keystringsìChiave di variabile del modello, per inserire il campo in un messaggio
sortintegerOrdine di visualizzazione (da 0 a 255). Obbligatorio per modificare un campo (PUT /Field/{id}).

Esempio

{
  "name": "First name",
  "id_field_type": 1,
  "personalize_key": "first_name"
}

Risposte

CodiceDescrizione
200Campo creato con successo
401Token non valido o scaduto
406Limite di campi (50) raggiunto

GET /Field/Types

Elenca i tipi di campo

Restituisce gli identificatori dei tipi di campo disponibili da utilizzare durante la creazione di un campo personalizzato. Tipi comuni: 1 = text, 2 = number, 3 = date.

Risposte

CodiceDescrizione
200Tipi di campo restituiti con successo
401Token non valido o scaduto

GET /Field/{id}

Ottieni un campo personalizzato

Restituisce la definizione e i metadati di un campo personalizzato specifico.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìID del campo

Risposte

CodiceDescrizione
200Campo restituito con successo
401Token non valido o scaduto
404Campo non trovato

PUT /Field/{id}

Aggiorna un campo personalizzato

Aggiorna il nome o la chiave di personalizzazione di un campo personalizzato.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
namestringsìNome visualizzato del campo
id_field_typeintegersìID del tipo di campo (tipi disponibili tramite GET /Field/Types): - 1 = testo - 2 = numero intero - 3 = data e ora - 4 = sì / no - 12 = numero decimale
personalize_keystringsìChiave di variabile del modello, per inserire il campo in un messaggio
sortintegerOrdine di visualizzazione (da 0 a 255). Obbligatorio per modificare un campo (PUT /Field/{id}).

Risposte

CodiceDescrizione
200Campo aggiornato con successo
401Token non valido o scaduto
404Campo non trovato

DELETE /Field/{id}

Elimina un campo personalizzato

Elimina definitivamente un campo personalizzato e rimuove il suo valore da tutti i contatti. Questa azione non può essere annullata.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
200Campo eliminato con successo
401Token non valido o scaduto
404Campo non trovato

Campaign

Visualizza le statistiche delle campagne e gestisci le campagne programmate. Le campagne possono essere modificate o eliminate fino a 5 minuti prima dell'orario di invio programmato.

GET /Campaign

Elenca le campagne

Restituisce un elenco paginato delle campagne email per l'account.

Parametri

NomeDoveTipoObbligatorioDescrizione
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Campagne restituite con successo
401Token non valido o scaduto

Esempio 200

[
  {
    "id": 8001,
    "title": "Spring Newsletter April 2026",
    "date_planned": "2026-04-20T09:00:01",
    "count_open": 1823,
    "count_sent": 4521,
    "count_click": 342,
    "count_badmail": 12,
    "count_unsubscription": 8,
    "count_clicking_users": 289,
    "count_complaints": 1,
    "spam_trap": 0,
    "deliverability_score": 98
  }
]

GET /Campaign/{id}

Ottieni una campagna

Restituisce la configurazione e il riepilogo delle statistiche di una campagna specifica.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
200Campagna restituita con successo
401Token non valido o scaduto
404Campagna non trovata

PUT /Campaign/{id}

Aggiorna una campagna

Aggiorna il titolo o la data di invio di una campagna programmata. Le campagne possono essere modificate solo fino a 5 minuti prima dell'orario di invio programmato.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
campaign_titlestringNome visualizzato per la campagna
date_plannedstring (date-time)Orario di invio programmato (ISO 8601). Ometti per inviare immediatamente.

Risposte

CodiceDescrizione
200Campagna aggiornata con successo
401Token non valido o scaduto
404Campagna non trovata

DELETE /Campaign/{id}

Elimina una campagna

Annulla ed elimina definitivamente una campagna tramite il suo identificatore.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
200Campagna eliminata con successo
401Token non valido o scaduto
404Campagna non trovata

GET /Campaign/Scheduled

Elenca le mie campagne programmate

Restituisce le campagne con date_planned nel futuro che non sono ancora state inviate. Ordinate per date_planned crescente.

Parametri

NomeDoveTipoObbligatorioDescrizione
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Elenco delle campagne programmate
401Token non valido o scaduto

Esempio 200

[
  {
    "id": 5001,
    "id_client": 12345,
    "subject": "Spring Sale 2026",
    "date_planned": "2026-05-01T09:00:00",
    "title": "Spring Sale",
    "id_campaign": 7001,
    "id_list": 101,
    "id_segment": null,
    "number_email": 1250
  }
]

POST /Campaign/{id}/Cancel

Annulla una campagna programmata

Annulla una campagna programmata nel futuro. Restituisce 409 Conflict se la campagna è già stata inviata o non esiste.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
200Campagna annullata
401Token non valido o scaduto
409Già inviata o non trovata

Esempio 200

{
  "result": "ok",
  "cancelled": 5001
}

PATCH /Campaign/{id}/Reschedule

Riprogramma una campagna programmata

Aggiorna la data di invio pianificata di una campagna programmata. La nuova data deve essere nel futuro ed entro 90 giorni.

Nome del campo nel corpo: l'API accetta date_planned (snake_case, primario) nonché gli alias legacy PlanDate e scheduled_time. Fornisci uno qualsiasi di essi — viene utilizzato il primo non-null.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
date_plannedstring (date-time)Nome del campo primario.
PlanDatestring (date-time)Alias legacy accettato per retrocompatibilità.
scheduled_timestring (date-time)Alias legacy accettato per retrocompatibilità.

Risposte

CodiceDescrizione
200Campagna riprogrammata
400Data mancante — fornisci uno tra date_planned / PlanDate / scheduled_time
401Token non valido o scaduto
409Già inviata

Esempio 200

{
  "result": "ok",
  "id": 5001,
  "date_planned": "2026-12-31T14:30:00"
}

GET /Campaign/{id}/ByHour

Statistiche per ora

Restituisce la suddivisione oraria di aperture e clic per la campagna.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
200Statistiche orarie restituite con successo
401Token non valido o scaduto

GET /Campaign/{id}/ByDay

Statistiche per giorno

Restituisce la suddivisione giornaliera di aperture e clic per la campagna.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
200Statistiche giornaliere restituite con successo
401Token non valido o scaduto

GET /Campaign/{id}/Openings

Elenca le aperture email

Restituisce un elenco paginato dei contatti che hanno aperto l'email della campagna.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì
emailquerystringFiltra per email del destinatario
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Elenco aperture restituito con successo
401Token non valido o scaduto

GET /Campaign/{id}/Clicks

Elenca i clic sui link

Restituisce un elenco paginato dei contatti che hanno cliccato un link nella campagna.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì
emailquerystring
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Elenco clic restituito con successo
401Token non valido o scaduto

GET /Campaign/{id}/HardBounces

Elenca gli hard bounce

Restituisce gli indirizzi email che hanno subito hard bounce durante questa campagna.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì
emailquerystring
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Elenco hard bounce restituito con successo
401Token non valido o scaduto

Elenca i link tracciati

Restituisce i dati sulle prestazioni dei clic per ogni link tracciato nella campagna.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì
linkquerystringFiltra per URL del link (corrispondenza parziale)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Statistiche dei link restituite con successo
401Token non valido o scaduto

GET /Campaign/{id}/OS

Statistiche per OS / dispositivo

Restituisce la suddivisione di aperture e clic per sistema operativo e tipo di dispositivo.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
200Statistiche OS restituite con successo
401Token non valido o scaduto

GET /Campaign/{id}/EmailClients

Statistiche per client email

Restituisce la suddivisione delle aperture per client email (Gmail, Outlook, Apple Mail…).

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
200Statistiche del client email restituite con successo
401Token non valido o scaduto

GET /Campaign/{id}/Countries

Statistiche per paese

Restituisce la distribuzione geografica di aperture e clic.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
200Statistiche per paese restituite con successo
401Token non valido o scaduto

Send

Invia campagne email in blocco (a liste di contatti) e singole email transazionali. Le campagne possono essere programmate o inviate immediatamente.

POST /Send/Mail

Invia email transazionale

Invia un'email transazionale una tantum a un singolo destinatario.

Destinatario: fornisci email (indirizzo inline) O id_contact (contatto CRM) — non entrambi. L'uso di id_contact abilita la personalizzazione automatica con i valori dei campi personalizzati del contatto.

Contenuto: fornisci body_html (HTML inline) O id_message (modello salvato) — non entrambi. Se sono forniti entrambi, id_message ha la precedenza.

Obbligatori: id_sender_email, subject e uno tra (email o id_contact), e uno tra (body_html o id_message).

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
id_sender_emailintegerID dell'indirizzo email del mittente (da GET /SenderEmail). Obbligatorio.
emailstringIndirizzo email del destinatario (inline). Fornisci questo OPPURE id_contact. Se vengono forniti entrambi, id_contact ha la precedenza. La parte locale (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.
id_contactstring (uuid)ID del contatto CRM destinatario. Fornisci questo O email. L'uso di id_contact abilita la personalizzazione con i valori dei campi personalizzati del contatto.
subjectstringOggetto dell'email (massimo 255 caratteri). Obbligatorio.
body_htmlstringContenuto HTML inline. Fornisci questo O id_message. Se entrambi sono indicati, id_message ha la precedenza.
id_messageintegerID di un modello di messaggio salvato (da GET /Message). Fornisci questo O body_html.
reply_tostringIndirizzo di risposta (predefinito all'indirizzo del mittente)
fieldsarray of FieldValueCampi di personalizzazione personalizzati (usati solo con email inline, non con id_contact)
date_plannedstring (date-time)Programma l'invio per un orario futuro. Ometti per inviare immediatamente.
attachmentsarray of EmailAttachmentAllegati facoltativi (max 5). Ogni elemento è un oggetto con un filename e un content codificato in Base64. Limiti: 10 MB per file e 15 MB in totale, misurati dopo la decodifica Base64. 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).
keep_in_my_filesbooleanfalse (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.

Esempio

{
  "id_sender_email": 201,
  "email": "[email protected]",
  "subject": "Your order #12345 has shipped",
  "body_html": "<p>Hello {{first_name}}, your order is on its way!</p>",
  "reply_to": "[email protected]",
  "fields": [
    {
      "id": 1,
      "value": "Alice"
    }
  ],
  "attachments": [
    {
      "filename": "invoice.pdf",
      "content": "JVBERi0xLjQKJVBERi0xLjQK..."
    }
  ]
}

Risposte

CodiceDescrizione
200Email inviata o programmata con successo
400Formato email non valido o campo obbligatorio mancante
401Token non valido o scaduto
404Mittente, messaggio o contatto non trovato; oppure destinatario disiscritto
422Errore di validazione (oggetto troppo lungo, body e message entrambi vuoti, ecc.)

Esempio 200

{
  "message": "Successful operation",
  "id_single_send": 8001
}

Esempio 404

{
  "Message": "Not enough credit available"
}

GET /Send/{id}/Status

Ottieni lo stato di consegna di un'email transazionale

Restituisce lo stato di consegna attuale di un'email transazionale inviata con POST /Send/Mail. Passa l'id_single_send restituito da quella chiamata.

Valori possibili: delivered (accettata dal server del destinatario, vedi diag_code), bounced (rifiutata — bounce_type: 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, date_planned 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.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìL'id_single_send restituito da POST /Send/Mail.

Risposte

CodiceDescrizione
200Stato di consegna attuale
401Token non valido o scaduto
404Nessun invio transazionale trovato con questo id per questo cliente

Esempio 200

{
  "id_single_send": 8001,
  "email": "[email protected]",
  "status": "delivered",
  "date_planned": "2026-04-15T14:30:00",
  "status_date": "2026-04-15T14:30:07",
  "diag_code": "2.0.0 (success)",
  "bounce_type": null
}

POST /Send/Campaign

Invia campagna email

Invia una campagna email in blocco a una o più liste di contatti.

Obbligatori:

Segmento: opzionalmente filtra i destinatari tramite un segmento salvato (id_segment). Il segmento filtra i contatti all'interno delle liste specificate.

Programmazione: imposta date_planned a una data/ora ISO 8601 futura. Le campagne possono essere modificate o annullate fino a 5 minuti prima dell'orario programmato.

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
id_messageintegersìID del modello di messaggio da utilizzare (da GET /Message)
id_sender_emailintegersìID dell'indirizzo del mittente (da GET /SenderEmail)
id_email_reply_tointegerID dell'indirizzo del mittente di risposta (da GET /SenderEmail). Deve essere uno degli indirizzi mittente del tuo account, altrimenti la richiesta viene rifiutata. Predefinito: id_sender_email.
listsarray of ListRefsìListe di contatti target (almeno una richiesta)
id_segmentintegerFiltra i destinatari tramite un segmento salvato (opzionale)
campaign_titlestringsìNome visualizzato per questa campagna (massimo 150 caratteri)
date_plannedstring (date-time)Orario di invio programmato (ISO 8601). Ometti per inviare immediatamente.
id_automationintegerCollega questo invio a un flusso di lavoro di automazione (opzionale)

Esempio

{
  "id_message": 501,
  "id_sender_email": 201,
  "lists": [
    {
      "id": 101
    }
  ],
  "campaign_title": "Spring Newsletter April 2026",
  "date_planned": "2026-04-20T09:00:00"
}

Risposte

CodiceDescrizione
200Campagna programmata o inviata con successo
401Token non valido o scaduto
402Crediti insufficienti
404Messaggio, mittente, lista o segmento non trovato; oppure crediti insufficienti
422Titolo della campagna vuoto o troppo lungo (massimo 150 caratteri)

Esempio 200

{
  "Message": "Successful operation. Campaigns can be edited or deleted until 5 minutes prior to send.",
  "IdCampaign": 8001
}

GET /Send

Elenca gli invii programmati

Restituisce l'elenco delle campagne email in attesa di essere inviate (programmate, non ancora elaborate).

Parametri

NomeDoveTipoObbligatorioDescrizione
subjectMessagequerystringFiltra per oggetto (corrispondenza parziale)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Invii in attesa restituiti con successo
401Token non valido o scaduto

DELETE /Send/{id}

Annulla un invio programmato

Annulla ed elimina un invio email programmato che non è ancora stato elaborato. Non è possibile annullare gli invii attualmente in fase di elaborazione.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìID dell'invio (da GET /Send)

Risposte

CodiceDescrizione
200Invio programmato annullato con successo
401Token non valido o scaduto
404Invio programmato non trovato

GET /Send/Mail/Scheduled

Elenca le email singole pianificate

Restituisce le email singole inviate con POST /Send/Mail e una data futura, non ancora partite. Le campagne sono elencate da GET /Campaign/Scheduled.

Scope OAuth : email:send

Risposte

CodiceDescrizione
200Email pianificate restituite
401Token non valido o scaduto

Esempio 200

[
  {
    "id_single_send": 880123,
    "email": "[email protected]",
    "subject": "Your invoice",
    "date_planned": "2026-12-01T09:00:00"
  }
]

POST /Send/Mail/{id}/Cancel

Annulla un'email singola pianificata

Annulla l'email finché non è partita.

Scope OAuth : email:send

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìid_single_send restituito da POST /Send/Mail

Risposte

CodiceDescrizione
200Email annullata
401Token non valido o scaduto
409Invio non trovato o già partito

Esempio 200

{
  "result": "ok",
  "cancelled": 880123
}

PATCH /Send/Mail/{id}/Reschedule

Ripianifica un'email singola pianificata

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

Scope OAuth : email:send

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìid_single_send restituito da POST /Send/Mail

Corpo della richiesta (application/json)

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

Risposte

CodiceDescrizione
200Email ripianificata
400Data mancante
401Token non valido o scaduto
409Invio non trovato, già partito o data fuori dai limiti

Esempio 200

{
  "result": "ok",
  "id": 880123,
  "date_planned": "2026-12-15T09:00:00"
}

Sender Addresses

Gestisci gli indirizzi email mittenti convalidati. Solo gli indirizzi verificati possono essere usati come From.

GET /SenderEmail

Elenca gli indirizzi mittente

Restituisce gli indirizzi email mittenti validati configurati per l'account.

Parametri

NomeDoveTipoObbligatorioDescrizione
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Indirizzi mittente restituiti con successo
401Token non valido o scaduto

Esempio 200

[
  {
    "id": 201,
    "email": "[email protected]",
    "sender_name": "Your Company Newsletter",
    "is_validated": true
  }
]

POST /SenderEmail

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

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
emailstringsìIndirizzo del mittente
sender_namestringsìNome mostrato ai destinatari

Risposte

CodiceDescrizione
200Indirizzo aggiunto. domain_has_mx è false quando il dominio non ha un record MX.
400email o sender_name mancante
401Token non valido o scaduto
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",
  "confirmation_sent": true,
  "domain_has_mx": true
}

POST /SenderEmail/{id}/ResendValidation

Invia di nuovo l'email di convalida

Per un indirizzo ancora in attesa di convalida.

Scope OAuth : email:templates:write

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathintegersìid_sender_email da GET /SenderEmail

Risposte

CodiceDescrizione
200Email inviata di nuovo
401Token non valido o scaduto
404Mittente non trovato
409Questo mittente è già convalidato
503Temporaneamente non disponibile, riprova

Esempio 200

{
  "result": "ok",
  "confirmation_sent": true
}

GET /SenderEmail/{id}/Authentication

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: dkim_settings_url apre la schermata giusta.

Scope OAuth : email:templates:read

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathintegersìid_sender_email da GET /SenderEmail

Risposte

CodiceDescrizione
200Stato del dominio. spf.recommended_record è costruito a partire dal tuo record attuale: pubblicalo solo se spf.change_needed è true.
401Token non valido o scaduto
404Mittente non trovato
503Temporaneamente non disponibile, riprova

Esempio 200

{
  "domain": "example.com",
  "spf": {
    "valid": true,
    "record": "v=spf1 include:spf.mailpro.com -all",
    "recommended_record": "v=spf1 include:spf.mailpro.com -all",
    "change_needed": 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"
  },
  "dkim_settings_url": "https://app.mailpro.com/dkim/list?d=example.com"
}

History

Sfoglia il registro degli invii email e SMS passati.

GET /History/Email

Elenca lo storico degli invii email

Restituisce il registro degli invii email passati per l'account.

Parametri

NomeDoveTipoObbligatorioDescrizione
subjectMessagequerystringFiltra per oggetto (corrispondenza parziale)
idCampaignqueryintegerFiltra per ID campagna
includeBodyHTMLquerybooleanIncludi il corpo HTML completo nella risposta (più lento)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Storico email restituito con successo
401Token non valido o scaduto

GET /History/SMS

Elenca lo storico degli invii SMS

Restituisce il registro degli invii SMS passati per l'account.

Parametri

NomeDoveTipoObbligatorioDescrizione
dateSendquerystring (date-time)Filtra da questa data (ISO 8601)
dateSendEndquerystring (date-time)Filtra fino a questa data (ISO 8601)
phoneNumberquerystringFiltra per telefono del destinatario (parziale)
typequeryintegerFiltro per tipo di SMS
statusCodequeryintegerFiltro per codice di stato DLR
sortByStatusqueryboolean
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Storico SMS restituito con successo
401Token non valido o scaduto

Segment

Gestisci i segmenti dinamici — regole di filtro salvate che selezionano automaticamente i contatti in base ai valori dei campi, al comportamento o all'appartenenza alla lista.

GET /Segment

Elenca i segmenti

Restituisce tutti i segmenti dinamici salvati per l'account.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Segmenti restituiti con successo
401Token non valido o scaduto

GET /Segment/{id}/Contact

Elenca i contatti di un segmento

Con id_list, restituisce solo i contatti di quella lista presenti nel segmento: quelli che una campagna lista + segmento raggiungerebbe. Il totale è nell'intestazione X-Total-Count.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìID del segmento
id_listqueryinteger (int64)Limita a questa lista (facoltativo)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Contatti restituiti
401Token non valido o scaduto
404Segmento o lista non trovati

GET /Segment/{id}/Count

Conta i contatti di un segmento

Solo il numero, per conoscere in anticipo la dimensione di un invio. Con id_list, conta solo i contatti di quella lista presenti nel segmento.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìID del segmento
id_listqueryinteger (int64)Limita a questa lista (facoltativo)

Risposte

CodiceDescrizione
200Numero di contatti
401Token non valido o scaduto
404Segmento o lista non trovati

Esempio 200

{
  "total": 1250
}

GET /Segment/{id}/contact/{contactId}/check

Verifica se un contatto corrisponde a un segmento

Verifica se un contatto specifico (tramite GUID) corrisponde attualmente alle regole di un determinato segmento. Utile per attivare la logica di automazione su richiesta.

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìID del segmento
contactIdpathstring (uuid)sìGUID del contatto

Risposte

CodiceDescrizione
200Restituisce il risultato della corrispondenza
401Token non valido o scaduto
404Segmento o contatto non trovato

SMS

Invia messaggi SMS a singoli contatti o a intere liste di contatti. Utilizza il campo phone_number di ogni contatto.

POST /Sms/SingleSMS

Invia singolo SMS

Invia un singolo SMS direttamente a un numero di telefono. Utilizzalo per messaggi transazionali (OTP, conferme d'ordine, avvisi). Il numero di telefono accetta +41…, 0041… o 41… con o senza separatori — vedi Formato del numero di telefono nella descrizione dell'API per gli input accettati / rifiutati.

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
phone_numberstringsìNumero di telefono del destinatario — accetta +41…, 0041… o 41… con o senza separatori. Vedi Formato del numero di telefono nella descrizione dell'API.
messagestringsìTesto del messaggio SMS (massimo 160 caratteri per la codifica standard)
date_plannedstring (date-time)Programma l'invio. Ometti per inviare immediatamente.

Esempio

{
  "phone_number": "+41791234567",
  "message": "Your verification code is 9473. Valid for 10 minutes."
}

Risposte

CodiceDescrizione
200SMS inviato o programmato con successo
401Token non valido o scaduto
422Formato del numero di telefono non valido

POST /Sms/Campaign

Invia campagna SMS

Invia un messaggio SMS al campo phone_number di tutti i contatti in una o più liste. I contatti senza un numero di telefono vengono saltati.

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
listsarray of ListRefsìListe di contatti target (utilizza il campo phone_number di ogni contatto)
messagestringsìTesto del messaggio SMS
date_plannedstring (date-time)Programma l'invio. Ometti per inviare immediatamente.

Esempio

{
  "lists": [
    {
      "id": 101
    }
  ],
  "message": "Flash sale today — 20% off. Shop at mailpro.com",
  "date_planned": "2026-04-20T10:00:00"
}

Risposte

CodiceDescrizione
200Campagna SMS inviata o programmata con successo
401Token non valido o scaduto

GET /Sms

Elenca lo storico SMS

Restituisce il registro degli invii SMS (sia singoli che di campagna) per l'account.

Parametri

NomeDoveTipoObbligatorioDescrizione
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Storico SMS restituito con successo
401Token non valido o scaduto

DELETE /Sms/{id}

Annulla un SMS programmato

Annulla un invio SMS programmato in attesa.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìID dell'invio SMS

Risposte

CodiceDescrizione
200SMS programmato annullato con successo
401Token non valido o scaduto
404Invio SMS non trovato

GET /Sms/Scheduled

Elenca gli invii SMS programmati

Restituisce gli invii SMS con una date_planned futura (non ancora inviati), ordinati per data crescente.

Parametri

NomeDoveTipoObbligatorioDescrizione
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Invii SMS programmati restituiti con successo
401Token non valido o scaduto

POST /Sms/{id}/Cancel

Annulla un SMS programmato

Annulla un invio SMS programmato solo se non è ancora stato inviato.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathintegersìID dell'invio SMS

Risposte

CodiceDescrizione
200SMS programmato annullato con successo
401Token non valido o scaduto
409Invio SMS non trovato, non di proprietà del client o già inviato

PATCH /Sms/{id}/Reschedule

Riprogramma un SMS programmato

Aggiorna la data di invio pianificata di un SMS programmato. La nuova data deve essere nel futuro ed entro 90 giorni. Fallisce se l'SMS è già stato inviato.

Nome del campo nel corpo: l'API accetta date_planned (snake_case, primario) nonché gli alias legacy PlanDate e scheduled_time. Fornisci uno qualsiasi di essi.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathintegersìID dell'invio SMS

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
date_plannedstring (date-time)Nome del campo primario.
PlanDatestring (date-time)Alias legacy accettato per retrocompatibilità.
scheduled_timestring (date-time)Alias legacy accettato per retrocompatibilità.

Risposte

CodiceDescrizione
200SMS programmato riprogrammato con successo
400Data mancante — fornisci uno tra date_planned / PlanDate / scheduled_time
401Token non valido o scaduto
409Riprogrammazione fallita (non trovato, già inviato o data fuori intervallo)

Folders

Organizza i modelli di messaggio in cartelle.

GET /FolderList

Elenca le cartelle delle liste

Restituisce le cartelle utilizzate per organizzare le liste di contatti.

Parametri

NomeDoveTipoObbligatorioDescrizione
namequerystringFiltra per nome della cartella (parziale)
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Cartelle delle liste restituite con successo
401Token non valido o scaduto

GET /FolderList/{id}

Ottieni una singola cartella di liste

Restituisce i dettagli di una cartella di liste tramite il suo ID.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathintegersìID della cartella

Risposte

CodiceDescrizione
200Cartella restituita con successo
401Token non valido o scaduto
404Cartella non trovata

GET /FolderMessage

Elenca le cartelle dei messaggi

Restituisce le cartelle utilizzate per organizzare i modelli di messaggi email.

Parametri

NomeDoveTipoObbligatorioDescrizione
namequerystringFiltra per nome della cartella
numberOfRecordsqueryinteger
pageNumberqueryinteger

Risposte

CodiceDescrizione
200Cartelle dei messaggi restituite con successo
401Token non valido o scaduto

Import

Carica un file CSV o XLSX per importare contatti in una lista in blocco. Il file viene messo in coda per l'elaborazione asincrona — traccia il completamento tramite l'import_job_id restituito o tramite il callback opzionale webhook_url.

POST /Import/Upload

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

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

Tipo di richiesta: multipart/form-data

Campi del modulo obbligatori:

Opzionali:

Formato del file:

Corpo della richiesta (multipart/form-data)

NomeTipoObbligatorioDescrizione
id_listinteger (int64)sìID della lista di destinazione
filestring (binary)sìFile CSV o XLSX (UTF-8, max 50 MB)
json_match_fieldsstringsìCorrispondenza JSON tra le colonne del file e i campi del contatto
webhook_urlstring (uri)URL di callback invocato al termine dell'elaborazione

Risposte

CodiceDescrizione
200File accettato e messo in coda
400Nessun file caricato, id_list mancante, oppure json_match_fields assente / non valido
401Token non valido o scaduto
500Errore del server o dell'archiviazione

Esempio 200

{
  "result": "OK",
  "import_job_id": 14,
  "internal_name": "230575-20260420142615-contacts.csv"
}

Webhooks

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

GET /Webhook

Elenca i webhook

Restituisce ogni webhook configurato sull'account autenticato.

Risposte

CodiceDescrizione
200Array di webhook
401Token non valido o scaduto

POST /Webhook

Crea un webhook

Crea una nuova sottoscrizione webhook. La risposta contiene un secret che viene mostrato solo una volta — memorizzalo immediatamente, lato server. Utilizzalo 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 catalogo sopra). Usa ["*"] per sottoscrivere tutti gli eventi di questa API.
descriptionstringDescrizione libera per il tuo riferimento

Esempio

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

Risposte

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

Esempio 201

{
  "id": 42,
  "url": "https://example.com/hooks/mailpro",
  "events": [
    "email.delivered",
    "email.bounced",
    "contact.created"
  ],
  "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 /Webhook/{id}

Ottieni un webhook

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
200Il webhook
404Webhook non trovato

PUT /Webhook/{id}

Aggiorna un webhook

Aggiornamento parziale — vengono modificati solo i campi inviati.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
urlstring (uri)
eventsarray of string
descriptionstring
isActivebooleanImposta true per riattivare un webhook disabilitato automaticamente una volta corretto il tuo endpoint.

Risposte

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

DELETE /Webhook/{id}

Elimina un webhook

Elimina definitivamente il webhook e l'intero storico delle consegne.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
204Eliminato
404Webhook non trovato

POST /Webhook/{id}/test

Invia un evento di test

Mette in coda un evento ping immediato (o qualsiasi altro tipo di evento tramite il campo eventType nel corpo) 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
eventTypestringSovrascrivi il tipo di evento (deve essere sottoscritto da questo webhook). ping funziona sempre.

Esempio

{
  "eventType": "ping"
}

Risposte

CodiceDescrizione
202Evento messo in coda per la spedizione
404Webhook non trovato

Esempio 202

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

POST /Webhook/{id}/rotate-secret

Ruota il secret HMAC

Genera un nuovo secret HMAC e invalida immediatamente quello vecchio. Il nuovo secret viene restituito una sola volta nella risposta — memorizzalo. Ogni consegna da questo momento in poi sarà firmata con il nuovo secret.

Utilizzalo se sospetti che il tuo secret sia stato compromesso.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

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

Esempio 200

{
  "secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}

GET /Webhook/{id}/deliveries

Elenca i tentativi di consegna

Restituisce lo storico dei tentativi di spedizione per questo webhook (retention di 30 giorni). Utile per il debug — quali eventi sono stati inviati, codici di stato ricevuti, numero di tentativi, messaggi di errore.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì
limitqueryinteger
cursorqueryinteger (int64)Cursor di paginazione (= ultimo ID di consegna visto). Restituisce le consegne con id < cursor.

Risposte

CodiceDescrizione
200Array dei tentativi di consegna (dal più recente)
404Webhook non trovato

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

Rinvia una consegna

Mette in coda un nuovo tentativo di consegna con lo stesso payload dell'originale. Utile per riattivare una consegna fallita dopo aver corretto il tuo endpoint. Viene creata una NUOVA riga Webhook_Delivery (l'originale viene preservata per audit). Il replay segue la politica di retry standard (10s → 1min → 5min → 30min → 2h → 6h → 24h, poi abbandonato).

Parametri

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

Risposte

CodiceDescrizione
202Replay messo in coda
404Webhook o consegna non trovato

Suppression

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

GET /Suppression/Bounces

Elenca i bounce dell'account

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

Scope OAuth : email:read

Parametri

NomeDoveTipoObbligatorioDescrizione
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
401Token non valido o scaduto

Esempio 200

[
  {
    "id": 5521,
    "source": "contact",
    "type": "hard",
    "email": "[email protected]",
    "date": "2026-10-12T08:30:00",
    "diag_code": "550 5.1.1 User unknown",
    "id_list": 101
  }
]

DELETE /Suppression/Bounces/{id}

Rimuovi un bounce

source e type sono obbligatori, come restituiti da GET /Suppression/Bounces: un id da solo non è univoco.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìid del bounce
sourcequerystringsìlist, contact, api o smtp
typequerystring: hard, softsìhard o soft

Risposte

CodiceDescrizione
200Bounce rimosso
400source o type mancante
401Token non valido o scaduto
404Bounce non trovato

Esempio 200

{
  "result": "ok",
  "id": 5521,
  "restored": false
}

POST /Suppression/Bounces/{id}/Restore

Rimetti nelle sue liste un contatto in hard bounce

Solo per un hard bounce con origine contact.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìid del bounce

Risposte

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

Esempio 200

{
  "result": "ok",
  "id": 5521,
  "restored": true
}

GET /Suppression/Unsubscribers

Elenca i disiscritti dell'account

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

Scope OAuth : contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
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
401Token non valido o scaduto

Esempio 200

[
  {
    "id": 9012,
    "source": "api3",
    "email": "[email protected]",
    "date": "2026-10-20T16:05:00",
    "list_name": null,
    "comment": "Asked by phone"
  }
]

POST /Suppression/Unsubscribers

Aggiungi un disiscritto

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

Scope OAuth : contacts:write

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
emailstringsìIndirizzo da disiscrivere
commentstringCommento libero
id_listinteger (int64)Lista di disiscrizione dell'account (facoltativo)

Risposte

CodiceDescrizione
200Fatto. already_unsubscribed è true quando l'indirizzo era già disiscritto.
400È richiesto un indirizzo valido
401Token non valido o scaduto
404id_list non è una lista di disiscrizione di questo account

Esempio 200

{
  "result": "ok",
  "already_unsubscribed": false
}

DELETE /Suppression/Unsubscribers/{id}

Rimuovi un disiscritto

source è obbligatorio, come restituito da GET /Suppression/Unsubscribers: un id da solo non è univoco.

Scope OAuth : contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sìid del disiscritto
sourcequerystringsìcontact, list, smtp, api o api3

Risposte

CodiceDescrizione
200Disiscritto rimosso
400source è obbligatorio
401Token non valido o scaduto
404Disiscritto non trovato

Esempio 200

{
  "result": "ok",
  "removed": 9012
}