Page Lemon

REST-API-Referenz

Die Page Lemon REST API findest du unter https://api.pagelemon.com/v1. Code-Agents mit Shell nutzen sie, um einen Ordner mit einem Befehl zu veröffentlichen; KI-Agents sollten mit der Veröffentlichungsanleitung für KIs (Markdown) beginnen.

Zuletzt aktualisiert · Als Markdown ansehen

Auf dieser Seite

Schnellstart

Veröffentliche einen Ordner ohne Konto (er bleibt 72 Stunden online, wenn du ihn nicht behältst):

bash
tar -czf - -C dist . | curl -sS --data-binary @- https://api.pagelemon.com/v1/deploy

Mit einem API-Token landet die Website direkt in deinem Konto:

bash
tar -czf - -C dist . | curl -sS -H "Authorization: Bearer $PAGELEMON_TOKEN" --data-binary @- https://api.pagelemon.com/v1/deploy

Hosts

HostLiefert aus
https://pagelemon.comDiese Website, /agents, /llms.txt, /docs/*
https://api.pagelemon.comREST API unter /v1
https://mcp.pagelemon.comRemote-MCP-Server (Streamable HTTP) unter / (Alias /mcp)
https://app.pagelemon.comDein Konto: Websites, Personen, Tokens, Abrechnung
https://<name>.pagelemon.devDeine Websites

Authentifizierung

Sende Zugangsdaten als Authorization: Bearer <token>.

ZugangsdatenSieht aus wieWoher es kommtWas es kann
Website-Tokenst_…Einmalig von einer anonymen Veröffentlichung zurückgegebenDiese eine Website aktualisieren, zurücklesen, zurücksetzen und ansehen, bis sie übernommen wird. Danach meldet es nur noch die Übernahme (GET /v1/sites/:name)
Übernahmelinkhttps://app.pagelemon.com/claim/ct_…Einmalig von einer anonymen Veröffentlichung zurückgegebenEine angemeldete Person übernimmt die Website
API-Tokenpl_…app.pagelemon.com/account/tokens (Kontoeinstellungen → API-Tokens; siehe API-Tokens)Alles, was du in deinem Konto tun kannst, über REST und MCP
OAuth-Zugriffstokenpla_…Wird an eine MCP-App (Claude.ai, ChatGPT, Claude Code…) ausgegeben, nachdem du dich angemeldet und sie freigegeben hastWie ein API-Token, aber nur für MCP (REST antwortet mit 401). Gilt 1 Stunde und erneuert sich selbst

Wir speichern nur Hashes von Tokens, ein verlorenes Token kann also nicht erneut angezeigt werden. Erstelle stattdessen ein neues.

Fehler

json
{ "error": { "code": "conflict", "message": "…" }, "agent_message": "…" }

agent_message ist vorhanden, wenn die KI dem Nutzer etwas mitteilen soll. Gib es in der Sprache des Nutzers weiter, mit allen Links, Codes, Zahlen, Daten und Domains exakt so, wie sie sind. Zeiten sind in UTC, und *_at-Felder enthalten sie im ISO-Format.

CodeStatusBedeutung
bad_request400Fehlerhaftes Archiv, fehlerhafter Body oder Parameter
unauthorized401Token fehlt oder ist ungültig
forbidden403Das Token oder die Rolle darf das nicht
not_found404Website oder Datei existiert nicht
conflict409Veraltetes X-Base-Revision / base_revision
gone410Die Website ist abgelaufen
too_large413Größenlimit überschritten
blocked_secret422Der Leak-Schutz hat einen geheimen Schlüssel gefunden
limit429Tarif- oder Ratenlimit

Veröffentlichen

POST /v1/deploy: ein Archiv

Der Request-Body ist das Archiv: .tar.gz, .tgz, .tar oder .zip. Der Server erkennt das Format an den Bytes, Content-Type ist also optional.

