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.

Token-authenticated

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.

Resource-oriented

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.

QUICK START

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.

Ottieni AcelleMail — $80 Plugin SDK →