API reference
Deploy and manage sites from scripts, CI pipelines and your own tools. The API works on every plan, and your plan's limits apply to it exactly as they do in the dashboard.
Base URL
https://api.dplooy.com/api/v1Create an API key
- 1In your dashboard, open Settings and the API Keys tab.
- 2Create a key and give it a name you will recognise, such as the tool that uses it.
- 3Copy the key — it starts with
dpk_live_and is shown only once. Dplooy stores a hash of it, never the key itself.
An account can have up to 5 keys at a time, on any plan.
Authentication
Send the key as a Bearer token with every request:
Authorization: Bearer dpk_live_your_key_hereKeep keys out of your site's code and your repository. In GitHub Actions, store the key as an encrypted secret.
Endpoints
Sites
| Endpoint | What it does |
|---|---|
POST /deploy | Deploy a site from HTML, with optional CSS and JavaScript. The same name updates the same site |
POST /deploy/zip | Deploy a site from a ZIP archive |
GET /projects | List your sites — page, limit (up to 100) and status |
GET /projects/:id | One site, with the forms, data, bookings and chatbot attached to it |
GET /projects/:id/files | Read the live files — ?list=true for names only, ?paths= for chosen files |
PATCH /projects/:id/files | Edit files in place: text edits, new or rewritten files, and deletePaths to remove files |
DELETE /projects/:id | Delete a site and everything stored for it |
GET /account | Your plan, usage, limits and features |
GET PUT /projects/:id/chatbot | Read or set up a site's AI chatbot (setting it up needs Plus or Pro) |
GET /guides/:topic | Written guides for workflow, forms, data, bookings, chatbot, media and limits |
Forms, data, bookings and media
| Endpoint | What it does |
|---|---|
POST GET /forms | Create a form endpoint, or list them |
GET PATCH DELETE /forms/:id | Read, change or delete one |
GET /forms/:id/submissions | Read its messages |
POST GET /data | Create a data collection, or list them |
GET PATCH DELETE /data/:id | Read, change or delete one |
PUT PATCH /data/:id/rows | Replace or edit its rows |
POST GET /bookings | Create a booking page, or list them |
GET PATCH DELETE /bookings/:id | Read, change or delete one |
GET /bookings/:id/services | Its services list |
POST GET /media | Upload an image (field file, up to 5 MB), or list them |
DELETE /media/:id | Delete an image |
Request fields, full responses and examples in Node.js and Python are in the developer reference. The MCP server uses these same endpoints, so anything an AI assistant does for you, your own code can do too.
Deploy HTML
html is required. css and js are optional — they are saved as style.css and script.js and linked into the page. Each one can be up to your plan's file size (5 MB on Free, 50 MB on Plus, 100 MB on Pro) in a request of up to 50 MB. name becomes the address, so my-site is my-site.dplooy.com; it is tidied the same way as in the dashboard (lower case, hyphens).
curl -X POST https://api.dplooy.com/api/v1/deploy \ -H "Authorization: Bearer dpk_live_your_key_here" \ -H "Content-Type: application/json" \ -d '{"html":"<h1>Hello</h1>","name":"my-site"}'
{ "success": true, "url": "https://my-site.dplooy.com", "projectId": "a1b2c3d4-e5f6-...", "isRedeploy": false, "plan": "pro", "expiresAt": null}
Deploying again with the same name updates that site in place — isRedeploy is true, and the address and analytics carry on.
Deploy a ZIP
Send the archive as multipart/form-data in a field named file. It needs index.html at the top (or inside one folder at the top), and folders, styles, scripts, images and fonts keep their paths. projectName sets the address and name the display name. A ZIP can be up to 50 MB on Free and 500 MB on Plus and Pro, every file in it up to your plan's file size, and the unpacked site has to fit in your storage.
curl -X POST https://api.dplooy.com/api/v1/deploy/zip \ -H "Authorization: Bearer dpk_live_your_key_here" \ -F "file=@site.zip" \ -F "projectName=my-site"
The response adds fileCount and a list of warnings to the fields above.
Rate and deploy limits
- Requests are limited to 30 requests a minute per IP address, on every plan. Past it the API answers
429RATE_LIMIT_EXCEEDED; wait a minute and retry. - Deploys — from the API or anywhere else — are limited to 15 an hour and 40 a day on Free, and 40 an hour and 150 a day on Plus and Pro. Only deploys that succeed count. Past it:
429DEPLOY_LIMIT_REACHED. - Reading files returns up to 2 MB per call, and one
PATCHcan delete up to 200 files.
Errors
Check the HTTP status first. The body comes in one of two shapes:
{ "error": "<what went wrong, in words>", "code": "NOT_FOUND"}
{ "message": "<what went wrong, in words>", "error": "INVALID_API_KEY"}
| Status | Code | Meaning |
|---|---|---|
| 400 | — | Validation failed, with the problem fields in details |
| 400 | PROJECT_LIMIT_REACHED | Your plan's sites are all in use |
| 400 | FILE_TOO_LARGE | A file — or a file inside the ZIP — is over your plan's file size; the message names it |
| 400 | STORAGE_LIMIT_REACHED | The site doesn't fit in the storage you have left |
| 400 | PLAN_LIMIT | A ZIP with more files than your plan allows |
| 413 | UPLOAD_TOO_LARGE | The ZIP is over 500 MB |
| 400 | NO_INDEX_HTML | The ZIP has no index.html at the top |
| 400 | UNBUILT_PROJECT | The ZIP is framework source code — build it first |
| 400 | SECURITY_THREAT_DETECTED or SECURITY | The security scan blocked the content; the reasons are in the response |
| 400 | INVALID_FILE_TYPE | /deploy/zip accepts ZIP files only |
| 401 | INVALID_API_KEY | The key is missing, wrong or revoked |
| 404 | NOT_FOUND | The site doesn't exist or isn't yours |
| 409 | PROJECT_KIND_MISMATCH | A ZIP sent to a single-page site, or HTML to a multi-file one |
| 409 | DEPLOY_IN_PROGRESS | Another update of the same site is running — retry in a moment |
| 429 | RATE_LIMIT_EXCEEDED | More than 30 requests a minute |
| 429 | DEPLOY_LIMIT_REACHED | Your plan's hourly or daily deploys are used up |
| 500 | DEPLOY_FAILED or ZIP_DEPLOY_FAILED | Something failed on our side during the deploy |
Manage and rotate keys
- Settings → API Keys lists your keys by name and last four characters, with the last 50 requests each one made.
- Revoke a key there and it stops working at once; its request log is deleted with it.
- To rotate a key: create the new one, switch your tools and secrets over, then revoke the old one.
- Lost a key? It can't be shown again — revoke it and create a new one.