Deploying
Body formats
POST /deploy reads the Content-Type header to decide how to parse the body. Three formats cover everything from a single page to a full build folder — all three answer with the same JSON envelope described in Deploy a drop.
On this page
Raw HTML
The simplest case: the body is the page. It lands as index.html at the root of the drop. This is also the fallback — any Content-Type that isn’t JSON or zip is treated as raw HTML.
curl -X POST https://ship.page/deploy \
-H "Content-Type: text/html" \
--data-binary @index.htmlJSON files map
For multi-file drops without an archive, send application/json with a files object. Each key becomes a path on the drop; text goes in as plain strings, binary assets as { "encoding": "base64", "content": … } objects.
curl -X POST https://ship.page/deploy \
-H "Content-Type: application/json" \
-d '{
"files": {
"index.html": "<h1>hi</h1>",
"css/app.css": "body{}",
"logo.png": { "encoding": "base64", "content": "iVBORw0KGgo…" }
}
}'Leading slashes on paths are stripped, and paths containing .. are rejected with a 400. Raw HTML and JSON bodies cap at 10 MB on every plan — anything bigger goes in as a zip.
Zip upload
When a build tool already produced a folder, zip it and stream the archive:
curl -X POST https://ship.page/deploy \
-H "Content-Type: application/zip" \
--data-binary @dist.zipIf the archive wraps everything in a single root directory (say dist/), it’s stripped automatically — your index.html still ends up at /. macOS litter (__MACOSX/, .DS_Store) is dropped too.
Archives are capped at 25 MB on the free plan and 100 MB for subscribers, and may decompress to at most 4× the cap — past either limit the deploy fails with a 413. See Limits & plans.
How files are served
Files are served with a Content-Type inferred from their extension — the usual web set (html, css, js, json, svg, png, jpg, gif, webp, ico, txt, xml, woff, woff2, pdf, wasm, map), plus audio, video and captions (mp3, m4a, aac, wav, ogg, opus, flac, mp4, m4v, webm, mov, vtt). Anything unrecognized ships as application/octet-stream.
Every file answers byte-range requests and revalidates with ETag and Last-Modified, so audio and video stream and seek in every browser, iOS Safari included.
Last updated Jun 12, 2026