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

API SMS Mailpro™ : Riferimento

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

L'API SMS Mailpro™ consente di gestire in modo programmatico gli elenchi di contatti telefonici, i numeri di telefono e di inviare SMS in blocco o singoli.

Autenticazione

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

> I metodi legacy Bearer JWT e id_client+api_key continuano a funzionare invariati e non sono soggetti a verifica di scope. Solo gli access token OAuth 2.0 sono sottoposti ai controlli di scope per endpoint mostrati in ciascuna operazione di seguito.

Metodo 1 — OAuth 2.0 (consigliato per le integrazioni)

Mailpro gestisce un unico authorization server OAuth 2.0 per tutte le sue API, su una superficie indipendente dalla versione: https://api.mailpro.com/oauth/. Non esiste un endpoint OAuth per versione: il token si ottiene da /oauth/token e lo stesso token funziona su questa API SMS, sull'API CRM v3 e sull'API Email v2. Quali endpoint può chiamare è determinato dagli scope del token, non dall'URL di base dell'API. Issuer (claim iss): https://api.mailpro.com/oauth/.

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

Grant supportati: authorization_code + PKCE (S256, obbligatorio), client_credentials, refresh_token (con rotazione). TTL dell'access token: 20 min; refresh token: 30 giorni (sliding, monouso); auth code: 60 s.

Quickstart — ottenere un token e chiamare questa API (sostituisci i segnaposto; non committare mai un segreto reale):

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=sms:send sms:read"

Quindi chiama questa API con Authorization: Bearer ACCESS_TOKEN. Lo stesso token funziona sulle API CRM v3 ed Email v2. Un token privo dello scope richiesto da un endpoint riceve 403 insufficient_scope. Per la procedura completa del flusso e il catalogo degli scope, consulta la documentazione dell'API CRM v3 › Autenticazione. Scope rilevanti per SMS: sms:send, sms:read, sms:contacts:read, sms:contacts:write, account:read.

Metodo 2 — Bearer JWT (legacy)

Authorization: Bearer <access_token>

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

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

grant_type=password&username=YOUR_USERNAME&password=YOUR_API_KEY

Lo stesso token è valido anche sull'API CRM v3 e sull'API Email v2: ti autentichi una sola volta e puoi chiamare qualsiasi API. I token sono validi per 30 giorni per impostazione predefinita; utilizza grant_type=refresh_token per rinnovarli senza dover ripetere l'autenticazione. Non hanno scope: preferisci OAuth 2.0 per le integrazioni installabili.

Metodo 3 — id_client + api_key

Due credenziali:

ParametroTipoDescrizione
id_clientintegerIl tuo ID cliente Mailpro numerico, disponibile in Impostazioni → Accesso API
api_keystringLa tua chiave API (formato GUID), disponibile in Impostazioni → Accesso API

Inviale in uno di questi modi — scegline uno solo:

Se fornisci le credenziali in più punti, l'header ha la precedenza.

Verifica degli scope OAuth per endpoint (SMS)

Per i token emessi via OAuth, ogni gruppo di endpoint richiede uno scope (i metodi di autenticazione legacy ne sono esenti). Ogni operazione indica il proprio scope sotto Authorization. Riepilogo:

