REST API · v1

Un solo token. Ogni endpoint.

Un'API HTTP pulita e resource-oriented per campagne, liste, iscritti, automazioni, sending server e billing dei clienti. Autentica con un solo token, interroga JSON e rilascia in pochi minuti. La stessa API che usano i plugin è la stessa API che usano i client esterni — nessun endpoint di serie B.

Cosa puoi costruire

Frontend SaaS App mobile Sincronizzazione CRM Trigger di automazione Dashboard reseller
REQUEST POST /api/v1/campaigns HEADERS Authorization: Bearer ACELLE_TOKEN Content-Type: application/json BODY { "list_uid": "a3b9..." "name": "Welcome" "subject": "Hi friend" "from_name": "Acme" "from_email": "hi@..." "track_open": true "html": "<h1>…" } HTTPS your.acelle.com RESPONSE 200 OK { "campaign": { "uid": "abc123" "name": "Welcome" "subject": "Hi friend" "status": "ready" "track_open": true "created_at": "2026-05-06T…" "links": { "self": "/api/v1…" } } }

PERCHÉ QUESTA API

Nessuna sorpresa. Nessun endpoint di serie B.
La stessa API usata dai tuoi plugin.

Autenticazione tramite token

Ogni richiesta porta un singolo bearer token. Generato per utente da Profile → API token. Passalo nell'header Authorization: Bearer o nella query string ?api_token=. Revoca e ruota in qualsiasi momento.

Orientato alle risorse

Ogni concetto è una risorsa con verbi prevedibili. GET /lists restituisce la collezione, POST /lists ne crea una, PATCH /lists/:uid aggiorna, DELETE /lists/:uid rimuove. Le sotto-risorse si annidano naturalmente: /lists/:uid/subscribers.

La stessa usata dai plugin

Non c'è alcuna divisione tra interno ed esterno. Gli endpoint che la UI di AcelleMail chiama, gli endpoint che il tuo plugin estende e gli endpoint che il tuo client esterno legge — sono identici. Scopri il plugin SDK →

Endpoint self-hosted

L'URL di base è il tuo server — https://your-acelle.example.com/api/v1/. Nessun proxy vendor, nessun rate limit condiviso, nessun costo per richiesta. Il throughput è quello che il tuo hardware permette.

GUIDA RAPIDA

Da zero alla prima risposta in quattro step.

Ogni installazione AcelleMail ospita la propria API su /api/v1/. Sostituisci your-acelle.example.com con l'hostname della tua installazione.

STEP 1

Genera un token

Accedi alla tua installazione AcelleMail. Apri il menu profilo e clicca API token. Copia il valore — è univoco per utente e legato ai permessi di quell'utente.

# In your shell:
$ export ACELLE_TOKEN=paste-your-token-here
$ export ACELLE_BASE=https://your-acelle.example.com
STEP 2

Verifica il token

Chiama /me. Se il token è valido ottieni il tuo record utente. Altrimenti ricevi un 401 — controlla token e URL di base.

$ curl $ACELLE_BASE/api/v1/me \
    -H "Authorization: Bearer $ACELLE_TOKEN"

{ "id": 1, "email": "you@…", "uid": "…" }
STEP 3

Crea una lista

Le risorse si creano con POST. I campi obbligatori nel body per una mailing list sono name, from_email, from_name, subject e un blocco contatto.

$ curl -X POST $ACELLE_BASE/api/v1/lists \
    -H "Authorization: Bearer $ACELLE_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "name":       "Newsletter",
      "from_name":  "Acme",
      "from_email": "hi@acme.com",
      "subject":    "Welcome"
    }'
STEP 4

Aggiungi un iscritto

Usa l'UID della lista ottenuto allo step 3. I campi personalizzati si passano come parametri maiuscoli (FIRST_NAME, LAST_NAME, …) corrispondenti alla configurazione dei campi della tua lista.

$ curl -X POST $ACELLE_BASE/api/v1/subscribers \
    -H "Authorization: Bearer $ACELLE_TOKEN" \
    -d list_uid=$LIST_UID \
    -d EMAIL=alice@example.com \
    -d FIRST_NAME=Alice \
    -d tag=newsletter,beta

RISORSE

Otto risorse. Oltre quaranta endpoint. Tutti i verbi che ti aspetti.

Tutti gli endpoint qui sotto sono sotto namespace /api/v1/ e richiedono l'autenticazione token auth:api se non altrimenti indicato. Le azioni di ciclo di vita (run, pause, resume) sono esposte come sotto-route POST. I download dei log fanno streaming del CSV sottostante.

Autenticazione

