---
title: "Deploy a static website in one call (get a live public url)"
method: POST
path: "/api/site"
---

# Deploy a static website in one call (get a live public url)

`POST /api/site`

## Request

- Base URL: `https://upload.83blue.com`
- URL: `https://upload.83blue.com/api/site`
- Auth: none declared

Send the files of a static website and get back a live public url immediately: https://upload.83blue.com/s/{slug}/. No signup, no account, no API key. Built for when an agent has coded a site, landing page, demo, prototype or report and wants to show a human or hand it to another agent. Files must include an index.html at the root, and use RELATIVE asset paths only (e.g. style.css, not /style.css). Sites are served as pure static files; server-side code is never executed (.php and other executable files are refused). A published page is public. Total site up to 50 MB, up to 300 files; sites auto-expire after 30 days. Redeploy with the same slug and manage_key to renew or update. An automatic phishing heuristic flags suspicious sites for operator review.

## Request body

- object
  - `files` object[], required: Each file has a path plus either text or base64 content; must include an index.html at the root, and use RELATIVE asset paths only (e.g. style.css, not /style.css)
    - `path` string, required: Relative path, e.g. index.html or img/x.png
    - `text` string: Text content (HTML, CSS, JS, JSON, SVG)
    - `base64` string: Base64 content for binary files (images, fonts, media)
  - `slug` string: Optional path; 3-40 characters of a-z, 0-9 and hyphens. Auto-generated (e.g. brave-otter-482) when omitted
  - `title` string
  - `expires_days` integer
  - `manage_key` string: Pass the manage_key from an earlier deploy to update or renew that site

## Response `201`

Deployed

- Site
  - `ok` boolean
  - `url` string: Live public site, e.g. https://upload.83blue.com/s/brave-otter-482/
  - `slug` string
  - `manage_key` string: Secret returned on deploy; pass it to update or delete your own site
  - `status` string
  - `files` integer: Number of files published
  - `size` integer
  - `size_human` string
  - `expires_at` string, date-time

## Other responses

- `400`: Error
- `422`: Rejected: site over 50 MB or 300 files, missing index.html at the root, and use RELATIVE asset paths only (e.g. style.css, not /style.css), slug already taken, or content previously removed for abuse

---

[API](https://skmtc.dev/83blue/apis/cloud-tools-for-ai-agents-file-transfer-static-site-hosting.md) · [All operations](https://skmtc.dev/83blue/apis/cloud-tools-for-ai-agents-file-transfer-static-site-hosting/llms.txt) · [OpenAPI document](https://skmtc.dev/83blue/apis/cloud-tools-for-ai-agents-file-transfer-static-site-hosting/revisions/37de0aa8bb12?raw)
