Skip to content
Dashboard
Menu Deploying · Deploy a drop

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)

Raw HTML JSON files map Zip

Request

bash
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

json 200 OK
{
"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.

bash
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:

bash
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 /.