Tutti gli endpoint autenticati accettano il token tramite l'header Authorization: Bearer (preferito) o il parametro query ?api_token= (legacy). Usa POST /user/login per scambiare email/password con un token nuovo da un client programmato.

POST/user/loginScambia email + password per un API token. Endpoint pubblico.
GET/meRestituisce il record dell'utente autenticato. Usalo per verificare un token.
POST/login-tokenGenera un URL di login one-shot che l'utente può cliccare per atterrare già autenticato.

Liste

Le mailing list sono il contenitore principale degli iscritti. Ogni lista include un'identità mittente di default, campi personalizzati e impostazioni di double-opt-in / email di benvenuto. I campi personalizzati si aggiungono con la sotto-route add-field.

GET/listsElenco paginato delle liste possedute dall'utente del token.
POST/listsCrea una nuova lista. Obbligatori: name, from_email, from_name, subject + blocco contatto.
GET/lists/:uidRecupera una singola lista con i suoi campi e statistiche.
PATCH/lists/:uidAggiorna metadati, identità mittente o impostazioni di opt-in.
POST/lists/:uid/add-fieldAggiunge un campo personalizzato. Il tipo è text, number o datetime.
DELETE/lists/:uidElimina definitivamente una lista e tutti i suoi iscritti.

Iscritti

Gli iscritti appartengono a una lista e portano con sé valori di campi personalizzati, tag e una cronologia di aperture/click. Lo status è uno fra subscribed, unsubscribed o unconfirmed. Le operazioni sui tag sono additive e idempotenti.

GET/subscribers?list_uid=…Elenco paginato. Filtra con open=yes|no, click=yes|no.
POST/subscribersCrea. Obbligatori: list_uid, EMAIL. Campi personalizzati come parametri maiuscoli.
GET/subscribers/:idRecupera un singolo iscritto per id o email.
GET/subscribers/email/:emailTrova ogni lista che contiene un iscritto con questa email.
PATCH/subscribers/:idAggiorna campi, tag o status.
POST/subscribers/:id/add-tagAggiunge tag separati da virgola.
POST/subscribers/:id/remove-tagRimuove tag separati da virgola.
PATCH/lists/:list_uid/subscribers/:id/subscribeMarca come subscribed.
PATCH/lists/:list_uid/subscribers/:id/unsubscribeMarca come unsubscribed.
PATCH/lists/:list_uid/subscribers/email/:email/unsubscribeDisiscrivi per email quando non hai l'id.
DELETE/subscribers/:idHard delete dalla lista.

Campagne

Le campagne sono l'unità di invio. Creane una con contenuto HTML + flag di tracking, falla transitare per run / pause / resume, poi scarica i log di tracking, aperture, click, bounce, feedback e cancellazioni come CSV.

GET/campaignsElenco paginato. Passa per_page, page.
POST/campaignsCrea. Obbligatori: list_uid, name, subject, from_*, html.
GET/campaigns/:uidRecupera una singola campagna con statistiche.
PATCH/campaigns/:uidAggiorna contenuto, oggetto o flag di tracking.
POST/campaigns/:uid/runMette la campagna in coda per la consegna.
POST/campaigns/:uid/pauseMette in pausa una campagna in corso.
POST/campaigns/:uid/resumeRiprende una campagna in pausa.
GET/campaigns/:uid/tracking-log/downloadStream del CSV di tracking.
GET/campaigns/:uid/{open,click,bounce,feedback,unsubscribe}-log/downloadStream del CSV per evento (una route per ciascun tipo di evento).
DELETE/campaigns/:uidElimina una campagna (solo se non è in corso).

Automazioni

Le automazioni sono flussi visuali di trigger, condizioni e azioni. L'API espone la vista in lettura più due modi per scatenare i flussi da sistemi esterni: execute per eseguire un'intera automazione, oppure api/call per attivare un nodo "API call" a metà flusso.

GET/automationsElenco delle automazioni possedute dall'utente del token.
POST/automations/:uid/executeAttiva un'automazione per un iscritto. Utile per flussi transazionali.
POST/automations/:uid/api/callScatena un nodo trigger "API call" a metà flusso con payload personalizzato.

Sending server

I sending server sono i trasporti configurabili (SMTP, Amazon SES, SendGrid, Mailgun, Postmark, driver custom da plugin). Gestiscili in modo programmatico quando provisioning di nuovi tenant o quando ruoti credenziali.

GET/sending_serversElenco dei sending server configurati.
POST/sending_serversCrea un nuovo sending server. Config specifica del driver sotto settings.
GET/sending_servers/:uidRecupera un singolo sending server.
PATCH/sending_servers/:uidAggiorna le impostazioni o ruota le credenziali.
DELETE/sending_servers/:uidRimuove un sending server (le campagne che vi fanno riferimento devono prima essere reinstradate).

