Sites
Publishing, updating, SPA mode, serving, and management
Updating a site
Re-publish to the same site to create a new version. Authenticated owners just
publish again; anonymous publishers pass their claimToken:
curl -X POST https://shiply.now/api/v1/publish \
-H "content-type: application/json" \
-d '{
"claimToken": "<claimToken>",
"files": [
{ "path": "index.html", "size": 150, "contentType": "text/html", "hash": "<sha256>" },
{ "path": "style.css", "size": 40, "contentType": "text/css", "hash": "<sha256>" }
]
}'Versions flip atomically at finalize — visitors never see a half-deployed site.
Hash-skip (incremental deploys)
Include a lowercase SHA-256 hash per file. Files whose (path, hash) match
the live version are skipped — no upload needed; they're copied server-side at
finalize and appear in upload.skipped.
Refreshing expired upload URLs
Presigned upload URLs last 1 hour. If they lapse before finalize:
curl -X POST https://shiply.now/api/v1/publish/<slug>/uploads/refresh \
-H "content-type: application/json" \
-d '{"versionId": "<versionId>"}'How requests are served
| Request | Served |
|---|---|
| exact file path | the file |
/ or /dir/ | index.html in that directory, else a directory listing |
/dir (no slash) | dir/index.html if present |
| unknown path, SPA mode on | index.html (HTTP 200) |
| unknown path, SPA mode off | 404 |
SPA mode
For client-side-routed apps (React, Vue, SvelteKit, Remix client builds…), enable spaMode so deep links work:
# at publish time
-d '{"spaMode": true, "files": [...]}'
# or later (owners)
curl -X PATCH https://shiply.now/api/v1/publish/<slug>/metadata \
-H "Authorization: Bearer shp_…" \
-H "content-type: application/json" \
-d '{"spaMode": true}'Managing sites (owners)
# list your sites
curl https://shiply.now/api/v1/publishes -H "Authorization: Bearer shp_…"
# site detail + version history
curl https://shiply.now/api/v1/publish/<slug> -H "Authorization: Bearer shp_…"
# rename / toggle SPA / show on profile
curl -X PATCH https://shiply.now/api/v1/publish/<slug>/metadata \
-H "Authorization: Bearer shp_…" -H "content-type: application/json" \
-d '{"title": "My Site", "addedToProfile": true}'
# delete (removes all stored files, permanent)
curl -X DELETE https://shiply.now/api/v1/publish/<slug> -H "Authorization: Bearer shp_…"Limits per publish: up to 1,000 files, 100 MiB per file, 1 GiB total.