bash
tar -czf - -C <dir> . | curl -sS --data-binary @- https://api.pagelemon.com/v1/deploy
AnfrageErgebnis
Kein ?site, kein TokenAnonym erstellen. Ein zufälliger Name wie brave-otter-4821, läuft nach 72 Stunden ab, sofern nicht übernommen
Kein ?site, API-TokenIn deinem Konto erstellen. Kein Ablauf
?site=<name> + X-Base-Revision: <revision id> + Website-Token oder API-TokenAktualisieren. Ist die Live-Revision nicht X-Base-Revision, bekommst du 409 conflict und nichts wird veröffentlicht

Jede Veröffentlichung ersetzt die ganze Website: Dateien, die du weglässt, werden von der Live-Website entfernt. Liegen alle Dateien in einem einzigen obersten Ordner (dist/index.html, …), wird dieser Ordner entfernt.

Antwort 201:

json
{
  "site": { "name": "brave-otter-4821", "url": "https://brave-otter-4821.pagelemon.dev", "claimed": false, "expires_at": "2026-10-14T14:40:00Z" },
  "revision": { "id": "rev_…", "number": 1, "files": 12, "bytes": 48213 },
  "site_token": "st_…",
  "claim_url": "https://app.pagelemon.com/claim/ct_…",
  "skipped": [".env", "node_modules/…"],
  "agent_message": "Your site is live at …"
}

site_token und claim_url erscheinen nur beim anonymen Erstellen.

POST /v1/deploy mit JSON: Inline-Dateien

Für MCP-Clients und kleine Websites: Sende Content-Type: application/json an denselben Endpunkt.

json
{ "site": "brave-otter-4821", "base_revision": "rev_…", "files": [ { "path": "index.html", "content": "<h1>Hi</h1>", "encoding": "utf8" } ] }

encoding ist utf8 oder base64. Lass site und base_revision weg, um eine neue Website zu erstellen. Die Antwort ist dieselbe wie oben.

Patch: Füge "patch": true hinzu, um nur die geänderten files plus "deleted": ["old.html"] auf Basis von base_revision zu senden; alles andere bleibt erhalten. Gleiche Limits und Prüfungen; ein veraltetes base_revision ergibt 409 conflict.

Upload-Regeln

DateienPro DateiPro WebsiteAblauf
Kein Konto1001 MB1 MB72 Stunden, sofern nicht übernommen
Kostenlos5005 MB5 MBkeiner
Prompter1,00050 MB5 GB (ihr gesamter Speicher)keiner
Builder2,00050 MB25 GB (ihr gesamter Speicher)keiner
Team3,00050 MB50 GB (ihr gesamter Speicher)keiner
Company5,00050 MB150 GB (ihr gesamter Speicher)keiner

Pro Website meint die ganze Live-Website nach einem Deploy; ein Patch zählt die gesamte resultierende Website. In bezahlten Tarifen kann eine Website den gesamten Speicher des Tarifs nutzen, aber eine Anfrage trägt höchstens 90 MB (40 MB über MCP): Sende eine größere Website als ersten Deploy und den Rest als Patch-Deploys. Über dem Limit: 413 too_large mit einem agent_message zur Anzeige.

  • Abgelehnt: Symlinks, Hardlinks, Geräte, absolute Pfade, .. und doppelte Pfade, die sich nur in der Groß-/Kleinschreibung unterscheiden.
  • Übersprungen und in skipped aufgeführt: .git/, node_modules/, .env*, *.map, *.pem, *.key; Dotfiles außer .well-known/; .DS_Store, Thumbs.db.
  • Leak-Schutz: Textdateien werden auf bekannte Arten geheimer und privater Schlüssel geprüft. Ein Treffer liefert 422 blocked_secret mit {file, line, kind}. Der Schlüssel selbst wird nie zurückgegeben.
  • Erforderlich: index.html im Stammverzeichnis.
  • Nur anonym: Ausführbare Dateien und Installer werden blockiert, und jedes Netzwerk bekommt nur eine kleine Zahl anonymer Websites und Veröffentlichungen. Für mehr übernimm die Website oder melde dich an.

Websites

