Deploying
Deploy a drop
Every drop comes from one endpoint. Send the body as raw HTML, a
JSON map of files, or a zip — hurl.page picks the format from the
Content-Type
header and answers with the same JSON envelope either way.
POST
https://hurl.page/deploy
Creates a drop from the request body and returns its live URL.
Auth:
none
(optional
hp_
key or Firebase ID token)
Request
curl -X POST https://hurl.page/deploy \
-H "Content-Type: text/html" \
--data-binary @index.html
A
text/html
body becomes
index.html
at the root of the drop.
Response
{
"slug": "vast-juice-c2dse08p",
"url": "https://vast-juice-c2dse08p.hurled.page/",
"files": ["index.html"],
"plan": "free",
"expires_at": "2026-06-17T18:00:00.000Z"
}
The envelope is identical for all three body formats —
url
is live the moment the response lands.
Errors
| Status and error code | Description |
|---|---|
400
bad request
|
The body didn’t parse or breaks a rule — malformed JSON files map, invalid base64 or zip, a bad path, an out-of-range ttl, or more files than your plan’s per-request cap.
|
401
unauthorized
|
?name= without a credential — named drops need an API key. Plain anonymous deploys never see this.
|
402
payment required
|
?name= or a ttl beyond 7 days with a valid key but no active subscription — see Limits & plans.
|
413
payload too large
|
The zip exceeds your plan’s cap (25 MB free, 100 MB subscribed) or decompresses past 4× that. |
429
rate limited
|
Too many deploys in a short window — 10/min per IP anonymous, 120/min per account subscribed. Back off and retry. |
Every error answers with { "error": "<message>" } — the full catalogue lives in Errors.
JSON files map
For multi-file drops without an archive, send
Content-Type: application/json
with a
files
object. Text files go in as plain strings; binary assets use an
object with base64 encoding. Each key becomes a path on the drop.
curl -X POST https://hurl.page/deploy \
-H "Content-Type: application/json" \
-d '{
"files": {
"index.html": "<!doctype html><h1>It works</h1>",
"styles.css": "h1 { color: #eb5d4d; }",
"logo.png": { "encoding": "base64", "content": "iVBORw0KGgoAAAANSUhEUgAA…" }
}
}'
Zip upload
When a build tool already produced a folder, zip it and stream the
archive with
Content-Type: application/zip:
curl -X POST https://hurl.page/deploy \
-H "Content-Type: application/zip" \
--data-binary @dist.zip
If the archive wraps everything in a single root directory (say
dist/), it's stripped automatically — your
index.html
still ends up at
/.
Last updated Jun 12, 2026