Page Lemon

REST API 레퍼런스

Page Lemon REST API 주소는 https://api.pagelemon.com/v1예요. 셸을 쓰는 코드 에이전트는 명령 한 번으로 폴더를 공개할 수 있고, AI 에이전트는 AI용 공개 가이드(Markdown)부터 보세요.

마지막 업데이트 · Markdown으로 보기

이 페이지 내용

빠른 시작

계정 없이 폴더 공개하기(유지하지 않으면 72시간 동안 온라인에 있어요):

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

API 토큰이 있으면 사이트가 바로 내 계정으로 들어와요.

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

호스트

호스트제공 내용
https://pagelemon.com이 사이트, /agents, /llms.txt, /docs/*
https://api.pagelemon.com/v1 아래의 REST API
https://mcp.pagelemon.com/(별칭 /mcp)의 원격 MCP 서버(streamable HTTP)
https://app.pagelemon.com내 계정: 사이트, 사람, 토큰, 결제
https://<name>.pagelemon.dev내 사이트

인증

인증 정보는 Authorization: Bearer <token>로 보내세요.

인증 정보형식발급처할 수 있는 일
사이트 토큰st_…익명 배포 시 한 번만 반환등록되기 전까지 해당 사이트 하나를 업데이트, 다시 읽기, 롤백, 조회. 등록 후에는 등록 상태만 알려 줘요(GET /v1/sites/:name)
보관 링크https://app.pagelemon.com/claim/ct_…익명 배포 시 한 번만 반환로그인한 사람이 사이트를 등록
API 토큰pl_…app.pagelemon.com/account/tokens(계정 설정 → API 토큰, API 토큰 참고)계정에서 할 수 있는 모든 일을 REST와 MCP로
OAuth 액세스 토큰pla_…로그인하고 승인하면 MCP 앱(Claude.ai, ChatGPT, Claude Code…)에 발급API 토큰과 같지만 MCP 전용(REST는 401 응답). 1시간 동안 유효하며 자동으로 갱신

토큰은 해시로만 저장하므로 잃어버린 토큰은 다시 보여 드릴 수 없어요. 대신 새로 만드세요.

오류

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

agent_message는 AI가 사용자에게 알려 줘야 할 내용이 있을 때 들어 있어요. 사용자의 언어로 전달하되 링크, 코드, 숫자, 날짜, 도메인은 그대로 정확하게 옮기세요. 시간은 UTC이고, *_at 필드에는 ISO 형식으로 들어 있어요.

코드상태의미
bad_request400잘못된 압축 파일, 본문 또는 매개변수
unauthorized401토큰이 없거나 유효하지 않음
forbidden403해당 토큰이나 역할로는 할 수 없음
not_found404해당 사이트나 파일이 없음
conflict409오래된 X-Base-Revision / base_revision
gone410사이트가 만료됨
too_large413크기 한도 초과
blocked_secret422유출 방지 기능이 비밀 키를 발견함
limit429요금제 또는 속도 제한

배포

POST /v1/deploy: 압축 파일 하나

요청 본문이 곧 압축 파일이에요: .tar.gz, .tgz, .tar 또는 .zip. 서버가 바이트로 형식을 감지하므로 Content-Type는 선택 사항이에요.

bash
tar -czf - -C <dir> . | curl -sS --data-binary @- https://api.pagelemon.com/v1/deploy
요청결과
?site 없음, 토큰 없음익명 생성. brave-otter-4821 같은 무작위 이름, 등록하지 않으면 72시간 후 만료
?site 없음, API 토큰내 계정에 생성. 만료 없음
?site=<name> + X-Base-Revision: <revision id> + 사이트 토큰 또는 API 토큰업데이트. 현재 공개된 리비전이 X-Base-Revision가 아니면 409 conflict를 받고 아무것도 게시되지 않아요

배포할 때마다 사이트 전체가 교체돼요. 빠뜨린 파일은 공개 사이트에서 제거돼요. 모든 파일이 하나의 최상위 폴더(dist/index.html, …) 안에 있으면 그 폴더는 벗겨져요.

응답 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와 claim_url는 익명 생성 시에만 나타나요.

JSON을 사용한 POST /v1/deploy: 인라인 파일

MCP 클라이언트와 작은 사이트용: 같은 엔드포인트로 Content-Type: application/json를 보내세요.

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

encoding는 utf8 또는 base64예요. 새 사이트를 만들려면 site와 base_revision를 빼세요. 응답은 위와 같아요.

패치: "patch": true를 추가하면 base_revision 위에 변경된 files와 "deleted": ["old.html"]만 보낼 수 있고, 나머지는 유지돼요. 한도와 검사는 같으며, 오래된 base_revision는 409 conflict예요.

업로드 규칙

파일 수파일당사이트당만료
계정 없음1001 MB1 MB등록하지 않으면 72시간
무료5005 MB5 MB없음
Prompter1,00050 MB5 GB (전체 저장 공간)없음
Builder2,00050 MB25 GB (전체 저장 공간)없음
Team3,00050 MB50 GB (전체 저장 공간)없음
Company5,00050 MB150 GB (전체 저장 공간)없음

