API Docs
Quick start with the CLI
brew install veturu/ephemr/ephemr # or: curl -sSf https://ephemr.io/install.sh | sh ephemr login # paste your API key (stored in ~/.config/ephemr/config.json) ephemr publish ./site/ # auto-zips the directory and returns the URL ephemr list # see all your pages and their expiry ephemr delete <slug> # take a page down early
Full CLI docs: /cli. For use inside AI editors (Claude Desktop, Cursor, Codex): /mcp.
HTTP API
Everything the CLI and MCP server do is available as plain HTTP. The reference below covers every endpoint.
Authentication
Pass your API key as Authorization: Bearer eph_live_.... Create keys in the portal. The raw key is shown once — store it securely.
Publish a page
POST /api/v1/pages
Authorization: Bearer eph_live_...
Content-Type: multipart/form-data
fields:
archive: zip file (required, contains index.html)
title: optional
description: optional
alias: optional — publish to a stable alias URL
replace_previous: optional, "true" — delete the alias's old target page
(by default it stays active at its own slug URL and
keeps counting against your active-page quota)
Example with curl:
curl -X POST https://ephemr.io/api/v1/pages \ -H "Authorization: Bearer $EPHEMR_API_KEY" \ -F "archive=@site.zip" \ -F "title=my demo"
Response:
{
"id": "uuid",
"slug": "abc123xy",
"url": "https://abc123xy.pages.ephemr.io/",
"hostname": "abc123xy.pages.ephemr.io",
"status": "active",
"created_at": "...",
"expires_at": "..."
}
List your pages
GET /api/v1/pages Authorization: Bearer eph_live_...
Delete a page
DELETE /api/v1/pages/{id}
Authorization: Bearer eph_live_...
Aliases
Aliases are stable, human-readable URLs you own (e.g. myapp.pages.ephemr.io). When you publish to an alias, the alias URL always points at the latest deploy.
POST /api/v1/aliases
Authorization: Bearer eph_live_...
Content-Type: application/json
{"name": "myapp"}
Response (201):
{"id": "uuid", "name": "myapp", "hostname": "myapp.pages.ephemr.io"}
GET /api/v1/aliases Authorization: Bearer eph_live_...
Returns {"aliases": [...]}.
DELETE /api/v1/aliases/{id}
Authorization: Bearer eph_live_...
Returns 204. The current target page remains reachable at its own slug URL.
Page events
GET /api/v1/pages/{id}/events
Authorization: Bearer eph_live_...
Returns the lifecycle timeline for a page: {"events": [{"id", "type", "data", "created_at"}, ...]}.
Limits (free accounts)
- Max upload archive: 10.0 MB (10485760 bytes)
- Max extracted size: 30.0 MB (31457280 bytes)
- Max file count: 500
- Default TTL: 72h0m0s
- Archives must contain
index.htmlat the root. - No server-side execution. Static files only.
Errors
{ "error": { "code": "...", "message": "..." } }
unauthorized— missing or invalid API keyquota_exceeded— active page limit reachedarchive_too_large/extracted_too_large/too_many_filesunsafe_archive— path traversal or unsupported entry typesmissing_index— noindex.htmlfoundemail_not_verified— verify your email before publishingrate_limited— too many requests; back off and retryalias_taken/reserved_name/invalid_name— alias creation errorsalias_not_found— alias does not exist on your account