API

PrestaBlog mette a disposizione un'API REST che consente a strumenti esterni - script, software di terze parti o agenti IA - di creare e gestire articoli e categorie del blog senza passare dal back-office. Questa funzionalità, disponibile a partire da PrestaShop 8, si rivolge sia ai non sviluppatori tramite un agente IA, sia agli sviluppatori che desiderano un'integrazione diretta.

Configurazione dell'API

Per prima cosa, l'API deve essere attivata e configurata nel back-office.

Accedere alla configurazione:
Moduli > PrestaBlog > Configurazione > Strumenti > API

Impostazioni disponibili:

  • Attivare l'API: interruttore principale. L'API non risponde ad alcuna richiesta finché è disattivata.
  • Chiave API: fai clic su “Genera una nuova chiave”. La chiave viene mostrata una sola volta: copiala subito, poi non sarà più accessibile. Viene salvata solo la sua impronta crittografica (SHA-256). Se perdi la chiave, generane una nuova.
  • Attivare automaticamente i nuovi articoli: determina se gli articoli creati tramite API vengono pubblicati immediatamente o salvati come bozze, quando la richiesta non specifica esplicitamente questo parametro.
  • Limite di richieste: numero massimo di richieste al minuto per indirizzo IP (predefinito: 60).
  • Sicurezza immagini: blocca il download di immagini da IP privati o interni. Consigliato per installazioni esposte su Internet.
  • Dietro un proxy: da attivare se il tuo negozio è dietro Cloudflare, un reverse proxy o un CDN, per gestire correttamente l'IP del cliente.
  • Livello di log: Nessuno disattiva i log. Sicurezza registra i tentativi di autenticazione falliti e i blocchi. Debug registra tutte le richieste (da usare temporaneamente per la diagnosi).
  • Origini CORS consentite: solo se un'app web ospitata su un altro dominio deve chiamare l'API dal browser. Lascia vuoto nella maggior parte dei casi.

Permessi API

La sezione Permessi API ti consente di limitare in modo preciso ciò che la chiave API è autorizzata a fare. Ogni operazione può essere attivata o disattivata separatamente, sia per gli articoli che per le categorie.

  • Consentire la creazione di articoli / categorie: consente le richieste POST per creare nuovi contenuti.
  • Consentire la modifica di articoli / categorie: consente le richieste PUT per aggiornare contenuti esistenti.
  • Consentire l'eliminazione di articoli / categorie: consente le richieste DELETE. Disattivalo se vuoi evitare eliminazioni accidentali da un agente IA o da uno script di terze parti.
Buona pratica Concedi solo i permessi strettamente necessari. Se usi l'API solo per pubblicare articoli, disattiva modifica ed eliminazione per ridurre i rischi in caso di compromissione della chiave.
Sicurezza

L'API richiede HTTPS. In HTTP, tutte le richieste vengono rifiutate (tranne da localhost per test in sviluppo locale). Non condividere mai la tua chiave API.

Utilizzo tramite un agente IA (consigliato)

Non sei uno sviluppatore, o non vuoi scrivere codice? Il metodo più semplice è usare un agente IA come Claude tramite il protocollo MCP (Model Context Protocol). L'agente sa esattamente quali chiamate effettuare, gestisce l'autenticazione e comprende le tue istruzioni in linguaggio naturale.

Nota: Claude e Windsurf sono esempi di integrazioni MCP. Esistono molti altri software e ambienti compatibili, ma non è possibile elencarli tutti qui.

1. Attivare l'API e generare la chiave

Nel back-office di PrestaBlog: Strumenti > API. Attiva l'API, fai clic su “Genera una nuova chiave” e copia la chiave mostrata: non sarà più accessibile in seguito.

2. Costruire l'URL di connessione MCP

L'URL di connessione segue questo formato:

https://prestablog-mcp.prestablog.workers.dev/mcp?key=YOUR_KEY&shop=https://your-shop.com

Sostituisci YOUR_KEY con la chiave generata e https://your-shop.com con l'URL del tuo negozio.

Da non confondere con l'“URL dell'API”, che è un URL diverso usato per le chiamate dirette.

Importante

L'URL contiene la tua chiave API. Trattala come una password: non condividerla e non pubblicarla.

3. Configurare con Claude

In Claude, fai clic su Customize in alto a sinistra, poi su Connectors,
in alto nella colonna che appare fai clic sul pulsante +, quindi su Add a custom connector.

Inserisci:

  • Name: quello che vuoi (es: PrestaBlog API)
  • URL: l'URL di connessione MCP costruito al punto 2

