1. Überblick
Die Eyivo REST API ist die programmatische Steuerschnittstelle für strukturierte Websites. Sie verwendet HTTPS und JSON, ist unter /api/v1 versioniert und wendet dieselben Regeln für Eigentümerschaft, Tarifgrenzen, Validierung und Nachvollziehbarkeit an wie das Dashboard.
JSON und Multipart
Accept: application/json. Content-Type: application/json; file: multipart/form-data.
Nur eigene Websites
Jeder Website-Vorgang ist auf Websites des authentifizierten Nutzers beschränkt.
Zuerst als Entwurf
Speichern Sie einen Entwurf, prüfen Sie seine Veröffentlichungsbereitschaft und veröffentlichen Sie das Element in der gewünschten Sprache, wenn der Nutzer es live schalten möchte. Andere Entwürfe bleiben unverändert.
Versionierung: Änderungen, die den Schnittstellenvertrag brechen, erfordern eine neue Basisversion. Bestehende JSON-Objekte können zusätzliche Felder erhalten; Clients sollten unbekannte Felder ignorieren.
2. Schnellstart
- 1Token erstellen.
Melden Sie sich in der App an, öffnen Sie die API-Token, wählen Sie nur die benötigten Berechtigungen und kopieren Sie das
ey_Token, wenn es angezeigt wird. - 2Eigene Websites auflisten.
Prüfen Sie die Authentifizierung und ermitteln Sie die numerische Website-ID für untergeordnete Endpunkte.
- 3Idempotente Schreibvorgänge senden.
Vergeben Sie für jede POST-, PATCH- und DELETE-Anfrage einen eigenen
Idempotency-Key.
curl --request GET \
--url https://app.eyivo.com/api/v1/sites \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ey_your_token'
Eine erfolgreiche Antwort auf eine Listenanfrage enthält die Einträge unter 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. Authentifizierung
Jede Anfrage an /api/v1 benötigt ein Bearer-Token:
Authorization: Bearer <token>
Persönliche API-Token
Geeignet für Skripte, Serverintegrationen und die direkte Automatisierung eines Kontos. Token beginnen mit ey_, werden als Hash gespeichert und nur einmal angezeigt.
- Erstellen und widerrufen Sie sie unter https://app.eyivo.com/tokens.
- Wählen Sie einen oder mehrere Berechtigungsbereiche.
- Beschränken Sie das Token bei Bedarf auf eine eigene Website.
- Token ohne Ablaufdatum bleiben bis zum Widerruf gültig.
OAuth 2.0 + PKCE
Geeignet für Anwendungen, die im Namen von Eyivo-Nutzern handeln. Verwenden Sie den Authorization-Code-Flow mit PKCE, nicht den Password- oder Implicit-Grant.
- Autorisierung:
https://app.eyivo.com/oauth/authorize - Token und Erneuerung:
https://app.eyivo.com/oauth/token - Access-Token laufen nach 2 Stunden ab.
- Refresh-Token laufen nach 1 Jahr ab.
PKCE-Autorisierungsablauf
- Erzeugen Sie einen zufälligen
code_verifiermit hoher Entropie und den zugehörigen SHA-256-code_challenge. - Leiten Sie den Nutzer an
/oauth/authorizeweiter. Übergeben Sieresponse_type=code, die öffentlicheclient_id, die exakt registrierteredirect_uri, die durch Leerzeichen getrenntenscope-Werte,state,code_challengeundcode_challenge_method=S256. - Prüfen Sie nach der Weiterleitung
stateund tauschen Sie den erhaltenen Autorisierungscode bei/oauth/tokenmit dem ursprünglichencode_verifierein. - Speichern Sie Access- und Refresh-Token sicher. Erneuern Sie sie vor Ablauf und ersetzen Sie rotierte Zugangsdaten atomar.
4. Berechtigungsbereiche
Anfragen benötigen den jeweils unten angegebenen Berechtigungsbereich. Ein persönliches Token mit * besteht alle Berechtigungsprüfungen; Anwendungen sollten trotzdem nur die erforderlichen Bereiche anfordern.
| Berechtigungsbereich | REST-Funktion |
|---|---|
sites:read | Eigene Websites auflisten und eine Website abrufen. |
sites:write | Websites mit einem kontoweit gültigen Token erstellen. |
content:read | Inhalte, Schemas, Menüs, Formulare und Einstellungen lesen. |
content:write | Inhalte erstellen, bearbeiten, löschen und ausdrücklich veröffentlichen; deklarierte Panel-Aktionen ausführen. |
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 | Domains einer Website auflisten. |
domains:write | Eigene Domains anfordern, aktivieren und auswählen. |
REST benötigt den Endpunkt-Scope, nicht mcp:use. Medienendpunkte nutzen media:read oder media:write.
5. Idempotente Schreibvorgänge
Senden Sie bei JSON-Änderungen einen Idempotency-Key für sichere Wiederholungen. Multipart-Uploads und Upload-Tickets sind ausgenommen; prüfen Sie vor einer Wiederholung das Übertragungsergebnis.
Idempotency-Key: site-42-page-create-01J7M6Y8RRF3ZE6WB4Z0Y9XJXC
| Situation | Ergebnis |
|---|---|
| Erste Anfrage | Der Vorgang wird ausgeführt; Statuscode und JSON-Body werden gespeichert. |
| Gleicher Schlüssel, gleiche Methode, gleicher Pfad, gleiche Abfrageparameter und gleicher Inhalt | Die gespeicherte Antwort wird zurückgegeben, ohne den Vorgang zu wiederholen. |
| Gleicher Schlüssel mit anderer Anfrage | 422 — ein wiederverwendeter Schlüssel mit anderem Payload wird abgelehnt. |
| Gleicher Schlüssel, während die erste Anfrage noch läuft | 409 — die Anfrage wird bereits verarbeitet. |
| Kein Schlüssel | Die Anfrage wird ausgeführt, kann aber nicht sicher wiederholt werden. |
Zum Vergleich einer Anfrage gehören HTTP-Methode, Pfad und exakt derselbe Rohdaten-Body. Verwenden Sie bei Wiederholungen das ursprünglich serialisierte JSON.
6. Antworten und Datenstrukturen
Inhaltsoperationen liefern einen data-Umschlag. MCP liefert structuredContent plus eine JSON-Textkopie; REST liefert JSON. Die Ausgabeschemas beschreiben IDs, Veröffentlichungsbereitschaft und Paginierung. Folgen Sie den Seiteninformationen für Blogs, Medien und Einsendungen.
Einzelne Ressource
{ "data": { "id": 42, "status": "active" } }Liste
{ "data": [{ "id": 42 }, { "id": 43 }] }Sammlungsformate unterscheiden sich. Folgen Sie den dokumentierten Paginierungsdaten; nicht jedes Ergebnis ist eine flache oder unpaginierte Liste.
7. Websites
/sitesEigene Websites auflisten · sites:read
/sitesWebsite erstellen · sites:write
/sites/{site}Eigene Website abrufen · sites:read
Website erstellen
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"
}'
| Feld | Regeln |
|---|---|
display_name | Erforderliche Zeichenfolge, höchstens 200 Zeichen. |
template_key | Erforderlicher Schlüssel einer integrierten Vorlage. Die vollständige aktuelle Werteliste steht in OpenAPI. |
native_locale | Erforderlicher unterstützter Sprachcode. |
Antwort: 201 Created mit einer Website-Ressource. Während der Bereitstellung kann zunächst ein nicht aktiver Status angezeigt werden. Bei Überschreitung von Website- oder Tarifgrenzen wird 422 zurückgegeben.
Felder der Website-Ressource: id, platform_subdomain_key, template_key, status, native_locale, english_enabled, content_version, search_visibility, optional runtime und Zeitstempel.
8. Seiten
/sites/{site}/pagesSeiten auflisten · content:read
/sites/{site}/pagesEntwurf erstellen · content:write
/sites/{site}/pages/{page}Seite abrufen · content:read
/sites/{site}/pages/{page}Entwurf aktualisieren · content:write
/sites/{site}/pages/{page}Seite löschen · content:write
/sites/{site}/pages/{page}/publicationcontent:write · locale
Seite erstellen
{
"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."
}
| Feld | Regeln für Erstellung und Aktualisierung |
|---|---|
type | Nutzen Sie page für normale Inhalte. Unterstützte Typen und Komponentenschemas stehen in den Website-Fähigkeiten. |
sort_order | Optionale Ganzzahl von 0 bis 9999 oder null; bei Erstellung standardmäßig 0. |
locale | Bei Erstellung erforderlich; bei Aktualisierung nötig, wenn title, slug oder body geändert wird. |
slug | Bei Erstellung erforderlich. ASCII-Buchstaben, Ziffern, Bindestriche und Unterstriche; höchstens 160 Zeichen. |
title | Bei Erstellung erforderliche Zeichenfolge; höchstens 200 Zeichen. |
body | Zeichenfolge oder null; höchstens 50.000 Zeichen. |
meta_title | Zeichenfolge oder null; höchstens 200 Zeichen. |
meta_description | Zeichenfolge oder null; höchstens 500 Zeichen. |
Antwort bei Erstellung: 201. Antwort bei Aktualisierung: 200. Antwort bei Löschung: 204 ohne Body.
Speichern Sie einen Entwurf, prüfen Sie seine Veröffentlichungsbereitschaft und veröffentlichen Sie das Element in der gewünschten Sprache, wenn der Nutzer es live schalten möchte. Andere Entwürfe bleiben unverändert.
9. Katalogeinträge
/sites/{site}/catalog-itemsEinträge auflisten · content:read
/sites/{site}/catalog-itemsEintrag als Entwurf erstellen · content:write
/sites/{site}/catalog-items/{catalogItem}Eintrag abrufen · content:read
/sites/{site}/catalog-items/{catalogItem}Eintrag löschen · content:write
/sites/{site}/catalog-items/{catalogItem}content:write · locale, slug, title
/sites/{site}/catalog-items/{catalogItem}/publicationcontent:write · locale
Katalogeintrag erstellen
{
"sort_order": 100,
"locale": "en",
"slug": "strategy-advisory",
"title": "Strategy advisory",
"summary": "Focused advice for consequential decisions.",
"body": "Talk to our senior advisory team."
}
| Feld | Regeln |
|---|---|
sort_order | Optionale Ganzzahl von 0 bis 9999 oder null; standardmäßig 0. |
locale | Erforderlicher unterstützter Sprachcode. |
slug | Erforderlicher ASCII-Slug; höchstens 160 Zeichen. |
title | Erforderliche Zeichenfolge; höchstens 200 Zeichen. |
summary | Zeichenfolge oder null; höchstens 1.000 Zeichen. |
body | Zeichenfolge oder null; höchstens 50.000 Zeichen. |
Speichern Sie einen Entwurf, prüfen Sie seine Veröffentlichungsbereitschaft und veröffentlichen Sie das Element in der gewünschten Sprache, wenn der Nutzer es live schalten möchte. Andere Entwürfe bleiben unverändert.
Dies sind Beispiele nach Inhaltsbereich. Vollständige Ein-/Ausgabeschemas und Scopes stehen in tools/list oder OpenAPI. Die REST-Pfade sind relativ zu /api/v1/sites/{site}.
Websites und Fähigkeiten entdecken
GET /capabilities · GET /readiness
Seiten, Komponenten und interne Links
/pages · /pages/{page_id}/components · POST /pages/{page_id}/publication
Produkte, Galerien und Videos
/catalog-items · /galleries · /videos · POST /{collection}/{id}/publication
Blog-Entwürfe, Kategorien und Zeitplanung
/blog/posts · /blog/categories · /blog/links · /blog/posts/{post_id}/publication · /blog/posts/{post_id}/schedule
Hauptnavigation und zusätzliche Menüs
/menus · /menus/destinations · /menu-assignments/{type}/{target_id} · /menus/{menu_key}/publication
Medienbibliothek und Stockfotos
/media · /media/transfers · /media/stock-photos
Formulare, Einsendungen und Plugin-Panels
/forms · /submissions · /plugins · /plugins/panel · /plugins/panel/actions
Unternehmen, Theme, Sprachen und Integrationen
/company · /theme · /theme/settings · /locales · /integrations · /demo · /demo/drafts · /cache/reset
Fähigkeiten und Bearbeitungsvertrag
Wählen Sie eine Website und lesen Sie ihre Fähigkeiten: aktivierte Sprachen, Theme-Felder, Komponentenschemas, Menüpositionen und installierte Plugin-Panels. Lesen Sie vor Änderungen die Ressource content-workflow. Ohne Ressourcenunterstützung nutzen Sie get-site-capabilities-tool. Folgen Sie tools/list nextCursor bis zum Ende.
GET /api/v1/sites/{site}/capabilities
GET /api/v1/sites/{site}/pages/{page_id}/components/schema?locale=en
Nutzen Sie die gewünschte Sprache und die aktuelle version oder revision. Blog-Speicherungen ersetzen das ganze Dokument und löschen dessen Zeitplanung. Menüs verwenden eine numerische revision; Inhaltszuweisungen einen separaten menu_revision-Hash. Bewahren Sie Einträge in ersetzten Arrays. Lesen und kombinieren Sie Änderungen bei Konflikten erneut.
Die Hauptnavigation bleibt automatisch. Zusätzliche Menüs haben eigene Entwürfe und Veröffentlichungen. Inhaltsspeicherungen merken Menüzuweisungen vor; die Veröffentlichung dieses Elements übernimmt sie, ohne andere Menüentwürfe zu veröffentlichen. Ein Menü veröffentlicht nie verlinkte Inhalte. source_hash schützt Übersetzungen vor veraltetem Ausgangstext.
Seiteninhalte und richtext-Felder akzeptieren bereinigtes HTML. list-page-links-tool liefert stabile /__eyivo/pages/{id}-Links, die nach Veröffentlichung in der Besuchersprache aufgelöst werden. Blogs verwenden strukturiertes document-JSON mit websiteeigenen media_id und Seiten-/Beitragszielen, kein body_html.
{
"type": "doc",
"content": [{
"type": "paragraph",
"content": [{ "type": "text", "text": "Our story" }]
}]
}
Bilder und Videos hochladen
upload-media-tool öffnet eine Dateiauswahl in MCP-Apps-Clients wie Claude. ChatGPT kann seine eigene Anhangreferenz übergeben; ein Claude-Chat-Anhang ist keine OpenAI-Dateireferenz. Erfinden Sie keine Download-URLs und senden Sie keine Base64-Dateien als Tool-Argumente.
Codex und Claude Code können prepare-media-upload-tool aufrufen und die Datei innerhalb von fünf Minuten als Multipart an upload_url mit dem einmaligen upload_token senden. Halten Sie das Token geheim. REST-Clients können ihren eigenen media:write-Bearer verwenden. Erst der abgeschlossene Upload liefert die Medien-ID; ein Ticket allein lädt keine Datei hoch.
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. Eigene Domains
/sites/{site}/domainsDomains auflisten · domains:read
/sites/{site}/domainsDomain anfordern · domains:write
/sites/{site}/domains/{domain}/activateNach Verifizierung aktivieren · domains:write
/sites/{site}/domains/{domain}/primaryPrimären Hostnamen auswählen · domains:write
Domain anfordern
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"}'
Eine ausstehende Domain-Ressource enthält verification_token. Fügen Sie mit dem für Ihre Domain zurückgegebenen Wert den erforderlichen DNS-Eintrag zum Eigentumsnachweis hinzu. Warten Sie auf die DNS-Weitergabe und rufen Sie dann den Aktivierungsendpunkt auf. Nach der Aktivierung können Sie den Endpunkt für den primären Hostnamen aufrufen, falls die Domain kanonisch werden soll.
Felder der Domain-Ressource: id, domain, site_id, is_primary, status, gegebenenfalls verification_token und Zeitstempel. Bei Tarifgrenzen für eigene Domains oder fehlgeschlagener Domain-Validierung wird 422 zurückgegeben.
11. Fehler
| Status | Bedeutung | Typische Maßnahme |
|---|---|---|
401 | Bearer-Token fehlt, ist ungültig, abgelaufen oder widerrufen. | Zugangsdaten ersetzen oder erneuern. |
403 | Fehlender Berechtigungsumfang, Website-Beschränkung oder Schreibzugriff durch einen Nicht-Eigentümer. | Zulässigen Berechtigungsbereich oder eine zulässige Website verwenden; nicht unverändert erneut versuchen. |
404 | Die Ressource fehlt oder gehört nicht dem Nutzer. | IDs und Eigentümerschaft prüfen. |
409 | Bei Versionskonflikten erneut lesen und Änderungen zusammenführen. Veraltete Daten nicht unverändert erneut senden. | Lesen Sie vor Änderungen den Entwurf der gewählten Sprache und seine aktuelle Revision. |
422 | Validierungsfehler, Tarifgrenze, Domain-Regel oder abweichende idempotente Anfrage. | errors oder message lesen, Anfrage korrigieren und bei geändertem Body einen neuen Schlüssel verwenden. |
5xx | Unerwarteter Fehler der Plattform oder eines vorgelagerten Dienstes. | Leseanfragen können erneut gesendet werden; Schreibvorgänge nur mit demselben Idempotenzschlüssel wiederholen. |
Validierungsantwort
{
"message": "The title field is required.",
"errors": {
"title": ["The title field is required."]
}
}
Antwort bei fehlgeschlagener Authentifizierung oder Autorisierung
{
"message": "Missing required scope [content:write]."
}
12. Aktuelle Grenzen und Integrationscheckliste
REST v1 stellt bewusst nur einen Teil von Eyivo bereit. Ein fehlender Endpunkt bedeutet eine Grenze des Schnittstellenvertrags und erlaubt keinen Aufruf interner APIs.
Verfügbar
- Websites auflisten, einsehen und bereitstellen
- Seiten, Komponenten und interne Links
- Verwalten Sie Seiten, Komponenten, Blogs, Produkte, Galerien, Videos, Menüs, Medien, Formulare und Website-Einstellungen über berechtigungsgeschützte Tools und REST-Endpunkte.
- Domains auflisten, anfordern, aktivieren und als primär auswählen
Nicht über REST v1 verfügbar
- Abrechnung und Abonnementänderungen
- Kontopasswörter und Tokenverwaltung
- Direkter Speicherzugriff und interne APIs
- Beliebigen Theme-Code installieren oder ausführen
Vor dem produktiven Einsatz
- HTTPS verwenden und den erwarteten Host
app.eyivo.comprüfen. - Bearer-Token serverseitig aufbewahren und Autorisierungsheader aus Protokollen entfernen.
- Nur erforderliche Berechtigungen anfordern und möglichst auf eine Website beschränkte persönliche Token verwenden.
- Für jeden logischen Schreibvorgang einen eigenen Idempotenzschlüssel verwenden und ihn bei Wiederholungen beibehalten.
401,403,404und422als dauerhafte Fehler behandeln, sofern sich Anfrage oder Zugangsdaten nicht ändern.- Bei vorübergehenden Fehlern exponentielles Backoff mit zufälliger Streuung verwenden und künftig vorhandene
Retry-After-Header beachten. - Sammlungsformate unterscheiden sich. Folgen Sie den dokumentierten Paginierungsdaten; nicht jedes Ergebnis ist eine flache oder unpaginierte Liste.