Aggiungere un nuovo trasporto (Postal MTA, API HTTP custom, …) è un REGISTRY hook — rilascialo come plugin invece di patchare il core.

Clienti ADMIN

Gli endpoint dei clienti sono riservati ai token admin. Usali per fare provisioning di account tenant, gestire abbonamenti, cambiare piano o generare URL di login one-shot per supporto/impersonificazione.

GET/customersElenco paginato di tutti i clienti.
POST/customersCrea un nuovo cliente + account utente.
GET/customers/by-email/:emailCerca un cliente per email.
PATCH/customers/:uidAggiorna profilo / contatto / quota del cliente.
PATCH/customers/:uid/{enable,disable}Sospende o riattiva l'accesso senza cancellare dati.
POST/customers/:uid/change-plan/:plan_uidSposta un cliente su un piano diverso (addebiti, prorations, rinnovo abbonamento).
POST/customers/:uid/assign-plan/:plan_uidAssegna un piano saltando il flusso di billing (override admin).
POST/customers/:uid/subscription/updateAggiorna i parametri di un abbonamento attivo.
POST/login-tokenGenera un URL di login one-shot per il cliente di destinazione.

Abbonamenti ADMIN

Gli abbonamenti legano un cliente a un piano + cadenza di fatturazione. Usa questi endpoint quando integri con sistemi di billing esterni o quando fai audit dei ricavi ricorrenti.

GET/subscriptionsElenco di tutti gli abbonamenti attivi.
POST/subscriptionsCrea un record di abbonamento (di solito guidato dal webhook del tuo gateway).
GET/subscriptions/:uidRecupera un singolo abbonamento con la cronologia dei rinnovi.
PATCH/subscriptions/:uidModifica quota, cadenza o data di fine.

File

Carica immagini e altri asset da usare nel contenuto delle campagne. L'endpoint accetta multipart/form-data e restituisce un URL pubblico da referenziare nel body HTML.

POST/file/uploadCarica un file. Restituisce { "url": "..." }.

Plugin e upgrade ADMIN

Installa plugin in modo programmatico da un URL di download, esegui upgrade core in remoto con un flusso a due step (così lo step 2 atterra su un worker PHP fresco), oppure aggiorna la licenza. Utile per operatori di fleet che gestiscono molti tenant AcelleMail.

POST/plugins/installInstalla un plugin da un URL di download.
POST/upgrade/runAvvia un upgrade core remoto (download + estrazione).
POST/upgrade/run-fileApplica un singolo step di migrazione.
POST/upgrade/finalizeFinalizza un upgrade. Deve essere chiamato come richiesta fresca dopo run.
POST/license/refreshAggiorna le informazioni di licenza CodeCanyon (rispecchia Admin → License).

WEBHOOK

Manda eventi in push, invece di pollarli.

AcelleMail espone due superfici di webhook. I webhook lifecycle partono sulle transizioni di cliente + abbonamento + automazione e sono configurati globalmente. I tracking ping per destinatario partono su aperture / click / cancellazioni e sono configurati per campagna. Entrambi fanno retry in caso di fallimento con backoff esponenziale.

Webhook lifecycle

Transizioni di clienti e abbonamenti

Configurati una volta in Admin → Settings → Webhooks. Ogni webhook è un nome + evento + config HTTP in uscita (URL, metodo, header, template del body). Sei eventi sono inclusi nel core:

new_customerparams: customer_id
new_subscriptioncustomer_id, plan_id
change_plancustomer_id, old_plan_id, new_plan_id
cancel_subscriptioncustomer_id, plan_id
terminate_subscriptioncustomer_id, plan_id
automation_webhookautomation_id (parte dai nodi API call)

La retry policy è per webhook: retry_times configurabile (default 2) e retry_after_seconds (default 900). Le consegne fallite vengono loggate, ritentate e mostrate nel log webhook admin.

I plugin possono registrare eventi aggiuntivi tramite il pattern EVENT hook — acelle/ai, ad esempio, scatena ai_task_completed dai suoi listener custom.

Tracking per destinatario

Aperture, click, cancellazioni

Configurati per campagna o per template email sotto Tracking → Webhooks. Tre tipi di eventi partono quando il destinatario interagisce con il messaggio:

openil destinatario ha aperto l'email (tracking pixel)
clickil destinatario ha cliccato un link tracciato
unsubscribeil destinatario ha cliccato il link di unsubscribe