Conferma. Claude ora ha accesso al tuo blog e può creare, modificare ed eliminare articoli e categorie direttamente.

Esempi di ciò che puoi chiedere a Claude:

  • “Crea un articolo sulle scarpe estive nella categoria Moda”
  • “Elenca gli ultimi 10 articoli pubblicati”
  • “Modifica il titolo dell'articolo 42”
  • “Crea una nuova categoria Notizie con questa descrizione”
  • “Elimina la categoria 5”

Documentazione integrata

La documentazione completa è integrata nel connettore MCP. Claude la consulta automaticamente, non c'è nient'altro da configurare.

4. Configurare con Windsurf

In Windsurf, apri il pannello Cascade, fai clic su ... nell'angolo in alto a destra del pannello, quindi sull'icona MCPs (l'ultima icona in basso a destra del menu). Si apre una finestra di modifica. Aggiungi la configurazione seguente dopo aver generato correttamente l'URL (vedi il punto 2):

{
  "mcpServers": {
    "prestablog": {
      "serverUrl": "https://prestablog-mcp.prestablog.workers.dev/mcp?key=YOUR_KEY&shop=https://your-shop.com"
    }
  }
}

Salva. Cascade mostra 1 MCP in basso nel pannello, confermando che la connessione è attiva.

Esempi di ciò che puoi chiedere a Cascade:

  • “Crea un articolo sulle scarpe estive nella categoria Moda”
  • “Elenca gli ultimi 10 articoli pubblicati”
  • “Modifica il titolo dell'articolo 42”
  • “Crea una nuova categoria Notizie con questa descrizione”
  • “Elimina la categoria 5”

Documentazione integrata

La documentazione completa è integrata nel connettore MCP. Cascade la consulta automaticamente, non c'è nient'altro da configurare.

Autenticazione (REST)

Ogni richiesta deve includere la chiave API in un header HTTP. Sono accettati due formati:

Authorization: Bearer YOUR_API_KEY

o

X-Api-Key: YOUR_API_KEY

Buona pratica

La chiave non deve mai essere trasmessa come parametro nell'URL, per evitare che compaia nei log del server.

Blocco automatico: dopo 5 tentativi di autenticazione falliti dallo stesso IP, l'IP viene bloccato per 1 ora. Questo intervallo è configurabile nelle impostazioni dell'API.

Articoli

Elencare gli articoli

GET /prestablog-api/articles

Restituisce l'elenco paginato degli articoli. Parametri disponibili: lang (ID lingua), page, per_page (max 100), active (1 = solo pubblicati), category (ID categoria), search (ricerca nel titolo), sort (date, title, id), order (asc, desc).

curl -X GET "https://your-shop.com/prestablog-api/articles?lang=1&page=1&per_page=10" \
  -H "Authorization: Bearer YOUR_KEY"

Dettaglio di un articolo

GET /prestablog-api/articles/{id}

Restituisce tutti i dati di un articolo: campi multilingua, categorie, prodotti associati, articoli correlati, indice.

curl -X GET "https://your-shop.com/prestablog-api/articles/18" \
  -H "Authorization: Bearer YOUR_KEY"

Creare un articolo

POST /prestablog-api/articles

Esempio minimo:

curl -X POST "https://your-shop.com/prestablog-api/articles" \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "languages": {
      "1": {
        "title": "My article",
        "content": "<h2>Introduction</h2><p>Article content.</p>"
      }
    },
    "categories": [1],
    "active": true
  }'

Esempio completo con immagine, contenuto multilingua e metadati:

{
  "languages": {
    "1": {
      "title": "My article",
      "introduction": "Short text displayed in listings",
      "content": "<h2>Section</h2><p>Full HTML content.</p>",
      "meta_title": "My article - SEO Title",
      "meta_description": "Search engine description",
      "meta_keywords": "word1, word2",
      "link_rewrite": "my-article"
    },
    "2": {
      "title": "My article",
      "introduction": "Short text displayed in listings",
      "content": "<h2>Section</h2><p>Full HTML content.</p>"
    }
  },
  "categories": [2, 5],
  "active": true,
  "date": "2026-06-15 09:00:00",
  "enable_toc": true,
  "author_id": 1,
  "image": {
    "url": "https://example.com/image.jpg"
  }
}

Campi disponibili:

CampoTipoDescrizione
languagesoggettoContenuto per lingua, indicizzato dall'ID lingua PrestaShop. Obbligatorio alla creazione
languages.{id}.titletestoTitolo dell'articolo. Obbligatorio per ogni lingua
languages.{id}.introductionHTMLTesto breve mostrato nelle liste e in testa all'articolo
languages.{id}.contentHTMLCorpo dell'articolo
languages.{id}.meta_titletestoTag title SEO (max 500 caratteri)
languages.{id}.meta_descriptiontestoMeta description (max 500 caratteri)
languages.{id}.meta_keywordstestoParole chiave SEO
languages.{id}.link_rewritetestoSlug URL. Generato automaticamente dal titolo se assente
categoriesarray di IDCategorie PrestaBlog da associare
productsarray di IDProdotti PrestaShop associati
related_articlesarray di IDArticoli correlati
activebooleanoPubblicazione immediata. Se assente, usa l'impostazione “Attivare automaticamente”
datedatetimeData di pubblicazione nel formato YYYY-MM-DD HH:MM:SS. Una data futura pianifica la pubblicazione
enable_tocbooleanoAbilita l'indice generato dai tag h2/h3 nel contenuto
author_idinteroID autore PrestaBlog
image.urlURLImmagine principale da scaricare da un URL remoto
id_shopinteroID negozio (solo multinegozio). Predefinito: negozio corrente

Modificare un articolo

PUT /prestablog-api/articles/{id}

Aggiornamento parziale: vengono modificati solo i campi presenti nella richiesta. I campi non inviati mantengono il valore attuale. Per le lingue, vengono aggiornate solo quelle incluse nel payload.

curl -X PUT "https://your-shop.com/prestablog-api/articles/18" \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "active": false,
    "languages": {
      "1": {
        "title": "New title"
      }
    }
  }'

Eliminare un articolo

DELETE /prestablog-api/articles/{id}

Elimina l'articolo e tutti i dati associati: immagini (tutte le varianti), categorie, prodotti collegati, articoli correlati.

curl -X DELETE "https://your-shop.com/prestablog-api/articles/18" \
  -H "Authorization: Bearer YOUR_KEY"

Immagine di un articolo

POST /prestablog-api/articles/{id}/image

Sono disponibili tre metodi in base al tuo contesto:

URL remoto (immagine ospitata online):

curl -X POST "https://your-shop.com/prestablog-api/articles/18/image" \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/image.jpg"}'

File locale (upload multipart):

curl -X POST "https://your-shop.com/prestablog-api/articles/18/image" \
  -H "Authorization: Bearer YOUR_KEY" \
  -F "file=@/path/to/image.jpg"

Base64 (fallback):

Nota: il base64 è molto voluminoso e può diventare difficile da gestire per immagini complesse. Quando possibile, preferisci l'upload tramite URL remoto.

curl -X POST "https://your-shop.com/prestablog-api/articles/18/image" \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"base64": "/9j/4AAQSkZJRg...", "filename": "photo.jpg"}'

Via MCP (Claude)

Tramite MCP sono disponibili solo i metodi URL e base64. Per inviare un file locale con Claude, codificalo prima in base64.

Categorie

L'API consente di creare, consultare, modificare ed eliminare categorie, esattamente come per gli articoli.

Elencare le categorie

GET /prestablog-api/categories

Restituisce le categorie in forma di albero per impostazione predefinita. Usa flat=1 per una lista piatta, active=1 per ottenere solo le attive, lang per la lingua.

curl -X GET "https://your-shop.com/prestablog-api/categories?lang=1" \
  -H "Authorization: Bearer YOUR_KEY"

Dettaglio di una categoria

GET /prestablog-api/categories/{id}

Restituisce tutti i dati di una categoria: campi multilingua, numero di articoli, gruppi cliente associati.

Creare una categoria

POST /prestablog-api/categories

Esempio minimo:

curl -X POST "https://your-shop.com/prestablog-api/categories" \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "languages": {
      "1": {
        "title": "News"
      }
    },
    "active": true
  }'

Esempio completo:

{
  "languages": {
    "1": {
      "title": "News",
      "description": "<p>All news from our shop.</p>",
      "meta_title": "News - SEO Title",
      "meta_description": "SEO description of the category",
      "meta_keywords": "news",
      "link_rewrite": "news"
    },
    "2": {
      "title": "News",
      "description": "<p>All the latest news from our shop.</p>",
      "link_rewrite": "news"
    }
  },
  "parent": 0,
  "position": 1,
  "active": true,
  "image": {
    "url": "https://example.com/category.jpg"
  }
}