EndpointScope richiesto
/send/* (invio in blocco, singolo, pianificazione)sms:send
/history/list, /credit/getsms:read
/phone/list, /list/listsms:contacts:read
/phone/{add,edit,del}, /list/{edit,del}, /import/uploadsms:contacts:write
/account/limitsaccount:read

> POST /list/add (creazione di una lista) è attualmente raggiungibile da qualsiasi token valido — non è ancora sottoposto a verifica di scope. Il rifiuto per scope mancante sugli endpoint sottoposti a verifica restituisce 403 con { "error": "insufficient_scope", "required_scope": "…" }.

Formato della risposta

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

I nomi dei campi nelle risposte sono in PascalCase (TotalCredits, FirstName, …), mentre i parametri di richiesta sono in snake_case (id_client, address_book_id, …). Gli endpoint di elenco racchiudono le loro righe in un array Items.

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.

Costo in crediti di un SMS

Un SMS costa crediti del paese × numero di parti.

Crediti del paese — ogni paese di destinazione ha un prezzo di 1, 2 o 3 crediti, in base al prefisso internazionale del numero. L'invio a un numero il cui prefisso non è tariffato viene rifiutato con un 400.

Numero di parti — un messaggio più lungo di un SMS viene suddiviso dall'operatore e ogni parte viene addebitata. Il limite dipende dai caratteri utilizzati:

AlfabetoMessaggio singoloPer parte se suddiviso
GSM-7 (latino standard)160 caratteri153 caratteri
Unicode (accenti oltre GSM-7, cirillico, emoji, …)70 caratteri67 caratteri

Un singolo carattere fuori dal GSM-7 fa passare tutto il messaggio in Unicode; così un emoji può portare un messaggio di 160 caratteri da 1 a 3 parti. I caratteri ^ { } [ ] ~ | \ e € contano due ciascuno, anche se sono GSM-7.

*Esempio:* un messaggio di 300 caratteri in latino standard = 2 parti; inviato a un paese da 2 crediti, costa 2 × 2 = 4 crediti per destinatario.

Formato dei numeri di telefono

I numeri di telefono vengono normalizzati automaticamente. Puoi inviarli in molti formati: spazi, trattini, punti, barre, 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 — formato E.164 internazionale0612345678 — formato nazionale (con 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 — solo cifre1234567 — troppo corto (< 8 cifre)

Regole:

Codici di errore

HTTPCodiceSignificato
400103Input malformato — parametro obbligatorio mancante o non valido
202202Credito SMS insufficiente
401id_client / api_key non validi
500500Errore interno

Webhook

Mailpro™ può notificare il tuo server in tempo reale quando si verificano eventi SMS sul tuo account (un SMS viene consegnato, un SMS fallisce, il tuo saldo crediti è basso, ecc.). Stile Stripe: il tuo URL riceve una POST firmata 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 aver creato, aggiornato o eliminato un webhook, la modifica impiega fino a 10 minuti per propagarsi su tutti i server API Mailpro. Durante tale finestra 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 API.

Envelope del payload

Tutti gli eventi condividono un envelope comune:

{
  "id":         "evt_8f3a9b2c4d1e5f6789abcdef01234567",
  "type":       "sms.queued",
  "created":    1748194800,
  "apiVersion": "sms",
  "account":    { "id": 12345, "name": "ACME Corp" },
  "data":       {
    "messageId":   12345,
    "to":          "41791234567",
    "queuedAt":    "2026-05-27T14:32:12.0123456Z",
    "scheduledAt": "2026-05-27T14:32:12.0123456Z",
    "parts":       1
  }
}
CampoFormatoDescrizione
idevt_ + 32 hexID univoco dell'evento — da usare come chiave di idempotenza dal tuo lato.
type<dominio>.<verbo>Tipo di evento canonico.
createdsecondi Unix UTCIncluso nella firma HMAC.
apiVersion"sms" per gli eventi emessi da POST /sms/send/add_single; "v3" per gli eventi emessi da POST /v3/Sms/SingleSMS; "watcher" per gli eventi guidati dalla DLR emessi dal worker.Quale componente Mailpro ha pubblicato l'evento.
account.idintIl tuo ID cliente Mailpro (= id_client).
account.namestringIl nome del tuo account (utile per il debug lato client).
dataobjectPayload dell'evento — la forma dipende da type (vedi catalogo di seguito).

Catalogo degli eventi

Vengono effettivamente emessi solo gli eventi elencati di seguito. Le forme sono il JSON letterale inviato dalla piattaforma: rispetta esattamente questi nomi di campo durante il parsing.

EventoTriggerForma di data
pingTest tramite POST /webhooks/{id}/test{ message }
sms.queuedPOST /sms/send/add_single o POST /v3/Sms/SingleSMS accettato nella coda di invio Mailpro{ messageId: int, to: string, queuedAt: ISO-8601, scheduledAt: ISO-8601, parts: int }
sms.deliveredDLR con codice operatore 004 o 008 (codici di successo){ messageId: int, phone: string, stateCode: string, dlrDate: datetime }
sms.failedDLR con qualsiasi altro codice operatore (timeout, non consegnato, rifiutato, in blacklist, …){ messageId: int, phone: string, stateCode: string, dlrDate: datetime }
credits.sms.lowIl saldo crediti SMS è sceso sotto la soglia di avviso (worker CreditsLowWatcher){ remaining: int, threshold: int, alertedAt: ISO-8601 }

> Nota — non esiste un evento sms.sent. La DLR dell'operatore è l'unico feedback che la piattaforma riceve tra "queued" e "delivered/failed", quindi l'evento successivo a sms.queued sarà sms.delivered (successo) oppure sms.failed (errore). La maggior parte dei messaggi raggiunge l'operatore in pochi secondi e ottiene una DLR in pochi minuti; le condizioni della rete mobile possono occasionalmente estendere questo intervallo a ore.

> Denominazione dei campi — sms.queued usa to (la destinazione così come inviata dal chiamante dell'API, dopo normalizzazione). sms.delivered / sms.failed usano phone (la destinazione restituita dall'operatore nella DLR). In pratica le cifre saranno le stesse, ma i nomi differiscono perché gli eventi provengono da percorsi di codice diversi.

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

Firma HMAC

Ogni POST include un header X-Mailpro-Signature:

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

Per verificare:

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

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

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

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

Nuovi tentativi e disattivazione automatica

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

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

Successo = HTTP 2xx

Consideriamo il tuo webhook come consegnato con successo solo se restituisci uno stato in 200–299. Qualsiasi 3xx/4xx/5xx o un timeout (> 10 s) viene conteggiato come fallimento e attiva nuovi tentativi. Se il tuo endpoint è definitivamente fuori servizio, restituisci esplicitamente 410 Gone: i tentativi continueranno comunque, ma il motivo del fallimento sarà più chiaro nel tuo log di consegna.

Limiti

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

Sommario

Authentication

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

POST /token

Ottieni l'access token (redirect 307 verso /v3/token)

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

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

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

Usa grant_type=refresh_token per rinnovare l'access token senza ri-autenticarti. Conserva i token lato server (Vault, variabili d'ambiente); non incorporarli mai nel JS del browser o nei binari delle app mobile. Consulta la nota di sicurezza completa nella documentazione /token dell'API CRM v3.

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

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

Risposte

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

Esempio 200

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

Esempio 400

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

Account

Controlla il saldo dei crediti SMS, la quota API mensile e lo stato dell'account.

GET /account/limits.{format}

Ottieni la quota API mensile

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

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

Cosa consuma crediti:

Cosa è GRATUITO (non consuma crediti):

La quota è condivisa tra tutte e 3 le API Mailpro (v2, v3, sms) — un client = un budget mensile sull'intera piattaforma. Gli invii SMS consumano in aggiunta il saldo crediti SMS dedicato (GET /credit/get.{format}).

Scope OAuth : account:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Risposte

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

Esempio 200

{
  "monthlyLimit": 50000,
  "remaining": 32847,
  "used": 17153,
  "isFree": false,
  "remainedSendsForFree": null
}

Send SMS

Invia messaggi SMS — un singolo SMS transazionale a un destinatario, oppure una campagna bulk a un'intera lista di contatti.

POST /send/add.{format}

Invia SMS bulk a una lista di contatti

Invia un messaggio SMS a tutti i numeri di telefono in una lista di contatti. Supporta la pianificazione: imposta scheduled_time su una data futura per inviare in seguito, oppure ometterlo per inviare immediatamente.

Consumo dei crediti: i crediti vengono detratti al momento dell'invio. I messaggi lunghi (>160 caratteri GSM-7) vengono suddivisi in più parti, ciascuna delle quali costa crediti aggiuntivi.

La risposta restituisce { "Error": "Insufficient Credit", "Code": 202 } se l'account ha crediti insufficienti.

Scope OAuth : sms:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

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

NomeTipoObbligatorioDescrizione
id_clientintegersìIl tuo ID client Mailpro
api_keystringsìLa tua API key (GUID)
messagestringsìTesto del messaggio SMS. Mantienilo sotto i 160 caratteri per un SMS in singola parte. I caratteri al di fuori dell'alfabeto GSM-7 (es. cinese, arabo, emoji) commutano la codifica in Unicode, riducendo il limite a 70 caratteri per parte.
tointegersìID della lista di contatti a cui inviare (da /list/list)
scheduled_timestring (date-time)Pianifica l'invio per una data/ora futura (ISO 8601). Ometti o lascia vuoto per inviare immediatamente.
shorten_urlsbooleanImposta true per sostituire ogni link del messaggio con un link breve https://mailp.ro/m/...: meno caratteri, quindi a volte meno parti di SMS fatturate. Un link che non può essere abbreviato resta invariato.

Risposte

CodiceDescrizione
200Invio SMS bulk creato con successo
202Crediti SMS insufficienti
400Campo obbligatorio mancante
401Credenziali non valide

Esempio 200

{
  "Id": 6001,
  "Message": "Flash sale today only — 30% off all orders. Shop now at mailpro.com/shop",
  "ScheduledTime": "2026-04-20T10:00:00",
  "To": [
    "42"
  ]
}

Esempio 202

{
  "Error": "Insufficient Credit",
  "Code": 202
}

Esempio 400

{
  "Error": "Malformed Input",
  "Code": 103
}

GET /send/add_single.{format}

Invia un singolo SMS (GET)

Invia un singolo SMS a un destinatario tramite una richiesta GET. Utile per integrazioni semplici dove POST non è disponibile. Credenziali e messaggio vengono passati come parametri della query string.

Nota: evita di usare GET per messaggi sensibili — i parametri della query appaiono nei log del server. Preferisci invece POST /send/add_single.

Scope OAuth : sms:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
toquerystringsìNumero di telefono del destinatario. Accetta +41…, 0041… o 41… con o senza separatori. Consulta Formato del numero di telefono nella descrizione dell'API.
messagequerystringsìTesto del messaggio SMS (max 160 caratteri per la codifica standard)
scheduled_timequerystring (date-time)Pianifica l'invio (ISO 8601). Ometti per inviare immediatamente.
shorten_urlsquerybooleanImposta true per sostituire ogni link del messaggio con un link breve https://mailp.ro/m/...: meno caratteri, quindi a volte meno parti di SMS fatturate. Un link che non può essere abbreviato resta invariato.

Risposte

CodiceDescrizione
200SMS inviato (o pianificato) con successo
202Crediti SMS insufficienti
400Parametro obbligatorio mancante
401Credenziali non valide

Esempio 200

{
  "Id": 5001,
  "Message": "Your appointment is confirmed for tomorrow at 10:00.",
  "ScheduledTime": "2026-04-15T09:00:00",
  "To": "0041791234567",
  "Charge": "1"
}

POST /send/add_single.{format}

Invia un singolo SMS

Invia un singolo messaggio SMS a un numero di telefono destinatario. Supporta la pianificazione tramite scheduled_time.

Consumo dei crediti: i crediti vengono detratti al momento dell'invio. Il campo Charge nella risposta indica quanti crediti sono stati consumati.

La risposta restituisce { "Error": "Insufficient Credit", "Code": 202 } se l'account ha crediti insufficienti.

Scope OAuth : sms:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

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

NomeTipoObbligatorioDescrizione
id_clientintegersìIl tuo ID client Mailpro
api_keystringsìLa tua API key (GUID)
messagestringsìTesto del messaggio SMS
tostringsìNumero di telefono del destinatario. Accetta +41…, 0041… o 41… con o senza separatori. Consulta Formato del numero di telefono nella descrizione dell'API.
scheduled_timestring (date-time)Pianifica l'invio per un'ora futura. Ometti per inviare immediatamente.
shorten_urlsbooleanImposta true per sostituire ogni link del messaggio con un link breve https://mailp.ro/m/...: meno caratteri, quindi a volte meno parti di SMS fatturate. Un link che non può essere abbreviato resta invariato.

Risposte

CodiceDescrizione
200SMS inviato (o pianificato) con successo
202Crediti SMS insufficienti
400Campo obbligatorio mancante
401Credenziali non valide

Esempio 200

{
  "Id": 5001,
  "Message": "Your verification code is 8472. Valid for 10 minutes.",
  "ScheduledTime": "2026-04-15T14:30:00",
  "To": "0041791234567",
  "Charge": "1"
}

Esempio 202

{
  "Error": "Insufficient Credit",
  "Code": 202
}

Esempio 400

{
  "Error": "Malformed Input",
  "Code": 103
}

GET /send/list.{format}

Elenca le campagne SMS

Restituisce l'elenco delle campagne SMS (invii bulk) dell'account. Paginazione tramite gli header NumberOfRecords e PageNumber.

Usa type_to per filtrare per tipo di invio:

Scope OAuth : sms:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
type_toqueryinteger: 0, 1Filtro per tipo di invio: - 0 (default) — invii bulk verso una lista di contatti - 1 — invii individuali a singolo numero

Risposte

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

Esempio 200

[
  {
    "Id": 5001,
    "Message": "Your verification code is 8472",
    "ScheduledTime": "2026-04-15T09:00:00",
    "To": "41791234567"
  }
]

POST /send/del.{format}

Annulla o elimina un invio SMS

Annulla un invio SMS in attesa pianificato, oppure elimina un invio completato dallo storico. Solo gli invii pianificati nel futuro possono essere annullati. Gli invii in corso non possono essere fermati.

Scope OAuth : sms:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

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

NomeTipoObbligatorioDescrizione
id_clientintegersìIl tuo ID client Mailpro
api_keystringsìLa tua API key (GUID)
id_sendintegersìID dell'invio SMS da annullare o eliminare (da /send/list)

Risposte

CodiceDescrizione
200Invio SMS annullato o eliminato con successo
400id_send mancante
401Credenziali non valide
500Eliminazione fallita (invio non trovato o già processato)

Esempio 200

{
  "Result": "OK"
}

Esempio 500

{
  "Error": "Delete failed",
  "Code": 500
}

GET /send/scheduled.{format}

Elenca i miei invii SMS pianificati

Restituisce gli invii SMS (singoli o campagne) pianificati per una data futura che non sono ancora stati spediti. Utile prima di chiamare /cancel o /reschedule.

I record sono ordinati per scheduled_time crescente.

Scope OAuth : sms:send

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
id_clientqueryintegersì
api_keyquerystringsì
NumberOfRecordsheaderintegerElementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione). Header HTTP o parametro di query.
PageNumberheaderintegerNumero di pagina (a partire da 1) per le risposte paginate. Inviato come header HTTP.

Risposte

CodiceDescrizione
200Elenco degli invii SMS pianificati
401Credenziali non valide

Esempio 200

[
  {
    "Id": 9001,
    "Message": "Black Friday: 30% off until midnight.",
    "ScheduledTime": "2026-11-27T12:00:00",
    "To": "+33671234567"
  }
]

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

Annulla un invio SMS pianificato

Annulla un SMS pianificato che non è ancora stato spedito. Se l'invio è già stato processato (o non esiste / appartiene a un altro client), restituisce 409 Conflict.

Scope OAuth : sms:send

Parametri

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

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

NomeTipoObbligatorioDescrizione
id_clientintegersì
api_keystringsì

Risposte

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

Esempio 200

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

Esempio 409

{
  "error": "conflict",
  "message": "Send not found, not owned by client, or already dispatched."
}

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

Riprogramma un invio SMS pianificato

Aggiorna la data pianificata di un SMS programmato che non è ancora stato spedito. La nuova data deve essere nel futuro e entro 90 giorni.

Nome del campo data: l'API accetta scheduled_time (primario) così come gli alias legacy PlanDate, date_planned e DatePlanned. Fornisci uno qualsiasi di essi — viene usato il primo non null.

Scope OAuth : sms:send

Parametri

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

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

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

Risposte

CodiceDescrizione
200Invio riprogrammato
400scheduled_time mancante o non valido
401Credenziali non valide
409Già spedito, non trovato o nuova data fuori intervallo

Esempio 200

{
  "Result": "OK",
  "Id": 9001,
  "NewScheduledTime": "2026-12-31T14:30:00"
}

Esempio 409

{
  "error": "conflict",
  "message": "Reschedule failed — send not found, already dispatched, or new date out of range."
}

Lists

Gestisci le liste di contatti SMS. Una lista di contatti raggruppa numeri di telefono per l'invio bulk. Puoi creare fino a 1.000 liste per account (stesso limite sulle tre API Mailpro e nell'app).

GET /list/list.{format}

Elenca le liste di contatti telefonici

Restituisce tutte le liste di contatti SMS dell'account. Usa i valori Id restituiti per inviare campagne SMS bulk o aggiungere numeri di telefono.

Scope OAuth : sms:contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Risposte

CodiceDescrizione
200Liste telefoniche restituite con successo
401Credenziali non valide

Esempio 200

{
  "Items": [
    {
      "AddressBookId": 42,
      "Name": "Newsletter subscribers",
      "TotalNumberPhones": 1547
    },
    {
      "AddressBookId": 43,
      "Name": "Loyalty program",
      "TotalNumberPhones": 823
    }
  ]
}

POST /list/add.{format}

Crea una lista di contatti

Crea una nuova lista di contatti SMS con il nome indicato. La lista parte vuota — aggiungi i numeri di telefono con POST /phone/add. Massimo 1.000 liste per account (stesso limite sulle tre API Mailpro e nell'app). Restituisce HTTP 422 se il limite è raggiunto.

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

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

NomeTipoObbligatorioDescrizione
id_clientintegersìIl tuo ID client Mailpro
api_keystringsìLa tua API key (GUID)
namestringsìNome visualizzato per la nuova lista di contatti

Risposte

CodiceDescrizione
200Lista di contatti creata con successo
400Campo obbligatorio mancante (name)
401Credenziali non valide

Esempio 200

{
  "Id": 44,
  "Name": "Spring campaign 2026",
  "NumberPhones": 0
}

Esempio 400

{
  "Error": "Malformed Input",
  "Code": 103
}

POST /list/edit.{format}

Rinomina una lista di contatti

Aggiorna il nome visualizzato di una lista di contatti SMS esistente. I numeri di telefono presenti nella lista non vengono modificati.

Scope OAuth : sms:contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

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

NomeTipoObbligatorioDescrizione
id_clientintegersìIl tuo ID client Mailpro
api_keystringsìLa tua API key (GUID)
address_book_idintegersìID della lista di contatti da rinominare (da /list/list)
namestringsìNuovo nome visualizzato per la lista di contatti

Risposte

CodiceDescrizione
200Lista di contatti rinominata con successo
400Campo obbligatorio mancante
401Credenziali non valide

POST /list/del.{format}

Elimina una lista di contatti

Elimina definitivamente una lista di contatti SMS e tutti i numeri di telefono che contiene. Questa azione non può essere annullata.

Scope OAuth : sms:contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

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

NomeTipoObbligatorioDescrizione
id_clientintegersìIl tuo ID client Mailpro
api_keystringsìLa tua API key (GUID)
address_book_idintegersìID della lista di contatti da eliminare

Risposte

CodiceDescrizione
200Lista di contatti eliminata con successo
400address_book_id mancante
401Credenziali non valide

Phone Numbers

Gestisci i singoli numeri di telefono all'interno di una lista di contatti — aggiungi, aggiorna e rimuovi voci.

GET /phone/list.{format}

Elenca i numeri di telefono in una lista di contatti

Restituisce un elenco paginato dei numeri di telefono in una specifica lista di contatti. Usa address_book_id per specificare quale lista recuperare. Paginazione: NumberOfRecords e PageNumber (5.000 per pagina per impostazione predefinita, pagina 1).

Scope OAuth : sms:contacts:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta
address_book_idqueryintegersìID della lista di contatti da cui recuperare i numeri di telefono
NumberOfRecordsheaderintegerElementi per pagina — 5.000 predefiniti e al massimo (vedi Paginazione). Header HTTP o parametro di query.
PageNumberheaderintegerNumero di pagina (a partire da 1) per le risposte paginate. Inviato come header HTTP.
SortByNameheaderbooleanImposta a true per ordinare i risultati alfabeticamente per nome.

Risposte

CodiceDescrizione
200Numeri di telefono restituiti con successo
401Credenziali non valide

Esempio 200

{
  "Items": [
    {
      "Id": 1001,
      "Number": "41791234567",
      "FirstName": "Alice",
      "LastName": "Dupont"
    },
    {
      "Id": 1002,
      "Number": "33612345678",
      "FirstName": "Bob",
      "LastName": "Martin"
    }
  ]
}

POST /phone/add.{format}

Aggiungi numero/i di telefono a una lista

Aggiunge uno o più numeri di telefono a una lista di contatti.

Numero singolo: usa il campo number.

Import bulk: usa il campo phone_list con i numeri separati da punto e virgola: +41791234567;+33612345678;0049301234567

I numeri di telefono accettano il formato +, 00 o quello puro — consulta Formato del numero di telefono nella descrizione dell'API per l'elenco completo degli input accettati / rifiutati. I numeri duplicati vengono saltati silenziosamente a meno che non sia impostato force=1.

Scope OAuth : sms:contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

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

NomeTipoObbligatorioDescrizione
id_clientintegersìIl tuo ID client Mailpro
api_keystringsìLa tua API key (GUID)
address_book_idintegersìID della lista di contatti a cui aggiungere il/i numero/i
numberstringSingolo numero di telefono. Accetta +41…, 0041… o 41… con o senza separatori (spazi, trattini, punti, barre, parentesi). Consulta Formato del numero di telefono nella descrizione dell'API. Usa questo OPPURE phone_list — non entrambi.
phone_liststringElenco di numeri di telefono separati da punto e virgola per l'import bulk. Usa questo OPPURE number — non entrambi. Esempio: 0041791234567;0033612345678
firstnamestringNome del contatto (opzionale, solo per numero singolo)
lastnamestringCognome del contatto (opzionale, solo per numero singolo)
forceinteger: 0, 1Imposta a 1 per aggiungere un numero anche se in precedenza era stato disiscritto o esiste già. Default: 0 (i duplicati vengono saltati).

Risposte

CodiceDescrizione
200Numero/i di telefono aggiunto/i con successo
400Campo obbligatorio mancante
401Credenziali non valide

Esempio 200

{
  "Id": 1003,
  "Number": "0041791234567",
  "FirstName": "Alice",
  "LastName": "Dupont"
}

POST /phone/edit.{format}

Aggiorna una voce di numero di telefono

Aggiorna il numero di telefono e/o i dettagli del contatto di una voce esistente. Usa number_id (da /phone/list) per identificare la voce da aggiornare. Vengono aggiornati solo i campi forniti nella richiesta.

Scope OAuth : sms:contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

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

NomeTipoObbligatorioDescrizione
id_clientintegersìIl tuo ID client Mailpro
api_keystringsìLa tua API key (GUID)
number_idintegersìID della voce del numero di telefono da aggiornare (da /phone/list)
numberstringNuovo numero di telefono. Accetta +41…, 0041… o 41… con o senza separatori. Consulta Formato del numero di telefono nella descrizione dell'API.
firstnamestringNuovo nome per il contatto
lastnamestringNuovo cognome per il contatto

Risposte

CodiceDescrizione
200Voce del numero di telefono aggiornata con successo
400number_id mancante
401Credenziali non valide

POST /phone/del.{format}

Rimuovi un numero di telefono da una lista

Rimuove definitivamente una specifica voce di numero di telefono dalla sua lista di contatti. Usa number_id (da /phone/list) per identificare la voce.

Scope OAuth : sms:contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

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

NomeTipoObbligatorioDescrizione
id_clientintegersìIl tuo ID client Mailpro
api_keystringsìLa tua API key (GUID)
number_idintegersìID della voce del numero di telefono da eliminare (da /phone/list)

Risposte

CodiceDescrizione
200Numero di telefono rimosso con successo
400number_id mancante
401Credenziali non valide

Credit

Controlla il saldo residuo dei crediti SMS per il tuo account (separato dalla quota mensile di richieste API — vedi /account/limits).

GET /credit/get.{format}

Ottieni il saldo dei crediti SMS

Restituisce il saldo corrente dei crediti SMS per il tuo account. I crediti SMS vengono consumati al momento dell'invio. Un SMS standard (≤160 caratteri GSM-7) costa 1 credito. I messaggi più lunghi o con caratteri speciali possono costare di più.

> Nota: questo restituisce il tuo saldo crediti di invio SMS, non la tua quota di richieste API. > Per la quota API vedi GET /account/limits.{format}.

Scope OAuth : sms:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Risposte

CodiceDescrizione
200Saldo crediti restituito con successo
401Credenziali non valide

Esempio 200

{
  "TotalCredits": 5000
}

History

Esplora il log completo delle campagne SMS passate.

GET /history/list.{format}

Elenca lo storico degli invii SMS

Restituisce un log paginato di tutte le campagne SMS passate inviate da questo account. I risultati sono ordinati per data decrescente (più recenti per primi). Paginazione: NumberOfRecords e PageNumber (header o query, 5.000 per pagina per impostazione predefinita).

Scope OAuth : sms:read

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Risposte

CodiceDescrizione
200Lista dello storico restituita con successo
401Credenziali non valide

Esempio 200

{
  "Items": [
    {
      "Id": 583294,
      "DateSent": "2026-07-17T18:56:39.813",
      "Message": "Your verification code is 8472",
      "Charge": 3,
      "Parts": 1
    }
  ]
}

Import

Carica un file CSV o XLSX per importare numeri di telefono in una lista di contatti in modalità bulk. Il file viene accodato per l'elaborazione asincrona — traccia il completamento tramite l'ImportJobId restituito o tramite il callback opzionale webhook_url.

POST /import/upload.{format}

Carica un file di numeri di telefono (CSV / XLSX) per l'import bulk

Carica un file CSV o XLSX per importare numeri di telefono in una lista di contatti. Il file viene memorizzato e accodato per l'elaborazione asincrona — l'endpoint restituisce immediatamente un ImportJobId.

Tipo di richiesta: multipart/form-data

Campi del form obbligatori:

Opzionale:

Formato del file:

Scope OAuth : sms:contacts:write

Parametri

NomeDoveTipoObbligatorioDescrizione
formatpathstring: json, xmlsìFormato della risposta

Corpo della richiesta (multipart/form-data)

NomeTipoObbligatorioDescrizione
id_listinteger (int64)sìID della lista di contatti di destinazione
filestring (binary)sìFile CSV o XLSX (UTF-8, max 50 MB)
webhook_urlstring (uri)URL di callback invocato al termine dell'elaborazione

Risposte

CodiceDescrizione
200File accettato e accodato
400Nessun file caricato o id_list mancante
401Credenziali non valide
500Errore del server o dello storage

Esempio 200

{
  "Result": "OK",
  "ImportJobId": 15,
  "InternalName": "230575-20260420142616-phones.csv"
}

Webhooks

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

GET /webhooks

Elenca i webhook

Restituisce ogni webhook configurato sull'account autenticato.

Risposte

CodiceDescrizione
200Array di webhook
401Credenziali non valide

Esempio 200

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

POST /webhooks

Crea un webhook

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

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

Corpo della richiesta (application/json)

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

Esempio

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

Risposte

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

Esempio 201

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

GET /webhooks/{id}

Ottieni un webhook

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
200Il webhook
404Webhook non trovato

PUT /webhooks/{id}

Aggiorna un webhook

Aggiornamento parziale — 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 riabilitare un webhook disabilitato automaticamente una volta che il tuo endpoint è stato corretto.

Risposte

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

DELETE /webhooks/{id}

Elimina un webhook

Elimina definitivamente il webhook e tutto il suo storico di consegne.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

CodiceDescrizione
204Eliminato
404Webhook non trovato

POST /webhooks/{id}/test

Invia un evento di test

Accoda un evento ping immediato (o qualsiasi altro tipo di evento tramite il campo eventType nel body) verso il tuo endpoint. Utile per verificare la raggiungibilità e la verifica della firma prima di basarsi su eventi reali.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Corpo della richiesta (application/json)

NomeTipoObbligatorioDescrizione
eventTypestring

Esempio

{
  "eventType": "ping"
}

Risposte

CodiceDescrizione
202Evento accodato per la spedizione
404Webhook non trovato

Esempio 202

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

POST /webhooks/{id}/rotate-secret

Ruota il segreto HMAC

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

Usalo se sospetti che il tuo segreto sia stato compromesso.

Parametri

NomeDoveTipoObbligatorioDescrizione
idpathinteger (int64)sì

Risposte

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

Esempio 200

{
  "secret": "whsec_XyzA9876BcdE5432FghI1098JklM7654NopQ"
}

GET /webhooks/{id}/deliveries

Elenca i tentativi di 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, conteggi dei retry, messaggi di errore.

Parametri

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

Risposte

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

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

Riproduci una consegna

Accoda un nuovo tentativo di consegna con lo stesso payload dell'originale. Utile per ri-scatenare una consegna fallita dopo aver corretto il tuo endpoint. Viene creata una NUOVA riga Webhook_Delivery (l'originale viene preservata per audit). La riproduzione segue la policy di retry standard (stesso schedule di backoff, stessa regola di auto-disabilitazione a 10 fallimenti).

Parametri

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

Risposte

CodiceDescrizione
202Riproduzione accodata
404Webhook o consegna non trovati