droplyAPI docs

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.

Base URL https://droply.so/api/v1

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

  1. Open the Droply dashboard.
  2. Click your plan name in the top right, then Account.
  3. 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_key

Treat 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

WhatLimit
All API requests60 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" }
StatusMeaning
400Something in the request is missing or invalid
401Missing, wrong or revoked API key
403Your plan doesn't include this, or you hit a plan limit
404The project doesn't exist or isn't yours
409Conflict, e.g. the name or domain is taken
429Too many requests; wait Retry-After seconds
5xxSomething went wrong on our side; try again

The project object

idstringUnique ID. Use it in the URLs below.
namestringThe project's address: name.droply.page
urlstringPublic link to the project
customDomainstring | nullConnected custom domain, if any
accessstringpublic, password or email-capture
sizeBytesnumberTotal size of the project's files
viewsnumberNumber of visits
createdAt / updatedAtstringISO 8601 timestamps
filesarrayFiles in the project (on single-project responses)

Account

Check your key

GET/me

Returns 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"
Response
{
  "email": "[email protected]",
  "plan": "pro",
  "projects": { "used": 4, "limit": 25 },
  "storageLimitBytes": 16106127360,
  "rateLimits": { "requestsPerMinute": 60, "uploadsPerMinute": 10, "uploadsPerDay": 300 }
}

Projects

List projects

GET/sites

Returns 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"
Response
{ "sites": [ { "id": "8f2c…", "name": "spring-menu", "url": "https://spring-menu.droply.page", ... } ] }

Create a project

POST/sites

Send multipart/form-data.

filesfile, requiredOne or more files. A .zip with an index.html becomes a website; repeat the field for several files.
namestringThe address (name.droply.page). 3-40 lowercase letters, numbers and dashes. If taken, a number is added. Defaults to the file name.
passwordstringProtect 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"
Response
{
  "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

GET/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"
Response
{
  "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

PATCH/sites/{id}

Send JSON with only the settings you want to change.

namestringNew address. The old name.droply.page link stops working.
passwordstring | nullSet a password, or null to make the project public.
noIndexbooleanAsk search engines not to list the project.
downloadsDisabledbooleanHide 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}'
Response
{
  "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

PUT/sites/{id}/files

Swaps 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]"
Response
{
  "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

POST/sites/{id}/files

Adds 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]"
Response
{
  "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

DEL/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"
Response
{ "deleted": true, "permanent": false }

Custom domains

Connect a domain

PUT/sites/{id}/domain

Connects your own domain to a project (Plus and above). Then add the returned DNS record where you manage the domain:

TypeCNAME
NameThe subdomain, e.g. files (or @ for the root domain, if your provider supports it)
Valueproxy.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"}'
Response
{
  "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

GET/sites/{id}/domain

Checks 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"
Response
{
  "domain": "files.example.com",
  "dnsConnected": true,
  "https": "active",
  "dnsRecord": { "type": "CNAME", "name": "files", "value": "proxy.droply.so" }
}

Disconnect a domain

DEL/sites/{id}/domain

Removes 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"
Response
{ "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.

Connector URL 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

  1. Open Settings → Connectors and choose Add custom connector.
  2. Name it Droply and paste https://droply.so/mcp.
  3. Click Connect, sign in to Droply and click Allow.

ChatGPT

  1. Open Settings → Apps & Connectors and add a custom connector (you may need to turn on developer mode under Advanced).
  2. Use https://droply.so/mcp as the server URL, with OAuth sign-in.
  3. 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 in

Tools

publishPut a page, document or set of files online and return the link. Optional name and password.
update_projectReplace a project's content with a new version; the link stays the same.
list_projectsread-onlyYour live projects with links and views.
get_projectread-onlyOne project's link, views, access setting and files.
update_project_settingsRename, set or remove the password, hide from search engines.
delete_projectMove 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.