사이트별이란 배포 후 공개된 사이트 전체를 뜻해요. 패치도 결과로 나온 사이트 전체를 기준으로 세요. 유료 요금제에서는 사이트 하나가 요금제의 저장 공간을 모두 쓸 수 있지만, 요청 한 번에는 최대 90 MB(MCP는 40 MB)까지 보낼 수 있어요. 더 큰 사이트는 먼저 첫 배포로 올리고 나머지는 패치 배포로 보내세요. 한도를 넘으면 413 too_large와 함께 agent_message가 표시돼요.

  • 거부: 심볼릭 링크, 하드 링크, 장치 파일, 절대 경로, .., 대소문자만 다른 중복 경로.
  • 건너뛰고 skipped에 표시: .git/, node_modules/, .env*, *.map, *.pem, *.key; .well-known/를 제외한 점 파일; .DS_Store, Thumbs.db.
  • 유출 방지: 텍스트 파일에서 잘 알려진 종류의 비밀 키와 개인 키를 검사해요. 발견되면 {file, line, kind}와 함께 422 blocked_secret를 반환해요. 키 자체는 절대 반환하지 않아요.
  • 필수: 루트에 index.html.
  • 익명 전용: 실행 파일과 설치 파일은 차단되고, 네트워크마다 익명 사이트와 배포 수가 적게 제한돼요. 더 필요하면 등록하거나 로그인하세요.

사이트

메서드경로인증참고
GET/v1/sitesAPI 토큰내가 멤버인 사이트
GET/v1/sites/:name사이트 토큰, 멤버{name, url, claimed, expires_at, plan, role, live_revision: {id, number, created_at, created_by}, badge}. 사이트 토큰으로는 사용자가 보관 링크를 연 뒤 폴링하세요: {claimed: false, …} 또는 {claimed: true, account_token?}. 사이트가 등록된 후에도 사이트 토큰으로 할 수 있는 유일한 호출이에요
GET/v1/sites/:name/files사이트 토큰, 멤버공개 버전은 {revision, files: [{path, size, sha256}]}
GET/v1/sites/:name/files/<path>사이트 토큰, 멤버X-Revision 헤더가 포함된 원본 파일 내용(다시 읽기)
GET/v1/sites/:name/revisions사이트 토큰, 멤버최신순. 비로그인: 현재 버전만. Free: 7일. Prompter: 90일. Builder와 Team: 1년. Company: 2년
POST/v1/sites/:name/rollback사이트 토큰, 편집자 또는 소유자{revision}는 해당 버전을 새 버전 번호로 다시 공개해요
POST/v1/sites/:name/rename편집자 또는 소유자(계정 전용){name}: a-z, 0-9, -로 된 4~63자. 무작위 이름처럼 보이거나(word-word-1234), 예약됐거나, 이전에 사용된 이름은 안 돼요
DELETE/v1/sites/:name소유자영구 삭제예요. API 토큰으로 호출하면 approve_url가 담긴 202를 돌려줘요. 사이트 주소를 입력하고 영구 삭제를 누르는 페이지예요. 그다음 GET /v1/approvals/<token>가 삭제 여부를 알려줘요
GET/v1/sites/:name/members멤버{members: [{email, role}], invites: [{email, role}]}
POST/v1/sites/:name/members소유자{email, role: "editor" or "viewer"}는 초대 이메일을 보내요
DELETE/v1/sites/:name/members/:email소유자두 단계예요. 첫 호출은 {confirm_token}를 돌려주고, 5분 안에 ?confirm=<token>로 다시 호출하세요

역할: 보기 전용 사용자는 사이트와 기록을 볼 수 있어요. 편집자는 배포와 롤백도 할 수 있어요. 소유자는 초대, 이름 변경, 삭제도 할 수 있어요.

계정

메서드경로인증참고
GET/v1/meAPI 토큰{email, plan, sites_used, sites_limit}

사이트 등록, 초대 수락, 토큰, 결제는 app.pagelemon.com에서 처리해요.

pagelemon.dev에서의 제공

  • /는 index.html를 제공해요. /about는 about.html 또는 about/index.html를 제공해요.
  • 없는 파일은 사이트에 404.html가 있으면 그것을, 없으면 Page Lemon의 페이지를 보여 줘요.
  • 단일 페이지 앱 대체: 사이트에 404.html가 없고 경로에 파일 확장자가 없으면 index.html를 제공해요.
  • 헤더: HTML은 X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, Cache-Control: public, max-age=60, 그 밖의 파일은 max-age=300. 콘텐츠 유형은 허용 목록을 따르며, 알 수 없는 유형은 application/octet-stream로 제공돼요.
  • 익명 사이트와 무료 사이트에는 </body> 앞에 작은 "Page Lemon에서 운영 중" 배지가 붙어요. 스크립트 없이 일반 HTML과 CSS로 되어 있고, 사이트 신고 링크도 들어 있어요.
  • 만료되거나 삭제된 사이트는 410를 반환해요. 악용으로 내려진 사이트는 451를 반환해요.

.pagelemon.json

배포 후 에이전트는 프로젝트 폴더에 이 파일을 쓰고 .gitignore에 추가해서, 다음 세션에서도 같은 사이트를 업데이트할 수 있게 해요:

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

헷갈리거나 오래된 내용이 있나요? 알려 주세요. 바로 고칠게요.