API Tendfolio
Superficie REST versionata per far parlare Tendfolio con gli strumenti che già usi: dashboard di agenzia, CI, script di manutenzione, Zapier o n8n. Legge lo stato della flotta e comanda le operazioni principali senza passare dal pannello.
Il contratto è stabile: una modifica che rompe i client esistenti non viene applicata a v1, va su una versione nuova.
Autenticazione
Ogni richiesta porta la chiave in un header Authorization. Le chiavi si creano da Impostazioni → Chiavi API: serve il permesso org:manage (ruolo OWNER o ADMIN) e un piano che includa l'API pubblica.
Il valore in chiaro è mostrato una sola volta, alla creazione: a riposo conserviamo solo un hash SHA-256, quindi non è recuperabile nemmeno da noi. Per ruotare una chiave se ne crea una nuova, si aggiorna l'integrazione e si revoca la vecchia.
Modello di autorizzazione
Una chiave agisce per conto del membro che l'ha creata. I permessi effettivi sono l'intersezione fra gli scope concessi alla chiave e i permessi che quel membro possiede in quel momento nell'organizzazione. Tre conseguenze pratiche:
- una chiave non può mai fare più di chi l'ha creata;
- declassare o rimuovere quel membro disattiva le sue chiavi all'istante, senza doverle revocare a mano;
- lo scoping per-sito è ereditato: se il creatore vede 3 siti su 50, la chiave ne vede 3.
Una chiave non eredita mai i privilegi di amministratore di piattaforma, anche se il creatore li possiede.
Scope
Ogni chiave porta gli scope scelti alla creazione. Le rotte dichiarano quello che richiedono: senza, la risposta è 403 MISSING_SCOPE.
Restano deliberatamente fuori dall'API pubblica le operazioni che non dovrebbero avvenire senza una persona davanti: eliminazione di un sito, ripristino di un backup (sovrascrive il sito), 1-click login verso wp-admin, gestione del team e fatturazione.
Rate limit
120 richieste al minuto per chiave. Ogni risposta porta lo stato corrente della finestra; superato il limite arriva 429 con Retry-After.
Errori
Formato uniforme, discriminabile sul campo code: è quello da usare nel codice. Il message è in inglese — l'API parla una lingua sola — ed è pensato per gli sviluppatori, quindi può cambiare.
Su un sito fuori portata la risposta è 404, non 403: un 403 confermerebbe l'esistenza di quell'id a chi non dovrebbe conoscerlo.
Endpoint
Tutti i percorsi sono relativi a https://tendfolio.com/api/v1. Dove compare {siteId} va l'id restituito da GET /sites.
Identità della chiave: organizzazione, piano, scope concessi. È l'endpoint da chiamare per primo quando si integra qualcosa — se risponde, chiave e piano sono a posto.
siteCountè il numero di siti visibili a questa chiave, non il totale dell'organizzazione: se chi l'ha creata vede 3 siti su 50, vale 3.
Elenco dei siti accessibili alla chiave, con stato di connessione, versioni e aggiornamenti in sospeso.
Come sopra per un singolo sito, più gli elenchi completi di plugin e temi.
Solo ciò che ha un aggiornamento disponibile: plugin, temi e core.
Accoda aggiornamenti. La risposta è immediata: il lavoro prosegue nel worker e compare nel log attività del sito, attribuito al membro che ha creato la chiave.
backupFirst— backup del database prima di aggiornare (richiede la featurebackupsnel piano).safeUpdate— verifica il sito prima e dopo, con rollback automatico se si rompe. ImplicabackupFirst.- Un elemento di tipo
corerichiede in più lo scopecore:update.
Ultima scansione e problemi ancora aperti — né risolti né ignorati.
Accoda una scansione di sicurezza.
Ultimi 50 backup, solo metadati.
- I token di download non sono mai esposti dall'API pubblica.
sizeBytesè una stringa: un backup può superare i 2^53 byte, oltre i quali un numero JSON perderebbe precisione.
Avvia un backup manuale.
typeè opzionale:DATABASE(default),FILESoFULL.- Valgono la feature
backupsdel piano, la quota di backup manuali del mese e lo spazio disponibile: se manca qualcosa la risposta è 403 con ilcoderelativo.
Genera un articolo con l'AI e lo deposita sul sito come bozza, pubblicato o programmato. Se ometti topicPrompt, l'argomento lo sceglie il sistema a partire dalle categorie e dagli articoli già pubblicati, evitando i doppioni.
- Asincrona: risponde subito con lo stato QUEUED, la generazione dura uno-due minuti. Si segue con GET sullo stesso id.
- Richiede la feature ai_content nel piano e il connettore ≥ 2.20.0 sul sito. I crediti (articolo 1/2/3/5/7 secondo la lunghezza, più 3 per immagine) sono addebitati alla richiesta e rimborsati se la generazione fallisce senza depositare nulla sul sito.
- Con count fino a 5 si generano più articoli in una volta: ognuno prende un argomento diverso, e se c'è topicPrompt il primo lo segue alla lettera mentre gli altri ne ricavano tagli distinti. Ogni articolo ha la sua prenotazione di crediti: se finiscono a metà gruppo, count nella risposta è minore di requested.
Pubblica, riporta in bozza o programma un articolo già generato
- Non costa crediti: il pezzo è già stato scritto e pagato. Si scrive prima su WordPress e solo dopo su Tendfolio, così il pannello non dice mai “pubblicato” mentre il sito mostra una bozza. Programmare richiede il connettore ≥ 2.21.0 e una data futura.
- Un articolo programmato lo pubblica WordPress, non Tendfolio. WP-Cron però scatta alla prima visita dopo l'orario, quindi su un sito senza traffico può non scattare: ogni dieci minuti Tendfolio controlla chi è rimasto indietro di oltre un quarto d'ora e lo pubblica mantenendo la data prevista. Chi nel frattempo è tornato in bozza non viene toccato.
Ultimi 50 articoli generati per il sito, senza il corpo del testo.
Il singolo articolo con il testo completo e l'avanzamento della generazione.
- Gli step vanno in ordine: context → topic → text → images → publish. Lo stato passa da QUEUED a RUNNING a READY, oppure FAILED con il campo error valorizzato.
Stato del monitoraggio e incidente aperto, se c'è.
Note operative
- Server-to-server. Il CORS resta ristretto al dominio del pannello: una chiave non va messa in JavaScript di browser, dove sarebbe leggibile da chiunque apra gli strumenti di sviluppo.
- Solo HTTPS.
- Tracciabilità. Ogni chiave registra ultimo utilizzo e ultimo IP; creazione e revoca finiscono nell'audit log, e le azioni avviate via API compaiono nel log attività attribuite al membro creatore.
Pronto a integrare?
Crea una chiave dal pannello e verifica l'integrazione con una chiamata a /me.