1. Panoramica
L’API REST di Eyivo consente di gestire programmaticamente siti web strutturati. Usa HTTPS e JSON, è versionata sotto /api/v1 e applica gli stessi vincoli di proprietà, limiti del piano, regole di convalida e controlli di audit della dashboard.
JSON e multipart
Accept: application/json. Content-Type: application/json; file: multipart/form-data.
Di proprietà dell’utente
Ogni operazione su un sito è limitata ai siti di proprietà dell’utente autenticato.
Prima la bozza
Salva una bozza, verifica che sia pronta e pubblica l’elemento nella lingua richiesta quando l’utente vuole renderlo visibile. Le altre bozze non vengono pubblicate.
Versionamento: le modifiche incompatibili del contratto richiedono una nuova versione di base. Nei JSON esistenti possono comparire nuovi campi; i client devono ignorare quelli che non riconoscono.
2. Guida rapida
- 1Crea un token.
Accedi all’app, apri Token API, scegli solo gli ambiti necessari e copia il
ey_segreto quando viene mostrato. - 2Elenca i tuoi siti.
Conferma l’autenticazione e ottieni l’ID numerico del sito usato dagli endpoint nidificati.
- 3Invia richieste di scrittura idempotenti.
Assegna a ogni richiesta POST, PATCH e DELETE una
Idempotency-Key.
curl --request GET \
--url https://app.eyivo.com/api/v1/sites \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ey_your_token'
Una risposta riuscita per una raccolta contiene i record in data:
{
"data": [
{
"id": 42,
"platform_subdomain_key": "7kr9mp2x",
"template_key": "corporate-01",
"status": "active",
"native_locale": "en",
"english_enabled": false,
"content_version": 1,
"search_visibility": "platform_noindex"
}
]
}
3. Autenticazione
Ogni richiesta a /api/v1 richiede un bearer token:
Authorization: Bearer <token>
Token API personali
Ideali per script, integrazioni server e automazioni dirette dell’account. I token iniziano con ey_, sono memorizzati come hash e vengono mostrati una sola volta.
- Creali e revocali in https://app.eyivo.com/tokens.
- Scegli uno o più ambiti di accesso.
- Se vuoi, limita il token a un sito di tua proprietà.
- I token non scaduti restano validi finché non vengono revocati.
OAuth 2.0 + PKCE
Ideale per le applicazioni che agiscono per conto degli utenti Eyivo. Usa Authorization Code con PKCE; non usare i flussi password o implicit.
- Autorizzazione:
https://app.eyivo.com/oauth/authorize - Token e rinnovo:
https://app.eyivo.com/oauth/token - Gli access token scadono dopo 2 ore.
- I refresh token scadono dopo 1 anno.
Flusso di autorizzazione PKCE
- Crea un
code_verifierad alta entropia e il relativocode_challengeSHA-256. - Reindirizza l’utente a
/oauth/authorizeincludendoresponse_type=code, ilclient_idpubblico, ilredirect_uriregistrato esatto, gli ambiti richiesti inscopeseparati da spazi,state,code_challengeecode_challenge_method=S256. - Verifica
statedopo il reindirizzamento, quindi scambia il codice di autorizzazione ricevuto su/oauth/tokenusando ilcode_verifieroriginale. - Conserva access token e refresh token in modo sicuro. Rinnovali prima della scadenza e sostituisci atomicamente le credenziali ruotate.
4. Ambiti di accesso
Le richieste richiedono l’ambito di accesso esatto indicato di seguito. Un token personale che contiene * supera tutti i controlli sugli ambiti; le applicazioni dovrebbero comunque richiedere solo quelli necessari.
| Ambito | Funzione REST |
|---|---|
sites:read | Elenca i siti di proprietà dell’utente e ne recupera uno. |
sites:write | Creare siti con un token valido per tutto l’account. |
content:read | Leggere contenuti, schemi, menu, moduli e impostazioni. |
content:write | Creare, modificare, eliminare e pubblicare esplicitamente; eseguire azioni dichiarate dei pannelli. |
media:read | GET /sites/{site}/media, GET /sites/{site}/media/stock-photos |
media:write | POST /sites/{site}/media, DELETE /sites/{site}/media/{media} |
domains:read | Elenca i domini del sito. |
domains:write | Richiede, attiva e seleziona domini personalizzati. |
REST richiede l’autorizzazione dell’endpoint, non mcp:use. I media usano media:read o media:write.
5. Operazioni di scrittura idempotenti
Invia Idempotency-Key nelle modifiche JSON per ripetere la stessa richiesta in sicurezza. I caricamenti multipart e l’emissione dei ticket sono esclusi; verifica il risultato prima di riprovare.
Idempotency-Key: site-42-page-create-01J7M6Y8RRF3ZE6WB4Z0Y9XJXC
| Situazione | Risultato |
|---|---|
| Prima richiesta | L’operazione viene eseguita e il relativo codice di stato e corpo JSON vengono memorizzati. |
| Stessa chiave, metodo, percorso, parametri di query e corpo | La risposta memorizzata viene restituita senza ripetere l’operazione. |
| Stessa chiave con una richiesta diversa | 422 — il riutilizzo della chiave con un payload diverso viene rifiutato. |
| Stessa chiave mentre la prima richiesta è in corso | 409 — la richiesta è già in corso. |
| Nessuna chiave | La richiesta viene comunque eseguita, ma non è possibile ripeterla in modo sicuro. |
Per corrispondere, le richieste devono avere lo stesso metodo HTTP, percorso e corpo grezzo. Quando riprovi, riutilizza il JSON serializzato originale.
6. Risposte e struttura delle risorse
Le operazioni restituiscono un contenitore data. MCP fornisce structuredContent e una copia JSON testuale; REST restituisce JSON. Consulta gli schemi per ID, stato di pubblicazione e paginazione. Segui le informazioni di pagina di blog, media e invii.
Singola risorsa
{ "data": { "id": 42, "status": "active" } }Raccolta
{ "data": [{ "id": 42 }, { "id": 43 }] }I formati delle raccolte variano. Segui la paginazione documentata da ogni endpoint; non tutti i risultati sono liste semplici o senza paginazione.
7. Siti
/sitesElenca i siti di proprietà · sites:read
/sitesCrea un sito · sites:write
/sites/{site}Recupera un sito di proprietà · sites:read
Crea un sito
curl --request POST \
--url https://app.eyivo.com/api/v1/sites \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ey_your_token' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: site-create-01J7M6Y8' \
--data '{
"display_name": "Northstar Studio",
"template_key": "corporate-01",
"native_locale": "en"
}'
| Campo | Regole |
|---|---|
display_name | Stringa obbligatoria, massimo 200 caratteri. |
template_key | Chiave di un template integrato obbligatoria. L’elenco completo dei valori disponibili è in OpenAPI. |
native_locale | Codice lingua supportato obbligatorio. |
Risposta: 201 Created con una risorsa sito. Durante la preparazione, lo stato può inizialmente risultare non attivo. I limiti relativi a siti e piano restituiscono 422.
Campi della risorsa sito: id, platform_subdomain_key, template_key, status, native_locale, english_enabled, content_version, search_visibility, runtime facoltativo e timestamp.
8. Pagine
/sites/{site}/pagesElenca le pagine · content:read
/sites/{site}/pagesCrea una bozza · content:write
/sites/{site}/pages/{page}Recupera una pagina · content:read
/sites/{site}/pages/{page}Aggiorna una bozza · content:write
/sites/{site}/pages/{page}Elimina una pagina · content:write
/sites/{site}/pages/{page}/publicationcontent:write · locale
Crea una pagina
{
"type": "page",
"sort_order": 300,
"locale": "en",
"slug": "our-story",
"title": "Our story",
"body": "<p>How the company began.</p>",
"meta_title": "Our story | Northstar Studio",
"meta_description": "Learn about Northstar Studio."
}
| Campo | Regole di creazione e modifica |
|---|---|
type | Usa page per i normali contenuti. I tipi supportati e gli schemi dei componenti sono nelle capacità del sito. |
sort_order | Intero facoltativo, può essere null, da 0 a 9999; alla creazione il valore predefinito è 0. |
locale | Creazione: obbligatorio. Modifica: obbligatorio se cambiano title, slug o body. |
slug | Creazione: obbligatorio. Lettere ASCII, cifre, trattini e trattini bassi; massimo 160 caratteri. |
title | Creazione: stringa obbligatoria; massimo 200 caratteri. |
body | Stringa che può essere null; massimo 50.000 caratteri. |
meta_title | Stringa che può essere null; massimo 200 caratteri. |
meta_description | Stringa che può essere null; massimo 500 caratteri. |
Risposta alla creazione: 201. Risposta alla modifica: 200. Risposta all’eliminazione: 204 senza corpo.
Salva una bozza, verifica che sia pronta e pubblica l’elemento nella lingua richiesta quando l’utente vuole renderlo visibile. Le altre bozze non vengono pubblicate.
9. Elementi del catalogo
/sites/{site}/catalog-itemsElenca gli elementi · content:read
/sites/{site}/catalog-itemsCrea un elemento in bozza · content:write
/sites/{site}/catalog-items/{catalogItem}Recupera un elemento · content:read
/sites/{site}/catalog-items/{catalogItem}Elimina un elemento · content:write
/sites/{site}/catalog-items/{catalogItem}content:write · locale, slug, title
/sites/{site}/catalog-items/{catalogItem}/publicationcontent:write · locale
Crea un elemento del catalogo
{
"sort_order": 100,
"locale": "en",
"slug": "strategy-advisory",
"title": "Strategy advisory",
"summary": "Focused advice for consequential decisions.",
"body": "Talk to our senior advisory team."
}
| Campo | Regole |
|---|---|
sort_order | Intero facoltativo, può essere null, da 0 a 9999; il valore predefinito è 0. |
locale | Codice lingua supportato obbligatorio. |
slug | Slug ASCII obbligatorio; massimo 160 caratteri. |
title | Stringa obbligatoria; massimo 200 caratteri. |
summary | Stringa che può essere null; massimo 1.000 caratteri. |
body | Stringa che può essere null; massimo 50.000 caratteri. |
Salva una bozza, verifica che sia pronta e pubblica l’elemento nella lingua richiesta quando l’utente vuole renderlo visibile. Le altre bozze non vengono pubblicate.
Questi sono esempi per famiglia di contenuti. Scopri tutti gli schemi e le autorizzazioni in tools/list o OpenAPI. I percorsi REST sono relativi a /api/v1/sites/{site}.
Scoperta di siti e capacità
GET /capabilities · GET /readiness
Pagine, componenti e link interni
/pages · /pages/{page_id}/components · POST /pages/{page_id}/publication
Prodotti, gallerie e video
/catalog-items · /galleries · /videos · POST /{collection}/{id}/publication
Bozze blog, categorie e programmazione
/blog/posts · /blog/categories · /blog/links · /blog/posts/{post_id}/publication · /blog/posts/{post_id}/schedule
Navigazione principale e menu aggiuntivi
/menus · /menus/destinations · /menu-assignments/{type}/{target_id} · /menus/{menu_key}/publication
Libreria media e foto stock
/media · /media/transfers · /media/stock-photos
Moduli, invii e pannelli dei plugin
/forms · /submissions · /plugins · /plugins/panel · /plugins/panel/actions
Azienda, tema, lingue e integrazioni
/company · /theme · /theme/settings · /locales · /integrations · /demo · /demo/drafts · /cache/reset
Capacità e contratto di modifica
Seleziona un sito e leggi le sue capacità: lingue attive, campi del tema, schemi dei componenti, menu e pannelli dei plugin. Leggi la risorsa content-workflow prima di modificare. Senza risorse, usa get-site-capabilities-tool. Segui nextCursor di tools/list fino alla fine.
GET /api/v1/sites/{site}/capabilities
GET /api/v1/sites/{site}/pages/{page_id}/components/schema?locale=en
Usa la lingua richiesta e la version o revision corrente. Salvare un articolo sostituisce il documento completo e annulla la programmazione. I menu usano revision numerica; le assegnazioni un hash menu_revision separato. Conserva gli elementi delle liste sostituite. In caso di conflitto, rileggi e unisci le modifiche.
La navigazione principale resta automatica. I menu aggiuntivi hanno bozze e pubblicazioni proprie. Salvare un contenuto prepara le assegnazioni; pubblicare l’elemento le applica senza pubblicare altri menu. Pubblicare un menu non pubblica mai i contenuti collegati. source_hash rifiuta traduzioni basate su testo sorgente obsoleto.
Il corpo delle pagine e i campi richtext accettano HTML sanificato. list-page-links-tool fornisce link stabili /__eyivo/pages/{id}, risolti nella lingua del visitatore dopo la pubblicazione. I blog usano document JSON strutturato con media_id dello stesso sito e destinazioni pagina/articolo, non body_html.
{
"type": "doc",
"content": [{
"type": "paragraph",
"content": [{ "type": "text", "text": "Our story" }]
}]
}
Caricare immagini e video
upload-media-tool apre un selettore di file nei client MCP Apps come Claude. ChatGPT può fornire anche il proprio riferimento all’allegato; un allegato Claude non è un riferimento OpenAI. Non inventare URL né inviare file base64 negli argomenti.
Codex e Claude Code possono chiamare prepare-media-upload-tool e inviare il file multipart a upload_url con upload_token monouso entro cinque minuti. Mantieni segreto il token. I client REST possono usare il proprio bearer media:write. Solo il caricamento completato restituisce l’ID del media; emettere un ticket non carica file.
POST /api/v1/sites/{site}/media
Authorization: Bearer <media:write token>
Content-Type: multipart/form-data; boundary=<generated by HTTP client>
file: <original file bytes>
10. Domini personalizzati
/sites/{site}/domainsElenca i domini · domains:read
/sites/{site}/domainsRichiedi un dominio · domains:write
/sites/{site}/domains/{domain}/activateAttiva dopo la verifica · domains:write
/sites/{site}/domains/{domain}/primarySeleziona il nome host principale · domains:write
Richiedi un dominio
curl --request POST \
--url https://app.eyivo.com/api/v1/sites/42/domains \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ey_your_token' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: domain-request-example-com' \
--data '{"domain":"www.example.com"}'
Una risorsa dominio in attesa include verification_token. Aggiungi il record DNS di verifica della proprietà usando il valore restituito per il tuo dominio, attendi la propagazione DNS, quindi chiama l’endpoint di attivazione. Dopo l’attivazione, chiama l’endpoint per il dominio principale se vuoi renderlo il nome host pubblico canonico.
Campi della risorsa dominio: id, domain, site_id, is_primary, status, verification_token quando applicabile e timestamp. I limiti del piano per i domini personalizzati e gli errori di convalida del dominio restituiscono 422.
11. Errori
| Stato | Significato | Azione consigliata |
|---|---|---|
401 | Bearer token mancante, non valido, scaduto o revocato. | Sostituisci o rinnova la credenziale. |
403 | Permesso mancante, restrizione del sito o modifica richiesta da un utente che non ne è il proprietario. | Usa un ambito di accesso o un sito autorizzato; non ripetere la stessa richiesta. |
404 | La risorsa non esiste o non appartiene all’utente. | Verifica gli ID e la proprietà. |
409 | Un conflitto di versione richiede una nuova lettura e unione delle modifiche. Non reinviare gli stessi dati obsoleti. | Leggi la bozza nella lingua scelta e la revisione corrente prima di modificare. |
422 | Errore di convalida, limite del piano, regola del dominio o mancata corrispondenza della chiave di idempotenza. | Leggi errors o message, correggi la richiesta e usa una nuova chiave se ne modifichi il corpo. |
5xx | Errore imprevisto della piattaforma o di un servizio a monte. | Riprova le letture sicure; ripeti le scritture solo con la stessa chiave di idempotenza. |
Risposta di convalida
{
"message": "The title field is required.",
"errors": {
"title": ["The title field is required."]
}
}
Risposta di autenticazione o autorizzazione
{
"message": "Missing required scope [content:write]."
}
12. Limiti attuali e lista di controllo per le integrazioni
REST v1 espone intenzionalmente un insieme limitato di funzionalità di Eyivo. L’assenza di un endpoint è un limite dell’interfaccia pubblica, non un permesso di chiamare le API interne.
Disponibile
- Elenco, consultazione e creazione dei siti
- Pagine, componenti e link interni
- Gestisci pagine, componenti, blog, prodotti, gallerie, video, menu, media, moduli e impostazioni del sito con strumenti ed endpoint REST protetti da autorizzazioni.
- Elenco, richiesta e attivazione dei domini e selezione del dominio principale
Non disponibile in REST v1
- Modifiche a fatturazione e abbonamenti
- Password e gestione dei token
- Accesso diretto all’archiviazione e API interne
- Installazione o esecuzione arbitraria di codice del tema
Prima di andare in produzione
- Usa HTTPS e verifica che l’host sia
app.eyivo.com. - Conserva i bearer token lato server e oscura gli header di autorizzazione nei log.
- Richiedi solo gli ambiti necessari e, quando possibile, preferisci token personali limitati a un sito.
- Usa una chiave di idempotenza univoca per ogni operazione logica di scrittura e mantienila nei tentativi successivi.
- Considera
401,403,404e422errori non temporanei, salvo che cambi la richiesta o la credenziale. - Per gli errori temporanei usa un intervallo di attesa esponenziale con jitter e rispetta un eventuale header
Retry-After. - I formati delle raccolte variano. Segui la paginazione documentata da ogni endpoint; non tutti i risultati sono liste semplici o senza paginazione.