Campi disponibili:

CampoTipoDescrizione
languagesoggettoContenuto per lingua. Obbligatorio alla creazione
languages.{id}.titletestoTitolo della categoria. Obbligatorio per ogni lingua
languages.{id}.descriptionHTMLDescrizione della categoria
languages.{id}.meta_titletestoTag title SEO (max 500 caratteri)
languages.{id}.meta_descriptiontestoMeta description (max 500 caratteri)
languages.{id}.meta_keywordstestoParole chiave SEO
languages.{id}.link_rewritetestoSlug URL. Generato automaticamente dal titolo se assente
parentinteroID della categoria padre. 0 = radice
positioninteroOrdine di visualizzazione
activebooleanoCategoria visibile sul front-office
image.urlURLImmagine della categoria da scaricare da un URL remoto

Modificare una categoria

PUT /prestablog-api/categories/{id}

Aggiornamento parziale: vengono modificati solo i campi presenti nella richiesta.

curl -X PUT "https://your-shop.com/prestablog-api/categories/1" \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "languages": {
      "1": {
        "title": "New category name",
        "description": "<p>New description.</p>"
      }
    }
  }'

Eliminare una categoria

DELETE /prestablog-api/categories/{id}

Elimina la categoria e tutti i dati associati: immagine, collegamenti con articoli, gruppi cliente.

Attenzione

Gli articoli associati a questa categoria non vengono eliminati, ma perdono il collegamento alla categoria.

curl -X DELETE "https://your-shop.com/prestablog-api/categories/1" \
  -H "Authorization: Bearer YOUR_KEY"

Immagine di una categoria

POST /prestablog-api/categories/{id}/image

Stessi tre metodi degli articoli: URL remoto, file locale (multipart) o base64.

Nota: il base64 è molto voluminoso e può diventare difficile da gestire per immagini complesse. Quando possibile, preferisci l'upload tramite URL remoto.

curl -X POST "https://your-shop.com/prestablog-api/categories/1/image" \
  -H "Authorization: Bearer YOUR_KEY" \
  -F "file=@/path/to/category.jpg"

Autori

Gli autori sono in sola lettura tramite l'API. Devono essere creati nel back-office di PrestaBlog.

  • GET /prestablog-api/authors - elencare tutti gli autori
  • GET /prestablog-api/authors/{id} - dettaglio autore con biografie multilingua
curl -X GET "https://your-shop.com/prestablog-api/authors?lang=1" \
  -H "Authorization: Bearer YOUR_KEY"

Codici di errore

Tutte le risposte di errore seguono questo formato:

{
  "success": false,
  "error": {
    "code": "validation_error",
    "message": "Messaggio di errore leggibile",
    "details": { "field": "languages.1.title" }
  }
}
CodiceHTTPSignificato
unauthorized401Chiave API mancante o non valida
api_disabled503API disattivata nella configurazione
https_required426La richiesta deve essere effettuata via HTTPS
rate_limited429Limite di richieste superato o IP bloccato dopo autenticazioni fallite
invalid_json400Body JSON non valido o mancante
validation_error422Valore di campo non valido (dettagli in error.details)
conflict409Conflitto slug: esiste già un articolo o una categoria con questo link
not_found404Risorsa non trovata
method_not_allowed405Metodo HTTP non supportato per questo endpoint
payload_too_large413Body della richiesta troppo grande (limite: 10 MB)
internal_error500Errore interno del server

Limite di richieste: quando viene superato, la risposta 429 include l'header Retry-After che indica quanti secondi attendere prima di riprovare. Ogni risposta include anche gli header X-RateLimit-Limit e X-RateLimit-Remaining.

Integrazione Python

Per gli sviluppatori Python, la libreria requests rende semplice interagire con l'API in poche righe.

pip install requests
import requests

BASE = "https://your-shop.com/prestablog-api"
KEY = "YOUR_KEY"
headers = {"Authorization": f"Bearer {KEY}"}

# Elencare gli articoli
r = requests.get(f"{BASE}/articles", headers=headers, params={"lang": 1, "per_page": 10})
print(r.json())

# Creare un articolo
r = requests.post(f"{BASE}/articles", headers=headers, json={
    "languages": {"1": {"title": "My article", "content": "<p>Content</p>"}},
    "categories": [1],
    "active": True
})
print(r.json())

# Caricare un'immagine da un file locale
with open("image.jpg", "rb") as f:
    r = requests.post(f"{BASE}/articles/18/image", headers=headers, files={"file": f})
print(r.json())