Documentazione interattiva · Portale sviluppatori · Specifica OpenAPI · EN · FR · DE · IT · PT · ES
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.
Ogni endpoint accetta tre metodi di autenticazione. Utilizza quello più adatto al tuo stack.
POST /token, senza scope.> 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.
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/.
| Endpoint | URL |
|---|---|
| Autorizzazione | GET https://api.mailpro.com/oauth/authorize |
| Token / rinnovo | POST https://api.mailpro.com/oauth/token |
| JWKS | GET https://api.mailpro.com/oauth/.well-known/jwks |
| Discovery | GET 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.
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.
Due credenziali:
| Parametro | Tipo | Descrizione |
|---|---|---|
IdClient | integer | Il tuo ID cliente Mailpro numerico, reperibile in Impostazioni → Accesso API |
ApiKey | string | La tua chiave API, reperibile in Impostazioni → Accesso API |
Invialle in uno di questi punti — scegli uno:
IdClient: 12345 e ApiKey: a1b2c3d4-…. Gli URL vengono registrati nei log dei web server, dei CDN e dei proxy, quindi una chiave inserita nella query string può finire nei log di accesso. Gli header non vengono registrati.?IdClient=12345&ApiKey=…. Mantenuto per retrocompatibilità con le integrazioni esistenti. Passa agli header non appena possibile.IdClient=12345&ApiKey=… in application/x-www-form-urlencoded.Se fornisci le credenziali in più punti, prevale l'header.
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:
| Endpoint | Scope richiesto |
|---|---|
/send/* (campagne, transazionale, pianificazione, test — tranne /send/{IdSend}/status) | email:send |
/stats/* (tranne /stats/del), /history/list, /send/{IdSend}/status | email:read |
/message/*, /senderEmail/* (lettura) | email:templates:read |
/message/*, /senderEmail/* (add/edit/del), /stats/del | email:templates:write |
/list/list, /email/list | contacts:read |
/list/{add,edit,del}, /email/{add,addSingle,edit,del}, /import/upload | contacts:write |
/account/* | account:read |
Un rifiuto per scope restituisce 403 con { "error": "insufficient_scope", "required_scope": "…" }.
Tutti gli endpoint supportano json (predefinito) e xml. Specifica il formato nell'URL:
/email/list.json/email/list.xmlStessa regola sulle tre API Mailpro (Email v2, CRM v3, SMS): 5.000 elementi per pagina, per impostazione predefinita e al massimo.
numberOfRecords — elementi per pagina. Assente, 0 o oltre 5.000 = 5.000.pageNumber — numero di pagina a partire da 1 (predefinito 1).bodyHTML=true) restituiscono 10 elementi per pagina./email/list aggiunge X-Total-Count (il totale reale) e X-Truncated: true quando restano contatti oltre la pagina.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.
| HTTP | Significato |
|---|---|
| 400 | Richiesta non valida — parametro obbligatorio mancante o non valido |
| 401 | Non autorizzato — IdClient o ApiKey non validi |
| 403 | Vietato — limite dell'account raggiunto (ad es. numero massimo di liste) |
| 404 | Non trovato — la risorsa richiesta non esiste |
| 500 | Errore interno del server |
Errori derivanti da regole di business:
"Not enough credit available." → 403 — il tuo account non dispone più di crediti email"Email address unsubscribed." → 400 — il destinatario si è disiscrittoOgni 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.
POST /send/sendmail.{format} contiene l'identificativo dell'invio.email.delivered ed email.bounced inviano lo stato finale al vostro server non appena è noto, senza alcuna interrogazione.GET /send/{IdSend}/status.{format} restituisce lo stato attuale (tabella sotto).status | Significato | Finale? |
|---|---|---|
queued | Accettata, in attesa di invio. | no |
scheduled | Pianificata per più tardi (DatePlanned). | no |
sent | Consegnata dai nostri server, ancora nessuna risposta dal server del destinatario. | no |
delivered | Accettata dal server del destinatario (DiagCode = la sua risposta SMTP). | sì |
bounced | Rifiutata. BounceType: hard = indirizzo non valido o rifiuto definitivo; soft = rifiuto dopo nuovi tentativi (casella piena, server irraggiungibile…). | sì |
not_found | Identificativo sconosciuto o che non appartiene al vostro account. | sì |
Interrogare senza andare in loop
delivered compare circa 5 minuti dopo la consegna.Retry-After (i secondi da attendere), e la chiamata non conta nella vostra quota.scheduled: inutile interrogare prima di DatePlanned.Gli stati sono conservati per 365 giorni.
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.
POST /webhooks. La risposta contiene un secret mostrato una sola volta (stile Stripe / GitHub) — conservalo.secret (snippet di seguito).> ⏱ 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.
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]", "...": "..." }
}
| Campo | Formato | Descrizione |
|---|---|---|
id | evt_ + 32 hex | ID univoco dell'evento — utilizzalo come chiave di idempotenza sul tuo lato. |
type | <domain>.<verb> | Tipo di evento canonico. |
created | Secondi Unix UTC | Incluso nella firma HMAC. |
apiVersion | "v2" | Quale API Mailpro ha pubblicato l'evento. |
account.id | int | Il tuo ID cliente Mailpro (= IdClient). |
account.name | string | Il nome del tuo account (utile per il debug lato client). |
data | object | Payload dell'evento — la forma dipende dal type (vedi catalogo qui sotto). |
| Evento | Trigger | Forma di data |
|---|---|---|
ping | Test tramite POST /webhooks/{id}/test | { message } |
email.processed | Invio accettato dalla pipeline | { messageId, email, campaignId, processedAt } |
email.delivered | Un'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.opened | Pixel di tracciamento attivato | { messageId, email, campaignId, openedAt, ip, userAgent } |
email.clicked | Click su un link tracciato | { messageId, email, campaignId, clickedAt, url, ip, userAgent } |
email.bounced | Hard o soft bounce | { messageId, email, campaignId, bouncedAt, bounceType, reason } |
email.spam_report | Reclamo FBL | { messageId, email, campaignId, reportedAt } |
email.unsubscribed | Click sul link di opt-out | { messageId, email, campaignId, unsubscribedAt } |
email.dropped | Rifiutato prima dell'invio | { messageId, email, campaignId, droppedAt, reason } |
campaign.started | Inizio della distribuzione | { campaignId, name, totalRecipients, startedAt } |
campaign.finished | Tutti i destinatari elaborati | { campaignId, name, totalSent, totalFailed, finishedAt } |
credits.low | Saldo dei crediti email al di sotto della soglia di allerta | { remaining, threshold } |
Sottoscrivi tutti gli eventi di questa API passando ["*"] nell'array events.
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:
t e v1 dall'header.|now - t| > 300 (finestra di protezione anti-replay di 5 minuti).expected = hex(HMAC_SHA256(secret, t + "." + raw_body)).v1 con expected (crypto.timingSafeEqual, hash_equals, CryptographicOperations.FixedTimeEquals) — mai con ==.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'));
}
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']);
}
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'])
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"]));
}
| Tentativo | Ritardo prima del successivo |
|---|---|
| 1 → 2 | 10 secondi |
| 2 → 3 | 1 minuto |
| 3 → 4 | 5 minuti |
| 4 → 5 | 30 minuti |
| 5 → 6 | 2 ore |
| 6 → 7 | 6 ore |
| 7 | abbandonato (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.
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.
| Limite | Valore |
|---|---|
| Webhook per account | 20 |
| Eventi sottoscritti per webhook | 50 |
| Dimensione massima del payload | 256 KB |
| Timeout HTTP per tentativo | 10 secondi |
| Conservazione dello storico dei recapiti | 30 giorni |
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).
/tokenOttieni 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.
| Tipo di grant | Caso d'uso |
|---|---|
password | Integrazione standard — username + chiave API |
refresh_token | Rinnova un token di accesso in scadenza senza autenticarsi di nuovo |
client_credentials | Server-to-server con solo ID client |
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)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
grant_type | string: password, refresh_token, client_credentials | sì | |
username | string | Il tuo username Mailpro (email). Obbligatorio per il grant password. | |
password | string | La tua chiave API Mailpro (formato GUID). Obbligatoria per il grant password. | |
refresh_token | string | Refresh token precedente. Obbligatorio per il grant refresh_token. | |
client_id | string | Il tuo ID client Mailpro (intero). Obbligatorio per il grant client_credentials. |
Risposte
| Codice | Descrizione |
|---|---|
200 | Token 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.
|
307 | Temporary 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).
|
400 | Credenziali 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."
}
Verifica il saldo dei crediti email, la quota API mensile e lo stato dell'abbonamento.
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Risposte
| Codice | Descrizione |
|---|---|
200 | Saldo dei crediti restituito con successo |
401 | Credenziali non valide |
Esempio 200
{
"Credits": 48500
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Risposte
| Codice | Descrizione |
|---|---|
200 | Data di scadenza dell'abbonamento restituita con successo |
401 | Credenziali non valide |
Esempio 200
{
"SubscriptionEndDate": "2027-01-15T00:00:00"
}
/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:
v2, v3 o sms.Cosa è GRATUITO (non consuma crediti):
/health.401, 403 o 429.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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Risposte
| Codice | Descrizione |
|---|---|
200 | Snapshot della quota |
401 | Credenziali non valide |
404 | Nessun 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
}
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).
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
titleFilter | query | string | Filtra per titolo (corrispondenza parziale, case-insensitive) | |
type | query | integer: 0, 1 | 0 = solo liste standard, 1 = solo liste nere. Ometti per restituirle tutte. | |
numberOfRecords | query | integer | Elementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione). | |
pageNumber | query | integer | Numero di pagina (1-based). Il valore predefinito è 1. | |
sortByName | query | boolean | Imposta a true per ordinare i risultati alfabeticamente per titolo |
Risposte
| Codice | Descrizione |
|---|---|
200 | Liste 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.
|
401 | Credenziali 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"
}
]
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
Title | string | sì | Nome visualizzato per la nuova lista |
Type | integer: 0, 1 | 0 = lista standard (default), 1 = lista nera |
Risposte
| Codice | Descrizione |
|---|---|
200 | Lista creata con successo.
> Viene restituito anche un campo duplicato legacy AddressBookList (contenuto identico).
|
400 | Titolo mancante |
401 | Credenziali non valide |
422 | Limite di liste (1.000) raggiunto |
Esempio 200
{
"Lists": [
{
"ListID": 103,
"Title": "Spring Campaign 2026",
"Type": 0,
"NumberEmails": 0,
"CreationDate": "2026-04-14T12:00:00"
}
]
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
ListID | integer | sì | ID della lista da rinominare (da /list/list). È accettato anche l'alias legacy AddressBookID. |
Title | string | sì | Nuovo titolo della lista |
Risposte
| Codice | Descrizione |
|---|---|
200 | Lista rinominata con successo |
400 | ListID o Titolo mancanti |
401 | Credenziali non valide |
404 | Lista non trovata |
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
ListID | integer | sì | ID della lista da eliminare. È accettato anche l'alias legacy AddressBookID. |
Risposte
| Codice | Descrizione |
|---|---|
200 | Lista eliminata con successo |
400 | ListID mancante |
401 | Credenziali non valide |
404 | Lista non trovata |
Esempio 200
{
"Result": "OK"
}
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.
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
emailFilter | query | string | Filtra per indirizzo email (corrispondenza parziale, case-insensitive) | |
listId | query | integer | Restituisce solo i contatti in questa lista. È accettato anche l'alias legacy addressBookId. | |
numberOfRecords | query | integer | Elementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione). | |
pageNumber | query | integer | Numero di pagina (1-based). Il valore predefinito è 1. | |
sortByName | query | boolean | Imposta a true per ordinare i risultati alfabeticamente per indirizzo email |
Risposte
| Codice | Descrizione |
|---|---|
200 | Elenco contatti restituito con successo |
401 | Credenziali non valide |
Esempio 200
{
"Emails": [
{
"IdEmail": 10001,
"Email": "[email protected]",
"Field1": "Alice",
"Field2": "Dupont"
}
]
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
ListId | integer | ID della lista di destinazione. È accettato anche l'alias legacy AddressBookId. | |
EmailList | string | sì | Indirizzi email da importare separati da punti e virgola |
Force | integer: 0, 1 | Imposta a 1 per reimportare indirizzi precedentemente disiscritti.
Default: 0 (gli indirizzi disiscritti vengono saltati).
|
Risposte
| Codice | Descrizione |
|---|---|
200 | Contatti importati con successo |
400 | EmailList mancante |
401 | Credenziali non valide |
Esempio 200
{
"Result": "3 contacts imported"
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
ListId | integer | ID della lista di destinazione. È accettato anche l'alias legacy AddressBookId. | |
Email | string | sì | Indirizzo email del nuovo contatto |
Force | integer: 0, 1 | Imposta a 1 per riaggiungere un indirizzo precedentemente disiscritto | |
Field1 | string | Valore per il campo personalizzato 1 (la mappatura delle colonne dipende dalla tua lista) | |
Field2 | string | Valore per il campo personalizzato 2 | |
Field3 | string | Valore per il campo personalizzato 3 | |
Field4 | string | Valore per il campo personalizzato 4 | |
Field5 | string | Valore per il campo personalizzato 5 |
Risposte
| Codice | Descrizione |
|---|---|
200 | Contatto aggiunto con successo |
400 | Email mancante |
401 | Credenziali non valide |
Esempio 200
{
"EmailId": 10002,
"Email": "[email protected]",
"Field1": "Alice",
"Field2": "Dupont",
"ListID": 101
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
EmailId | integer | sì | ID del contatto da aggiornare (da /email/list) |
Email | string | sì | Nuovo indirizzo email per il contatto |
Field1 | string | Nuovo valore per il campo personalizzato 1 | |
Field2 | string | Nuovo valore per il campo personalizzato 2 | |
Field3 | string | Nuovo valore per il campo personalizzato 3 |
Risposte
| Codice | Descrizione |
|---|---|
200 | Contatto aggiornato con successo |
400 | EmailId o Email mancanti |
401 | Credenziali non valide |
404 | Contatto non trovato |
/email/del.{format}Elimina un contatto
Elimina definitivamente un contatto tramite il suo identificatore univoco.
Scope OAuth : contacts:write
Parametri
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
EmailId | integer | sì | ID del contatto da eliminare (da /email/list) |
Risposte
| Codice | Descrizione |
|---|---|
200 | Contatto eliminato con successo |
400 | EmailId mancante |
401 | Credenziali non valide |
404 | Contatto non trovato |
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.
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
subjectFilter | query | string | Filtra per oggetto (corrispondenza parziale, case-insensitive) | |
numberOfRecords | query | integer | Elementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione). | |
pageNumber | query | integer | Numero di pagina (1-based). Il valore predefinito è 1. | |
bodyHTML | query | boolean | Imposta 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
| Codice | Descrizione |
|---|---|
200 | Modelli di messaggio restituiti con successo |
401 | Credenziali non valide |
Esempio 200
{
"MessageList": [
{
"IDMessage": 501,
"Subject": "Spring Newsletter — April 2026",
"Language": "EN",
"LinkAlign": "center",
"LinkUp": 0,
"UpdateDate": "2026-03-10T14:22:00"
}
]
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
Subject | string | sì | Oggetto dell'email (massimo 255 caratteri) |
BodyHTML | string | sì | Contenuto HTML completo del corpo dell'email |
Language | string | sì | Codice lingua per la localizzazione del link di disiscrizione (ad es. EN, FR, DE) |
LinkAlign | string: left, center, right | sì | Allineamento orizzontale del link di disiscrizione |
LinkUp | integer: 0, 1 | sì | Posizione del link di disiscrizione — 0 = in fondo all'email, 1 = in alto |
Risposte
| Codice | Descrizione |
|---|---|
200 | Modello di messaggio creato con successo |
400 | Campo obbligatorio mancante |
401 | Credenziali non valide |
Esempio 200
{
"IDMessage": 502,
"Subject": "Spring Newsletter — April 2026",
"Language": "EN",
"LinkAlign": "center",
"LinkUp": 0
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
MessageId | integer | sì | ID del modello di messaggio da aggiornare (da /message/list) |
Subject | string | sì | Nuovo oggetto dell'email |
BodyHTML | string | sì | Nuovo contenuto HTML del corpo dell'email |
Language | string | sì | Codice lingua per la localizzazione del link di disiscrizione |
LinkAlign | string: left, center, right | sì | |
LinkUp | integer: 0, 1 | sì |
Risposte
| Codice | Descrizione |
|---|---|
200 | Modello di messaggio aggiornato con successo |
400 | Campo obbligatorio mancante |
401 | Credenziali non valide |
404 | Modello di messaggio non trovato |
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
MessageId | integer | sì | ID del modello di messaggio da eliminare (da /message/list) |
Risposte
| Codice | Descrizione |
|---|---|
200 | Modello di messaggio eliminato con successo |
400 | MessageId mancante |
401 | Credenziali non valide |
404 | Modello di messaggio non trovato |
Invia campagne email di massa a una lista e gestisci gli invii pianificati. Una campagna utilizza un modello di messaggio e un indirizzo mittente.
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
subjectMessageFilter | query | string | Filtra per oggetto della campagna (corrispondenza parziale, case-insensitive) | |
numberOfRecords | query | integer | Elementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione). | |
pageNumber | query | integer | Numero di pagina (1-based). Il valore predefinito è 1. |
Risposte
| Codice | Descrizione |
|---|---|
200 | Elenco delle campagne restituito con successo |
401 | Credenziali 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
}
]
}
/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:
IDMessage — il modello da inviare (da /message/list)IDEmailExp — l'indirizzo mittente da utilizzare (da /senderEmail/list)ListId — la lista dei destinatari (da /list/list). È accettato anche l'alias legacy IDAddressBook.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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
ListId | integer | ID della lista dei destinatari (da /list/list). È accettato anche l'alias legacy IDAddressBook. | |
IDMessage | integer | sì | ID del modello di messaggio da inviare (da /message/list) |
IDEmailExp | integer | sì | ID dell'indirizzo email mittente da utilizzare (da /senderEmail/list) |
IDUnsubscribeList | integer | Lista utilizzata per raccogliere i contatti disiscritti (lista nera).
È accettato anche l'alias legacy IDUnsubscribeAddressBook.
| |
DatePlanned | string (date-time) | Data/ora di invio pianificata (ISO 8601). Ometti per inviare immediatamente. | |
Campaign | integer: 0, 1 | Imposta a 1 per tracciare questo invio come campagna denominata nelle statistiche | |
TitleCampaign | string | Titolo della campagna mostrato nelle statistiche (obbligatorio quando Campaign=1) |
Risposte
| Codice | Descrizione |
|---|---|
200 | Campagna pianificata o inviata con successo.
> La risposta restituisce anche gli alias legacy AddressBookID e UnsubscribeAddressBookID
> (identici a ListID / UnsubscribeListID). Le nuove integrazioni dovrebbero ignorarli.
|
400 | IDMessage o IDEmailExp mancanti |
401 | Credenziali non valide |
403 | Crediti email insufficienti |
404 | Lista, 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
}
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
IdSend | integer | sì | ID dell'invio della campagna da annullare o eliminare (da /send/list) |
Risposte
| Codice | Descrizione |
|---|---|
200 | Campagna annullata o eliminata con successo |
400 | IdSend mancante |
401 | Credenziali non valide |
404 | Campagna non trovata |
Esempio 200
{
"Result": "Campaign Deleted"
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
numberOfRecords | query | integer | Elementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione). | |
pageNumber | query | integer | Numero di pagina (1-based). Il valore predefinito è 1. |
Risposte
| Codice | Descrizione |
|---|---|
200 | Elenco delle campagne / invii pianificati.
> Ogni record include anche gli alias legacy AddressBookID e
> UnsubscribeAddressBookID (identici a ListID / UnsubscribeListID).
|
401 | Credenziali 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
}
]
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
IdSend | path | integer | sì |
Risposte
| Codice | Descrizione |
|---|---|
200 | Invio annullato |
401 | Credenziali non valide |
409 | Già recapitato o non trovato |
Esempio 200
{
"Result": "OK",
"Cancelled": 5001
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
IdSend | path | integer | sì |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
PlanDate | string (date-time) | sì |
Risposte
| Codice | Descrizione |
|---|---|
200 | Invio ripianificato |
400 | PlanDate mancante o non valida |
401 | Credenziali non valide |
409 | Già 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"
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
MessageId | integer | sì | ID del modello di messaggio di cui visualizzare l'anteprima (da /message/list) |
IDEmailExpFrom | integer | sì | ID dell'indirizzo mittente da utilizzare (da /senderEmail/list) |
IDEmailExpTo | integer | sì | ID dell'indirizzo mittente destinatario — l'email di test viene inviata a questo indirizzo |
Risposte
| Codice | Descrizione |
|---|---|
200 | Email di test inviata con successo |
400 | Campo obbligatorio mancante |
401 | Credenziali non valide |
Esempio 200
{
"SendingTest": {
"IdSendingTest": 7001,
"ToEmail": "[email protected]",
"FromEmail": "[email protected]",
"SenderName": "Your Company Newsletter"
}
}
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.
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Risposte
| Codice | Descrizione |
|---|---|
200 | Email pianificate restituite |
401 | Credenziali non valide |
Esempio 200
{
"scheduledMails": [
{
"IdSingleSend": 880123,
"Email": "[email protected]",
"Subject": "Your invoice",
"DatePlanned": "2026-12-01T09:00:00"
}
]
}
/send/mail/{IdSingleSend}/cancel.{format}Annulla un'email singola pianificata
Annulla l'email finché non è partita.
Scope OAuth : email:send
Parametri
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
IdSingleSend | path | integer (int64) | sì | IdSingleSend restituito da /send/sendmail |
Risposte
| Codice | Descrizione |
|---|---|
200 | Email annullata |
401 | Credenziali non valide |
409 | Invio non trovato o già partito |
Esempio 200
{
"Result": "OK",
"Cancelled": 880123
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
IdSingleSend | path | integer (int64) | sì | IdSingleSend restituito da /send/sendmail |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
PlanDate | string (date-time) | sì | Nuova data di invio (ISO 8601) |
Risposte
| Codice | Descrizione |
|---|---|
200 | Email ripianificata |
400 | Data mancante o non valida |
401 | Credenziali non valide |
409 | Invio non trovato, già partito o data fuori dai limiti |
Esempio 200
{
"Result": "OK",
"IdSingleSend": 880123,
"NewPlanDate": "2026-12-15T09:00:00"
}
/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:
IDEmailExp — l'ID dell'indirizzo mittente (da /senderEmail/list)EmailData — destinatario nel formato email,field1,field2,...,field25 (separati da virgola)BodyHTML — il corpo HTMLSubject — l'oggettoFormato 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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (multipart/form-data)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
IDEmailExp | integer | sì | ID dell'indirizzo email mittente da utilizzare (da /senderEmail/list) |
EmailData | string | sì | 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.
|
BodyHTML | string | sì | Contenuto HTML completo del corpo dell'email |
Subject | string | sì | Oggetto dell'email (massimo 255 caratteri) |
attachments | array 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. | |
KeepInMyFiles | boolean | false (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
| Codice | Descrizione |
|---|---|
200 | Email transazionale inviata o pianificata con successo |
400 | Campo obbligatorio mancante o formato email non valido |
401 | Credenziali non valide |
403 | Crediti email insufficienti |
404 | Mittente 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
}
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
IdSend | path | integer | sì | L'IdSingleSend restituito da /send/sendmail. |
Risposte
| Codice | Descrizione |
|---|---|
200 | Stato di consegna attuale |
401 | Credenziali non valide |
404 | Nessun 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
}
}
Elenca e gestisci gli indirizzi email mittenti validati. Solo gli indirizzi verificati possono essere utilizzati come indirizzo From nelle campagne.
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
emailFilter | query | string | Filtra per indirizzo email (corrispondenza parziale, case-insensitive) | |
numberOfRecords | query | integer | Elementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione). | |
pageNumber | query | integer | Numero di pagina (1-based). Il valore predefinito è 1. | |
sortByName | query | boolean | Imposta a true per ordinare i risultati per nome del mittente alfabeticamente |
Risposte
| Codice | Descrizione |
|---|---|
200 | Indirizzi mittenti restituiti con successo |
401 | Credenziali 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"
}
]
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
Email | string | sì | Indirizzo del mittente |
SenderName | string | sì | Nome mostrato ai destinatari |
Risposte
| Codice | Descrizione |
|---|---|
200 | Indirizzo aggiunto. DomainHasMx è false quando il dominio non ha un record MX. |
400 | Email o SenderName mancante |
401 | Credenziali non valide |
422 | Indirizzo 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. |
503 | Temporaneamente non disponibile, riprova |
Esempio 200
{
"Result": "OK",
"ConfirmationSent": true,
"DomainHasMx": true
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
IdSenderEmail | path | integer | sì | ID del mittente, da /senderEmail/list |
Risposte
| Codice | Descrizione |
|---|---|
200 | Email inviata di nuovo |
401 | Credenziali non valide |
404 | Mittente non trovato |
409 | Questo mittente è già convalidato |
503 | Temporaneamente non disponibile, riprova |
Esempio 200
{
"Result": "OK",
"ConfirmationSent": true
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
IdSenderEmail | path | integer | sì | ID del mittente, da /senderEmail/list |
Risposte
| Codice | Descrizione |
|---|---|
200 | Stato del dominio. Spf.RecommendedRecord è costruito a partire dal tuo record attuale: pubblicalo solo se Spf.ChangeNeeded è true. |
401 | Credenziali non valide |
404 | Mittente non trovato |
503 | Temporaneamente 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"
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
idEmailExp | integer | sì | ID dell'indirizzo mittente da rimuovere (da /senderEmail/list) |
Risposte
| Codice | Descrizione |
|---|---|
200 | Indirizzo mittente rimosso con successo |
400 | idEmailExp mancante |
401 | Credenziali non valide |
Esempio 200
{
"Result": "EmailSender Deleted"
}
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.
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
titleCampaignFilter | query | string | Filtra per titolo della campagna (corrispondenza parziale, case-insensitive) | |
numberOfRecords | query | integer | Elementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione). | |
pageNumber | query | integer | Numero di pagina (1-based). Il valore predefinito è 1. | |
dateStart | query | string (date-time) | Inizio del filtro per intervallo di date (ISO 8601) | |
dateEnd | query | string (date-time) | Fine del filtro per intervallo di date (ISO 8601) |
Risposte
| Codice | Descrizione |
|---|---|
200 | Statistiche delle campagne restituite con successo |
401 | Credenziali 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
}
]
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
idCampaign | query | integer | sì | ID della campagna (da /stats/list) |
Risposte
| Codice | Descrizione |
|---|---|
200 | Statistiche orarie restituite con successo |
401 | Credenziali non valide |
Esempio 200
{
"ByHour": [
{
"Hour": 9,
"Opens": 823,
"Clicks": 142
},
{
"Hour": 10,
"Opens": 512,
"Clicks": 98
}
]
}
/stats/byDay.{format}Statistiche per giorno
Restituisce la suddivisione giornaliera delle aperture e dei clic per una campagna specifica.
Scope OAuth : email:read
Parametri
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
idCampaign | query | integer | sì | ID della campagna (da /stats/list) |
Risposte
| Codice | Descrizione |
|---|---|
200 | Statistiche giornaliere restituite con successo |
401 | Credenziali non valide |
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
IdCampaign | integer | sì | ID della campagna le cui statistiche eliminare (da /stats/list) |
Risposte
| Codice | Descrizione |
|---|---|
200 | Statistiche della campagna eliminate con successo |
400 | IdCampaign mancante |
401 | Credenziali non valide |
404 | Campagna non trovata |
Esempio 200
{
"Result": "Statistic Deleted"
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
idCampaign | query | integer | sì |
Risposte
| Codice | Descrizione |
|---|---|
200 | Suddivisione per paese restituita |
401 | Credenziali non valide |
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
idCampaign | query | integer | sì | |
emailFilter | query | string | ||
numberOfRecords | query | integer | Elementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione). | |
pageNumber | query | integer | Numero di pagina (1-based). Il valore predefinito è 1. |
Risposte
| Codice | Descrizione |
|---|---|
200 | Eventi di apertura restituiti |
401 | Credenziali non valide |
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
idCampaign | query | integer | sì | |
emailFilter | query | string | ||
numberOfRecords | query | integer | Elementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione). | |
pageNumber | query | integer | Numero di pagina (1-based). Il valore predefinito è 1. |
Risposte
| Codice | Descrizione |
|---|---|
200 | Eventi di clic restituiti |
401 | Credenziali non valide |
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
idCampaign | query | integer | sì |
Risposte
| Codice | Descrizione |
|---|---|
200 | Suddivisione per OS restituita |
401 | Credenziali non valide |
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
idCampaign | query | integer | sì |
Risposte
| Codice | Descrizione |
|---|---|
200 | Suddivisione per client di posta restituita |
401 | Credenziali non valide |
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
idCampaign | query | integer | sì | |
emailFilter | query | string | ||
numberOfRecords | query | integer | Elementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione). | |
pageNumber | query | integer | Numero di pagina (1-based). Il valore predefinito è 1. |
Risposte
| Codice | Descrizione |
|---|---|
200 | Eventi di rimbalzo restituiti |
401 | Credenziali non valide |
Esempio 200
{
"ListBadMail": [
{
"Email": "[email protected]",
"Date": "2026-04-20T09:05:12",
"Error": "550 5.1.1 recipient rejected",
"AddressbookId": 1813318
}
]
}
Sfoglia il registro completo di tutti gli invii email passati.
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
subjectMessageFilter | query | string | Filtra per oggetto della campagna (corrispondenza parziale, case-insensitive) | |
idCampaign | query | integer | Restituisce la cronologia solo per una campagna specifica | |
numberOfRecords | query | integer | Elementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione). | |
pageNumber | query | integer | Numero di pagina (1-based). Il valore predefinito è 1. | |
bodyHTML | query | boolean | Imposta a true per includere il corpo HTML completo.
Limita automaticamente i risultati a 10 per pagina.
|
Risposte
| Codice | Descrizione |
|---|---|
200 | Cronologia restituita con successo |
401 | Credenziali non valide |
Esempio 200
{
"HistoricList": [
{
"IDHistoric": 9001,
"SubjectMessage": "Spring Newsletter — April 2026",
"DateSend": "2026-04-20T09:00:01",
"NumberSend": 4521,
"NumberOpen": 1823,
"NumberClick": 342
}
]
}
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.
/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:
IdClient (intero) — il tuo ID client MailproApiKey (stringa) — la tua chiave APIListId (intero) — ID della lista di destinazione. È accettato anche l'alias legacy AddressBookId.file (binario) — il file CSV o XLSX da caricareFacoltativo:
WebhookUrl (stringa) — URL HTTPS chiamato al termine dell'elaborazione. Riceve un payload JSON con lo stato finale (success / failed) e i conteggi delle righe importate / saltate / non valide.Formato del file:
Email — case-insensitive)Scope OAuth : contacts:write
Parametri
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (multipart/form-data)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
ListId | integer | sì | ID della lista di destinazione. È accettato anche l'alias legacy AddressBookId. |
file | string (binary) | sì | File CSV o XLSX (UTF-8, massimo 50 MB) |
WebhookUrl | string (uri) | URL di callback invocato al termine dell'elaborazione |
Risposte
| Codice | Descrizione |
|---|---|
200 | File accettato e messo in coda |
400 | Nessun file caricato o ListId mancante |
401 | Credenziali non valide |
500 | Errore del server o dello storage |
Esempio 200
{
"Result": "OK",
"ImportJobId": 13,
"InternalName": "230575-20260420140221-contacts.csv"
}
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.
/webhooksElenca i webhook
Restituisce ogni webhook configurato sull'account autenticato.
Risposte
| Codice | Descrizione |
|---|---|
200 | Array di webhook |
401 | Credenziali 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
}
/webhooksCrea 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)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
url | string (uri) | sì | Endpoint HTTPS (HTTP rifiutato in produzione) |
events | array of string | sì | Elenco dei tipi di evento da sottoscrivere (vedi il catalogo sopra). Usa ["*"] per sottoscriverti a tutti gli eventi di questa API. |
description | string |
Esempio
{
"url": "https://example.com/hooks/mailpro",
"events": [
"email.delivered",
"email.bounced"
],
"description": "Integrazione Slack"
}
Risposte
| Codice | Descrizione |
|---|---|
201 | Webhook creato — il secret viene restituito solo qui |
400 | URL non valido, elenco eventi non valido o limite superato |
401 | Credenziali 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"
}
/webhooks/{id}Ottieni un webhook
Parametri
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
id | path | integer (int64) | sì |
Risposte
| Codice | Descrizione |
|---|---|
200 | Il webhook |
404 | Webhook non trovato |
/webhooks/{id}Aggiorna un webhook
Aggiornamento parziale — solo i campi inviati vengono modificati.
Parametri
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
id | path | integer (int64) | sì |
Corpo della richiesta (application/json)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
url | string (uri) | ||
events | array of string | ||
description | string | ||
isActive | boolean | Imposta true per riattivare un webhook disattivato automaticamente una volta corretto l'endpoint. |
Risposte
| Codice | Descrizione |
|---|---|
200 | Webhook aggiornato |
400 | Payload non valido |
404 | Webhook non trovato |
/webhooks/{id}Elimina un webhook
Elimina definitivamente il webhook e la sua intera cronologia di recapito.
Parametri
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
id | path | integer (int64) | sì |
Risposte
| Codice | Descrizione |
|---|---|
204 | Eliminato |
404 | Webhook non trovato |
/webhooks/{id}/testInvia 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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
id | path | integer (int64) | sì |
Corpo della richiesta (application/json)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
eventType | string |
Esempio
{
"eventType": "ping"
}
Risposte
| Codice | Descrizione |
|---|---|
202 | Evento messo in coda per il recapito |
404 | Webhook non trovato |
Esempio 202
{
"deliveryId": 1234,
"eventId": "evt_8f3a9b2c4d1e5f6789abcdef01234567",
"eventType": "ping"
}
/webhooks/{id}/rotate-secretRuota 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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
id | path | integer (int64) | sì |
Risposte
| Codice | Descrizione |
|---|---|
200 | Nuovo segreto (visibile una sola volta) |
404 | Webhook non trovato |
Esempio 200
{
"secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}
/webhooks/{id}/deliveriesElenca 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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
id | path | integer (int64) | sì | |
limit | query | integer | ||
cursor | query | integer (int64) | Cursore di paginazione (= ultimo ID di recapito visto). Restituisce i recapiti con id < cursor. |
Risposte
| Codice | Descrizione |
|---|---|
200 | Array di tentativi di recapito (i più recenti per primi) |
404 | Webhook non trovato |
/webhooks/{id}/deliveries/{deliveryId}/replayRiproduci 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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
id | path | integer (int64) | sì | |
deliveryId | path | integer (int64) | sì |
Risposte
| Codice | Descrizione |
|---|---|
202 | Replay messo in coda |
404 | Webhook o recapito non trovati |
Bounce e disiscritti dell'account: elencare, aggiungere, rimuovere.
/suppression/bounces.{format}Elenca i bounce dell'account
Prima i più recenti. Il totale è nell'intestazione X-Total-Count.
Scope OAuth : email:read
Parametri
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
type | query | string: hard, soft | hard o soft | |
source | query | string | Origine del bounce: list, contact, api o smtp | |
email | query | string | Indirizzo esatto | |
dateFrom | query | string (date-time) | A partire da questa data | |
dateTo | query | string (date-time) | Fino a questa data | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Risposte
| Codice | Descrizione |
|---|---|
200 | Bounce restituiti |
400 | type deve essere hard o soft |
401 | Credenziali 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
}
]
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Id | path | integer (int64) | sì | Id del bounce |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
Source | string | sì | list, contact, api o smtp |
Type | string: hard, soft | sì | hard o soft |
Risposte
| Codice | Descrizione |
|---|---|
200 | Bounce rimosso |
400 | Source o Type mancante |
401 | Credenziali non valide |
404 | Bounce non trovato |
Esempio 200
{
"Result": "OK",
"Id": 5521,
"Restored": false
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Id | path | integer (int64) | sì | Id del bounce |
Risposte
| Codice | Descrizione |
|---|---|
200 | Contatto rimesso in lista |
401 | Credenziali non valide |
404 | Hard bounce di un contatto non trovato o indirizzo non più attivo |
Esempio 200
{
"Result": "OK",
"Id": 5521,
"Restored": true
}
/suppression/unsubscribers.{format}Elenca i disiscritti dell'account
Prima i più recenti. Il totale è nell'intestazione X-Total-Count.
Scope OAuth : contacts:read
Parametri
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
source | query | string | Origine della disiscrizione: contact, list, smtp, api o api3 | |
email | query | string | Indirizzo esatto | |
dateFrom | query | string (date-time) | A partire da questa data | |
dateTo | query | string (date-time) | Fino a questa data | |
numberOfRecords | query | integer | ||
pageNumber | query | integer |
Risposte
| Codice | Descrizione |
|---|---|
200 | Disiscritti restituiti |
401 | Credenziali non valide |
Esempio 200
{
"unsubscribers": [
{
"Id": 9012,
"Source": "api",
"Email": "[email protected]",
"Date": "2026-10-20T16:05:00",
"ListName": null,
"Comment": "Asked by phone"
}
]
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
Email | string | sì | Indirizzo da disiscrivere |
Comment | string | Commento libero | |
ListId | integer (int64) | Lista di disiscrizione dell'account (facoltativo) |
Risposte
| Codice | Descrizione |
|---|---|
200 | Fatto. AlreadyUnsubscribed è true quando l'indirizzo era già disiscritto. |
400 | È richiesto un indirizzo valido |
401 | Credenziali non valide |
404 | ListId non è una lista di disiscrizione di questo account |
Esempio 200
{
"Result": "OK",
"AlreadyUnsubscribed": false
}
/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
| Nome | Dove | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|---|
format | path | string: json, xml | sì | Formato della risposta |
Id | path | integer (int64) | sì | Id del disiscritto |
Corpo della richiesta (application/x-www-form-urlencoded)
| Nome | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
Source | string | sì | contact, list, smtp, api o api3 |
Risposte
| Codice | Descrizione |
|---|---|
200 | Disiscritto rimosso |
400 | Source è obbligatorio |
401 | Credenziali non valide |
404 | Disiscritto non trovato |
Esempio 200
{
"Result": "OK",
"Removed": 9012
}