REST API 레퍼런스
Page Lemon REST API 주소는 https://api.pagelemon.com/v1예요. 셸을 쓰는 코드 에이전트는 명령 한 번으로 폴더를 공개할 수 있고, AI 에이전트는 AI용 공개 가이드(Markdown)부터 보세요.
마지막 업데이트 · Markdown으로 보기
빠른 시작
계정 없이 폴더 공개하기(유지하지 않으면 72시간 동안 온라인에 있어요):
tar -czf - -C dist . | curl -sS --data-binary @- https://api.pagelemon.com/v1/deployAPI 토큰이 있으면 사이트가 바로 내 계정으로 들어와요.
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시간 동안 유효하며 자동으로 갱신 |
토큰은 해시로만 저장하므로 잃어버린 토큰은 다시 보여 드릴 수 없어요. 대신 새로 만드세요.
오류
{ "error": { "code": "conflict", "message": "…" }, "agent_message": "…" }agent_message는 AI가 사용자에게 알려 줘야 할 내용이 있을 때 들어 있어요. 사용자의 언어로 전달하되 링크, 코드, 숫자, 날짜, 도메인은 그대로 정확하게 옮기세요. 시간은 UTC이고, *_at 필드에는 ISO 형식으로 들어 있어요.
| 코드 | 상태 | 의미 |
|---|---|---|
bad_request | 400 | 잘못된 압축 파일, 본문 또는 매개변수 |
unauthorized | 401 | 토큰이 없거나 유효하지 않음 |
forbidden | 403 | 해당 토큰이나 역할로는 할 수 없음 |
not_found | 404 | 해당 사이트나 파일이 없음 |
conflict | 409 | 오래된 X-Base-Revision / base_revision |
gone | 410 | 사이트가 만료됨 |
too_large | 413 | 크기 한도 초과 |
blocked_secret | 422 | 유출 방지 기능이 비밀 키를 발견함 |
limit | 429 | 요금제 또는 속도 제한 |
배포
POST /v1/deploy: 압축 파일 하나
요청 본문이 곧 압축 파일이에요: .tar.gz, .tgz, .tar 또는 .zip. 서버가 바이트로 형식을 감지하므로 Content-Type는 선택 사항이에요.
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:
{
"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를 보내세요.
{ "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예요.
업로드 규칙
| 파일 수 | 파일당 | 사이트당 | 만료 | |
|---|---|---|---|---|
| 계정 없음 | 100 | 1 MB | 1 MB | 등록하지 않으면 72시간 |
| 무료 | 500 | 5 MB | 5 MB | 없음 |
| Prompter | 1,000 | 50 MB | 5 GB (전체 저장 공간) | 없음 |
| Builder | 2,000 | 50 MB | 25 GB (전체 저장 공간) | 없음 |
| Team | 3,000 | 50 MB | 50 GB (전체 저장 공간) | 없음 |
| Company | 5,000 | 50 MB | 150 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/sites | API 토큰 | 내가 멤버인 사이트 |
| 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/me | API 토큰 | {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에 추가해서, 다음 세션에서도 같은 사이트를 업데이트할 수 있게 해요:
{ "site": "brave-otter-4821", "url": "https://brave-otter-4821.pagelemon.dev", "revision": "rev_…", "site_token": "st_…" }