API reference
HTTP methods, request parameters, data models and response codes for API v1.
Protocol and access
Send requests over HTTPS. Each method documents the request format, success responses and errors. File operations are restricted: public requests currently return 403 or 404.
Get the file server address and authorization API key from your account dashboard.
DROPVIA_SERVER_URLAuthentication
Set DROPVIA_SERVER_URL to the HTTPS server address without /api/v1, and set DROPVIA_API_KEY to your API key. Examples append /api/v1 and send the key in Authorization: Bearer <api-key>. Set these variables on the server and keep the key out of client code. /status and /access-requests require no key.
Limits
The /access-requests body is limited to 16,384 bytes, including data encoding. Field length limits are listed with the method. Maximum file sizes and request rate quotas are not specified in this reference.
JavaScript examples require Node.js 22 (22.22 or later) or version 24 and above. Python examples require the requests package. Response examples include the HTTP status, headers and a body where applicable.
POST/upload/{uuid?}
Upload a file
Upload multipart/form-data with a file field and an optional path field. For a binary upload, set Content-Type to the file MIME type and pass name and path as URL query parameters. The UUID path parameter is optional; the server generates an ID when omitted. An existing UUID returns 409. A successful creation returns 201 with FileResource; Location identifies the metadata URL.
curl --fail-with-body -X POST "${DROPVIA_SERVER_URL%/}/api/v1/upload/67e55044-10b1-426f-9247-bb680e5fe0c8" \
-H "Authorization: Bearer $DROPVIA_API_KEY" \
-F 'file=@./brief.pdf' \
-F 'path=/projects/brief.pdf'
# Raw binary upload
curl --fail-with-body -X POST "${DROPVIA_SERVER_URL%/}/api/v1/upload/67e55044-10b1-426f-9247-bb680e5fe0c8?name=brief.pdf&path=%2Fprojects%2Fbrief.pdf" \
-H "Authorization: Bearer $DROPVIA_API_KEY" \
-H 'Content-Type: application/pdf' \
--data-binary '@./brief.pdf'HTTP/1.1 201 Created
Content-Type: application/json
Cache-Control: no-store
Location: /api/v1/files/67e55044-10b1-426f-9247-bb680e5fe0c8
{
"id": "67e55044-10b1-426f-9247-bb680e5fe0c8",
"name": "brief.pdf",
"path": "/projects/brief.pdf",
"size": 1048576,
"mimeType": "application/pdf",
"publicUrl": null,
"downloadUrl": "/api/v1/download/67e55044-10b1-426f-9247-bb680e5fe0c8",
"createdAt": "2026-10-28T12:00:00.000Z",
"modifiedAt": "2026-10-28T12:00:00.000Z"
}GET/download/{uuid}
Download a file
Returns file contents by UUID. A 200 response contains file bytes and Content-Type, Content-Disposition and Content-Length headers. Range: bytes=0-1023 requests the first 1024 bytes with status 206 and Content-Range. A range with no overlap with the file returns 416. A missing or inaccessible file returns 404.
curl --fail "${DROPVIA_SERVER_URL%/}/api/v1/download/67e55044-10b1-426f-9247-bb680e5fe0c8" \
-H "Authorization: Bearer $DROPVIA_API_KEY" \
-H 'Accept: application/pdf, application/octet-stream' \
--output brief.pdf
# Optional partial download: add -H 'Range: bytes=0-1023'.HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename="brief.pdf"
Accept-Ranges: bytes
Cache-Control: private, no-store
Content-Length: 1048576
[Binary file content]GET/files/{uuid}
Get file metadata
Returns FileResource by UUID. The 200 response contains JSON and an ETag. Send the saved ETag in If-None-Match on a later request; an unchanged representation returns 304 with no body. A missing or inaccessible file returns 404.
curl --fail-with-body -X GET "${DROPVIA_SERVER_URL%/}/api/v1/files/67e55044-10b1-426f-9247-bb680e5fe0c8" \
-H "Authorization: Bearer $DROPVIA_API_KEY"
# To check a cached version, add -H 'If-None-Match: "file-v1"'.HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: private, no-cache
ETag: "file-v1"
{
"id": "67e55044-10b1-426f-9247-bb680e5fe0c8",
"name": "brief.pdf",
"path": "/projects/brief.pdf",
"size": 1048576,
"mimeType": "application/pdf",
"publicUrl": null,
"downloadUrl": "/api/v1/download/67e55044-10b1-426f-9247-bb680e5fe0c8",
"createdAt": "2026-10-28T12:00:00.000Z",
"modifiedAt": "2026-10-28T12:00:00.000Z"
}DELETE/files/{uuid}
Delete a file
Deletes a file by UUID. Success returns 204 with no body; do not parse it as JSON. A missing or inaccessible file returns 404. A file state that prevents deletion returns 409.
curl --fail-with-body -X DELETE "${DROPVIA_SERVER_URL%/}/api/v1/files/67e55044-10b1-426f-9247-bb680e5fe0c8" \
-H "Authorization: Bearer $DROPVIA_API_KEY"HTTP/1.1 204 No Content
Cache-Control: no-storeGET/status
Get service status
Returns checkedAt and a services array with four components: API, authentication, and file servers D01 and D02. Each component has id, state and latencyMs. state is operational or degraded; latencyMs is in milliseconds. checkedAt is the snapshot generation time in UTC. The server reuses a snapshot for up to 60 seconds. Cache-Control: no-store prevents HTTP caches from storing responses; it does not disable this server-side snapshot.
curl --fail-with-body -X GET "${DROPVIA_SERVER_URL%/}/api/v1/status"HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{
"checkedAt": "2026-10-28T12:00:00.000Z",
"services": [
{
"id": "api",
"state": "operational",
"latencyMs": 42
},
{
"id": "authentication",
"state": "operational",
"latencyMs": 38
},
{
"id": "download-01",
"state": "operational",
"latencyMs": 59
},
{
"id": "download-02",
"state": "operational",
"latencyMs": 46
}
]
}POST/access-requests
Submit access request
Accepts JSON with required name, email, needs and consent: true fields. organization is optional. Maximum lengths in UTF-16 code units: name 100, email 254, organization 160, needs 1000. The 201 response contains the request id and status: received. It acknowledges receipt and does not grant file access. Requests with a foreign Origin return 403.
curl --fail-with-body -X POST "${DROPVIA_SERVER_URL%/}/api/v1/access-requests" \
-H 'Content-Type: application/json' \
--data '{"name":"Alex Morgan","email":"you@example.com","organization":"Studio North","needs":"Keep project files and share finished work.","consent":true}'HTTP/1.1 201 Created
Content-Type: application/json
Cache-Control: no-store
{
"id": "a8d66708-61ad-4dc2-a181-a0cb8dc6ad0c",
"status": "received"
}File model
FileResource is a JSON object containing file metadata. Upload and metadata methods return it; share responses include it in the file field. size is in bytes and timestamps use UTC. A file without public sharing has publicUrl: null. Resolve relative URLs in the examples against the file server address.
{
"id": "67e55044-10b1-426f-9247-bb680e5fe0c8",
"name": "brief.pdf",
"path": "/projects/brief.pdf",
"size": 1048576,
"mimeType": "application/pdf",
"publicUrl": null,
"downloadUrl": "/api/v1/download/67e55044-10b1-426f-9247-bb680e5fe0c8",
"createdAt": "2026-10-28T12:00:00.000Z",
"modifiedAt": "2026-10-28T12:00:00.000Z"
}idstring · uuid- File identifier in UUID format.
namestring- Filename, including the extension if present.
pathstring- Logical path in the user storage space, including the filename. For example, /projects/brief.pdf.
sizeinteger- Content size in bytes. A non-negative integer.
mimeTypestring- Content MIME type, such as application/pdf.
publicUrlstring | null- Public share URL. null when public sharing is disabled.
downloadUrlstring- Download endpoint URL. Requests require authorization.
createdAtstring · date-time- File record creation time as an ISO 8601 UTC string.
modifiedAtstring · date-time- Last modification time as an ISO 8601 UTC string; not earlier than createdAt.
Error reference
Error bodies contain error.code, error.message and requestId. Handle errors using the HTTP status and error.code; include requestId when contacting support. The examples include WWW-Authenticate for 401, Allow for 405, Content-Range for 416 and Retry-After for 429 and 503. Check the HTTP status before parsing JSON or writing downloaded bytes.
- 400
- Malformed request syntax, invalid JSON or an invalid UUID.
- 401
- Bearer token missing or invalid. Check Authorization.
- 403
- Operation forbidden. For access requests, ORIGIN_NOT_ALLOWED indicates a disallowed request origin.
- 404
- File not found or inaccessible to this request.
- 405
- HTTP method unsupported for this URL. See Allow for permitted methods.
- 409
- The UUID already exists or the resource state prevents the operation.
- 413
- Request body exceeds the permitted size.
- 415
- The request Content-Type is not supported.
- 416
- The requested Range cannot be satisfied. Content-Range indicates the file size.
- 422
- Request fields failed validation. Check required values, formats and length limits.
- 429
- Request rate limit exceeded. Retry-After specifies the delay before retrying.
- 500
- Server error while processing the request. Include requestId when contacting support.
- 503
- Service temporarily unavailable. Retry-After specifies the delay before retrying.