Referencia de la API REST
La API REST de Page Lemon está en https://api.pagelemon.com/v1. Los agentes de código con terminal la usan para publicar una carpeta con un solo comando; los agentes de IA deben empezar por la guía de publicación para IA (Markdown).
Última actualización: · Ver en Markdown
En esta página
Inicio rápido
Publica una carpeta sin cuenta (queda en línea 72 horas si no la conservas):
tar -czf - -C dist . | curl -sS --data-binary @- https://api.pagelemon.com/v1/deployCon un token de API, el sitio va directo a tu cuenta:
tar -czf - -C dist . | curl -sS -H "Authorization: Bearer $PAGELEMON_TOKEN" --data-binary @- https://api.pagelemon.com/v1/deployHosts
| Host | Sirve |
|---|---|
https://pagelemon.com | Este sitio, /agents, /llms.txt, /docs/* |
https://api.pagelemon.com | API REST bajo /v1 |
https://mcp.pagelemon.com | Servidor MCP remoto (HTTP transmitible) en / (alias /mcp) |
https://app.pagelemon.com | Tu cuenta: sitios, personas, tokens, facturación |
https://<name>.pagelemon.dev | Tus sitios |
Autenticación
Envía las credenciales como Authorization: Bearer <token>.
| Credencial | Aspecto | De dónde sale | Qué puede hacer |
|---|---|---|---|
| Token del sitio | st_… | Se devuelve una sola vez en un despliegue anónimo | Actualizar, leer, revertir y ver ese único sitio, hasta que se reclame. Después de la reclamación solo informa de ella (GET /v1/sites/:name) |
| Enlace de reclamación | https://app.pagelemon.com/claim/ct_… | Se devuelve una sola vez en un despliegue anónimo | Una persona con sesión iniciada reclama el sitio |
| Token de API | pl_… | app.pagelemon.com/account/tokens (Ajustes de la cuenta → Tokens de API; consulta Tokens de API) | Todo lo que puedes hacer en tu cuenta, por REST y MCP |
| Token de acceso OAuth | pla_… | Se emite para una app MCP (Claude.ai, ChatGPT, Claude Code…) después de que inicies sesión y la apruebes | Igual que un token de API, pero solo MCP (REST responde 401). Dura 1 hora y se renueva solo |
Solo almacenamos hashes de los tokens, así que un token perdido no se puede volver a mostrar. Crea uno nuevo.
Errores
{ "error": { "code": "conflict", "message": "…" }, "agent_message": "…" }agent_message aparece cuando la IA debe decirle algo a la persona usuaria. Transmítelo en el idioma de la persona, con cada enlace, código, número, fecha y dominio exactos; las horas están en UTC, y los campos *_at las traen en formato ISO.
| Código | Estado | Significado |
|---|---|---|
bad_request | 400 | Archivo comprimido, cuerpo o parámetro incorrecto |
unauthorized | 401 | Token ausente o no válido |
forbidden | 403 | El token o el rol no puede hacer esto |
not_found | 404 | No existe ese sitio o archivo |
conflict | 409 | X-Base-Revision / base_revision desactualizado |
gone | 410 | El sitio caducó |
too_large | 413 | Supera un límite de tamaño |
blocked_secret | 422 | La protección contra filtraciones encontró una clave secreta |
limit | 429 | Límite del plan o de frecuencia |
Despliegue
POST /v1/deploy: un archivo comprimido
El cuerpo de la solicitud es el archivo comprimido: .tar.gz, .tgz, .tar o .zip. El servidor detecta el formato a partir de los bytes, así que Content-Type es opcional.
tar -czf - -C <dir> . | curl -sS --data-binary @- https://api.pagelemon.com/v1/deploy| Solicitud | Resultado |
|---|---|
Sin ?site, sin token | Creación anónima. Un nombre aleatorio como brave-otter-4821; caduca a las 72 horas si no se reclama |
Sin ?site, token de API | Se crea en tu cuenta. Sin caducidad |
?site=<name> + X-Base-Revision: <revision id> + token del sitio o token de API | Actualización. Si la revisión en línea no es X-Base-Revision, recibes 409 conflict y no se publica nada |
Cada despliegue reemplaza el sitio entero: los archivos que no incluyas se eliminan del sitio en línea. Si todos los archivos están dentro de una única carpeta de nivel superior (dist/index.html, …), esa carpeta se elimina de las rutas.
Respuesta 201:
{
"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 y claim_url solo aparecen en una creación anónima.
POST /v1/deploy con JSON: archivos en línea
Para clientes MCP y sitios pequeños: envía Content-Type: application/json al mismo endpoint.
{ "site": "brave-otter-4821", "base_revision": "rev_…", "files": [ { "path": "index.html", "content": "<h1>Hi</h1>", "encoding": "utf8" } ] }encoding es utf8 o base64. Omite site y base_revision para crear un sitio nuevo. La respuesta es la misma que arriba.
Parche: añade "patch": true para enviar solo los files modificados más "deleted": ["old.html"] sobre base_revision; todo lo demás se conserva. Mismos límites y comprobaciones; un base_revision desactualizado da 409 conflict.
Reglas de subida
| Archivos | Por archivo | Por sitio | Caducidad | |
|---|---|---|---|---|
| Sin cuenta | 100 | 1 MB | 1 MB | 72 horas si no se reclama |
| Gratis | 500 | 5 MB | 5 MB | ninguna |
| Prompter | 1,000 | 50 MB | 5 GB (todo su almacenamiento) | ninguna |
| Builder | 2,000 | 50 MB | 25 GB (todo su almacenamiento) | ninguna |
| Team | 3,000 | 50 MB | 50 GB (todo su almacenamiento) | ninguna |
| Company | 5,000 | 50 MB | 150 GB (todo su almacenamiento) | ninguna |
Por sitio significa el sitio completo en línea tras un despliegue; un parche cuenta el sitio completo resultante. En los planes de pago un sitio puede usar todo el almacenamiento del plan, pero una solicitud lleva como máximo 90 MB (40 MB por MCP): envía un sitio más grande como primer despliegue y el resto como despliegues de parche. Si superas un límite: 413 too_large con un agent_message para mostrar.
- Se rechazan: enlaces simbólicos, enlaces duros, dispositivos, rutas absolutas,
..y rutas duplicadas que solo se diferencian en mayúsculas y minúsculas. - Se omiten y se enumeran en
skipped:.git/,node_modules/,.env*,*.map,*.pem,*.key; archivos ocultos (dotfiles) excepto.well-known/;.DS_Store,Thumbs.db. - Protección contra filtraciones: los archivos de texto se analizan en busca de tipos conocidos de claves secretas y claves privadas. Una coincidencia devuelve
422 blocked_secretcon{file, line, kind}. La clave en sí nunca se devuelve. - Obligatorio:
index.htmlen la raíz. - Solo anónimos: se bloquean ejecutables e instaladores, y cada red dispone de un número reducido de sitios y despliegues anónimos. Reclama el sitio o inicia sesión para tener más.
Sitios
| Método | Ruta | Autenticación | Notas |
|---|---|---|---|
| GET | /v1/sites | Token de API | Sitios de los que eres miembro |
| GET | /v1/sites/:name | token del sitio, miembro | {name, url, claimed, expires_at, plan, role, live_revision: {id, number, created_at, created_by}, badge}. Con el token del sitio, consúltalo periódicamente después de que el usuario abra el enlace de reclamación: {claimed: false, …} o {claimed: true, account_token?}; es la única llamada que un token de sitio puede seguir haciendo una vez reclamado su sitio |
| GET | /v1/sites/:name/files | token del sitio, miembro | {revision, files: [{path, size, sha256}]} para la versión en línea |
| GET | /v1/sites/:name/files/<path> | token del sitio, miembro | Contenido sin procesar del archivo (la lectura), con un encabezado X-Revision |
| GET | /v1/sites/:name/revisions | token del sitio, miembro | Las más recientes primero. Anónimo: solo la actual. Gratis: 7 días. Prompter: 90 días. Builder y Team: 1 año. Company: 2 años |
| POST | /v1/sites/:name/rollback | token del sitio, editor o propietario | {revision} vuelve a poner en línea esa versión, con un nuevo número de versión |
| POST | /v1/sites/:name/rename | editor o propietario (solo cuenta) | {name}: de 4 a 63 caracteres de a-z, 0-9 y -. No puede parecer un nombre aleatorio (word-word-1234), estar reservado ni haberse usado antes |
| DELETE | /v1/sites/:name | propietario | Permanente. Con un token de API devuelve 202 con un approve_url: una página donde la persona escribe la dirección del sitio y hace clic en Eliminar definitivamente. Después, GET /v1/approvals/<token> indica si se eliminó |
| GET | /v1/sites/:name/members | miembro | {members: [{email, role}], invites: [{email, role}]} |
| POST | /v1/sites/:name/members | propietario | {email, role: "editor" or "viewer"} envía un correo de invitación |
| DELETE | /v1/sites/:name/members/:email | propietario | En dos pasos: la primera llamada devuelve {confirm_token}; repite con ?confirm=<token> en un plazo de 5 minutos |
Roles: los lectores pueden ver el sitio y su historial. Los editores además pueden desplegar y revertir. Los propietarios además pueden invitar, renombrar y eliminar.
Cuenta
| Método | Ruta | Autenticación | Notas |
|---|---|---|---|
| GET | /v1/me | Token de API | {email, plan, sites_used, sites_limit} |
Reclamar sitios, aceptar invitaciones, los tokens y la facturación se gestionan en app.pagelemon.com.
Servicio en pagelemon.dev
/sirveindex.html./aboutsirveabout.htmloabout/index.html.- Los archivos que no existen reciben el
404.htmldel sitio si lo hay; si no, el nuestro. - Alternativa para aplicaciones de una sola página: si el sitio no tiene
404.htmly la ruta no tiene extensión de archivo, se sirveindex.html. - Encabezados:
X-Content-Type-Options: nosniff,Referrer-Policy: strict-origin-when-cross-origin,Cache-Control: public, max-age=60para HTML ymax-age=300para los demás archivos. Los tipos de contenido salen de una lista permitida; los tipos desconocidos se sirven comoapplication/octet-stream. - Los sitios anónimos y Free llevan un pequeño distintivo "Publicado en Page Lemon" antes de
</body>. Es HTML y CSS simples, sin scripts, e incluye un enlace para denunciar el sitio. - Los sitios caducados o eliminados devuelven
410. Los sitios retirados por abuso devuelven451.
.pagelemon.json
Después de desplegar, los agentes escriben este archivo en la carpeta del proyecto y lo añaden a .gitignore, para que la siguiente sesión pueda actualizar el mismo sitio:
{ "site": "brave-otter-4821", "url": "https://brave-otter-4821.pagelemon.dev", "revision": "rev_…", "site_token": "st_…" }