Ogni ping porta l'uid della campagna, l'email dell'iscritto e l'URL cliccato (per gli eventi click). Configura tutti i tracking webhook che ti servono per campagna — utile per il mirroring parallelo verso analytics + CRM + data warehouse.

Gli eventi a livello di sending server (bounce, complaint, delivery) passano per lo stack di listener interni App\SendingServers\Webhooks\* — esposti negli endpoint di log delle campagne, non come webhook in uscita. Scarica i CSV dei log →

Esempio: payload new_subscription

POST /your-webhook-url
Content-Type: application/json
X-AcelleMail-Event: new_subscription
X-AcelleMail-Signature: sha256=…

{
  "event":       "new_subscription",
  "customer_id": 1234,
  "plan_id":     "extended-monthly",
  "fired_at":    "2026-05-06T12:34:56Z"
}

Esempio: payload di tracking click

POST /your-webhook-url
Content-Type: application/json
X-AcelleMail-Event: click

{
  "event":         "click",
  "campaign_uid":  "abc123",
  "subscriber":    "alice@example.com",
  "url":           "https://acme.com/promo",
  "clicked_at":    "2026-05-06T12:34:56Z"
}

RISPOSTE ED ERRORI

JSON prevedibile. Status code standard.

Ogni risposta di successo è JSON. Ogni risposta fallita è JSON, con un message di primo livello e una mappa errors per i fallimenti di validazione. Gli status code seguono la convenzione REST — puoi diramare il tuo client solo sul codice.

Codice Quando lo vedrai
200 OKLettura o aggiornamento riusciti.
201 CreatedCreazione riuscita.
401 UnauthorizedToken assente o non valido.
403 ForbiddenToken valido, ma la risorsa non è tua / non sei admin.
404 Not FoundL'UID non esiste.
422 UnprocessableErrore di validazione. Controlla la mappa errors nel body.
500 ServerBug lato server. Controlla storage/logs/laravel.log.

Errore di validazione (422)

HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json

{
  "message": "The given data was invalid.",
  "errors": {
    "from_email": [
      "The from_email field is required."
    ],
    "subject": [
      "The subject must be at most 998 characters."
    ]
  }
}

Fallimento auth (401)

HTTP/1.1 401 Unauthorized
Content-Type: application/json

{ "message": "Unauthenticated." }

Paginazione

Gli endpoint di elenco accettano per_page (default 10–25 a seconda della risorsa) e page. Le risposte includono la forma standard del paginator Laravel: data[], links, meta.current_page, meta.total.

Rate limit

Il rate limiting dipende da te — impostalo sulla tua installazione Laravel tramite RouteServiceProvider. Le build standard non hanno throttle sull'API, dato che stai colpendo il tuo server. Aggiungi throttle:60,1 se ne vuoi uno.

Versioning

La major version corrente è v1. I nuovi endpoint vengono aggiunti senza vincoli; eventuali breaking change sugli endpoint esistenti uscirebbero come v2 affiancata a v1. Lega il tuo client a /api/v1/ e sei al sicuro.

CLIENT

Qualsiasi client HTTP. Niente SDK proprietario.

Non c'è un SDK AcelleMail da installare. L'API parla JSON su HTTP — usa il client che il tuo stack ha già. Tre dei più comuni in pratica:

curl · one-liner

curl $ACELLE_BASE/api/v1/lists \
  -H "Authorization: Bearer $ACELLE_TOKEN" \
  | jq '.data[].name'

HTTP client di Laravel

$resp = Http::withToken($token)
    ->baseUrl($base.'/api/v1')
    ->post('/subscribers', [
        'list_uid' => $listUid,
        'EMAIL'    => $email,
    ]);

return $resp->json();

fetch su browser / Node

const r = await fetch(
  `${base}/api/v1/campaigns/${uid}/run`,
  {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${token}`,
    },
  }
);
const data = await r.json();

Stai costruendo un SDK open source? Scrivici — lo linkeremo da questa pagina.

RIFERIMENTO CANONICO

Il riferimento API completo ed eseguibile.

Ogni parametro. Ogni forma di ritorno. Ogni esempio curl funzionante. Hostato sull'installazione demo canonica — lo stesso codice che gira sulla tua installazione.

api.acellemail.com

Sostituisci api.acellemail.com con l'hostname della tua installazione quando fai le chiamate.

INIZIA A COSTRUIRE

Esegui AcelleMail. Ottieni un token. Fai una chiamata.

Licenza una tantum. Sorgente completo. Endpoint self-hosted. L'API è inclusa — nessun add-on, nessun piano tariffario.

Plugin SDK →