MethodePfadAuthentifizierungHinweise
GET/v1/sitesAPI-TokenWebsites, bei denen du Mitglied bist
GET/v1/sites/:nameWebsite-Token, Mitglied{name, url, claimed, expires_at, plan, role, live_revision: {id, number, created_at, created_by}, badge}. Mit dem Website-Token fragst du es ab, nachdem der Nutzer den Übernahmelink geöffnet hat: {claimed: false, …} oder {claimed: true, account_token?}; der einzige Aufruf, den ein Website-Token nach der Übernahme seiner Website noch machen kann
GET/v1/sites/:name/filesWebsite-Token, Mitglied{revision, files: [{path, size, sha256}]} für die Live-Version
GET/v1/sites/:name/files/<path>Website-Token, MitgliedRoher Dateiinhalt (das Zurücklesen), mit einem X-Revision-Header
GET/v1/sites/:name/revisionsWebsite-Token, MitgliedNeueste zuerst. Anonym: nur die aktuelle. Kostenlos: 7 Tage. Prompter: 90 Tage. Builder und Team: 1 Jahr. Company: 2 Jahre
POST/v1/sites/:name/rollbackWebsite-Token, Bearbeiter oder Inhaber{revision} macht diese Version wieder live, als neue Versionsnummer
POST/v1/sites/:name/renameBearbeiter oder Inhaber (nur Konto){name}: 4–63 Zeichen aus a-z, 0-9 und -. Darf nicht wie ein Zufallsname aussehen (word-word-1234), reserviert sein oder schon einmal benutzt worden sein
DELETE/v1/sites/:nameInhaberEndgültig. Mit einem API-Token liefert es 202 mit einem approve_url: eine Seite, auf der die Person die Adresse der Website eintippt und auf „Endgültig löschen“ klickt. GET /v1/approvals/<token> sagt danach, ob gelöscht wurde
GET/v1/sites/:name/membersMitglied{members: [{email, role}], invites: [{email, role}]}
POST/v1/sites/:name/membersInhaber{email, role: "editor" or "viewer"} sendet eine Einladungs-E-Mail
DELETE/v1/sites/:name/members/:emailInhaberZweistufig: Der erste Aufruf liefert {confirm_token}; wiederhole ihn innerhalb von 5 Minuten mit ?confirm=<token>

Rollen: Betrachter können die Website und ihren Verlauf lesen. Bearbeiter können zusätzlich veröffentlichen und zurücksetzen. Inhaber können zusätzlich einladen, umbenennen und löschen.

Konto

MethodePfadAuthentifizierungHinweise
GET/v1/meAPI-Token{email, plan, sites_used, sites_limit}

Websites übernehmen, Einladungen annehmen, Tokens und Abrechnung laufen über app.pagelemon.com.

Auslieferung auf pagelemon.dev

  • / liefert index.html aus. /about liefert about.html oder about/index.html aus.
  • Fehlende Dateien bekommen die 404.html der Website, falls vorhanden, sonst unsere.
  • Fallback für Single-Page-Apps: Hat die Website keine 404.html und der Pfad keine Dateiendung, wird index.html ausgeliefert.
  • Header: X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, Cache-Control: public, max-age=60 für HTML und max-age=300 für andere Dateien. Inhaltstypen stammen aus einer Allowlist; unbekannte Typen werden als application/octet-stream ausgeliefert.
  • Anonyme und kostenlose Websites bekommen vor </body> ein kleines "Live auf Page Lemon"-Badge. Es besteht aus einfachem HTML und CSS, ohne Skript, und enthält einen Link zum Melden der Website.
  • Abgelaufene oder gelöschte Websites liefern 410. Wegen Missbrauchs entfernte Websites liefern 451.

.pagelemon.json

Nach dem Veröffentlichen schreiben Agenten diese Datei in den Projektordner und fügen sie zu .gitignore hinzu, damit die nächste Sitzung dieselbe Website aktualisieren kann:

json
{ "site": "brave-otter-4821", "url": "https://brave-otter-4821.pagelemon.dev", "revision": "rev_…", "site_token": "st_…" }

Etwas unklar oder veraltet? Sag uns Bescheid, dann korrigieren wir die Seite.