Droply API
Publish files and websites, update them, and connect custom domains from your own code, scripts or automations. Everything you can do from the Droply dashboard, without the dashboard.
https://droply.so/api/v1The API is included in the Plus, Pro and Max plans. Projects you create here show up in your dashboard, and your plan's project, storage and visitor limits apply as usual.
Authentication
Every request needs your API key. To get one:
- Open the Droply dashboard.
- Click your plan name in the top right, then Account.
- Under Developer, click Generate API key and copy it.
The key is shown once. If you lose it, generate a new one; the old key stops working straight away. Send it in the Authorization header:
Authorization: Bearer drp_your_api_keyTreat the key like a password. Keep it on your server or in environment variables, never in a public website or app.
Quick start
Put a file online and get its link back in one request:
curl https://droply.so/api/v1/sites \
-H "Authorization: Bearer $DROPLY_API_KEY" \
-F "[email protected]" \
-F "name=spring-menu"Upload a .zip of a static website (with an index.html) and Droply serves it as a site. Upload several files at once by repeating the files field.
Rate limits
| What | Limit |
|---|---|
| All API requests | 60 per minute per account |
| Uploads (create, replace or add files) | 10 per minute and 300 per day per account |
Over a limit, you get status 429 with a Retry-After header saying how many seconds to wait. The upload limits are shared with the dashboard.
Errors
Errors return a JSON body with a readable message:
{ "error": "That URL is already taken" }| Status | Meaning |
|---|---|
400 | Something in the request is missing or invalid |
401 | Missing, wrong or revoked API key |
403 | Your plan doesn't include this, or you hit a plan limit |
404 | The project doesn't exist or isn't yours |
409 | Conflict, e.g. the name or domain is taken |
429 | Too many requests; wait Retry-After seconds |
5xx | Something went wrong on our side; try again |
The project object
idstring | Unique ID. Use it in the URLs below. |
namestring | The project's address: name.droply.page |
urlstring | Public link to the project |
customDomainstring | null | Connected custom domain, if any |
accessstring | public, password or email-capture |
sizeBytesnumber | Total size of the project's files |
viewsnumber | Number of visits |
createdAt / updatedAtstring | ISO 8601 timestamps |
filesarray | Files in the project (on single-project responses) |
Account
Check your key
/meReturns the account the key belongs to, its plan and limits. A quick way to check a key works.
curl https://droply.so/api/v1/me -H "Authorization: Bearer $DROPLY_API_KEY"{
"email": "[email protected]",
"plan": "pro",
"projects": { "used": 4, "limit": 25 },
"storageLimitBytes": 16106127360,
"rateLimits": { "requestsPerMinute": 60, "uploadsPerMinute": 10, "uploadsPerDay": 300 }
}Projects
List projects
/sitesReturns your live projects, newest first. Archived and deleted projects aren't included.
curl https://droply.so/api/v1/sites -H "Authorization: Bearer $DROPLY_API_KEY"{ "sites": [ { "id": "8f2c…", "name": "spring-menu", "url": "https://spring-menu.droply.page", ... } ] }Create a project
/sitesSend multipart/form-data.
filesfile, required | One or more files. A .zip with an index.html becomes a website; repeat the field for several files. |
namestring | The address (name.droply.page). 3-40 lowercase letters, numbers and dashes. If taken, a number is added. Defaults to the file name. |
passwordstring | Protect the project with a password. |
Returns 201 with the new project.
curl https://droply.so/api/v1/sites \
-H "Authorization: Bearer $DROPLY_API_KEY" \
-F "[email protected]" \
-F "name=client-preview" \
-F "password=letmein"{
"site": {
"id": "8f2c1e4a-5b6d-4c7e-9f10-2a3b4c5d6e7f",
"name": "spring-menu",
"url": "https://spring-menu.droply.page",
"customDomain": null,
"access": "public",
"sizeBytes": 482113,
"views": 0,
"createdAt": "2026-10-18T09:12:44.000Z",
"updatedAt": "2026-10-18T09:12:44.000Z",
"files": [{ "name": "menu.pdf", "size": 482113 }]
}
}Get a project
/sites/{id}Returns one project, including its list of files.
curl https://droply.so/api/v1/sites/PROJECT_ID -H "Authorization: Bearer $DROPLY_API_KEY"{
"site": {
"id": "8f2c1e4a-5b6d-4c7e-9f10-2a3b4c5d6e7f",
"name": "spring-menu",
"url": "https://spring-menu.droply.page",
"customDomain": null,
"access": "public",
"sizeBytes": 482113,
"views": 0,
"createdAt": "2026-10-18T09:12:44.000Z",
"updatedAt": "2026-10-18T09:12:44.000Z",
"files": [{ "name": "menu.pdf", "size": 482113 }]
}
}Update settings
/sites/{id}Send JSON with only the settings you want to change.
namestring | New address. The old name.droply.page link stops working. |
passwordstring | null | Set a password, or null to make the project public. |
noIndexboolean | Ask search engines not to list the project. |
downloadsDisabledboolean | Hide download buttons (Pro and Max). |
curl -X PATCH https://droply.so/api/v1/sites/PROJECT_ID \
-H "Authorization: Bearer $DROPLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "spring-menu-2026", "password": null}'{
"site": {
"id": "8f2c1e4a-5b6d-4c7e-9f10-2a3b4c5d6e7f",
"name": "spring-menu",
"url": "https://spring-menu.droply.page",
"customDomain": null,
"access": "public",
"sizeBytes": 482113,
"views": 0,
"createdAt": "2026-10-18T09:12:44.000Z",
"updatedAt": "2026-10-18T09:12:44.000Z",
"files": [{ "name": "menu.pdf", "size": 482113 }]
}
}Replace files
/sites/{id}/filesSwaps out all of the project's files for new ones. The link, domain and settings stay the same, so this is how you publish a new version.
curl -X PUT https://droply.so/api/v1/sites/PROJECT_ID/files \
-H "Authorization: Bearer $DROPLY_API_KEY" \
-F "[email protected]"{
"site": {
"id": "8f2c1e4a-5b6d-4c7e-9f10-2a3b4c5d6e7f",
"name": "spring-menu",
"url": "https://spring-menu.droply.page",
"customDomain": null,
"access": "public",
"sizeBytes": 482113,
"views": 0,
"createdAt": "2026-10-18T09:12:44.000Z",
"updatedAt": "2026-10-18T09:12:44.000Z",
"files": [{ "name": "menu.pdf", "size": 482113 }]
}
}Add files
/sites/{id}/filesAdds files to an existing project. A file with the same name as an existing one replaces it.
curl https://droply.so/api/v1/sites/PROJECT_ID/files \
-H "Authorization: Bearer $DROPLY_API_KEY" \
-F "[email protected]"{
"site": {
"id": "8f2c1e4a-5b6d-4c7e-9f10-2a3b4c5d6e7f",
"name": "spring-menu",
"url": "https://spring-menu.droply.page",
"customDomain": null,
"access": "public",
"sizeBytes": 482113,
"views": 0,
"createdAt": "2026-10-18T09:12:44.000Z",
"updatedAt": "2026-10-18T09:12:44.000Z",
"files": [{ "name": "menu.pdf", "size": 482113 }]
}
}Delete a project
/sites/{id}Moves the project to the trash, where it can be restored from the dashboard for 7 days. Add ?permanent=true to delete it and its files right away.
curl -X DELETE https://droply.so/api/v1/sites/PROJECT_ID \
-H "Authorization: Bearer $DROPLY_API_KEY"{ "deleted": true, "permanent": false }Custom domains
Connect a domain
/sites/{id}/domainConnects your own domain to a project (Plus and above). Then add the returned DNS record where you manage the domain:
Type | CNAME |
Name | The subdomain, e.g. files (or @ for the root domain, if your provider supports it) |
Value | proxy.droply.so |
On Cloudflare, set the record to DNS only (grey cloud). HTTPS turns on automatically a few minutes after the record goes live.
curl -X PUT https://droply.so/api/v1/sites/PROJECT_ID/domain \
-H "Authorization: Bearer $DROPLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain": "files.example.com"}'{
"domain": "files.example.com",
"dnsRecord": { "type": "CNAME", "name": "files", "value": "proxy.droply.so" },
"next": "Add the DNS record at your domain provider (DNS only, not proxied). ..."
}Domain status
/sites/{id}/domainChecks whether the DNS record is in place and HTTPS is live. https is active once the domain is ready to share.
curl https://droply.so/api/v1/sites/PROJECT_ID/domain -H "Authorization: Bearer $DROPLY_API_KEY"{
"domain": "files.example.com",
"dnsConnected": true,
"https": "active",
"dnsRecord": { "type": "CNAME", "name": "files", "value": "proxy.droply.so" }
}Disconnect a domain
/sites/{id}/domainRemoves the custom domain. The project stays online at its droply.page link.
curl -X DELETE https://droply.so/api/v1/sites/PROJECT_ID/domain \
-H "Authorization: Bearer $DROPLY_API_KEY"{ "domain": null }AI assistants (MCP)
Connect Droply to Claude, ChatGPT, Cursor or any app that supports MCP, then just ask: “Put this page online” or “Update my menu page with the new prices”. It works on every plan, including Free; your plan's limits apply.
https://droply.so/mcp (or https://mcp.droply.so)The first time, the app opens Droply so you can sign in and click Allow. No API key needed.
Claude
- Open Settings → Connectors and choose Add custom connector.
- Name it Droply and paste
https://droply.so/mcp. - Click Connect, sign in to Droply and click Allow.
ChatGPT
- Open Settings → Apps & Connectors and add a custom connector (you may need to turn on developer mode under Advanced).
- Use
https://droply.so/mcpas the server URL, with OAuth sign-in. - Sign in to Droply when asked and click Allow.
Claude Code, Cursor and other tools
claude mcp add --transport http droply https://droply.so/mcp
# then run /mcp inside Claude Code to sign inTools
publish | Put a page, document or set of files online and return the link. Optional name and password. |
update_project | Replace a project's content with a new version; the link stays the same. |
list_projectsread-only | Your live projects with links and views. |
get_projectread-only | One project's link, views, access setting and files. |
update_project_settings | Rename, set or remove the password, hide from search engines. |
delete_project | Move a project to the trash (restorable for 7 days). |
To disconnect, open Account in your Droply dashboard and click Disconnect all AI apps, or remove the connector in the app.